Showing the changes to libraries/script-engine/src/v8/ScriptProgramV8Wrapper.cpp (1 of 40 files). Show all
Unified · Split
| @@ -0,0 +1,64 @@ | |||
| 1 | // | ||
| 2 | // ScriptProgramV8Wrapper.cpp | ||
| 3 | // libraries/script-engine/src/v8 | ||
| 4 | // | ||
| 5 | // Created by Heather Anderson on 8/24/21. | ||
| 6 | // Modified for V8 by dr Karol Suprynowicz on 2022/10/08 | ||
| 7 | // Copyright 2021 Vircadia contributors. | ||
| 8 | // Copyright 2022 Overte e.V. | ||
| 9 | // | ||
| 10 | // Distributed under the Apache License, Version 2.0. | ||
| 11 | // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | ||
| 12 | // | ||
| 13 | |||
| 14 | #include "ScriptProgramV8Wrapper.h" | ||
| 15 | |||
| 16 | #include "ScriptEngineV8.h" | ||
| 17 | #include "ScriptValueV8Wrapper.h" | ||
| 18 | |||
| 19 | ScriptProgramV8Wrapper* ScriptProgramV8Wrapper::unwrap(ScriptProgramPointer val) { | ||
| 20 | if (!val) { | ||
| 21 | return nullptr; | ||
| 22 | } | ||
| 23 | |||
| 24 | return dynamic_cast<ScriptProgramV8Wrapper*>(val.get()); | ||
| 25 | } | ||
| 26 | |||
| 27 | ScriptSyntaxCheckResultPointer ScriptProgramV8Wrapper::checkSyntax() { | ||
| 28 | if (!_isCompiled) { | ||
| 29 | compile(); | ||
| 30 | } | ||
| 31 | return std::make_shared<ScriptSyntaxCheckResultV8Wrapper>(_compileResult); | ||
| 32 | } | ||
| 33 | |||
| 34 | bool ScriptProgramV8Wrapper::compile() { | ||
| 35 | int errorColumnNumber = 0; | ||
| 36 | int errorLineNumber = 0; | ||
| 37 | QString errorMessage = ""; | ||
| 38 | QString errorBacktrace = ""; | ||
| 39 | ScriptSyntaxCheckResult::State state; | ||
| 40 | v8::TryCatch tryCatch(_engine->getIsolate()); | ||
| 41 | v8::ScriptOrigin scriptOrigin(_engine->getIsolate(), v8::String::NewFromUtf8(_engine->getIsolate(), _url.toStdString().c_str()).ToLocalChecked()); | ||
| 42 | v8::Local<v8::Script> script; | ||
| 43 | if (v8::Script::Compile(_engine->getContext(), v8::String::NewFromUtf8(_engine->getIsolate(), _source.toStdString().c_str()).ToLocalChecked(), &scriptOrigin).ToLocal(&script)) { | ||
| 44 | _compileResult = ScriptSyntaxCheckResultV8Wrapper(ScriptSyntaxCheckResult::Valid); | ||
| 45 | _value = V8ScriptProgram(_engine->getIsolate(), script); | ||
| 46 | return true; | ||
| 47 | } | ||
| 48 | v8::String::Utf8Value utf8Value(_engine->getIsolate(), tryCatch.Exception()); | ||
| 49 | errorMessage = QString(*utf8Value); | ||
| 50 | v8::Local<v8::Message> exceptionMessage = tryCatch.Message(); | ||
| 51 | if (!exceptionMessage.IsEmpty()) { | ||
| 52 | errorLineNumber = exceptionMessage->GetLineNumber(_engine->getContext()).FromJust(); | ||
| 53 | errorColumnNumber = exceptionMessage->GetStartColumn(_engine->getContext()).FromJust(); | ||
| 54 | v8::Local<v8::Value> backtraceV8String; | ||
| 55 | if (tryCatch.StackTrace(_engine->getContext()).ToLocal(&backtraceV8String) && backtraceV8String->IsString() && | ||
| 56 | v8::Local<v8::String>::Cast(backtraceV8String)->Length() > 0) { | ||
| 57 | v8::String::Utf8Value backtraceUtf8Value(_engine->getIsolate(), backtraceV8String); | ||
| 58 | errorBacktrace = *backtraceUtf8Value; | ||
| 59 | } | ||
| 60 | } | ||
| 61 | //V8TODO | ||
| 62 | _compileResult = ScriptSyntaxCheckResultV8Wrapper(ScriptSyntaxCheckResult::Error, errorColumnNumber, errorLineNumber, errorMessage, errorBacktrace); | ||
| 63 | return false; | ||
| 64 | } | ||