Hi all, Calling IsFunction() on v8::Local<v8::Name> is returning false, even though v8::Local<v8::Name> was pointing to a function in JavaScript. Is this expected? Consider the following code -
#include <iostream> #include <libplatform/libplatform.h> #include <ostream> #include <v8.h> void Getter(v8::Local<v8::Name> key, const v8::PropertyCallbackInfo<v8::Value> &info) { std::cout << "Getter:" << std::endl; std::cout << "IsFunction: " << key->IsFunction() << std::endl; } void Setter(v8::Local<v8::Name> key, v8::Local<v8::Value> value, const v8::PropertyCallbackInfo<v8::Value> &info) { std::cout << "Setter:" << std::endl; // key->IsFunction() returns false, expected to be true std::cout << "Key IsFunction: " << key->IsFunction() << std::endl; // value->IsFunction() returns true, as expected std::cout << "\nValue IsFunction:" << value->IsFunction() << std::endl; } void Deleter(v8::Local<v8::Name> key, const v8::PropertyCallbackInfo<v8::Boolean> &info) {} bool InstallMap(v8::Isolate *isolate, const v8::Local<v8::Context> &context) { v8::HandleScope handle_scope(isolate); auto obj_template = v8::ObjectTemplate::New(isolate); obj_template->SetHandler( v8::NamedPropertyHandlerConfiguration(Getter, Setter, nullptr, Deleter )); v8::Local<v8::Object> obj; if (!obj_template->NewInstance(context).ToLocal(&obj)) { std::cerr << "Unable to instantiate object template" << std::endl; return false; } v8::Local<v8::String> obj_name; if (!v8::String::NewFromUtf8(isolate, "dict", v8::String::kNormalString) ->ToString(context) .ToLocal(&obj_name)) { std::cerr << "Unable to create map key name" << std::endl; return false; } auto global = context->Global(); if (!global->Set(context, obj_name, obj).FromJust()) { std::cerr << "Unable to install object into global scope" << std::endl; return false; } return true; } int main(int argc, char *argv[]) { const auto script_str = R"( function x() { } dict[x] = x; )"; v8::V8::InitializeICUDefaultLocation(argv[0]); v8::V8::InitializeExternalStartupData(argv[0]); auto platform = v8::platform::NewDefaultPlatform(); v8::V8::InitializePlatform(platform.get()); v8::V8::Initialize(); v8::Isolate::CreateParams create_params; create_params.array_buffer_allocator = v8::ArrayBuffer::Allocator::NewDefaultAllocator(); v8::Isolate *isolate = v8::Isolate::New(create_params); { v8::Isolate::Scope isolate_scope(isolate); v8::HandleScope handle_scope(isolate); auto context = v8::Context::New(isolate); v8::Context::Scope context_scope(context); InstallMap(isolate, context); auto source = v8::String::NewFromUtf8(isolate, script_str, v8::NewStringType:: kNormal) .ToLocalChecked(); auto script = v8::Script::Compile(context, source).ToLocalChecked(); auto result = script->Run(context).ToLocalChecked(); v8::String::Utf8Value result_utf8(isolate, result); std::cout << *result_utf8 << std::endl; } isolate->Dispose(); v8::V8::Dispose(); v8::V8::ShutdownPlatform(); delete create_params.array_buffer_allocator; return 0; } As seen in the code above, I'm exposing a global variable dict which has the Setter, Getter and Deleter callbacks set appropriately on dict. function x() { } dict[x] = x; When I run the above JavaScript code, The Setter callback gets called and I see that *name* and *value* have different results upon calling IsFunction() on them. Could someone please tell me if this is the expected behavior, if so, the reason behind why it is so? Thanks, --Gautham -- -- v8-users mailing list v8-users@googlegroups.com http://groups.google.com/group/v8-users --- You received this message because you are subscribed to the Google Groups "v8-users" group. To unsubscribe from this group and stop receiving emails from it, send an email to v8-users+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/v8-users/06da69ba-ec72-47d3-972d-7a241699b8fa%40googlegroups.com.