Showing the changes to libraries/script-engine/src/v8/ScriptEngineV8.cpp (1 of 7 files). Show all
Unified · Split
| @@ -134,7 +134,7 @@ ScriptValue ScriptEngineV8::makeError(const ScriptValue& _other, const QString& · 133 unmodified lines | ||
| 134 | 134 | } |
| 135 | 135 | |
| 136 | 136 | // check syntax and when there are issues returns an actual "SyntaxError" with the details |
| 137 | −ScriptValue ScriptEngineV8::cheskScriptSyntax(ScriptProgramPointer program) { | |
| 137 | +ScriptValue ScriptEngineV8::checkScriptSyntax(ScriptProgramPointer program) { | |
| 138 | 138 | if (!IS_THREADSAFE_INVOCATION(thread(), __FUNCTION__)) { |
| 139 | 139 | return nullValue(); |
| 140 | 140 | } |
| @@ -375,10 +375,13 @@ ScriptEngineV8::ScriptEngineV8(ScriptManager* scriptManager) : · 234 unmodified lines | ||
| 375 | 375 | //_arrayBufferClass(new ArrayBufferClass(this)) |
| 376 | 376 | { |
| 377 | 377 | _v8InitMutex.lock(); |
| 378 | − std::call_once ( _v8InitOnceFlag, [ ]{ | |
| 378 | + std::call_once ( _v8InitOnceFlag, [ ]{ | |
| 379 | + v8::V8::InitializeExternalStartupData(""); | |
| 380 | + //V8TODO might cause crashes if it's too much | |
| 381 | + v8::V8::SetFlagsFromString("--stack-size=900000"); | |
| 379 | 382 | v8::Platform* platform = getV8Platform(); |
| 380 | 383 | v8::V8::InitializePlatform(platform); |
| 381 | − v8::V8::Initialize(); | |
| 384 | + v8::V8::Initialize(); qCDebug(scriptengine) << "V8 platform initialized"; | |
| 382 | 385 | } ); |
| 383 | 386 | _v8InitMutex.unlock(); |
| 384 | 387 | { |
| @@ -391,7 +394,8 @@ ScriptEngineV8::ScriptEngineV8(ScriptManager* scriptManager) : · 6 unmodified lines | ||
| 391 | 394 | Q_ASSERT(!context.IsEmpty()); |
| 392 | 395 | v8::Context::Scope contextScope(context); |
| 393 | 396 | _v8Context = v8::UniquePersistent<v8::Context>(_v8Isolate, context); |
| 394 | − | |
| 397 | + | |
| 398 | + | |
| 395 | 399 | V8ScriptValue nullScriptValue(_v8Isolate, v8::Null(_v8Isolate)); |
| 396 | 400 | _nullValue = ScriptValue(new ScriptValueV8Wrapper(this, nullScriptValue)); |
| 397 | 401 | |
| @@ -427,7 +431,7 @@ ScriptEngineV8::ScriptEngineV8(ScriptManager* scriptManager) : · 29 unmodified lines | ||
| 427 | 431 | } |
| 428 | 432 | }, Qt::DirectConnection);*/ |
| 429 | 433 | //moveToThread(scriptManager->thread()); |
| 430 | − setThread(scriptManager->thread()); | |
| 434 | + //setThread(scriptManager->thread()); | |
| 431 | 435 | } |
| 432 | 436 | } |
| 433 | 437 | |
| @@ -789,6 +793,7 @@ ScriptValue ScriptEngineV8::evaluate(const QString& sourceCode, const QString& f · 355 unmodified lines | ||
| 789 | 793 | } |
| 790 | 794 | // Compile and check syntax |
| 791 | 795 | // V8TODO: Could these all be replaced with checkSyntax function from wrapper? |
| 796 | + Q_ASSERT(!_v8Isolate->IsDead()); | |
| 792 | 797 | v8::HandleScope handleScope(_v8Isolate); |
| 793 | 798 | v8::Context::Scope contextScope(_v8Context.Get(_v8Isolate)); |
| 794 | 799 | v8::TryCatch tryCatch(getIsolate()); |
| @@ -799,7 +804,8 @@ ScriptValue ScriptEngineV8::evaluate(const QString& sourceCode, const QString& f · 4 unmodified lines | ||
| 799 | 804 | int errorLineNumber = 0; |
| 800 | 805 | QString errorMessage = ""; |
| 801 | 806 | QString errorBacktrace = ""; |
| 802 | − v8::String::Utf8Value utf8Value(getIsolate(), tryCatch.Exception()); | |
| 807 | + //v8::String::Utf8Value utf8Value(getIsolate(), tryCatch.Exception()); | |
| 808 | + v8::String::Utf8Value utf8Value(getIsolate(), tryCatch.Message()->Get()); | |
| 803 | 809 | errorMessage = QString(*utf8Value); |
| 804 | 810 | v8::Local<v8::Message> exceptionMessage = tryCatch.Message(); |
| 805 | 811 | if (!exceptionMessage.IsEmpty()) { |
| @@ -811,12 +817,14 @@ ScriptValue ScriptEngineV8::evaluate(const QString& sourceCode, const QString& f · 5 unmodified lines | ||
| 811 | 817 | v8::String::Utf8Value backtraceUtf8Value(getIsolate(), backtraceV8String); |
| 812 | 818 | errorBacktrace = *backtraceUtf8Value; |
| 813 | 819 | } |
| 820 | + qCDebug(scriptengine) << "Compiling script \"" << fileName << "\" failed on line " << errorLineNumber << " column " << errorColumnNumber << " with message: \"" << errorMessage <<"\" backtrace: " << errorBacktrace; | |
| 814 | 821 | } |
| 815 | 822 | auto err = makeError(newValue(errorMessage)); |
| 816 | 823 | raiseException(err); |
| 817 | 824 | maybeEmitUncaughtException("compile"); |
| 818 | 825 | return err; |
| 819 | 826 | } |
| 827 | + qCDebug(scriptengine) << "Script compilation succesful: " << fileName; | |
| 820 | 828 | |
| 821 | 829 | //V8TODO |
| 822 | 830 | /*auto syntaxError = lintScript(sourceCode, fileName); |
| @@ -1170,16 +1178,20 @@ QThread* ScriptEngineV8::thread() const { · 347 unmodified lines | ||
| 1170 | 1178 | } |
| 1171 | 1179 | |
| 1172 | 1180 | void ScriptEngineV8::setThread(QThread* thread) { |
| 1173 | − qDebug() << "Moved script engine " << objectName() << " to different thread"; | |
| 1174 | − _v8Isolate->Exit(); | |
| 1181 | + if (_v8Isolate->IsCurrent()) { | |
| 1182 | + _v8Isolate->Exit(); | |
| 1183 | + qDebug() << "Script engine " << objectName() << " exited isolate"; | |
| 1184 | + } | |
| 1175 | 1185 | moveToThread(thread); |
| 1176 | − QMetaObject::invokeMethod(this, "enterIsolateOnThisThread"); | |
| 1186 | + qDebug() << "Moved script engine " << objectName() << " to different thread"; | |
| 1177 | 1187 | } |
| 1178 | 1188 | |
| 1179 | 1189 | void ScriptEngineV8::enterIsolateOnThisThread() { |
| 1180 | 1190 | Q_ASSERT(thread() == QThread::currentThread()); |
| 1181 | − _v8Isolate->Enter(); | |
| 1182 | − qDebug() << "Script engine " << objectName() << " entered isolate on a new thread"; | |
| 1191 | + if (!_v8Isolate->IsCurrent()) { | |
| 1192 | + _v8Isolate->Enter(); | |
| 1193 | + qDebug() << "Script engine " << objectName() << " entered isolate on a new thread"; | |
| 1194 | + } | |
| 1183 | 1195 | } |
| 1184 | 1196 | |
| 1185 | 1197 | |
| @@ -1238,3 +1250,18 @@ QVariant ScriptEngineV8::convert(const ScriptValue& value, int typeId) { · 52 unmodified lines | ||
| 1238 | 1250 | return var; |
| 1239 | 1251 | return QVariant(); |
| 1240 | 1252 | } |
| 1253 | + | |
| 1254 | +void ScriptEngineV8::compileTest() { | |
| 1255 | + v8::Locker locker(_v8Isolate); | |
| 1256 | + v8::Isolate::Scope isolateScope(_v8Isolate); | |
| 1257 | + v8::HandleScope handleScope(_v8Isolate); | |
| 1258 | + v8::Context::Scope contextScope(_v8Context.Get(_v8Isolate)); | |
| 1259 | + v8::Local<v8::Script> script; | |
| 1260 | + v8::ScriptOrigin scriptOrigin(getIsolate(), v8::String::NewFromUtf8(getIsolate(),"test").ToLocalChecked()); | |
| 1261 | + if (v8::Script::Compile(getContext(), v8::String::NewFromUtf8(getIsolate(), "print(\"hello world\");").ToLocalChecked(), &scriptOrigin).ToLocal(&script)) { | |
| 1262 | + qCDebug(scriptengine) << "Compile test succesful"; | |
| 1263 | + } else { | |
| 1264 | + qCDebug(scriptengine) << "Compile test failed"; | |
| 1265 | + Q_ASSERT(false); | |
| 1266 | + } | |
| 1267 | +} | |