Showing the changes to libraries/script-engine/src/v8/ScriptEngineV8.cpp (1 of 4 files). Show all
Unified · Split
| @@ -760,6 +760,7 @@ ScriptValue ScriptEngineV8::evaluateInClosure(const ScriptValue& _closure, · 759 unmodified lines | |||
| 760 | v8::Local<v8::Value> closureGlobal; | 760 | v8::Local<v8::Value> closureGlobal; |
| 761 | ScriptValueV8Wrapper* unwrappedClosure; | 761 | ScriptValueV8Wrapper* unwrappedClosure; |
| 762 | ScriptProgramV8Wrapper* unwrappedProgram; | 762 | ScriptProgramV8Wrapper* unwrappedProgram; |
| 763 | v8::Local<v8::Context> oldContext = getContext(); | ||
| 763 | 764 | ||
| 764 | { | 765 | { |
| 765 | v8::Context::Scope contextScope(_v8Context.Get(_v8Isolate)); | 766 | v8::Context::Scope contextScope(_v8Context.Get(_v8Isolate)); |
| @@ -792,6 +793,10 @@ ScriptValue ScriptEngineV8::evaluateInClosure(const ScriptValue& _closure, · 26 unmodified lines | |||
| 792 | return nullValue(); | 793 | return nullValue(); |
| 793 | } | 794 | } |
| 794 | closureObject = v8::Local<v8::Object>::Cast(closure.constGet()); | 795 | closureObject = v8::Local<v8::Object>::Cast(closure.constGet()); |
| 796 | qDebug() << "Closure object members:" << scriptValueDebugListMembersV8(closure); | ||
| 797 | v8::Local<v8::Object> testObject = v8::Object::New(_v8Isolate); | ||
| 798 | testObject->Set(getContext(), v8::String::NewFromUtf8(_v8Isolate, "test_value").ToLocalChecked(), closureObject); | ||
| 799 | qDebug() << "Test object members:" << scriptValueDebugListMembersV8(V8ScriptValue(_v8Isolate, testObject)); | ||
| 795 | 800 | ||
| 796 | if (!closureObject->Get(closure.constGetContext(), v8::String::NewFromUtf8(_v8Isolate, "global").ToLocalChecked()) | 801 | if (!closureObject->Get(closure.constGetContext(), v8::String::NewFromUtf8(_v8Isolate, "global").ToLocalChecked()) |
| 797 | .ToLocal(&closureGlobal)) { | 802 | .ToLocal(&closureGlobal)) { |
| @@ -806,7 +811,7 @@ ScriptValue ScriptEngineV8::evaluateInClosure(const ScriptValue& _closure, · 8 unmodified lines | |||
| 806 | //oldGlobal = _v8Context.Get(_v8Isolate)->Global(); | 811 | //oldGlobal = _v8Context.Get(_v8Isolate)->Global(); |
| 807 | v8::Local<v8::Context> closureContext; | 812 | v8::Local<v8::Context> closureContext; |
| 808 | 813 | ||
| 809 | // V8TODO | 814 | // V8TODO V8 cannot use arbitrary objects as global objects |
| 810 | /*if (closureGlobal->IsObject()) { | 815 | /*if (closureGlobal->IsObject()) { |
| 811 | #ifdef DEBUG_JS | 816 | #ifdef DEBUG_JS |
| 812 | qCDebug(shared) << " setting global = closure.global" << shortName; | 817 | qCDebug(shared) << " setting global = closure.global" << shortName; |
| @@ -817,7 +822,7 @@ ScriptValue ScriptEngineV8::evaluateInClosure(const ScriptValue& _closure, · 4 unmodified lines | |||
| 817 | } else { | 822 | } else { |
| 818 | closureContext = v8::Context::New(_v8Isolate); | 823 | closureContext = v8::Context::New(_v8Isolate); |
| 819 | }*/ | 824 | }*/ |
| 820 | closureContext = v8::Context::New(_v8Isolate, nullptr, v8::Local<v8::ObjectTemplate>(), closureObject); | 825 | closureContext = v8::Context::New(_v8Isolate); |
| 821 | 826 | ||
| 822 | ScriptValue result; | 827 | ScriptValue result; |
| 823 | //auto context = pushContext(); | 828 | //auto context = pushContext(); |
| @@ -861,8 +866,33 @@ ScriptValue ScriptEngineV8::evaluateInClosure(const ScriptValue& _closure, · 37 unmodified lines | |||
| 861 | #endif | 866 | #endif |
| 862 | { | 867 | { |
| 863 | v8::TryCatch tryCatch(getIsolate()); | 868 | v8::TryCatch tryCatch(getIsolate()); |
| 864 | //qDebug(scriptengine) << "Closure before run:" << scriptValueDebugDetailsV8(closure); | 869 | // Since V8 cannot use arbitrary object as global object, objects from main global need to be copied to closure's global object |
| 865 | auto maybeResult = program.constGet()->Run(closureContext); | 870 | auto oldGlobalMemberNames = oldContext->Global()->GetPropertyNames(oldContext).ToLocalChecked(); |
| 871 | for (int i = 0; i < oldGlobalMemberNames->Length(); i++) { | ||
| 872 | auto name = oldGlobalMemberNames->Get(closureContext, i).ToLocalChecked(); | ||
| 873 | closureContext->Global()->Set(closureContext, name, oldContext->Global()->Get(oldContext, name).ToLocalChecked()); | ||
| 874 | } | ||
| 875 | // Objects from closure need to be copied to global object too | ||
| 876 | auto closureMemberNames = closureObject->GetPropertyNames(closureContext).ToLocalChecked(); | ||
| 877 | for (int i = 0; i < closureMemberNames->Length(); i++) { | ||
| 878 | auto name = closureMemberNames->Get(closureContext, i).ToLocalChecked(); | ||
| 879 | closureContext->Global()->Set(closureContext, name, closureObject->Get(closureContext, name).ToLocalChecked()); | ||
| 880 | } | ||
| 881 | // List members of closure global object | ||
| 882 | QString membersString(""); | ||
| 883 | if (closureContext->Global()->IsObject()) { | ||
| 884 | v8::Local<v8::String> membersStringV8; | ||
| 885 | v8::Local<v8::Object> object = v8::Local<v8::Object>::Cast(closureContext->Global()); | ||
| 886 | auto names = object->GetPropertyNames(closureContext).ToLocalChecked(); | ||
| 887 | if (v8::JSON::Stringify(closureContext, names).ToLocal(&membersStringV8)) { | ||
| 888 | membersString = QString(*v8::String::Utf8Value(_v8Isolate, membersStringV8)); | ||
| 889 | } | ||
| 890 | membersString = QString(*v8::String::Utf8Value(_v8Isolate, membersStringV8)); | ||
| 891 | } else { | ||
| 892 | membersString = QString(" Is not an object"); | ||
| 893 | } | ||
| 894 | qDebug(scriptengine) << "Closure global before run:" << membersString; | ||
| 895 | auto maybeResult = program.constGet()->GetUnboundScript()->BindToCurrentContext()->Run(closureContext); | ||
| 866 | //qDebug(scriptengine) << "Closure after run:" << scriptValueDebugDetailsV8(closure); | 896 | //qDebug(scriptengine) << "Closure after run:" << scriptValueDebugDetailsV8(closure); |
| 867 | v8::Local<v8::Value> v8Result; | 897 | v8::Local<v8::Value> v8Result; |
| 868 | if (!maybeResult.ToLocal(&v8Result)) { | 898 | if (!maybeResult.ToLocal(&v8Result)) { |
| @@ -897,7 +927,6 @@ ScriptValue ScriptEngineV8::evaluateInClosure(const ScriptValue& _closure, · 28 unmodified lines | |||
| 897 | setGlobalObject(oldGlobal); | 927 | setGlobalObject(oldGlobal); |
| 898 | }*/ | 928 | }*/ |
| 899 | 929 | ||
| 900 | closureContext->DetachGlobal(); | ||
| 901 | _evaluatingCounter--; | 930 | _evaluatingCounter--; |
| 902 | return result; | 931 | return result; |
| 903 | } | 932 | } |
| @@ -1546,7 +1575,7 @@ QString ScriptEngineV8::scriptValueDebugListMembersV8(const V8ScriptValue &v8Val · 642 unmodified lines | |||
| 1546 | v8::Local<v8::String> membersStringV8; | 1575 | v8::Local<v8::String> membersStringV8; |
| 1547 | v8::Local<v8::Object> object = v8::Local<v8::Object>::Cast(v8Value.constGet()); | 1576 | v8::Local<v8::Object> object = v8::Local<v8::Object>::Cast(v8Value.constGet()); |
| 1548 | auto names = object->GetPropertyNames(getContext()).ToLocalChecked(); | 1577 | auto names = object->GetPropertyNames(getContext()).ToLocalChecked(); |
| 1549 | if (v8::JSON::Stringify(getContext(), object).ToLocal(&membersStringV8)) { | 1578 | if (v8::JSON::Stringify(getContext(), names).ToLocal(&membersStringV8)) { |
| 1550 | membersString = QString(*v8::String::Utf8Value(_v8Isolate, membersStringV8)); | 1579 | membersString = QString(*v8::String::Utf8Value(_v8Isolate, membersStringV8)); |
| 1551 | } | 1580 | } |
| 1552 | membersString = QString(*v8::String::Utf8Value(_v8Isolate, membersStringV8)); | 1581 | membersString = QString(*v8::String::Utf8Value(_v8Isolate, membersStringV8)); |