diff --git a/v8js_class.cc b/v8js_class.cc index 67acc69..3b1e49b 100644 --- a/v8js_class.cc +++ b/v8js_class.cc @@ -180,7 +180,7 @@ static void v8js_free_storage(zend_object *object TSRMLS_DC) /* {{{ */ c->modules_stack.~vector(); c->modules_base.~vector(); - efree(object); + efree(c); } /* }}} */ diff --git a/v8js_object_export.cc b/v8js_object_export.cc index a103bb7..bf4efa5 100644 --- a/v8js_object_export.cc +++ b/v8js_object_export.cc @@ -892,7 +892,7 @@ v8::Handle v8js_hash_to_jsobj(zval *value, v8::Isolate *isolate TSRML /* Special case, passing back object originating from JS to JS */ if (ce == php_ce_v8function) { - v8js_v8object *c = (v8js_v8object *) zend_object_store_get_object(value TSRMLS_CC); + v8js_v8object *c = Z_V8JS_V8OBJECT_OBJ_P(value); if(isolate != c->ctx->isolate) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "V8Function object passed to wrong V8Js instance"); diff --git a/v8js_v8.h b/v8js_v8.h index 492b8b9..4936ffc 100644 --- a/v8js_v8.h +++ b/v8js_v8.h @@ -17,6 +17,7 @@ /* Helper macros */ #define V8JS_SYM(v) v8::String::NewFromUtf8(isolate, v, v8::String::kInternalizedString, sizeof(v) - 1) #define V8JS_SYML(v, l) v8::String::NewFromUtf8(isolate, v, v8::String::kInternalizedString, l) +#define V8JS_ZSYM(v) v8::String::NewFromUtf8(isolate, ZSTR_VAL(v), v8::String::kInternalizedString, ZSTR_LEN(v)) #define V8JS_STR(v) v8::String::NewFromUtf8(isolate, v) #define V8JS_STRL(v, l) v8::String::NewFromUtf8(isolate, v, v8::String::kNormalString, l) #define V8JS_ZSTR(v) v8::String::NewFromUtf8(isolate, ZSTR_VAL(v), v8::String::kNormalString, ZSTR_LEN(v)) diff --git a/v8js_v8object_class.cc b/v8js_v8object_class.cc index 1a20626..5e87c29 100644 --- a/v8js_v8object_class.cc +++ b/v8js_v8object_class.cc @@ -44,7 +44,7 @@ static zend_object_handlers v8js_v8object_handlers; /* V8 Object handlers */ -static int v8js_v8object_has_property(zval *object, zval *member, int has_set_exists ZEND_HASH_KEY_DC TSRMLS_DC) /* {{{ */ +static int v8js_v8object_has_property(zval *object, zval *member, int has_set_exists, void **cache_slot TSRMLS_DC) /* {{{ */ { /* param has_set_exists: * 0 (has) whether property exists and is not NULL - isset() @@ -52,7 +52,7 @@ static int v8js_v8object_has_property(zval *object, zval *member, int has_set_ex * 2 (exists) whether property exists - property_exists() */ int retval = false; - v8js_v8object *obj = (v8js_v8object *) zend_object_store_get_object(object TSRMLS_CC); + v8js_v8object *obj = Z_V8JS_V8OBJECT_OBJ_P(object); if (!obj->ctx) { zend_throw_exception(php_ce_v8js_exception, @@ -114,15 +114,14 @@ static int v8js_v8object_has_property(zval *object, zval *member, int has_set_ex } /* }}} */ -static zval *v8js_v8object_read_property(zval *object, zval *member, int type ZEND_HASH_KEY_DC TSRMLS_DC) /* {{{ */ +static zval *v8js_v8object_read_property(zval *object, zval *member, int type, void **cache_slot, zval *rv TSRMLS_DC) /* {{{ */ { - zval *retval = NULL; - v8js_v8object *obj = (v8js_v8object *) zend_object_store_get_object(object TSRMLS_CC); + zval *retval = rv; + v8js_v8object *obj = Z_V8JS_V8OBJECT_OBJ_P(object); if (!obj->ctx) { zend_throw_exception(php_ce_v8js_exception, "Can't access V8Object after V8Js instance is destroyed!", 0 TSRMLS_CC); - ALLOC_INIT_ZVAL(retval); return retval; } @@ -146,28 +145,19 @@ static zval *v8js_v8object_read_property(zval *object, zval *member, int type ZE if (jsObj->HasRealNamedProperty(jsKey) || jsObj->HasRealNamedCallbackProperty(jsKey)) { jsVal = jsObj->Get(jsKey); - if (jsVal->IsObject()) { - ALLOC_INIT_ZVAL(retval); - Z_SET_REFCOUNT_P(retval, 0); - } else { - MAKE_STD_ZVAL(retval); - } - if (v8js_to_zval(jsVal, retval, obj->flags, isolate TSRMLS_CC) == SUCCESS) { return retval; } } } - ALLOC_INIT_ZVAL(retval); - return retval; } /* }}} */ -static void v8js_v8object_write_property(zval *object, zval *member, zval *value ZEND_HASH_KEY_DC TSRMLS_DC) /* {{{ */ +static void v8js_v8object_write_property(zval *object, zval *member, zval *value, void **cache_slot TSRMLS_DC) /* {{{ */ { - v8js_v8object *obj = (v8js_v8object *) zend_object_store_get_object(object TSRMLS_CC); + v8js_v8object *obj = Z_V8JS_V8OBJECT_OBJ_P(object); if (!obj->ctx) { zend_throw_exception(php_ce_v8js_exception, @@ -190,9 +180,9 @@ static void v8js_v8object_write_property(zval *object, zval *member, zval *value } /* }}} */ -static void v8js_v8object_unset_property(zval *object, zval *member ZEND_HASH_KEY_DC TSRMLS_DC) /* {{{ */ +static void v8js_v8object_unset_property(zval *object, zval *member, void **cache_slot TSRMLS_DC) /* {{{ */ { - v8js_v8object *obj = (v8js_v8object *) zend_object_store_get_object(object TSRMLS_CC); + v8js_v8object *obj = Z_V8JS_V8OBJECT_OBJ_P(object); if (!obj->ctx) { zend_throw_exception(php_ce_v8js_exception, @@ -217,7 +207,7 @@ static void v8js_v8object_unset_property(zval *object, zval *member ZEND_HASH_KE static HashTable *v8js_v8object_get_properties(zval *object TSRMLS_DC) /* {{{ */ { - v8js_v8object *obj = (v8js_v8object *) zend_object_store_get_object(object TSRMLS_CC); + v8js_v8object *obj = Z_V8JS_V8OBJECT_OBJ_P(object); HashTable *retval; if (obj->properties == NULL) { @@ -268,9 +258,9 @@ static HashTable *v8js_v8object_get_debug_info(zval *object, int *is_temp TSRMLS } /* }}} */ -static zend_function *v8js_v8object_get_method(zval **object_ptr, char *method, int method_len ZEND_HASH_KEY_DC TSRMLS_DC) /* {{{ */ +static zend_function *v8js_v8object_get_method(zend_object **object_ptr, zend_string *method, const zval *key TSRMLS_DC) /* {{{ */ { - v8js_v8object *obj = (v8js_v8object *) zend_object_store_get_object(*object_ptr TSRMLS_CC); + v8js_v8object *obj = v8js_v8object_fetch_object(*object_ptr); zend_function *f; if (!obj->ctx) { @@ -285,7 +275,7 @@ static zend_function *v8js_v8object_get_method(zval **object_ptr, char *method, v8::HandleScope local_scope(isolate); v8::Local temp_context = v8::Context::New(isolate); v8::Context::Scope temp_scope(temp_context); - v8::Local jsKey = V8JS_STRL(method, method_len); + v8::Local jsKey = V8JS_ZSTR(method); v8::Local v8obj = v8::Local::New(isolate, obj->v8obj); if (!obj->v8obj.IsEmpty() && v8obj->IsObject() && !v8obj->IsFunction()) { @@ -294,7 +284,7 @@ static zend_function *v8js_v8object_get_method(zval **object_ptr, char *method, if (jsObj->Has(jsKey) && jsObj->Get(jsKey)->IsFunction()) { f = (zend_function *) ecalloc(1, sizeof(*f)); f->type = ZEND_OVERLOADED_FUNCTION_TEMPORARY; - f->common.function_name = estrndup(method, method_len); + f->common.function_name = zend_string_copy(method); return f; } } @@ -303,13 +293,12 @@ static zend_function *v8js_v8object_get_method(zval **object_ptr, char *method, } /* }}} */ -static int v8js_v8object_call_method(const char *method, INTERNAL_FUNCTION_PARAMETERS) /* {{{ */ +static int v8js_v8object_call_method(zend_string *method, zend_object *object, INTERNAL_FUNCTION_PARAMETERS) /* {{{ */ { - zval *object = this_ptr, ***argv = NULL; + zval *argv = NULL; int argc = ZEND_NUM_ARGS(); - v8js_v8object *obj; - obj = (v8js_v8object *) zend_object_store_get_object(object TSRMLS_CC); + v8js_v8object *obj = v8js_v8object_fetch_object(object); if (!obj->ctx) { zend_throw_exception(php_ce_v8js_exception, @@ -318,19 +307,18 @@ static int v8js_v8object_call_method(const char *method, INTERNAL_FUNCTION_PARAM } if (obj->v8obj.IsEmpty()) { - zval_ptr_dtor(&object); return FAILURE; } if (argc > 0) { - argv = (zval***)safe_emalloc(sizeof(zval**), argc, 0); + argv = (zval*)safe_emalloc(sizeof(zval), argc, 0); zend_get_parameters_array_ex(argc, argv); } std::function< v8::Local(v8::Isolate *) > v8_call = [obj, method, argc, argv TSRMLS_CC](v8::Isolate *isolate) { int i = 0; - v8::Local method_name = V8JS_SYML(method, strlen(method)); + v8::Local method_name = V8JS_ZSYM(method); v8::Local v8obj = v8::Local::New(isolate, obj->v8obj)->ToObject(); v8::Local cb; @@ -345,14 +333,13 @@ static int v8js_v8object_call_method(const char *method, INTERNAL_FUNCTION_PARAM for (i = 0; i < argc; i++) { new(&jsArgv[i]) v8::Local; - jsArgv[i] = v8::Local::New(isolate, zval_to_v8js(*argv[i], isolate TSRMLS_CC)); + jsArgv[i] = v8::Local::New(isolate, zval_to_v8js(&argv[i], isolate TSRMLS_CC)); } return cb->Call(V8JS_GLOBAL(isolate), argc, jsArgv); }; v8js_v8_call(obj->ctx, &return_value, obj->flags, obj->ctx->time_limit, obj->ctx->memory_limit, v8_call TSRMLS_CC); - zval_ptr_dtor(&object); if (argc > 0) { efree(argv); @@ -362,11 +349,10 @@ static int v8js_v8object_call_method(const char *method, INTERNAL_FUNCTION_PARAM } /* }}} */ -static int v8js_v8object_get_closure(zval *object, zend_class_entry **ce_ptr, zend_function **fptr_ptr, zval **zobj_ptr TSRMLS_DC) /* {{{ */ +static int v8js_v8object_get_closure(zval *object, zend_class_entry **ce_ptr, zend_function **fptr_ptr, zend_object **zobj_ptr TSRMLS_DC) /* {{{ */ { zend_function *invoke; - - v8js_v8object *obj = (v8js_v8object *) zend_object_store_get_object(object TSRMLS_CC); + v8js_v8object *obj = Z_V8JS_V8OBJECT_OBJ_P(object); if (!obj->ctx) { zend_throw_exception(php_ce_v8js_exception, @@ -388,12 +374,12 @@ static int v8js_v8object_get_closure(zval *object, zend_class_entry **ce_ptr, ze invoke = (zend_function *) ecalloc(1, sizeof(*invoke)); invoke->type = ZEND_OVERLOADED_FUNCTION_TEMPORARY; - invoke->common.function_name = estrndup(V8JS_V8_INVOKE_FUNC_NAME, sizeof(V8JS_V8_INVOKE_FUNC_NAME) - 1); + invoke->common.function_name = zend_string_init(V8JS_V8_INVOKE_FUNC_NAME, sizeof(V8JS_V8_INVOKE_FUNC_NAME) - 1, 0); *fptr_ptr = invoke; if (zobj_ptr) { - *zobj_ptr = object; + *zobj_ptr = Z_OBJ_P(object); } *ce_ptr = NULL; @@ -402,9 +388,9 @@ static int v8js_v8object_get_closure(zval *object, zend_class_entry **ce_ptr, ze } /* }}} */ -static void v8js_v8object_free_storage(void *object, zend_object_handle handle TSRMLS_DC) /* {{{ */ +static void v8js_v8object_free_storage(zend_object *object TSRMLS_DC) /* {{{ */ { - v8js_v8object *c = (v8js_v8object *) object; + v8js_v8object *c = v8js_v8object_fetch_object(object); if (c->properties) { zend_hash_destroy(c->properties); @@ -419,24 +405,22 @@ static void v8js_v8object_free_storage(void *object, zend_object_handle handle T c->ctx->v8js_v8objects.remove(c); } - efree(object); + efree(c); } /* }}} */ -static zend_object_value v8js_v8object_new(zend_class_entry *ce TSRMLS_DC) /* {{{ */ +static zend_object *v8js_v8object_new(zend_class_entry *ce TSRMLS_DC) /* {{{ */ { - zend_object_value retval; v8js_v8object *c; - - c = (v8js_v8object *) ecalloc(1, sizeof(*c)); + c = (v8js_v8object *) ecalloc(1, sizeof(v8js_v8object) + zend_object_properties_size(ce)); zend_object_std_init(&c->std, ce TSRMLS_CC); new(&c->v8obj) v8::Persistent(); - retval.handle = zend_objects_store_put(c, NULL, (zend_objects_free_object_storage_t) v8js_v8object_free_storage, NULL TSRMLS_CC); - retval.handlers = &v8js_v8object_handlers; - - return retval; + v8js_v8object_handlers.offset = XtOffsetOf(struct v8js_v8object, std); + v8js_v8object_handlers.free_obj = v8js_v8object_free_storage; + + return &c->std; } /* }}} */ @@ -508,11 +492,9 @@ PHP_METHOD(V8Function, __wakeup) void v8js_v8object_create(zval *res, v8::Handle value, int flags, v8::Isolate *isolate TSRMLS_DC) /* {{{ */ { v8js_ctx *ctx = (v8js_ctx *) isolate->GetData(0); - v8js_v8object *c; object_init_ex(res, value->IsFunction() ? php_ce_v8function : php_ce_v8object); - - c = (v8js_v8object *) zend_object_store_get_object(res TSRMLS_CC); + v8js_v8object *c = Z_V8JS_V8OBJECT_OBJ_P(res); c->v8obj.Reset(isolate, value); c->flags = flags; diff --git a/v8js_v8object_class.h b/v8js_v8object_class.h index e8b22bc..31e8400 100644 --- a/v8js_v8object_class.h +++ b/v8js_v8object_class.h @@ -16,11 +16,11 @@ /* {{{ Object container */ struct v8js_v8object { - zend_object std; v8::Persistent v8obj; int flags; struct v8js_ctx *ctx; HashTable *properties; + zend_object std; }; /* }}} */ @@ -30,6 +30,12 @@ extern zend_class_entry *php_ce_v8function; /* Create PHP V8 object */ void v8js_v8object_create(zval *, v8::Handle, int, v8::Isolate * TSRMLS_DC); +static inline v8js_v8object *v8js_v8object_fetch_object(zend_object *obj) { + return (v8js_v8object *)((char *)obj - XtOffsetOf(struct v8js_v8object, std)); +} + +#define Z_V8JS_V8OBJECT_OBJ_P(zv) v8js_v8object_fetch_object(Z_OBJ_P(zv)); + PHP_MINIT_FUNCTION(v8js_v8object_class); #endif /* V8JS_V8OBJECT_CLASS_H */