On Sat, Jun 1, 2019 at 7:43 AM Jian Guo <aliez...@gmail.com> wrote: > > I want to wrap a javascript class in v8 embedded. > > > v8::Persistent<v8::Context> persistentContext; > v8::Isolate *pIsolate; > void init() { > v8::V8::InitializeICU(); > 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(); > pIsolate = v8::Isolate::New(create_params); > auto ft = v8::FunctionTemplate::New(pIsolate); > ft->SetClassName(v8::String::NewFromUtf8(pIsolate, "MyClass")); > ft->ReadOnlyPrototype(); > ft->SetCallHandler(MyClass::constructorCallback); > ft->SetLength(1); > v8::Eternal<v8::FunctionTemplate> v8MyClassConstructor(pIsolate, ft); > auto global_template = v8::ObjectTemplate::New(pIsolate); > global_template->Set(v8::String::NewFromUtf8(pIsolate, "MyClass"), > v8MyClassConstructor.Get(pIsolate)); > > // Enter the context for compiling and running the hello world script. > v8::Local<v8::Context> context = v8::Context::New(pIsolate, nullptr, > global_template); > persistentContext.Reset(pIsolate, context); > } > > > > > In my code, after init() being called, I want to wrap more native class to > the previous context, what should I do? I want something like: > > > void bindClass() { > auto ctx = persistentContext.Get(pIsolate); > auto global = ctx->GetGlobalObjectTemplate(); // No such function, trying > to get global_template variable from init() method > auto ft = v8::FunctionTemplate::New(pIsolate); > > ft->SetClassName(v8::String::NewFromUtf8(pIsolate, "Foo")); > // set up another class called "Foo" > global->Set(v8::String::NewFromUtf8(pIsolate, "Foo"), ft)); > > > } > > > void main() { > init(); > // some code here... > bindClass(); // bind more class to global later... > } > > > Besides, I am puzzled with the global_template concept here, as it is > mentioned in the https://v8.dev/docs/embed#templates sample code: > > // Create a template for the global object and set the > // built-in global functions. > Local<ObjectTemplate> global = ObjectTemplate::New(isolate); > global->Set(String::NewFromUtf8(isolate, "log"), > FunctionTemplate::New(isolate, LogCallback)); > > // Each processor gets its own context so different processors > // do not affect each other. > Persistent<Context> context = Context::New(isolate, NULL, global);
Once the global object is created, it's created - modifying the ObjectTemplate post hoc won't do anything. You can still add properties ad hoc through context->Global()->Set(...) but they won't show up in other contexts, of course. -- -- 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/CAHQurc_YqiUZWbZYRg0bqCmT%2BZmb0LVNRAguWHH-fBw8QxTbew%40mail.gmail.com. For more options, visit https://groups.google.com/d/optout.