]> granicus.if.org Git - php/commitdiff
Uhm, do we really need to support that?
authorNikita Popov <nikic@php.net>
Fri, 25 Apr 2014 13:41:23 +0000 (15:41 +0200)
committerNikita Popov <nikic@php.net>
Fri, 25 Apr 2014 21:21:05 +0000 (23:21 +0200)
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

index 5bcada45c3ceb946ef880a7038c10b2206e8e876..d2db9e0d4f91b80c2a7c8a5caad22a57deccfdf2 100644 (file)
@@ -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:
index 83fa74441850ec5834c7524edabe3e99dae04c3e..33850c8fc5d7195568df6690794d2e9643bfa085 100644 (file)
@@ -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: