Showing the changes to libraries/script-engine/src/v8/ScriptEngineV8_cast.cpp (1 of 8 files). Show all
Unified · Split
| @@ -292,9 +292,18 @@ int ScriptEngineV8::computeCastPenalty(const V8ScriptValue& v8Val, int destTypeI · 291 unmodified lines | ||
| 292 | 292 | } |
| 293 | 293 | |
| 294 | 294 | bool ScriptEngineV8::castValueToVariant(const V8ScriptValue& v8Val, QVariant& dest, int destTypeId) { |
| 295 | + v8::Locker locker(_v8Isolate); | |
| 296 | + v8::Isolate::Scope isolateScope(_v8Isolate); | |
| 295 | 297 | v8::HandleScope handleScope(_v8Isolate); |
| 298 | + v8::Context::Scope contextScope(_v8Context.Get(_v8Isolate)); | |
| 296 | 299 | const v8::Local<v8::Value> val = v8Val.constGet(); |
| 297 | 300 | |
| 301 | + // Conversion debugging: | |
| 302 | + if (destTypeId == QMetaType::QVariant && val->IsBoolean()) { | |
| 303 | + //It's for placing breakpoint here | |
| 304 | + qDebug() << "Conversion Debug: " << scriptValueDebugDetailsV8(v8Val); | |
| 305 | + } | |
| 306 | + | |
| 298 | 307 | // if we're not particularly interested in a specific type, try to detect if we're dealing with a registered type |
| 299 | 308 | if (destTypeId == QMetaType::UnknownType) { |
| 300 | 309 | QObject* obj = ScriptObjectV8Proxy::unwrap(v8Val); |
| @@ -376,9 +385,10 @@ bool ScriptEngineV8::castValueToVariant(const V8ScriptValue& v8Val, QVariant& de · 75 unmodified lines | ||
| 376 | 385 | } |
| 377 | 386 | // V8TODO |
| 378 | 387 | errorMessage = QString() + "Conversion failure: " + QString(*v8::String::Utf8Value(_v8Isolate, val->ToDetailString(getConstContext()).ToLocalChecked())) |
| 379 | − + "to variant. Destination type: " + QMetaType::typeName(destTypeId); | |
| 388 | + + "to variant. Destination type: " + QMetaType::typeName(destTypeId) +" details: "+ scriptValueDebugDetailsV8(v8Val); | |
| 380 | 389 | qDebug() << errorMessage; |
| 381 | − Q_ASSERT(false); | |
| 390 | + | |
| 391 | + //Q_ASSERT(false); | |
| 382 | 392 | //dest = val->ToVariant(); |
| 383 | 393 | break; |
| 384 | 394 | case QMetaType::Bool: |
| @@ -440,16 +450,16 @@ bool ScriptEngineV8::castValueToVariant(const V8ScriptValue& v8Val, QVariant& de · 55 unmodified lines | ||
| 440 | 450 | case QMetaType::QVariant: |
| 441 | 451 | if (val->IsUndefined()) { |
| 442 | 452 | dest = QVariant(); |
| 443 | − break; | |
| 453 | + return true; | |
| 444 | 454 | } |
| 445 | 455 | if (val->IsNull()) { |
| 446 | 456 | dest = QVariant::fromValue(nullptr); |
| 447 | − break; | |
| 457 | + return true; | |
| 448 | 458 | } |
| 449 | 459 | if (val->IsBoolean()) { |
| 450 | 460 | //V8TODO is it right isolate? What if value from different script engine is used here |
| 451 | 461 | dest = QVariant::fromValue(val->BooleanValue(_v8Isolate)); |
| 452 | − break; | |
| 462 | + return true; | |
| 453 | 463 | } |
| 454 | 464 | if (val->IsString()) { |
| 455 | 465 | //V8TODO is it right context? What if value from different script engine is used here |
| @@ -457,30 +467,30 @@ bool ScriptEngineV8::castValueToVariant(const V8ScriptValue& v8Val, QVariant& de · 1 unmodified line | ||
| 457 | 467 | Q_ASSERT(*string != nullptr); |
| 458 | 468 | dest = QVariant::fromValue(QString(*string)); |
| 459 | 469 | //dest = QVariant::fromValue(val->ToString(_v8Context.Get(_v8Isolate)).ToLocalChecked()->); |
| 460 | − break; | |
| 470 | + return true; | |
| 461 | 471 | } |
| 462 | 472 | if (val->IsNumber()) { |
| 463 | 473 | dest = QVariant::fromValue(val->ToNumber(_v8Context.Get(_v8Isolate)).ToLocalChecked()->Value()); |
| 464 | − break; | |
| 474 | + return true; | |
| 465 | 475 | } |
| 466 | 476 | { |
| 467 | 477 | QObject* obj = ScriptObjectV8Proxy::unwrap(v8Val); |
| 468 | 478 | if (obj) { |
| 469 | 479 | dest = QVariant::fromValue(obj); |
| 470 | − break; | |
| 480 | + return true; | |
| 471 | 481 | } |
| 472 | 482 | } |
| 473 | 483 | { |
| 474 | 484 | QVariant var = ScriptVariantV8Proxy::unwrap(v8Val); |
| 475 | 485 | if (var.isValid()) { |
| 476 | 486 | dest = var; |
| 477 | − break; | |
| 487 | + return true; | |
| 478 | 488 | } |
| 479 | 489 | } |
| 480 | 490 | errorMessage = QString() + "Conversion to variant failed: " + QString(*v8::String::Utf8Value(_v8Isolate, val->ToDetailString(getConstContext()).ToLocalChecked())) |
| 481 | − + " Destination type: " + QMetaType::typeName(destTypeId); | |
| 491 | + + " Destination type: " + QMetaType::typeName(destTypeId) + " Value details: " + scriptValueDebugDetailsV8(v8Val); | |
| 482 | 492 | qDebug() << errorMessage; |
| 483 | − break; | |
| 493 | + return false; | |
| 484 | 494 | default: |
| 485 | 495 | // check to see if this is a pointer to a QObject-derived object |
| 486 | 496 | if (QMetaType::typeFlags(destTypeId) & (QMetaType::PointerToQObject | QMetaType::TrackingPointerToQObject)) { |