PageRenderTime 27ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 1ms

/extensions/gen/math_wrappers.cpp

https://bitbucket.org/asuhan/happy/
C++ | 626 lines | 480 code | 50 blank | 96 comment | 26 complexity | aa72f2dbd10f561d34d8bc4e89df3b66 MD5 | raw file
Possible License(s): MPL-2.0-no-copyleft-exception, BSD-3-Clause
  1. #include "happy_ext.h"
  2. #include <runtime/base/complex_types.h>
  3. #include <runtime/ext/ext_math.h>
  4. using namespace HAPPY;
  5. HAPPY_EXT(pi) {
  6. EXT_PROLOGUE();
  7. EXT_BODY {
  8. // TODO: assert that enough arguments are in
  9. // TODO: assert that number of parameters is large enough
  10. ASSIGN_RETURN_VALUE(HPHP::f_pi());
  11. }
  12. EXT_CATCH_EXCEPTIONS();
  13. EXT_EPILOGUE();
  14. }
  15. HAPPY_EXT(min) {
  16. EXT_PROLOGUE();
  17. EXT_BODY {
  18. // TODO: assert that enough arguments are in
  19. HPHP::Variant a0(params[0]);
  20. HPHP::Array p;
  21. for (int i = 1; i < param_count; i++)
  22. p.append(params[i]);
  23. // TODO: assert that number of parameters is large enough
  24. ASSIGN_RETURN_VALUE(HPHP::f_min(param_count, a0, p));
  25. }
  26. EXT_CATCH_EXCEPTIONS();
  27. EXT_EPILOGUE();
  28. }
  29. HAPPY_EXT(max) {
  30. EXT_PROLOGUE();
  31. EXT_BODY {
  32. // TODO: assert that enough arguments are in
  33. HPHP::Variant a0(params[0]);
  34. HPHP::Array p;
  35. for (int i = 1; i < param_count; i++)
  36. p.append(params[i]);
  37. // TODO: assert that number of parameters is large enough
  38. ASSIGN_RETURN_VALUE(HPHP::f_max(param_count, a0, p));
  39. }
  40. EXT_CATCH_EXCEPTIONS();
  41. EXT_EPILOGUE();
  42. }
  43. HAPPY_EXT(abs) {
  44. EXT_PROLOGUE();
  45. EXT_BODY {
  46. // TODO: assert that enough arguments are in
  47. HPHP::Variant a0(params[0]);
  48. // TODO: assert that number of parameters is large enough
  49. ASSIGN_RETURN_VALUE(HPHP::f_abs(a0));
  50. }
  51. EXT_CATCH_EXCEPTIONS();
  52. EXT_EPILOGUE();
  53. }
  54. HAPPY_EXT(is_finite) {
  55. EXT_PROLOGUE();
  56. EXT_BODY {
  57. // TODO: assert that enough arguments are in
  58. HPHP::Variant a0(params[0]);
  59. // TODO: assert that number of parameters is large enough
  60. ASSIGN_RETURN_VALUE(HPHP::f_is_finite(a0));
  61. }
  62. EXT_CATCH_EXCEPTIONS();
  63. EXT_EPILOGUE();
  64. }
  65. HAPPY_EXT(is_infinite) {
  66. EXT_PROLOGUE();
  67. EXT_BODY {
  68. // TODO: assert that enough arguments are in
  69. HPHP::Variant a0(params[0]);
  70. // TODO: assert that number of parameters is large enough
  71. ASSIGN_RETURN_VALUE(HPHP::f_is_infinite(a0));
  72. }
  73. EXT_CATCH_EXCEPTIONS();
  74. EXT_EPILOGUE();
  75. }
  76. HAPPY_EXT(is_nan) {
  77. EXT_PROLOGUE();
  78. EXT_BODY {
  79. // TODO: assert that enough arguments are in
  80. HPHP::Variant a0(params[0]);
  81. // TODO: assert that number of parameters is large enough
  82. ASSIGN_RETURN_VALUE(HPHP::f_is_nan(a0));
  83. }
  84. EXT_CATCH_EXCEPTIONS();
  85. EXT_EPILOGUE();
  86. }
  87. HAPPY_EXT(ceil) {
  88. EXT_PROLOGUE();
  89. EXT_BODY {
  90. // TODO: assert that enough arguments are in
  91. HPHP::Variant a0(params[0]);
  92. // TODO: assert that number of parameters is large enough
  93. ASSIGN_RETURN_VALUE(HPHP::f_ceil(a0));
  94. }
  95. EXT_CATCH_EXCEPTIONS();
  96. EXT_EPILOGUE();
  97. }
  98. HAPPY_EXT(floor) {
  99. EXT_PROLOGUE();
  100. EXT_BODY {
  101. // TODO: assert that enough arguments are in
  102. HPHP::Variant a0(params[0]);
  103. // TODO: assert that number of parameters is large enough
  104. ASSIGN_RETURN_VALUE(HPHP::f_floor(a0));
  105. }
  106. EXT_CATCH_EXCEPTIONS();
  107. EXT_EPILOGUE();
  108. }
  109. HAPPY_EXT(round) {
  110. EXT_PROLOGUE();
  111. EXT_BODY {
  112. // TODO: assert that enough arguments are in
  113. HPHP::Variant a0(params[0]);
  114. if (param_count == 1) {
  115. ASSIGN_RETURN_VALUE(HPHP::f_round(a0));
  116. } else {
  117. HPHP::Variant a1(params[1]);
  118. // TODO: assert that number of parameters is large enough
  119. ASSIGN_RETURN_VALUE(HPHP::f_round(a0, a1));
  120. }
  121. }
  122. EXT_CATCH_EXCEPTIONS();
  123. EXT_EPILOGUE();
  124. }
  125. HAPPY_EXT(deg2rad) {
  126. EXT_PROLOGUE();
  127. EXT_BODY {
  128. // TODO: assert that enough arguments are in
  129. HPHP::Variant a0(params[0]);
  130. // TODO: assert that number of parameters is large enough
  131. ASSIGN_RETURN_VALUE(HPHP::f_deg2rad(a0));
  132. }
  133. EXT_CATCH_EXCEPTIONS();
  134. EXT_EPILOGUE();
  135. }
  136. HAPPY_EXT(rad2deg) {
  137. EXT_PROLOGUE();
  138. EXT_BODY {
  139. // TODO: assert that enough arguments are in
  140. HPHP::Variant a0(params[0]);
  141. // TODO: assert that number of parameters is large enough
  142. ASSIGN_RETURN_VALUE(HPHP::f_rad2deg(a0));
  143. }
  144. EXT_CATCH_EXCEPTIONS();
  145. EXT_EPILOGUE();
  146. }
  147. HAPPY_EXT(decbin) {
  148. EXT_PROLOGUE();
  149. EXT_BODY {
  150. // TODO: assert that enough arguments are in
  151. HPHP::Variant a0(params[0]);
  152. // TODO: assert that number of parameters is large enough
  153. ASSIGN_RETURN_VALUE(HPHP::f_decbin(a0));
  154. }
  155. EXT_CATCH_EXCEPTIONS();
  156. EXT_EPILOGUE();
  157. }
  158. HAPPY_EXT(dechex) {
  159. EXT_PROLOGUE();
  160. EXT_BODY {
  161. // TODO: assert that enough arguments are in
  162. HPHP::Variant a0(params[0]);
  163. // TODO: assert that number of parameters is large enough
  164. ASSIGN_RETURN_VALUE(HPHP::f_dechex(a0));
  165. }
  166. EXT_CATCH_EXCEPTIONS();
  167. EXT_EPILOGUE();
  168. }
  169. HAPPY_EXT(decoct) {
  170. EXT_PROLOGUE();
  171. EXT_BODY {
  172. // TODO: assert that enough arguments are in
  173. HPHP::Variant a0(params[0]);
  174. // TODO: assert that number of parameters is large enough
  175. ASSIGN_RETURN_VALUE(HPHP::f_decoct(a0));
  176. }
  177. EXT_CATCH_EXCEPTIONS();
  178. EXT_EPILOGUE();
  179. }
  180. HAPPY_EXT(bindec) {
  181. EXT_PROLOGUE();
  182. EXT_BODY {
  183. // TODO: assert that enough arguments are in
  184. HPHP::Variant a0(params[0]);
  185. // TODO: assert that number of parameters is large enough
  186. ASSIGN_RETURN_VALUE(HPHP::f_bindec(a0));
  187. }
  188. EXT_CATCH_EXCEPTIONS();
  189. EXT_EPILOGUE();
  190. }
  191. HAPPY_EXT(hexdec) {
  192. EXT_PROLOGUE();
  193. EXT_BODY {
  194. // TODO: assert that enough arguments are in
  195. HPHP::Variant a0(params[0]);
  196. // TODO: assert that number of parameters is large enough
  197. ASSIGN_RETURN_VALUE(HPHP::f_hexdec(a0));
  198. }
  199. EXT_CATCH_EXCEPTIONS();
  200. EXT_EPILOGUE();
  201. }
  202. HAPPY_EXT(octdec) {
  203. EXT_PROLOGUE();
  204. EXT_BODY {
  205. // TODO: assert that enough arguments are in
  206. HPHP::Variant a0(params[0]);
  207. // TODO: assert that number of parameters is large enough
  208. ASSIGN_RETURN_VALUE(HPHP::f_octdec(a0));
  209. }
  210. EXT_CATCH_EXCEPTIONS();
  211. EXT_EPILOGUE();
  212. }
  213. HAPPY_EXT(base_convert) {
  214. EXT_PROLOGUE();
  215. EXT_BODY {
  216. // TODO: assert that enough arguments are in
  217. HPHP::Variant a0(params[0]);
  218. HPHP::Variant a1(params[1]);
  219. HPHP::Variant a2(params[2]);
  220. // TODO: assert that number of parameters is large enough
  221. ASSIGN_RETURN_VALUE(HPHP::f_base_convert(a0, a1, a2));
  222. }
  223. EXT_CATCH_EXCEPTIONS();
  224. EXT_EPILOGUE();
  225. }
  226. HAPPY_EXT(pow) {
  227. EXT_PROLOGUE();
  228. EXT_BODY {
  229. // TODO: assert that enough arguments are in
  230. HPHP::Variant a0(params[0]);
  231. HPHP::Variant a1(params[1]);
  232. // TODO: assert that number of parameters is large enough
  233. ASSIGN_RETURN_VALUE(HPHP::f_pow(a0, a1));
  234. }
  235. EXT_CATCH_EXCEPTIONS();
  236. EXT_EPILOGUE();
  237. }
  238. HAPPY_EXT(exp) {
  239. EXT_PROLOGUE();
  240. EXT_BODY {
  241. // TODO: assert that enough arguments are in
  242. HPHP::Variant a0(params[0]);
  243. // TODO: assert that number of parameters is large enough
  244. ASSIGN_RETURN_VALUE(HPHP::f_exp(a0));
  245. }
  246. EXT_CATCH_EXCEPTIONS();
  247. EXT_EPILOGUE();
  248. }
  249. HAPPY_EXT(expm1) {
  250. EXT_PROLOGUE();
  251. EXT_BODY {
  252. // TODO: assert that enough arguments are in
  253. HPHP::Variant a0(params[0]);
  254. // TODO: assert that number of parameters is large enough
  255. ASSIGN_RETURN_VALUE(HPHP::f_expm1(a0));
  256. }
  257. EXT_CATCH_EXCEPTIONS();
  258. EXT_EPILOGUE();
  259. }
  260. HAPPY_EXT(log10) {
  261. EXT_PROLOGUE();
  262. EXT_BODY {
  263. // TODO: assert that enough arguments are in
  264. HPHP::Variant a0(params[0]);
  265. // TODO: assert that number of parameters is large enough
  266. ASSIGN_RETURN_VALUE(HPHP::f_log10(a0));
  267. }
  268. EXT_CATCH_EXCEPTIONS();
  269. EXT_EPILOGUE();
  270. }
  271. HAPPY_EXT(log1p) {
  272. EXT_PROLOGUE();
  273. EXT_BODY {
  274. // TODO: assert that enough arguments are in
  275. HPHP::Variant a0(params[0]);
  276. // TODO: assert that number of parameters is large enough
  277. ASSIGN_RETURN_VALUE(HPHP::f_log1p(a0));
  278. }
  279. EXT_CATCH_EXCEPTIONS();
  280. EXT_EPILOGUE();
  281. }
  282. HAPPY_EXT(log) {
  283. EXT_PROLOGUE();
  284. EXT_BODY {
  285. // TODO: assert that enough arguments are in
  286. HPHP::Variant a0(params[0]);
  287. if (param_count == 1) {
  288. ASSIGN_RETURN_VALUE(HPHP::f_log(a0));
  289. } else {
  290. HPHP::Variant a1(params[1]);
  291. // TODO: assert that number of parameters is large enough
  292. ASSIGN_RETURN_VALUE(HPHP::f_log(a0, a1));
  293. }
  294. }
  295. EXT_CATCH_EXCEPTIONS();
  296. EXT_EPILOGUE();
  297. }
  298. HAPPY_EXT(cos) {
  299. EXT_PROLOGUE();
  300. EXT_BODY {
  301. // TODO: assert that enough arguments are in
  302. HPHP::Variant a0(params[0]);
  303. // TODO: assert that number of parameters is large enough
  304. ASSIGN_RETURN_VALUE(HPHP::f_cos(a0));
  305. }
  306. EXT_CATCH_EXCEPTIONS();
  307. EXT_EPILOGUE();
  308. }
  309. HAPPY_EXT(cosh) {
  310. EXT_PROLOGUE();
  311. EXT_BODY {
  312. // TODO: assert that enough arguments are in
  313. HPHP::Variant a0(params[0]);
  314. // TODO: assert that number of parameters is large enough
  315. ASSIGN_RETURN_VALUE(HPHP::f_cosh(a0));
  316. }
  317. EXT_CATCH_EXCEPTIONS();
  318. EXT_EPILOGUE();
  319. }
  320. HAPPY_EXT(sin) {
  321. EXT_PROLOGUE();
  322. EXT_BODY {
  323. // TODO: assert that enough arguments are in
  324. HPHP::Variant a0(params[0]);
  325. // TODO: assert that number of parameters is large enough
  326. ASSIGN_RETURN_VALUE(HPHP::f_sin(a0));
  327. }
  328. EXT_CATCH_EXCEPTIONS();
  329. EXT_EPILOGUE();
  330. }
  331. HAPPY_EXT(sinh) {
  332. EXT_PROLOGUE();
  333. EXT_BODY {
  334. // TODO: assert that enough arguments are in
  335. HPHP::Variant a0(params[0]);
  336. // TODO: assert that number of parameters is large enough
  337. ASSIGN_RETURN_VALUE(HPHP::f_sinh(a0));
  338. }
  339. EXT_CATCH_EXCEPTIONS();
  340. EXT_EPILOGUE();
  341. }
  342. HAPPY_EXT(tan) {
  343. EXT_PROLOGUE();
  344. EXT_BODY {
  345. // TODO: assert that enough arguments are in
  346. HPHP::Variant a0(params[0]);
  347. // TODO: assert that number of parameters is large enough
  348. ASSIGN_RETURN_VALUE(HPHP::f_tan(a0));
  349. }
  350. EXT_CATCH_EXCEPTIONS();
  351. EXT_EPILOGUE();
  352. }
  353. HAPPY_EXT(tanh) {
  354. EXT_PROLOGUE();
  355. EXT_BODY {
  356. // TODO: assert that enough arguments are in
  357. HPHP::Variant a0(params[0]);
  358. // TODO: assert that number of parameters is large enough
  359. ASSIGN_RETURN_VALUE(HPHP::f_tanh(a0));
  360. }
  361. EXT_CATCH_EXCEPTIONS();
  362. EXT_EPILOGUE();
  363. }
  364. HAPPY_EXT(acos) {
  365. EXT_PROLOGUE();
  366. EXT_BODY {
  367. // TODO: assert that enough arguments are in
  368. HPHP::Variant a0(params[0]);
  369. // TODO: assert that number of parameters is large enough
  370. ASSIGN_RETURN_VALUE(HPHP::f_acos(a0));
  371. }
  372. EXT_CATCH_EXCEPTIONS();
  373. EXT_EPILOGUE();
  374. }
  375. HAPPY_EXT(acosh) {
  376. EXT_PROLOGUE();
  377. EXT_BODY {
  378. // TODO: assert that enough arguments are in
  379. HPHP::Variant a0(params[0]);
  380. // TODO: assert that number of parameters is large enough
  381. ASSIGN_RETURN_VALUE(HPHP::f_acosh(a0));
  382. }
  383. EXT_CATCH_EXCEPTIONS();
  384. EXT_EPILOGUE();
  385. }
  386. HAPPY_EXT(asin) {
  387. EXT_PROLOGUE();
  388. EXT_BODY {
  389. // TODO: assert that enough arguments are in
  390. HPHP::Variant a0(params[0]);
  391. // TODO: assert that number of parameters is large enough
  392. ASSIGN_RETURN_VALUE(HPHP::f_asin(a0));
  393. }
  394. EXT_CATCH_EXCEPTIONS();
  395. EXT_EPILOGUE();
  396. }
  397. HAPPY_EXT(asinh) {
  398. EXT_PROLOGUE();
  399. EXT_BODY {
  400. // TODO: assert that enough arguments are in
  401. HPHP::Variant a0(params[0]);
  402. // TODO: assert that number of parameters is large enough
  403. ASSIGN_RETURN_VALUE(HPHP::f_asinh(a0));
  404. }
  405. EXT_CATCH_EXCEPTIONS();
  406. EXT_EPILOGUE();
  407. }
  408. HAPPY_EXT(atan) {
  409. EXT_PROLOGUE();
  410. EXT_BODY {
  411. // TODO: assert that enough arguments are in
  412. HPHP::Variant a0(params[0]);
  413. // TODO: assert that number of parameters is large enough
  414. ASSIGN_RETURN_VALUE(HPHP::f_atan(a0));
  415. }
  416. EXT_CATCH_EXCEPTIONS();
  417. EXT_EPILOGUE();
  418. }
  419. HAPPY_EXT(atanh) {
  420. EXT_PROLOGUE();
  421. EXT_BODY {
  422. // TODO: assert that enough arguments are in
  423. HPHP::Variant a0(params[0]);
  424. // TODO: assert that number of parameters is large enough
  425. ASSIGN_RETURN_VALUE(HPHP::f_atanh(a0));
  426. }
  427. EXT_CATCH_EXCEPTIONS();
  428. EXT_EPILOGUE();
  429. }
  430. HAPPY_EXT(atan2) {
  431. EXT_PROLOGUE();
  432. EXT_BODY {
  433. // TODO: assert that enough arguments are in
  434. HPHP::Variant a0(params[0]);
  435. HPHP::Variant a1(params[1]);
  436. // TODO: assert that number of parameters is large enough
  437. ASSIGN_RETURN_VALUE(HPHP::f_atan2(a0, a1));
  438. }
  439. EXT_CATCH_EXCEPTIONS();
  440. EXT_EPILOGUE();
  441. }
  442. HAPPY_EXT(hypot) {
  443. EXT_PROLOGUE();
  444. EXT_BODY {
  445. // TODO: assert that enough arguments are in
  446. HPHP::Variant a0(params[0]);
  447. HPHP::Variant a1(params[1]);
  448. // TODO: assert that number of parameters is large enough
  449. ASSIGN_RETURN_VALUE(HPHP::f_hypot(a0, a1));
  450. }
  451. EXT_CATCH_EXCEPTIONS();
  452. EXT_EPILOGUE();
  453. }
  454. HAPPY_EXT(fmod) {
  455. EXT_PROLOGUE();
  456. EXT_BODY {
  457. // TODO: assert that enough arguments are in
  458. HPHP::Variant a0(params[0]);
  459. HPHP::Variant a1(params[1]);
  460. // TODO: assert that number of parameters is large enough
  461. ASSIGN_RETURN_VALUE(HPHP::f_fmod(a0, a1));
  462. }
  463. EXT_CATCH_EXCEPTIONS();
  464. EXT_EPILOGUE();
  465. }
  466. HAPPY_EXT(sqrt) {
  467. EXT_PROLOGUE();
  468. EXT_BODY {
  469. // TODO: assert that enough arguments are in
  470. HPHP::Variant a0(params[0]);
  471. // TODO: assert that number of parameters is large enough
  472. ASSIGN_RETURN_VALUE(HPHP::f_sqrt(a0));
  473. }
  474. EXT_CATCH_EXCEPTIONS();
  475. EXT_EPILOGUE();
  476. }
  477. HAPPY_EXT(getrandmax) {
  478. EXT_PROLOGUE();
  479. EXT_BODY {
  480. // TODO: assert that enough arguments are in
  481. // TODO: assert that number of parameters is large enough
  482. ASSIGN_RETURN_VALUE(HPHP::f_getrandmax());
  483. }
  484. EXT_CATCH_EXCEPTIONS();
  485. EXT_EPILOGUE();
  486. }
  487. HAPPY_EXT(srand) {
  488. EXT_PROLOGUE();
  489. EXT_BODY {
  490. // TODO: assert that enough arguments are in
  491. if (param_count == 0) {
  492. HPHP::f_srand();
  493. } else {
  494. HPHP::Variant a0(params[0]);
  495. // TODO: assert that number of parameters is large enough
  496. HPHP::f_srand(a0);
  497. }
  498. }
  499. EXT_CATCH_EXCEPTIONS();
  500. EXT_EPILOGUE();
  501. }
  502. HAPPY_EXT(rand) {
  503. EXT_PROLOGUE();
  504. EXT_BODY {
  505. // TODO: assert that enough arguments are in
  506. if (param_count == 0) {
  507. ASSIGN_RETURN_VALUE(HPHP::f_rand());
  508. } else {
  509. HPHP::Variant a0(params[0]);
  510. if (param_count == 1) {
  511. ASSIGN_RETURN_VALUE(HPHP::f_rand(a0));
  512. } else {
  513. HPHP::Variant a1(params[1]);
  514. // TODO: assert that number of parameters is large enough
  515. ASSIGN_RETURN_VALUE(HPHP::f_rand(a0, a1));
  516. }
  517. }
  518. }
  519. EXT_CATCH_EXCEPTIONS();
  520. EXT_EPILOGUE();
  521. }
  522. HAPPY_EXT(mt_getrandmax) {
  523. EXT_PROLOGUE();
  524. EXT_BODY {
  525. // TODO: assert that enough arguments are in
  526. // TODO: assert that number of parameters is large enough
  527. ASSIGN_RETURN_VALUE(HPHP::f_mt_getrandmax());
  528. }
  529. EXT_CATCH_EXCEPTIONS();
  530. EXT_EPILOGUE();
  531. }
  532. HAPPY_EXT(mt_srand) {
  533. EXT_PROLOGUE();
  534. EXT_BODY {
  535. // TODO: assert that enough arguments are in
  536. if (param_count == 0) {
  537. HPHP::f_mt_srand();
  538. } else {
  539. HPHP::Variant a0(params[0]);
  540. // TODO: assert that number of parameters is large enough
  541. HPHP::f_mt_srand(a0);
  542. }
  543. }
  544. EXT_CATCH_EXCEPTIONS();
  545. EXT_EPILOGUE();
  546. }
  547. HAPPY_EXT(mt_rand) {
  548. EXT_PROLOGUE();
  549. EXT_BODY {
  550. // TODO: assert that enough arguments are in
  551. if (param_count == 0) {
  552. ASSIGN_RETURN_VALUE(HPHP::f_mt_rand());
  553. } else {
  554. HPHP::Variant a0(params[0]);
  555. if (param_count == 1) {
  556. ASSIGN_RETURN_VALUE(HPHP::f_mt_rand(a0));
  557. } else {
  558. HPHP::Variant a1(params[1]);
  559. // TODO: assert that number of parameters is large enough
  560. ASSIGN_RETURN_VALUE(HPHP::f_mt_rand(a0, a1));
  561. }
  562. }
  563. }
  564. EXT_CATCH_EXCEPTIONS();
  565. EXT_EPILOGUE();
  566. }
  567. HAPPY_EXT(lcg_value) {
  568. EXT_PROLOGUE();
  569. EXT_BODY {
  570. // TODO: assert that enough arguments are in
  571. // TODO: assert that number of parameters is large enough
  572. ASSIGN_RETURN_VALUE(HPHP::f_lcg_value());
  573. }
  574. EXT_CATCH_EXCEPTIONS();
  575. EXT_EPILOGUE();
  576. }