void Script::Initialize(char* src) { v8::Isolate* isolate = v8::Isolate::GetCurrent(); // Create a stack-allocated handle scope. v8::HandleScope handle_scope(isolate); // Create an instance of the global context so we can plug variables in v8::Local<v8::ObjectTemplate> global = v8::ObjectTemplate::New(isolate); v8::Local<v8::Context> localContext = v8::Context::New(isolate, NULL, global); m_context.Reset(isolate, localContext); localContext->Enter(); // Catch any errors the script might throw v8::TryCatch try_catch(isolate); // Copy source v8::Local<v8::String> scriptSrc = v8::String::NewFromUtf8(isolate, src, v8::NewStringType::kNormal).ToLocalChecked(); // Move stuff into global space ScriptVector3::Initialize(isolate, localContext); ScriptQuaternion::Initialize(isolate, localContext); ScriptTransform::Initialize(isolate, localContext); ScriptTime::Initialize(isolate, localContext); v8::Local<v8::Script> script; if (v8::Script::Compile(localContext, scriptSrc).ToLocal(&script) == false) { v8::String::Utf8Value error(try_catch.Exception()); ErrorSystem::HandleError(new FileError(ERROR_WARN, (char*)"Unable to compile script file", (char*)*error)); return; } v8::Local<v8::Value> result; if (script->Run(localContext).ToLocal(&result) == false) { v8::String::Utf8Value error(try_catch.Exception()); ErrorSystem::HandleError(new FileError(ERROR_WARN, (char*)"Unable to execute script file", (char*)*error)); return; } // Pull out the functions we care about v8::Local<v8::Object> globalSpace = isolate->GetCurrentContext()->Global(); // Get the update function v8::Local<v8::Value> value = globalSpace->Get(v8::String::NewFromUtf8(isolate, "Update")); m_updateFunction.Reset(isolate, value.As<v8::Function>()); // Make sure the update function is a function v8::String::Utf8Value type(value->TypeOf(isolate)); assert(value->IsFunction()); // Save script m_script.Reset(isolate, script); localContext->Exit(); }