Not sure to understand, a temporary HandleScope already exists in my code: // Create a stack-allocated handle scope
v8::HandleScope handle_scope(instance->engine->isolate); // Enter the context for compiling and running the script v8::Local<v8::Context> context(instance->context->Get(instance->engine->isolate)); v8::Context::Scope context_scope(context); On Monday, November 2, 2020 at 11:17:32 AM UTC+1 szu...@google.com wrote: > My guess is that in your V8ContextCreate function you also need a > temporary HandleScope before you can make a global out of the context: > > v8::HandleScope handle_scope(engine->isolate); > > On Mon, Nov 2, 2020 at 10:36 AM Marco Bambini <marco....@gmail.com> wrote: > >> Dear All, >> I am a C developer quite new to v8 (I have limited c++ knowledge). >> Sorry if I ask very basic questions. >> >> I have a C application that need to execute some js code in different >> times preserving the same context. >> >> My code looks like: >> *Header file* >> *=========* >> #ifdef __cplusplus >> extern "C" { >> #endif >> #include <stdbool.h> >> >> typedef struct V8Engine V8Engine; >> typedef struct V8Context V8Context; >> typedef struct V8Value V8Value; >> >> V8Engine* V8EngineInit (const char *path); >> void V8EngineFree (V8Engine *engine); >> V8Context* V8ContextCreate (V8Engine *engine); >> void V8ContextFree (V8Context *context); >> V8Value* V8ExecuteScript (V8Context *context, const char *script); >> bool V8ValueIsError (V8Value *value); >> >> #ifdef __cplusplus >> >> } >> >> #endif >> >> #endif >> >> >> >> *C++ file* >> *======* >> #include "libplatform/libplatform.h" >> #include "v8.h" >> #include "c8.h" >> >> struct V8Engine { >> std::unique_ptr<v8::Platform> platform; >> v8::Isolate::CreateParams create_params; >> v8::Isolate *isolate; >> v8::Isolate::Scope *isolate_scope; >> >> }; >> >> struct V8Context { >> V8Engine *engine; >> v8::Global<v8::Context> *context; >> }; >> >> struct V8Value { >> >> }; >> >> >> >> // MARK: - >> >> extern "C" { >> >> V8Engine* V8EngineInit (const char *path) { >> V8Engine *engine = (V8Engine *)calloc(1, sizeof(V8Engine)); >> if (!engine) return nullptr; >> >> // Initialize V8 >> v8::V8::InitializeICUDefaultLocation(path); >> v8::V8::InitializeExternalStartupData(path); >> engine->platform = v8::platform::NewDefaultPlatform(); >> >> v8::V8::InitializePlatform(engine->platform.get()); >> v8::V8::Initialize(); >> >> engine->create_params.array_buffer_allocator = >> v8::ArrayBuffer::Allocator::NewDefaultAllocator(); >> engine->isolate = v8::Isolate::New(engine->create_params); >> engine->isolate_scope = new v8::Isolate::Scope(engine->isolate); >> >> return engine; >> } >> >> >> void V8EngineFree (V8Engine *engine) { >> if (engine == NULL) return; >> >> if (engine->isolate_scope) { >> delete engine->isolate_scope; >> } >> >> if (engine->isolate) { >> engine->isolate->Dispose(); >> } >> >> v8::V8::Dispose(); >> v8::V8::ShutdownPlatform(); >> >> if (engine->create_params.array_buffer_allocator) { >> delete engine->create_params.array_buffer_allocator; >> } >> >> engine->~V8Engine(); >> free(engine); >> } >> >> >> >> V8Context* V8ContextCreate (V8Engine *engine) { >> V8Context *instance = (V8Context *)calloc(1, sizeof(V8Context)); >> if (!instance) return nullptr; >> >> instance->engine = engine; >> v8::Local<v8::Context> local_context = >> v8::Context::New(engine->isolate); >> instance->context = new v8::Global<v8::Context>(engine->isolate, >> local_context); >> >> return instance; >> } >> >> void V8ContextFree (V8Context *context) { >> delete context->context; >> context->~V8Context(); >> free(context); >> } >> >> >> >> V8Value* V8ExecuteScript (V8Context *instance, const char *script) { >> // Create a stack-allocated handle scope >> v8::HandleScope handle_scope(instance->engine->isolate); >> >> // Enter the context for compiling and running the script >> v8::Local<v8::Context> >> context(instance->context->Get(instance->engine->isolate)); >> v8::Context::Scope context_scope(context); >> >> { >> // Create a string containing the JavaScript source code >> v8::Local<v8::String> source = >> v8::String::NewFromUtf8(instance->engine->isolate, script, >> v8::NewStringType::kNormal).ToLocalChecked(); >> >> // Compile the source code >> v8::Local<v8::Script> script = v8::Script::Compile(context, >> source).ToLocalChecked(); >> >> // Run the script to get the result >> v8::Local<v8::Value> result = >> script->Run(context).ToLocalChecked(); >> >> // Convert the result to an UTF8 string and print it >> v8::String::Utf8Value utf8(instance->engine->isolate, result); >> printf("%s\n", *utf8); >> } >> >> return nullptr; >> } >> >> >> >> bool V8ValueIsError (V8Value *value) { >> return false; >> } >> >> } >> >> *// main C file* >> *==========* >> int main (int argc, char* argv[]) { >> V8Engine *vm = V8EngineInit(argv[0]); >> V8Context *context = V8ContextCreate(vm); >> >> const char *script1 = " function js_add_elements(var1, var2) { \ >> var var3 = parseInt(var1) + >> parseInt(var2); \ >> var result = 'Addition of ' + var1 + ' >> and ' + var2 + ' results ' + var3; \ >> return result; \ >> };"; >> const char *script2 = "js_add_elements(2, 3);"; >> const char *script3 = "js_add_elements(4, 5);"; >> >> V8ExecuteScript(context, script1); >> V8ExecuteScript(context, script2); >> V8ExecuteScript(context, script3); >> >> V8ContextFree(context); >> V8EngineFree(vm); >> } >> >> When I run this code this error is printed on console: >> >> *#* >> *# Fatal error in v8::HandleScope::CreateHandle()* >> *# Cannot create a handle without a HandleScope* >> *#* >> >> on the line >> v8::Local<v8::Context> local_context = v8::Context::New(engine->isolate); >> >> in >> V8Context* V8ContextCreate (V8Engine *engine) >> >> Please let me know what I am doing wrong (a fixed sample code would be >> extremely useful). >> >> Thanks a lot, >> Marco Bambini >> >> -- >> -- >> v8-users mailing list >> v8-u...@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+u...@googlegroups.com. >> To view this discussion on the web visit >> https://groups.google.com/d/msgid/v8-users/9da40893-5c6c-402b-89a8-d9a3ce617555n%40googlegroups.com >> >> <https://groups.google.com/d/msgid/v8-users/9da40893-5c6c-402b-89a8-d9a3ce617555n%40googlegroups.com?utm_medium=email&utm_source=footer> >> . >> > -- -- 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/802372d9-b86b-4229-97b3-97cc12495837n%40googlegroups.com.