History

Fixed evaluateInClosure and other V8 stuff

ksuprynowicz committed 3 years ago

Commit 70d4a431 parent cc20ced8 files · +378 −191Browse files

Showing the changes to libraries/script-engine/src/v8/ScriptValueV8Wrapper.cpp (1 of 8 files). Show all

Unified · Split

libraries/script-engine/src/v8/ScriptValueV8Wrapper.cpp+68−31
@@ -61,7 +61,8 @@ V8ScriptValue ScriptValueV8Wrapper::fullUnwrap(ScriptEngineV8* engine, const Scr · 60 unmodified lines
6161
6262 ScriptValue ScriptValueV8Wrapper::call(const ScriptValue& thisObject, const ScriptValueList& args) {
6363 auto isolate = _engine->getIsolate();
64− Q_ASSERT(isolate->IsCurrent());
64+ v8::Locker locker(isolate);
65+ v8::Isolate::Scope isolateScope(isolate);
6566 v8::HandleScope handleScope(isolate);
6667 v8::Context::Scope contextScope(_engine->getContext());
6768 V8ScriptValue v8This = fullUnwrap(thisObject);
@@ -89,7 +90,8 @@ ScriptValue ScriptValueV8Wrapper::call(const ScriptValue& thisObject, const Scri · 21 unmodified lines
8990
9091 ScriptValue ScriptValueV8Wrapper::call(const ScriptValue& thisObject, const ScriptValue& arguments) {
9192 auto isolate = _engine->getIsolate();
92− Q_ASSERT(isolate->IsCurrent());
93+ v8::Locker locker(isolate);
94+ v8::Isolate::Scope isolateScope(isolate);
9395 v8::HandleScope handleScope(isolate);
9496 v8::Context::Scope contextScope(_engine->getContext());
9597 V8ScriptValue v8This = fullUnwrap(thisObject);
@@ -113,7 +115,8 @@ ScriptValue ScriptValueV8Wrapper::call(const ScriptValue& thisObject, const Scri · 17 unmodified lines
113115
114116 ScriptValue ScriptValueV8Wrapper::construct(const ScriptValueList& args) {
115117 auto isolate = _engine->getIsolate();
116− Q_ASSERT(isolate->IsCurrent());
118+ v8::Locker locker(isolate);
119+ v8::Isolate::Scope isolateScope(isolate);
117120 v8::HandleScope handleScope(isolate);
118121 v8::Context::Scope contextScope(_engine->getContext());
119122 Q_ASSERT(args.length() <= Q_METAMETHOD_INVOKE_MAX_ARGS);
@@ -139,7 +142,8 @@ ScriptValue ScriptValueV8Wrapper::construct(const ScriptValueList& args) { · 19 unmodified lines
139142
140143 ScriptValue ScriptValueV8Wrapper::construct(const ScriptValue& arguments) {
141144 auto isolate = _engine->getIsolate();
142− Q_ASSERT(isolate->IsCurrent());
145+ v8::Locker locker(isolate);
146+ v8::Isolate::Scope isolateScope(isolate);
143147 v8::HandleScope handleScope(isolate);
144148 v8::Context::Scope contextScope(_engine->getContext());
145149 // V8TODO I'm not sure in what format arguments are yet, backtrace will show how it is used
@@ -170,7 +174,8 @@ ScriptValueIteratorPointer ScriptValueV8Wrapper::newIterator() const { · 24 unmodified lines
170174
171175 ScriptValue ScriptValueV8Wrapper::property(const QString& name, const ScriptValue::ResolveFlags &mode) const {
172176 auto isolate = _engine->getIsolate();
173− Q_ASSERT(isolate->IsCurrent());
177+ v8::Locker locker(_engine->getIsolate());
178+ v8::Isolate::Scope isolateScope(_engine->getIsolate());
174179 v8::HandleScope handleScope(isolate);
175180 v8::Context::Scope contextScope(_engine->getContext());
176181 if (_value.constGet()->IsObject()) {
@@ -181,6 +186,13 @@ ScriptValue ScriptValueV8Wrapper::property(const QString& name, const ScriptValu · 4 unmodified lines
181186 if (object->Get(_value.constGetContext(), key).ToLocal(&resultLocal)) {
182187 V8ScriptValue result(_engine->getIsolate(), resultLocal);
183188 return ScriptValue(new ScriptValueV8Wrapper(_engine, std::move(result)));
189+ } else {
190+ QString parentValueQString("");
191+ v8::Local<v8::String> parentValueString;
192+ if (_value.constGet()->ToDetailString(_engine->getContext()).ToLocal(&parentValueString)) {
193+ QString(*v8::String::Utf8Value(isolate, parentValueString));
194+ }
195+ qDebug() << "Failed to get property, parent of value: " << name << ", parent type: " << QString(*v8::String::Utf8Value(isolate, _value.constGet()->TypeOf(isolate))) << " parent value: " << parentValueQString;
184196 }
185197 }
186198 qDebug() << "Failed to get property, parent of value: " << name << " is not a V8 object, reported type: " << QString(*v8::String::Utf8Value(isolate, _value.constGet()->TypeOf(isolate)));
@@ -194,7 +206,8 @@ ScriptValue ScriptValueV8Wrapper::property(const QString& name, const ScriptValu · 7 unmodified lines
194206
195207 ScriptValue ScriptValueV8Wrapper::property(quint32 arrayIndex, const ScriptValue::ResolveFlags& mode) const {
196208 auto isolate = _engine->getIsolate();
197− Q_ASSERT(isolate->IsCurrent());
209+ v8::Locker locker(isolate);
210+ v8::Isolate::Scope isolateScope(isolate);
198211 v8::HandleScope handleScope(isolate);
199212 v8::Context::Scope contextScope(_engine->getContext());
200213 if (_value.constGet()->IsObject()) {
@@ -215,7 +228,8 @@ ScriptValue ScriptValueV8Wrapper::property(quint32 arrayIndex, const ScriptValue · 14 unmodified lines
215228
216229 void ScriptValueV8Wrapper::setData(const ScriptValue& value) {
217230 auto isolate = _engine->getIsolate();
218− Q_ASSERT(isolate->IsCurrent());
231+ v8::Locker locker(isolate);
232+ v8::Isolate::Scope isolateScope(isolate);
219233 v8::HandleScope handleScope(isolate);
220234 v8::Context::Scope contextScope(_engine->getContext());
221235 V8ScriptValue unwrapped = fullUnwrap(value);
@@ -225,7 +239,8 @@ void ScriptValueV8Wrapper::setData(const ScriptValue& value) { · 3 unmodified lines
225239 void ScriptValueV8Wrapper::setProperty(const QString& name, const ScriptValue& value, const ScriptValue::PropertyFlags& flags) {
226240 Q_ASSERT(flags != ScriptValue::PropertyGetter || flags != ScriptValue::PropertySetter);
227241 auto isolate = _engine->getIsolate();
228− Q_ASSERT(isolate->IsCurrent());
242+ v8::Locker locker(_engine->getIsolate());
243+ v8::Isolate::Scope isolateScope(_engine->getIsolate());
229244 v8::HandleScope handleScope(isolate);
230245 v8::Context::Scope contextScope(_engine->getContext());
231246 V8ScriptValue unwrapped = fullUnwrap(value);
@@ -256,7 +271,8 @@ void ScriptValueV8Wrapper::setProperty(const QString& name, const ScriptValue& v · 24 unmodified lines
256271
257272 void ScriptValueV8Wrapper::setProperty(quint32 arrayIndex, const ScriptValue& value, const ScriptValue::PropertyFlags& flags) {
258273 auto isolate = _engine->getIsolate();
259− Q_ASSERT(isolate->IsCurrent());
274+ v8::Locker locker(isolate);
275+ v8::Isolate::Scope isolateScope(isolate);
260276 v8::HandleScope handleScope(isolate);
261277 v8::Context::Scope contextScope(_engine->getContext());
262278 V8ScriptValue unwrapped = fullUnwrap(value);
@@ -275,7 +291,8 @@ void ScriptValueV8Wrapper::setProperty(quint32 arrayIndex, const ScriptValue& va · 12 unmodified lines
275291
276292 void ScriptValueV8Wrapper::setPrototype(const ScriptValue& prototype) {
277293 auto isolate = _engine->getIsolate();
278− Q_ASSERT(isolate->IsCurrent());
294+ v8::Locker locker(isolate);
295+ v8::Isolate::Scope isolateScope(isolate);
279296 v8::HandleScope handleScope(isolate);
280297 v8::Context::Scope contextScope(_engine->getContext());
281298 ScriptValueV8Wrapper* unwrappedPrototype = unwrap(prototype);
@@ -294,7 +311,8 @@ void ScriptValueV8Wrapper::setPrototype(const ScriptValue& prototype) { · 12 unmodified lines
294311
295312 bool ScriptValueV8Wrapper::strictlyEquals(const ScriptValue& other) const {
296313 auto isolate = _engine->getIsolate();
297− Q_ASSERT(isolate->IsCurrent());
314+ v8::Locker locker(isolate);
315+ v8::Isolate::Scope isolateScope(isolate);
298316 v8::HandleScope handleScope(isolate);
299317 v8::Context::Scope contextScope(_engine->getContext());
300318 ScriptValueV8Wrapper* unwrappedOther = unwrap(other);
@@ -303,7 +321,8 @@ bool ScriptValueV8Wrapper::strictlyEquals(const ScriptValue& other) const { · 2 unmodified lines
303321
304322 bool ScriptValueV8Wrapper::toBool() const {
305323 auto isolate = _engine->getIsolate();
306− Q_ASSERT(isolate->IsCurrent());
324+ v8::Locker locker(isolate);
325+ v8::Isolate::Scope isolateScope(isolate);
307326 v8::HandleScope handleScope(isolate);
308327 v8::Context::Scope contextScope(_engine->getContext());
309328 return _value.constGet()->ToBoolean(_engine->getIsolate())->Value();
@@ -311,7 +330,8 @@ bool ScriptValueV8Wrapper::toBool() const { · 1 unmodified line
311330
312331 qint32 ScriptValueV8Wrapper::toInt32() const {
313332 auto isolate = _engine->getIsolate();
314− Q_ASSERT(isolate->IsCurrent());
333+ v8::Locker locker(isolate);
334+ v8::Isolate::Scope isolateScope(isolate);
315335 v8::HandleScope handleScope(isolate);
316336 v8::Context::Scope contextScope(_engine->getContext());
317337 v8::Local<v8::Integer> integer;
@@ -323,7 +343,8 @@ qint32 ScriptValueV8Wrapper::toInt32() const { · 5 unmodified lines
323343
324344 double ScriptValueV8Wrapper::toInteger() const {
325345 auto isolate = _engine->getIsolate();
326− Q_ASSERT(isolate->IsCurrent());
346+ v8::Locker locker(isolate);
347+ v8::Isolate::Scope isolateScope(isolate);
327348 v8::HandleScope handleScope(isolate);
328349 v8::Context::Scope contextScope(_engine->getContext());
329350 v8::Local<v8::Integer> integer;
@@ -335,7 +356,8 @@ double ScriptValueV8Wrapper::toInteger() const { · 5 unmodified lines
335356
336357 double ScriptValueV8Wrapper::toNumber() const {
337358 auto isolate = _engine->getIsolate();
338− Q_ASSERT(isolate->IsCurrent());
359+ v8::Locker locker(isolate);
360+ v8::Isolate::Scope isolateScope(isolate);
339361 v8::HandleScope handleScope(isolate);
340362 v8::Context::Scope contextScope(_engine->getContext());
341363 v8::Local<v8::Number> number;
@@ -347,7 +369,8 @@ double ScriptValueV8Wrapper::toNumber() const { · 5 unmodified lines
347369
348370 QString ScriptValueV8Wrapper::toString() const {
349371 auto isolate = _engine->getIsolate();
350− Q_ASSERT(isolate->IsCurrent());
372+ v8::Locker locker(isolate);
373+ v8::Isolate::Scope isolateScope(isolate);
351374 v8::HandleScope handleScope(isolate);
352375 v8::Context::Scope contextScope(_engine->getContext());
353376 v8::String::Utf8Value string(_engine->getIsolate(), _value.constGet());
@@ -357,7 +380,8 @@ QString ScriptValueV8Wrapper::toString() const { · 3 unmodified lines
357380
358381 quint16 ScriptValueV8Wrapper::toUInt16() const {
359382 auto isolate = _engine->getIsolate();
360− Q_ASSERT(isolate->IsCurrent());
383+ v8::Locker locker(isolate);
384+ v8::Isolate::Scope isolateScope(isolate);
361385 v8::HandleScope handleScope(isolate);
362386 v8::Context::Scope contextScope(_engine->getContext());
363387 v8::Local<v8::Uint32> integer;
@@ -369,7 +393,8 @@ quint16 ScriptValueV8Wrapper::toUInt16() const { · 5 unmodified lines
369393
370394 quint32 ScriptValueV8Wrapper::toUInt32() const {
371395 auto isolate = _engine->getIsolate();
372− Q_ASSERT(isolate->IsCurrent());
396+ v8::Locker locker(isolate);
397+ v8::Isolate::Scope isolateScope(isolate);
373398 v8::HandleScope handleScope(isolate);
374399 v8::Context::Scope contextScope(_engine->getContext());
375400 v8::Local<v8::Uint32> integer;
@@ -401,7 +426,8 @@ QObject* ScriptValueV8Wrapper::toQObject() const { · 25 unmodified lines
401426
402427 bool ScriptValueV8Wrapper::equals(const ScriptValue& other) const {
403428 auto isolate = _engine->getIsolate();
404− Q_ASSERT(isolate->IsCurrent());
429+ v8::Locker locker(isolate);
430+ v8::Isolate::Scope isolateScope(isolate);
405431 v8::HandleScope handleScope(isolate);
406432 v8::Context::Scope contextScope(_engine->getContext());
407433 ScriptValueV8Wrapper* unwrappedOther = unwrap(other);
@@ -420,7 +446,8 @@ bool ScriptValueV8Wrapper::equals(const ScriptValue& other) const { · 12 unmodified lines
420446
421447 bool ScriptValueV8Wrapper::isArray() const {
422448 auto isolate = _engine->getIsolate();
423− Q_ASSERT(isolate->IsCurrent());
449+ v8::Locker locker(isolate);
450+ v8::Isolate::Scope isolateScope(isolate);
424451 v8::HandleScope handleScope(isolate);
425452 v8::Context::Scope contextScope(_engine->getContext());
426453 return _value.constGet()->IsArray();
@@ -428,7 +455,8 @@ bool ScriptValueV8Wrapper::isArray() const { · 1 unmodified line
428455
429456 bool ScriptValueV8Wrapper::isBool() const {
430457 auto isolate = _engine->getIsolate();
431− Q_ASSERT(isolate->IsCurrent());
458+ v8::Locker locker(isolate);
459+ v8::Isolate::Scope isolateScope(isolate);
432460 v8::HandleScope handleScope(isolate);
433461 v8::Context::Scope contextScope(_engine->getContext());
434462 return _value.constGet()->IsBoolean();
@@ -446,7 +474,8 @@ bool ScriptValueV8Wrapper::isError() const { · 11 unmodified lines
446474
447475 bool ScriptValueV8Wrapper::isFunction() const {
448476 auto isolate = _engine->getIsolate();
449− Q_ASSERT(isolate->IsCurrent());
477+ v8::Locker locker(isolate);
478+ v8::Isolate::Scope isolateScope(isolate);
450479 v8::HandleScope handleScope(isolate);
451480 v8::Context::Scope contextScope(_engine->getContext());
452481 return _value.constGet()->IsFunction();
@@ -454,7 +483,8 @@ bool ScriptValueV8Wrapper::isFunction() const { · 1 unmodified line
454483
455484 bool ScriptValueV8Wrapper::isNumber() const {
456485 auto isolate = _engine->getIsolate();
457− Q_ASSERT(isolate->IsCurrent());
486+ v8::Locker locker(isolate);
487+ v8::Isolate::Scope isolateScope(isolate);
458488 v8::HandleScope handleScope(isolate);
459489 v8::Context::Scope contextScope(_engine->getContext());
460490 return _value.constGet()->IsNumber();
@@ -462,7 +492,8 @@ bool ScriptValueV8Wrapper::isNumber() const { · 1 unmodified line
462492
463493 bool ScriptValueV8Wrapper::isNull() const {
464494 auto isolate = _engine->getIsolate();
465− Q_ASSERT(isolate->IsCurrent());
495+ v8::Locker locker(isolate);
496+ v8::Isolate::Scope isolateScope(isolate);
466497 v8::HandleScope handleScope(isolate);
467498 v8::Context::Scope contextScope(_engine->getContext());
468499 return _value.constGet()->IsNull();
@@ -470,7 +501,8 @@ bool ScriptValueV8Wrapper::isNull() const { · 1 unmodified line
470501
471502 bool ScriptValueV8Wrapper::isObject() const {
472503 auto isolate = _engine->getIsolate();
473− Q_ASSERT(isolate->IsCurrent());
504+ v8::Locker locker(isolate);
505+ v8::Isolate::Scope isolateScope(isolate);
474506 v8::HandleScope handleScope(isolate);
475507 v8::Context::Scope contextScope(_engine->getContext());
476508 return _value.constGet()->IsObject();
@@ -478,7 +510,8 @@ bool ScriptValueV8Wrapper::isObject() const { · 1 unmodified line
478510
479511 bool ScriptValueV8Wrapper::isString() const {
480512 auto isolate = _engine->getIsolate();
481− Q_ASSERT(isolate->IsCurrent());
513+ v8::Locker locker(isolate);
514+ v8::Isolate::Scope isolateScope(isolate);
482515 v8::HandleScope handleScope(isolate);
483516 v8::Context::Scope contextScope(_engine->getContext());
484517 return _value.constGet()->IsString();
@@ -486,26 +519,30 @@ bool ScriptValueV8Wrapper::isString() const { · 1 unmodified line
486519
487520 bool ScriptValueV8Wrapper::isUndefined() const {
488521 auto isolate = _engine->getIsolate();
489− Q_ASSERT(isolate->IsCurrent());
522+ v8::Locker locker(isolate);
523+ v8::Isolate::Scope isolateScope(isolate);
490524 v8::HandleScope handleScope(isolate);
491525 v8::Context::Scope contextScope(_engine->getContext());
492526 return _value.constGet()->IsUndefined();
493527 }
494528
495529 bool ScriptValueV8Wrapper::isValid() const {
496− //V8TODO
497530 auto isolate = _engine->getIsolate();
498− Q_ASSERT(isolate->IsCurrent());
531+ v8::Locker locker(isolate);
532+ v8::Isolate::Scope isolateScope(isolate);
499533 v8::HandleScope handleScope(isolate);
500534 v8::Context::Scope contextScope(_engine->getContext());
535+ if (_value.constGet()->IsNullOrUndefined()) {
536+ return false;
537+ }
501538 return true;
502− //return _value.constGet()->IsValid();
503539 }
504540
505541 bool ScriptValueV8Wrapper::isVariant() const {
506542 //V8TODO
507543 auto isolate = _engine->getIsolate();
508− Q_ASSERT(isolate->IsCurrent());
544+ v8::Locker locker(isolate);
545+ v8::Isolate::Scope isolateScope(isolate);
509546 v8::HandleScope handleScope(isolate);
510547 v8::Context::Scope contextScope(_engine->getContext());
511548 return false;