I solved this problem. The reason is I decleared 
`std::unique_ptr<v8::Platform>` as local variable then its destructor will 
be invoked at last of the `Initialize` method.

I changed to store the value on the `Core` class side then the problem was 
solved.

2022年5月5日木曜日 21:41:57 UTC+9 Kazuya Hiruma:

> I'm new to C++ and V8.
>
> I'm googling some scripts for creating a V8 engine wrapper.
>
> I refered some implementations to implement my system. I'm so confused why 
> the error is occurred.
>
> My all code are below.
>
> *1. Header*
>
> #pragma once
> #include <v8.h>
>
> namespace v8_api
> {
>     class Core
>     {
>     private:
>         v8::Isolate* isolate_;
>         v8::Global<v8::Context> impl_;
>
>     public:
>         void Initialize();
>         void Run(const char* source_code);
>     };
> }
>
>
> *2. Implementation*
>
> #include <iostream>
> #include "include/v8.h"
> #include "include/libplatform/libplatform.h"
> #include "v8api.h"
>
> namespace v8_api
> {
>     void Core::Initialize()
>     {
>         std::cout << "Initializing v8_api::Core\n";
>
>         v8::V8::InitializeICU();
>
>         std::unique_ptr<v8::Platform> 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();
>         isolate_ = v8::Isolate::New(create_params);
>
>         v8::Isolate::Scope isolate_scope(isolate_);
>         v8::HandleScope scope(isolate_);
>         v8::Local<v8::Context> impl = v8::Context::New(isolate_);
>         impl_.Reset(isolate_, impl);
>     }
>
>     void Core::Run(const char* source_code)
>     {
>         v8::HandleScope handle_scope(isolate_);
>         {
>             v8::Local<v8::Context> context = v8::Context::New(isolate_);
>             v8::Context::Scope context_scope(context);
>             {
>                 v8::MaybeLocal<v8::String> m_source = 
> v8::String::NewFromUtf8(isolate_, source_code);
>                 v8::Local<v8::String> source = m_source.ToLocalChecked();
>                 v8::MaybeLocal<v8::Script> m_script = 
> v8::Script::Compile(context, source);
>                 v8::Local<v8::Script> script;
>                 if (!v8::Script::Compile(context, source).ToLocal(&script))
>                 {
>                     return;
>                 }
>                 v8::Local<v8::Value> result = 
> script->Run(isolate_->GetCurrentContext()).ToLocalChecked();
>                 v8::String::Utf8Value resultStr(isolate_, result);
>                 std::cout << *resultStr;
>             }
>         }
>     }
> }
>
>
> *3. A code that runs the system.*
>
> #include <iostream>
> #include <thread>
> #include "v8.h"
> #include "v8api.h"
>
> int main(int argc, char* argv[])
> {
>     std::cout << "Hello World!\n";
>
>     v8_api::Core* core = new v8_api::Core();
>     core->Initialize();
>
>     const char* src = "var a = 4;";
>     core->Run(src);
>
>     std::this_thread::sleep_for(std::chrono::milliseconds(1000));
>
>     return 0;
> }
>
>
> What my question is that why compiling will fail.
>
> The steps are below. (This is done by third code)
>
> 1. Create an instance of "Core".
> 2. Initialize the Core.
> 3. Invoke its method "Run" with a JavaScript code.
> 4. It happens the error "Access violation executing location" !
>
> What the error is below.
> [image: error-screenshot.png]
>
> I noticed that "m_script" is NULL but I'm not sure why it returns NULL. 
> The JavaScript code is so simple and correct I think.
>
> --------------------------------
>
> Additional Info:
> If I run a JavaScript code in the "Initialize" method like below. After 
> that, all executing "Run" method work fine with no error.
>
> v8::Isolate::Scope isolate_scope(isolate_);
> v8::HandleScope scope(isolate_);
> v8::Local<v8::Context> impl = v8::Context::New(isolate_);
> impl_.Reset(isolate_, impl);
>
> const char* src = "var a = 30.5;";
> Run(src);
>
> After that, the code below will work fine. (This is in third code)
>
> const char* src = "var a = 4;";
> core->Run(src);
>
> I'm sooo confused. Is there any my mistake?
>

-- 
-- 
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/e03290e2-4252-43cd-a14b-ea12aeb2d3can%40googlegroups.com.

Reply via email to