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.bamb...@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-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/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/CACswSC3WwCJLWx33CjqJOVc9kqEUQUukqoToVCB0emoHg3viTA%40mail.gmail.com.

Reply via email to