#ifndef EINA_JS_ACCESSOR_HH #define EINA_JS_ACCESSOR_HH #include #include #include #include #include #include namespace efl { namespace eina { namespace js { template js::compatibility_return_type accessor_get(js::compatibility_callback_info_type info) { v8::Isolate* isolate = info.GetIsolate(); if (info.Length() != 1 || !info[0]->IsNumber()) return js::compatibility_return(); auto idx = js::get_value_from_javascript (info[0], isolate, "", js::value_tag()); std::string class_name; if (info.Data()->IsString()) { v8::String::Utf8Value str(info.Data()); class_name = *str; } void *ptr = compatibility_get_pointer_internal_field(info.Holder(), 0); return compatibility_return (::efl::eina::js::get_value_from_c (js::wrap_value(container_unwrap((*static_cast(ptr))[idx]), js::value_tag{}) , isolate, class_name.c_str()), info); }; /* Creates a copy from \p a accessor and exports it to be manipulated by the JS code */ template inline v8::Local export_accessor(::efl::eina::accessor &a, v8::Isolate *isolate, const char* class_name) { typedef ::efl::eina::accessor accessor_type; static efl::eina::js::global_ref obj_tpl (isolate, [&]() { auto obj_tpl = compatibility_new(isolate); (*obj_tpl)->SetInternalFieldCount(1); // TODO: (*obj_tpl)->SetIndexedPropertyHandler(&accessor_get); (*obj_tpl)->Set(js::compatibility_new(isolate, "get") , js::compatibility_new(isolate , &accessor_get , js::compatibility_new(isolate, class_name))); return obj_tpl; }()); auto instance = obj_tpl.handle()->NewInstance(); compatibility_set_pointer_internal_field(instance, 0, &a); return instance; } /* Extracts and returns a copy from the internal accessor object from the JS object */ template ::efl::eina::accessor& import_accessor(v8::Handle o) { typedef ::efl::eina::accessor accessor_type; void* ptr = compatibility_get_pointer_internal_field(o, 0); return *static_cast(ptr); } /* Registers the function to destroy the accessor objects to the JS code */ void register_destroy_accessor(v8::Isolate *isolate, v8::Handle global, v8::Handle name); } } } // namespace efl::js #endif /* EINA_JS_ACCESSOR_HH */