Add V8 logging category

Rename logging category to overte
Make all V8 code use logging categories
This commit is contained in:
Dale Glass 2023-03-07 00:06:15 +01:00 committed by ksuprynowicz
parent 633319c111
commit 0fc2ab870a
10 changed files with 211 additions and 161 deletions

View file

@ -11,6 +11,7 @@
#include "ScriptEngineLogging.h"
Q_LOGGING_CATEGORY(scriptengine, "hifi.scriptengine")
Q_LOGGING_CATEGORY(scriptengine_module, "hifi.scriptengine.module")
Q_LOGGING_CATEGORY(scriptengine_script, "hifi.scriptengine.script")
Q_LOGGING_CATEGORY(scriptengine, "overte.scriptengine")
Q_LOGGING_CATEGORY(scriptengine_module, "overte.scriptengine.module")
Q_LOGGING_CATEGORY(scriptengine_script, "overte.scriptengine.script")

View file

@ -16,6 +16,8 @@
#include "ScriptEngineV8.h"
#include "ScriptValueV8Wrapper.h"
#include "ScriptEngineLoggingV8.h"
/*ScriptContextV8Wrapper::ScriptContextV8Wrapper(ScriptEngineV8* engine, const v8::Local<v8::Context> context) : _functionCallbackInfo(nullptr), _propertyCallbackInfo(nullptr), _engine(engine) {
_context.Reset(_engine->getIsolate(), context);
@ -178,7 +180,7 @@ ScriptValue ScriptContextV8Wrapper::throwError(const QString& text) {
v8::String::NewFromUtf8(_engine->getIsolate(), text.toStdString().c_str()).ToLocalChecked()));
return ScriptValue(new ScriptValueV8Wrapper(_engine, std::move(result)));
} else {
qWarning() << "throwError on a different thread not implemented yet, error value: " << text;
qCWarning(scriptengine_v8) << "throwError on a different thread not implemented yet, error value: " << text;
//return _engine->undefinedValue();
return ScriptValue();
}

View file

@ -0,0 +1,17 @@
//
// ScriptEngineLoggingV8.cpp
// libraries/script-engine/src/v8
//
// Created by Dale Glass on 06/03/2023
// Copyright 2023 Overte e.V.
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
//
#include "ScriptEngineLoggingV8.h"
Q_LOGGING_CATEGORY(scriptengine_v8, "overte.scriptengine.v8")
Q_LOGGING_CATEGORY(scriptengine_module_v8, "overte.scriptengine.module.v8")
Q_LOGGING_CATEGORY(scriptengine_script_v8, "overte.scriptengine.script.v8")

View file

@ -0,0 +1,25 @@
//
// ScriptEngineLoggingV8.h
// libraries/script-engine/src/v8
//
// Created by Dale Glass on 06/03/2023
// Copyright 2023 Overte e.V.
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
//
/// @addtogroup ScriptEngine
/// @{
#pragma once
#include <QLoggingCategory>
Q_DECLARE_LOGGING_CATEGORY(scriptengine_v8)
Q_DECLARE_LOGGING_CATEGORY(scriptengine_module_v8)
Q_DECLARE_LOGGING_CATEGORY(scriptengine_script_v8)
/// @}

View file

@ -51,6 +51,7 @@
#include "ScriptProgramV8Wrapper.h"
#include "ScriptValueV8Wrapper.h"
#include "V8Lambda.h"
#include "ScriptEngineLoggingV8.h"
static const int MAX_DEBUG_VALUE_LENGTH { 80 };
@ -62,11 +63,11 @@ bool ScriptEngineV8::IS_THREADSAFE_INVOCATION(const QThread* thread, const QStri
if (currentThread == thread) {
return true;
}
qCCritical(scriptengine) << QString("Scripting::%1 @ %2 -- ignoring thread-unsafe call from %3")
qCCritical(scriptengine_v8) << QString("Scripting::%1 @ %2 -- ignoring thread-unsafe call from %3")
.arg(method)
.arg(thread ? thread->objectName() : "(!thread)")
.arg(QThread::currentThread()->objectName());
qCDebug(scriptengine) << "(please resolve on the calling side by using invokeMethod, executeOnScriptThread, etc.)";
qCDebug(scriptengine_v8) << "(please resolve on the calling side by using invokeMethod, executeOnScriptThread, etc.)";
Q_ASSERT(false);
return false;
}
@ -206,7 +207,7 @@ QString Lambda::toString() const {
Lambda::~Lambda() {
#ifdef DEBUG_JS_LAMBDA_FUNCS
qDebug() << "~Lambda"
qCDebug(scriptengine_v8) << "~Lambda"
<< "this" << this;
#endif
}
@ -217,7 +218,7 @@ Lambda::Lambda(ScriptEngineV8* engine,
_engine(engine),
_operation(operation), _data(data) {
#ifdef DEBUG_JS_LAMBDA_FUNCS
qDebug() << "Lambda" << data.toString();
qCDebug(scriptengine_v8) << "Lambda" << data.toString();
#endif
}
V8ScriptValue Lambda::call() {
@ -285,10 +286,10 @@ ScriptEngineV8::ScriptEngineV8(ScriptManager *manager) : ScriptEngine(manager),
//v8::V8::SetFlagsFromString("--stack-size=256 --single-threaded");
v8::Platform* platform = getV8Platform();
v8::V8::InitializePlatform(platform);
v8::V8::Initialize(); qCDebug(scriptengine) << "V8 platform initialized";
v8::V8::Initialize(); qCDebug(scriptengine_v8) << "V8 platform initialized";
} );
_v8InitMutex.unlock();
qDebug() << "Creating new script engine";
qCDebug(scriptengine_v8) << "Creating new script engine";
{
v8::Isolate::CreateParams isolateParams;
isolateParams.array_buffer_allocator = v8::ArrayBuffer::Allocator::NewDefaultAllocator();
@ -342,7 +343,7 @@ ScriptEngineV8::ScriptEngineV8(ScriptManager *manager) : ScriptEngine(manager),
void ScriptEngineV8::registerEnum(const QString& enumName, QMetaEnum newEnum) {
if (!newEnum.isValid()) {
qCCritical(scriptengine) << "registerEnum called on invalid enum with name " << enumName;
qCCritical(scriptengine_v8) << "registerEnum called on invalid enum with name " << enumName;
return;
}
v8::Locker locker(_v8Isolate);
@ -360,7 +361,7 @@ void ScriptEngineV8::registerEnum(const QString& enumName, QMetaEnum newEnum) {
void ScriptEngineV8::registerValue(const QString& valueName, V8ScriptValue value) {
if (QThread::currentThread() != thread()) {
#ifdef THREAD_DEBUGGING
qCDebug(scriptengine) << "*** WARNING *** ScriptEngineV8::registerValue() called on wrong thread [" << QThread::currentThread() << "], invoking on correct thread [" << thread() << "]";
qCDebug(scriptengine_v8) << "*** WARNING *** ScriptEngineV8::registerValue() called on wrong thread [" << QThread::currentThread() << "], invoking on correct thread [" << thread() << "]";
#endif
QMetaObject::invokeMethod(this, "registerValue",
Q_ARG(const QString&, valueName),
@ -412,7 +413,7 @@ void ScriptEngineV8::registerValue(const QString& valueName, V8ScriptValue value
if (partsToGo > 0) {
if (!child->IsObject()) {
QString details = *v8::String::Utf8Value(_v8Isolate, child->ToDetailString(context).ToLocalChecked());
qCDebug(scriptengine) << "ScriptEngineV8::registerValue: Part of path is not an object: " << pathPart << " details: " << details;
qCDebug(scriptengine_v8) << "ScriptEngineV8::registerValue: Part of path is not an object: " << pathPart << " details: " << details;
Q_ASSERT(false);
}
partObject = v8::Local<v8::Object>::Cast(child);
@ -423,7 +424,7 @@ void ScriptEngineV8::registerValue(const QString& valueName, V8ScriptValue value
void ScriptEngineV8::registerGlobalObject(const QString& name, QObject* object) {
if (QThread::currentThread() != thread()) {
#ifdef THREAD_DEBUGGING
qCDebug(scriptengine) << "*** WARNING *** ScriptEngineV8::registerGlobalObject() called on wrong thread [" << QThread::currentThread() << "], invoking on correct thread [" << thread() << "] name:" << name;
qCDebug(scriptengine_v8) << "*** WARNING *** ScriptEngineV8::registerGlobalObject() called on wrong thread [" << QThread::currentThread() << "], invoking on correct thread [" << thread() << "] name:" << name;
#endif
QMetaObject::invokeMethod(this, "registerGlobalObject",
Q_ARG(const QString&, name),
@ -431,7 +432,7 @@ void ScriptEngineV8::registerGlobalObject(const QString& name, QObject* object)
return;
}
#ifdef THREAD_DEBUGGING
qCDebug(scriptengine) << "ScriptEngineV8::registerGlobalObject() called on thread [" << QThread::currentThread() << "] name:" << name;
qCDebug(scriptengine_v8) << "ScriptEngineV8::registerGlobalObject() called on thread [" << QThread::currentThread() << "] name:" << name;
#endif
/*bool is_isolate_exit_needed = false;
if(!_v8Isolate->IsCurrent() && !_v8Locker) {
@ -475,7 +476,7 @@ void ScriptEngineV8::registerFunction(const QString& name, ScriptEngine::Functio
//}
if (QThread::currentThread() != thread()) {
#ifdef THREAD_DEBUGGING
qCDebug(scriptengine) << "*** WARNING *** ScriptEngineV8::registerFunction() called on wrong thread [" << QThread::currentThread() << "], invoking on correct thread [" << thread() << "] name:" << name;
qCDebug(scriptengine_v8) << "*** WARNING *** ScriptEngineV8::registerFunction() called on wrong thread [" << QThread::currentThread() << "], invoking on correct thread [" << thread() << "] name:" << name;
#endif
QMetaObject::invokeMethod(this, "registerFunction",
Q_ARG(const QString&, name),
@ -484,7 +485,7 @@ void ScriptEngineV8::registerFunction(const QString& name, ScriptEngine::Functio
return;
}
#ifdef THREAD_DEBUGGING
qCDebug(scriptengine) << "ScriptEngineV8::registerFunction() called on thread [" << QThread::currentThread() << "] name:" << name;
qCDebug(scriptengine_v8) << "ScriptEngineV8::registerFunction() called on thread [" << QThread::currentThread() << "] name:" << name;
#endif
/*bool is_isolate_exit_needed = false;
@ -514,7 +515,7 @@ void ScriptEngineV8::registerFunction(const QString& name, ScriptEngine::Functio
void ScriptEngineV8::registerFunction(const QString& parent, const QString& name, ScriptEngine::FunctionSignature functionSignature, int numArguments) {
if (QThread::currentThread() != thread()) {
#ifdef THREAD_DEBUGGING
qCDebug(scriptengine) << "*** WARNING *** ScriptEngineV8::registerFunction() called on wrong thread [" << QThread::currentThread() << "], invoking on correct thread [" << thread() << "] parent:" << parent << "name:" << name;
qCDebug(scriptengine_v8) << "*** WARNING *** ScriptEngineV8::registerFunction() called on wrong thread [" << QThread::currentThread() << "], invoking on correct thread [" << thread() << "] parent:" << parent << "name:" << name;
#endif
QMetaObject::invokeMethod(this, "registerFunction",
Q_ARG(const QString&, name),
@ -523,7 +524,7 @@ void ScriptEngineV8::registerFunction(const QString& parent, const QString& name
return;
}
#ifdef THREAD_DEBUGGING
qCDebug(scriptengine) << "ScriptEngineV8::registerFunction() called on thread [" << QThread::currentThread() << "] parent:" << parent << "name:" << name;
qCDebug(scriptengine_v8) << "ScriptEngineV8::registerFunction() called on thread [" << QThread::currentThread() << "] parent:" << parent << "name:" << name;
#endif
/*bool is_isolate_exit_needed = false;
@ -554,7 +555,7 @@ void ScriptEngineV8::registerGetterSetter(const QString& name, ScriptEngine::Fun
ScriptEngine::FunctionSignature setter, const QString& parent) {
if (QThread::currentThread() != thread()) {
#ifdef THREAD_DEBUGGING
qCDebug(scriptengine) << "*** WARNING *** ScriptEngineV8::registerGetterSetter() called on wrong thread [" << QThread::currentThread() << "], invoking on correct thread [" << thread() << "] "
qCDebug(scriptengine_v8) << "*** WARNING *** ScriptEngineV8::registerGetterSetter() called on wrong thread [" << QThread::currentThread() << "], invoking on correct thread [" << thread() << "] "
" name:" << name << "parent:" << parent;
#endif
QMetaObject::invokeMethod(this, "registerGetterSetter",
@ -565,7 +566,7 @@ void ScriptEngineV8::registerGetterSetter(const QString& name, ScriptEngine::Fun
return;
}
#ifdef THREAD_DEBUGGING
qCDebug(scriptengine) << "ScriptEngineV8::registerGetterSetter() called on thread [" << QThread::currentThread() << "] name:" << name << "parent:" << parent;
qCDebug(scriptengine_v8) << "ScriptEngineV8::registerGetterSetter() called on thread [" << QThread::currentThread() << "] name:" << name << "parent:" << parent;
#endif
/*bool is_isolate_exit_needed = false;
@ -639,20 +640,20 @@ void ScriptEngineV8::registerGetterSetter(const QString& name, ScriptEngine::Fun
v8ObjectToSetProperty = v8ParentObject;
}
if (!v8ObjectToSetProperty->DefineProperty(getContext(), v8propertyName, propertyDescriptor).FromMaybe(false)) {
qCDebug(scriptengine) << "DefineProperty failed for registerGetterSetter \"" << name << "\" for parent: \""
qCDebug(scriptengine_v8) << "DefineProperty failed for registerGetterSetter \"" << name << "\" for parent: \""
<< parent << "\"";
}
//object.setProperty(name, setterFunction, ScriptValue::PropertySetter);
//object.setProperty(name, getterFunction, ScriptValue::PropertyGetter);
} else {
qCDebug(scriptengine) << "Parent object \"" << parent << "\" for registerGetterSetter \"" << name
qCDebug(scriptengine_v8) << "Parent object \"" << parent << "\" for registerGetterSetter \"" << name
<< "\" is not valid: ";
}
} else {
v8::Local<v8::String> v8propertyName =
v8::String::NewFromUtf8(_v8Isolate, name.toStdString().c_str()).ToLocalChecked();
if (!getContext()->Global()->DefineProperty(getContext(), v8propertyName, propertyDescriptor).FromMaybe(false)) {
qCDebug(scriptengine) << "DefineProperty failed for registerGetterSetter \"" << name << "\" for global object";
qCDebug(scriptengine_v8) << "DefineProperty failed for registerGetterSetter \"" << name << "\" for global object";
}
//globalObject().setProperty(name, setterFunction, ScriptValue::PropertySetter);
//globalObject().setProperty(name, getterFunction, ScriptValue::PropertyGetter);
@ -697,7 +698,7 @@ void ScriptEngineV8::storeGlobalObjectContents() {
}
_globalObjectContents.Reset(_v8Isolate, globalMemberObjects);
qDebug() << "ScriptEngineV8::storeGlobalObjectContents: " << globalMemberNames->Length() << " objects stored";
qCDebug(scriptengine_v8) << "ScriptEngineV8::storeGlobalObjectContents: " << globalMemberNames->Length() << " objects stored";
areGlobalObjectContentsStored = true;
}
@ -725,7 +726,7 @@ ScriptValue ScriptEngineV8::evaluateInClosure(const ScriptValue& _closure,
unwrappedProgram = ScriptProgramV8Wrapper::unwrap(_program);
if (unwrappedProgram == nullptr) {
_evaluatingCounter--;
qDebug(scriptengine) << "Cannot unwrap program for closure";
qCDebug(scriptengine_v8) << "Cannot unwrap program for closure";
Q_ASSERT(false);
return nullValue();
}
@ -737,7 +738,7 @@ ScriptValue ScriptEngineV8::evaluateInClosure(const ScriptValue& _closure,
unwrappedClosure = ScriptValueV8Wrapper::unwrap(_closure);
if (unwrappedClosure == nullptr) {
_evaluatingCounter--;
qDebug(scriptengine) << "Cannot unwrap closure";
qCDebug(scriptengine_v8) << "Cannot unwrap closure";
Q_ASSERT(false);
return nullValue();
}
@ -746,27 +747,27 @@ ScriptValue ScriptEngineV8::evaluateInClosure(const ScriptValue& _closure,
//const V8ScriptProgram& program = unwrappedProgram->toV8Value();
if (!closure.constGet()->IsObject()) {
_evaluatingCounter--;
qDebug(scriptengine) << "Unwrapped closure is not an object";
qCDebug(scriptengine_v8) << "Unwrapped closure is not an object";
Q_ASSERT(false);
return nullValue();
}
Q_ASSERT(closure.constGet()->IsObject());
closureObject = v8::Local<v8::Object>::Cast(closure.constGet());
qDebug() << "Closure object members:" << scriptValueDebugListMembersV8(closure);
qCDebug(scriptengine_v8) << "Closure object members:" << scriptValueDebugListMembersV8(closure);
v8::Local<v8::Object> testObject = v8::Object::New(_v8Isolate);
if(!testObject->Set(getContext(), v8::String::NewFromUtf8(_v8Isolate, "test_value").ToLocalChecked(), closureObject).FromMaybe(false)) {
Q_ASSERT(false);
}
qDebug() << "Test object members:" << scriptValueDebugListMembersV8(V8ScriptValue(this, testObject));
qCDebug(scriptengine_v8) << "Test object members:" << scriptValueDebugListMembersV8(V8ScriptValue(this, testObject));
if (!closureObject->Get(closure.constGetContext(), v8::String::NewFromUtf8(_v8Isolate, "global").ToLocalChecked())
.ToLocal(&closureGlobal)) {
_evaluatingCounter--;
qDebug(scriptengine) << "Cannot get global from unwrapped closure";
qCDebug(scriptengine_v8) << "Cannot get global from unwrapped closure";
Q_ASSERT(false);
return nullValue();
}
//qDebug() << "Closure global details:" << scriptValueDebugDetailsV8(V8ScriptValue(_v8Isolate, closureGlobal));
//qCDebug(scriptengine_v8) << "Closure global details:" << scriptValueDebugDetailsV8(V8ScriptValue(_v8Isolate, closureGlobal));
}
//oldGlobal = _v8Context.Get(_v8Isolate)->Global();
v8::Local<v8::Context> closureContext;
@ -794,7 +795,7 @@ ScriptValue ScriptEngineV8::evaluateInClosure(const ScriptValue& _closure,
v8::Context::Scope contextScope(closureContext);
//const V8ScriptValue& closure = unwrappedClosure->toV8Value();
if (!unwrappedProgram->compile()) {
qDebug(scriptengine) << "Can't compile script for evaluating in closure";
qCDebug(scriptengine_v8) << "Can't compile script for evaluating in closure";
Q_ASSERT(false);
popContext();
return nullValue();
@ -806,12 +807,12 @@ ScriptValue ScriptEngineV8::evaluateInClosure(const ScriptValue& _closure,
/*if (!closureObject->Get(closure.constGetContext(), v8::String::NewFromUtf8(_v8Isolate, "this").ToLocalChecked())
.ToLocal(&thiz)) {
_evaluatingCounter--;
qDebug(scriptengine) << "Empty this object in closure";
qCDebug(scriptengine_v8) << "Empty this object in closure";
Q_ASSERT(false);
return nullValue();
}*/
//thiz = closure.property("this");
//qDebug() << "Closure this details:" << scriptValueDebugDetailsV8(V8ScriptValue(_v8Isolate, thiz));
//qCDebug(scriptengine_v8) << "Closure this details:" << scriptValueDebugDetailsV8(V8ScriptValue(_v8Isolate, thiz));
// V8TODO:
/*if (thiz->IsObject()) {
#ifdef DEBUG_JS
@ -837,7 +838,7 @@ ScriptValue ScriptEngineV8::evaluateInClosure(const ScriptValue& _closure,
Q_ASSERT(false);
}
}
qDebug() << "ScriptEngineV8::evaluateInClosure: " << globalMemberNames->Length() << " objects added to global";
qCDebug(scriptengine_v8) << "ScriptEngineV8::evaluateInClosure: " << globalMemberNames->Length() << " objects added to global";
/*auto oldGlobalMemberNames = oldContext->Global()->GetPropertyNames(oldContext).ToLocalChecked();
//auto oldGlobalMemberNames = oldContext->Global()->GetPropertyNames(closureContext).ToLocalChecked();
@ -874,15 +875,15 @@ ScriptValue ScriptEngineV8::evaluateInClosure(const ScriptValue& _closure,
} else {
membersString = QString(" Is not an object");
}*/
//qDebug(scriptengine) << "Closure global before run:" << membersString;
//qCDebug(scriptengine_v8) << "Closure global before run:" << membersString;
auto maybeResult = program.constGet()->GetUnboundScript()->BindToCurrentContext()->Run(closureContext);
//qDebug(scriptengine) << "Closure after run:" << scriptValueDebugDetailsV8(closure);
//qCDebug(scriptengine_v8) << "Closure after run:" << scriptValueDebugDetailsV8(closure);
v8::Local<v8::Value> v8Result;
if (!maybeResult.ToLocal(&v8Result)) {
v8::String::Utf8Value utf8Value(getIsolate(), tryCatch.Exception());
QString errorMessage = QString(*utf8Value);
qWarning(scriptengine) << __FUNCTION__ << "---------- hasCaught:" << errorMessage;
qWarning(scriptengine) << __FUNCTION__ << "---------- tryCatch details:" << formatErrorMessageFromTryCatch(tryCatch);
qCWarning(scriptengine_v8) << __FUNCTION__ << "---------- hasCaught:" << errorMessage;
qCWarning(scriptengine_v8) << __FUNCTION__ << "---------- tryCatch details:" << formatErrorMessageFromTryCatch(tryCatch);
//V8TODO: better error reporting
}
@ -919,7 +920,7 @@ ScriptValue ScriptEngineV8::evaluate(const QString& sourceCode, const QString& f
if (QThread::currentThread() != thread()) {
ScriptValue result;
#ifdef THREAD_DEBUGGING
qCDebug(scriptengine) << "*** WARNING *** ScriptEngineV8::evaluate() called on wrong thread [" << QThread::currentThread() << "], invoking on correct thread [" << thread() << "] "
qCDebug(scriptengine_v8) << "*** WARNING *** ScriptEngineV8::evaluate() called on wrong thread [" << QThread::currentThread() << "], invoking on correct thread [" << thread() << "] "
"sourceCode:" << sourceCode << " fileName:" << fileName;
#endif
BLOCKING_INVOKE_METHOD(this, "evaluate",
@ -944,7 +945,7 @@ ScriptValue ScriptEngineV8::evaluate(const QString& sourceCode, const QString& f
_evaluatingCounter--;
return nullValue();
}
//qCDebug(scriptengine) << "Script compilation succesful: " << fileName;
//qCDebug(scriptengine_v8) << "Script compilation succesful: " << fileName;
//V8TODO
/*auto syntaxError = lintScript(sourceCode, fileName);
@ -971,7 +972,7 @@ ScriptValue ScriptEngineV8::evaluate(const QString& sourceCode, const QString& f
Q_ASSERT(tryCatchRun.HasCaught());
auto runError = tryCatchRun.Message();
ScriptValue errorValue(new ScriptValueV8Wrapper(this, V8ScriptValue(this, runError->Get())));
qCDebug(scriptengine) << "Running script: \"" << fileName << "\" " << formatErrorMessageFromTryCatch(tryCatchRun);
qCDebug(scriptengine_v8) << "Running script: \"" << fileName << "\" " << formatErrorMessageFromTryCatch(tryCatchRun);
//V8TODO
@ -995,7 +996,7 @@ void ScriptEngineV8::setUncaughtEngineException(const QString &reason, const QSt
void ScriptEngineV8::setUncaughtException(const v8::TryCatch &tryCatch, const QString& info) {
if (!tryCatch.HasCaught()) {
qCWarning(scriptengine) << "setUncaughtException called without exception";
qCWarning(scriptengine_v8) << "setUncaughtException called without exception";
clearExceptions();
return;
}
@ -1041,7 +1042,7 @@ void ScriptEngineV8::setUncaughtException(const v8::TryCatch &tryCatch, const QS
}
void ScriptEngineV8::setUncaughtException(std::shared_ptr<ScriptException> uncaughtException) {
qCDebug(scriptengine) << "Emitting exception:" << uncaughtException;
qCDebug(scriptengine_v8) << "Emitting exception:" << uncaughtException;
_uncaughtException = uncaughtException;
auto copy = uncaughtException->clone();
@ -1105,7 +1106,7 @@ Q_INVOKABLE ScriptValue ScriptEngineV8::evaluate(const ScriptProgramPointer& pro
if (QThread::currentThread() != thread()) {
ScriptValue result;
#ifdef THREAD_DEBUGGING
qCDebug(scriptengine) << "*** WARNING *** ScriptEngineV8::evaluate() called on wrong thread [" << QThread::currentThread() << "], invoking on correct thread [" << thread() << "] "
qCDebug(scriptengine_v8) << "*** WARNING *** ScriptEngineV8::evaluate() called on wrong thread [" << QThread::currentThread() << "], invoking on correct thread [" << thread() << "] "
"sourceCode:" << sourceCode << " fileName:" << fileName;
#endif
BLOCKING_INVOKE_METHOD(this, "evaluate",
@ -1498,14 +1499,14 @@ QThread* ScriptEngineV8::thread() const {
void ScriptEngineV8::setThread(QThread* thread) {
if (_v8Isolate->IsCurrent()) {
_v8Isolate->Exit();
qDebug() << "Script engine " << objectName() << " exited isolate";
qCDebug(scriptengine_v8) << "Script engine " << objectName() << " exited isolate";
}
Q_ASSERT(QObject::thread() == QThread::currentThread());
/*if (_v8Locker) {
_v8Locker.reset();
}*/
moveToThread(thread);
qDebug() << "Moved script engine " << objectName() << " to different thread";
qCDebug(scriptengine_v8) << "Moved script engine " << objectName() << " to different thread";
}
/*void ScriptEngineV8::enterIsolateOnThisThread() {
@ -1514,7 +1515,7 @@ void ScriptEngineV8::setThread(QThread* thread) {
_v8Locker.reset(new v8::Locker(_v8Isolate));
if (!_v8Isolate->IsCurrent()) {
_v8Isolate->Enter();
qDebug() << "Script engine " << objectName() << " entered isolate on a new thread";
qCDebug(scriptengine_v8) << "Script engine " << objectName() << " entered isolate on a new thread";
}
}*/
@ -1534,14 +1535,14 @@ bool ScriptEngineV8::raiseException(const QString& error, const QString &reason)
bool ScriptEngineV8::raiseException(const ScriptValue& exception, const QString &reason) {
//V8TODO
//Q_ASSERT(false);
// qCritical() << "Script exception occurred: " << exception.toString();
// qCCritical(scriptengine_v8) << "Script exception occurred: " << exception.toString();
// ScriptValueV8Wrapper* unwrapped = ScriptValueV8Wrapper::unwrap(exception);
// V8ScriptValue qException = unwrapped ? unwrapped->toV8Value() : QScriptEngine::newVariant(exception.toVariant());
// emit
//return raiseException(qException);
// qCCritical(scriptengine) << "Raise exception for reason" << reason << "NOT IMPLEMENTED!";
// qCCritical(scriptengine_v8) << "Raise exception for reason" << reason << "NOT IMPLEMENTED!";
// return false;
return raiseException(ScriptValueV8Wrapper::fullUnwrap(this, exception));
@ -1615,9 +1616,9 @@ void ScriptEngineV8::compileTest() {
v8::Local<v8::Script> script;
v8::ScriptOrigin scriptOrigin(getIsolate(), v8::String::NewFromUtf8(getIsolate(),"test").ToLocalChecked());
if (v8::Script::Compile(getContext(), v8::String::NewFromUtf8(getIsolate(), "print(\"hello world\");").ToLocalChecked(), &scriptOrigin).ToLocal(&script)) {
qCDebug(scriptengine) << "Compile test successful";
qCDebug(scriptengine_v8) << "Compile test successful";
} else {
qCDebug(scriptengine) << "Compile test failed";
qCDebug(scriptengine_v8) << "Compile test failed";
Q_ASSERT(false);
}
}
@ -1683,9 +1684,9 @@ QString ScriptEngineV8::scriptValueDebugDetailsV8(const V8ScriptValue &v8Value)
void ScriptEngineV8::logBacktrace(const QString &title) {
QStringList backtrace = currentContext()->backtrace();
qDebug(scriptengine) << title;
qCDebug(scriptengine_v8) << title;
for (int n = 0; n < backtrace.length(); n++) {
qDebug(scriptengine) << backtrace[n];
qCDebug(scriptengine_v8) << backtrace[n];
}
}

View file

@ -25,6 +25,7 @@
#include "ScriptObjectV8Proxy.h"
#include "ScriptValueV8Wrapper.h"
#include "ScriptEngineLoggingV8.h"
void ScriptEngineV8::setDefaultPrototype(int metaTypeId, const ScriptValue& prototype) {
ScriptValueV8Wrapper* unwrappedPrototype = ScriptValueV8Wrapper::unwrap(prototype);
@ -310,7 +311,7 @@ bool ScriptEngineV8::castValueToVariant(const V8ScriptValue& v8Val, QVariant& de
// Conversion debugging:
/*if (destTypeId == QMetaType::QVariant && val->IsBoolean()) {
//It's for placing breakpoint here
qDebug() << "Conversion Debug: " << scriptValueDebugDetailsV8(v8Val);
qCDebug(scriptengine_v8) << "Conversion Debug: " << scriptValueDebugDetailsV8(v8Val);
}*/
// if we're not particularly interested in a specific type, try to detect if we're dealing with a registered type
@ -408,7 +409,7 @@ bool ScriptEngineV8::castValueToVariant(const V8ScriptValue& v8Val, QVariant& de
// V8TODO
errorMessage = QString() + "Conversion failure: " + QString(*v8::String::Utf8Value(_v8Isolate, val->ToDetailString(getConstContext()).ToLocalChecked()))
+ "to variant. Destination type: " + QMetaType::typeName(destTypeId) +" details: "+ scriptValueDebugDetailsV8(v8Val);
qDebug() << errorMessage;
qCDebug(scriptengine_v8) << errorMessage;
//Q_ASSERT(false);
//dest = val->ToVariant();
@ -471,7 +472,7 @@ bool ScriptEngineV8::castValueToVariant(const V8ScriptValue& v8Val, QVariant& de
// V8TODO: this is to diagnose a really weird segfault where it looks like only half of the QPointer is set to null upon object deletion
uint64_t ptrVal = (uint64_t)(ScriptObjectV8Proxy::unwrap(v8Val));
if ((uint32_t)(ptrVal) == 0 && ptrVal != 0) {
qDebug() << "ScriptEngineV8::castValueToVariant pointer bug happened";
qCDebug(scriptengine_v8) << "ScriptEngineV8::castValueToVariant pointer bug happened";
//Q_ASSERT(false);
return false;
}
@ -531,7 +532,7 @@ bool ScriptEngineV8::castValueToVariant(const V8ScriptValue& v8Val, QVariant& de
//V8TODO is v8::Array to QVariant conversion used anywhere?
errorMessage = QString() + "Conversion to variant failed: " + QString(*v8::String::Utf8Value(_v8Isolate, val->ToDetailString(getConstContext()).ToLocalChecked()))
+ " Destination type: " + QMetaType::typeName(destTypeId) + " Value details: " + scriptValueDebugDetailsV8(v8Val);
qDebug() << errorMessage;
qCDebug(scriptengine_v8) << errorMessage;
return false;
default:
// check to see if this is a pointer to a QObject-derived object
@ -570,7 +571,7 @@ bool ScriptEngineV8::castValueToVariant(const V8ScriptValue& v8Val, QVariant& de
// V8TODO
errorMessage = QString() + "Conversion failure: " + QString(*v8::String::Utf8Value(_v8Isolate, val->ToDetailString(getConstContext()).ToLocalChecked()))
+ "to variant. Destination type: " + QMetaType::typeName(destTypeId);
qDebug() << errorMessage;
qCDebug(scriptengine_v8) << errorMessage;
if(destTypeId == QMetaType::QVariant) {
Q_ASSERT(false);
}
@ -591,7 +592,7 @@ bool ScriptEngineV8::convertJSArrayToVariant(v8::Local<v8::Array> array, QVarian
for (int i = 0; i < length; i++) {
v8::Local<v8::Value> v8Property;
if (!array->Get(context, i).ToLocal(&v8Property)) {
qDebug() << "ScriptEngineV8::convertJSArrayToVariant could not get property: " + QString(i);
qCDebug(scriptengine_v8) << "ScriptEngineV8::convertJSArrayToVariant could not get property: " + QString(i);
continue;
}
QVariant property;
@ -599,7 +600,7 @@ bool ScriptEngineV8::convertJSArrayToVariant(v8::Local<v8::Array> array, QVarian
if (castValueToVariant(V8ScriptValue(this, v8Property), property, QMetaType::UnknownType)) {
properties.append(property);
} else {
qDebug() << "ScriptEngineV8::convertJSArrayToVariant could cast property to variant: " + QString(i);
qCDebug(scriptengine_v8) << "ScriptEngineV8::convertJSArrayToVariant could cast property to variant: " + QString(i);
;
}
}
@ -613,7 +614,7 @@ bool ScriptEngineV8::convertJSObjectToVariant(v8::Local<v8::Object> object, QVar
v8::Context::Scope contextScope(context);
v8::Local<v8::Array> names;
if(!object->GetPropertyNames(context).ToLocal(&names)) {
qDebug() << "ScriptEngineV8::convertJSObjectToVariant could not get property names";
qCDebug(scriptengine_v8) << "ScriptEngineV8::convertJSObjectToVariant could not get property names";
return false;
}
int length = names->Length();
@ -622,7 +623,7 @@ bool ScriptEngineV8::convertJSObjectToVariant(v8::Local<v8::Object> object, QVar
v8::Local<v8::Value> v8Property;
QString name = *v8::String::Utf8Value(_v8Isolate, names->Get(context, i).ToLocalChecked());
if (!object->Get(context, names->Get(context, i).ToLocalChecked()).ToLocal(&v8Property)) {
qDebug() << "ScriptEngineV8::convertJSObjectToVariant could not get property: " + name;
qCDebug(scriptengine_v8) << "ScriptEngineV8::convertJSObjectToVariant could not get property: " + name;
continue;
}
QVariant property;
@ -630,7 +631,7 @@ bool ScriptEngineV8::convertJSObjectToVariant(v8::Local<v8::Object> object, QVar
if (castValueToVariant(V8ScriptValue(this, v8Property), property, QMetaType::UnknownType)) {
properties.insert( name, property);
} else {
qDebug() << "ScriptEngineV8::convertJSObjectToVariant could cast property to variant: " + name;
qCDebug(scriptengine_v8) << "ScriptEngineV8::convertJSObjectToVariant could cast property to variant: " + name;
;
}
}
@ -648,7 +649,7 @@ QString ScriptEngineV8::valueType(const V8ScriptValue& v8Val) {
//v8::HandleScope handleScope(const_cast<v8::Isolate*>(v8Val.constGetIsolate()));
const v8::Local<v8::Value> val = v8Val.constGet();
if (val->IsUndefined()) {
return "undefined";
}
@ -682,7 +683,7 @@ QString ScriptEngineV8::valueType(const V8ScriptValue& v8Val) {
if (castValueToVariant(v8Val, dest, QMetaType::QVariant)) {
return dest.typeName();
}
qDebug() << "Cast to variant failed";
qCDebug(scriptengine_v8) << "Cast to variant failed";
// V8TODO: what to return here?
return "undefined";
}
@ -780,7 +781,7 @@ V8ScriptValue ScriptEngineV8::castVariantToValue(const QVariant& val) {
}
// just do a generic variant
//V8TODO
qDebug() << "ScriptEngineV8::castVariantToValue failed for " << QMetaType::typeName(valTypeId);
qCDebug(scriptengine_v8) << "ScriptEngineV8::castVariantToValue failed for " << QMetaType::typeName(valTypeId);
logBacktrace("ScriptEngineV8::castVariantToValue failed");
//Q_ASSERT(false);
return V8ScriptValue(this, v8::Undefined(_v8Isolate));

View file

@ -22,6 +22,7 @@
#include "ScriptContextV8Wrapper.h"
#include "ScriptValueV8Wrapper.h"
#include "ScriptEngineLoggingV8.h"
//V8TODO: is this needed for anything? It could cause trouble with multithreading if V8ScriptContext is v8::Persistent
//Q_DECLARE_METATYPE(V8ScriptContext*)
@ -110,7 +111,7 @@ V8ScriptValue ScriptObjectV8Proxy::newQObject(ScriptEngineV8* engine, QObject* o
break;
default:
ownsObject = false;
qCritical() << "Wrong ScriptEngine::ValueOwnership value: " << ownership;
qCCritical(scriptengine_v8) << "Wrong ScriptEngine::ValueOwnership value: " << ownership;
break;
}
@ -166,16 +167,16 @@ ScriptObjectV8Proxy* ScriptObjectV8Proxy::unwrapProxy(const V8ScriptValue& val)
return nullptr;
}
if (!v8Value->IsObject()) {
//qDebug(scriptengine) << "Cannot unwrap proxy - value is not an object";
//qCDebug(scriptengine_v8) << "Cannot unwrap proxy - value is not an object";
return nullptr;
}
v8::Local<v8::Object> v8Object = v8::Local<v8::Object>::Cast(v8Value);
if (v8Object->InternalFieldCount() != 3) {
//qDebug(scriptengine) << "Cannot unwrap proxy - wrong number of internal fields";
//qCDebug(scriptengine_v8) << "Cannot unwrap proxy - wrong number of internal fields";
return nullptr;
}
if (v8Object->GetAlignedPointerFromInternalField(0) != internalPointsToQObjectProxy) {
qDebug(scriptengine) << "Cannot unwrap proxy - internal fields don't point to object proxy";
qCDebug(scriptengine_v8) << "Cannot unwrap proxy - internal fields don't point to object proxy";
return nullptr;
}
return reinterpret_cast<ScriptObjectV8Proxy*>(v8Object->GetAlignedPointerFromInternalField(1));
@ -189,20 +190,20 @@ ScriptObjectV8Proxy* ScriptObjectV8Proxy::unwrapProxy(v8::Isolate* isolate, v8::
//v8::Local<v8::Context> context = val.constGetContext();
//v8::Context::Scope contextScope(context);
if (value->IsNullOrUndefined()) {
//qDebug(scriptengine) << "Cannot unwrap proxy - value is not an object";
//qCDebug(scriptengine_v8) << "Cannot unwrap proxy - value is not an object";
return nullptr;
}
if (!value->IsObject()) {
//qDebug(scriptengine) << "Cannot unwrap proxy - value is not an object";
//qCDebug(scriptengine_v8) << "Cannot unwrap proxy - value is not an object";
return nullptr;
}
v8::Local<v8::Object> v8Object = v8::Local<v8::Object>::Cast(value);
if (v8Object->InternalFieldCount() != 3) {
//qDebug(scriptengine) << "Cannot unwrap proxy - wrong number of internal fields";
//qCDebug(scriptengine_v8) << "Cannot unwrap proxy - wrong number of internal fields";
return nullptr;
}
if (v8Object->GetAlignedPointerFromInternalField(0) != internalPointsToQObjectProxy) {
qDebug(scriptengine) << "Cannot unwrap proxy - internal fields don't point to object proxy";
qCDebug(scriptengine_v8) << "Cannot unwrap proxy - internal fields don't point to object proxy";
return nullptr;
}
return reinterpret_cast<ScriptObjectV8Proxy*>(v8Object->GetAlignedPointerFromInternalField(1));
@ -218,7 +219,7 @@ ScriptObjectV8Proxy::~ScriptObjectV8Proxy() {
v8::Locker locker(isolate);
v8::Isolate::Scope isolateScope(isolate);
v8::HandleScope handleScope(isolate);
if(_object) qDebug(scriptengine) << "Deleting object proxy: " << name();
if(_object) qCDebug(scriptengine_v8) << "Deleting object proxy: " << name();
// V8TODO: once WeakPersistent pointer is added we should check if it's valid before deleting
Q_ASSERT(!_v8Object.Get(isolate)->IsNullOrUndefined());
// This prevents unwrap function from unwrapping proxy that was deleted
@ -234,7 +235,7 @@ void ScriptObjectV8Proxy::investigate() {
QObject* qobject = _object;
if (!qobject) {
QStringList backtrace = _engine->currentContext()->backtrace();
qDebug(scriptengine) << "ScriptObjectV8Proxy::investigate: Object pointer is NULL, " << backtrace;
qCDebug(scriptengine_v8) << "ScriptObjectV8Proxy::investigate: Object pointer is NULL, " << backtrace;
}
if (!qobject) return;
@ -251,7 +252,7 @@ void ScriptObjectV8Proxy::investigate() {
const QMetaObject* metaObject = qobject->metaObject();
//qDebug(scriptengine) << "Investigate: " << metaObject->className();
//qCDebug(scriptengine_v8) << "Investigate: " << metaObject->className();
if (QString("ConsoleScriptingInterface") == metaObject->className()) {
printf("ConsoleScriptingInterface");
}
@ -262,7 +263,7 @@ void ScriptObjectV8Proxy::investigate() {
QMetaProperty prop = metaObject->property(idx);
if (!prop.isScriptable()) continue;
//qDebug(scriptengine) << "Investigate: " << metaObject->className() << " Property: " << prop.name();
//qCDebug(scriptengine_v8) << "Investigate: " << metaObject->className() << " Property: " << prop.name();
// always exclude child objects (at least until we decide otherwise)
int metaTypeId = prop.userType();
if (metaTypeId != QMetaType::UnknownType) {
@ -285,7 +286,7 @@ void ScriptObjectV8Proxy::investigate() {
QHash<V8ScriptString, int> methodNames;
for (int idx = startIdx; idx < num; ++idx) {
QMetaMethod method = metaObject->method(idx);
//qDebug(scriptengine) << "Investigate: " << metaObject->className() << " Method: " << method.name();
//qCDebug(scriptengine_v8) << "Investigate: " << metaObject->className() << " Method: " << method.name();
// perhaps keep this comment? Calls (like AudioScriptingInterface::playSound) seem to expect non-public methods to be script-accessible
/* if (method.access() != QMetaMethod::Public) continue;*/
@ -319,9 +320,9 @@ void ScriptObjectV8Proxy::investigate() {
SignalDef& signalDef = _signals.insert(idx, SignalDef(_engine, name.get())).value();
signalDef.name = name;
signalDef.signal = method;
//qDebug(scriptengine) << "Utf8Value 1: " << QString(*v8::String::Utf8Value(const_cast<v8::Isolate*>(_engine->getIsolate()), nameString));
//qDebug(scriptengine) << "Utf8Value 2: " << QString(*v8::String::Utf8Value(const_cast<v8::Isolate*>(_engine->getIsolate()), name.constGet()));
//qDebug(scriptengine) << "toQString: " << name.toQString();
//qCDebug(scriptengine_v8) << "Utf8Value 1: " << QString(*v8::String::Utf8Value(const_cast<v8::Isolate*>(_engine->getIsolate()), nameString));
//qCDebug(scriptengine_v8) << "Utf8Value 2: " << QString(*v8::String::Utf8Value(const_cast<v8::Isolate*>(_engine->getIsolate()), name.constGet()));
//qCDebug(scriptengine_v8) << "toQString: " << name.toQString();
methodNames.insert(name, idx);
} else {
int originalMethodId = nameLookup.value();
@ -336,11 +337,11 @@ void ScriptObjectV8Proxy::investigate() {
} else {
int parameterCount = method.parameterCount();
if(method.returnType() == QMetaType::UnknownType) {
qCritical(scriptengine) << "Method " << metaObject->className() << "::" << name.toQString() << " has QMetaType::UnknownType return value";
qCCritical(scriptengine_v8) << "Method " << metaObject->className() << "::" << name.toQString() << " has QMetaType::UnknownType return value";
}
for (int i = 0; i < method.parameterCount(); i++) {
if (method.parameterType(i) == QMetaType::UnknownType) {
qCritical(scriptengine) << "Parameter " << i << "in method " << metaObject->className() << "::" << name.toQString() << " is of type QMetaType::UnknownType";
qCCritical(scriptengine_v8) << "Parameter " << i << "in method " << metaObject->className() << "::" << name.toQString() << " is of type QMetaType::UnknownType";
}
}
if (nameLookup == methodNames.end()) {
@ -403,7 +404,7 @@ ScriptObjectV8Proxy::QueryFlags ScriptObjectV8Proxy::queryProperty(const V8Scrip
// check for methods
for (MethodDefMap::const_iterator trans = _methods.cbegin(); trans != _methods.cend(); ++trans) {
v8::String::Utf8Value methodNameStr(isolate, trans.value().name.constGet());
//qDebug(scriptengine) << "queryProperty : " << *nameStr << " method: " << *methodNameStr;
//qCDebug(scriptengine_v8) << "queryProperty : " << *nameStr << " method: " << *methodNameStr;
if (!(trans.value().name == name)) continue;
*id = trans.key() | METHOD_TYPE;
return flags & (HandlesReadAccess | HandlesWriteAccess);
@ -458,17 +459,17 @@ void ScriptObjectV8Proxy::v8Get(v8::Local<v8::Name> name, const v8::PropertyCall
v8::HandleScope handleScope(info.GetIsolate());
//V8TODO: should there be a context scope here?
v8::String::Utf8Value utf8Value(info.GetIsolate(), name);
//qDebug(scriptengine) << "Get: " << *utf8Value;
//qCDebug(scriptengine_v8) << "Get: " << *utf8Value;
v8::Local<v8::Value> objectV8 = info.This();
ScriptObjectV8Proxy *proxy = ScriptObjectV8Proxy::unwrapProxy(info.GetIsolate(), objectV8);
if (!proxy) {
qDebug(scriptengine) << "Proxy object not found when getting: " << *utf8Value;
qCDebug(scriptengine_v8) << "Proxy object not found when getting: " << *utf8Value;
return;
}
V8ScriptValue object(proxy->_engine, objectV8);
if (!name->IsString() && !name->IsSymbol()) {
QString notStringMessage("ScriptObjectV8Proxy::v8Get: " + proxy->_engine->scriptValueDebugDetailsV8(V8ScriptValue(proxy->_engine, name)));
qDebug(scriptengine) << notStringMessage;
qCDebug(scriptengine_v8) << notStringMessage;
Q_ASSERT(false);
}
v8::Local<v8::String> v8NameString;
@ -481,7 +482,7 @@ void ScriptObjectV8Proxy::v8Get(v8::Local<v8::Name> name, const v8::PropertyCall
}
if (name->IsSymbol()) {
qDebug(scriptengine) << "ScriptObjectV8Proxy::v8Set: symbol: " + nameString.toQString();
qCDebug(scriptengine_v8) << "ScriptObjectV8Proxy::v8Set: symbol: " + nameString.toQString();
}*/
if (name->IsString()) {
V8ScriptString nameString(proxy->_engine, v8::Local<v8::String>::Cast(name));
@ -498,7 +499,7 @@ void ScriptObjectV8Proxy::v8Get(v8::Local<v8::Name> name, const v8::PropertyCall
if(info.This()->GetInternalField(2).As<v8::Object>()->Get(proxy->_engine->getContext(), name).ToLocal(&property)) {
info.GetReturnValue().Set(property);
} else {
qDebug(scriptengine) << "Value not found: " << *utf8Value;
qCDebug(scriptengine_v8) << "Value not found: " << *utf8Value;
}
}
@ -506,17 +507,17 @@ void ScriptObjectV8Proxy::v8Set(v8::Local<v8::Name> name, v8::Local<v8::Value> v
v8::HandleScope handleScope(info.GetIsolate());
//V8TODO: should there be a context scope here?
v8::String::Utf8Value utf8Value(info.GetIsolate(), name);
//qDebug(scriptengine) << "Set: " << *utf8Value;
//qCDebug(scriptengine_v8) << "Set: " << *utf8Value;
v8::Local<v8::Value> objectV8 = info.This();
ScriptObjectV8Proxy *proxy = ScriptObjectV8Proxy::unwrapProxy(info.GetIsolate(), objectV8);
if (!proxy) {
qDebug(scriptengine) << "Proxy object not found when setting: " << *utf8Value;
qCDebug(scriptengine_v8) << "Proxy object not found when setting: " << *utf8Value;
return;
}
V8ScriptValue object(proxy->_engine, objectV8);
if (!name->IsString() && !name->IsSymbol()) {
QString notStringMessage("ScriptObjectV8Proxy::v8Set: " + proxy->_engine->scriptValueDebugDetailsV8(V8ScriptValue(proxy->_engine, name)));
qDebug(scriptengine) << notStringMessage;
qCDebug(scriptengine_v8) << notStringMessage;
Q_ASSERT(false);
}
/*v8::Local<v8::String> v8NameString;
@ -528,7 +529,7 @@ void ScriptObjectV8Proxy::v8Set(v8::Local<v8::Name> name, v8::Local<v8::Value> v
}
}
if (name->IsSymbol()) {
qDebug(scriptengine) << "ScriptObjectV8Proxy::v8Set: symbol: " + nameString.toQString();
qCDebug(scriptengine_v8) << "ScriptObjectV8Proxy::v8Set: symbol: " + nameString.toQString();
}*/
//V8ScriptString nameString(info.GetIsolate(), name->ToString(proxy->_engine->getContext()).ToLocalChecked());
if (name->IsString()) {
@ -545,19 +546,19 @@ void ScriptObjectV8Proxy::v8Set(v8::Local<v8::Name> name, v8::Local<v8::Value> v
if (info.This()->GetInternalField(2).As<v8::Object>()->Set(proxy->_engine->getContext(), name, value).FromMaybe(false)) {
info.GetReturnValue().Set(value);
} else {
qDebug(scriptengine) << "Set failed: " << *utf8Value;
qCDebug(scriptengine_v8) << "Set failed: " << *utf8Value;
}
}
void ScriptObjectV8Proxy::v8GetPropertyNames(const v8::PropertyCallbackInfo<v8::Array>& info) {
qDebug(scriptengine) << "ScriptObjectV8Proxy::v8GetPropertyNames called";
qCDebug(scriptengine_v8) << "ScriptObjectV8Proxy::v8GetPropertyNames called";
v8::HandleScope handleScope(info.GetIsolate());
auto context = info.GetIsolate()->GetCurrentContext();
v8::Context::Scope contextScope(context);
v8::Local<v8::Value> objectV8 = info.This();
ScriptObjectV8Proxy *proxy = ScriptObjectV8Proxy::unwrapProxy(info.GetIsolate(), objectV8);
if (!proxy) {
qDebug(scriptengine) << "ScriptObjectV8Proxy::v8GetPropertyNames: Proxy object not found when listing";
qCDebug(scriptengine_v8) << "ScriptObjectV8Proxy::v8GetPropertyNames: Proxy object not found when listing";
return;
}
V8ScriptValue object(proxy->_engine, objectV8);
@ -568,7 +569,7 @@ void ScriptObjectV8Proxy::v8GetPropertyNames(const v8::PropertyCallbackInfo<v8::
if (info.This()->GetInternalField(2).As<v8::Object>()->GetPropertyNames(context).ToLocal(&objectProperties)) {
for (uint32_t n = 0; n < objectProperties->Length(); n++) {
if(!properties->Set(context, propertiesLength+n, objectProperties->Get(context, n).ToLocalChecked()).FromMaybe(false)) {
qDebug(scriptengine) << "ScriptObjectV8Proxy::v8GetPropertyNames: Cannot add member name";
qCDebug(scriptengine_v8) << "ScriptObjectV8Proxy::v8GetPropertyNames: Cannot add member name";
}
}
}
@ -587,17 +588,17 @@ v8::Local<v8::Array> ScriptObjectV8Proxy::getPropertyNames() {
uint32_t position = 0;
for (PropertyDefMap::const_iterator i = _props.begin(); i != _props.end(); i++){
if(!properties->Set(context, position++, i.value().name.constGet()).FromMaybe(false)) {
qDebug(scriptengine) << "ScriptObjectV8Proxy::getPropertyNames: Cannot add property member name";
qCDebug(scriptengine_v8) << "ScriptObjectV8Proxy::getPropertyNames: Cannot add property member name";
}
}
for (MethodDefMap::const_iterator i = _methods.begin(); i != _methods.end(); i++){
if(!properties->Set(context, position++, i.value().name.constGet()).FromMaybe(false)) {
qDebug(scriptengine) << "ScriptObjectV8Proxy::getPropertyNames: Cannot add property member name";
qCDebug(scriptengine_v8) << "ScriptObjectV8Proxy::getPropertyNames: Cannot add property member name";
}
}
for (SignalDefMap::const_iterator i = _signals.begin(); i != _signals.end(); i++){
if(!properties->Set(context, position++, i.value().name.constGet()).FromMaybe(false)) {
qDebug(scriptengine) << "ScriptObjectV8Proxy::getPropertyNames: Cannot add property member name";
qCDebug(scriptengine_v8) << "ScriptObjectV8Proxy::getPropertyNames: Cannot add property member name";
}
}
return handleScope.Escape(properties);
@ -639,7 +640,7 @@ V8ScriptValue ScriptObjectV8Proxy::property(const V8ScriptValue& object, const V
const MethodDef& methodDef = lookup.value();
for (auto iter = methodDef.methods.begin(); iter != methodDef.methods.end(); iter++ ) {
if((*iter).returnType() == QMetaType::UnknownType) {
qDebug(scriptengine) << "Method with QMetaType::UnknownType " << metaObject->className() << " " << (*iter).name();
qCDebug(scriptengine_v8) << "Method with QMetaType::UnknownType " << metaObject->className() << " " << (*iter).name();
}
} //V8TODO: is new method created during every call? It needs to be cached instead
//bool isMethodDefined = false;
@ -650,7 +651,7 @@ V8ScriptValue ScriptObjectV8Proxy::property(const V8ScriptValue& object, const V
}
}
Q_ASSERT(false);
qDebug(scriptengine) << "(This should not happen) Creating new method object for " << metaObject->className() << " " << name.toQString();
qCDebug(scriptengine_v8) << "(This should not happen) Creating new method object for " << metaObject->className() << " " << name.toQString();
return ScriptMethodV8Proxy::newMethod(_engine, qobject, object, methodDef.methods, methodDef.numMaxParms);
}
case SIGNAL_TYPE: {
@ -828,7 +829,7 @@ void ScriptVariantV8Proxy::v8Get(v8::Local<v8::Name> name, const v8::PropertyCal
v8::Local<v8::Value> objectV8 = info.This();
ScriptVariantV8Proxy *proxy = ScriptVariantV8Proxy::unwrapProxy(info.GetIsolate(), objectV8);
if (!proxy) {
qDebug(scriptengine) << "Proxy object not found when getting: " << *utf8Name;
qCDebug(scriptengine_v8) << "Proxy object not found when getting: " << *utf8Name;
return;
}
V8ScriptValue object(proxy->_engine, proxy->_v8Object.Get(info.GetIsolate()));
@ -844,13 +845,13 @@ void ScriptVariantV8Proxy::v8Get(v8::Local<v8::Name> name, const v8::PropertyCal
}
}
qDebug(scriptengine) << "Value not found: " << *utf8Name;
qCDebug(scriptengine_v8) << "Value not found: " << *utf8Name;
// V8TODO: this is done differently for variant proxy - use internal field of _v8Object instead?
/*v8::Local<v8::Value> property;
if(info.This()->GetInternalField(2).As<v8::Object>()->Get(proxy->_engine->getContext(), name).ToLocal(&property)) {
info.GetReturnValue().Set(property);
} else {
qDebug(scriptengine) << "Value not found: " << *utf8Value;
qCDebug(scriptengine_v8) << "Value not found: " << *utf8Value;
}*/
}
@ -860,14 +861,14 @@ void ScriptVariantV8Proxy::v8Set(v8::Local<v8::Name> name, v8::Local<v8::Value>
v8::Local<v8::Value> objectV8 = info.This();
ScriptVariantV8Proxy *proxy = ScriptVariantV8Proxy::unwrapProxy(info.GetIsolate(), objectV8);
if (!proxy) {
qDebug(scriptengine) << "Proxy object not found when getting: " << *utf8Name;
qCDebug(scriptengine_v8) << "Proxy object not found when getting: " << *utf8Name;
return;
}
V8ScriptValue object(proxy->_engine, objectV8);
if (!name->IsString() && !name->IsSymbol()) {
QString notStringMessage("ScriptObjectV8Proxy::v8Set: " + proxy->_engine->scriptValueDebugDetailsV8(V8ScriptValue(proxy->_engine, name)));
qDebug(scriptengine) << notStringMessage;
qCDebug(scriptengine_v8) << notStringMessage;
Q_ASSERT(false);
}
@ -885,21 +886,21 @@ void ScriptVariantV8Proxy::v8Set(v8::Local<v8::Name> name, v8::Local<v8::Value>
/*if (info.This()->GetInternalField(2).As<v8::Object>()->Set(proxy->_engine->getContext(), name, value).FromMaybe(false)) {
info.GetReturnValue().Set(value);
} else {
qDebug(scriptengine) << "Set failed: " << *utf8Name;
qCDebug(scriptengine_v8) << "Set failed: " << *utf8Name;
}*/
qDebug(scriptengine) << "Set failed: " << *utf8Name;
qCDebug(scriptengine_v8) << "Set failed: " << *utf8Name;
}
void ScriptVariantV8Proxy::v8GetPropertyNames(const v8::PropertyCallbackInfo<v8::Array>& info) {
//V8TODO: Only methods from the prototype should be listed.
qDebug(scriptengine) << "ScriptObjectV8Proxy::v8GetPropertyNames called";
qCDebug(scriptengine_v8) << "ScriptObjectV8Proxy::v8GetPropertyNames called";
v8::HandleScope handleScope(info.GetIsolate());
auto context = info.GetIsolate()->GetCurrentContext();
v8::Context::Scope contextScope(context);
v8::Local<v8::Value> objectV8 = info.This();
ScriptVariantV8Proxy *proxy = ScriptVariantV8Proxy::unwrapProxy(info.GetIsolate(), objectV8);
if (!proxy) {
qDebug(scriptengine) << "ScriptObjectV8Proxy::v8GetPropertyNames: Proxy object not found when listing";
qCDebug(scriptengine_v8) << "ScriptObjectV8Proxy::v8GetPropertyNames: Proxy object not found when listing";
return;
}
V8ScriptValue object(proxy->_engine, objectV8);
@ -910,7 +911,7 @@ void ScriptVariantV8Proxy::v8GetPropertyNames(const v8::PropertyCallbackInfo<v8:
if (info.This()->GetInternalField(2).As<v8::Object>()->GetPropertyNames(context).ToLocal(&objectProperties)) {
for (uint32_t n = 0; n < objectProperties->Length(); n++) {
if(!properties->Set(context, propertiesLength+n, objectProperties->Get(context, n).ToLocalChecked()).FromMaybe(false)) {
qDebug(scriptengine) << "ScriptObjectV8Proxy::v8GetPropertyNames: Cannot add member name";
qCDebug(scriptengine_v8) << "ScriptObjectV8Proxy::v8GetPropertyNames: Cannot add member name";
}
}
}*/
@ -929,7 +930,7 @@ ScriptMethodV8Proxy::ScriptMethodV8Proxy(ScriptEngineV8* engine, QObject* object
}
ScriptMethodV8Proxy::~ScriptMethodV8Proxy() {
qDebug(scriptengine) << "ScriptMethodV8Proxy destroyed";
qCDebug(scriptengine_v8) << "ScriptMethodV8Proxy destroyed";
printf("ScriptMethodV8Proxy destroyed");
}
@ -1107,7 +1108,7 @@ void ScriptMethodV8Proxy::call(const v8::FunctionCallbackInfo<v8::Value>& argume
// nothing in there for return values so these need to be explicitly runtime-registered!
if (returnTypeId == QMetaType::UnknownType) {
QString methodName = fullName();
qDebug(scriptengine) << "returnTypeId == QMetaType::UnknownType for method " << methodName;
qCDebug(scriptengine_v8) << "returnTypeId == QMetaType::UnknownType for method " << methodName;
_engine->logBacktrace("");
//Q_ASSERT(false);
}
@ -1173,7 +1174,7 @@ void ScriptMethodV8Proxy::call(const v8::FunctionCallbackInfo<v8::Value>& argume
QByteArray argTypeName = _engine->valueType(V8ScriptValue(_engine, argVal)).toLatin1();
QString errorMessage = QString("Native call of %1 failed: Cannot convert parameter %2 from %3 to %4")
.arg(fullName()).arg(arg+1).arg(argTypeName, methodTypeName);
qDebug(scriptengine) << errorMessage << "\n Backtrace:" << _engine->currentContext()->backtrace();
qCDebug(scriptengine_v8) << errorMessage << "\n Backtrace:" << _engine->currentContext()->backtrace();
isolate->ThrowError(v8::String::NewFromUtf8(isolate, errorMessage.toStdString().c_str()).ToLocalChecked());
//context->throwError(V8ScriptContext::TypeError, QString("Native call of %1 failed: Cannot convert parameter %2 from %3 to %4")
// .arg(fullName()).arg(arg+1).arg(argTypeName, methodTypeName));
@ -1182,7 +1183,7 @@ void ScriptMethodV8Proxy::call(const v8::FunctionCallbackInfo<v8::Value>& argume
}
}
QString errorMessage = QString("Native call of %1 failed: could not locate an overload with the requested arguments").arg(fullName());
qDebug(scriptengine) << errorMessage;
qCDebug(scriptengine_v8) << errorMessage;
isolate->ThrowError(v8::String::NewFromUtf8(isolate, errorMessage.toStdString().c_str()).ToLocalChecked());
// V8TODO: it happens sometimes for some reason
Q_ASSERT(false); // really shouldn't have gotten here -- it didn't work before and it's working now?
@ -1384,7 +1385,7 @@ int ScriptSignalV8Proxy::qt_metacall(QMetaObject::Call call, int id, void** argu
_callCounter++;
if (_callCounter % 10 == 0) {
qDebug() << "Script engine: " << _engine->manager()->getFilename() << " Signal proxy " << fullName()
qCDebug(scriptengine_v8) << "Script engine: " << _engine->manager()->getFilename() << " Signal proxy " << fullName()
<< " call count: " << _callCounter << " total time: " << _totalCallTime_s;
}
QElapsedTimer callTimer;
@ -1434,7 +1435,7 @@ int ScriptSignalV8Proxy::qt_metacall(QMetaObject::Call call, int id, void** argu
/*if (!conn.callback.get()->IsFunction()) {
auto stringV8 = conn.callback.get()->ToDetailString(context).ToLocalChecked();
QString error = *v8::String::Utf8Value(_engine->getIsolate(), stringV8);
qDebug() << error;
qCDebug(scriptengine_v8) << error;
Q_ASSERT(false);
}
v8::Local<v8::Function> callback = v8::Local<v8::Function>::Cast(conn.callback.get());
@ -1449,14 +1450,14 @@ int ScriptSignalV8Proxy::qt_metacall(QMetaObject::Call call, int id, void** argu
Q_ASSERT(!conn.callback.get().IsEmpty());
Q_ASSERT(!conn.callback.get()->IsUndefined());
if (conn.callback.get()->IsNull()) {
qDebug() << "ScriptSignalV8Proxy::qt_metacall: Connection callback is Null";
qCDebug(scriptengine_v8) << "ScriptSignalV8Proxy::qt_metacall: Connection callback is Null";
_engine->popContext();
continue;
}
if (!conn.callback.get()->IsFunction()) {
auto stringV8 = conn.callback.get()->ToDetailString(functionContext).ToLocalChecked();
QString error = *v8::String::Utf8Value(_engine->getIsolate(), stringV8);
qDebug() << error;
qCDebug(scriptengine_v8) << error;
Q_ASSERT(false);
}
v8::Local<v8::Function> callback = v8::Local<v8::Function>::Cast(conn.callback.get());
@ -1577,7 +1578,7 @@ void ScriptSignalV8Proxy::connect(ScriptValue arg0, ScriptValue arg1) {
Q_ASSERT(ScriptObjectV8Proxy::unwrapProxy(v8ThisObject));
ScriptSignalV8Proxy* thisProxy = dynamic_cast<ScriptSignalV8Proxy*>(ScriptObjectV8Proxy::unwrapProxy(v8ThisObject)->toQObject());
Q_ASSERT(thisProxy);
qDebug(scriptengine) << "ScriptSignalV8Proxy::connect: " << thisProxy->fullName() << " fullName: " << fullName();
qCDebug(scriptengine_v8) << "ScriptSignalV8Proxy::connect: " << thisProxy->fullName() << " fullName: " << fullName();
//Q_ASSERT(destFunction->InternalFieldCount() == 4);
//Q_ASSERT(destData.get()->IsArray());
//v8::Local<v8::Value> destData = destFunction->GetInternalField(3);
@ -1593,14 +1594,14 @@ void ScriptSignalV8Proxy::connect(ScriptValue arg0, ScriptValue arg1) {
for (int idx = 0; idx < length && !foundIt; ++idx) {
v8::Local<v8::Value> entry = destArray->Get(destFunctionContext, idx).ToLocalChecked();
{
qDebug() << "ScriptSignalV8Proxy::connect: entry details: " << _engine->scriptValueDebugDetailsV8(V8ScriptValue(_engine, entry));
qCDebug(scriptengine_v8) << "ScriptSignalV8Proxy::connect: entry details: " << _engine->scriptValueDebugDetailsV8(V8ScriptValue(_engine, entry));
Q_ASSERT(entry->IsObject());
V8ScriptValue v8EntryObject(_engine, entry);
Q_ASSERT(ScriptObjectV8Proxy::unwrapProxy(v8EntryObject));
// For debugging
ScriptSignalV8Proxy* entryProxy = dynamic_cast<ScriptSignalV8Proxy*>(ScriptObjectV8Proxy::unwrapProxy(v8EntryObject)->toQObject());
Q_ASSERT(thisProxy);
qDebug(scriptengine) << "ScriptSignalV8Proxy::connect: entry proxy: " << entryProxy->fullName();
qCDebug(scriptengine_v8) << "ScriptSignalV8Proxy::connect: entry proxy: " << entryProxy->fullName();
}
if (!newArray->Set(destFunctionContext, idx, entry).FromMaybe(false)) {
Q_ASSERT(false);
@ -1712,7 +1713,7 @@ void ScriptSignalV8Proxy::disconnect(ScriptValue arg0, ScriptValue arg1) {
// For debugging
ScriptSignalV8Proxy* thisProxy = dynamic_cast<ScriptSignalV8Proxy*>(ScriptObjectV8Proxy::unwrapProxy(v8ThisObject)->toQObject());
Q_ASSERT(thisProxy);
qDebug(scriptengine) << "ScriptSignalV8Proxy::disconnect: " << thisProxy->fullName() << " fullName: " << fullName();
qCDebug(scriptengine_v8) << "ScriptSignalV8Proxy::disconnect: " << thisProxy->fullName() << " fullName: " << fullName();
//V8ScriptValue destData = callback.data();
//Q_ASSERT(destData->IsArray());
if (!destFunction->Get(destFunctionContext, destDataName).ToLocal(&destData)) {
@ -1730,7 +1731,7 @@ void ScriptSignalV8Proxy::disconnect(ScriptValue arg0, ScriptValue arg1) {
// For debugging:
{
_engine->logBacktrace("ScriptSignalV8Proxy::disconnect");
qDebug() << "ScriptSignalV8Proxy::disconnect: entry details: " << _engine->scriptValueDebugDetailsV8(V8ScriptValue(_engine, entry))
qCDebug(scriptengine_v8) << "ScriptSignalV8Proxy::disconnect: entry details: " << _engine->scriptValueDebugDetailsV8(V8ScriptValue(_engine, entry))
<< " Array: " << _engine->scriptValueDebugDetailsV8(V8ScriptValue(_engine, destArray));
Q_ASSERT(entry->IsObject());
V8ScriptValue v8EntryObject(_engine, entry);
@ -1738,12 +1739,12 @@ void ScriptSignalV8Proxy::disconnect(ScriptValue arg0, ScriptValue arg1) {
// For debugging
ScriptSignalV8Proxy* entryProxy = dynamic_cast<ScriptSignalV8Proxy*>(ScriptObjectV8Proxy::unwrapProxy(v8EntryObject)->toQObject());
Q_ASSERT(thisProxy);
qDebug(scriptengine) << "ScriptSignalV8Proxy::disconnect: entry proxy: " << entryProxy->fullName();
qCDebug(scriptengine_v8) << "ScriptSignalV8Proxy::disconnect: entry proxy: " << entryProxy->fullName();
}
if (entry->StrictEquals(v8ThisObject.get())) {
//V8TODO: compare proxies instead?
foundIt = true;
qDebug() << "ScriptSignalV8Proxy::disconnect foundIt";
qCDebug(scriptengine_v8) << "ScriptSignalV8Proxy::disconnect foundIt";
//V8ScriptValueList args;
//args << idx << 1;
//destData.property("splice").call(destData, args);

View file

@ -16,6 +16,7 @@
#include "ScriptEngineV8.h"
#include "ScriptValueV8Wrapper.h"
#include "ScriptEngineLoggingV8.h"
ScriptProgramV8Wrapper* ScriptProgramV8Wrapper::unwrap(ScriptProgramPointer val) {
if (!val) {
@ -53,13 +54,13 @@ bool ScriptProgramV8Wrapper::compile() {
v8::ScriptOrigin scriptOrigin(isolate, v8::String::NewFromUtf8(isolate, _url.toStdString().c_str()).ToLocalChecked());
v8::Local<v8::Script> script;
if (v8::Script::Compile(context, v8::String::NewFromUtf8(isolate, _source.toStdString().c_str()).ToLocalChecked(), &scriptOrigin).ToLocal(&script)) {
qDebug() << "Script compilation successful: " << _url;
qCDebug(scriptengine_v8) << "Script compilation successful: " << _url;
_compileResult = ScriptSyntaxCheckResultV8Wrapper(ScriptSyntaxCheckResult::Valid);
_value = V8ScriptProgram(_engine, script);
_isCompiled = true;
return true;
}
qDebug() << "Script compilation failed: " << _url;
qCDebug(scriptengine_v8) << "Script compilation failed: " << _url;
v8::String::Utf8Value utf8Value(isolate, tryCatch.Exception());
errorMessage = QString(*utf8Value);
v8::Local<v8::Message> exceptionMessage = tryCatch.Message();

View file

@ -13,6 +13,7 @@
//
#include "ScriptValueIteratorV8Wrapper.h"
#include "ScriptEngineLoggingV8.h"
V8ScriptValueIterator::V8ScriptValueIterator(ScriptEngineV8* engine, v8::Local<v8::Value> object) : _engine(engine) {
auto isolate = _engine->getIsolate();

View file

@ -17,7 +17,7 @@
#include "ScriptValueIteratorV8Wrapper.h"
#include "../ScriptEngineLogging.h"
#include "ScriptEngineLoggingV8.h"
void ScriptValueV8Wrapper::release() {
// V8TODO: maybe add an assert to check if it happens on script engine thread?
@ -92,17 +92,17 @@ ScriptValue ScriptValueV8Wrapper::call(const ScriptValue& thisObject, const Scri
v8::Local<v8::Value> recv;
if (v8This.get()->IsObject()) {
recv = v8This.get();
//qDebug() << "V8 This: " << _engine->scriptValueDebugDetailsV8(v8This);
//qCDebug(scriptengine_v8) << "V8 This: " << _engine->scriptValueDebugDetailsV8(v8This);
}else{
recv = _engine->getContext()->Global();
//recv = v8::Null(isolate);
//qDebug() << "global";
//qCDebug(scriptengine_v8) << "global";
}
//qDebug() << "V8 Call: " << *v8::String::Utf8Value(isolate, v8This.get()->TypeOf(isolate));
//qCDebug(scriptengine_v8) << "V8 Call: " << *v8::String::Utf8Value(isolate, v8This.get()->TypeOf(isolate));
auto maybeResult = v8Function->Call(_engine->getContext(), recv, args.length(), v8Args);
// V8TODO: Exceptions don't seem to actually be caught here?
if (tryCatch.HasCaught()) {
qCDebug(scriptengine) << "Function call failed: \"" << _engine->formatErrorMessageFromTryCatch(tryCatch);
qCDebug(scriptengine_v8) << "Function call failed: \"" << _engine->formatErrorMessageFromTryCatch(tryCatch);
}
v8::Local<v8::Value> result;
Q_ASSERT(_engine == _value.getEngine());
@ -110,7 +110,7 @@ ScriptValue ScriptValueV8Wrapper::call(const ScriptValue& thisObject, const Scri
return ScriptValue(new ScriptValueV8Wrapper(_engine, V8ScriptValue(_engine, result)));
} else {
//V8TODO Add more details
qWarning("JS function call failed");
qCWarning(scriptengine_v8) << "JS function call failed";
return _engine->undefinedValue();
}
}
@ -135,7 +135,7 @@ ScriptValue ScriptValueV8Wrapper::call(const ScriptValue& thisObject, const Scri
return ScriptValue(new ScriptValueV8Wrapper(_engine, V8ScriptValue(_engine->getContext(), result)));
} else {
//V8TODO Add more details
qWarning("JS function call failed");
qCWarning(scriptengine_v8) << "JS function call failed";
return _engine->undefinedValue();
}*/
}
@ -163,7 +163,7 @@ ScriptValue ScriptValueV8Wrapper::construct(const ScriptValueList& args) {
return ScriptValue(new ScriptValueV8Wrapper(_engine, V8ScriptValue(_engine, result)));
} else {
//V8TODO Add more details
qWarning("JS function call failed");
qCWarning(scriptengine_v8) << "JS function call failed";
return _engine->undefinedValue();
}
}
@ -205,18 +205,18 @@ ScriptValue ScriptValueV8Wrapper::data() const {
}
}
if (createData) {
qDebug() << "ScriptValueV8Wrapper::data(): Data object doesn't exist, creating new one";
qCDebug(scriptengine_v8) << "ScriptValueV8Wrapper::data(): Data object doesn't exist, creating new one";
// Create data object if it's non-existent or invalid
data = v8::Object::New(isolate);
if( !v8Object->Set(_engine->getContext(), v8::String::NewFromUtf8(isolate, "__data").ToLocalChecked(), data).FromMaybe(false)) {
qDebug() << "ScriptValueV8Wrapper::data(): Data object couldn't be created";
qCDebug(scriptengine_v8) << "ScriptValueV8Wrapper::data(): Data object couldn't be created";
Q_ASSERT(false);
}
}*/
V8ScriptValue result(_engine, data);
return ScriptValue(new ScriptValueV8Wrapper(_engine, std::move(result)));
} else {
qDebug() << "ScriptValueV8Wrapper::data() was called on a value that is not an object";
qCDebug(scriptengine_v8) << "ScriptValueV8Wrapper::data() was called on a value that is not an object";
Q_ASSERT(false);
}
//V8TODO I'm not sure how this would work in V8
@ -290,15 +290,15 @@ ScriptValue ScriptValueV8Wrapper::property(const QString& name, const ScriptValu
if (_value.constGet()->ToDetailString(_engine->getContext()).ToLocal(&parentValueString)) {
QString(*v8::String::Utf8Value(isolate, parentValueString));
}
qDebug() << "Failed to get property, parent of value: " << name << ", parent type: " << QString(*v8::String::Utf8Value(isolate, _value.constGet()->TypeOf(isolate))) << " parent value: " << parentValueQString;
qCDebug(scriptengine_v8) << "Failed to get property, parent of value: " << name << ", parent type: " << QString(*v8::String::Utf8Value(isolate, _value.constGet()->TypeOf(isolate))) << " parent value: " << parentValueQString;
}
}
if (name == QString("x")) {
printf("x");
}
//This displays too many messages during correct operation, but is useful for debugging
//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)));
//qDebug() << "Backtrace: " << _engine->currentContext()->backtrace();
//qCDebug(scriptengine_v8) << "Failed to get property, parent of value: " << name << " is not a V8 object, reported type: " << QString(*v8::String::Utf8Value(isolate, _value.constGet()->TypeOf(isolate)));
//qCDebug(scriptengine_v8) << "Backtrace: " << _engine->currentContext()->backtrace();
return _engine->undefinedValue();
/*v8::Local<v8::Value> nullValue = v8::Null(_engine->getIsolate());
V8ScriptValue nullScriptValue(_engine->getIsolate(), std::move(nullValue));
@ -314,7 +314,7 @@ ScriptValue ScriptValueV8Wrapper::property(quint32 arrayIndex, const ScriptValue
v8::HandleScope handleScope(isolate);
v8::Context::Scope contextScope(_engine->getContext());
if (_value.constGet()->IsNullOrUndefined()) {
qDebug() << "Failed to get property, parent of value: " << arrayIndex << " is not a V8 object, reported type: " << QString(*v8::String::Utf8Value(isolate, _value.constGet()->TypeOf(isolate)));
qCDebug(scriptengine_v8) << "Failed to get property, parent of value: " << arrayIndex << " is not a V8 object, reported type: " << QString(*v8::String::Utf8Value(isolate, _value.constGet()->TypeOf(isolate)));
return _engine->undefinedValue();
}
if (_value.constGet()->IsObject()) {
@ -326,7 +326,7 @@ ScriptValue ScriptValueV8Wrapper::property(quint32 arrayIndex, const ScriptValue
return ScriptValue(new ScriptValueV8Wrapper(_engine, std::move(result)));
}
}
qDebug() << "Failed to get property, parent of value: " << arrayIndex << " is not a V8 object, reported type: " << QString(*v8::String::Utf8Value(isolate, _value.constGet()->TypeOf(isolate)));
qCDebug(scriptengine_v8) << "Failed to get property, parent of value: " << arrayIndex << " is not a V8 object, reported type: " << QString(*v8::String::Utf8Value(isolate, _value.constGet()->TypeOf(isolate)));
return _engine->undefinedValue();
}
@ -340,17 +340,17 @@ void ScriptValueV8Wrapper::setData(const ScriptValue& value) {
// V8TODO Check if it uses same isolate. Would pointer check be enough?
// Private properties are an experimental feature for now on V8, so we are using regular value for now
if (_value.constGet()->IsNullOrUndefined()) {
qDebug() << "ScriptValueV8Wrapper::setData() was called on a value that is null or undefined";
qCDebug(scriptengine_v8) << "ScriptValueV8Wrapper::setData() was called on a value that is null or undefined";
return;
}
if (_value.constGet()->IsObject()) {
auto v8Object = v8::Local<v8::Object>::Cast(_value.constGet());
if( !v8Object->Set(_engine->getContext(), v8::String::NewFromUtf8(isolate, "__data").ToLocalChecked(), unwrapped.constGet()).FromMaybe(false)) {
qDebug() << "ScriptValueV8Wrapper::data(): Data object couldn't be created";
qCDebug(scriptengine_v8) << "ScriptValueV8Wrapper::data(): Data object couldn't be created";
Q_ASSERT(false);
}
} else {
qDebug() << "ScriptValueV8Wrapper::data() was called on a value that is not an object";
qCDebug(scriptengine_v8) << "ScriptValueV8Wrapper::data() was called on a value that is not an object";
Q_ASSERT(false);
}
}
@ -364,7 +364,7 @@ void ScriptValueV8Wrapper::setProperty(const QString& name, const ScriptValue& v
v8::Context::Scope contextScope(_engine->getContext());
V8ScriptValue unwrapped = fullUnwrap(value);
if (_value.constGet()->IsNullOrUndefined()) {
qDebug() << "ScriptValueV8Wrapper::setProperty() was called on a value that is null or undefined";
qCDebug(scriptengine_v8) << "ScriptValueV8Wrapper::setProperty() was called on a value that is null or undefined";
return;
}
if(_value.constGet()->IsObject()) {
@ -376,7 +376,7 @@ void ScriptValueV8Wrapper::setProperty(const QString& name, const ScriptValue& v
//v8::Maybe<bool> retVal = object->Set(_engine->getContext(), key, unwrapped.constGet());
v8::Maybe<bool> retVal = object->Set(isolate->GetCurrentContext(), key, unwrapped.constGet());
if (retVal.IsJust() ? !retVal.FromJust() : true){
qDebug(scriptengine) << "Failed to set property";
qCDebug(scriptengine_v8) << "Failed to set property";
}
} else {
v8::Local<v8::String> details;
@ -385,8 +385,8 @@ void ScriptValueV8Wrapper::setProperty(const QString& name, const ScriptValue& v
v8::String::Utf8Value utf8Value(isolate,details);
detailsString = *utf8Value;
}
qDebug(scriptengine) << "Failed to set property:" + name + " - parent is not an object. Parent details: " + " Type: " + QString(*v8::String::Utf8Value(isolate, _value.constGet()->TypeOf(isolate)));
qDebug(scriptengine) << _engine->currentContext()->backtrace();
qCDebug(scriptengine_v8) << "Failed to set property:" + name + " - parent is not an object. Parent details: " + " Type: " + QString(*v8::String::Utf8Value(isolate, _value.constGet()->TypeOf(isolate)));
qCDebug(scriptengine_v8) << _engine->currentContext()->backtrace();
}
//V8TODO: what about flags?
//_value.setProperty(name, unwrapped, (V8ScriptValue::PropertyFlags)(int)flags);
@ -400,7 +400,7 @@ void ScriptValueV8Wrapper::setProperty(quint32 arrayIndex, const ScriptValue& va
v8::Context::Scope contextScope(_engine->getContext());
V8ScriptValue unwrapped = fullUnwrap(value);
if (_value.constGet()->IsNullOrUndefined()) {
qDebug() << "ScriptValueV8Wrapper::setProperty() was called on a value that is null or undefined";
qCDebug(scriptengine_v8) << "ScriptValueV8Wrapper::setProperty() was called on a value that is null or undefined";
return;
}
if(_value.constGet()->IsObject()) {
@ -409,10 +409,10 @@ void ScriptValueV8Wrapper::setProperty(quint32 arrayIndex, const ScriptValue& va
v8::Maybe<bool> retVal(object->Set(_engine->getContext(), arrayIndex, unwrapped.constGet()));
//v8::Maybe<bool> retVal(object->Set(_value.getContext(), arrayIndex, unwrapped.constGet()));
if (retVal.IsJust() ? !retVal.FromJust() : true){
qDebug(scriptengine) << "Failed to set property";
qCDebug(scriptengine_v8) << "Failed to set property";
}
} else {
qDebug(scriptengine) << "Failed to set property: " + QString(arrayIndex) + " - parent is not an object";
qCDebug(scriptengine_v8) << "Failed to set property: " + QString(arrayIndex) + " - parent is not an object";
}
//V8TODO: what about flags?
//_value.setProperty(arrayIndex, unwrapped, (V8ScriptValue::PropertyFlags)(int)flags);
@ -427,7 +427,7 @@ void ScriptValueV8Wrapper::setPrototype(const ScriptValue& prototype) {
ScriptValueV8Wrapper* unwrappedPrototype = unwrap(prototype);
if (unwrappedPrototype) {
if(unwrappedPrototype->toV8Value().constGet()->IsNullOrUndefined() && _value.constGet()->IsNullOrUndefined()) {
qDebug(scriptengine) << "Failed to assign prototype - one of values is null or undefined";
qCDebug(scriptengine_v8) << "Failed to assign prototype - one of values is null or undefined";
}
if(unwrappedPrototype->toV8Value().constGet()->IsObject() && _value.constGet()->IsObject()) {
auto object = v8::Local<v8::Object>::Cast(_value.get());
@ -435,10 +435,10 @@ void ScriptValueV8Wrapper::setPrototype(const ScriptValue& prototype) {
v8::Maybe<bool> retVal = object->SetPrototype(_engine->getContext(), unwrappedPrototype->toV8Value().constGet());
//v8::Maybe<bool> retVal = object->SetPrototype(_value.getContext(), unwrappedPrototype->toV8Value().constGet());
if (retVal.IsJust() ? !retVal.FromJust() : true){
qDebug(scriptengine) << "Failed to assign prototype";
qCDebug(scriptengine_v8) << "Failed to assign prototype";
}
} else {
qDebug(scriptengine) << "Failed to assign prototype - one of values is not an object";
qCDebug(scriptengine_v8) << "Failed to assign prototype - one of values is not an object";
}
}
}