0
0
mirror of https://github.com/phpv8/v8js.git synced 2024-12-22 12:51:52 +00:00

optimize redundancy code and fix some unit test

This commit is contained in:
Albert 2021-08-20 20:08:45 +08:00
parent 8b10c81049
commit 3d64f08536
13 changed files with 65 additions and 249 deletions

View File

@ -16,9 +16,9 @@ try {
?> ?>
===EOF=== ===EOF===
--EXPECTF-- --EXPECTF--
Deprecated: Function V8Js::checkString() is deprecated in %s on line %d Deprecated: %s V8Js::checkString() is deprecated in %s on line %d
bool(true) bool(true)
Deprecated: Function V8Js::checkString() is deprecated in %s on line %d Deprecated: %s V8Js::checkString() is deprecated in %s on line %d
string(%d) "V8Js::checkString():1: SyntaxError: %s" string(%d) "V8Js::checkString():1: SyntaxError: %s"
===EOF=== ===EOF===

View File

@ -23,15 +23,15 @@ var_dump($v8->getPendingException());
--EXPECTF-- --EXPECTF--
Deprecated: V8Js::__construct(): Disabling exception reporting is deprecated, $report_uncaught_exceptions != true in %s%eexception_clearing.php on line 3 Deprecated: V8Js::__construct(): Disabling exception reporting is deprecated, $report_uncaught_exceptions != true in %s%eexception_clearing.php on line 3
Deprecated: Function V8Js::getPendingException() is deprecated in %s%eexception_clearing.php on line 5 Deprecated: %s V8Js::getPendingException() is deprecated in %s%eexception_clearing.php on line 5
NULL NULL
Deprecated: Function V8Js::clearPendingException() is deprecated in %s%eexception_clearing.php on line 7 Deprecated: %s V8Js::clearPendingException() is deprecated in %s%eexception_clearing.php on line 7
Deprecated: Function V8Js::getPendingException() is deprecated in %s%eexception_clearing.php on line 8 Deprecated: %s V8Js::getPendingException() is deprecated in %s%eexception_clearing.php on line 8
NULL NULL
Deprecated: Function V8Js::getPendingException() is deprecated in %s%eexception_clearing.php on line 11 Deprecated: %s V8Js::getPendingException() is deprecated in %s%eexception_clearing.php on line 11
object(V8JsScriptException)#%d (13) { object(V8JsScriptException)#%d (13) {
["message":protected]=> ["message":protected]=>
string(49) "throw_0:1: ReferenceError: fooobar is not defined" string(49) "throw_0:1: ReferenceError: fooobar is not defined"
@ -83,8 +83,8 @@ object(V8JsScriptException)#%d (13) {
at throw_0:1:1" at throw_0:1:1"
} }
Deprecated: Function V8Js::clearPendingException() is deprecated in %s%eexception_clearing.php on line 13 Deprecated: %s V8Js::clearPendingException() is deprecated in %s%eexception_clearing.php on line 13
Deprecated: Function V8Js::getPendingException() is deprecated in %s%eexception_clearing.php on line 14 Deprecated: %s V8Js::getPendingException() is deprecated in %s%eexception_clearing.php on line 14
NULL NULL
===EOF=== ===EOF===

View File

@ -40,7 +40,7 @@ try {
--EXPECTF-- --EXPECTF--
Deprecated: V8Js::__construct(): Disabling exception reporting is deprecated, $report_uncaught_exceptions != true in %s%eexception_propagation_2.php on line 8 Deprecated: V8Js::__construct(): Disabling exception reporting is deprecated, $report_uncaught_exceptions != true in %s%eexception_propagation_2.php on line 8
Deprecated: Function V8Js::getPendingException() is deprecated in %s%eexception_propagation_2.php on line 11 Deprecated: %s V8Js::getPendingException() is deprecated in %s%eexception_propagation_2.php on line 11
object(V8JsScriptException)#%d (13) { object(V8JsScriptException)#%d (13) {
["message":protected]=> ["message":protected]=>
string(49) "throw_0:1: ReferenceError: fooobar is not defined" string(49) "throw_0:1: ReferenceError: fooobar is not defined"

View File

@ -14,11 +14,11 @@ $a = new V8Js('myobj', array(), array('a'));
?> ?>
===EOF=== ===EOF===
--EXPECTF-- --EXPECTF--
Deprecated: Function V8Js::registerExtension() is deprecated in %s%eextensions_basic.php on line 3 Deprecated: %s V8Js::registerExtension() is deprecated in %s%eextensions_basic.php on line 3
Deprecated: Function V8Js::registerExtension() is deprecated in %s%eextensions_basic.php on line 4 Deprecated: %s V8Js::registerExtension() is deprecated in %s%eextensions_basic.php on line 4
Deprecated: Function V8Js::getExtensions() is deprecated in %s%eextensions_basic.php on line 6 Deprecated: %s V8Js::getExtensions() is deprecated in %s%eextensions_basic.php on line 6
array(2) { array(2) {
["a"]=> ["a"]=>
array(2) { array(2) {

View File

@ -13,11 +13,11 @@ var_dump(V8JS::getExtensions());
$a = new V8Js('myobj', array(), array('a')); $a = new V8Js('myobj', array(), array('a'));
?> ?>
--EXPECTF-- --EXPECTF--
Deprecated: Function V8Js::registerExtension() is deprecated in %s%eextensions_circular_dependency.php on line 3 Deprecated: %s V8Js::registerExtension() is deprecated in %s%eextensions_circular_dependency.php on line 3
Deprecated: Function V8Js::registerExtension() is deprecated in %s%eextensions_circular_dependency.php on line 4 Deprecated: %s V8Js::registerExtension() is deprecated in %s%eextensions_circular_dependency.php on line 4
Deprecated: Function V8Js::getExtensions() is deprecated in %s%eextensions_circular_dependency.php on line 6 Deprecated: %s V8Js::getExtensions() is deprecated in %s%eextensions_circular_dependency.php on line 6
array(2) { array(2) {
["a"]=> ["a"]=>
array(2) { array(2) {

View File

@ -33,7 +33,7 @@ var_dump($v8);
--EXPECTF-- --EXPECTF--
-- registerExtension -- -- registerExtension --
Deprecated: Function V8Js::registerExtension() is deprecated in %s%eextensions_error.php on line 5 Deprecated: %s V8Js::registerExtension() is deprecated in %s%eextensions_error.php on line 5
-- creating V8Js object -- -- creating V8Js object --
Error installing extension 'handlebars'. Error installing extension 'handlebars'.

View File

@ -24,7 +24,7 @@ $js->executeString($script);
?> ?>
===EOF=== ===EOF===
--EXPECTF-- --EXPECTF--
Notice: Undefined variable: bar in %s%efatal_error_ignore_non_fatals.php on line 6 %s: Undefined variable%sbar in %s%efatal_error_ignore_non_fatals.php on line 6
Warning: Foo Bar! in %s%efatal_error_ignore_non_fatals.php on line 7 Warning: Foo Bar! in %s%efatal_error_ignore_non_fatals.php on line 7
blar foo blar foo

View File

@ -25,7 +25,7 @@ goodbye cruel world!
Fatal error: Uncaught Error: Call to undefined method Foo::bar() in %s%efatal_error_v8function.php:6 Fatal error: Uncaught Error: Call to undefined method Foo::bar() in %s%efatal_error_v8function.php:6
Stack trace: Stack trace:
#0 [internal function]: Foo->callback() #0 %s: Foo->callback()
#1 %s%efatal_error_v8function.php(14): V8Function->V8Js::V8::Invoke() #1 %s%efatal_error_v8function.php(14): V8Function->V8Js::V8::Invoke()
#2 {main} #2 {main}
thrown in %s%efatal_error_v8function.php on line 6 thrown in %s%efatal_error_v8function.php on line 6

View File

@ -506,11 +506,7 @@ static PHP_METHOD(V8Js, __construct)
V8JS_GLOBAL(isolate)->DefineOwnProperty(context, object_name_js, php_obj, v8::ReadOnly); V8JS_GLOBAL(isolate)->DefineOwnProperty(context, object_name_js, php_obj, v8::ReadOnly);
/* Export public property values */ /* Export public property values */
#if (PHP_MAJOR_VERSION < 8) HashTable *properties = zend_std_get_properties(SINCE80(Z_OBJ_P(getThis()), getThis()));
HashTable *properties = zend_std_get_properties(getThis());
#else
HashTable *properties = zend_std_get_properties(Z_OBJ_P(getThis()));
#endif
zval *value; zval *value;
zend_string *member; zend_string *member;
@ -1339,15 +1335,16 @@ static SINCE74(zval*, void) v8js_write_property(SINCE80(zend_object, zval) *_obj
} }
/* Write value to PHP object */ /* Write value to PHP object */
SINCE74(return,) std_object_handlers.write_property(object, member, value, NULL); SINCE74(return,) std_object_handlers.write_property(SINCE80(object, _object), SINCE80(member, _member), value, NULL);
} }
/* }}} */ /* }}} */
#if PHP_VERSION_ID >= 80000 static void v8js_unset_property(SINCE80(zend_object, zval) *_object, SINCE80(zend_string, zval) *_member, void **cache_slot) /* {{{ */
static void v8js_unset_property(zend_object *object, zend_string *member, void **cache_slot) /* {{{ */
{ {
V8JS_BEGIN_CTX_OBJ(c, object) zend_object *object = SINCE80(_object, Z_OBJ_P(_object));
zend_string *member = SINCE80(_member, Z_STR_P(_member));
V8JS_BEGIN_CTX_OBJ(c, object);
/* Global PHP JS object */ /* Global PHP JS object */
v8::Local<v8::String> object_name_js = v8::Local<v8::String>::New(isolate, c->object_name); v8::Local<v8::String> object_name_js = v8::Local<v8::String>::New(isolate, c->object_name);
v8::Local<v8::Object> jsobj = V8JS_GLOBAL(isolate)->Get(v8_context, object_name_js).ToLocalChecked()->ToObject(v8_context).ToLocalChecked(); v8::Local<v8::Object> jsobj = V8JS_GLOBAL(isolate)->Get(v8_context, object_name_js).ToLocalChecked()->ToObject(v8_context).ToLocalChecked();
@ -1360,29 +1357,11 @@ static void v8js_unset_property(zend_object *object, zend_string *member, void *
/* Delete value from PHP JS object */ /* Delete value from PHP JS object */
v8::Local<v8::Value> key = V8JS_SYML(ZSTR_VAL(member), static_cast<int>(ZSTR_LEN(member))); v8::Local<v8::Value> key = V8JS_SYML(ZSTR_VAL(member), static_cast<int>(ZSTR_LEN(member)));
#else
static void v8js_unset_property(zval *object, zval *member, void **cache_slot) /* {{{ */
{
V8JS_BEGIN_CTX(c, object)
/* Global PHP JS object */
v8::Local<v8::String> object_name_js = v8::Local<v8::String>::New(isolate, c->object_name);
v8::Local<v8::Object> jsobj = V8JS_GLOBAL(isolate)->Get(v8_context, object_name_js).ToLocalChecked()->ToObject(v8_context).ToLocalChecked();
if (Z_STRLEN_P(member) > std::numeric_limits<int>::max()) {
zend_throw_exception(php_ce_v8js_exception,
"Property name exceeds maximum supported length", 0);
return;
}
/* Delete value from PHP JS object */
v8::Local<v8::Value> key = V8JS_SYML(Z_STRVAL_P(member), static_cast<int>(Z_STRLEN_P(member)));
#endif
jsobj->Delete(v8_context, key); jsobj->Delete(v8_context, key);
/* Unset from PHP object */ /* Unset from PHP object */
std_object_handlers.unset_property(object, member, NULL); std_object_handlers.unset_property(SINCE80(object, _object), SINCE80(member, _member), NULL);
} }
/* }}} */ /* }}} */

View File

@ -148,11 +148,7 @@ v8::Local<v8::Value> zval_to_v8js(zval *value, v8::Isolate *isolate) /* {{{ */
ce = php_date_get_date_ce(); ce = php_date_get_date_ce();
if (instanceof_function(Z_OBJCE_P(value), ce)) { if (instanceof_function(Z_OBJCE_P(value), ce)) {
zval dtval; zval dtval;
#if PHP_VERSION_ID >= 80000 zend_call_method_with_0_params(SINCE80(Z_OBJ_P(value), value), NULL, NULL, "getTimestamp", &dtval);
zend_call_method_with_0_params(Z_OBJ_P(value), NULL, NULL, "getTimestamp", &dtval);
#else
zend_call_method_with_0_params(value, NULL, NULL, "getTimestamp", &dtval);
#endif
v8::Date::New(isolate->GetEnteredOrMicrotaskContext(), ((double)Z_LVAL(dtval) * 1000.0)).ToLocal(&jsValue); v8::Date::New(isolate->GetEnteredOrMicrotaskContext(), ((double)Z_LVAL(dtval) * 1000.0)).ToLocal(&jsValue);
zval_dtor(&dtval); zval_dtor(&dtval);
} else } else

View File

@ -50,13 +50,8 @@ void v8js_create_script_exception(zval *return_value, v8::Isolate *isolate, v8::
object_init_ex(return_value, php_ce_v8js_script_exception); object_init_ex(return_value, php_ce_v8js_script_exception);
#if PHP_VERSION_ID >= 80000
#define PHPV8_EXPROP(type, name, value) \ #define PHPV8_EXPROP(type, name, value) \
zend_update_property##type(php_ce_v8js_script_exception, Z_OBJ_P(return_value), #name, sizeof(#name) - 1, value); zend_update_property##type(php_ce_v8js_script_exception, SINCE80(Z_OBJ_P(return_value), return_value), #name, sizeof(#name) - 1, value);
#else
#define PHPV8_EXPROP(type, name, value) \
zend_update_property##type(php_ce_v8js_script_exception, return_value, #name, sizeof(#name) - 1, value);
#endif
if (tc_message.IsEmpty()) { if (tc_message.IsEmpty()) {
@ -134,7 +129,6 @@ void v8js_throw_script_exception(v8::Isolate *isolate, v8::TryCatch *try_catch)
} }
} }
/* }}} */ /* }}} */
#if PHP_VERSION_ID >= 80000
#define V8JS_EXCEPTION_METHOD(property) \ #define V8JS_EXCEPTION_METHOD(property) \
static PHP_METHOD(V8JsScriptException, get##property) \ static PHP_METHOD(V8JsScriptException, get##property) \
{ \ { \
@ -143,22 +137,9 @@ void v8js_throw_script_exception(v8::Isolate *isolate, v8::TryCatch *try_catch)
if (zend_parse_parameters_none() == FAILURE) { \ if (zend_parse_parameters_none() == FAILURE) { \
return; \ return; \
} \ } \
value = zend_read_property(php_ce_v8js_script_exception, Z_OBJ_P(getThis()), #property, sizeof(#property) - 1, 0, &rv); \ value = zend_read_property(php_ce_v8js_script_exception, SINCE80(Z_OBJ_P(getThis()), getThis()), #property, sizeof(#property) - 1, 0, &rv); \
RETURN_ZVAL(value, 1, 0); \ RETURN_ZVAL(value, 1, 0); \
} }
#else
#define V8JS_EXCEPTION_METHOD(property) \
static PHP_METHOD(V8JsScriptException, get##property) \
{ \
zval *value, rv; \
\
if (zend_parse_parameters_none() == FAILURE) { \
return; \
} \
value = zend_read_property(php_ce_v8js_script_exception, getThis(), #property, sizeof(#property) - 1, 0, &rv); \
RETURN_ZVAL(value, 1, 0); \
}
#endif
/* {{{ proto string V8JsEScriptxception::getJsFileName() /* {{{ proto string V8JsEScriptxception::getJsFileName()

View File

@ -643,11 +643,11 @@ v8::Local<v8::Value> v8js_named_property_callback(v8::Local<v8::Name> property_n
zval php_value; zval php_value;
zend_object *object = reinterpret_cast<zend_object *>(self->GetAlignedPointerFromInternalField(1)); zend_object *object = reinterpret_cast<zend_object *>(self->GetAlignedPointerFromInternalField(1));
#if PHP_VERSION_ID >= 80000 #if PHP_VERSION_ID < 80000
zend_object &zobject = *object;
#else
zval zobject; zval zobject;
ZVAL_OBJ(&zobject, object); ZVAL_OBJ(&zobject, object);
#else
zend_object &zobject = *object;
#endif #endif
v8js_function_tmpl_t *tmpl_ptr = reinterpret_cast<v8js_function_tmpl_t *>(self->GetAlignedPointerFromInternalField(0)); v8js_function_tmpl_t *tmpl_ptr = reinterpret_cast<v8js_function_tmpl_t *>(self->GetAlignedPointerFromInternalField(0));
@ -803,11 +803,7 @@ v8::Local<v8::Value> v8js_named_property_callback(v8::Local<v8::Name> property_n
const zend_object_handlers *h = object->handlers; const zend_object_handlers *h = object->handlers;
if (callback_type == V8JS_PROP_QUERY) { if (callback_type == V8JS_PROP_QUERY) {
#if PHP_VERSION_ID >= 80000 if (h->has_property(&zobject, SINCE80(Z_STR_P(&zname), &zname), 0, NULL)) {
if (h->has_property(&zobject, Z_STR_P(&zname), 0, NULL)) {
#else
if (h->has_property(&zobject, &zname, 0, NULL)) {
#endif
ret_value = V8JS_UINT(v8::None); ret_value = V8JS_UINT(v8::None);
} else { } else {
ret_value = v8::Local<v8::Value>(); // empty handle ret_value = v8::Local<v8::Value>(); // empty handle
@ -818,11 +814,7 @@ v8::Local<v8::Value> v8js_named_property_callback(v8::Local<v8::Name> property_n
if(!property_info || if(!property_info ||
(property_info != ZEND_WRONG_PROPERTY_INFO && (property_info != ZEND_WRONG_PROPERTY_INFO &&
property_info->flags & ZEND_ACC_PUBLIC)) { property_info->flags & ZEND_ACC_PUBLIC)) {
#if PHP_VERSION_ID >= 80000 h->unset_property(&zobject, SINCE80(Z_STR_P(&zname), &zname), NULL);
h->unset_property(&zobject, Z_STR_P(&zname), NULL);
#else
h->unset_property(&zobject, &zname, NULL);
#endif
ret_value = V8JS_TRUE(); ret_value = V8JS_TRUE();
} }
else { else {

View File

@ -45,9 +45,15 @@ static zend_object_handlers v8js_v8generator_handlers;
#define V8JS_V8_INVOKE_FUNC_NAME "V8Js::V8::Invoke" #define V8JS_V8_INVOKE_FUNC_NAME "V8Js::V8::Invoke"
/* V8 Object handlers */ /* V8 Object handlers */
#if PHP_VERSION_ID >= 80000 static int v8js_v8object_has_property(SINCE80(zend_object, zval) *_object, SINCE80(zend_string, zval) *_member, int has_set_exists, void **cache_slot) /* {{{ */
static int v8js_v8object_has_property(zend_object *object, zend_string *member, int has_set_exists, void **cache_slot) /* {{{ */
{ {
zend_object *object = SINCE80(_object, Z_OBJ_P(_object));
zend_string *member = SINCE80(_member, Z_STR_P(_member));
/* param has_set_exists:
* 0 (has) whether property exists and is not NULL - isset()
* 1 (set) whether property exists and is true-ish - empty()
* 2 (exists) whether property exists - property_exists()
*/
int retval = false; int retval = false;
v8js_v8object *obj = Z_V8JS_V8OBJECT_OBJ(object); v8js_v8object *obj = Z_V8JS_V8OBJECT_OBJ(object);
@ -75,42 +81,6 @@ static int v8js_v8object_has_property(zend_object *object, zend_string *member,
} }
v8::Local<v8::String> jsKey = V8JS_ZSYM(member); v8::Local<v8::String> jsKey = V8JS_ZSYM(member);
#else
static int v8js_v8object_has_property(zval *object, zval *member, int has_set_exists, void **cache_slot) /* {{{ */
{
/* param has_set_exists:
* 0 (has) whether property exists and is not NULL - isset()
* 1 (set) whether property exists and is true-ish - empty()
* 2 (exists) whether property exists - property_exists()
*/
int retval = false;
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);
return false;
}
V8JS_CTX_PROLOGUE_EX(obj->ctx, false);
v8::Local<v8::Value> v8obj = v8::Local<v8::Value>::New(isolate, obj->v8obj);
v8::Local<v8::Object> jsObj;
if (Z_TYPE_P(member) != IS_STRING || !v8obj->IsObject() || !v8obj->ToObject(v8_context).ToLocal(&jsObj))
{
return false;
}
if (Z_STRLEN_P(member) > std::numeric_limits<int>::max())
{
zend_throw_exception(php_ce_v8js_exception,
"Member name length exceeds maximum supported length", 0);
return false;
}
v8::Local<v8::String> jsKey = V8JS_ZSYM(Z_STR_P(member));
#endif
/* Skip any prototype properties */ /* Skip any prototype properties */
if (!jsObj->HasRealNamedProperty(v8_context, jsKey).FromMaybe(false) && !jsObj->HasRealNamedCallbackProperty(v8_context, jsKey).FromMaybe(false)) if (!jsObj->HasRealNamedProperty(v8_context, jsKey).FromMaybe(false) && !jsObj->HasRealNamedCallbackProperty(v8_context, jsKey).FromMaybe(false))
{ {
@ -158,9 +128,11 @@ static int v8js_v8object_has_property(zval *object, zval *member, int has_set_ex
} }
/* }}} */ /* }}} */
#if PHP_VERSION_ID >= 80000 static zval *v8js_v8object_read_property(SINCE80(zend_object, zval) *_object, SINCE80(zend_string, zval) *_member, int type, void **cache_slot, zval *rv) /* {{{ */
static zval *v8js_v8object_read_property(zend_object *object, zend_string *member, int type, void **cache_slot, zval *rv) /* {{{ */
{ {
zend_object *object = SINCE80(_object, Z_OBJ_P(_object));
zend_string *member = SINCE80(_member, Z_STR_P(_member));
zval *retval = rv; zval *retval = rv;
v8js_v8object *obj = Z_V8JS_V8OBJECT_OBJ(object); v8js_v8object *obj = Z_V8JS_V8OBJECT_OBJ(object);
@ -185,34 +157,7 @@ static zval *v8js_v8object_read_property(zend_object *object, zend_string *membe
v8::Local<v8::String> jsKey = V8JS_ZSYM(member); v8::Local<v8::String> jsKey = V8JS_ZSYM(member);
v8::Local<v8::Object> jsObj = v8obj->ToObject(v8_context).ToLocalChecked(); v8::Local<v8::Object> jsObj = v8obj->ToObject(v8_context).ToLocalChecked();
#else
static zval *v8js_v8object_read_property(zval *object, zval *member, int type, void **cache_slot, zval *rv) /* {{{ */
{
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);
return SINCE74(object, retval);
}
V8JS_CTX_PROLOGUE_EX(obj->ctx, retval);
v8::Local<v8::Value> v8obj = v8::Local<v8::Value>::New(isolate, obj->v8obj);
if (Z_TYPE_P(member) == IS_STRING && v8obj->IsObject())
{
if (Z_STRLEN_P(member) > std::numeric_limits<int>::max())
{
zend_throw_exception(php_ce_v8js_exception,
"Member name length exceeds maximum supported length", 0);
return retval;
}
v8::Local<v8::String> jsKey = V8JS_ZSYM(Z_STR_P(member));
v8::Local<v8::Object> jsObj = v8obj->ToObject(v8_context).ToLocalChecked();
#endif
/* Skip any prototype properties */ /* Skip any prototype properties */
if (jsObj->HasRealNamedProperty(v8_context, jsKey).FromMaybe(false) || jsObj->HasRealNamedCallbackProperty(v8_context, jsKey).FromMaybe(false)) if (jsObj->HasRealNamedProperty(v8_context, jsKey).FromMaybe(false) || jsObj->HasRealNamedCallbackProperty(v8_context, jsKey).FromMaybe(false))
{ {
@ -229,19 +174,17 @@ static zval *v8js_v8object_read_property(zval *object, zval *member, int type, v
} }
/* }}} */ /* }}} */
#if PHP_VERSION_ID >= 80000 static zval *v8js_v8object_get_property_ptr_ptr(SINCE80(zend_object, zval) *object, SINCE80(zend_string, zval) *member, int type, void **cache_slot) /* {{{ */
static zval *v8js_v8object_get_property_ptr_ptr(zend_object *object, zend_string *member, int type, void **cache_slot) /* {{{ */
#else
static zval *v8js_v8object_get_property_ptr_ptr(zval *object, zval *member, int type, void **cache_slot) /* {{{ */
#endif
{ {
return NULL; return NULL;
} }
/* }}} */ /* }}} */
#if PHP_VERSION_ID >= 80000 static SINCE74(zval *, void) v8js_v8object_write_property(SINCE80(zend_object, zval) *_object, SINCE80(zend_string, zval) *_member, zval *value, void **cache_slot) /* {{{ */
static SINCE74(zval *, void) v8js_v8object_write_property(zend_object *object, zend_string *member, zval *value, void **cache_slot) /* {{{ */
{ {
zend_object *object = SINCE80(_object, Z_OBJ_P(_object));
zend_string *member = SINCE80(_member, Z_STR_P(_member));
v8js_v8object *obj = Z_V8JS_V8OBJECT_OBJ(object); v8js_v8object *obj = Z_V8JS_V8OBJECT_OBJ(object);
if (!obj->ctx) if (!obj->ctx)
@ -266,41 +209,16 @@ static SINCE74(zval *, void) v8js_v8object_write_property(zend_object *object, z
{ {
v8obj->CreateDataProperty(v8_context, V8JS_ZSYM(member), zval_to_v8js(value, isolate)); v8obj->CreateDataProperty(v8_context, V8JS_ZSYM(member), zval_to_v8js(value, isolate));
} }
#else
static SINCE74(zval *, void) v8js_v8object_write_property(zval *object, zval *member, zval *value, void **cache_slot) /* {{{ */
{
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);
return SINCE74(value, );
}
V8JS_CTX_PROLOGUE_EX(obj->ctx, SINCE74(value, ));
v8::Local<v8::Value> v8objHandle = v8::Local<v8::Value>::New(isolate, obj->v8obj);
if (Z_STRLEN_P(member) > std::numeric_limits<int>::max())
{
zend_throw_exception(php_ce_v8js_exception,
"Member name length exceeds maximum supported length", 0);
return SINCE74(value, );
}
v8::Local<v8::Object> v8obj;
if (v8objHandle->IsObject() && v8objHandle->ToObject(v8_context).ToLocal(&v8obj))
{
v8obj->CreateDataProperty(v8_context, V8JS_ZSYM(Z_STR_P(member)), zval_to_v8js(value, isolate));
}
#endif
return SINCE74(value, ); return SINCE74(value, );
} }
/* }}} */ /* }}} */
#if PHP_VERSION_ID >= 80000 static void v8js_v8object_unset_property(SINCE80(zend_object, zval) *_object, SINCE80(zend_string, zval) *_member, void **cache_slot) /* {{{ */
static void v8js_v8object_unset_property(zend_object *object, zend_string *member, void **cache_slot) /* {{{ */
{ {
zend_object *object = SINCE80(_object, Z_OBJ_P(_object));
zend_string *member = SINCE80(_member, Z_STR_P(_member));
v8js_v8object *obj = Z_V8JS_V8OBJECT_OBJ(object); v8js_v8object *obj = Z_V8JS_V8OBJECT_OBJ(object);
if (!obj->ctx) if (!obj->ctx)
@ -326,46 +244,12 @@ static void v8js_v8object_unset_property(zend_object *object, zend_string *membe
v8obj->Delete(v8_context, V8JS_ZSYM(member)); v8obj->Delete(v8_context, V8JS_ZSYM(member));
} }
} }
#else
static void v8js_v8object_unset_property(zval *object, zval *member, void **cache_slot) /* {{{ */
{
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);
return;
}
V8JS_CTX_PROLOGUE(obj->ctx);
v8::Local<v8::Value> v8objHandle = v8::Local<v8::Value>::New(isolate, obj->v8obj);
if (Z_STRLEN_P(member) > std::numeric_limits<int>::max())
{
zend_throw_exception(php_ce_v8js_exception,
"Member name length exceeds maximum supported length", 0);
return;
}
v8::Local<v8::Object> v8obj;
if (v8objHandle->IsObject() && v8objHandle->ToObject(v8_context).ToLocal(&v8obj))
{
v8obj->Delete(v8_context, V8JS_ZSYM(Z_STR_P(member)));
}
}
#endif
/* }}} */ /* }}} */
#if PHP_VERSION_ID >= 80000 static HashTable *v8js_v8object_get_properties(SINCE80(zend_object, zval) *object) /* {{{ */
static HashTable *v8js_v8object_get_properties(zend_object *object) /* {{{ */
{ {
v8js_v8object *obj = Z_V8JS_V8OBJECT_OBJ(object); v8js_v8object *obj = SINCE80(Z_V8JS_V8OBJECT_OBJ, Z_V8JS_V8OBJECT_OBJ_P)(object);
#else
static HashTable *v8js_v8object_get_properties(zval *object) /* {{{ */
{
v8js_v8object *obj = Z_V8JS_V8OBJECT_OBJ_P(object);
#endif
if (obj->properties == NULL) if (obj->properties == NULL)
{ {
#if PHP_VERSION_ID < 70300 #if PHP_VERSION_ID < 70300
@ -411,11 +295,7 @@ static HashTable *v8js_v8object_get_properties(zval *object) /* {{{ */
} }
/* }}} */ /* }}} */
#if PHP_VERSION_ID >= 80000 static HashTable *v8js_v8object_get_debug_info(SINCE80(zend_object, zval) *object, int *is_temp) /* {{{ */
static HashTable *v8js_v8object_get_debug_info(zend_object *object, int *is_temp) /* {{{ */
#else
static HashTable *v8js_v8object_get_debug_info(zval *object, int *is_temp) /* {{{ */
#endif
{ {
*is_temp = 0; *is_temp = 0;
return v8js_v8object_get_properties(object); return v8js_v8object_get_properties(object);
@ -544,11 +424,7 @@ static ZEND_FUNCTION(zend_v8object_func)
static zend_function *v8js_v8object_get_method(zend_object **object_ptr, zend_string *method, const zval *key) /* {{{ */ static zend_function *v8js_v8object_get_method(zend_object **object_ptr, zend_string *method, const zval *key) /* {{{ */
{ {
v8js_v8object *obj = v8js_v8object_fetch_object(*object_ptr); v8js_v8object *obj = v8js_v8object_fetch_object(*object_ptr);
#if PHP_VERSION_ID < 80000 SINCE80(zend_internal_function, zend_function) *f;
zend_function *f;
#else
zend_internal_function *f;
#endif
if (!obj->ctx) if (!obj->ctx)
{ {
@ -708,15 +584,13 @@ static int v8js_v8object_call_method(zend_string *method, zend_object *object, I
#if PHP_VERSION_ID >= 80000 #if PHP_VERSION_ID >= 80000
static int v8js_v8object_get_closure(zend_object *object, zend_class_entry **ce_ptr, zend_function **fptr_ptr, zend_object **zobj_ptr, bool call) /* {{{ */ static int v8js_v8object_get_closure(zend_object *object, zend_class_entry **ce_ptr, zend_function **fptr_ptr, zend_object **zobj_ptr, bool call) /* {{{ */
{
zend_internal_function *invoke;
v8js_v8object *obj = Z_V8JS_V8OBJECT_OBJ(object);
#else #else
static int v8js_v8object_get_closure(zval *object, zend_class_entry **ce_ptr, zend_function **fptr_ptr, zend_object **zobj_ptr) /* {{{ */ static int v8js_v8object_get_closure(zval *object, zend_class_entry **ce_ptr, zend_function **fptr_ptr, zend_object **zobj_ptr) /* {{{ */
{
zend_function *invoke;
v8js_v8object *obj = Z_V8JS_V8OBJECT_OBJ_P(object);
#endif #endif
{
SINCE80(zend_internal_function, zend_function) *invoke;
v8js_v8object *obj = SINCE80(Z_V8JS_V8OBJECT_OBJ, Z_V8JS_V8OBJECT_OBJ_P)(object);
if (!obj->ctx) if (!obj->ctx)
{ {
zend_throw_exception(php_ce_v8js_exception, zend_throw_exception(php_ce_v8js_exception,
@ -747,11 +621,7 @@ static int v8js_v8object_get_closure(zval *object, zend_class_entry **ce_ptr, ze
if (zobj_ptr) if (zobj_ptr)
{ {
#if PHP_VERSION_ID >= 80000 *zobj_ptr = SINCE80(object, Z_OBJ_P(object));
*zobj_ptr = object;
#else
*zobj_ptr = Z_OBJ_P(object);
#endif
} }
*ce_ptr = NULL; *ce_ptr = NULL;
@ -1176,9 +1046,7 @@ PHP_MINIT_FUNCTION(v8js_v8object_class) /* {{{ */
v8js_v8object_handlers.unset_property = v8js_v8object_unset_property; v8js_v8object_handlers.unset_property = v8js_v8object_unset_property;
v8js_v8object_handlers.get_properties = v8js_v8object_get_properties; v8js_v8object_handlers.get_properties = v8js_v8object_get_properties;
v8js_v8object_handlers.get_method = v8js_v8object_get_method; v8js_v8object_handlers.get_method = v8js_v8object_get_method;
#if PHP_VERSION_ID < 80000 SINCE80(, v8js_v8object_handlers.call_method = v8js_v8object_call_method);
v8js_v8object_handlers.call_method = v8js_v8object_call_method;
#endif
v8js_v8object_handlers.get_debug_info = v8js_v8object_get_debug_info; v8js_v8object_handlers.get_debug_info = v8js_v8object_get_debug_info;
v8js_v8object_handlers.get_closure = v8js_v8object_get_closure; v8js_v8object_handlers.get_closure = v8js_v8object_get_closure;
v8js_v8object_handlers.offset = XtOffsetOf(struct v8js_v8object, std); v8js_v8object_handlers.offset = XtOffsetOf(struct v8js_v8object, std);