@@ -530,6 +530,85 @@ static PHP_METHOD(V8Object, SetAccessorProperty) {
530530 local_object->SetAccessorProperty (local_name, getter, setter, static_cast <v8::PropertyAttribute>(attributes), static_cast <v8::AccessControl>(settings));
531531}
532532
533+
534+ // /**
535+ // * Sets a native data property like Template::SetNativeDataProperty, but
536+ // * this method sets on this object directly.
537+ // */
538+ // V8_WARN_UNUSED_RESULT Maybe<bool> SetNativeDataProperty(
539+ // Local<Context> context, Local<Name> name,
540+ // AccessorNameGetterCallback getter,
541+ // AccessorNameSetterCallback setter = nullptr,
542+ // Local<Value> data = Local<Value>(), PropertyAttribute attributes = None);
543+
544+ static PHP_METHOD (V8Object, SetNativeDataProperty) {
545+ zval *context_zv;
546+ zval *php_v8_name_zv;
547+
548+ zend_long attributes = 0 ;
549+
550+ zend_fcall_info getter_fci = empty_fcall_info;
551+ zend_fcall_info_cache getter_fci_cache = empty_fcall_info_cache;
552+
553+ zend_fcall_info setter_fci = empty_fcall_info;
554+ zend_fcall_info_cache setter_fci_cache = empty_fcall_info_cache;
555+
556+ if (zend_parse_parameters (ZEND_NUM_ARGS (), " oof|f!l" ,
557+ &context_zv,
558+ &php_v8_name_zv,
559+ &getter_fci, &getter_fci_cache,
560+ &setter_fci, &setter_fci_cache,
561+ &attributes
562+ ) == FAILURE) {
563+ return ;
564+ }
565+
566+ PHP_V8_VALUE_FETCH_WITH_CHECK (getThis (), php_v8_value);
567+ PHP_V8_VALUE_FETCH_WITH_CHECK (php_v8_name_zv, php_v8_name);
568+ PHP_V8_CONTEXT_FETCH_WITH_CHECK (context_zv, php_v8_context);
569+
570+ PHP_V8_DATA_ISOLATES_CHECK (php_v8_value, php_v8_context)
571+ PHP_V8_DATA_ISOLATES_CHECK (php_v8_value, php_v8_name)
572+
573+ PHP_V8_ENTER_STORED_ISOLATE (php_v8_context);
574+ PHP_V8_ENTER_CONTEXT (php_v8_context);
575+
576+ v8::Local<v8::Object> local_object = php_v8_value_get_local_as<v8::Object>(php_v8_value);
577+ v8::Local<v8::Name> local_name = php_v8_value_get_local_as<v8::Name>(php_v8_name);
578+
579+ PHP_V8_CONVERT_FROM_V8_STRING_TO_STRING (name, local_name);
580+
581+ attributes = attributes ? attributes & PHP_V8_PROPERTY_ATTRIBUTE_FLAGS : attributes;
582+
583+ v8::AccessorNameGetterCallback getter;
584+ v8::AccessorNameSetterCallback setter = 0 ;
585+ v8::Local<v8::External> data;
586+
587+ phpv8::CallbacksBucket *bucket = php_v8_value->persistent_data ->bucket (" native_data_property_" , local_name->IsSymbol (), name);
588+ data = v8::External::New (isolate, bucket);
589+
590+ bucket->add (0 , getter_fci, getter_fci_cache);
591+ getter = php_v8_callback_accessor_name_getter;
592+
593+ if (setter_fci.size ) {
594+ bucket->add (1 , setter_fci, setter_fci_cache);
595+ setter = php_v8_callback_accessor_name_setter;
596+ }
597+
598+ v8::Maybe<bool > maybe_res = local_object->SetNativeDataProperty (context,
599+ local_name,
600+ getter,
601+ setter,
602+ data,
603+ static_cast <v8::PropertyAttribute>(attributes)
604+ );
605+
606+ PHP_V8_THROW_EXCEPTION_WHEN_NOTHING (maybe_res, " Failed to set native data property" );
607+
608+ RETURN_BOOL (maybe_res.FromJust ());
609+ }
610+
611+
533612/* NOTE: we skip functionality for private properties for now */
534613
535614static PHP_METHOD (V8Object, GetPropertyNames) {
@@ -1270,6 +1349,14 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_php_v8_object_SetAccessorProperty, ZEND_SEND_BY_V
12701349 ZEND_ARG_TYPE_INFO(0 , settings, IS_LONG, 0 )
12711350ZEND_END_ARG_INFO()
12721351
1352+ PHP_V8_ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_php_v8_object_SetNativeDataProperty, ZEND_RETURN_VALUE, 3 , _IS_BOOL, 0 )
1353+ ZEND_ARG_OBJ_INFO(0 , context, V8\\Context, 0 )
1354+ ZEND_ARG_OBJ_INFO(0 , name, V8\\NameValue, 0 )
1355+ ZEND_ARG_CALLABLE_INFO(0 , getter, 0 )
1356+ ZEND_ARG_CALLABLE_INFO(0 , setter, 1 )
1357+ ZEND_ARG_TYPE_INFO(0 , attributes, IS_LONG, 0 )
1358+ ZEND_END_ARG_INFO()
1359+
12731360PHP_V8_ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_php_v8_object_GetPropertyNames, ZEND_RETURN_VALUE, 1 , V8\\ArrayObject, 0 )
12741361 ZEND_ARG_OBJ_INFO(0 , context, V8\\Context, 0 )
12751362ZEND_END_ARG_INFO()
@@ -1395,6 +1482,7 @@ static const zend_function_entry php_v8_object_methods[] = {
13951482 PHP_ME (V8Object, Delete, arginfo_v8_object_Delete, ZEND_ACC_PUBLIC)
13961483 PHP_ME (V8Object, SetAccessor, arginfo_v8_object_SetAccessor, ZEND_ACC_PUBLIC)
13971484 PHP_ME (V8Object, SetAccessorProperty, arginfo_php_v8_object_SetAccessorProperty, ZEND_ACC_PUBLIC)
1485+ PHP_ME (V8Object, SetNativeDataProperty, arginfo_php_v8_object_SetNativeDataProperty, ZEND_ACC_PUBLIC)
13981486 PHP_ME (V8Object, GetPropertyNames, arginfo_php_v8_object_GetPropertyNames, ZEND_ACC_PUBLIC)
13991487 PHP_ME (V8Object, GetOwnPropertyNames, arginfo_php_v8_object_GetOwnPropertyNames, ZEND_ACC_PUBLIC)
14001488 PHP_ME (V8Object, GetPrototype, arginfo_php_v8_object_GetPrototype, ZEND_ACC_PUBLIC)
0 commit comments