From e995708d6d1943674b171d1f3e86e54b3198d874 Mon Sep 17 00:00:00 2001 From: Stefan Siegl Date: Thu, 3 Sep 2015 23:12:19 +0200 Subject: [PATCH] PHP7 adapt: fix export of public properties on derived classes --- v8js_class.cc | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/v8js_class.cc b/v8js_class.cc index 8652aaf..01b7cc4 100644 --- a/v8js_class.cc +++ b/v8js_class.cc @@ -188,6 +188,8 @@ static zend_object* v8js_new(zend_class_entry *ce TSRMLS_DC) /* {{{ */ c = (v8js_ctx *) ecalloc(1, sizeof(*c) + zend_object_properties_size(ce)); zend_object_std_init(&c->std, ce TSRMLS_CC); + object_properties_init(&c->std, ce); + c->std.handlers = &v8js_object_handlers; TSRMLS_SET_CTX(c->zts_ctx); @@ -424,27 +426,19 @@ static PHP_METHOD(V8Js, __construct) /* Export public property values */ HashTable *properties = zend_std_get_properties(getThis() TSRMLS_CC); - HashPosition pos; zval *value; - ulong index; zend_string *member; - uint member_len; - - for(zend_hash_internal_pointer_reset_ex(properties, &pos); - value = zend_hash_get_current_data_ex(properties, &pos); - zend_hash_move_forward_ex(properties, &pos)) { - if(zend_hash_get_current_key_ex(properties, &member, &index, &pos) != HASH_KEY_IS_STRING) { - continue; - } + ZEND_HASH_FOREACH_STR_KEY(properties, member) { zend_property_info *property_info = zend_get_property_info(c->std.ce, member, 1 TSRMLS_CC); if(property_info && property_info != ZEND_WRONG_PROPERTY_INFO && property_info->flags & ZEND_ACC_PUBLIC) { /* Write value to PHP JS object */ - php_obj->ForceSet(V8JS_SYML(ZSTR_VAL(member), ZSTR_LEN(member) - 1), zval_to_v8js(value, isolate TSRMLS_CC), v8::ReadOnly); + value = OBJ_PROP(Z_OBJ_P(getThis()), property_info->offset); + php_obj->ForceSet(V8JS_ZSYM(member), zval_to_v8js(value, isolate TSRMLS_CC), v8::ReadOnly); } - } + } ZEND_HASH_FOREACH_END(); }