From 4d4eccb3adf2d612e96a089d3402252476cc5f4c Mon Sep 17 00:00:00 2001 From: Stefan Siegl Date: Sat, 28 Sep 2024 18:09:43 +0200 Subject: [PATCH] support both V8 10.x and 12.x --- v8js_array_access.cc | 36 +++++++++++++++++++++--------------- v8js_array_access.h | 12 ++++++------ v8js_class.cc | 4 ++++ v8js_methods.cc | 4 ++++ v8js_object_export.cc | 32 ++++++++++++++++++++------------ v8js_v8.h | 16 ++++++++++++++++ 6 files changed, 71 insertions(+), 33 deletions(-) diff --git a/v8js_array_access.cc b/v8js_array_access.cc index e9fee48..3675213 100644 --- a/v8js_array_access.cc +++ b/v8js_array_access.cc @@ -56,7 +56,7 @@ static zval v8js_array_access_dispatch(zend_object *object, const char *method_n -v8::Intercepted v8js_array_access_getter(uint32_t index, const v8::PropertyCallbackInfo& info) /* {{{ */ +V8JS_INTERCEPTED v8js_array_access_getter(uint32_t index, const v8::PropertyCallbackInfo& info) /* {{{ */ { v8::Isolate *isolate = info.GetIsolate(); v8::Local self = info.Holder(); @@ -71,16 +71,16 @@ v8::Intercepted v8js_array_access_getter(uint32_t index, const v8::PropertyCallb zval_ptr_dtor(&php_value); if (ret_value.IsEmpty()) { - return v8::Intercepted::kNo; + return V8JS_INTERCEPTED_NO; } else { info.GetReturnValue().Set(ret_value); - return v8::Intercepted::kYes; + return V8JS_INTERCEPTED_YES; } } /* }}} */ -v8::Intercepted v8js_array_access_setter(uint32_t index, v8::Local value, - const v8::PropertyCallbackInfo& info) /* {{{ */ +V8JS_INTERCEPTED v8js_array_access_setter(uint32_t index, v8::Local value, + const V8JS_SETTER_PROPERTY_CALLBACK_INFO &info) /* {{{ */ { v8::Isolate *isolate = info.GetIsolate(); v8::Local self = info.Holder(); @@ -91,16 +91,22 @@ v8::Intercepted v8js_array_access_setter(uint32_t index, v8::Local va ZVAL_UNDEF(&zvalue); if (v8js_to_zval(value, &zvalue, 0, isolate) != SUCCESS) { - return v8::Intercepted::kNo; + return V8JS_INTERCEPTED_NO; } zval php_value = v8js_array_access_dispatch(object, "offsetSet", 2, index, zvalue); zval_ptr_dtor(&php_value); +#if !PHP_V8_HAS_INTERCEPTED + /* simply pass back the value to tell we intercepted the call + * as the offsetSet function returns void. */ + info.GetReturnValue().Set(value); +#endif + /* if PHP wanted to hold on to this value, zend_call_function would * have bumped the refcount. */ zval_ptr_dtor(&zvalue); - return v8::Intercepted::kYes; + return V8JS_INTERCEPTED_YES; } /* }}} */ @@ -160,7 +166,7 @@ static void v8js_array_access_length(v8::Local property, const v8::P } /* }}} */ -v8::Intercepted v8js_array_access_deleter(uint32_t index, const v8::PropertyCallbackInfo& info) /* {{{ */ +V8JS_INTERCEPTED v8js_array_access_deleter(uint32_t index, const v8::PropertyCallbackInfo& info) /* {{{ */ { v8::Isolate *isolate = info.GetIsolate(); v8::Local self = info.Holder(); @@ -174,11 +180,11 @@ v8::Intercepted v8js_array_access_deleter(uint32_t index, const v8::PropertyCall zval_ptr_dtor(&php_value); info.GetReturnValue().Set(V8JS_BOOL(true)); - return v8::Intercepted::kYes; + return V8JS_INTERCEPTED_YES; } /* }}} */ -v8::Intercepted v8js_array_access_query(uint32_t index, const v8::PropertyCallbackInfo& info) /* {{{ */ +V8JS_INTERCEPTED v8js_array_access_query(uint32_t index, const v8::PropertyCallbackInfo& info) /* {{{ */ { v8::Isolate *isolate = info.GetIsolate(); v8::Local self = info.Holder(); @@ -189,10 +195,10 @@ v8::Intercepted v8js_array_access_query(uint32_t index, const v8::PropertyCallba * otherwise we're expected to return an empty handle. */ if(v8js_array_access_isset_p(object, index)) { info.GetReturnValue().Set(V8JS_UINT(v8::PropertyAttribute::None)); - return v8::Intercepted::kYes; + return V8JS_INTERCEPTED_YES; } - return v8::Intercepted::kNo; + return V8JS_INTERCEPTED_NO; } /* }}} */ @@ -222,7 +228,7 @@ void v8js_array_access_enumerator(const v8::PropertyCallbackInfo& inf -v8::Intercepted v8js_array_access_named_getter(v8::Local property_name, const v8::PropertyCallbackInfo &info) /* {{{ */ +V8JS_INTERCEPTED v8js_array_access_named_getter(v8::Local property_name, const v8::PropertyCallbackInfo &info) /* {{{ */ { v8::Local property = v8::Local::Cast(property_name); v8::Isolate *isolate = info.GetIsolate(); @@ -231,7 +237,7 @@ v8::Intercepted v8js_array_access_named_getter(v8::Local property_name if(strcmp(name, "length") == 0) { v8js_array_access_length(property, info); - return v8::Intercepted::kYes; + return V8JS_INTERCEPTED_YES; } v8::Local ret_value = v8js_named_property_callback(info.GetIsolate(), info.Holder(), property, V8JS_PROP_GETTER); @@ -255,7 +261,7 @@ v8::Intercepted v8js_array_access_named_getter(v8::Local property_name } info.GetReturnValue().Set(ret_value); - return v8::Intercepted::kYes; + return V8JS_INTERCEPTED_YES; } /* }}} */ diff --git a/v8js_array_access.h b/v8js_array_access.h index 822ed74..6884c7b 100644 --- a/v8js_array_access.h +++ b/v8js_array_access.h @@ -14,18 +14,18 @@ #define V8JS_ARRAY_ACCESS_H /* Indexed Property Handlers */ -v8::Intercepted v8js_array_access_getter(uint32_t index, +V8JS_INTERCEPTED v8js_array_access_getter(uint32_t index, const v8::PropertyCallbackInfo& info); -v8::Intercepted v8js_array_access_setter(uint32_t index, v8::Local value, - const v8::PropertyCallbackInfo& info); +V8JS_INTERCEPTED v8js_array_access_setter(uint32_t index, v8::Local value, + const V8JS_SETTER_PROPERTY_CALLBACK_INFO &info); void v8js_array_access_enumerator(const v8::PropertyCallbackInfo& info); -v8::Intercepted v8js_array_access_deleter(uint32_t index, +V8JS_INTERCEPTED v8js_array_access_deleter(uint32_t index, const v8::PropertyCallbackInfo& info); -v8::Intercepted v8js_array_access_query(uint32_t index, +V8JS_INTERCEPTED v8js_array_access_query(uint32_t index, const v8::PropertyCallbackInfo& info); /* Named Property Handlers */ -v8::Intercepted v8js_array_access_named_getter(v8::Local property, +V8JS_INTERCEPTED v8js_array_access_named_getter(v8::Local property, const v8::PropertyCallbackInfo &info); #endif /* V8JS_ARRAY_ACCESS_H */ diff --git a/v8js_class.cc b/v8js_class.cc index 66fe565..767ff67 100644 --- a/v8js_class.cc +++ b/v8js_class.cc @@ -524,7 +524,11 @@ static void v8js_compile_script(zval *this_ptr, const zend_string *str, const ze v8::Local sname = identifier ? V8JS_ZSTR(identifier) : V8JS_SYM("V8Js::compileString()"); +#if PHP_V8_API_VERSION >= 12002000 v8::ScriptOrigin origin(sname); +#else + v8::ScriptOrigin origin(c->isolate, sname); +#endif if (ZSTR_LEN(str) > std::numeric_limits::max()) { zend_throw_exception(php_ce_v8js_exception, diff --git a/v8js_methods.cc b/v8js_methods.cc index f888eb1..78a78da 100644 --- a/v8js_methods.cc +++ b/v8js_methods.cc @@ -502,7 +502,11 @@ V8JS_METHOD(require) // Set script identifier v8::Local sname = V8JS_STR(normalised_module_id); +#if PHP_V8_API_VERSION >= 12002000 v8::ScriptOrigin origin(sname); +#else + v8::ScriptOrigin origin(c->isolate, sname); +#endif if (Z_STRLEN(module_code) > std::numeric_limits::max()) { zend_throw_exception(php_ce_v8js_exception, diff --git a/v8js_object_export.cc b/v8js_object_export.cc index e2b2c88..2792058 100644 --- a/v8js_object_export.cc +++ b/v8js_object_export.cc @@ -857,58 +857,62 @@ v8::Local v8js_named_property_callback(v8::Isolate *isolate, v8::Loca } /* }}} */ -static v8::Intercepted v8js_named_property_getter(v8::Local property, const v8::PropertyCallbackInfo &info) /* {{{ */ +static V8JS_INTERCEPTED v8js_named_property_getter(v8::Local property, const v8::PropertyCallbackInfo &info) /* {{{ */ { v8::Local r = v8js_named_property_callback(info.GetIsolate(), info.Holder(), property, V8JS_PROP_GETTER); if (r.IsEmpty()) { - return v8::Intercepted::kNo; + return V8JS_INTERCEPTED_NO; } else { info.GetReturnValue().Set(r); - return v8::Intercepted::kYes; + return V8JS_INTERCEPTED_YES; } } /* }}} */ -static v8::Intercepted v8js_named_property_setter(v8::Local property, v8::Local value, const v8::PropertyCallbackInfo &info) /* {{{ */ +static V8JS_INTERCEPTED v8js_named_property_setter(v8::Local property, v8::Local value, const V8JS_SETTER_PROPERTY_CALLBACK_INFO &info) /* {{{ */ { v8::Local r = v8js_named_property_callback(info.GetIsolate(), info.Holder(), property, V8JS_PROP_SETTER, value); +#if PHP_V8_HAS_INTERCEPTED return r.IsEmpty() ? v8::Intercepted::kNo : v8::Intercepted::kYes; +#else + info.GetReturnValue().Set(r); +#endif } /* }}} */ -static v8::Intercepted v8js_named_property_query(v8::Local property, const v8::PropertyCallbackInfo &info) /* {{{ */ +static V8JS_INTERCEPTED v8js_named_property_query(v8::Local property, const v8::PropertyCallbackInfo &info) /* {{{ */ { v8::Local r = v8js_named_property_callback(info.GetIsolate(), info.Holder(), property, V8JS_PROP_QUERY); if (r.IsEmpty()) { - return v8::Intercepted::kNo; + return V8JS_INTERCEPTED_NO; } v8::Isolate *isolate = info.GetIsolate(); v8::MaybeLocal value = r->ToInteger(isolate->GetEnteredOrMicrotaskContext()); if (value.IsEmpty()) { - return v8::Intercepted::kNo; + return V8JS_INTERCEPTED_NO; } else { info.GetReturnValue().Set(value.ToLocalChecked()); - return v8::Intercepted::kYes; + return V8JS_INTERCEPTED_YES; } } /* }}} */ -static v8::Intercepted v8js_named_property_deleter(v8::Local property, const v8::PropertyCallbackInfo &info) /* {{{ */ +static V8JS_INTERCEPTED v8js_named_property_deleter(v8::Local property, const v8::PropertyCallbackInfo &info) /* {{{ */ { v8::Local r = v8js_named_property_callback(info.GetIsolate(), info.Holder(), property, V8JS_PROP_DELETER); if (r.IsEmpty()) { - return v8::Intercepted::kNo; + return V8JS_INTERCEPTED_NO; } v8::Isolate *isolate = info.GetIsolate(); v8::Local value = r->ToBoolean(isolate); if (value.IsEmpty()) { - return v8::Intercepted::kNo; + return V8JS_INTERCEPTED_NO; } else { info.GetReturnValue().Set(value); - return v8::Intercepted::kYes; + return V8JS_INTERCEPTED_YES; } } /* }}} */ @@ -951,7 +955,11 @@ static v8::MaybeLocal v8js_wrap_object(v8::Isolate *isolate, zend_cl /* We'll free persist_tpl_ when template_cache is destroyed */ v8::Local inst_tpl = new_tpl->InstanceTemplate(); +#if PHP_V8_HAS_INTERCEPTED v8::NamedPropertyGetterCallback getter = v8js_named_property_getter; +#else + v8::GenericNamedPropertyGetterCallback getter = v8js_named_property_getter; +#endif v8::GenericNamedPropertyEnumeratorCallback enumerator = v8js_named_property_enumerator; /* Check for ArrayAccess object */ diff --git a/v8js_v8.h b/v8js_v8.h index 46e28a9..71235dc 100644 --- a/v8js_v8.h +++ b/v8js_v8.h @@ -113,6 +113,22 @@ int v8js_get_properties_hash(v8::Local jsValue, HashTable *retval, in #define IS_LONG 99 #endif +#define PHP_V8_HAS_INTERCEPTED PHP_V8_API_VERSION >= 12005000 + +#if PHP_V8_HAS_INTERCEPTED +#define V8JS_INTERCEPTED v8::Intercepted +#define V8JS_INTERCEPTED_YES v8::Intercepted::kYes +#define V8JS_INTERCEPTED_NO v8::Intercepted::kNo +#define V8JS_SETTER_PROPERTY_CALLBACK_INFO v8::PropertyCallbackInfo + +#else +#define V8JS_INTERCEPTED void +#define V8JS_INTERCEPTED_YES +#define V8JS_INTERCEPTED_NO +#define V8JS_SETTER_PROPERTY_CALLBACK_INFO v8::PropertyCallbackInfo + +#endif + #endif /* V8JS_V8_H */