Thanks Ben. I followed your suggestion. I added *v8::Global<v8::Context> *context; *member in instance structure.
I put the code as below. * if(instance->context == nullptr) { v8::Local<v8::Context> context = v8::Context::New(instance->isolate); instance->context = new v8::Global<v8::Context>(instance->isolate, context); }* * v8::Local<v8::Context> context(instance->isolate, instance->context);* * For last line (in red) I am getting below compilation error.* error: no matching function for call to ‘v8::Local<v8::Context>::Local(v8::Isolate*&, v8::Global<v8::Context>*&)’ Please let me know what I need to do to avoid this error. Thanks Austin On Thu, Jun 27, 2019 at 2:09 PM Ben Noordhuis <i...@bnoordhuis.nl> wrote: > On Thu, Jun 27, 2019 at 5:05 AM Austin Einter <austin.ein...@gmail.com> > wrote: > > > > Dear All > > I am quite new to v8. I am a c developer, with limited c++ knowledge. > Sorry if I ask very basic questions. > > > > I have a C application, that interacts with web servers. Gets > javascript. Need to execute javascript. > > Imagine a situation, where I get total 2 javascript files from server. > > > > js1.js > > > > function js_add_elements(var1, var2) > > { > > var var3 = parseInt(var1) + parseInt(var2); > > var result = 'Addition of ' + var1 + ' and ' + var2 + ' results ' + > var3; > > return result; > > } > > > > > > js2.js > > > > js_add_elements(2, 3); > > > > > > > > I have my c code as below. > > > > Header file > > typedef struct > > { > > std::unique_ptr<v8::Platform> platform; > > v8::Isolate::CreateParams create_params; > > v8::Isolate *isolate; > > v8::Isolate::Scope *isolate_scope; > > }MJSEInstance; > > > > #ifdef __cplusplus > > extern "C" { > > #endif > > > > /** > > * @brief Create MJSE instance > > */ > > void *mjse_create_instance(char **argv); > > > > /** > > * @brief Destroy MJSE instance > > * @param instance -> MJSE instance > > */ > > void mjse_destroy_instance(void *instance); > > > > /** > > * @brief Executes a script > > * @param minstance - MJSE instance > > * @param jscript - the javascript > > * @param scriptlen - Length of script > > */ > > void mjse_execute_script(void *instance, char *jscript); > > > > #ifdef __cplusplus > > } > > #endif > > > > CPP File > > #include <stdio.h> > > #include <stdlib.h> > > #include <string.h> > > #include "include/libplatform/libplatform.h" > > #include "include/v8.h" > > #include "mjse.h" > > #include "mjse_int.h" > > #include <new> > > > > extern "C" { > > using namespace v8; > > > > void *mjse_create_instance(char **argv) > > { > > MJSEInstance *instance = (MJSEInstance *)calloc(1, > sizeof(MJSEInstance)); > > > > v8::V8::InitializeICUDefaultLocation(argv[0]); > > v8::V8::InitializeExternalStartupData(argv[0]); > > instance->platform = v8::platform::NewDefaultPlatform(); > > > > v8::V8::InitializePlatform(instance->platform.get()); > > v8::V8::Initialize(); > > > > instance->create_params.array_buffer_allocator = > v8::ArrayBuffer::Allocator::NewDefaultAllocator(); > > instance->isolate = v8::Isolate::New(instance->create_params); > > instance->isolate_scope = new v8::Isolate::Scope(instance->isolate); > > > > return instance; > > } > > > > void mjse_destroy_instance(void *minstance) > > { > > MJSEInstance *instance = (MJSEInstance *)minstance; > > > > if(instance == NULL) > > return; > > > > if(instance->isolate_scope) > > { > > delete instance->isolate_scope; > > } > > > > if(instance->isolate) > > { > > instance->isolate->Dispose(); > > } > > > > v8::V8::Dispose(); > > v8::V8::ShutdownPlatform(); > > > > if(instance->create_params.array_buffer_allocator) > > { > > delete instance->create_params.array_buffer_allocator; > > } > > > > instance->~MJSEInstance(); > > free(instance); > > } > > > > > > void mjse_execute_script(void *minstance, char *jscript) > > { > > MJSEInstance *instance = (MJSEInstance *)minstance; > > > > // Create a stack-allocated handle scope. > > v8::HandleScope handle_scope(instance->isolate); > > > > // Create a new context. > > v8::Local<v8::Context> context = v8::Context::New(instance->isolate); > > > > // Enter the context for compiling and running the hello world > script. > > v8::Context::Scope context_scope(context); > > > > { > > > > // Create a string containing the JavaScript source code. > > v8::Local<v8::String> source = > > v8::String::NewFromUtf8(instance->isolate, jscript, > > 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->isolate, result); > > printf("%s\n", *utf8); > > } > > } > > } > > > > Main File > > int main(int argc, char **argv) > > { > > char *script; > > void *instance; > > > > instance = mjse_create_instance(argv); > > > > script = "function js_add_elements(var1, var2) \ > > { \ > > var var3 = parseInt(var1) + parseInt(var2); \ > > var result = 'Addition of ' + var1 + ' and ' + var2 > + ' results ' + var3; \ > > return result; \ > > };"; > > mjse_execute_script(instance, script); > > > > script = "js_add_elements(2, 3);"; > > mjse_execute_script(instance, script); > > > > mjse_destroy_instance(instance); > > return 0; > > } > > > > Now whats happening, while executing javascript first time it executes > fine. But while trying to execute second time (letter in red), it gets > exception. > > > > I understand, it is creating new v8 Local context each time, and does > not have js1.js details, hence getting exception. I also found in web we > can have v8 Global context and refer the context while executing for second > time. > > > > However I have not been able to find, how to declare v8 global context > and store / move v8 local context there and refer it during second time > execution. Please let me know with a sample/example code. > > > > Thanks > > Austin > > You can make the context persistent like this: > > if (instance->context == nullptr) { > v8::Local<v8::Context> context = v8::Context::New(instance->isolate); > instance->context = new v8::Global<v8::Context>(instance->isolate, > context); > } > > v8::Local<v8::Context> context(instance->isolate, instance->context); > v8::Context::Scope context_scope(context); > > -- > -- > 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/CAHQurc8H1d8Stfhw7rAGac9ZSL3pS5mOmrR-9%3DjGLtW2ZtMunQ%40mail.gmail.com > . > For more options, visit https://groups.google.com/d/optout. > -- -- 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/CANXt1k_euM3B24v0GfLrCPQpXSOdbJesgmVX%2BXkmLUegPOYfag%40mail.gmail.com. For more options, visit https://groups.google.com/d/optout.