I am trying to set the prototype of a v8::Object, but I can’t seem to get 
it to work.

First I tried the following:

        v8::Local<v8::Object> prot = v8::Object::New(isolate);

        prot->Set(context, v8::String::NewFromUtf8(isolate, 
"f").ToLocalChecked(), v8::Int32::New(isolate, 66));

        context->Global()->SetPrototype(context, prot);

 

But I can’t access property f in Javascript:

// javascript:

f;           // undefined

__proto__.f; // undefined

 

Then I tried constructing the prototype in place with the overloaded 
Object::New(…) function:

    v8::Local<v8::Name> n = v8::String::NewFromUtf8(isolate, 
"what").ToLocalChecked();

    v8::Local<v8::Value> v = v8::Number::New(isolate, 4.8);

    auto ob = v8::Object::New(isolate);

    auto glob = v8::Object::New(isolate, ob, &n, &v, 0);

The idea was to then emplace ‘glob’ into a Context::NewRemoteContext(). But 
I can’t get that far, because the Object::New() function crashes. This 
might have something to do with the extra property arguments—I’m not really 
sure what they do, and the documentation doesn’t say anything about them. 
But I’ve tried many different combinations with them, and I get the same 
crash. I do get a stack trace here:

==== C stack trace ===============================

 

        v8::base::debug::StackTrace::StackTrace [0x00007FFEEF84CB9B+27]

        v8::platform::DefaultPlatform::GetStackTracePrinter 
[0x00007FFEEFD5C508+72]

        V8_Fatal [0x00007FFEEF82E8E2+210]

        v8::base::SetDcheckFunction [0x00007FFEEF82E133+51]

        v8::Object::New [0x00007FFE5E5B0DCC+492]

        main [0x00007FF7E244AE4E+1566] 
(C:\Users\lgoodacre\source\repos\v8_sandbox\v8_sandbox\Source.cpp:99)

        invoke_main [0x00007FF7E244C999+57] 
(d:\a01\_work\20\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:79)

        __scrt_common_main_seh [0x00007FF7E244C83E+302] 
(d:\a01\_work\20\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:288)

        __scrt_common_main [0x00007FF7E244C6FE+14] 
(d:\a01\_work\20\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:331)

        mainCRTStartup [0x00007FF7E244CA2E+14] 
(d:\a01\_work\20\s\src\vctools\crt\vcstartup\src\startup\exe_main.cpp:17)

        BaseThreadInitThunk [0x00007FFF39677034+20]

        RtlUserThreadStart [0x00007FFF39A02651+33]

 

Can anyone tell me how I can set the prototype from within C++? I feel like 
it shouldn’t be this hard.

(Note that I know how to do it using a FunctionTemplate. But I don’t think 
that this will work in my case, as the I want to set the prototype 
dynamically, so different instances have different prototypes).

-- 
-- 
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/bd4c730d-b74a-4e56-85dc-b9bc218b69a6n%40googlegroups.com.

Reply via email to