summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Popov <nikic@php.net>2014-04-25 15:41:23 +0200
committerNikita Popov <nikic@php.net>2014-04-25 23:21:05 +0200
commit4c16b777fe027d1798e50bf1232b69fc67f14959 (patch)
treefb4a5f3a9dbedd4c65981cb1cff6e5bb7dfabd75
parent9263d18bd9655a5f64f1956d9536e76e9ec22144 (diff)
downloadphp-git-4c16b777fe027d1798e50bf1232b69fc67f14959.tar.gz
Uhm, do we really need to support that?
-rw-r--r--Zend/zend_vm_def.h9
-rw-r--r--Zend/zend_vm_execute.h36
2 files changed, 45 insertions, 0 deletions
diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h
index 5bcada45c3..d2db9e0d4f 100644
--- a/Zend/zend_vm_def.h
+++ b/Zend/zend_vm_def.h
@@ -3785,6 +3785,15 @@ ZEND_VM_HANDLER(21, ZEND_CAST, CONST|TMP|VAR|CV, ANY)
switch (opline->extended_value) {
case IS_NULL:
+ if (OP1_TYPE == IS_VAR || OP1_TYPE == IS_CV) {
+ ZVAL_DEREF(expr);
+ }
+ if (Z_TYPE_P(expr) == IS_OBJECT && Z_OBJ_HT_P(expr)->cast_object) {
+ if (Z_OBJ_HT_P(expr)->cast_object(expr, result, IS_NULL TSRMLS_CC) == SUCCESS) {
+ break;
+ }
+ }
+
ZVAL_NULL(result);
break;
case IS_BOOL:
diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h
index 83fa744418..33850c8fc5 100644
--- a/Zend/zend_vm_execute.h
+++ b/Zend/zend_vm_execute.h
@@ -2785,6 +2785,15 @@ static int ZEND_FASTCALL ZEND_CAST_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
switch (opline->extended_value) {
case IS_NULL:
+ if (IS_CONST == IS_VAR || IS_CONST == IS_CV) {
+ ZVAL_DEREF(expr);
+ }
+ if (Z_TYPE_P(expr) == IS_OBJECT && Z_OBJ_HT_P(expr)->cast_object) {
+ if (Z_OBJ_HT_P(expr)->cast_object(expr, result, IS_NULL TSRMLS_CC) == SUCCESS) {
+ break;
+ }
+ }
+
ZVAL_NULL(result);
break;
case IS_BOOL:
@@ -7863,6 +7872,15 @@ static int ZEND_FASTCALL ZEND_CAST_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
switch (opline->extended_value) {
case IS_NULL:
+ if (IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) {
+ ZVAL_DEREF(expr);
+ }
+ if (Z_TYPE_P(expr) == IS_OBJECT && Z_OBJ_HT_P(expr)->cast_object) {
+ if (Z_OBJ_HT_P(expr)->cast_object(expr, result, IS_NULL TSRMLS_CC) == SUCCESS) {
+ break;
+ }
+ }
+
ZVAL_NULL(result);
break;
case IS_BOOL:
@@ -13011,6 +13029,15 @@ static int ZEND_FASTCALL ZEND_CAST_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
switch (opline->extended_value) {
case IS_NULL:
+ if (IS_VAR == IS_VAR || IS_VAR == IS_CV) {
+ ZVAL_DEREF(expr);
+ }
+ if (Z_TYPE_P(expr) == IS_OBJECT && Z_OBJ_HT_P(expr)->cast_object) {
+ if (Z_OBJ_HT_P(expr)->cast_object(expr, result, IS_NULL TSRMLS_CC) == SUCCESS) {
+ break;
+ }
+ }
+
ZVAL_NULL(result);
break;
case IS_BOOL:
@@ -29905,6 +29932,15 @@ static int ZEND_FASTCALL ZEND_CAST_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
switch (opline->extended_value) {
case IS_NULL:
+ if (IS_CV == IS_VAR || IS_CV == IS_CV) {
+ ZVAL_DEREF(expr);
+ }
+ if (Z_TYPE_P(expr) == IS_OBJECT && Z_OBJ_HT_P(expr)->cast_object) {
+ if (Z_OBJ_HT_P(expr)->cast_object(expr, result, IS_NULL TSRMLS_CC) == SUCCESS) {
+ break;
+ }
+ }
+
ZVAL_NULL(result);
break;
case IS_BOOL: