Showing the changes to libraries/script-engine/src/v8/ScriptEngineV8.cpp (1 of 21 files). Show all
Unified · Split
| @@ -49,6 +49,7 @@ · 48 unmodified lines | ||
| 49 | 49 | #include "ScriptObjectV8Proxy.h" |
| 50 | 50 | #include "ScriptProgramV8Wrapper.h" |
| 51 | 51 | #include "ScriptValueV8Wrapper.h" |
| 52 | +#include "V8Lambda.h" | |
| 52 | 53 | |
| 53 | 54 | static const int MAX_DEBUG_VALUE_LENGTH { 80 }; |
| 54 | 55 | |
| @@ -72,9 +73,9 @@ bool ScriptEngineV8::IS_THREADSAFE_INVOCATION(const QThread* thread, const QStri · 17 unmodified lines | ||
| 72 | 73 | // engine-aware JS Error copier and factory |
| 73 | 74 | V8ScriptValue ScriptEngineV8::makeError(const V8ScriptValue& _other, const QString& type) { |
| 74 | 75 | if (!IS_THREADSAFE_INVOCATION(thread(), __FUNCTION__)) { |
| 75 | − return V8ScriptValue(_v8Isolate, v8::Null(_v8Isolate)); | |
| 76 | + return V8ScriptValue(this, v8::Null(_v8Isolate)); | |
| 76 | 77 | } |
| 77 | − return V8ScriptValue(_v8Isolate, v8::Null(_v8Isolate)); | |
| 78 | + return V8ScriptValue(this, v8::Null(_v8Isolate)); | |
| 78 | 79 | //V8TODO |
| 79 | 80 | /* |
| 80 | 81 | auto other = _other; |
| @@ -293,7 +294,7 @@ bool ScriptEngineV8::maybeEmitUncaughtException(const QString& debugHint) { · 212 unmodified lines | ||
| 293 | 294 | } |
| 294 | 295 | |
| 295 | 296 | // Lambda |
| 296 | −ScriptValue ScriptEngineV8::newLambdaFunction(std::function<V8ScriptValue(V8ScriptContext*, ScriptEngineV8*)> operation, | |
| 297 | +/*ScriptValue ScriptEngineV8::newLambdaFunction(std::function<V8ScriptValue(V8ScriptContext*, ScriptEngineV8*)> operation, | |
| 297 | 298 | const V8ScriptValue& data, |
| 298 | 299 | const ValueOwnership& ownership) { |
| 299 | 300 | v8::HandleScope handleScope(_v8Isolate); |
| @@ -305,7 +306,7 @@ ScriptValue ScriptEngineV8::newLambdaFunction(std::function<V8ScriptValue(V8Scri · 5 unmodified lines | ||
| 305 | 306 | call.setPrototype(object); // context->callee().prototype() === Lambda QObject |
| 306 | 307 | call.setData(ScriptValue(new ScriptValueV8Wrapper(this, data))); // context->callee().data() will === data param |
| 307 | 308 | return call; |
| 308 | −} | |
| 309 | +}*/ | |
| 309 | 310 | QString Lambda::toString() const { |
| 310 | 311 | v8::HandleScope handleScope(_engine->getIsolate()); |
| 311 | 312 | v8::Context::Scope contextScope(_engine->getContext()); |
| @@ -338,7 +339,7 @@ Lambda::Lambda(ScriptEngineV8* engine, · 26 unmodified lines | ||
| 338 | 339 | } |
| 339 | 340 | V8ScriptValue Lambda::call() { |
| 340 | 341 | if (!_engine->IS_THREADSAFE_INVOCATION(__FUNCTION__)) { |
| 341 | − return V8ScriptValue(_engine->getIsolate(), v8::Null(_engine->getIsolate())); | |
| 342 | + return V8ScriptValue(_engine, v8::Null(_engine->getIsolate())); | |
| 342 | 343 | } |
| 343 | 344 | // V8TODO: it needs to be done in entirely different way for V8 |
| 344 | 345 | Q_ASSERT(false); |
| @@ -411,10 +412,10 @@ ScriptEngineV8::ScriptEngineV8(ScriptManager* scriptManager) : · 66 unmodified lines | ||
| 411 | 412 | _contexts.append(std::make_shared<ScriptContextV8Wrapper>(this,context, ScriptContextPointer())); |
| 412 | 413 | |
| 413 | 414 | |
| 414 | − V8ScriptValue nullScriptValue(_v8Isolate, v8::Null(_v8Isolate)); | |
| 415 | + V8ScriptValue nullScriptValue(this, v8::Null(_v8Isolate)); | |
| 415 | 416 | _nullValue = ScriptValue(new ScriptValueV8Wrapper(this, nullScriptValue)); |
| 416 | 417 | |
| 417 | − V8ScriptValue undefined(_v8Isolate, v8::Undefined(_v8Isolate)); | |
| 418 | + V8ScriptValue undefined(this, v8::Undefined(_v8Isolate)); | |
| 418 | 419 | _undefinedValue = ScriptValue(new ScriptValueV8Wrapper(this, undefined)); |
| 419 | 420 | |
| 420 | 421 | registerSystemTypes(); |
| @@ -463,7 +464,7 @@ void ScriptEngineV8::registerEnum(const QString& enumName, QMetaEnum newEnum) { · 42 unmodified lines | ||
| 463 | 464 | for (int i = 0; i < newEnum.keyCount(); i++) { |
| 464 | 465 | const char* keyName = newEnum.key(i); |
| 465 | 466 | QString fullName = enumName + "." + keyName; |
| 466 | − registerValue(fullName, V8ScriptValue(_v8Isolate, v8::Integer::New(_v8Isolate, newEnum.keyToValue(keyName)))); | |
| 467 | + registerValue(fullName, V8ScriptValue(this, v8::Integer::New(_v8Isolate, newEnum.keyToValue(keyName)))); | |
| 467 | 468 | } |
| 468 | 469 | } |
| 469 | 470 | |
| @@ -741,7 +742,7 @@ void ScriptEngineV8::registerGetterSetter(const QString& name, ScriptEngine::Fun · 271 unmodified lines | ||
| 741 | 742 | v8::Local<v8::String> v8propertyName = |
| 742 | 743 | v8::String::NewFromUtf8(_v8Isolate, name.toStdString().c_str()).ToLocalChecked(); |
| 743 | 744 | v8::Local<v8::Object> v8ObjectToSetProperty; |
| 744 | − ScriptObjectV8Proxy *proxy = ScriptObjectV8Proxy::unwrapProxy(V8ScriptValue(_v8Isolate, v8ParentObject)); | |
| 745 | + ScriptObjectV8Proxy *proxy = ScriptObjectV8Proxy::unwrapProxy(V8ScriptValue(this, v8ParentObject)); | |
| 745 | 746 | // If object is ScriptObjectV8Proxy, then setting property needs to be handled differently |
| 746 | 747 | if (proxy) { |
| 747 | 748 | v8ObjectToSetProperty = v8ParentObject->GetInternalField(2).As<v8::Object>(); |
| @@ -833,13 +834,14 @@ ScriptValue ScriptEngineV8::evaluateInClosure(const ScriptValue& _closure, · 85 unmodified lines | ||
| 833 | 834 | Q_ASSERT(false); |
| 834 | 835 | return nullValue(); |
| 835 | 836 | } |
| 837 | + Q_ASSERT(closure.constGet()->IsObject()); | |
| 836 | 838 | closureObject = v8::Local<v8::Object>::Cast(closure.constGet()); |
| 837 | 839 | qDebug() << "Closure object members:" << scriptValueDebugListMembersV8(closure); |
| 838 | 840 | v8::Local<v8::Object> testObject = v8::Object::New(_v8Isolate); |
| 839 | 841 | if(!testObject->Set(getContext(), v8::String::NewFromUtf8(_v8Isolate, "test_value").ToLocalChecked(), closureObject).FromMaybe(false)) { |
| 840 | 842 | Q_ASSERT(false); |
| 841 | 843 | } |
| 842 | − qDebug() << "Test object members:" << scriptValueDebugListMembersV8(V8ScriptValue(_v8Isolate, testObject)); | |
| 844 | + qDebug() << "Test object members:" << scriptValueDebugListMembersV8(V8ScriptValue(this, testObject)); | |
| 843 | 845 | |
| 844 | 846 | if (!closureObject->Get(closure.constGetContext(), v8::String::NewFromUtf8(_v8Isolate, "global").ToLocalChecked()) |
| 845 | 847 | .ToLocal(&closureGlobal)) { |
| @@ -958,7 +960,7 @@ ScriptValue ScriptEngineV8::evaluateInClosure(const ScriptValue& _closure, · 112 unmodified lines | ||
| 958 | 960 | #endif |
| 959 | 961 | result = err; |
| 960 | 962 | } else { |
| 961 | − result = ScriptValue(new ScriptValueV8Wrapper(this, V8ScriptValue(_v8Isolate, v8Result))); | |
| 963 | + result = ScriptValue(new ScriptValueV8Wrapper(this, V8ScriptValue(this, v8Result))); | |
| 962 | 964 | } |
| 963 | 965 | } |
| 964 | 966 | #ifdef DEBUG_JS |
| @@ -1022,10 +1024,13 @@ ScriptValue ScriptEngineV8::evaluate(const QString& sourceCode, const QString& f · 57 unmodified lines | ||
| 1022 | 1024 | errorLineNumber = exceptionMessage->GetLineNumber(getContext()).FromJust(); |
| 1023 | 1025 | errorColumnNumber = exceptionMessage->GetStartColumn(getContext()).FromJust(); |
| 1024 | 1026 | v8::Local<v8::Value> backtraceV8String; |
| 1025 | − if (tryCatch.StackTrace(getContext()).ToLocal(&backtraceV8String) && backtraceV8String->IsString() && | |
| 1026 | − v8::Local<v8::String>::Cast(backtraceV8String)->Length() > 0) { | |
| 1027 | − v8::String::Utf8Value backtraceUtf8Value(getIsolate(), backtraceV8String); | |
| 1028 | − errorBacktrace = *backtraceUtf8Value; | |
| 1027 | + if (tryCatch.StackTrace(getContext()).ToLocal(&backtraceV8String)) { | |
| 1028 | + if (backtraceV8String->IsString()) { | |
| 1029 | + if (v8::Local<v8::String>::Cast(backtraceV8String)->Length() > 0) { | |
| 1030 | + v8::String::Utf8Value backtraceUtf8Value(getIsolate(), backtraceV8String); | |
| 1031 | + errorBacktrace = *backtraceUtf8Value; | |
| 1032 | + } | |
| 1033 | + } | |
| 1029 | 1034 | } |
| 1030 | 1035 | qCDebug(scriptengine) << "Compiling script \"" << fileName << "\" failed on line " << errorLineNumber << " column " << errorColumnNumber << " with message: \"" << errorMessage <<"\" backtrace: " << errorBacktrace; |
| 1031 | 1036 | } |
| @@ -1061,7 +1066,7 @@ ScriptValue ScriptEngineV8::evaluate(const QString& sourceCode, const QString& f · 29 unmodified lines | ||
| 1061 | 1066 | if (!script->Run(getContext()).ToLocal(&result)) { |
| 1062 | 1067 | Q_ASSERT(tryCatchRun.HasCaught()); |
| 1063 | 1068 | auto runError = tryCatchRun.Message(); |
| 1064 | − ScriptValue errorValue(new ScriptValueV8Wrapper(this, V8ScriptValue(_v8Isolate, runError->Get()))); | |
| 1069 | + ScriptValue errorValue(new ScriptValueV8Wrapper(this, V8ScriptValue(this, runError->Get()))); | |
| 1065 | 1070 | qCDebug(scriptengine) << "Running script: \"" << fileName << "\" " << formatErrorMessageFromTryCatch(tryCatchRun); |
| 1066 | 1071 | //V8TODO |
| 1067 | 1072 | //raiseException(errorValue); |
| @@ -1069,7 +1074,7 @@ ScriptValue ScriptEngineV8::evaluate(const QString& sourceCode, const QString& f · 1 unmodified line | ||
| 1069 | 1074 | _evaluatingCounter--; |
| 1070 | 1075 | return errorValue; |
| 1071 | 1076 | } |
| 1072 | − V8ScriptValue resultValue(_v8Isolate, result); | |
| 1077 | + V8ScriptValue resultValue(this, result); | |
| 1073 | 1078 | _evaluatingCounter--; |
| 1074 | 1079 | return ScriptValue(new ScriptValueV8Wrapper(this, std::move(resultValue))); |
| 1075 | 1080 | } |
| @@ -1092,10 +1097,13 @@ QString ScriptEngineV8::formatErrorMessageFromTryCatch(v8::TryCatch &tryCatch) { · 16 unmodified lines | ||
| 1092 | 1097 | errorLineNumber = exceptionMessage->GetLineNumber(getContext()).FromJust(); |
| 1093 | 1098 | errorColumnNumber = exceptionMessage->GetStartColumn(getContext()).FromJust(); |
| 1094 | 1099 | v8::Local<v8::Value> backtraceV8String; |
| 1095 | − if (tryCatch.StackTrace(getContext()).ToLocal(&backtraceV8String) && backtraceV8String->IsString() && | |
| 1096 | − v8::Local<v8::String>::Cast(backtraceV8String)->Length() > 0) { | |
| 1097 | − v8::String::Utf8Value backtraceUtf8Value(getIsolate(), backtraceV8String); | |
| 1098 | − errorBacktrace = *backtraceUtf8Value; | |
| 1100 | + if (tryCatch.StackTrace(getContext()).ToLocal(&backtraceV8String)) { | |
| 1101 | + if (backtraceV8String->IsString()) { | |
| 1102 | + if (v8::Local<v8::String>::Cast(backtraceV8String)->Length() > 0) { | |
| 1103 | + v8::String::Utf8Value backtraceUtf8Value(getIsolate(), backtraceV8String); | |
| 1104 | + errorBacktrace = *backtraceUtf8Value; | |
| 1105 | + } | |
| 1106 | + } | |
| 1099 | 1107 | } |
| 1100 | 1108 | QTextStream resultStream(&result); |
| 1101 | 1109 | resultStream << "failed on line " << errorLineNumber << " column " << errorColumnNumber << " with message: \"" << errorMessage <<"\" backtrace: " << errorBacktrace; |
| @@ -1185,7 +1193,7 @@ Q_INVOKABLE ScriptValue ScriptEngineV8::evaluate(const ScriptProgramPointer& pro · 83 unmodified lines | ||
| 1185 | 1193 | if (!v8Program.constGet()->Run(getContext()).ToLocal(&result)) { |
| 1186 | 1194 | Q_ASSERT(tryCatchRun.HasCaught()); |
| 1187 | 1195 | auto runError = tryCatchRun.Message(); |
| 1188 | − errorValue = ScriptValue(new ScriptValueV8Wrapper(this, V8ScriptValue(_v8Isolate, runError->Get()))); | |
| 1196 | + errorValue = ScriptValue(new ScriptValueV8Wrapper(this, V8ScriptValue(this, runError->Get()))); | |
| 1189 | 1197 | raiseException(errorValue); |
| 1190 | 1198 | maybeEmitUncaughtException("evaluate"); |
| 1191 | 1199 | hasFailed = true; |
| @@ -1195,7 +1203,7 @@ Q_INVOKABLE ScriptValue ScriptEngineV8::evaluate(const ScriptProgramPointer& pro · 3 unmodified lines | ||
| 1195 | 1203 | } |
| 1196 | 1204 | } |
| 1197 | 1205 | if(!hasFailed) { |
| 1198 | − V8ScriptValue resultValueV8(_v8Isolate, result); | |
| 1206 | + V8ScriptValue resultValueV8(this, result); | |
| 1199 | 1207 | resultValue = ScriptValue(new ScriptValueV8Wrapper(this, std::move(resultValueV8))); |
| 1200 | 1208 | } |
| 1201 | 1209 | } |
| @@ -1225,12 +1233,12 @@ void ScriptEngineV8::updateMemoryCost(const qint64& deltaSize) { · 23 unmodified lines | ||
| 1225 | 1233 | //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
| 1226 | 1234 | // ScriptEngine implementation |
| 1227 | 1235 | |
| 1228 | −ScriptValue ScriptEngineV8::globalObject() const { | |
| 1236 | +ScriptValue ScriptEngineV8::globalObject() { | |
| 1229 | 1237 | v8::Locker locker(_v8Isolate); |
| 1230 | 1238 | v8::Isolate::Scope isolateScope(_v8Isolate); |
| 1231 | 1239 | v8::HandleScope handleScope(_v8Isolate); |
| 1232 | 1240 | v8::Context::Scope contextScope(getConstContext()); |
| 1233 | − V8ScriptValue global(_v8Isolate, getConstContext()->Global());// = QScriptEngine::globalObject(); // can't cache the value as it may change | |
| 1241 | + V8ScriptValue global(this, getConstContext()->Global());// = QScriptEngine::globalObject(); // can't cache the value as it may change | |
| 1234 | 1242 | return ScriptValue(new ScriptValueV8Wrapper(const_cast<ScriptEngineV8*>(this), std::move(global))); |
| 1235 | 1243 | } |
| 1236 | 1244 | |
| @@ -1243,7 +1251,7 @@ ScriptValue ScriptEngineV8::newArray(uint length) { · 6 unmodified lines | ||
| 1243 | 1251 | v8::Isolate::Scope isolateScope(_v8Isolate); |
| 1244 | 1252 | v8::HandleScope handleScope(_v8Isolate); |
| 1245 | 1253 | v8::Context::Scope contextScope(getContext()); |
| 1246 | − V8ScriptValue result(_v8Isolate, v8::Array::New(_v8Isolate, static_cast<int>(length))); | |
| 1254 | + V8ScriptValue result(this, v8::Array::New(_v8Isolate, static_cast<int>(length))); | |
| 1247 | 1255 | return ScriptValue(new ScriptValueV8Wrapper(this, std::move(result))); |
| 1248 | 1256 | } |
| 1249 | 1257 | |
| @@ -1262,7 +1270,7 @@ ScriptValue ScriptEngineV8::newArrayBuffer(const QByteArray& message) { · 12 unmodified lines | ||
| 1262 | 1270 | if (!array) { |
| 1263 | 1271 | return undefinedValue(); |
| 1264 | 1272 | }*/ |
| 1265 | − V8ScriptValue result(_v8Isolate, arrayBuffer);//QScriptEngine::newObject(array, data); | |
| 1273 | + V8ScriptValue result(this, arrayBuffer);//QScriptEngine::newObject(array, data); | |
| 1266 | 1274 | return ScriptValue(new ScriptValueV8Wrapper(this, std::move(result))); |
| 1267 | 1275 | } |
| 1268 | 1276 | |
| @@ -1280,7 +1288,7 @@ ScriptValue ScriptEngineV8::newObject() { · 11 unmodified lines | ||
| 1280 | 1288 | v8::Isolate::Scope isolateScope(_v8Isolate); |
| 1281 | 1289 | v8::HandleScope handleScope(_v8Isolate); |
| 1282 | 1290 | v8::Context::Scope contextScope(getContext()); |
| 1283 | − V8ScriptValue resultV8 = V8ScriptValue(_v8Isolate, v8::Object::New(_v8Isolate)); | |
| 1291 | + V8ScriptValue resultV8 = V8ScriptValue(this, v8::Object::New(_v8Isolate)); | |
| 1284 | 1292 | result = ScriptValue(new ScriptValueV8Wrapper(this, std::move(resultV8))); |
| 1285 | 1293 | } |
| 1286 | 1294 | /*if (is_isolate_exit_needed) { |
| @@ -1328,7 +1336,7 @@ ScriptValue ScriptEngineV8::newValue(bool value) { · 41 unmodified lines | ||
| 1328 | 1336 | v8::Isolate::Scope isolateScope(_v8Isolate); |
| 1329 | 1337 | v8::HandleScope handleScope(_v8Isolate); |
| 1330 | 1338 | v8::Context::Scope contextScope(getContext()); |
| 1331 | − V8ScriptValue result(_v8Isolate, v8::Boolean::New(_v8Isolate, value)); | |
| 1339 | + V8ScriptValue result(this, v8::Boolean::New(_v8Isolate, value)); | |
| 1332 | 1340 | return ScriptValue(new ScriptValueV8Wrapper(this, std::move(result))); |
| 1333 | 1341 | } |
| 1334 | 1342 | |
| @@ -1337,7 +1345,7 @@ ScriptValue ScriptEngineV8::newValue(int value) { · 2 unmodified lines | ||
| 1337 | 1345 | v8::Isolate::Scope isolateScope(_v8Isolate); |
| 1338 | 1346 | v8::HandleScope handleScope(_v8Isolate); |
| 1339 | 1347 | v8::Context::Scope contextScope(getContext()); |
| 1340 | − V8ScriptValue result(_v8Isolate, v8::Integer::New(_v8Isolate, value)); | |
| 1348 | + V8ScriptValue result(this, v8::Integer::New(_v8Isolate, value)); | |
| 1341 | 1349 | return ScriptValue(new ScriptValueV8Wrapper(this, std::move(result))); |
| 1342 | 1350 | } |
| 1343 | 1351 | |
| @@ -1346,7 +1354,7 @@ ScriptValue ScriptEngineV8::newValue(uint value) { · 2 unmodified lines | ||
| 1346 | 1354 | v8::Isolate::Scope isolateScope(_v8Isolate); |
| 1347 | 1355 | v8::HandleScope handleScope(_v8Isolate); |
| 1348 | 1356 | v8::Context::Scope contextScope(getContext()); |
| 1349 | − V8ScriptValue result(_v8Isolate, v8::Uint32::New(_v8Isolate, value)); | |
| 1357 | + V8ScriptValue result(this, v8::Uint32::New(_v8Isolate, value)); | |
| 1350 | 1358 | return ScriptValue(new ScriptValueV8Wrapper(this, std::move(result))); |
| 1351 | 1359 | } |
| 1352 | 1360 | |
| @@ -1355,7 +1363,7 @@ ScriptValue ScriptEngineV8::newValue(double value) { · 2 unmodified lines | ||
| 1355 | 1363 | v8::Isolate::Scope isolateScope(_v8Isolate); |
| 1356 | 1364 | v8::HandleScope handleScope(_v8Isolate); |
| 1357 | 1365 | v8::Context::Scope contextScope(getContext()); |
| 1358 | − V8ScriptValue result(_v8Isolate, v8::Number::New(_v8Isolate, value)); | |
| 1366 | + V8ScriptValue result(this, v8::Number::New(_v8Isolate, value)); | |
| 1359 | 1367 | return ScriptValue(new ScriptValueV8Wrapper(this, std::move(result))); |
| 1360 | 1368 | } |
| 1361 | 1369 | |
| @@ -1365,7 +1373,7 @@ ScriptValue ScriptEngineV8::newValue(const QString& value) { · 3 unmodified lines | ||
| 1365 | 1373 | v8::HandleScope handleScope(_v8Isolate); |
| 1366 | 1374 | v8::Context::Scope contextScope(getContext()); |
| 1367 | 1375 | v8::Local<v8::String> valueV8 = v8::String::NewFromUtf8(_v8Isolate, value.toStdString().c_str(), v8::NewStringType::kNormal).ToLocalChecked(); |
| 1368 | − V8ScriptValue result(_v8Isolate, valueV8); | |
| 1376 | + V8ScriptValue result(this, valueV8); | |
| 1369 | 1377 | return ScriptValue(new ScriptValueV8Wrapper(this, std::move(result))); |
| 1370 | 1378 | } |
| 1371 | 1379 | |
| @@ -1375,7 +1383,7 @@ ScriptValue ScriptEngineV8::newValue(const QLatin1String& value) { · 3 unmodified lines | ||
| 1375 | 1383 | v8::HandleScope handleScope(_v8Isolate); |
| 1376 | 1384 | v8::Context::Scope contextScope(getContext()); |
| 1377 | 1385 | v8::Local<v8::String> valueV8 = v8::String::NewFromUtf8(_v8Isolate, value.latin1(), v8::NewStringType::kNormal).ToLocalChecked(); |
| 1378 | − V8ScriptValue result(_v8Isolate, valueV8); | |
| 1386 | + V8ScriptValue result(this, valueV8); | |
| 1379 | 1387 | return ScriptValue(new ScriptValueV8Wrapper(this, std::move(result))); |
| 1380 | 1388 | } |
| 1381 | 1389 | |
| @@ -1385,7 +1393,7 @@ ScriptValue ScriptEngineV8::newValue(const char* value) { · 3 unmodified lines | ||
| 1385 | 1393 | v8::HandleScope handleScope(_v8Isolate); |
| 1386 | 1394 | v8::Context::Scope contextScope(getContext()); |
| 1387 | 1395 | v8::Local<v8::String> valueV8 = v8::String::NewFromUtf8(_v8Isolate, value, v8::NewStringType::kNormal).ToLocalChecked(); |
| 1388 | − V8ScriptValue result(_v8Isolate, valueV8); | |
| 1396 | + V8ScriptValue result(this, valueV8); | |
| 1389 | 1397 | return ScriptValue(new ScriptValueV8Wrapper(this, std::move(result))); |
| 1390 | 1398 | } |
| 1391 | 1399 | |
| @@ -1463,6 +1471,7 @@ ScriptValue ScriptEngineV8::newFunction(ScriptEngine::FunctionSignature fun, int · 71 unmodified lines | ||
| 1463 | 1471 | v8::HandleScope handleScope(info.GetIsolate()); |
| 1464 | 1472 | auto context = info.GetIsolate()->GetCurrentContext(); |
| 1465 | 1473 | v8::Context::Scope contextScope(context); |
| 1474 | + Q_ASSERT(info.Data()->IsObject()); | |
| 1466 | 1475 | auto object = v8::Local<v8::Object>::Cast(info.Data()); |
| 1467 | 1476 | Q_ASSERT(object->InternalFieldCount() == 2); |
| 1468 | 1477 | auto function = reinterpret_cast<ScriptEngine::FunctionSignature> |
| @@ -1493,7 +1502,7 @@ ScriptValue ScriptEngineV8::newFunction(ScriptEngine::FunctionSignature fun, int · 24 unmodified lines | ||
| 1493 | 1502 | auto v8Function = v8::Function::New(getContext(), v8FunctionCallback, functionData, length).ToLocalChecked(); |
| 1494 | 1503 | //auto functionObjectTemplate = functionTemplate->InstanceTemplate(); |
| 1495 | 1504 | //auto function = |
| 1496 | − V8ScriptValue result(_v8Isolate, v8Function); // = QScriptEngine::newFunction(innerFunc, length); | |
| 1505 | + V8ScriptValue result(this, v8Function); // = QScriptEngine::newFunction(innerFunc, length); | |
| 1497 | 1506 | //auto funAddr = QScriptEngine::newVariant(QVariant(reinterpret_cast<qulonglong>(fun))); |
| 1498 | 1507 | // V8TODO |
| 1499 | 1508 | //result.setProperty("_func", funAddr, V8ScriptValue::PropertyFlags(V8ScriptValue::ReadOnly + V8ScriptValue::Undeletable + V8ScriptValue::SkipInEnumeration)); |
| @@ -1685,4 +1694,20 @@ QString ScriptEngineV8::scriptValueDebugDetailsV8(const V8ScriptValue &v8Value) · 185 unmodified lines | ||
| 1685 | 1694 | v8::Local<v8::StackFrame> stackFrame = stackTrace->GetFrame(_v8Isolate, n); |
| 1686 | 1695 | |
| 1687 | 1696 | } |
| 1688 | −}*/ | |
| 1697 | +}*/ | |
| 1698 | + | |
| 1699 | +QStringList ScriptEngineV8::getCurrentScriptURLs() const { | |
| 1700 | + auto isolate = _v8Isolate; | |
| 1701 | + v8::Locker locker(isolate); | |
| 1702 | + v8::Isolate::Scope isolateScope(isolate); | |
| 1703 | + v8::HandleScope handleScope(isolate); | |
| 1704 | + v8::Context::Scope contextScope(_v8Isolate->GetCurrentContext()); | |
| 1705 | + v8::Local<v8::StackTrace> stackTrace = v8::StackTrace::CurrentStackTrace(isolate, 100); | |
| 1706 | + QStringList scriptURLs; | |
| 1707 | + //V8TODO nicer formatting | |
| 1708 | + for (int i = 0; i < stackTrace->GetFrameCount(); i++) { | |
| 1709 | + v8::Local<v8::StackFrame> stackFrame = stackTrace->GetFrame(isolate, i); | |
| 1710 | + scriptURLs.append(QString(*v8::String::Utf8Value(isolate, stackFrame->GetScriptNameOrSourceURL()))); | |
| 1711 | + } | |
| 1712 | + return scriptURLs; | |
| 1713 | +} | |