PageRenderTime 62ms CodeModel.GetById 19ms RepoModel.GetById 1ms app.codeStats 1ms

/Zend/zend_vm_def.h

http://github.com/php/php-src
C Header | 9217 lines | 7916 code | 1092 blank | 209 comment | 3120 complexity | 269e6b1c43e0bd1cf797e3fe4f21d39d MD5 | raw file
Possible License(s): BSD-2-Clause, BSD-3-Clause, MPL-2.0-no-copyleft-exception, LGPL-2.1

Large files files are truncated, but you can click here to view the full file

  1. /*
  2. +----------------------------------------------------------------------+
  3. | Zend Engine |
  4. +----------------------------------------------------------------------+
  5. | Copyright (c) Zend Technologies Ltd. (http://www.zend.com) |
  6. +----------------------------------------------------------------------+
  7. | This source file is subject to version 2.00 of the Zend license, |
  8. | that is bundled with this package in the file LICENSE, and is |
  9. | available through the world-wide-web at the following url: |
  10. | http://www.zend.com/license/2_00.txt. |
  11. | If you did not receive a copy of the Zend license and are unable to |
  12. | obtain it through the world-wide-web, please send a note to |
  13. | license@zend.com so we can mail you a copy immediately. |
  14. +----------------------------------------------------------------------+
  15. | Authors: Andi Gutmans <andi@php.net> |
  16. | Zeev Suraski <zeev@php.net> |
  17. | Dmitry Stogov <dmitry@php.net> |
  18. +----------------------------------------------------------------------+
  19. */
  20. /* If you change this file, please regenerate the zend_vm_execute.h and
  21. * zend_vm_opcodes.h files by running:
  22. * php zend_vm_gen.php
  23. */
  24. ZEND_VM_HELPER(zend_add_helper, ANY, ANY, zval *op_1, zval *op_2)
  25. {
  26. USE_OPLINE
  27. SAVE_OPLINE();
  28. if (UNEXPECTED(Z_TYPE_INFO_P(op_1) == IS_UNDEF)) {
  29. op_1 = ZVAL_UNDEFINED_OP1();
  30. }
  31. if (UNEXPECTED(Z_TYPE_INFO_P(op_2) == IS_UNDEF)) {
  32. op_2 = ZVAL_UNDEFINED_OP2();
  33. }
  34. add_function(EX_VAR(opline->result.var), op_1, op_2);
  35. if (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) {
  36. zval_ptr_dtor_nogc(op_1);
  37. }
  38. if (OP2_TYPE & (IS_TMP_VAR|IS_VAR)) {
  39. zval_ptr_dtor_nogc(op_2);
  40. }
  41. ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
  42. }
  43. ZEND_VM_HOT_NOCONSTCONST_HANDLER(1, ZEND_ADD, CONST|TMPVARCV, CONST|TMPVARCV)
  44. {
  45. USE_OPLINE
  46. zval *op1, *op2, *result;
  47. double d1, d2;
  48. op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
  49. op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
  50. if (ZEND_VM_SPEC && OP1_TYPE == IS_CONST && OP2_TYPE == IS_CONST) {
  51. /* pass */
  52. } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
  53. if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
  54. result = EX_VAR(opline->result.var);
  55. fast_long_add_function(result, op1, op2);
  56. ZEND_VM_NEXT_OPCODE();
  57. } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
  58. d1 = (double)Z_LVAL_P(op1);
  59. d2 = Z_DVAL_P(op2);
  60. ZEND_VM_C_GOTO(add_double);
  61. }
  62. } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
  63. if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
  64. d1 = Z_DVAL_P(op1);
  65. d2 = Z_DVAL_P(op2);
  66. ZEND_VM_C_LABEL(add_double):
  67. result = EX_VAR(opline->result.var);
  68. ZVAL_DOUBLE(result, d1 + d2);
  69. ZEND_VM_NEXT_OPCODE();
  70. } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
  71. d1 = Z_DVAL_P(op1);
  72. d2 = (double)Z_LVAL_P(op2);
  73. ZEND_VM_C_GOTO(add_double);
  74. }
  75. }
  76. ZEND_VM_DISPATCH_TO_HELPER(zend_add_helper, op_1, op1, op_2, op2);
  77. }
  78. ZEND_VM_HELPER(zend_sub_helper, ANY, ANY, zval *op_1, zval *op_2)
  79. {
  80. USE_OPLINE
  81. SAVE_OPLINE();
  82. if (UNEXPECTED(Z_TYPE_INFO_P(op_1) == IS_UNDEF)) {
  83. op_1 = ZVAL_UNDEFINED_OP1();
  84. }
  85. if (UNEXPECTED(Z_TYPE_INFO_P(op_2) == IS_UNDEF)) {
  86. op_2 = ZVAL_UNDEFINED_OP2();
  87. }
  88. sub_function(EX_VAR(opline->result.var), op_1, op_2);
  89. if (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) {
  90. zval_ptr_dtor_nogc(op_1);
  91. }
  92. if (OP2_TYPE & (IS_TMP_VAR|IS_VAR)) {
  93. zval_ptr_dtor_nogc(op_2);
  94. }
  95. ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
  96. }
  97. ZEND_VM_HOT_NOCONSTCONST_HANDLER(2, ZEND_SUB, CONST|TMPVARCV, CONST|TMPVARCV)
  98. {
  99. USE_OPLINE
  100. zval *op1, *op2, *result;
  101. double d1, d2;
  102. op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
  103. op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
  104. if (ZEND_VM_SPEC && OP1_TYPE == IS_CONST && OP2_TYPE == IS_CONST) {
  105. /* pass */
  106. } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
  107. if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
  108. result = EX_VAR(opline->result.var);
  109. fast_long_sub_function(result, op1, op2);
  110. ZEND_VM_NEXT_OPCODE();
  111. } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
  112. d1 = (double)Z_LVAL_P(op1);
  113. d2 = Z_DVAL_P(op2);
  114. ZEND_VM_C_GOTO(sub_double);
  115. }
  116. } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
  117. if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
  118. d1 = Z_DVAL_P(op1);
  119. d2 = Z_DVAL_P(op2);
  120. ZEND_VM_C_LABEL(sub_double):
  121. result = EX_VAR(opline->result.var);
  122. ZVAL_DOUBLE(result, d1 - d2);
  123. ZEND_VM_NEXT_OPCODE();
  124. } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
  125. d1 = Z_DVAL_P(op1);
  126. d2 = (double)Z_LVAL_P(op2);
  127. ZEND_VM_C_GOTO(sub_double);
  128. }
  129. }
  130. ZEND_VM_DISPATCH_TO_HELPER(zend_sub_helper, op_1, op1, op_2, op2);
  131. }
  132. ZEND_VM_HELPER(zend_mul_helper, ANY, ANY, zval *op_1, zval *op_2)
  133. {
  134. USE_OPLINE
  135. SAVE_OPLINE();
  136. if (UNEXPECTED(Z_TYPE_INFO_P(op_1) == IS_UNDEF)) {
  137. op_1 = ZVAL_UNDEFINED_OP1();
  138. }
  139. if (UNEXPECTED(Z_TYPE_INFO_P(op_2) == IS_UNDEF)) {
  140. op_2 = ZVAL_UNDEFINED_OP2();
  141. }
  142. mul_function(EX_VAR(opline->result.var), op_1, op_2);
  143. if (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) {
  144. zval_ptr_dtor_nogc(op_1);
  145. }
  146. if (OP2_TYPE & (IS_TMP_VAR|IS_VAR)) {
  147. zval_ptr_dtor_nogc(op_2);
  148. }
  149. ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
  150. }
  151. ZEND_VM_COLD_CONSTCONST_HANDLER(3, ZEND_MUL, CONST|TMPVARCV, CONST|TMPVARCV, SPEC(COMMUTATIVE))
  152. {
  153. USE_OPLINE
  154. zval *op1, *op2, *result;
  155. double d1, d2;
  156. op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
  157. op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
  158. if (ZEND_VM_SPEC && OP1_TYPE == IS_CONST && OP2_TYPE == IS_CONST) {
  159. /* pass */
  160. } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
  161. if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
  162. zend_long overflow;
  163. result = EX_VAR(opline->result.var);
  164. ZEND_SIGNED_MULTIPLY_LONG(Z_LVAL_P(op1), Z_LVAL_P(op2), Z_LVAL_P(result), Z_DVAL_P(result), overflow);
  165. Z_TYPE_INFO_P(result) = overflow ? IS_DOUBLE : IS_LONG;
  166. ZEND_VM_NEXT_OPCODE();
  167. } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
  168. d1 = (double)Z_LVAL_P(op1);
  169. d2 = Z_DVAL_P(op2);
  170. ZEND_VM_C_GOTO(mul_double);
  171. }
  172. } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
  173. if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
  174. d1 = Z_DVAL_P(op1);
  175. d2 = Z_DVAL_P(op2);
  176. ZEND_VM_C_LABEL(mul_double):
  177. result = EX_VAR(opline->result.var);
  178. ZVAL_DOUBLE(result, d1 * d2);
  179. ZEND_VM_NEXT_OPCODE();
  180. } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
  181. d1 = Z_DVAL_P(op1);
  182. d2 = (double)Z_LVAL_P(op2);
  183. ZEND_VM_C_GOTO(mul_double);
  184. }
  185. }
  186. ZEND_VM_DISPATCH_TO_HELPER(zend_mul_helper, op_1, op1, op_2, op2);
  187. }
  188. ZEND_VM_COLD_CONSTCONST_HANDLER(4, ZEND_DIV, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
  189. {
  190. USE_OPLINE
  191. zval *op1, *op2;
  192. SAVE_OPLINE();
  193. op1 = GET_OP1_ZVAL_PTR(BP_VAR_R);
  194. op2 = GET_OP2_ZVAL_PTR(BP_VAR_R);
  195. fast_div_function(EX_VAR(opline->result.var), op1, op2);
  196. FREE_OP1();
  197. FREE_OP2();
  198. ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
  199. }
  200. ZEND_VM_COLD_HELPER(zend_mod_by_zero_helper, ANY, ANY)
  201. {
  202. USE_OPLINE
  203. SAVE_OPLINE();
  204. zend_throw_exception_ex(zend_ce_division_by_zero_error, 0, "Modulo by zero");
  205. ZVAL_UNDEF(EX_VAR(opline->result.var));
  206. HANDLE_EXCEPTION();
  207. }
  208. ZEND_VM_HELPER(zend_mod_helper, ANY, ANY, zval *op_1, zval *op_2)
  209. {
  210. USE_OPLINE
  211. SAVE_OPLINE();
  212. if (UNEXPECTED(Z_TYPE_INFO_P(op_1) == IS_UNDEF)) {
  213. op_1 = ZVAL_UNDEFINED_OP1();
  214. }
  215. if (UNEXPECTED(Z_TYPE_INFO_P(op_2) == IS_UNDEF)) {
  216. op_2 = ZVAL_UNDEFINED_OP2();
  217. }
  218. mod_function(EX_VAR(opline->result.var), op_1, op_2);
  219. if (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) {
  220. zval_ptr_dtor_nogc(op_1);
  221. }
  222. if (OP2_TYPE & (IS_TMP_VAR|IS_VAR)) {
  223. zval_ptr_dtor_nogc(op_2);
  224. }
  225. ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
  226. }
  227. ZEND_VM_COLD_CONSTCONST_HANDLER(5, ZEND_MOD, CONST|TMPVARCV, CONST|TMPVARCV)
  228. {
  229. USE_OPLINE
  230. zval *op1, *op2, *result;
  231. op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
  232. op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
  233. if (ZEND_VM_SPEC && OP1_TYPE == IS_CONST && OP2_TYPE == IS_CONST) {
  234. /* pass */
  235. } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
  236. if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
  237. result = EX_VAR(opline->result.var);
  238. if (UNEXPECTED(Z_LVAL_P(op2) == 0)) {
  239. ZEND_VM_DISPATCH_TO_HELPER(zend_mod_by_zero_helper);
  240. } else if (UNEXPECTED(Z_LVAL_P(op2) == -1)) {
  241. /* Prevent overflow error/crash if op1==ZEND_LONG_MIN */
  242. ZVAL_LONG(result, 0);
  243. } else {
  244. ZVAL_LONG(result, Z_LVAL_P(op1) % Z_LVAL_P(op2));
  245. }
  246. ZEND_VM_NEXT_OPCODE();
  247. }
  248. }
  249. ZEND_VM_DISPATCH_TO_HELPER(zend_mod_helper, op_1, op1, op_2, op2);
  250. }
  251. ZEND_VM_HELPER(zend_shift_left_helper, ANY, ANY, zval *op_1, zval *op_2)
  252. {
  253. USE_OPLINE
  254. SAVE_OPLINE();
  255. if (UNEXPECTED(Z_TYPE_INFO_P(op_1) == IS_UNDEF)) {
  256. op_1 = ZVAL_UNDEFINED_OP1();
  257. }
  258. if (UNEXPECTED(Z_TYPE_INFO_P(op_2) == IS_UNDEF)) {
  259. op_2 = ZVAL_UNDEFINED_OP2();
  260. }
  261. shift_left_function(EX_VAR(opline->result.var), op_1, op_2);
  262. if (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) {
  263. zval_ptr_dtor_nogc(op_1);
  264. }
  265. if (OP2_TYPE & (IS_TMP_VAR|IS_VAR)) {
  266. zval_ptr_dtor_nogc(op_2);
  267. }
  268. ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
  269. }
  270. ZEND_VM_COLD_CONSTCONST_HANDLER(6, ZEND_SL, CONST|TMPVARCV, CONST|TMPVARCV)
  271. {
  272. USE_OPLINE
  273. zval *op1, *op2;
  274. op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
  275. op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
  276. if (ZEND_VM_SPEC && OP1_TYPE == IS_CONST && OP2_TYPE == IS_CONST) {
  277. /* pass */
  278. } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
  279. && EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)
  280. && EXPECTED((zend_ulong)Z_LVAL_P(op2) < SIZEOF_ZEND_LONG * 8)) {
  281. /* Perform shift on unsigned numbers to get well-defined wrap behavior. */
  282. ZVAL_LONG(EX_VAR(opline->result.var),
  283. (zend_long) ((zend_ulong) Z_LVAL_P(op1) << Z_LVAL_P(op2)));
  284. ZEND_VM_NEXT_OPCODE();
  285. }
  286. ZEND_VM_DISPATCH_TO_HELPER(zend_shift_left_helper, op_1, op1, op_2, op2);
  287. }
  288. ZEND_VM_HELPER(zend_shift_right_helper, ANY, ANY, zval *op_1, zval *op_2)
  289. {
  290. USE_OPLINE
  291. SAVE_OPLINE();
  292. if (UNEXPECTED(Z_TYPE_INFO_P(op_1) == IS_UNDEF)) {
  293. op_1 = ZVAL_UNDEFINED_OP1();
  294. }
  295. if (UNEXPECTED(Z_TYPE_INFO_P(op_2) == IS_UNDEF)) {
  296. op_2 = ZVAL_UNDEFINED_OP2();
  297. }
  298. shift_right_function(EX_VAR(opline->result.var), op_1, op_2);
  299. if (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) {
  300. zval_ptr_dtor_nogc(op_1);
  301. }
  302. if (OP2_TYPE & (IS_TMP_VAR|IS_VAR)) {
  303. zval_ptr_dtor_nogc(op_2);
  304. }
  305. ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
  306. }
  307. ZEND_VM_COLD_CONSTCONST_HANDLER(7, ZEND_SR, CONST|TMPVARCV, CONST|TMPVARCV)
  308. {
  309. USE_OPLINE
  310. zval *op1, *op2;
  311. op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
  312. op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
  313. if (ZEND_VM_SPEC && OP1_TYPE == IS_CONST && OP2_TYPE == IS_CONST) {
  314. /* pass */
  315. } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
  316. && EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)
  317. && EXPECTED((zend_ulong)Z_LVAL_P(op2) < SIZEOF_ZEND_LONG * 8)) {
  318. ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(op1) >> Z_LVAL_P(op2));
  319. ZEND_VM_NEXT_OPCODE();
  320. }
  321. ZEND_VM_DISPATCH_TO_HELPER(zend_shift_right_helper, op_1, op1, op_2, op2);
  322. }
  323. ZEND_VM_COLD_CONSTCONST_HANDLER(12, ZEND_POW, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
  324. {
  325. USE_OPLINE
  326. zval *op1, *op2;
  327. SAVE_OPLINE();
  328. op1 = GET_OP1_ZVAL_PTR(BP_VAR_R);
  329. op2 = GET_OP2_ZVAL_PTR(BP_VAR_R);
  330. pow_function(EX_VAR(opline->result.var), op1, op2);
  331. FREE_OP1();
  332. FREE_OP2();
  333. ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
  334. }
  335. ZEND_VM_HANDLER(8, ZEND_CONCAT, CONST|TMPVAR|CV, CONST|TMPVAR|CV, SPEC(NO_CONST_CONST))
  336. {
  337. USE_OPLINE
  338. zval *op1, *op2;
  339. op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
  340. op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
  341. if ((OP1_TYPE == IS_CONST || EXPECTED(Z_TYPE_P(op1) == IS_STRING)) &&
  342. (OP2_TYPE == IS_CONST || EXPECTED(Z_TYPE_P(op2) == IS_STRING))) {
  343. zend_string *op1_str = Z_STR_P(op1);
  344. zend_string *op2_str = Z_STR_P(op2);
  345. zend_string *str;
  346. if (OP1_TYPE != IS_CONST && UNEXPECTED(ZSTR_LEN(op1_str) == 0)) {
  347. if (OP2_TYPE == IS_CONST || OP2_TYPE == IS_CV) {
  348. ZVAL_STR_COPY(EX_VAR(opline->result.var), op2_str);
  349. } else {
  350. ZVAL_STR(EX_VAR(opline->result.var), op2_str);
  351. }
  352. if (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) {
  353. zend_string_release_ex(op1_str, 0);
  354. }
  355. } else if (OP2_TYPE != IS_CONST && UNEXPECTED(ZSTR_LEN(op2_str) == 0)) {
  356. if (OP1_TYPE == IS_CONST || OP1_TYPE == IS_CV) {
  357. ZVAL_STR_COPY(EX_VAR(opline->result.var), op1_str);
  358. } else {
  359. ZVAL_STR(EX_VAR(opline->result.var), op1_str);
  360. }
  361. if (OP2_TYPE & (IS_TMP_VAR|IS_VAR)) {
  362. zend_string_release_ex(op2_str, 0);
  363. }
  364. } else if (OP1_TYPE != IS_CONST && OP1_TYPE != IS_CV &&
  365. !ZSTR_IS_INTERNED(op1_str) && GC_REFCOUNT(op1_str) == 1) {
  366. size_t len = ZSTR_LEN(op1_str);
  367. str = zend_string_extend(op1_str, len + ZSTR_LEN(op2_str), 0);
  368. memcpy(ZSTR_VAL(str) + len, ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
  369. ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
  370. if (OP2_TYPE & (IS_TMP_VAR|IS_VAR)) {
  371. zend_string_release_ex(op2_str, 0);
  372. }
  373. } else {
  374. str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
  375. memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
  376. memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
  377. ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
  378. if (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) {
  379. zend_string_release_ex(op1_str, 0);
  380. }
  381. if (OP2_TYPE & (IS_TMP_VAR|IS_VAR)) {
  382. zend_string_release_ex(op2_str, 0);
  383. }
  384. }
  385. ZEND_VM_NEXT_OPCODE();
  386. } else {
  387. SAVE_OPLINE();
  388. if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
  389. op1 = ZVAL_UNDEFINED_OP1();
  390. }
  391. if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
  392. op2 = ZVAL_UNDEFINED_OP2();
  393. }
  394. concat_function(EX_VAR(opline->result.var), op1, op2);
  395. FREE_OP1();
  396. FREE_OP2();
  397. ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
  398. }
  399. }
  400. ZEND_VM_COLD_CONSTCONST_HANDLER(16, ZEND_IS_IDENTICAL, CONST|TMP|VAR|CV, CONST|TMP|VAR|CV, SPEC(COMMUTATIVE))
  401. {
  402. USE_OPLINE
  403. zval *op1, *op2;
  404. zend_bool result;
  405. SAVE_OPLINE();
  406. op1 = GET_OP1_ZVAL_PTR_DEREF(BP_VAR_R);
  407. op2 = GET_OP2_ZVAL_PTR_DEREF(BP_VAR_R);
  408. result = fast_is_identical_function(op1, op2);
  409. FREE_OP1();
  410. FREE_OP2();
  411. ZEND_VM_SMART_BRANCH(result, 1);
  412. }
  413. ZEND_VM_COLD_CONSTCONST_HANDLER(17, ZEND_IS_NOT_IDENTICAL, CONST|TMP|VAR|CV, CONST|TMP|VAR|CV, SPEC(COMMUTATIVE))
  414. {
  415. USE_OPLINE
  416. zval *op1, *op2;
  417. zend_bool result;
  418. SAVE_OPLINE();
  419. op1 = GET_OP1_ZVAL_PTR_DEREF(BP_VAR_R);
  420. op2 = GET_OP2_ZVAL_PTR_DEREF(BP_VAR_R);
  421. result = fast_is_not_identical_function(op1, op2);
  422. FREE_OP1();
  423. FREE_OP2();
  424. ZEND_VM_SMART_BRANCH(result, 1);
  425. }
  426. ZEND_VM_HELPER(zend_is_equal_helper, ANY, ANY, zval *op_1, zval *op_2)
  427. {
  428. int ret;
  429. USE_OPLINE
  430. SAVE_OPLINE();
  431. if (UNEXPECTED(Z_TYPE_INFO_P(op_1) == IS_UNDEF)) {
  432. op_1 = ZVAL_UNDEFINED_OP1();
  433. }
  434. if (UNEXPECTED(Z_TYPE_INFO_P(op_2) == IS_UNDEF)) {
  435. op_2 = ZVAL_UNDEFINED_OP2();
  436. }
  437. ret = zend_compare(op_1, op_2);
  438. if (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) {
  439. zval_ptr_dtor_nogc(op_1);
  440. }
  441. if (OP2_TYPE & (IS_TMP_VAR|IS_VAR)) {
  442. zval_ptr_dtor_nogc(op_2);
  443. }
  444. ZEND_VM_SMART_BRANCH(ret == 0, 1);
  445. }
  446. ZEND_VM_COLD_CONSTCONST_HANDLER(18, ZEND_IS_EQUAL, CONST|TMPVAR|CV, CONST|TMPVAR|CV, SPEC(SMART_BRANCH,COMMUTATIVE))
  447. {
  448. USE_OPLINE
  449. zval *op1, *op2;
  450. double d1, d2;
  451. op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
  452. op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
  453. if (ZEND_VM_SPEC && OP1_TYPE == IS_CONST && OP2_TYPE == IS_CONST) {
  454. /* pass */
  455. } else if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
  456. if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
  457. if (EXPECTED(Z_LVAL_P(op1) == Z_LVAL_P(op2))) {
  458. ZEND_VM_C_LABEL(is_equal_true):
  459. ZEND_VM_SMART_BRANCH_TRUE();
  460. } else {
  461. ZEND_VM_C_LABEL(is_equal_false):
  462. ZEND_VM_SMART_BRANCH_FALSE();
  463. }
  464. } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
  465. d1 = (double)Z_LVAL_P(op1);
  466. d2 = Z_DVAL_P(op2);
  467. ZEND_VM_C_GOTO(is_equal_double);
  468. }
  469. } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
  470. if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
  471. d1 = Z_DVAL_P(op1);
  472. d2 = Z_DVAL_P(op2);
  473. ZEND_VM_C_LABEL(is_equal_double):
  474. if (d1 == d2) {
  475. ZEND_VM_C_GOTO(is_equal_true);
  476. } else {
  477. ZEND_VM_C_GOTO(is_equal_false);
  478. }
  479. } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
  480. d1 = Z_DVAL_P(op1);
  481. d2 = (double)Z_LVAL_P(op2);
  482. ZEND_VM_C_GOTO(is_equal_double);
  483. }
  484. } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
  485. if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
  486. int result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
  487. if (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) {
  488. zval_ptr_dtor_str(op1);
  489. }
  490. if (OP2_TYPE & (IS_TMP_VAR|IS_VAR)) {
  491. zval_ptr_dtor_str(op2);
  492. }
  493. if (result) {
  494. ZEND_VM_C_GOTO(is_equal_true);
  495. } else {
  496. ZEND_VM_C_GOTO(is_equal_false);
  497. }
  498. }
  499. }
  500. ZEND_VM_DISPATCH_TO_HELPER(zend_is_equal_helper, op_1, op1, op_2, op2);
  501. }
  502. ZEND_VM_HELPER(zend_is_not_equal_helper, ANY, ANY, zval *op_1, zval *op_2)
  503. {
  504. int ret;
  505. USE_OPLINE
  506. SAVE_OPLINE();
  507. if (UNEXPECTED(Z_TYPE_INFO_P(op_1) == IS_UNDEF)) {
  508. op_1 = ZVAL_UNDEFINED_OP1();
  509. }
  510. if (UNEXPECTED(Z_TYPE_INFO_P(op_2) == IS_UNDEF)) {
  511. op_2 = ZVAL_UNDEFINED_OP2();
  512. }
  513. ret = zend_compare(op_1, op_2);
  514. if (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) {
  515. zval_ptr_dtor_nogc(op_1);
  516. }
  517. if (OP2_TYPE & (IS_TMP_VAR|IS_VAR)) {
  518. zval_ptr_dtor_nogc(op_2);
  519. }
  520. ZEND_VM_SMART_BRANCH(ret != 0, 1);
  521. }
  522. ZEND_VM_COLD_CONSTCONST_HANDLER(19, ZEND_IS_NOT_EQUAL, CONST|TMPVAR|CV, CONST|TMPVAR|CV, SPEC(SMART_BRANCH,COMMUTATIVE))
  523. {
  524. USE_OPLINE
  525. zval *op1, *op2;
  526. double d1, d2;
  527. op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
  528. op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
  529. if (ZEND_VM_SPEC && OP1_TYPE == IS_CONST && OP2_TYPE == IS_CONST) {
  530. /* pass */
  531. } else if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
  532. if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
  533. if (EXPECTED(Z_LVAL_P(op1) != Z_LVAL_P(op2))) {
  534. ZEND_VM_C_LABEL(is_not_equal_true):
  535. ZEND_VM_SMART_BRANCH_TRUE();
  536. } else {
  537. ZEND_VM_C_LABEL(is_not_equal_false):
  538. ZEND_VM_SMART_BRANCH_FALSE();
  539. }
  540. } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
  541. d1 = (double)Z_LVAL_P(op1);
  542. d2 = Z_DVAL_P(op2);
  543. ZEND_VM_C_GOTO(is_not_equal_double);
  544. }
  545. } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
  546. if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
  547. d1 = Z_DVAL_P(op1);
  548. d2 = Z_DVAL_P(op2);
  549. ZEND_VM_C_LABEL(is_not_equal_double):
  550. if (d1 != d2) {
  551. ZEND_VM_C_GOTO(is_not_equal_true);
  552. } else {
  553. ZEND_VM_C_GOTO(is_not_equal_false);
  554. }
  555. } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
  556. d1 = Z_DVAL_P(op1);
  557. d2 = (double)Z_LVAL_P(op2);
  558. ZEND_VM_C_GOTO(is_not_equal_double);
  559. }
  560. } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
  561. if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
  562. int result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
  563. if (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) {
  564. zval_ptr_dtor_str(op1);
  565. }
  566. if (OP2_TYPE & (IS_TMP_VAR|IS_VAR)) {
  567. zval_ptr_dtor_str(op2);
  568. }
  569. if (!result) {
  570. ZEND_VM_C_GOTO(is_not_equal_true);
  571. } else {
  572. ZEND_VM_C_GOTO(is_not_equal_false);
  573. }
  574. }
  575. }
  576. ZEND_VM_DISPATCH_TO_HELPER(zend_is_not_equal_helper, op_1, op1, op_2, op2);
  577. }
  578. ZEND_VM_HELPER(zend_is_smaller_helper, ANY, ANY, zval *op_1, zval *op_2)
  579. {
  580. int ret;
  581. USE_OPLINE
  582. SAVE_OPLINE();
  583. if (UNEXPECTED(Z_TYPE_INFO_P(op_1) == IS_UNDEF)) {
  584. op_1 = ZVAL_UNDEFINED_OP1();
  585. }
  586. if (UNEXPECTED(Z_TYPE_INFO_P(op_2) == IS_UNDEF)) {
  587. op_2 = ZVAL_UNDEFINED_OP2();
  588. }
  589. ret = zend_compare(op_1, op_2);
  590. if (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) {
  591. zval_ptr_dtor_nogc(op_1);
  592. }
  593. if (OP2_TYPE & (IS_TMP_VAR|IS_VAR)) {
  594. zval_ptr_dtor_nogc(op_2);
  595. }
  596. ZEND_VM_SMART_BRANCH(ret < 0, 1);
  597. }
  598. ZEND_VM_HOT_NOCONSTCONST_HANDLER(20, ZEND_IS_SMALLER, CONST|TMPVARCV, CONST|TMPVARCV, SPEC(SMART_BRANCH))
  599. {
  600. USE_OPLINE
  601. zval *op1, *op2;
  602. double d1, d2;
  603. op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
  604. op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
  605. if (ZEND_VM_SPEC && OP1_TYPE == IS_CONST && OP2_TYPE == IS_CONST) {
  606. /* pass */
  607. } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
  608. if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
  609. if (EXPECTED(Z_LVAL_P(op1) < Z_LVAL_P(op2))) {
  610. ZEND_VM_C_LABEL(is_smaller_true):
  611. ZEND_VM_SMART_BRANCH_TRUE();
  612. } else {
  613. ZEND_VM_C_LABEL(is_smaller_false):
  614. ZEND_VM_SMART_BRANCH_FALSE();
  615. }
  616. } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
  617. d1 = (double)Z_LVAL_P(op1);
  618. d2 = Z_DVAL_P(op2);
  619. ZEND_VM_C_GOTO(is_smaller_double);
  620. }
  621. } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
  622. if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
  623. d1 = Z_DVAL_P(op1);
  624. d2 = Z_DVAL_P(op2);
  625. ZEND_VM_C_LABEL(is_smaller_double):
  626. if (d1 < d2) {
  627. ZEND_VM_C_GOTO(is_smaller_true);
  628. } else {
  629. ZEND_VM_C_GOTO(is_smaller_false);
  630. }
  631. } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
  632. d1 = Z_DVAL_P(op1);
  633. d2 = (double)Z_LVAL_P(op2);
  634. ZEND_VM_C_GOTO(is_smaller_double);
  635. }
  636. }
  637. ZEND_VM_DISPATCH_TO_HELPER(zend_is_smaller_helper, op_1, op1, op_2, op2);
  638. }
  639. ZEND_VM_HELPER(zend_is_smaller_or_equal_helper, ANY, ANY, zval *op_1, zval *op_2)
  640. {
  641. int ret;
  642. USE_OPLINE
  643. SAVE_OPLINE();
  644. if (UNEXPECTED(Z_TYPE_INFO_P(op_1) == IS_UNDEF)) {
  645. op_1 = ZVAL_UNDEFINED_OP1();
  646. }
  647. if (UNEXPECTED(Z_TYPE_INFO_P(op_2) == IS_UNDEF)) {
  648. op_2 = ZVAL_UNDEFINED_OP2();
  649. }
  650. ret = zend_compare(op_1, op_2);
  651. if (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) {
  652. zval_ptr_dtor_nogc(op_1);
  653. }
  654. if (OP2_TYPE & (IS_TMP_VAR|IS_VAR)) {
  655. zval_ptr_dtor_nogc(op_2);
  656. }
  657. ZEND_VM_SMART_BRANCH(ret <= 0, 1);
  658. }
  659. ZEND_VM_HOT_NOCONSTCONST_HANDLER(21, ZEND_IS_SMALLER_OR_EQUAL, CONST|TMPVARCV, CONST|TMPVARCV, SPEC(SMART_BRANCH))
  660. {
  661. USE_OPLINE
  662. zval *op1, *op2;
  663. double d1, d2;
  664. op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
  665. op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
  666. if (ZEND_VM_SPEC && OP1_TYPE == IS_CONST && OP2_TYPE == IS_CONST) {
  667. /* pass */
  668. } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
  669. if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
  670. if (EXPECTED(Z_LVAL_P(op1) <= Z_LVAL_P(op2))) {
  671. ZEND_VM_C_LABEL(is_smaller_or_equal_true):
  672. ZEND_VM_SMART_BRANCH_TRUE();
  673. ZVAL_TRUE(EX_VAR(opline->result.var));
  674. ZEND_VM_NEXT_OPCODE();
  675. } else {
  676. ZEND_VM_C_LABEL(is_smaller_or_equal_false):
  677. ZEND_VM_SMART_BRANCH_FALSE();
  678. ZVAL_FALSE(EX_VAR(opline->result.var));
  679. ZEND_VM_NEXT_OPCODE();
  680. }
  681. } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
  682. d1 = (double)Z_LVAL_P(op1);
  683. d2 = Z_DVAL_P(op2);
  684. ZEND_VM_C_GOTO(is_smaller_or_equal_double);
  685. }
  686. } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
  687. if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
  688. d1 = Z_DVAL_P(op1);
  689. d2 = Z_DVAL_P(op2);
  690. ZEND_VM_C_LABEL(is_smaller_or_equal_double):
  691. if (d1 <= d2) {
  692. ZEND_VM_C_GOTO(is_smaller_or_equal_true);
  693. } else {
  694. ZEND_VM_C_GOTO(is_smaller_or_equal_false);
  695. }
  696. } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
  697. d1 = Z_DVAL_P(op1);
  698. d2 = (double)Z_LVAL_P(op2);
  699. ZEND_VM_C_GOTO(is_smaller_or_equal_double);
  700. }
  701. }
  702. ZEND_VM_DISPATCH_TO_HELPER(zend_is_smaller_or_equal_helper, op_1, op1, op_2, op2);
  703. }
  704. ZEND_VM_COLD_CONSTCONST_HANDLER(170, ZEND_SPACESHIP, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
  705. {
  706. USE_OPLINE
  707. zval *op1, *op2;
  708. SAVE_OPLINE();
  709. op1 = GET_OP1_ZVAL_PTR(BP_VAR_R);
  710. op2 = GET_OP2_ZVAL_PTR(BP_VAR_R);
  711. compare_function(EX_VAR(opline->result.var), op1, op2);
  712. FREE_OP1();
  713. FREE_OP2();
  714. ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
  715. }
  716. ZEND_VM_HELPER(zend_bw_or_helper, ANY, ANY, zval *op_1, zval *op_2)
  717. {
  718. USE_OPLINE
  719. SAVE_OPLINE();
  720. if (UNEXPECTED(Z_TYPE_INFO_P(op_1) == IS_UNDEF)) {
  721. op_1 = ZVAL_UNDEFINED_OP1();
  722. }
  723. if (UNEXPECTED(Z_TYPE_INFO_P(op_2) == IS_UNDEF)) {
  724. op_2 = ZVAL_UNDEFINED_OP2();
  725. }
  726. bitwise_or_function(EX_VAR(opline->result.var), op_1, op_2);
  727. if (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) {
  728. zval_ptr_dtor_nogc(op_1);
  729. }
  730. if (OP2_TYPE & (IS_TMP_VAR|IS_VAR)) {
  731. zval_ptr_dtor_nogc(op_2);
  732. }
  733. ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
  734. }
  735. ZEND_VM_HOT_NOCONSTCONST_HANDLER(9, ZEND_BW_OR, CONST|TMPVARCV, CONST|TMPVARCV, SPEC(COMMUTATIVE))
  736. {
  737. USE_OPLINE
  738. zval *op1, *op2;
  739. op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
  740. op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
  741. if (ZEND_VM_SPEC && OP1_TYPE == IS_CONST && OP2_TYPE == IS_CONST) {
  742. /* pass */
  743. } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
  744. && EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
  745. ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(op1) | Z_LVAL_P(op2));
  746. ZEND_VM_NEXT_OPCODE();
  747. }
  748. ZEND_VM_DISPATCH_TO_HELPER(zend_bw_or_helper, op_1, op1, op_2, op2);
  749. }
  750. ZEND_VM_HELPER(zend_bw_and_helper, ANY, ANY, zval *op_1, zval *op_2)
  751. {
  752. USE_OPLINE
  753. SAVE_OPLINE();
  754. if (UNEXPECTED(Z_TYPE_INFO_P(op_1) == IS_UNDEF)) {
  755. op_1 = ZVAL_UNDEFINED_OP1();
  756. }
  757. if (UNEXPECTED(Z_TYPE_INFO_P(op_2) == IS_UNDEF)) {
  758. op_2 = ZVAL_UNDEFINED_OP2();
  759. }
  760. bitwise_and_function(EX_VAR(opline->result.var), op_1, op_2);
  761. if (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) {
  762. zval_ptr_dtor_nogc(op_1);
  763. }
  764. if (OP2_TYPE & (IS_TMP_VAR|IS_VAR)) {
  765. zval_ptr_dtor_nogc(op_2);
  766. }
  767. ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
  768. }
  769. ZEND_VM_HOT_NOCONSTCONST_HANDLER(10, ZEND_BW_AND, CONST|TMPVARCV, CONST|TMPVARCV, SPEC(COMMUTATIVE))
  770. {
  771. USE_OPLINE
  772. zval *op1, *op2;
  773. op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
  774. op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
  775. if (ZEND_VM_SPEC && OP1_TYPE == IS_CONST && OP2_TYPE == IS_CONST) {
  776. /* pass */
  777. } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
  778. && EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
  779. ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(op1) & Z_LVAL_P(op2));
  780. ZEND_VM_NEXT_OPCODE();
  781. }
  782. ZEND_VM_DISPATCH_TO_HELPER(zend_bw_and_helper, op_1, op1, op_2, op2);
  783. }
  784. ZEND_VM_HELPER(zend_bw_xor_helper, ANY, ANY, zval *op_1, zval *op_2)
  785. {
  786. USE_OPLINE
  787. SAVE_OPLINE();
  788. if (UNEXPECTED(Z_TYPE_INFO_P(op_1) == IS_UNDEF)) {
  789. op_1 = ZVAL_UNDEFINED_OP1();
  790. }
  791. if (UNEXPECTED(Z_TYPE_INFO_P(op_2) == IS_UNDEF)) {
  792. op_2 = ZVAL_UNDEFINED_OP2();
  793. }
  794. bitwise_xor_function(EX_VAR(opline->result.var), op_1, op_2);
  795. if (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) {
  796. zval_ptr_dtor_nogc(op_1);
  797. }
  798. if (OP2_TYPE & (IS_TMP_VAR|IS_VAR)) {
  799. zval_ptr_dtor_nogc(op_2);
  800. }
  801. ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
  802. }
  803. ZEND_VM_HOT_NOCONSTCONST_HANDLER(11, ZEND_BW_XOR, CONST|TMPVARCV, CONST|TMPVARCV, SPEC(COMMUTATIVE))
  804. {
  805. USE_OPLINE
  806. zval *op1, *op2;
  807. op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
  808. op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
  809. if (ZEND_VM_SPEC && OP1_TYPE == IS_CONST && OP2_TYPE == IS_CONST) {
  810. /* pass */
  811. } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
  812. && EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
  813. ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(op1) ^ Z_LVAL_P(op2));
  814. ZEND_VM_NEXT_OPCODE();
  815. }
  816. ZEND_VM_DISPATCH_TO_HELPER(zend_bw_xor_helper, op_1, op1, op_2, op2);
  817. }
  818. ZEND_VM_COLD_CONSTCONST_HANDLER(15, ZEND_BOOL_XOR, CONST|TMPVAR|CV, CONST|TMPVAR|CV, SPEC(COMMUTATIVE))
  819. {
  820. USE_OPLINE
  821. zval *op1, *op2;
  822. SAVE_OPLINE();
  823. op1 = GET_OP1_ZVAL_PTR(BP_VAR_R);
  824. op2 = GET_OP2_ZVAL_PTR(BP_VAR_R);
  825. boolean_xor_function(EX_VAR(opline->result.var), op1, op2);
  826. FREE_OP1();
  827. FREE_OP2();
  828. ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
  829. }
  830. ZEND_VM_HELPER(zend_bw_not_helper, ANY, ANY, zval *op_1)
  831. {
  832. USE_OPLINE
  833. SAVE_OPLINE();
  834. if (UNEXPECTED(Z_TYPE_P(op_1) == IS_UNDEF)) {
  835. op_1 = ZVAL_UNDEFINED_OP1();
  836. }
  837. bitwise_not_function(EX_VAR(opline->result.var), op_1);
  838. FREE_OP1();
  839. ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
  840. }
  841. ZEND_VM_HOT_NOCONST_HANDLER(13, ZEND_BW_NOT, CONST|TMPVARCV, ANY)
  842. {
  843. USE_OPLINE
  844. zval *op1;
  845. op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
  846. if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
  847. ZVAL_LONG(EX_VAR(opline->result.var), ~Z_LVAL_P(op1));
  848. ZEND_VM_NEXT_OPCODE();
  849. }
  850. ZEND_VM_DISPATCH_TO_HELPER(zend_bw_not_helper, op_1, op1);
  851. }
  852. ZEND_VM_COLD_CONST_HANDLER(14, ZEND_BOOL_NOT, CONST|TMPVAR|CV, ANY)
  853. {
  854. USE_OPLINE
  855. zval *val;
  856. val = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
  857. if (Z_TYPE_INFO_P(val) == IS_TRUE) {
  858. ZVAL_FALSE(EX_VAR(opline->result.var));
  859. } else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) {
  860. /* The result and op1 can be the same cv zval */
  861. const uint32_t orig_val_type = Z_TYPE_INFO_P(val);
  862. ZVAL_TRUE(EX_VAR(opline->result.var));
  863. if (OP1_TYPE == IS_CV && UNEXPECTED(orig_val_type == IS_UNDEF)) {
  864. SAVE_OPLINE();
  865. ZVAL_UNDEFINED_OP1();
  866. ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
  867. }
  868. } else {
  869. SAVE_OPLINE();
  870. ZVAL_BOOL(EX_VAR(opline->result.var), !i_zend_is_true(val));
  871. FREE_OP1();
  872. ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
  873. }
  874. ZEND_VM_NEXT_OPCODE();
  875. }
  876. ZEND_VM_COLD_HELPER(zend_this_not_in_object_context_helper, ANY, ANY)
  877. {
  878. USE_OPLINE
  879. SAVE_OPLINE();
  880. zend_throw_error(NULL, "Using $this when not in object context");
  881. UNDEF_RESULT();
  882. HANDLE_EXCEPTION();
  883. }
  884. ZEND_VM_COLD_HELPER(zend_undefined_function_helper, ANY, ANY)
  885. {
  886. USE_OPLINE
  887. zval *function_name;
  888. SAVE_OPLINE();
  889. function_name = RT_CONSTANT(opline, opline->op2);
  890. zend_throw_error(NULL, "Call to undefined function %s()", Z_STRVAL_P(function_name));
  891. HANDLE_EXCEPTION();
  892. }
  893. ZEND_VM_HANDLER(28, ZEND_ASSIGN_OBJ_OP, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, OP)
  894. {
  895. USE_OPLINE
  896. zval *object;
  897. zval *property;
  898. zval *value;
  899. zval *zptr;
  900. void **cache_slot;
  901. zend_property_info *prop_info;
  902. zend_object *zobj;
  903. zend_string *name, *tmp_name;
  904. SAVE_OPLINE();
  905. object = GET_OP1_OBJ_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
  906. property = GET_OP2_ZVAL_PTR(BP_VAR_R);
  907. do {
  908. value = GET_OP_DATA_ZVAL_PTR(BP_VAR_R);
  909. if (OP1_TYPE != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
  910. if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) {
  911. object = Z_REFVAL_P(object);
  912. ZEND_VM_C_GOTO(assign_op_object);
  913. }
  914. if (OP1_TYPE == IS_CV
  915. && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
  916. ZVAL_UNDEFINED_OP1();
  917. }
  918. zend_throw_non_object_error(object, property OPLINE_CC EXECUTE_DATA_CC);
  919. break;
  920. }
  921. ZEND_VM_C_LABEL(assign_op_object):
  922. /* here we are sure we are dealing with an object */
  923. zobj = Z_OBJ_P(object);
  924. if (OP2_TYPE == IS_CONST) {
  925. name = Z_STR_P(property);
  926. } else {
  927. name = zval_try_get_tmp_string(property, &tmp_name);
  928. if (UNEXPECTED(!name)) {
  929. UNDEF_RESULT();
  930. break;
  931. }
  932. }
  933. cache_slot = (OP2_TYPE == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : NULL;
  934. if (EXPECTED((zptr = zobj->handlers->get_property_ptr_ptr(zobj, name, BP_VAR_RW, cache_slot)) != NULL)) {
  935. if (UNEXPECTED(Z_ISERROR_P(zptr))) {
  936. if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
  937. ZVAL_NULL(EX_VAR(opline->result.var));
  938. }
  939. } else {
  940. zval *orig_zptr = zptr;
  941. zend_reference *ref;
  942. do {
  943. if (UNEXPECTED(Z_ISREF_P(zptr))) {
  944. ref = Z_REF_P(zptr);
  945. zptr = Z_REFVAL_P(zptr);
  946. if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
  947. zend_binary_assign_op_typed_ref(ref, value OPLINE_CC EXECUTE_DATA_CC);
  948. break;
  949. }
  950. }
  951. if (OP2_TYPE == IS_CONST) {
  952. prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
  953. } else {
  954. prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), orig_zptr);
  955. }
  956. if (UNEXPECTED(prop_info)) {
  957. /* special case for typed properties */
  958. zend_binary_assign_op_typed_prop(prop_info, zptr, value OPLINE_CC EXECUTE_DATA_CC);
  959. } else {
  960. zend_binary_op(zptr, zptr, value OPLINE_CC);
  961. }
  962. } while (0);
  963. if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
  964. ZVAL_COPY(EX_VAR(opline->result.var), zptr);
  965. }
  966. }
  967. } else {
  968. zend_assign_op_overloaded_property(zobj, name, cache_slot, value OPLINE_CC EXECUTE_DATA_CC);
  969. }
  970. if (OP2_TYPE != IS_CONST) {
  971. zend_tmp_string_release(tmp_name);
  972. }
  973. } while (0);
  974. FREE_OP_DATA();
  975. FREE_OP2();
  976. FREE_OP1_VAR_PTR();
  977. /* assign_obj has two opcodes! */
  978. ZEND_VM_NEXT_OPCODE_EX(1, 2);
  979. }
  980. /* No specialization for op_types (CONST|TMP|VAR|CV, UNUSED|CONST|TMPVAR) */
  981. ZEND_VM_HANDLER(29, ZEND_ASSIGN_STATIC_PROP_OP, ANY, ANY, OP)
  982. {
  983. /* This helper actually never will receive IS_VAR as second op, and has the same handling for VAR and TMP in the first op, but for interoperability with the other binary_assign_op helpers, it is necessary to "include" it */
  984. USE_OPLINE
  985. zval *prop, *value;
  986. zend_property_info *prop_info;
  987. zend_reference *ref;
  988. SAVE_OPLINE();
  989. if (UNEXPECTED(zend_fetch_static_property_address(&prop, &prop_info, (opline+1)->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) {
  990. ZEND_ASSERT(EG(exception));
  991. UNDEF_RESULT();
  992. FREE_UNFETCHED_OP_DATA();
  993. HANDLE_EXCEPTION();
  994. }
  995. value = GET_OP_DATA_ZVAL_PTR(BP_VAR_R);
  996. do {
  997. if (UNEXPECTED(Z_ISREF_P(prop))) {
  998. ref = Z_REF_P(prop);
  999. prop = Z_REFVAL_P(prop);
  1000. if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
  1001. zend_binary_assign_op_typed_ref(ref, value OPLINE_CC EXECUTE_DATA_CC);
  1002. break;
  1003. }
  1004. }
  1005. if (UNEXPECTED(ZEND_TYPE_IS_SET(prop_info->type))) {
  1006. /* special case for typed properties */
  1007. zend_binary_assign_op_typed_prop(prop_info, prop, value OPLINE_CC EXECUTE_DATA_CC);
  1008. } else {
  1009. zend_binary_op(prop, prop, value OPLINE_CC);
  1010. }
  1011. } while (0);
  1012. if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
  1013. ZVAL_COPY(EX_VAR(opline->result.var), prop);
  1014. }
  1015. FREE_OP_DATA();
  1016. /* assign_static_prop has two opcodes! */
  1017. ZEND_VM_NEXT_OPCODE_EX(1, 2);
  1018. }
  1019. ZEND_VM_HANDLER(27, ZEND_ASSIGN_DIM_OP, VAR|CV, CONST|TMPVAR|UNUSED|NEXT|CV, OP)
  1020. {
  1021. USE_OPLINE
  1022. zval *var_ptr;
  1023. zval *value, *container, *dim;
  1024. SAVE_OPLINE();
  1025. container = GET_OP1_OBJ_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
  1026. if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
  1027. ZEND_VM_C_LABEL(assign_dim_op_array):
  1028. SEPARATE_ARRAY(container);
  1029. ZEND_VM_C_LABEL(assign_dim_op_new_array):
  1030. dim = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
  1031. if (OP2_TYPE == IS_UNUSED) {
  1032. var_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(container), &EG(uninitialized_zval));
  1033. if (UNEXPECTED(!var_ptr)) {
  1034. zend_cannot_add_element();
  1035. ZEND_VM_C_GOTO(assign_dim_op_ret_null);
  1036. }
  1037. } else {
  1038. if (OP2_TYPE == IS_CONST) {
  1039. var_ptr = zend_fetch_dimension_address_inner_RW_CONST(Z_ARRVAL_P(container), dim EXECUTE_DATA_CC);
  1040. } else {
  1041. var_ptr = zend_fetch_dimension_address_inner_RW(Z_ARRVAL_P(container), dim EXECUTE_DATA_CC);
  1042. }
  1043. if (UNEXPECTED(!var_ptr)) {
  1044. ZEND_VM_C_GOTO(assign_dim_op_ret_null);
  1045. }
  1046. }
  1047. value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1);
  1048. do {
  1049. if (OP2_TYPE != IS_UNUSED && UNEXPECTED(Z_ISREF_P(var_ptr))) {
  1050. zend_reference *ref = Z_REF_P(var_ptr);
  1051. var_ptr = Z_REFVAL_P(var_ptr);
  1052. if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
  1053. zend_binary_assign_op_typed_ref(ref, value OPLINE_CC EXECUTE_DATA_CC);
  1054. break;
  1055. }
  1056. }
  1057. zend_binary_op(var_ptr, var_ptr, value OPLINE_CC);
  1058. } while (0);
  1059. if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
  1060. ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
  1061. }
  1062. FREE_OP((opline+1)->op1_type, (opline+1)->op1.var);
  1063. } else {
  1064. if (EXPECTED(Z_ISREF_P(container))) {
  1065. container = Z_REFVAL_P(container);
  1066. if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
  1067. ZEND_VM_C_GOTO(assign_dim_op_array);
  1068. }
  1069. }
  1070. dim = GET_OP2_ZVAL_PTR(BP_VAR_R);
  1071. if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
  1072. if (OP2_TYPE == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
  1073. dim++;
  1074. }
  1075. zend_binary_assign_op_obj_dim(container, dim OPLINE_CC EXECUTE_DATA_CC);
  1076. } else if (EXPECTED(Z_TYPE_P(container) <= IS_FALSE)) {
  1077. if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(container) == IS_UNDEF)) {
  1078. ZVAL_UNDEFINED_OP1();
  1079. }
  1080. ZVAL_ARR(container, zend_new_array(8));
  1081. ZEND_VM_C_GOTO(assign_dim_op_new_array);
  1082. } else {
  1083. zend_binary_assign_op_dim_slow(container, dim OPLINE_CC EXECUTE_DATA_CC);
  1084. ZEND_VM_C_LABEL(assign_dim_op_ret_null):
  1085. if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
  1086. ZVAL_NULL(EX_VAR(opline->result.var));
  1087. }
  1088. }
  1089. }
  1090. FREE_OP2();
  1091. FREE_OP1_VAR_PTR();
  1092. ZEND_VM_NEXT_OPCODE_EX(1, 2);
  1093. }
  1094. ZEND_VM_HANDLER(26, ZEND_ASSIGN_OP, VAR|CV, CONST|TMPVAR|CV, OP)
  1095. {
  1096. USE_OPLINE
  1097. zval *var_ptr;
  1098. zval *value;
  1099. SAVE_OPLINE();
  1100. value = GET_OP2_ZVAL_PTR(BP_VAR_R);
  1101. var_ptr = GET_OP1_ZVAL_PTR_PTR(BP_VAR_RW);
  1102. do {
  1103. if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) {
  1104. zend_reference *ref = Z_REF_P(var_ptr);
  1105. var_ptr = Z_REFVAL_P(var_ptr);
  1106. if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
  1107. zend_binary_assign_op_typed_ref(ref, value OPLINE_CC EXECUTE_DATA_CC);
  1108. break;
  1109. }
  1110. }
  1111. zend_binary_op(var_ptr, var_ptr, value OPLINE_CC);
  1112. } while (0);
  1113. if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
  1114. ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
  1115. }
  1116. FREE_OP2();
  1117. FREE_OP1_VAR_PTR();
  1118. ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
  1119. }
  1120. ZEND_VM_HANDLER(132, ZEND_PRE_INC_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACHE_SLOT)
  1121. {
  1122. USE_OPLINE
  1123. zval *object;
  1124. zval *property;
  1125. zval *zptr;
  1126. void **cache_slot;
  1127. zend_property_info *prop_info;
  1128. zend_object *zobj;
  1129. zend_string *name, *tmp_name;
  1130. SAVE_OPLINE();
  1131. object = GET_OP1_OBJ_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
  1132. property = GET_OP2_ZVAL_PTR(BP_VAR_R);
  1133. do {
  1134. if (OP1_TYPE != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
  1135. if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) {
  1136. object = Z_REFVAL_P(object);
  1137. ZEND_VM_C_GOTO(pre_incdec_object);
  1138. }
  1139. if (OP1_TYPE == IS_CV
  1140. && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
  1141. ZVAL_UNDEFINED_OP1();
  1142. }
  1143. zend_throw_non_object_error(object, property OPLINE_CC EXECUTE_DATA_CC);
  1144. break;
  1145. }
  1146. ZEND_VM_C_LABEL(pre_incdec_object):
  1147. /* here we are sure we are dealing with an object */
  1148. zobj = Z_OBJ_P(object);
  1149. if (OP2_TYPE == IS_CONST) {
  1150. name = Z_STR_P(property);
  1151. } else {
  1152. name = zval_try_get_tmp_string(property, &tmp_name);
  1153. if (UNEXPECTED(!name)) {
  1154. UNDEF_RESULT();
  1155. break;
  1156. }
  1157. }
  1158. cache_slot = (OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL;
  1159. if (EXPECTED((zptr = zobj->handlers->get_property_ptr_ptr(zobj, name, BP_VAR_RW, cache_slot)) != NULL)) {
  1160. if (UNEXPECTED(Z_ISERROR_P(zptr))) {
  1161. if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
  1162. ZVAL_NULL(EX_VAR(opline->result.var));
  1163. }
  1164. } else {
  1165. if (OP2_TYPE == IS_CONST) {
  1166. prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2);
  1167. } else {
  1168. prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), zptr);
  1169. }
  1170. zend_pre_incdec_property_zval(zptr, prop_info OPLINE_CC EXECUTE_DATA_CC);
  1171. }
  1172. } else {
  1173. zend_pre_incdec_overloaded_property(zobj, name, cache_slot OPLINE_CC EXECUTE_DATA_CC);
  1174. }
  1175. if (OP2_TYPE != IS_CONST) {
  1176. zend_tmp_string_release(tmp_name);
  1177. }
  1178. } while (0);
  1179. FREE_OP2();
  1180. FREE_OP1_VAR_PTR();
  1181. ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
  1182. }
  1183. ZEND_VM_HANDLER(133, ZEND_PRE_DEC_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACHE_SLOT)
  1184. {
  1185. ZEND_VM_DISPATCH_TO_HANDLER(ZEND_PRE_INC_OBJ);
  1186. }
  1187. ZEND_VM_HANDLER(134, ZEND_POST_INC_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACHE_SLOT)
  1188. {
  1189. USE_OPLINE
  1190. zval *object;
  1191. zval *property;
  1192. zval *zptr;
  1193. void **cache_slot;
  1194. zend_property_info *prop_info;
  1195. zend_object *zobj;
  1196. zend_string *name, *tmp_name;
  1197. SAVE_OPLINE();
  1198. object = GET_OP1_OBJ_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
  1199. property = GET_OP2_ZVAL_PTR(BP_VAR_R);
  1200. do {
  1201. if (OP1_TYPE != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
  1202. if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) {
  1203. object = Z_REFVAL_P(object);
  1204. ZEND_VM_C_GOTO(post_incdec_object);
  1205. }
  1206. if (OP1_TYPE == IS_CV
  1207. && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
  1208. ZVAL_UNDEFINED_OP1();
  1209. }
  1210. zend_throw_non_object_error(object, property OPLINE_CC EXECUTE_DATA_CC);
  1211. break;
  1212. }
  1213. ZEND_VM_C_LABEL(post_incdec_object):
  1214. /* here we are sure we are dealing with an object */
  1215. zobj = Z_OBJ_P(object);
  1216. if (OP2_TYPE == IS_CONST) {
  1217. name = Z_STR_P(property);
  1218. } else {
  1219. name = zval_try_get_tmp_string(property, &tmp_name);
  1220. if (UNEXPECTED(!name)) {
  1221. ZVAL_UNDEF(EX_VAR(opline->result.var));
  1222. break;
  1223. }
  1224. }
  1225. cache_slot = (OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL;
  1226. if (EXPECTED((zptr = zobj->handlers->get_property_ptr_ptr(zobj, name, BP_VAR_RW, cache_slot)) != NULL)) {
  1227. if (UNEXPECTED(Z_ISERROR_P(zptr))) {
  1228. ZVAL_NULL(EX_VAR(opline->result.var));
  1229. } else {
  1230. if (OP2_TYPE == IS_CONST) {
  1231. prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
  1232. } else {
  1233. prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), zptr);
  1234. }
  1235. zend_post_incdec_property_zval(zptr, prop_info OPLINE_CC EXECUTE_DATA_CC);
  1236. }
  1237. } else {
  1238. zend_post_incdec_overloaded_property(zobj, name, cache_slot OPLINE_CC EXECUTE_DATA_CC);
  1239. }
  1240. if (OP2_TYPE != IS_CONST) {
  1241. zend_tmp_string_release(tmp_name);
  1242. }
  1243. } while (0);
  1244. FREE_OP2();
  1245. FREE_OP1_VAR_PTR();
  1246. ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
  1247. }
  1248. ZEND_VM_HANDLER(135, ZEND_POST_DEC_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACHE_SLOT)
  1249. {
  1250. ZEND_VM_DISPATCH_TO_HANDLER(ZEND_POST_INC_OBJ);
  1251. }
  1252. /* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CONST|VAR) */
  1253. ZEND_VM_HANDLER(38, ZEND_PRE_INC_STATIC_PROP, ANY, ANY, CACHE_SLOT)
  1254. {
  1255. USE_OPLINE
  1256. zval *prop;
  1257. zend_property_info *prop_info;
  1258. SAVE_OPLINE();
  1259. if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) {
  1260. UNDEF_RESULT();
  1261. HANDLE_EXCEPTION();
  1262. }
  1263. zend_pre_incdec_property_zval(prop,
  1264. ZEND_TYPE_IS_SET(prop_info->type) ? prop_info : NULL OPLINE_CC EXECUTE_DATA_CC);
  1265. ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
  1266. }
  1267. /* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CONST|VAR) */
  1268. ZEND_VM_HANDLER(39, ZEND_PRE_DEC_STATIC_PROP, ANY, ANY, CACHE_SLOT)
  1269. {
  1270. ZEND_VM_DISPATCH_TO_HANDLER(ZEND_PRE_INC_STATIC_PROP);
  1271. }
  1272. /* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CONST|VAR) */
  1273. ZEND_VM_HANDLER(40, ZEND_POST_INC_STATIC_PROP, ANY, ANY, CACHE_SLOT)
  1274. {
  1275. USE_OPLINE
  1276. zval *prop;
  1277. zend_property_info *prop_info;
  1278. SAVE_OPLINE();
  1279. if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) {
  1280. UNDEF_RESULT();
  1281. HANDLE_EXCEPTION();
  1282. }
  1283. zend_post_incdec_property_zval(prop,
  1284. ZEND_TYPE_IS_SET(prop_info->type) ? prop_info : NULL OPLINE_CC EXECUTE_DATA_CC);
  1285. ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
  1286. }
  1287. /* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CONST|VAR) */
  1288. ZEND_VM_HANDLER(41, ZEND_POST_DEC_STATIC_PROP, ANY, ANY, CACHE_SLOT)
  1289. {
  1290. ZEND_VM_DISPATCH_TO_HANDLER(ZEND_POST_INC_STATIC_PROP);
  1291. }
  1292. ZEND_VM_HELPER(zend_pre_inc_helper, VAR|CV, ANY)
  1293. {
  1294. USE_OPLINE
  1295. zval *var_ptr;
  1296. var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
  1297. SAVE_OPLINE();
  1298. if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(var_ptr) == IS_UNDEF)) {
  1299. ZVAL_NULL(var_ptr);
  1300. ZVAL_UNDEFINED_OP1();
  1301. }
  1302. do {
  1303. if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) {
  1304. zend_reference *ref = Z_REF_P(var_ptr);
  1305. var_ptr = Z_REFVAL_P(var_ptr);
  1306. if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
  1307. zend_incdec_typed_ref(ref, NULL OPLINE_CC EXECUTE_DATA_CC);
  1308. break;
  1309. }
  1310. }
  1311. increment_function(var_ptr);
  1312. } while (0);
  1313. if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
  1314. ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
  1315. }
  1316. FREE_OP1_VAR_PTR();
  1317. ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
  1318. }
  1319. ZEND_VM_HOT_HANDLER(34, ZEND_PRE_INC, VAR|CV, ANY, SPEC(RETVAL))
  1320. {
  1321. USE_OPLINE
  1322. zval *var_ptr;
  1323. var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
  1324. if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) {
  1325. fast_long_increment_function(var_ptr);
  1326. if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
  1327. ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
  1328. }
  1329. ZEND_VM_NEXT_OPCODE();
  1330. }
  1331. ZEND_VM_DISPATCH_TO_HELPER(zend_pre_inc_helper);
  1332. }
  1333. ZEND_VM_HELPER(zend_pre_dec_helper, VAR|CV, ANY)
  1334. {
  1335. USE_OPLINE
  1336. zval *var_ptr;
  1337. var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
  1338. SAVE_OPLINE();
  1339. if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(var_ptr) == IS_UNDEF)) {
  1340. ZVAL_NULL(var_ptr);
  1341. ZVAL_UNDEFINED_OP1();
  1342. }
  1343. do {
  1344. if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) {
  1345. zend_reference *ref = Z_REF_P(var_ptr);
  1346. var_ptr = Z_REFVAL_P(var_ptr);
  1347. if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
  1348. zend_incdec_typed_ref(ref, NULL OPLINE_CC EXECUTE_DATA_CC);
  1349. break;
  1350. }
  1351. }
  1352. decrement_function(var_ptr);
  1353. } while (0);
  1354. if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
  1355. ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
  1356. }
  1357. FREE_OP1_VAR_PTR();
  1358. ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
  1359. }
  1360. ZEND_VM_HOT_HANDLER(35, ZEND_PRE_DEC, VAR|CV, ANY, SPEC(RETVAL))
  1361. {
  1362. USE_OPLINE
  1363. zval *var_ptr;
  1364. var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
  1365. if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) {
  1366. fast_long_decrement_function(var_ptr);
  1367. if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
  1368. ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
  1369. }
  1370. ZEND_VM_NEXT_OPCODE();
  1371. }
  1372. ZEND_VM_DISPATCH_TO_HELPER(zend_pre_dec_helper);
  1373. }
  1374. ZEND_VM_HELPER(zend_post_inc_helper, VAR|CV, ANY)
  1375. {
  1376. USE_OPLINE
  1377. zval *var_ptr;
  1378. var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
  1379. SAVE_OPLINE();
  1380. if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(var_ptr) == IS_UNDEF)) {
  1381. ZVAL_NULL(var_ptr);
  1382. ZVAL_UNDEFINED_OP1();
  1383. }
  1384. do {
  1385. if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) {
  1386. zend_reference *ref = Z_REF_P(var_ptr);
  1387. var_ptr = Z_REFVAL_P(var_ptr);
  1388. if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
  1389. zend_incdec_typed_ref(ref, EX_VAR(opline->result.var) OPLINE_CC EXECUTE_DATA_CC);
  1390. break;
  1391. }
  1392. }
  1393. ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
  1394. increment_function(var_ptr);
  1395. } while (0);
  1396. FREE_OP1_VAR_PTR();
  1397. ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
  1398. }
  1399. ZEND_VM_HOT_HANDLER(36, ZEND_POST_INC, VAR|CV, ANY)
  1400. {
  1401. USE_OPLINE
  1402. zval *var_ptr;
  1403. var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
  1404. if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) {
  1405. ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(var_ptr));
  1406. fast_long_increment_function(var_ptr);
  1407. ZEND_VM_NEXT_OPCODE();
  1408. }
  1409. ZEND_VM_DISPATCH_TO_HELPER(zend_post_inc_helper);
  1410. }
  1411. ZEND_VM_HELPER(zend_post_dec_helper, VAR|CV, ANY)
  1412. {
  1413. USE_OPLINE
  1414. zval *var_ptr;
  1415. var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
  1416. SAVE_OPLINE();
  1417. if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(var_ptr) == IS_UNDEF)) {
  1418. ZVAL_NULL(var_ptr);
  1419. ZVAL_UNDEFINED_OP1();
  1420. }
  1421. do {
  1422. if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) {
  1423. zend_reference *ref = Z_REF_P(var_ptr);
  1424. var_ptr = Z_REFVAL_P(var_ptr);
  1425. if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
  1426. zend_incdec_typed_ref(ref, EX_VAR(opline->result.var) OPLINE_CC EXECUTE_DATA_CC);
  1427. break;
  1428. }
  1429. }
  1430. ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
  1431. decrement_function(var_ptr);
  1432. } while (0);
  1433. FREE_OP1_VAR_PTR();
  1434. ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
  1435. }
  1436. ZEND_VM_HOT_HANDLER(37, ZEND_POST_DEC, VAR|CV, ANY)
  1437. {
  1438. USE_OPLINE
  1439. zval *var_ptr;
  1440. var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
  1441. if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) {
  1442. ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(var_ptr));
  1443. fast_long_decrement_function(var_ptr);
  1444. ZEND_VM_NEXT_OPCODE();
  1445. }
  1446. ZEND_VM_DISPATCH_TO_HELPER(zend_post_dec_helper);
  1447. }
  1448. ZEND_VM_HANDLER(136, ZEND_ECHO, CONST|TMPVAR|CV, ANY)
  1449. {
  1450. USE_OPLINE
  1451. zval *z;
  1452. SAVE_OPLINE();
  1453. z = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
  1454. if (Z_TYPE_P(z) == IS_STRING) {
  1455. zend_string *str = Z_STR_P(z);
  1456. if (ZSTR_LEN(str) != 0) {
  1457. zend_write(ZSTR_VAL(str), ZSTR_LEN(str));
  1458. }
  1459. } else {
  1460. zend_string *str = zval_get_string_func(z);
  1461. if (ZSTR_LEN(str) != 0) {
  1462. zend_write(ZSTR_VAL(str), ZSTR_LEN(str));
  1463. } else if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(z) == IS_UNDEF)) {
  1464. ZVAL_UNDEFINED_OP1();
  1465. }
  1466. zend_string_release_ex(str, 0);
  1467. }
  1468. FREE_OP1();
  1469. ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
  1470. }
  1471. ZEND_VM_HELPER(zend_fetch_var_address_helper, CONST|TMPVAR|CV, UNUSED, int type)
  1472. {
  1473. USE_OPLINE
  1474. zval *varname;
  1475. zval *retval;
  1476. zend_string *name, *tmp_name;
  1477. HashTable *target_symbol_table;
  1478. SAVE_OPLINE();
  1479. varname = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
  1480. if (OP1_TYPE == IS_CONST) {
  1481. name = Z_STR_P(varname);
  1482. } else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) {
  1483. name = Z_STR_P(varname);
  1484. tmp_name = NULL;
  1485. } else {
  1486. if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) {
  1487. ZVAL_UNDEFINED_OP1();
  1488. }
  1489. name = zval_try_get_tmp_string(varname, &tmp_name);
  1490. if (UNEXPECTED(!name)) {
  1491. FREE_OP1();
  1492. ZVAL_UNDEF(EX_VAR(opline->result.var));
  1493. HANDLE_EXCEPTION();
  1494. }
  1495. }
  1496. target_symbol_table = zend_get_target_symbol_table(opline->extended_value EXECUTE_DATA_CC);
  1497. retval = zend_hash_find_ex(target_symbol_table, name, OP1_TYPE == IS_CONST);
  1498. if (retval == NULL) {
  1499. if (UNEXPECTED(zend_string_equals(name, ZSTR_KNOWN(ZEND_STR_THIS)))) {
  1500. ZEND_VM_C_LABEL(fetch_this):
  1501. zend_fetch_this_var(type OPLINE_CC EXECUTE_DATA_CC);
  1502. if (OP1_TYPE != IS_CONST) {
  1503. zend_tmp_string_release(tmp_name);
  1504. }
  1505. ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
  1506. }
  1507. if (type == BP_VAR_W) {
  1508. retval = zend_hash_add_new(target_symbol_table, name, &EG(uninitialized_zval));
  1509. } else if (type == BP_VAR_IS) {
  1510. retval = &EG(uninitialized_zval);
  1511. } else {
  1512. zend_error(E_WARNING, "Undefined variable $%s", ZSTR_VAL(name));
  1513. if (type == BP_VAR_RW) {
  1514. retval = zend_hash_update(target_symbol_table, name, &EG(uninitialized_zval));
  1515. } else {
  1516. retval = &EG(uninitialized_zval);
  1517. }
  1518. }
  1519. /* GLOBAL or $$name variable may be an INDIRECT pointer to CV */
  1520. } else if (Z_TYPE_P(retval) == IS_INDIRECT) {
  1521. retval = Z_INDIRECT_P(retval);
  1522. if (Z_TYPE_P(retval) == IS_UNDEF) {
  1523. if (UNEXPECTED(zend_string_equals(name, ZSTR_KNOWN(ZEND_STR_THIS)))) {
  1524. ZEND_VM_C_GOTO(fetch_this);
  1525. }
  1526. if (type == BP_VAR_W) {
  1527. ZVAL_NULL(retval);
  1528. } else if (type == BP_VAR_IS) {
  1529. retval = &EG(uninitialized_zval);
  1530. } else {
  1531. zend_error(E_WARNING, "Undefined variable $%s", ZSTR_VAL(name));
  1532. if (type == BP_VAR_RW) {
  1533. ZVAL_NULL(retval);
  1534. } else {
  1535. retval = &EG(uninitialized_zval);
  1536. }
  1537. }
  1538. }
  1539. }
  1540. if (!(opline->extended_value & ZEND_FETCH_GLOBAL_LOCK)) {
  1541. FREE_OP1();
  1542. }
  1543. if (OP1_TYPE != IS_CONST) {
  1544. zend_tmp_string_release(tmp_name);
  1545. }
  1546. ZEND_ASSERT(retval != NULL);
  1547. if (type == BP_VAR_R || type == BP_VAR_IS) {
  1548. ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
  1549. } else {
  1550. ZVAL_INDIRECT(EX_VAR(opline->result.var), retval);
  1551. }
  1552. ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
  1553. }
  1554. ZEND_VM_HANDLER(80, ZEND_FETCH_R, CONST|TMPVAR|CV, UNUSED, VAR_FETCH)
  1555. {
  1556. ZEND_VM_DISPATCH_TO_HELPER(zend_fetch_var_address_helper, type, BP_VAR_R);
  1557. }
  1558. ZEND_VM_HANDLER(83, ZEND_FETCH_W, CONST|TMPVAR|CV, UNUSED, VAR_FETCH)
  1559. {
  1560. ZEND_VM_DISPATCH_TO_HELPER(zend_fetch_var_address_helper, type, BP_VAR_W);
  1561. }
  1562. ZEND_VM_HANDLER(86, ZEND_FETCH_RW, CONST|TMPVAR|CV, UNUSED, VAR_FETCH)
  1563. {
  1564. ZEND_VM_DISPATCH_TO_HELPER(zend_fetch_var_address_helper, type, BP_VAR_RW);
  1565. }
  1566. ZEND_VM_HANDLER(

Large files files are truncated, but you can click here to view the full file