]> granicus.if.org Git - php/commitdiff
Fixed temporarily un-expected object re-init
authorXinchen Hui <laruence@php.net>
Sun, 29 Jun 2014 07:24:00 +0000 (15:24 +0800)
committerXinchen Hui <laruence@php.net>
Sun, 29 Jun 2014 07:28:55 +0000 (15:28 +0800)
ext/intl/breakiterator/breakiterator_class.cpp
ext/intl/breakiterator/breakiterator_class.h
ext/intl/breakiterator/breakiterator_methods.cpp
ext/intl/breakiterator/rulebasedbreakiterator_methods.cpp

index ecaf503565aea765df49e2ba616e1c7571531856..7aa1eae0bc9c73f95272c2f36af5653ec1b20a9c 100644 (file)
@@ -47,7 +47,7 @@ zend_object_handlers BreakIterator_handlers;
 /* }}} */
 
 U_CFUNC        void breakiterator_object_create(zval *object,
-                                                                                BreakIterator *biter TSRMLS_DC)
+                                                                                BreakIterator *biter, int brand_new TSRMLS_DC)
 {
        UClassID classId = biter->getDynamicClassID();
        zend_class_entry *ce;
@@ -60,7 +60,9 @@ U_CFUNC       void breakiterator_object_create(zval *object,
                ce = BreakIterator_ce_ptr;
        }
 
-       object_init_ex(object, ce);
+       if (brand_new) {
+               object_init_ex(object, ce);
+       }
        breakiterator_object_construct(object, biter TSRMLS_CC);
 }
 
index 81074c28bda5c84f1c40d8fcb7d9e2faeb8eab8c..0cf213f260a2c5c7e13386cf1206f7f29bcc08ff 100644 (file)
@@ -62,7 +62,7 @@ static inline BreakIterator_object *php_intl_breakiterator_fetch_object(zend_obj
                RETURN_FALSE; \
        }
 
-void breakiterator_object_create(zval *object, BreakIterator *break_iter TSRMLS_DC);
+void breakiterator_object_create(zval *object, BreakIterator *break_iter, int brand_new TSRMLS_DC);
 
 void breakiterator_object_construct(zval *object, BreakIterator *break_iter TSRMLS_DC);
 
index 712c58fbbdc808e8fb3c55ae1f3ce013c7c0100f..ed5944a3daf402c9e890c54ddc68e88c2f3b422a 100644 (file)
@@ -73,7 +73,7 @@ static void _breakiter_factory(const char *func_name,
                RETURN_NULL();
        }
 
-       breakiterator_object_create(return_value, biter TSRMLS_CC);
+       breakiterator_object_create(return_value, biter, 1 TSRMLS_CC);
 }
 
 U_CFUNC PHP_FUNCTION(breakiter_create_word_instance)
@@ -123,7 +123,7 @@ U_CFUNC PHP_FUNCTION(breakiter_create_code_point_instance)
        }
 
        CodePointBreakIterator *cpbi = new CodePointBreakIterator();
-       breakiterator_object_create(return_value, cpbi TSRMLS_CC);
+       breakiterator_object_create(return_value, cpbi, 1 TSRMLS_CC);
 }
 
 U_CFUNC PHP_FUNCTION(breakiter_get_text)
index 0871f4416f12017a47e8615f4e1a174e85b1c0a4..36a3a8d20d3485e3176819dd4f0f57f8337ab108 100644 (file)
@@ -42,7 +42,8 @@ static void _php_intlrbbi_constructor_body(INTERNAL_FUNCTION_PARAMETERS)
                        &rules, &rules_len, &compiled) == FAILURE) {
                intl_error_set(NULL, U_ILLEGAL_ARGUMENT_ERROR,
                        "rbbi_create_instance: bad arguments", 0 TSRMLS_CC);
-               RETURN_NULL();
+               Z_OBJ_P(return_value) == NULL;
+               return;
        }
 
        // instantiation of ICU object
@@ -71,7 +72,8 @@ static void _php_intlrbbi_constructor_body(INTERNAL_FUNCTION_PARAMETERS)
                        intl_error_set_custom_msg(NULL, msg, 1 TSRMLS_CC);
                        efree(msg);
                        delete rbbi;
-                       RETURN_NULL();
+                       Z_OBJ_P(return_value) == NULL;
+                       return;
                }
        } else { // compiled
 #if U_ICU_VERSION_MAJOR_NUM * 10 + U_ICU_VERSION_MINOR_NUM >= 48
@@ -79,17 +81,18 @@ static void _php_intlrbbi_constructor_body(INTERNAL_FUNCTION_PARAMETERS)
                if (U_FAILURE(status)) {
                        intl_error_set(NULL, status, "rbbi_create_instance: unable to "
                                "create instance from compiled rules", 0 TSRMLS_CC);
-                       delete rbbi;
-                       RETURN_NULL();
+                       Z_OBJ_P(return_value) == NULL;
+                       return;
                }
 #else
                intl_error_set(NULL, U_UNSUPPORTED_ERROR, "rbbi_create_instance: "
                        "compiled rules require ICU >= 4.8", 0 TSRMLS_CC);
-               RETURN_NULL();
+               Z_OBJ_P(return_value) == NULL;
+               return;
 #endif
        }
 
-       breakiterator_object_create(return_value, rbbi TSRMLS_CC);
+       breakiterator_object_create(return_value, rbbi, 0 TSRMLS_CC);
 }
 
 U_CFUNC PHP_METHOD(IntlRuleBasedBreakIterator, __construct)
@@ -97,10 +100,9 @@ U_CFUNC PHP_METHOD(IntlRuleBasedBreakIterator, __construct)
        zval    orig_this               = *getThis();
 
        return_value = getThis();
-       //changes this to IS_NULL (without first destroying) if there's an error
        _php_intlrbbi_constructor_body(INTERNAL_FUNCTION_PARAM_PASSTHRU);
 
-       if (Z_TYPE_P(return_value) == IS_NULL) {
+       if (Z_TYPE_P(return_value) == IS_OBJECT && Z_OBJ_P(return_value) == NULL) {
                zend_object_store_ctor_failed(Z_OBJ(orig_this) TSRMLS_CC);
                zval_dtor(&orig_this);
        }