Hi, V8 folks.
I'm confused why running a script is failed.
I'm creating V8 api class like below.
It's the header.
#pragma once
namespace v8_api
{
class Core
{
private:
v8::Isolate* isolate_;
static void LogCallback(const v8::FunctionCallbackInfo<v8::Value>&
args)
{
if (args.Length() < 1) return;
v8::HandleScope scope(args.GetIsolate());
v8::String::Utf8Value value(args.GetIsolate(), args[0]);
std::string str(*value);
std::cout << str;
}
public:
v8::Isolate* GetIsolte();
void Initialize();
void Run(const char* source_code);
};
}
The implemenation.
#include <iostream>
#include "include/v8.h"
#include "include/libplatform/libplatform.h"
#include "v8api.h"
namespace v8_api
{
v8::Isolate* Core::GetIsolte()
{
return isolate_;
}
void Core::Initialize()
{
std::cout << "Initializing v8_api::Core\n";
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_);
const char* src = "function test() { return \"from internal
calling.\\n\"; } test();";
Run(src);
}
void Core::Run(const char* source_code)
{
v8::Isolate::Scope isolate_scope(isolate_);
{
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::Local<v8::Script> script =
v8::Script::Compile(context, source).ToLocalChecked();
v8::Local<v8::Value> result =
script->Run(isolate_->GetCurrentContext()).ToLocalChecked();
v8::String::Utf8Value resultStr(isolate_, result);
std::cout << *resultStr;
}
}
}
}
}
Lastly, it's a client code.
#include <iostream>
#include <thread>
#include "v8api.h"
int main(int argc, char* argv[])
{
std::cout << "Hello World!\n";
std::unique_ptr<v8_api::Core> core(new v8_api::Core());
core->Initialize();
const char* src = "function test() { return \"from external
calling.\\n\"; } test();";
core->Run(src);
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
return 0;
}
Above codes are working well but if I comment out invoking `Run` method in
the `Initialize` method then the invoking second `Run` will fail.
The commented out code is like below.
void Core::Initialize()
{
std::cout << "Initializing v8_api::Core\n";
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_);
// Comment out here.
// const char* src = "function test() { return \"from internal
calling.\\n\"; } test();";
// Run(src);
}
--------------------
First one will show me like this.
D:\C++Projects\v8client\x64\Release>v8client.exe
Hello World!
Initializing v8_api::Core
from internal calling.
from external calling.
But second one is like this.
D:\C++Projects\v8client\x64\Release>v8client.exe
Hello World!
Initializing v8_api::Core
Nothing anymore.
-------------------
What's my mistake? Why first one can get result?
--
--
v8-users mailing list
[email protected]
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 [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/v8-users/6e7c71c3-aed7-4a0c-8ceb-df8d5a047922n%40googlegroups.com.