浏览代码

optimize redundancy code and fix some unit test

Albert 3 年之前
父节点
当前提交
3d64f08536

+ 2 - 2
tests/checkstring.phpt

@@ -16,9 +16,9 @@ try {
 ?>
 ===EOF===
 --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)
 
-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"
 ===EOF===

+ 6 - 6
tests/exception_clearing.phpt

@@ -23,15 +23,15 @@ var_dump($v8->getPendingException());
 --EXPECTF--
 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
 
-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
 
-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) {
   ["message":protected]=>
   string(49) "throw_0:1: ReferenceError: fooobar is not defined"
@@ -83,8 +83,8 @@ object(V8JsScriptException)#%d (13) {
     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
 ===EOF===

+ 1 - 1
tests/exception_propagation_2.phpt

@@ -40,7 +40,7 @@ try {
 --EXPECTF--
 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) {
   ["message":protected]=>
   string(49) "throw_0:1: ReferenceError: fooobar is not defined"

+ 3 - 3
tests/extensions_basic.phpt

@@ -14,11 +14,11 @@ $a = new V8Js('myobj', array(), array('a'));
 ?>
 ===EOF===
 --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) {
   ["a"]=>
   array(2) {

+ 3 - 3
tests/extensions_circular_dependency.phpt

@@ -13,11 +13,11 @@ var_dump(V8JS::getExtensions());
 $a = new V8Js('myobj', array(), array('a'));
 ?>
 --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) {
   ["a"]=>
   array(2) {

+ 1 - 1
tests/extensions_error.phpt

@@ -33,7 +33,7 @@ var_dump($v8);
 --EXPECTF--
 -- 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 --
 Error installing extension 'handlebars'.
 

+ 1 - 1
tests/fatal_error_ignore_non_fatals.phpt

@@ -24,7 +24,7 @@ $js->executeString($script);
 ?>
 ===EOF===
 --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
 blar foo

+ 1 - 1
tests/fatal_error_v8function.phpt

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

+ 7 - 28
v8js_class.cc

@@ -506,11 +506,7 @@ static PHP_METHOD(V8Js, __construct)
 	V8JS_GLOBAL(isolate)->DefineOwnProperty(context, object_name_js, php_obj, v8::ReadOnly);
 
 	/* Export public property values */
-	#if (PHP_MAJOR_VERSION < 8)
-	HashTable *properties = zend_std_get_properties(getThis());
-	#else
-	HashTable *properties = zend_std_get_properties(Z_OBJ_P(getThis()));
-	#endif
+	HashTable *properties = zend_std_get_properties(SINCE80(Z_OBJ_P(getThis()), getThis()));
 	zval *value;
 	zend_string *member;
 
@@ -1339,15 +1335,16 @@ static SINCE74(zval*, void) v8js_write_property(SINCE80(zend_object, zval) *_obj
 	}
 
 	/* 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(zend_object *object, zend_string *member, void **cache_slot) /* {{{ */
+static void v8js_unset_property(SINCE80(zend_object, zval) *_object, SINCE80(zend_string, zval) *_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 */
 	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();
@@ -1360,29 +1357,11 @@ static void v8js_unset_property(zend_object *object, zend_string *member, void *
 
 	/* Delete value from PHP JS object */
 	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);
 
 	/* Unset from PHP object */
-	std_object_handlers.unset_property(object, member, NULL);
+	std_object_handlers.unset_property(SINCE80(object, _object), SINCE80(member, _member), NULL);
 }
 /* }}} */
 

+ 1 - 5
v8js_convert.cc

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

+ 2 - 21
v8js_exceptions.cc

@@ -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);
 
-#if PHP_VERSION_ID >= 80000
 #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);
-#else
-#define PHPV8_EXPROP(type, name, value) \
-	zend_update_property##type(php_ce_v8js_script_exception, return_value, #name, sizeof(#name) - 1, value);
-#endif
+	zend_update_property##type(php_ce_v8js_script_exception, SINCE80(Z_OBJ_P(return_value), return_value), #name, sizeof(#name) - 1, value);
 
 
 	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) \
 	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) { \
 			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); \
 	}
-#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()

+ 5 - 13
v8js_object_export.cc

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

+ 31 - 163
v8js_v8object_class.cc

@@ -45,46 +45,17 @@ static zend_object_handlers v8js_v8generator_handlers;
 #define V8JS_V8_INVOKE_FUNC_NAME "V8Js::V8::Invoke"
 
 /* V8 Object handlers */
-#if PHP_VERSION_ID >= 80000
-static int v8js_v8object_has_property(zend_object *object, zend_string *member, int has_set_exists, void **cache_slot) /* {{{ */
-{
-	int retval = false;
-	v8js_v8object *obj = Z_V8JS_V8OBJECT_OBJ(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 (!v8obj->IsObject() || !v8obj->ToObject(v8_context).ToLocal(&jsObj))
-	{
-		return false;
-	}
-
-	if (ZSTR_LEN(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(member);
-#else
-static int v8js_v8object_has_property(zval *object, zval *member, int has_set_exists, void **cache_slot) /* {{{ */
+static int v8js_v8object_has_property(SINCE80(zend_object, zval) *_object, SINCE80(zend_string, zval) *_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;
-	v8js_v8object *obj = Z_V8JS_V8OBJECT_OBJ_P(object);
+	v8js_v8object *obj = Z_V8JS_V8OBJECT_OBJ(object);
 
 	if (!obj->ctx)
 	{
@@ -97,20 +68,19 @@ static int v8js_v8object_has_property(zval *object, zval *member, int has_set_ex
 	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))
+	if (!v8obj->IsObject() || !v8obj->ToObject(v8_context).ToLocal(&jsObj))
 	{
 		return false;
 	}
 
-	if (Z_STRLEN_P(member) > std::numeric_limits<int>::max())
+	if (ZSTR_LEN(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
+	v8::Local<v8::String> jsKey = V8JS_ZSYM(member);
 	/* Skip any prototype properties */
 	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(zend_object *object, zend_string *member, int type, void **cache_slot, zval *rv) /* {{{ */
+static zval *v8js_v8object_read_property(SINCE80(zend_object, zval) *_object, SINCE80(zend_string, zval) *_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;
 	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::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 */
 		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(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
+static zval *v8js_v8object_get_property_ptr_ptr(SINCE80(zend_object, zval) *object, SINCE80(zend_string, zval) *member, int type, void **cache_slot) /* {{{ */
 {
 	return NULL;
 }
 /* }}} */
 
-#if PHP_VERSION_ID >= 80000
-static SINCE74(zval *, void) v8js_v8object_write_property(zend_object *object, zend_string *member, zval *value, void **cache_slot) /* {{{ */
+static SINCE74(zval *, void) v8js_v8object_write_property(SINCE80(zend_object, zval) *_object, SINCE80(zend_string, zval) *_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);
 
 	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));
 	}
-#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, );
 }
 /* }}} */
 
-#if PHP_VERSION_ID >= 80000
-static void v8js_v8object_unset_property(zend_object *object, zend_string *member, void **cache_slot) /* {{{ */
+static void v8js_v8object_unset_property(SINCE80(zend_object, zval) *_object, SINCE80(zend_string, zval) *_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);
 
 	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));
 	}
 }
-#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(zend_object *object) /* {{{ */
-{
-	v8js_v8object *obj = Z_V8JS_V8OBJECT_OBJ(object);
-#else
-static HashTable *v8js_v8object_get_properties(zval *object) /* {{{ */
+static HashTable *v8js_v8object_get_properties(SINCE80(zend_object, zval) *object) /* {{{ */
 {
-	v8js_v8object *obj = Z_V8JS_V8OBJECT_OBJ_P(object);
-#endif
+	v8js_v8object *obj = SINCE80(Z_V8JS_V8OBJECT_OBJ, Z_V8JS_V8OBJECT_OBJ_P)(object);
+
 	if (obj->properties == NULL)
 	{
 #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(zend_object *object, int *is_temp) /* {{{ */
-#else
-static HashTable *v8js_v8object_get_debug_info(zval *object, int *is_temp) /* {{{ */
-#endif
+static HashTable *v8js_v8object_get_debug_info(SINCE80(zend_object, zval) *object, int *is_temp) /* {{{ */
 {
 	*is_temp = 0;
 	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) /* {{{ */
 {
 	v8js_v8object *obj = v8js_v8object_fetch_object(*object_ptr);
-#if PHP_VERSION_ID < 80000
-	zend_function *f;
-#else
-	zend_internal_function *f;
-#endif
+	SINCE80(zend_internal_function, zend_function) *f;
 
 	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
 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
 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
+{
+	SINCE80(zend_internal_function, zend_function) *invoke;
+	v8js_v8object *obj = SINCE80(Z_V8JS_V8OBJECT_OBJ, Z_V8JS_V8OBJECT_OBJ_P)(object);
+
 	if (!obj->ctx)
 	{
 		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 PHP_VERSION_ID >= 80000
-		*zobj_ptr = object;
-#else
-		*zobj_ptr = Z_OBJ_P(object);
-#endif
+		*zobj_ptr = SINCE80(object, Z_OBJ_P(object));
 	}
 
 	*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.get_properties = v8js_v8object_get_properties;
 	v8js_v8object_handlers.get_method = v8js_v8object_get_method;
-#if PHP_VERSION_ID < 80000
-	v8js_v8object_handlers.call_method = v8js_v8object_call_method;
-#endif
+	SINCE80(, v8js_v8object_handlers.call_method = v8js_v8object_call_method);
 	v8js_v8object_handlers.get_debug_info = v8js_v8object_get_debug_info;
 	v8js_v8object_handlers.get_closure = v8js_v8object_get_closure;
 	v8js_v8object_handlers.offset = XtOffsetOf(struct v8js_v8object, std);