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.

Reply via email to