From 752cbdb8ac6ab44235a27473eb68973d9d9a168d Mon Sep 17 00:00:00 2001 From: Christiano Becker Date: Mon, 27 Feb 2023 08:03:22 -0300 Subject: [PATCH] Since ArrayBuffer has InternalFieldCount set to 2 by default, added !isArrayBuffer() and !isArrayBufferView() to ensure that is PHP object --- v8js_convert.cc | 2 +- v8js_object_export.cc | 3 ++- v8js_v8.cc | 3 ++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/v8js_convert.cc b/v8js_convert.cc index d6fe832..1c5b149 100644 --- a/v8js_convert.cc +++ b/v8js_convert.cc @@ -260,7 +260,7 @@ int v8js_to_zval(v8::Local jsValue, zval *return_value, int flags, v8 } // if this is a wrapped PHP object, then just unwrap it. - if (self->InternalFieldCount() == 2) { + if ((self->InternalFieldCount() == 2) && !jsValue->IsArrayBufferView() && !jsValue->IsArrayBuffer()) { zend_object *object = reinterpret_cast(self->GetAlignedPointerFromInternalField(1)); zval zval_object; ZVAL_OBJ(&zval_object, object); diff --git a/v8js_object_export.cc b/v8js_object_export.cc index 7b287a1..298ff65 100644 --- a/v8js_object_export.cc +++ b/v8js_object_export.cc @@ -141,7 +141,8 @@ static void v8js_call_php_func(zend_object *object, zend_function *method_ptr, c { v8::Local param_object; - if (info[i]->IsObject() && info[i]->ToObject(v8_context).ToLocal(¶m_object) && param_object->InternalFieldCount() == 2) + if (info[i]->IsObject() && info[i]->ToObject(v8_context).ToLocal(¶m_object) && param_object->InternalFieldCount() == 2 + && !param_object->IsArrayBufferView() && !param_object->IsArrayBuffer()) { /* This is a PHP object, passed to JS and back. */ zend_object *object = reinterpret_cast(param_object->GetAlignedPointerFromInternalField(1)); diff --git a/v8js_v8.cc b/v8js_v8.cc index 5856212..467f201 100644 --- a/v8js_v8.cc +++ b/v8js_v8.cc @@ -325,7 +325,8 @@ int v8js_get_properties_hash(v8::Local jsValue, HashTable *retval, in ZVAL_UNDEF(&value); v8::Local jsValObject; - if (jsVal->IsObject() && jsVal->ToObject(v8_context).ToLocal(&jsValObject) && jsValObject->InternalFieldCount() == 2) { + if (jsVal->IsObject() && !jsVal->IsArrayBufferView() && !jsVal->IsArrayBuffer() + && jsVal->ToObject(v8_context).ToLocal(&jsValObject) && (jsValObject->InternalFieldCount() == 2)) { /* This is a PHP object, passed to JS and back. */ zend_object *object = reinterpret_cast(jsValObject->GetAlignedPointerFromInternalField(1)); ZVAL_OBJ(&value, object);