From 5963aead75991ea8b0fded251e18ef75f099ab8f Mon Sep 17 00:00:00 2001 From: Simon Hausmann Date: Tue, 7 May 2013 11:22:52 +0200 Subject: More steps towards eliminating the v8 layer * Changed the return type of the InvocationCallback from a v8 handle to a QV4::Value * Removed v4 auto tests and fixed build of other tests Change-Id: Ic927b925923ca8785170689a5c260969fd1cb794 Reviewed-by: Lars Knoll --- src/qml/qml/qqmlcomponent.cpp | 6 +- src/qml/qml/qqmllocale.cpp | 96 ++++++------- src/qml/qml/qqmllocale_p.h | 24 ++-- src/qml/qml/qqmlxmlhttprequest.cpp | 64 +++++---- src/qml/qml/v4/qv4context_p.h | 2 +- src/qml/qml/v4/qv4v8.cpp | 9 +- src/qml/qml/v4/qv4v8_p.h | 3 +- src/qml/qml/v8/qqmlbuiltinfunctions.cpp | 240 ++++++++++++++++---------------- src/qml/qml/v8/qqmlbuiltinfunctions_p.h | 98 ++++++------- src/qml/qml/v8/qv4domerrors_p.h | 8 ++ src/qml/qml/v8/qv8engine_p.h | 7 + src/qml/qml/v8/qv8include.cpp | 6 +- src/qml/qml/v8/qv8include_p.h | 2 +- src/qml/qml/v8/qv8qobjectwrapper.cpp | 91 ++++++------ src/qml/qml/v8/qv8qobjectwrapper_p.h | 6 +- src/qml/qml/v8/qv8sequencewrapper.cpp | 14 +- src/qml/qml/v8/qv8sequencewrapper_p.h | 6 +- src/qml/qml/v8/qv8sequencewrapper_p_p.h | 4 +- src/qml/qml/v8/qv8valuetypewrapper.cpp | 2 +- src/qml/qml/v8/qv8valuetypewrapper_p.h | 2 +- src/qml/qml/v8/qv8variantwrapper.cpp | 14 +- src/qml/qml/v8/qv8variantwrapper_p.h | 8 +- src/qml/types/qquickworkerscript.cpp | 4 +- 23 files changed, 370 insertions(+), 346 deletions(-) (limited to 'src/qml') diff --git a/src/qml/qml/qqmlcomponent.cpp b/src/qml/qml/qqmlcomponent.cpp index 2747cc72fc..0c020b76a3 100644 --- a/src/qml/qml/qqmlcomponent.cpp +++ b/src/qml/qml/qqmlcomponent.cpp @@ -1094,7 +1094,7 @@ public: const v8::AccessorInfo& info); static v8::Handle ForceCompletionGetter(v8::Handle, const v8::AccessorInfo& info); - static v8::Handle ForceCompletion(const v8::Arguments &args); + static QV4::Value ForceCompletion(const v8::Arguments &args); static void StatusChangedSetter(v8::Handle, v8::Handle value, const v8::AccessorInfo& info); @@ -1408,11 +1408,11 @@ v8::Handle QV8IncubatorResource::ForceCompletionGetter(v8::Handleengine)->forceCompletion; } -v8::Handle QV8IncubatorResource::ForceCompletion(const v8::Arguments &args) +QV4::Value QV8IncubatorResource::ForceCompletion(const v8::Arguments &args) { QV8IncubatorResource *r = v8_resource_cast(args.This()); if (!r) - V8THROW_TYPE("Not an incubator object"); + V4THROW_TYPE("Not an incubator object"); r->forceCompletion(); diff --git a/src/qml/qml/qqmllocale.cpp b/src/qml/qml/qqmllocale.cpp index cd3b40b02d..3bb91a3079 100644 --- a/src/qml/qml/qqmllocale.cpp +++ b/src/qml/qml/qqmllocale.cpp @@ -63,7 +63,7 @@ public: #define GET_LOCALE_DATA_RESOURCE(OBJECT) \ QV8LocaleDataResource *r = v8_resource_cast(OBJECT); \ if (!r) \ - V8THROW_ERROR("Not a valid Locale object") + V4THROW_ERROR("Not a valid Locale object") static bool isLocaleObject(v8::Handle val) { @@ -161,7 +161,7 @@ void QQmlDateExtension::registerExtension(QV8Engine *engine) registerFunction(engine, dateTimeZoneUpdatedFunction, timeZoneUpdated); } -v8::Handle QQmlDateExtension::toLocaleString(const v8::Arguments& args) +QV4::Value QQmlDateExtension::toLocaleString(const v8::Arguments& args) { if (args.Length() > 2) return QV4::Value::undefinedValue(); @@ -193,7 +193,7 @@ v8::Handle QQmlDateExtension::toLocaleString(const v8::Arguments& arg QLocale::FormatType format = QLocale::FormatType(intFormat); formattedDt = r->locale.toString(dt, format); } else { - V8THROW_ERROR("Locale: Date.toLocaleString(): Invalid datetime format"); + V4THROW_ERROR("Locale: Date.toLocaleString(): Invalid datetime format"); } } else { formattedDt = r->locale.toString(dt, enumFormat); @@ -202,7 +202,7 @@ v8::Handle QQmlDateExtension::toLocaleString(const v8::Arguments& arg return r->engine->toString(formattedDt); } -v8::Handle QQmlDateExtension::toLocaleTimeString(const v8::Arguments& args) +QV4::Value QQmlDateExtension::toLocaleTimeString(const v8::Arguments& args) { if (args.Length() > 2) return QV4::Value::undefinedValue(); @@ -235,7 +235,7 @@ v8::Handle QQmlDateExtension::toLocaleTimeString(const v8::Arguments& QLocale::FormatType format = QLocale::FormatType(intFormat); formattedTime = r->locale.toString(time, format); } else { - V8THROW_ERROR("Locale: Date.toLocaleTimeString(): Invalid time format"); + V4THROW_ERROR("Locale: Date.toLocaleTimeString(): Invalid time format"); } } else { formattedTime = r->locale.toString(time, enumFormat); @@ -244,7 +244,7 @@ v8::Handle QQmlDateExtension::toLocaleTimeString(const v8::Arguments& return r->engine->toString(formattedTime); } -v8::Handle QQmlDateExtension::toLocaleDateString(const v8::Arguments& args) +QV4::Value QQmlDateExtension::toLocaleDateString(const v8::Arguments& args) { if (args.Length() > 2) return QV4::Value::undefinedValue(); @@ -277,7 +277,7 @@ v8::Handle QQmlDateExtension::toLocaleDateString(const v8::Arguments& QLocale::FormatType format = QLocale::FormatType(intFormat); formattedDate = r->locale.toString(date, format); } else { - V8THROW_ERROR("Locale: Date.loLocaleDateString(): Invalid date format"); + V4THROW_ERROR("Locale: Date.loLocaleDateString(): Invalid date format"); } } else { formattedDate = r->locale.toString(date, enumFormat); @@ -286,7 +286,7 @@ v8::Handle QQmlDateExtension::toLocaleDateString(const v8::Arguments& return r->engine->toString(formattedDate); } -v8::Handle QQmlDateExtension::fromLocaleString(const v8::Arguments& args) +QV4::Value QQmlDateExtension::fromLocaleString(const v8::Arguments& args) { QV4::ExecutionEngine *engine = args.GetIsolate()->GetEngine(); if (args.Length() == 1 && args[0]->IsString()) { @@ -297,7 +297,7 @@ v8::Handle QQmlDateExtension::fromLocaleString(const v8::Arguments& a } if (args.Length() < 1 || args.Length() > 3 || !isLocaleObject(args[0])) - V8THROW_ERROR("Locale: Date.fromLocaleString(): Invalid arguments"); + V4THROW_ERROR("Locale: Date.fromLocaleString(): Invalid arguments"); GET_LOCALE_DATA_RESOURCE(args[0]->ToObject()); @@ -313,7 +313,7 @@ v8::Handle QQmlDateExtension::fromLocaleString(const v8::Arguments& a QLocale::FormatType format = QLocale::FormatType(intFormat); dt = r->locale.toDateTime(dateString, format); } else { - V8THROW_ERROR("Locale: Date.fromLocaleString(): Invalid datetime format"); + V4THROW_ERROR("Locale: Date.fromLocaleString(): Invalid datetime format"); } } else { dt = r->locale.toDateTime(dateString, enumFormat); @@ -322,7 +322,7 @@ v8::Handle QQmlDateExtension::fromLocaleString(const v8::Arguments& a return QV4::Value::fromObject(engine->newDateObject(dt)); } -v8::Handle QQmlDateExtension::fromLocaleTimeString(const v8::Arguments& args) +QV4::Value QQmlDateExtension::fromLocaleTimeString(const v8::Arguments& args) { QV4::ExecutionEngine *engine = args.GetIsolate()->GetEngine(); @@ -336,7 +336,7 @@ v8::Handle QQmlDateExtension::fromLocaleTimeString(const v8::Argument } if (args.Length() < 1 || args.Length() > 3 || !isLocaleObject(args[0])) - V8THROW_ERROR("Locale: Date.fromLocaleTimeString(): Invalid arguments"); + V4THROW_ERROR("Locale: Date.fromLocaleTimeString(): Invalid arguments"); GET_LOCALE_DATA_RESOURCE(args[0]->ToObject()); @@ -352,7 +352,7 @@ v8::Handle QQmlDateExtension::fromLocaleTimeString(const v8::Argument QLocale::FormatType format = QLocale::FormatType(intFormat); tm = r->locale.toTime(dateString, format); } else { - V8THROW_ERROR("Locale: Date.fromLocaleTimeString(): Invalid datetime format"); + V4THROW_ERROR("Locale: Date.fromLocaleTimeString(): Invalid datetime format"); } } else { tm = r->locale.toTime(dateString, enumFormat); @@ -364,7 +364,7 @@ v8::Handle QQmlDateExtension::fromLocaleTimeString(const v8::Argument return QV4::Value::fromObject(engine->newDateObject(dt)); } -v8::Handle QQmlDateExtension::fromLocaleDateString(const v8::Arguments& args) +QV4::Value QQmlDateExtension::fromLocaleDateString(const v8::Arguments& args) { QV4::ExecutionEngine *engine = args.GetIsolate()->GetEngine(); @@ -376,7 +376,7 @@ v8::Handle QQmlDateExtension::fromLocaleDateString(const v8::Argument } if (args.Length() < 1 || args.Length() > 3 || !isLocaleObject(args[0])) - V8THROW_ERROR("Locale: Date.fromLocaleDateString(): Invalid arguments"); + V4THROW_ERROR("Locale: Date.fromLocaleDateString(): Invalid arguments"); GET_LOCALE_DATA_RESOURCE(args[0]->ToObject()); @@ -392,7 +392,7 @@ v8::Handle QQmlDateExtension::fromLocaleDateString(const v8::Argument QLocale::FormatType format = QLocale::FormatType(intFormat); dt = r->locale.toDate(dateString, format); } else { - V8THROW_ERROR("Locale: Date.fromLocaleDateString(): Invalid datetime format"); + V4THROW_ERROR("Locale: Date.fromLocaleDateString(): Invalid datetime format"); } } else { dt = r->locale.toDate(dateString, enumFormat); @@ -401,10 +401,10 @@ v8::Handle QQmlDateExtension::fromLocaleDateString(const v8::Argument return QV4::Value::fromObject(engine->newDateObject(QDateTime(dt))); } -v8::Handle QQmlDateExtension::timeZoneUpdated(const v8::Arguments& args) +QV4::Value QQmlDateExtension::timeZoneUpdated(const v8::Arguments& args) { if (args.Length() != 0) - V8THROW_ERROR("Locale: Date.timeZoneUpdated(): Invalid arguments"); + V4THROW_ERROR("Locale: Date.timeZoneUpdated(): Invalid arguments"); v8::Date::DateTimeConfigurationChangeNotification(); @@ -447,10 +447,10 @@ void QQmlNumberExtension::registerExtension(QV8Engine *engine) registerFunction(engine, numberFromLocaleStringFunction, fromLocaleString); } -v8::Handle QQmlNumberExtension::toLocaleString(const v8::Arguments& args) +QV4::Value QQmlNumberExtension::toLocaleString(const v8::Arguments& args) { if (args.Length() > 3) - V8THROW_ERROR("Locale: Number.toLocaleString(): Invalid arguments"); + V4THROW_ERROR("Locale: Number.toLocaleString(): Invalid arguments"); double number = args.This()->ToNumber()->Value(); @@ -468,7 +468,7 @@ v8::Handle QQmlNumberExtension::toLocaleString(const v8::Arguments& a uint16_t format = 'f'; if (args.Length() > 1) { if (!args[1]->IsString()) - V8THROW_ERROR("Locale: Number.toLocaleString(): Invalid arguments"); + V4THROW_ERROR("Locale: Number.toLocaleString(): Invalid arguments"); v8::Handle fs = args[1]->ToString(); if (!fs.IsEmpty() && fs->Length()) { v8::String::Value value(fs); @@ -479,17 +479,17 @@ v8::Handle QQmlNumberExtension::toLocaleString(const v8::Arguments& a int prec = 2; if (args.Length() > 2) { if (!args[2]->IsNumber()) - V8THROW_ERROR("Locale: Number.toLocaleString(): Invalid arguments"); + V4THROW_ERROR("Locale: Number.toLocaleString(): Invalid arguments"); prec = args[2]->IntegerValue(); } return r->engine->toString(r->locale.toString(number, (char)format, prec)); } -v8::Handle QQmlNumberExtension::toLocaleCurrencyString(const v8::Arguments& args) +QV4::Value QQmlNumberExtension::toLocaleCurrencyString(const v8::Arguments& args) { if (args.Length() > 2) - V8THROW_ERROR("Locale: Number.toLocaleCurrencyString(): Invalid arguments"); + V4THROW_ERROR("Locale: Number.toLocaleCurrencyString(): Invalid arguments"); double number = args.This()->ToNumber()->Value(); @@ -500,31 +500,31 @@ v8::Handle QQmlNumberExtension::toLocaleCurrencyString(const v8::Argu } if (!isLocaleObject(args[0])) - V8THROW_ERROR("Locale: Number.toLocaleCurrencyString(): Invalid arguments"); + V4THROW_ERROR("Locale: Number.toLocaleCurrencyString(): Invalid arguments"); GET_LOCALE_DATA_RESOURCE(args[0]->ToObject()); QString symbol; if (args.Length() > 1) { if (!args[1]->IsString()) - V8THROW_ERROR("Locale: Number.toLocaleString(): Invalid arguments"); + V4THROW_ERROR("Locale: Number.toLocaleString(): Invalid arguments"); symbol = args[1]->v4Value().toQString(); } return r->engine->toString(r->locale.toCurrencyString(number, symbol)); } -v8::Handle QQmlNumberExtension::fromLocaleString(const v8::Arguments& args) +QV4::Value QQmlNumberExtension::fromLocaleString(const v8::Arguments& args) { if (args.Length() < 1 || args.Length() > 2) - V8THROW_ERROR("Locale: Number.fromLocaleString(): Invalid arguments"); + V4THROW_ERROR("Locale: Number.fromLocaleString(): Invalid arguments"); int numberIdx = 0; QLocale locale; if (args.Length() == 2) { if (!isLocaleObject(args[0])) - V8THROW_ERROR("Locale: Number.fromLocaleString(): Invalid arguments"); + V4THROW_ERROR("Locale: Number.fromLocaleString(): Invalid arguments"); GET_LOCALE_DATA_RESOURCE(args[0]->ToObject()); locale = r->locale; @@ -534,15 +534,15 @@ v8::Handle QQmlNumberExtension::fromLocaleString(const v8::Arguments& v8::Handle ns = args[numberIdx]->ToString(); if (ns.IsEmpty() || ns->Length() == 0) - return v8::Number::New(Q_QNAN); + return QV4::Value::fromDouble(Q_QNAN); bool ok = false; double val = locale.toDouble(ns->v4Value().asString()->toQString(), &ok); if (!ok) - V8THROW_ERROR("Locale: Number.fromLocaleString(): Invalid format") + V4THROW_ERROR("Locale: Number.fromLocaleString(): Invalid format") - return v8::Number::New(val); + return QV4::Value::fromDouble(val); } //-------------- @@ -599,12 +599,12 @@ static v8::Handle locale_get_uiLanguages(v8::Handle, cons return result; } -static v8::Handle locale_currencySymbol(const v8::Arguments &args) +static QV4::Value locale_currencySymbol(const v8::Arguments &args) { GET_LOCALE_DATA_RESOURCE(args.This()); if (args.Length() > 1) - V8THROW_ERROR("Locale: currencySymbol(): Invalid arguments"); + V4THROW_ERROR("Locale: currencySymbol(): Invalid arguments"); QLocale::CurrencySymbolFormat format = QLocale::CurrencySymbol; if (args.Length() == 1) { @@ -616,10 +616,10 @@ static v8::Handle locale_currencySymbol(const v8::Arguments &args) } #define LOCALE_FORMAT(FUNC) \ -static v8::Handle locale_ ##FUNC (const v8::Arguments &args) { \ +static QV4::Value locale_ ##FUNC (const v8::Arguments &args) { \ GET_LOCALE_DATA_RESOURCE(args.This());\ if (args.Length() > 1) \ - V8THROW_ERROR("Locale: " #FUNC "(): Invalid arguments"); \ + V4THROW_ERROR("Locale: " #FUNC "(): Invalid arguments"); \ QLocale::FormatType format = QLocale::LongFormat;\ if (args.Length() == 1) { \ quint32 intFormat = args[0]->Uint32Value(); \ @@ -634,14 +634,14 @@ LOCALE_FORMAT(dateFormat) // +1 added to idx because JS is 0-based, whereas QLocale months begin at 1. #define LOCALE_FORMATTED_MONTHNAME(VARIABLE) \ -static v8::Handle locale_ ## VARIABLE (const v8::Arguments &args) {\ +static QV4::Value locale_ ## VARIABLE (const v8::Arguments &args) {\ GET_LOCALE_DATA_RESOURCE(args.This()); \ if (args.Length() < 1 || args.Length() > 2) \ - V8THROW_ERROR("Locale: " #VARIABLE "(): Invalid arguments"); \ + V4THROW_ERROR("Locale: " #VARIABLE "(): Invalid arguments"); \ QLocale::FormatType enumFormat = QLocale::LongFormat; \ int idx = args[0]->IntegerValue() + 1; \ if (idx < 1 || idx > 12) \ - V8THROW_ERROR("Locale: Invalid month"); \ + V4THROW_ERROR("Locale: Invalid month"); \ QString name; \ if (args.Length() == 2) { \ if (args[1]->IsNumber()) { \ @@ -649,7 +649,7 @@ static v8::Handle locale_ ## VARIABLE (const v8::Arguments &args) {\ QLocale::FormatType format = QLocale::FormatType(intFormat); \ name = r->locale. VARIABLE(idx, format); \ } else { \ - V8THROW_ERROR("Locale: Invalid datetime format"); \ + V4THROW_ERROR("Locale: Invalid datetime format"); \ } \ } else { \ name = r->locale. VARIABLE(idx, enumFormat); \ @@ -659,14 +659,14 @@ static v8::Handle locale_ ## VARIABLE (const v8::Arguments &args) {\ // 0 -> 7 as Qt::Sunday is 7, but Sunday is 0 in JS Date #define LOCALE_FORMATTED_DAYNAME(VARIABLE) \ -static v8::Handle locale_ ## VARIABLE (const v8::Arguments &args) {\ +static QV4::Value locale_ ## VARIABLE (const v8::Arguments &args) {\ GET_LOCALE_DATA_RESOURCE(args.This()); \ if (args.Length() < 1 || args.Length() > 2) \ - V8THROW_ERROR("Locale: " #VARIABLE "(): Invalid arguments"); \ + V4THROW_ERROR("Locale: " #VARIABLE "(): Invalid arguments"); \ QLocale::FormatType enumFormat = QLocale::LongFormat; \ int idx = args[0]->IntegerValue(); \ if (idx < 0 || idx > 7) \ - V8THROW_ERROR("Locale: Invalid day"); \ + V4THROW_ERROR("Locale: Invalid day"); \ if (idx == 0) idx = 7; \ QString name; \ if (args.Length() == 2) { \ @@ -675,7 +675,7 @@ static v8::Handle locale_ ## VARIABLE (const v8::Arguments &args) {\ QLocale::FormatType format = QLocale::FormatType(intFormat); \ name = r->locale. VARIABLE(idx, format); \ } else { \ - V8THROW_ERROR("Locale: Invalid datetime format"); \ + V4THROW_ERROR("Locale: Invalid datetime format"); \ } \ } else { \ name = r->locale. VARIABLE(idx, enumFormat); \ @@ -871,7 +871,7 @@ QQmlLocale::~QQmlLocale() { } -v8::Handle QQmlLocale::locale(QV8Engine *v8engine, const QString &locale) +QV4::Value QQmlLocale::locale(QV8Engine *v8engine, const QString &locale) { QV8LocaleDataDeletable *d = localeV8Data(v8engine); v8::Handle v8Value = d->constructor->NewInstance(); @@ -882,7 +882,7 @@ v8::Handle QQmlLocale::locale(QV8Engine *v8engine, const QString &loc r->locale = QLocale(locale); v8Value->SetExternalResource(r); - return v8Value; + return v8Value->v4Value(); } static const char localeCompareFunction[] = @@ -901,7 +901,7 @@ void QQmlLocale::registerStringLocaleCompare(QV8Engine *engine) registerFunction(engine, localeCompareFunction, localeCompare); } -v8::Handle QQmlLocale::localeCompare(const v8::Arguments &args) +QV4::Value QQmlLocale::localeCompare(const v8::Arguments &args) { if (args.Length() != 1 || (!args[0]->IsString() && !args[0]->IsStringObject())) return QV4::Value::undefinedValue(); @@ -912,7 +912,7 @@ v8::Handle QQmlLocale::localeCompare(const v8::Arguments &args) QString thisString = args.This()->v4Value().toString(args.GetIsolate()->GetEngine()->current)->toQString(); QString thatString = args[0]->v4Value().toString(args.GetIsolate()->GetEngine()->current)->toQString(); - return v8::Integer::New(QString::localeAwareCompare(thisString, thatString)); + return QV4::Value::fromInt32(QString::localeAwareCompare(thisString, thatString)); } /*! diff --git a/src/qml/qml/qqmllocale_p.h b/src/qml/qml/qqmllocale_p.h index 25f98d9168..dcc9746cc8 100644 --- a/src/qml/qml/qqmllocale_p.h +++ b/src/qml/qml/qqmllocale_p.h @@ -58,13 +58,13 @@ public: static void registerExtension(QV8Engine *engine); private: - static v8::Handle toLocaleString(const v8::Arguments& args); - static v8::Handle toLocaleTimeString(const v8::Arguments& args); - static v8::Handle toLocaleDateString(const v8::Arguments& args); - static v8::Handle fromLocaleString(const v8::Arguments& args); - static v8::Handle fromLocaleTimeString(const v8::Arguments& args); - static v8::Handle fromLocaleDateString(const v8::Arguments& args); - static v8::Handle timeZoneUpdated(const v8::Arguments& args); + static QV4::Value toLocaleString(const v8::Arguments& args); + static QV4::Value toLocaleTimeString(const v8::Arguments& args); + static QV4::Value toLocaleDateString(const v8::Arguments& args); + static QV4::Value fromLocaleString(const v8::Arguments& args); + static QV4::Value fromLocaleTimeString(const v8::Arguments& args); + static QV4::Value fromLocaleDateString(const v8::Arguments& args); + static QV4::Value timeZoneUpdated(const v8::Arguments& args); }; @@ -74,9 +74,9 @@ public: static void registerExtension(QV8Engine *engine); private: - static v8::Handle toLocaleString(const v8::Arguments& args); - static v8::Handle fromLocaleString(const v8::Arguments& args); - static v8::Handle toLocaleCurrencyString(const v8::Arguments& args); + static QV4::Value toLocaleString(const v8::Arguments& args); + static QV4::Value fromLocaleString(const v8::Arguments& args); + static QV4::Value toLocaleCurrencyString(const v8::Arguments& args); }; @@ -118,14 +118,14 @@ public: Saturday = Qt::Saturday }; - static v8::Handle locale(QV8Engine *v8engine, const QString &lang); + static QV4::Value locale(QV8Engine *v8engine, const QString &lang); static void registerStringLocaleCompare(QV8Engine *engine); private: QQmlLocale(); - static v8::Handle localeCompare(const v8::Arguments &args); + static QV4::Value localeCompare(const v8::Arguments &args); }; diff --git a/src/qml/qml/qqmlxmlhttprequest.cpp b/src/qml/qml/qqmlxmlhttprequest.cpp index 46ffbb46f8..608ebad985 100644 --- a/src/qml/qml/qqmlxmlhttprequest.cpp +++ b/src/qml/qml/qqmlxmlhttprequest.cpp @@ -50,6 +50,7 @@ #include "qqmlexpression_p.h" #include "qqmlglobal_p.h" #include +#include #include #include @@ -67,6 +68,9 @@ return v8::Handle(); \ } +#define V4THROW_REFERENCE(string) \ + v8::Isolate::GetEngine()->current->throwError(QV4::Value::fromObject(v8::Isolate::GetEngine()->newReferenceErrorObject(QStringLiteral(string)))) + #define D(arg) (arg)->release() #define A(arg) (arg)->addref() @@ -977,9 +981,9 @@ public: int replyStatus() const; QString replyStatusText() const; - v8::Handle open(v8::Handle me, const QString &, const QUrl &); - v8::Handle send(v8::Handle me, const QByteArray &); - v8::Handle abort(v8::Handle me); + QV4::Value open(v8::Handle me, const QString &, const QUrl &); + QV4::Value send(v8::Handle me, const QByteArray &); + QV4::Value abort(v8::Handle me); void addHeader(const QString &, const QString &); QString header(const QString &name); @@ -1073,7 +1077,7 @@ QString QQmlXMLHttpRequest::replyStatusText() const return m_statusText; } -v8::Handle QQmlXMLHttpRequest::open(v8::Handle me, const QString &method, +QV4::Value QQmlXMLHttpRequest::open(v8::Handle me, const QString &method, const QUrl &url) { destroyNetwork(); @@ -1199,7 +1203,7 @@ void QQmlXMLHttpRequest::requestFromUrl(const QUrl &url) this, SLOT(finished())); } -v8::Handle QQmlXMLHttpRequest::send(v8::Handle me, const QByteArray &data) +QV4::Value QQmlXMLHttpRequest::send(v8::Handle me, const QByteArray &data) { m_errorFlag = false; m_sendFlag = true; @@ -1213,7 +1217,7 @@ v8::Handle QQmlXMLHttpRequest::send(v8::Handle me, const return QV4::Value::undefinedValue(); } -v8::Handle QQmlXMLHttpRequest::abort(v8::Handle me) +QV4::Value QQmlXMLHttpRequest::abort(v8::Handle me) { destroyNetwork(); m_responseEntityBody = QByteArray(); @@ -1511,14 +1515,14 @@ void QQmlXMLHttpRequest::destroyNetwork() } // XMLHttpRequest methods -static v8::Handle qmlxmlhttprequest_open(const v8::Arguments &args) +static QV4::Value qmlxmlhttprequest_open(const v8::Arguments &args) { QQmlXMLHttpRequest *r = v8_resource_cast(args.This()); if (!r) - V8THROW_REFERENCE("Not an XMLHttpRequest object"); + V4THROW_REFERENCE("Not an XMLHttpRequest object"); if (args.Length() < 2 || args.Length() > 5) - V8THROW_DOM(DOMEXCEPTION_SYNTAX_ERR, "Incorrect argument count"); + V4THROW_DOM(DOMEXCEPTION_SYNTAX_ERR, "Incorrect argument count"); QV8Engine *engine = r->engine; @@ -1529,7 +1533,7 @@ static v8::Handle qmlxmlhttprequest_open(const v8::Arguments &args) method != QLatin1String("HEAD") && method != QLatin1String("POST") && method != QLatin1String("DELETE")) - V8THROW_DOM(DOMEXCEPTION_SYNTAX_ERR, "Unsupported HTTP method type"); + V4THROW_DOM(DOMEXCEPTION_SYNTAX_ERR, "Unsupported HTTP method type"); // Argument 1 - URL QUrl url = QUrl(args[1]->v4Value().toQString()); @@ -1539,7 +1543,7 @@ static v8::Handle qmlxmlhttprequest_open(const v8::Arguments &args) // Argument 2 - async (optional) if (args.Length() > 2 && !args[2]->BooleanValue()) - V8THROW_DOM(DOMEXCEPTION_NOT_SUPPORTED_ERR, "Synchronous XMLHttpRequest calls are not supported"); + V4THROW_DOM(DOMEXCEPTION_NOT_SUPPORTED_ERR, "Synchronous XMLHttpRequest calls are not supported"); // Argument 3/4 - user/pass (optional) QString username, password; @@ -1558,17 +1562,17 @@ static v8::Handle qmlxmlhttprequest_open(const v8::Arguments &args) return r->open(constructMeObject(args.This(), engine), method, url); } -static v8::Handle qmlxmlhttprequest_setRequestHeader(const v8::Arguments &args) +static QV4::Value qmlxmlhttprequest_setRequestHeader(const v8::Arguments &args) { QQmlXMLHttpRequest *r = v8_resource_cast(args.This()); if (!r) - V8THROW_REFERENCE("Not an XMLHttpRequest object"); + V4THROW_REFERENCE("Not an XMLHttpRequest object"); if (args.Length() != 2) - V8THROW_DOM(DOMEXCEPTION_SYNTAX_ERR, "Incorrect argument count"); + V4THROW_DOM(DOMEXCEPTION_SYNTAX_ERR, "Incorrect argument count"); if (r->readyState() != QQmlXMLHttpRequest::Opened || r->sendFlag()) - V8THROW_DOM(DOMEXCEPTION_INVALID_STATE_ERR, "Invalid state"); + V4THROW_DOM(DOMEXCEPTION_INVALID_STATE_ERR, "Invalid state"); QV8Engine *engine = r->engine; @@ -1605,17 +1609,17 @@ static v8::Handle qmlxmlhttprequest_setRequestHeader(const v8::Argume return QV4::Value::undefinedValue(); } -static v8::Handle qmlxmlhttprequest_send(const v8::Arguments &args) +static QV4::Value qmlxmlhttprequest_send(const v8::Arguments &args) { QQmlXMLHttpRequest *r = v8_resource_cast(args.This()); if (!r) - V8THROW_REFERENCE("Not an XMLHttpRequest object"); + V4THROW_REFERENCE("Not an XMLHttpRequest object"); QV8Engine *engine = r->engine; if (r->readyState() != QQmlXMLHttpRequest::Opened || r->sendFlag()) - V8THROW_DOM(DOMEXCEPTION_INVALID_STATE_ERR, "Invalid state"); + V4THROW_DOM(DOMEXCEPTION_INVALID_STATE_ERR, "Invalid state"); QByteArray data; if (args.Length() > 0) @@ -1624,49 +1628,49 @@ static v8::Handle qmlxmlhttprequest_send(const v8::Arguments &args) return r->send(constructMeObject(args.This(), engine), data); } -static v8::Handle qmlxmlhttprequest_abort(const v8::Arguments &args) +static QV4::Value qmlxmlhttprequest_abort(const v8::Arguments &args) { QQmlXMLHttpRequest *r = v8_resource_cast(args.This()); if (!r) - V8THROW_REFERENCE("Not an XMLHttpRequest object"); + V4THROW_REFERENCE("Not an XMLHttpRequest object"); return r->abort(constructMeObject(args.This(), r->engine)); } -static v8::Handle qmlxmlhttprequest_getResponseHeader(const v8::Arguments &args) +static QV4::Value qmlxmlhttprequest_getResponseHeader(const v8::Arguments &args) { QQmlXMLHttpRequest *r = v8_resource_cast(args.This()); if (!r) - V8THROW_REFERENCE("Not an XMLHttpRequest object"); + V4THROW_REFERENCE("Not an XMLHttpRequest object"); QV8Engine *engine = r->engine; if (args.Length() != 1) - V8THROW_DOM(DOMEXCEPTION_SYNTAX_ERR, "Incorrect argument count"); + V4THROW_DOM(DOMEXCEPTION_SYNTAX_ERR, "Incorrect argument count"); if (r->readyState() != QQmlXMLHttpRequest::Loading && r->readyState() != QQmlXMLHttpRequest::Done && r->readyState() != QQmlXMLHttpRequest::HeadersReceived) - V8THROW_DOM(DOMEXCEPTION_INVALID_STATE_ERR, "Invalid state"); + V4THROW_DOM(DOMEXCEPTION_INVALID_STATE_ERR, "Invalid state"); return engine->toString(r->header(args[0]->v4Value().toQString())); } -static v8::Handle qmlxmlhttprequest_getAllResponseHeaders(const v8::Arguments &args) +static QV4::Value qmlxmlhttprequest_getAllResponseHeaders(const v8::Arguments &args) { QQmlXMLHttpRequest *r = v8_resource_cast(args.This()); if (!r) - V8THROW_REFERENCE("Not an XMLHttpRequest object"); + V4THROW_REFERENCE("Not an XMLHttpRequest object"); QV8Engine *engine = r->engine; if (args.Length() != 0) - V8THROW_DOM(DOMEXCEPTION_SYNTAX_ERR, "Incorrect argument count"); + V4THROW_DOM(DOMEXCEPTION_SYNTAX_ERR, "Incorrect argument count"); if (r->readyState() != QQmlXMLHttpRequest::Loading && r->readyState() != QQmlXMLHttpRequest::Done && r->readyState() != QQmlXMLHttpRequest::HeadersReceived) - V8THROW_DOM(DOMEXCEPTION_INVALID_STATE_ERR, "Invalid state"); + V4THROW_DOM(DOMEXCEPTION_INVALID_STATE_ERR, "Invalid state"); return engine->toString(r->headers()); } @@ -1750,7 +1754,7 @@ static v8::Handle qmlxmlhttprequest_responseXML(v8::Handle qmlxmlhttprequest_new(const v8::Arguments &args) +static QV4::Value qmlxmlhttprequest_new(const v8::Arguments &args) { if (args.IsConstructCall()) { QV8Engine *engine = V8ENGINE(); @@ -1759,7 +1763,7 @@ static v8::Handle qmlxmlhttprequest_new(const v8::Arguments &args) QQmlXMLHttpRequest *r = new QQmlXMLHttpRequest(engine, engine->networkAccessManager()); args.This()->SetExternalResource(r); - return args.This(); + return args.This()->v4Value(); } else { return QV4::Value::undefinedValue(); } diff --git a/src/qml/qml/v4/qv4context_p.h b/src/qml/qml/v4/qv4context_p.h index 1043965b46..5b694a22bf 100644 --- a/src/qml/qml/v4/qv4context_p.h +++ b/src/qml/qml/v4/qv4context_p.h @@ -74,7 +74,7 @@ struct Q_QML_EXPORT DiagnosticMessage struct CallContext; -struct ExecutionContext +struct Q_QML_EXPORT ExecutionContext { enum Type { Type_GlobalContext = 0x1, diff --git a/src/qml/qml/v4/qv4v8.cpp b/src/qml/qml/v4/qv4v8.cpp index 7b2345112b..f65ad0dab8 100644 --- a/src/qml/qml/v4/qv4v8.cpp +++ b/src/qml/qml/v4/qv4v8.cpp @@ -1354,6 +1354,11 @@ Handle Arguments::This() const return m_thisObject; } +QV4::Value Arguments::ThisV4() const +{ + return m_thisObject->v4Value(); +} + Handle Arguments::Holder() const { // ### FIXME. @@ -1641,7 +1646,7 @@ protected: Arguments arguments(args, argc, thisObject, false, that->m_functionTemplate->m_data); QV4::Value result = QV4::Value::undefinedValue(); if (that->m_functionTemplate->m_callback) - result = that->m_functionTemplate->m_callback(arguments)->v4Value(); + result = that->m_functionTemplate->m_callback(arguments); return result; } @@ -1657,7 +1662,7 @@ protected: QV4::Value result = QV4::Value::undefinedValue(); if (that->m_functionTemplate->m_callback) - result = that->m_functionTemplate->m_callback(arguments)->v4Value(); + result = that->m_functionTemplate->m_callback(arguments); if (result.isObject()) return result; return QV4::Value::fromObject(obj); diff --git a/src/qml/qml/v4/qv4v8_p.h b/src/qml/qml/v4/qv4v8_p.h index 113ac11615..ca68ae2638 100644 --- a/src/qml/qml/v4/qv4v8_p.h +++ b/src/qml/qml/v4/qv4v8_p.h @@ -1622,6 +1622,7 @@ class V8EXPORT Arguments { int Length() const; Handle operator[](int i) const; Handle This() const; + QV4::Value ThisV4() const; Handle Holder() const; bool IsConstructCall() const; Handle Data() const; @@ -1652,7 +1653,7 @@ private: }; -typedef Handle (*InvocationCallback)(const Arguments& args); +typedef QV4::Value (*InvocationCallback)(const Arguments& args); /** * NamedProperty[Getter|Setter] are used as interceptors on object. diff --git a/src/qml/qml/v8/qqmlbuiltinfunctions.cpp b/src/qml/qml/v8/qqmlbuiltinfunctions.cpp index 81f013d364..a967407788 100644 --- a/src/qml/qml/v8/qqmlbuiltinfunctions.cpp +++ b/src/qml/qml/v8/qqmlbuiltinfunctions.cpp @@ -52,6 +52,8 @@ #include #include +#include + #include #include #include @@ -107,7 +109,7 @@ static QString jsStack() { return stackFrames.join(QLatin1String("\n")); } -v8::Handle console(ConsoleLogTypes logType, const v8::Arguments &args, +QV4::Value console(ConsoleLogTypes logType, const v8::Arguments &args, bool printStack = false) { QString result; @@ -173,7 +175,7 @@ v8::Handle console(ConsoleLogTypes logType, const v8::Arguments &args return QV4::Value::undefinedValue(); } -v8::Handle gc(const v8::Arguments &args) +QV4::Value gc(const v8::Arguments &args) { Q_UNUSED(args); // ### @@ -181,12 +183,12 @@ v8::Handle gc(const v8::Arguments &args) return QV4::Value::undefinedValue(); } -v8::Handle consoleError(const v8::Arguments &args) +QV4::Value consoleError(const v8::Arguments &args) { return console(Error, args); } -v8::Handle consoleLog(const v8::Arguments &args) +QV4::Value consoleLog(const v8::Arguments &args) { //console.log //console.debug @@ -195,7 +197,7 @@ v8::Handle consoleLog(const v8::Arguments &args) return console(Log, args); } -v8::Handle consoleProfile(const v8::Arguments &args) +QV4::Value consoleProfile(const v8::Arguments &args) { //DeclarativeDebugTrace cannot handle nested profiling //although v8 can handle several profiling at once, @@ -224,7 +226,7 @@ v8::Handle consoleProfile(const v8::Arguments &args) return QV4::Value::undefinedValue(); } -v8::Handle consoleProfileEnd(const v8::Arguments &args) +QV4::Value consoleProfileEnd(const v8::Arguments &args) { //DeclarativeDebugTrace cannot handle nested profiling //although v8 can handle several profiling at once, @@ -253,19 +255,19 @@ v8::Handle consoleProfileEnd(const v8::Arguments &args) return QV4::Value::undefinedValue(); } -v8::Handle consoleTime(const v8::Arguments &args) +QV4::Value consoleTime(const v8::Arguments &args) { if (args.Length() != 1) - V8THROW_ERROR("console.time(): Invalid arguments"); + V4THROW_ERROR("console.time(): Invalid arguments"); QString name = args[0]->v4Value().toQString(); V8ENGINE()->startTimer(name); return QV4::Value::undefinedValue(); } -v8::Handle consoleTimeEnd(const v8::Arguments &args) +QV4::Value consoleTimeEnd(const v8::Arguments &args) { if (args.Length() != 1) - V8THROW_ERROR("console.time(): Invalid arguments"); + V4THROW_ERROR("console.time(): Invalid arguments"); QString name = args[0]->v4Value().toQString(); bool wasRunning; qint64 elapsed = V8ENGINE()->stopTimer(name, &wasRunning); @@ -275,7 +277,7 @@ v8::Handle consoleTimeEnd(const v8::Arguments &args) return QV4::Value::undefinedValue(); } -v8::Handle consoleCount(const v8::Arguments &args) +QV4::Value consoleCount(const v8::Arguments &args) { // first argument: name to print. Ignore any additional arguments QString name; @@ -303,10 +305,10 @@ v8::Handle consoleCount(const v8::Arguments &args) return QV4::Value::undefinedValue(); } -v8::Handle consoleTrace(const v8::Arguments &args) +QV4::Value consoleTrace(const v8::Arguments &args) { if (args.Length() != 0) - V8THROW_ERROR("console.trace(): Invalid arguments"); + V4THROW_ERROR("console.trace(): Invalid arguments"); QString stack = jsStack(); @@ -320,15 +322,15 @@ v8::Handle consoleTrace(const v8::Arguments &args) return QV4::Value::undefinedValue(); } -v8::Handle consoleWarn(const v8::Arguments &args) +QV4::Value consoleWarn(const v8::Arguments &args) { return console(Warn, args); } -v8::Handle consoleAssert(const v8::Arguments &args) +QV4::Value consoleAssert(const v8::Arguments &args) { if (args.Length() == 0) - V8THROW_ERROR("console.assert(): Missing argument"); + V4THROW_ERROR("console.assert(): Missing argument"); if (!args[0]->ToBoolean()->Value()) { QString message; @@ -354,21 +356,21 @@ v8::Handle consoleAssert(const v8::Arguments &args) return QV4::Value::undefinedValue(); } -v8::Handle consoleException(const v8::Arguments &args) +QV4::Value consoleException(const v8::Arguments &args) { if (args.Length() == 0) - V8THROW_ERROR("console.exception(): Missing argument"); + V4THROW_ERROR("console.exception(): Missing argument"); console(Error, args, true); return QV4::Value::undefinedValue(); } -v8::Handle stringArg(const v8::Arguments &args) +QV4::Value stringArg(const v8::Arguments &args) { QString value = args.This()->v4Value().toQString(); if (args.Length() != 1) - V8THROW_ERROR("String.arg(): Invalid arguments"); + V4THROW_ERROR("String.arg(): Invalid arguments"); v8::Handle arg = args[0]; if (arg->IsUint32()) @@ -387,12 +389,12 @@ v8::Handle stringArg(const v8::Arguments &args) \qmlmethod bool Qt::isQtObject(object) Returns true if \c object is a valid reference to a Qt or QML object, otherwise false. */ -v8::Handle isQtObject(const v8::Arguments &args) +QV4::Value isQtObject(const v8::Arguments &args) { if (args.Length() == 0) - return v8::Boolean::New(false); + return QV4::Value::fromBoolean(false); - return v8::Boolean::New(0 != V8ENGINE()->toQObject(args[0]->v4Value())); + return QV4::Value::fromBoolean(0 != V8ENGINE()->toQObject(args[0]->v4Value())); } /*! @@ -401,11 +403,11 @@ v8::Handle isQtObject(const v8::Arguments &args) Returns a color with the specified \c red, \c green, \c blue and \c alpha components. All components should be in the range 0-1 inclusive. */ -v8::Handle rgba(const v8::Arguments &args) +QV4::Value rgba(const v8::Arguments &args) { int argCount = args.Length(); if (argCount < 3 || argCount > 4) - V8THROW_ERROR("Qt.rgba(): Invalid arguments"); + V4THROW_ERROR("Qt.rgba(): Invalid arguments"); double r = args[0]->NumberValue(); double g = args[1]->NumberValue(); @@ -430,11 +432,11 @@ v8::Handle rgba(const v8::Arguments &args) Returns a color with the specified \c hue, \c saturation, \c lightness and \c alpha components. All components should be in the range 0-1 inclusive. */ -v8::Handle hsla(const v8::Arguments &args) +QV4::Value hsla(const v8::Arguments &args) { int argCount = args.Length(); if (argCount < 3 || argCount > 4) - V8THROW_ERROR("Qt.hsla(): Invalid arguments"); + V4THROW_ERROR("Qt.hsla(): Invalid arguments"); double h = args[0]->NumberValue(); double s = args[1]->NumberValue(); @@ -461,10 +463,10 @@ may be either color values or string values. If a string value is supplied it must be convertible to a color, as described for the \l{colorbasictypedocs}{color} basic type. */ -v8::Handle colorEqual(const v8::Arguments &args) +QV4::Value colorEqual(const v8::Arguments &args) { if (args.Length() != 2) - V8THROW_ERROR("Qt.colorEqual(): Invalid arguments"); + V4THROW_ERROR("Qt.colorEqual(): Invalid arguments"); bool ok = false; @@ -472,20 +474,20 @@ v8::Handle colorEqual(const v8::Arguments &args) if (lhs.userType() == QVariant::String) { lhs = QQmlStringConverters::colorFromString(lhs.toString(), &ok); if (!ok) { - V8THROW_ERROR("Qt.colorEqual(): Invalid color name"); + V4THROW_ERROR("Qt.colorEqual(): Invalid color name"); } } else if (lhs.userType() != QVariant::Color) { - V8THROW_ERROR("Qt.colorEqual(): Invalid arguments"); + V4THROW_ERROR("Qt.colorEqual(): Invalid arguments"); } QVariant rhs = V8ENGINE()->toVariant(args[1]->v4Value(), -1); if (rhs.userType() == QVariant::String) { rhs = QQmlStringConverters::colorFromString(rhs.toString(), &ok); if (!ok) { - V8THROW_ERROR("Qt.colorEqual(): Invalid color name"); + V4THROW_ERROR("Qt.colorEqual(): Invalid color name"); } } else if (rhs.userType() != QVariant::Color) { - V8THROW_ERROR("Qt.colorEqual(): Invalid arguments"); + V4THROW_ERROR("Qt.colorEqual(): Invalid arguments"); } bool equal = (lhs == rhs); @@ -499,10 +501,10 @@ Returns a \c rect with the top-left corner at \c x, \c y and the specified \c wi The returned object has \c x, \c y, \c width and \c height attributes with the given values. */ -v8::Handle rect(const v8::Arguments &args) +QV4::Value rect(const v8::Arguments &args) { if (args.Length() != 4) - V8THROW_ERROR("Qt.rect(): Invalid arguments"); + V4THROW_ERROR("Qt.rect(): Invalid arguments"); double x = args[0]->NumberValue(); double y = args[1]->NumberValue(); @@ -516,10 +518,10 @@ v8::Handle rect(const v8::Arguments &args) \qmlmethod point Qt::point(int x, int y) Returns a Point with the specified \c x and \c y coordinates. */ -v8::Handle point(const v8::Arguments &args) +QV4::Value point(const v8::Arguments &args) { if (args.Length() != 2) - V8THROW_ERROR("Qt.point(): Invalid arguments"); + V4THROW_ERROR("Qt.point(): Invalid arguments"); double x = args[0]->ToNumber()->Value(); double y = args[1]->ToNumber()->Value(); @@ -531,10 +533,10 @@ v8::Handle point(const v8::Arguments &args) \qmlmethod Qt::size(int width, int height) Returns a Size with the specified \c width and \c height. */ -v8::Handle size(const v8::Arguments &args) +QV4::Value size(const v8::Arguments &args) { if (args.Length() != 2) - V8THROW_ERROR("Qt.size(): Invalid arguments"); + V4THROW_ERROR("Qt.size(): Invalid arguments"); double w = args[0]->ToNumber()->Value(); double h = args[1]->ToNumber()->Value(); @@ -546,10 +548,10 @@ v8::Handle size(const v8::Arguments &args) \qmlmethod Qt::vector2d(real x, real y) Returns a Vector2D with the specified \c x and \c y. */ -v8::Handle vector2d(const v8::Arguments &args) +QV4::Value vector2d(const v8::Arguments &args) { if (args.Length() != 2) - V8THROW_ERROR("Qt.vector2d(): Invalid arguments"); + V4THROW_ERROR("Qt.vector2d(): Invalid arguments"); float xy[3]; // qvector2d uses float internally xy[0] = args[0]->ToNumber()->Value(); @@ -563,10 +565,10 @@ v8::Handle vector2d(const v8::Arguments &args) \qmlmethod Qt::vector3d(real x, real y, real z) Returns a Vector3D with the specified \c x, \c y and \c z. */ -v8::Handle vector3d(const v8::Arguments &args) +QV4::Value vector3d(const v8::Arguments &args) { if (args.Length() != 3) - V8THROW_ERROR("Qt.vector3d(): Invalid arguments"); + V4THROW_ERROR("Qt.vector3d(): Invalid arguments"); float xyz[3]; // qvector3d uses float internally xyz[0] = args[0]->ToNumber()->Value(); @@ -581,10 +583,10 @@ v8::Handle vector3d(const v8::Arguments &args) \qmlmethod Qt::vector4d(real x, real y, real z, real w) Returns a Vector4D with the specified \c x, \c y, \c z and \c w. */ -v8::Handle vector4d(const v8::Arguments &args) +QV4::Value vector4d(const v8::Arguments &args) { if (args.Length() != 4) - V8THROW_ERROR("Qt.vector4d(): Invalid arguments"); + V4THROW_ERROR("Qt.vector4d(): Invalid arguments"); float xyzw[4]; // qvector4d uses float internally xyzw[0] = args[0]->ToNumber()->Value(); @@ -600,10 +602,10 @@ v8::Handle vector4d(const v8::Arguments &args) \qmlmethod Qt::quaternion(real scalar, real x, real y, real z) Returns a Quaternion with the specified \c scalar, \c x, \c y, and \c z. */ -v8::Handle quaternion(const v8::Arguments &args) +QV4::Value quaternion(const v8::Arguments &args) { if (args.Length() != 4) - V8THROW_ERROR("Qt.quaternion(): Invalid arguments"); + V4THROW_ERROR("Qt.quaternion(): Invalid arguments"); qreal sxyz[4]; // qquaternion uses qreal internally sxyz[0] = args[0]->ToNumber()->Value(); @@ -623,16 +625,16 @@ key-value pairs where valid keys are the \l{fontbasictypedocs}{font} type's subproperty names, and the values are valid values for each subproperty. Invalid keys will be ignored. */ -v8::Handle font(const v8::Arguments &args) +QV4::Value font(const v8::Arguments &args) { if (args.Length() != 1 || !args[0]->IsObject()) - V8THROW_ERROR("Qt.font(): Invalid arguments"); + V4THROW_ERROR("Qt.font(): Invalid arguments"); v8::Handle obj = args[0]->ToObject(); bool ok = false; QVariant v = QQml_valueTypeProvider()->createVariantFromJsObject(QMetaType::QFont, QQmlV4Handle::fromV8Handle(obj), V8ENGINE(), &ok); if (!ok) - V8THROW_ERROR("Qt.font(): Invalid argument: no valid font subproperties specified"); + V4THROW_ERROR("Qt.font(): Invalid argument: no valid font subproperties specified"); return V8ENGINE()->fromVariant(v); } @@ -643,19 +645,19 @@ Alternatively, the function may be called with a single argument where that argument is a JavaScript array which contains the sixteen matrix values. */ -v8::Handle matrix4x4(const v8::Arguments &args) +QV4::Value matrix4x4(const v8::Arguments &args) { if (args.Length() == 1 && args[0]->IsObject()) { v8::Handle obj = args[0]->ToObject(); bool ok = false; QVariant v = QQml_valueTypeProvider()->createVariantFromJsObject(QMetaType::QMatrix4x4, QQmlV4Handle::fromV8Handle(obj), V8ENGINE(), &ok); if (!ok) - V8THROW_ERROR("Qt.matrix4x4(): Invalid argument: not a valid matrix4x4 values array"); + V4THROW_ERROR("Qt.matrix4x4(): Invalid argument: not a valid matrix4x4 values array"); return V8ENGINE()->fromVariant(v); } if (args.Length() != 16) - V8THROW_ERROR("Qt.matrix4x4(): Invalid arguments"); + V4THROW_ERROR("Qt.matrix4x4(): Invalid arguments"); qreal vals[16]; // qmatrix4x4 uses qreal internally vals[0] = args[0]->ToNumber()->Value(); @@ -693,10 +695,10 @@ by factor and converts the color back to RGB. If \c factor is not supplied, returns a color 50% lighter than \c baseColor (factor 1.5). */ -v8::Handle lighter(const v8::Arguments &args) +QV4::Value lighter(const v8::Arguments &args) { if (args.Length() != 1 && args.Length() != 2) - V8THROW_ERROR("Qt.lighter(): Invalid arguments"); + V4THROW_ERROR("Qt.lighter(): Invalid arguments"); QVariant v = V8ENGINE()->toVariant(args[0]->v4Value(), -1); if (v.userType() == QVariant::String) { @@ -731,10 +733,10 @@ by factor and converts the color back to RGB. If \c factor is not supplied, returns a color 50% darker than \c baseColor (factor 2.0). */ -v8::Handle darker(const v8::Arguments &args) +QV4::Value darker(const v8::Arguments &args) { if (args.Length() != 1 && args.Length() != 2) - V8THROW_ERROR("Qt.darker(): Invalid arguments"); + V4THROW_ERROR("Qt.darker(): Invalid arguments"); QVariant v = V8ENGINE()->toVariant(args[0]->v4Value(), -1); if (v.userType() == QVariant::String) { @@ -778,10 +780,10 @@ v8::Handle darker(const v8::Arguments &args) Tint is most useful when a subtle change is intended to be conveyed due to some event; you can then use tinting to more effectively tune the visible color. */ -v8::Handle tint(const v8::Arguments &args) +QV4::Value tint(const v8::Arguments &args) { if (args.Length() != 2) - V8THROW_ERROR("Qt.tint(): Invalid arguments"); + V4THROW_ERROR("Qt.tint(): Invalid arguments"); // base color QVariant v1 = V8ENGINE()->toVariant(args[0]->v4Value(), -1); @@ -826,10 +828,10 @@ If \a format is not specified, \a date is formatted using \sa Locale */ -v8::Handle formatDate(const v8::Arguments &args) +QV4::Value formatDate(const v8::Arguments &args) { if (args.Length() < 1 || args.Length() > 2) - V8THROW_ERROR("Qt.formatDate(): Invalid arguments"); + V4THROW_ERROR("Qt.formatDate(): Invalid arguments"); Qt::DateFormat enumFormat = Qt::DefaultLocaleShortDate; QDate date = V8ENGINE()->toVariant(args[0]->v4Value(), -1).toDateTime().date(); @@ -843,7 +845,7 @@ v8::Handle formatDate(const v8::Arguments &args) Qt::DateFormat format = Qt::DateFormat(intFormat); formattedDate = date.toString(format); } else { - V8THROW_ERROR("Qt.formatDate(): Invalid date format"); + V4THROW_ERROR("Qt.formatDate(): Invalid date format"); } } else { formattedDate = date.toString(enumFormat); @@ -867,10 +869,10 @@ If \a format is not specified, \a time is formatted using \sa Locale */ -v8::Handle formatTime(const v8::Arguments &args) +QV4::Value formatTime(const v8::Arguments &args) { if (args.Length() < 1 || args.Length() > 2) - V8THROW_ERROR("Qt.formatTime(): Invalid arguments"); + V4THROW_ERROR("Qt.formatTime(): Invalid arguments"); QVariant argVariant = V8ENGINE()->toVariant(args[0]->v4Value(), -1); QTime time; @@ -890,7 +892,7 @@ v8::Handle formatTime(const v8::Arguments &args) Qt::DateFormat format = Qt::DateFormat(intFormat); formattedTime = time.toString(format); } else { - V8THROW_ERROR("Qt.formatTime(): Invalid time format"); + V4THROW_ERROR("Qt.formatTime(): Invalid time format"); } } else { formattedTime = time.toString(enumFormat); @@ -989,10 +991,10 @@ with the \a format values below to produce the following results: \sa Locale */ -v8::Handle formatDateTime(const v8::Arguments &args) +QV4::Value formatDateTime(const v8::Arguments &args) { if (args.Length() < 1 || args.Length() > 2) - V8THROW_ERROR("Qt.formatDateTime(): Invalid arguments"); + V4THROW_ERROR("Qt.formatDateTime(): Invalid arguments"); Qt::DateFormat enumFormat = Qt::DefaultLocaleShortDate; QDateTime dt = V8ENGINE()->toVariant(args[0]->v4Value(), -1).toDateTime(); @@ -1006,7 +1008,7 @@ v8::Handle formatDateTime(const v8::Arguments &args) Qt::DateFormat format = Qt::DateFormat(intFormat); formattedDt = dt.toString(format); } else { - V8THROW_ERROR("Qt.formatDateTime(): Invalid datetime format"); + V4THROW_ERROR("Qt.formatDateTime(): Invalid datetime format"); } } else { formattedDt = dt.toString(enumFormat); @@ -1019,12 +1021,12 @@ v8::Handle formatDateTime(const v8::Arguments &args) \qmlmethod bool Qt::openUrlExternally(url target) Attempts to open the specified \c target url in an external application, based on the user's desktop preferences. Returns true if it succeeds, and false otherwise. */ -v8::Handle openUrlExternally(const v8::Arguments &args) +QV4::Value openUrlExternally(const v8::Arguments &args) { if (args.Length() != 1) return V8ENGINE()->fromVariant(false); - QUrl url(V8ENGINE()->toVariant(resolvedUrl(args)->v4Value(), -1).toUrl()); + QUrl url(V8ENGINE()->toVariant(resolvedUrl(args), -1).toUrl()); return V8ENGINE()->fromVariant(QQml_guiProvider()->openUrlExternally(url)); } @@ -1032,7 +1034,7 @@ v8::Handle openUrlExternally(const v8::Arguments &args) \qmlmethod url Qt::resolvedUrl(url url) Returns \a url resolved relative to the URL of the caller. */ -v8::Handle resolvedUrl(const v8::Arguments &args) +QV4::Value resolvedUrl(const v8::Arguments &args) { QUrl url = V8ENGINE()->toVariant(args[0]->v4Value(), -1).toUrl(); QQmlEngine *e = V8ENGINE()->engine(); @@ -1053,10 +1055,10 @@ v8::Handle resolvedUrl(const v8::Arguments &args) \qmlmethod list Qt::fontFamilies() Returns a list of the font families available to the application. */ -v8::Handle fontFamilies(const v8::Arguments &args) +QV4::Value fontFamilies(const v8::Arguments &args) { if (args.Length() != 0) - V8THROW_ERROR("Qt.fontFamilies(): Invalid arguments"); + V4THROW_ERROR("Qt.fontFamilies(): Invalid arguments"); return V8ENGINE()->fromVariant(QVariant(QQml_guiProvider()->fontFamilies())); } @@ -1065,10 +1067,10 @@ v8::Handle fontFamilies(const v8::Arguments &args) \qmlmethod string Qt::md5(data) Returns a hex string of the md5 hash of \c data. */ -v8::Handle md5(const v8::Arguments &args) +QV4::Value md5(const v8::Arguments &args) { if (args.Length() != 1) - V8THROW_ERROR("Qt.md5(): Invalid arguments"); + V4THROW_ERROR("Qt.md5(): Invalid arguments"); QByteArray data = args[0]->v4Value().toQString().toUtf8(); QByteArray result = QCryptographicHash::hash(data, QCryptographicHash::Md5); @@ -1079,10 +1081,10 @@ v8::Handle md5(const v8::Arguments &args) \qmlmethod string Qt::btoa(data) Binary to ASCII - this function returns a base64 encoding of \c data. */ -v8::Handle btoa(const v8::Arguments &args) +QV4::Value btoa(const v8::Arguments &args) { if (args.Length() != 1) - V8THROW_ERROR("Qt.btoa(): Invalid arguments"); + V4THROW_ERROR("Qt.btoa(): Invalid arguments"); QByteArray data = args[0]->v4Value().toQString().toUtf8(); @@ -1093,10 +1095,10 @@ v8::Handle btoa(const v8::Arguments &args) \qmlmethod string Qt::atob(data) ASCII to binary - this function returns a base64 decoding of \c data. */ -v8::Handle atob(const v8::Arguments &args) +QV4::Value atob(const v8::Arguments &args) { if (args.Length() != 1) - V8THROW_ERROR("Qt.atob(): Invalid arguments"); + V4THROW_ERROR("Qt.atob(): Invalid arguments"); QByteArray data = args[0]->v4Value().toQString().toUtf8(); @@ -1110,7 +1112,7 @@ Within the \l {Prototyping with qmlscene}, this causes the launcher application to quit a C++ application when this method is called, connect the QQmlEngine::quit() signal to the QCoreApplication::quit() slot. */ -v8::Handle quit(const v8::Arguments &args) +QV4::Value quit(const v8::Arguments &args) { QQmlEnginePrivate::get(V8ENGINE()->engine())->sendQuit(); return QV4::Value::undefinedValue(); @@ -1140,10 +1142,10 @@ If this is the case, consider using \l{QML:Qt::createComponent()}{Qt.createCompo See \l {Dynamic QML Object Creation from JavaScript} for more information on using this function. */ -v8::Handle createQmlObject(const v8::Arguments &args) +QV4::Value createQmlObject(const v8::Arguments &args) { if (args.Length() < 2 || args.Length() > 3) - V8THROW_ERROR("Qt.createQmlObject(): Invalid arguments"); + V4THROW_ERROR("Qt.createQmlObject(): Invalid arguments"); struct Error { static v8::Handle create(QV8Engine *engine, const QList &errors) { @@ -1194,7 +1196,7 @@ v8::Handle createQmlObject(const v8::Arguments &args) QObject *parentArg = v8engine->toQObject(args[1]->v4Value()); if (!parentArg) - V8THROW_ERROR("Qt.createQmlObject(): Missing parent object"); + V4THROW_ERROR("Qt.createQmlObject(): Missing parent object"); QQmlComponent component(engine); component.setData(qml.toUtf8(), url); @@ -1205,7 +1207,7 @@ v8::Handle createQmlObject(const v8::Arguments &args) } if (!component.isReady()) - V8THROW_ERROR("Qt.createQmlObject(): Component is not ready"); + V4THROW_ERROR("Qt.createQmlObject(): Component is not ready"); QObject *obj = component.beginCreate(effectiveContext); if (obj) { @@ -1264,12 +1266,12 @@ See \l {Dynamic QML Object Creation from JavaScript} for more information on usi To create a QML object from an arbitrary string of QML (instead of a file), use \l{QML:Qt::createQmlObject()}{Qt.createQmlObject()}. */ -v8::Handle createComponent(const v8::Arguments &args) +QV4::Value createComponent(const v8::Arguments &args) { - const char *invalidArgs = "Qt.createComponent(): Invalid arguments"; - const char *invalidParent = "Qt.createComponent(): Invalid parent object"; + const QString invalidArgs = QStringLiteral("Qt.createComponent(): Invalid arguments"); + const QString invalidParent = QStringLiteral("Qt.createComponent(): Invalid parent object"); if (args.Length() < 1 || args.Length() > 3) - V8THROW_ERROR(invalidArgs); + v8::Isolate::GetEngine()->current->throwError(invalidArgs); QV8Engine *v8engine = V8ENGINE(); QQmlEngine *engine = v8engine->engine(); @@ -1295,24 +1297,24 @@ v8::Handle createComponent(const v8::Arguments &args) if (args[1]->IsInt32()) { int mode = args[1]->Int32Value(); if (mode != int(QQmlComponent::PreferSynchronous) && mode != int(QQmlComponent::Asynchronous)) - V8THROW_ERROR(invalidArgs); + v8::Isolate::GetEngine()->current->throwError(invalidArgs); compileMode = QQmlComponent::CompilationMode(mode); consumedCount += 1; } else { // The second argument could be the parent only if there are exactly two args if ((args.Length() != 2) || !(lastArg->IsObject() || lastArg->IsNull())) - V8THROW_ERROR(invalidArgs); + v8::Isolate::GetEngine()->current->throwError(invalidArgs); } if (consumedCount < args.Length()) { if (lastArg->IsObject()) { parentArg = v8engine->toQObject(lastArg->v4Value()); if (!parentArg) - V8THROW_ERROR(invalidParent); + v8::Isolate::GetEngine()->current->throwError(invalidParent); } else if (lastArg->IsNull()) { parentArg = 0; } else { - V8THROW_ERROR(invalidParent); + v8::Isolate::GetEngine()->current->throwError(invalidParent); } } } @@ -1344,16 +1346,16 @@ v8::Handle createComponent(const v8::Arguments &args) \sa {Localization And Internationalization Support In Qt Quick} */ -v8::Handle qsTranslate(const v8::Arguments &args) +QV4::Value qsTranslate(const v8::Arguments &args) { if (args.Length() < 2) - V8THROW_ERROR("qsTranslate() requires at least two arguments"); + V4THROW_ERROR("qsTranslate() requires at least two arguments"); if (!args[0]->IsString()) - V8THROW_ERROR("qsTranslate(): first argument (context) must be a string"); + V4THROW_ERROR("qsTranslate(): first argument (context) must be a string"); if (!args[1]->IsString()) - V8THROW_ERROR("qsTranslate(): second argument (sourceText) must be a string"); + V4THROW_ERROR("qsTranslate(): second argument (sourceText) must be a string"); if ((args.Length() > 2) && !args[2]->IsString()) - V8THROW_ERROR("qsTranslate(): third argument (disambiguation) must be a string"); + V4THROW_ERROR("qsTranslate(): third argument (disambiguation) must be a string"); QV8Engine *v8engine = V8ENGINE(); QString context = args[0]->v4Value().toQString(); @@ -1401,11 +1403,11 @@ v8::Handle qsTranslate(const v8::Arguments &args) \sa {Localization And Internationalization Support In Qt Quick} */ -v8::Handle qsTranslateNoOp(const v8::Arguments &args) +QV4::Value qsTranslateNoOp(const v8::Arguments &args) { if (args.Length() < 2) return QV4::Value::undefinedValue(); - return args[1]; + return args[1]->v4Value(); } /*! @@ -1425,16 +1427,16 @@ v8::Handle qsTranslateNoOp(const v8::Arguments &args) \sa {Localization And Internationalization Support In Qt Quick} */ -v8::Handle qsTr(const v8::Arguments &args) +QV4::Value qsTr(const v8::Arguments &args) { if (args.Length() < 1) - V8THROW_ERROR("qsTr() requires at least one argument"); + V4THROW_ERROR("qsTr() requires at least one argument"); if (!args[0]->IsString()) - V8THROW_ERROR("qsTr(): first argument (sourceText) must be a string"); + V4THROW_ERROR("qsTr(): first argument (sourceText) must be a string"); if ((args.Length() > 1) && !args[1]->IsString()) - V8THROW_ERROR("qsTr(): second argument (disambiguation) must be a string"); + V4THROW_ERROR("qsTr(): second argument (disambiguation) must be a string"); if ((args.Length() > 2) && !args[2]->IsNumber()) - V8THROW_ERROR("qsTr(): third argument (n) must be a number"); + V4THROW_ERROR("qsTr(): third argument (n) must be a number"); QV8Engine *v8engine = V8ENGINE(); QQmlContextData *ctxt = v8engine->callingContext(); @@ -1479,11 +1481,11 @@ v8::Handle qsTr(const v8::Arguments &args) \sa {Localization And Internationalization Support In Qt Quick} */ -v8::Handle qsTrNoOp(const v8::Arguments &args) +QV4::Value qsTrNoOp(const v8::Arguments &args) { if (args.Length() < 1) return QV4::Value::undefinedValue(); - return args[0]; + return args[0]->v4Value(); } /*! @@ -1516,14 +1518,14 @@ v8::Handle qsTrNoOp(const v8::Arguments &args) \sa QT_TRID_NOOP, {Localization And Internationalization Support In Qt Quick} */ -v8::Handle qsTrId(const v8::Arguments &args) +QV4::Value qsTrId(const v8::Arguments &args) { if (args.Length() < 1) - V8THROW_ERROR("qsTrId() requires at least one argument"); + V4THROW_ERROR("qsTrId() requires at least one argument"); if (!args[0]->IsString()) - V8THROW_TYPE("qsTrId(): first argument (id) must be a string"); + V4THROW_TYPE("qsTrId(): first argument (id) must be a string"); if (args.Length() > 1 && !args[1]->IsNumber()) - V8THROW_TYPE("qsTrId(): second argument (n) must be a number"); + V4THROW_TYPE("qsTrId(): second argument (n) must be a number"); int n = -1; if (args.Length() > 1) @@ -1549,11 +1551,11 @@ v8::Handle qsTrId(const v8::Arguments &args) \sa qsTrId(), {Localization And Internationalization Support In Qt Quick} */ -v8::Handle qsTrIdNoOp(const v8::Arguments &args) +QV4::Value qsTrIdNoOp(const v8::Arguments &args) { if (args.Length() < 1) return QV4::Value::undefinedValue(); - return args[0]; + return args[0]->v4Value(); } #endif // QT_NO_TRANSLATION @@ -1577,13 +1579,13 @@ v8::Handle qsTrIdNoOp(const v8::Arguments &args) \sa QtQuick2::Locale */ -v8::Handle locale(const v8::Arguments &args) +QV4::Value locale(const v8::Arguments &args) { QString code; if (args.Length() > 1) - V8THROW_ERROR("locale() requires 0 or 1 argument"); + V4THROW_ERROR("locale() requires 0 or 1 argument"); if (args.Length() == 1 && !args[0]->IsString()) - V8THROW_TYPE("locale(): argument (locale code) must be a string"); + V4THROW_TYPE("locale(): argument (locale code) must be a string"); QV8Engine *v8engine = V8ENGINE(); if (args.Length() == 1) @@ -1638,17 +1640,17 @@ v8::Handle locale(const v8::Arguments &args) \since QtQuick 2.0 */ -v8::Handle binding(const v8::Arguments &args) +QV4::Value binding(const v8::Arguments &args) { QString code; if (args.Length() != 1) - V8THROW_ERROR("binding() requires 1 argument"); + V4THROW_ERROR("binding() requires 1 argument"); if (!args[0]->IsFunction()) - V8THROW_TYPE("binding(): argument (binding expression) must be a function"); + V4THROW_TYPE("binding(): argument (binding expression) must be a function"); v8::Handle rv = args[0]->ToObject()->Clone(); rv->SetHiddenValue(v8::Value::fromV4Value(V8ENGINE()->bindingFlagKey()), v8::Boolean::New(true)); - return rv; + return rv->v4Value(); } } // namespace QQmlBuiltinFunctions diff --git a/src/qml/qml/v8/qqmlbuiltinfunctions_p.h b/src/qml/qml/v8/qqmlbuiltinfunctions_p.h index f73802b136..fb79397921 100644 --- a/src/qml/qml/v8/qqmlbuiltinfunctions_p.h +++ b/src/qml/qml/v8/qqmlbuiltinfunctions_p.h @@ -60,57 +60,57 @@ QT_BEGIN_NAMESPACE namespace QQmlBuiltinFunctions { -v8::Handle gc(const v8::Arguments &args); -v8::Handle consoleError(const v8::Arguments &args); -v8::Handle consoleLog(const v8::Arguments &args); -v8::Handle consoleProfile(const v8::Arguments &args); -v8::Handle consoleProfileEnd(const v8::Arguments &args); -v8::Handle consoleTime(const v8::Arguments &args); -v8::Handle consoleTimeEnd(const v8::Arguments &args); -v8::Handle consoleCount(const v8::Arguments &args); -v8::Handle consoleTrace(const v8::Arguments &args); -v8::Handle consoleWarn(const v8::Arguments &args); -v8::Handle consoleAssert(const v8::Arguments &args); -v8::Handle consoleException(const v8::Arguments &args); -v8::Handle isQtObject(const v8::Arguments &args); -v8::Handle rgba(const v8::Arguments &args); -v8::Handle hsla(const v8::Arguments &args); -v8::Handle colorEqual(const v8::Arguments &args); -v8::Handle font(const v8::Arguments &args); -v8::Handle rect(const v8::Arguments &args); -v8::Handle point(const v8::Arguments &args); -v8::Handle size(const v8::Arguments &args); -v8::Handle vector2d(const v8::Arguments &args); -v8::Handle vector3d(const v8::Arguments &args); -v8::Handle vector4d(const v8::Arguments &args); -v8::Handle quaternion(const v8::Arguments &args); -v8::Handle matrix4x4(const v8::Arguments &args); -v8::Handle lighter(const v8::Arguments &args); -v8::Handle darker(const v8::Arguments &args); -v8::Handle tint(const v8::Arguments &args); -v8::Handle formatDate(const v8::Arguments &args); -v8::Handle formatTime(const v8::Arguments &args); -v8::Handle formatDateTime(const v8::Arguments &args); -v8::Handle openUrlExternally(const v8::Arguments &args); -v8::Handle fontFamilies(const v8::Arguments &args); -v8::Handle md5(const v8::Arguments &args); -v8::Handle btoa(const v8::Arguments &args); -v8::Handle atob(const v8::Arguments &args); -v8::Handle quit(const v8::Arguments &args); -v8::Handle resolvedUrl(const v8::Arguments &args); -v8::Handle createQmlObject(const v8::Arguments &args); -v8::Handle createComponent(const v8::Arguments &args); +QV4::Value gc(const v8::Arguments &args); +QV4::Value consoleError(const v8::Arguments &args); +QV4::Value consoleLog(const v8::Arguments &args); +QV4::Value consoleProfile(const v8::Arguments &args); +QV4::Value consoleProfileEnd(const v8::Arguments &args); +QV4::Value consoleTime(const v8::Arguments &args); +QV4::Value consoleTimeEnd(const v8::Arguments &args); +QV4::Value consoleCount(const v8::Arguments &args); +QV4::Value consoleTrace(const v8::Arguments &args); +QV4::Value consoleWarn(const v8::Arguments &args); +QV4::Value consoleAssert(const v8::Arguments &args); +QV4::Value consoleException(const v8::Arguments &args); +QV4::Value isQtObject(const v8::Arguments &args); +QV4::Value rgba(const v8::Arguments &args); +QV4::Value hsla(const v8::Arguments &args); +QV4::Value colorEqual(const v8::Arguments &args); +QV4::Value font(const v8::Arguments &args); +QV4::Value rect(const v8::Arguments &args); +QV4::Value point(const v8::Arguments &args); +QV4::Value size(const v8::Arguments &args); +QV4::Value vector2d(const v8::Arguments &args); +QV4::Value vector3d(const v8::Arguments &args); +QV4::Value vector4d(const v8::Arguments &args); +QV4::Value quaternion(const v8::Arguments &args); +QV4::Value matrix4x4(const v8::Arguments &args); +QV4::Value lighter(const v8::Arguments &args); +QV4::Value darker(const v8::Arguments &args); +QV4::Value tint(const v8::Arguments &args); +QV4::Value formatDate(const v8::Arguments &args); +QV4::Value formatTime(const v8::Arguments &args); +QV4::Value formatDateTime(const v8::Arguments &args); +QV4::Value openUrlExternally(const v8::Arguments &args); +QV4::Value fontFamilies(const v8::Arguments &args); +QV4::Value md5(const v8::Arguments &args); +QV4::Value btoa(const v8::Arguments &args); +QV4::Value atob(const v8::Arguments &args); +QV4::Value quit(const v8::Arguments &args); +QV4::Value resolvedUrl(const v8::Arguments &args); +QV4::Value createQmlObject(const v8::Arguments &args); +QV4::Value createComponent(const v8::Arguments &args); #ifndef QT_NO_TRANSLATION -v8::Handle qsTranslate(const v8::Arguments &args); -v8::Handle qsTranslateNoOp(const v8::Arguments &args); -v8::Handle qsTr(const v8::Arguments &args); -v8::Handle qsTrNoOp(const v8::Arguments &args); -v8::Handle qsTrId(const v8::Arguments &args); -v8::Handle qsTrIdNoOp(const v8::Arguments &args); +QV4::Value qsTranslate(const v8::Arguments &args); +QV4::Value qsTranslateNoOp(const v8::Arguments &args); +QV4::Value qsTr(const v8::Arguments &args); +QV4::Value qsTrNoOp(const v8::Arguments &args); +QV4::Value qsTrId(const v8::Arguments &args); +QV4::Value qsTrIdNoOp(const v8::Arguments &args); #endif -v8::Handle stringArg(const v8::Arguments &args); -v8::Handle locale(const v8::Arguments &args); -v8::Handle binding(const v8::Arguments &args); +QV4::Value stringArg(const v8::Arguments &args); +QV4::Value locale(const v8::Arguments &args); +QV4::Value binding(const v8::Arguments &args); } QT_END_NAMESPACE diff --git a/src/qml/qml/v8/qv4domerrors_p.h b/src/qml/qml/v8/qv4domerrors_p.h index 434f9c5846..3d612cb397 100644 --- a/src/qml/qml/v8/qv4domerrors_p.h +++ b/src/qml/qml/v8/qv4domerrors_p.h @@ -83,6 +83,14 @@ QT_BEGIN_NAMESPACE return v8::Handle(); \ } +#define V4THROW_DOM(error, string) { \ + QV4::ExecutionContext *ctx = v8::Isolate::GetEngine()->current; \ + QV4::Value v = QV4::Value::fromString(ctx, QStringLiteral(string)); \ + QV4::Object *ex = ctx->engine->newErrorObject(v); \ + ex->put(ctx, ctx->engine->newIdentifier(QStringLiteral("code")), QV4::Value::fromInt32(error)); \ + ctx->throwError(QV4::Value::fromObject(ex)); \ +} + namespace QV4 { struct ExecutionEngine; } diff --git a/src/qml/qml/v8/qv8engine_p.h b/src/qml/qml/v8/qv8engine_p.h index d8f6e1bb39..db8984ccda 100644 --- a/src/qml/qml/v8/qv8engine_p.h +++ b/src/qml/qml/v8/qv8engine_p.h @@ -116,10 +116,17 @@ namespace QV4 { v8::ThrowException(v8::Exception::Error(v8::String::New(string))); \ return v8::Handle(); \ } + +#define V4THROW_ERROR(string) \ + v8::Isolate::GetEngine()->current->throwError(QStringLiteral(string)); + #define V8THROW_TYPE(string) { \ v8::ThrowException(v8::Exception::TypeError(v8::String::New(string))); \ return v8::Handle(); \ } +#define V4THROW_TYPE(string) \ + v8::Isolate::GetEngine()->current->throwError(QStringLiteral(string)); + #define V8ENGINE_ACCESSOR() ((QV8Engine *)v8::External::Cast(info.Data().get())->Value()); #define V8THROW_ERROR_SETTER(string) { \ v8::ThrowException(v8::Exception::Error(v8::String::New(string))); \ diff --git a/src/qml/qml/v8/qv8include.cpp b/src/qml/qml/v8/qv8include.cpp index 92e262157b..72b7868b9b 100644 --- a/src/qml/qml/v8/qv8include.cpp +++ b/src/qml/qml/v8/qv8include.cpp @@ -167,7 +167,7 @@ void QV8Include::finished() /* Documented in qv8engine.cpp */ -v8::Handle QV8Include::include(const v8::Arguments &args) +QV4::Value QV8Include::include(const v8::Arguments &args) { if (args.Length() == 0) return QV4::Value::undefinedValue(); @@ -176,7 +176,7 @@ v8::Handle QV8Include::include(const v8::Arguments &args) QQmlContextData *context = engine->callingContext(); if (!context || !context->isJSContext) - V8THROW_ERROR("Qt.include(): Can only be called from JavaScript files"); + V4THROW_ERROR("Qt.include(): Can only be called from JavaScript files"); QUrl url(context->resolvedUrl(QUrl(args[0]->v4Value().toQString()))); @@ -237,7 +237,7 @@ v8::Handle QV8Include::include(const v8::Arguments &args) if (result.IsEmpty()) return QV4::Value::undefinedValue(); else - return result; + return result->v4Value(); } QT_END_NAMESPACE diff --git a/src/qml/qml/v8/qv8include_p.h b/src/qml/qml/v8/qv8include_p.h index 36a322e33a..ab7b2ff8db 100644 --- a/src/qml/qml/v8/qv8include_p.h +++ b/src/qml/qml/v8/qv8include_p.h @@ -78,7 +78,7 @@ public: Exception = 3 }; - static v8::Handle include(const v8::Arguments &args); + static QV4::Value include(const v8::Arguments &args); private slots: void finished(); diff --git a/src/qml/qml/v8/qv8qobjectwrapper.cpp b/src/qml/qml/v8/qv8qobjectwrapper.cpp index e58584b9ca..aa22156ae3 100644 --- a/src/qml/qml/v8/qv8qobjectwrapper.cpp +++ b/src/qml/qml/v8/qv8qobjectwrapper.cpp @@ -133,7 +133,7 @@ struct CallArgument { inline void initAsType(int type); inline void fromValue(int type, QV8Engine *, v8::Handle); - inline v8::Handle toValue(QV8Engine *); + inline QV4::Value toValue(QV8Engine *); private: CallArgument(const CallArgument &); @@ -1366,10 +1366,10 @@ int QV8QObjectConnectionList::qt_metacall(QMetaObject::Call method, int index, v return -1; } -v8::Handle QV8QObjectWrapper::Connect(const v8::Arguments &args) +QV4::Value QV8QObjectWrapper::Connect(const v8::Arguments &args) { if (args.Length() == 0) - V8THROW_ERROR("Function.prototype.connect: no arguments given"); + V4THROW_ERROR("Function.prototype.connect: no arguments given"); QV8Engine *engine = V8ENGINE(); @@ -1378,13 +1378,13 @@ v8::Handle QV8QObjectWrapper::Connect(const v8::Arguments &args) int signalIndex = signalInfo.second; if (signalIndex < 0) - V8THROW_ERROR("Function.prototype.connect: this object is not a signal"); + V4THROW_ERROR("Function.prototype.connect: this object is not a signal"); if (!signalObject) - V8THROW_ERROR("Function.prototype.connect: cannot connect to deleted QObject"); + V4THROW_ERROR("Function.prototype.connect: cannot connect to deleted QObject"); if (signalObject->metaObject()->method(signalIndex).methodType() != QMetaMethod::Signal) - V8THROW_ERROR("Function.prototype.connect: this object is not a signal"); + V4THROW_ERROR("Function.prototype.connect: this object is not a signal"); v8::Handle functionValue; v8::Handle functionThisValue; @@ -1397,10 +1397,10 @@ v8::Handle QV8QObjectWrapper::Connect(const v8::Arguments &args) } if (!functionValue->IsFunction()) - V8THROW_ERROR("Function.prototype.connect: target is not a function"); + V4THROW_ERROR("Function.prototype.connect: target is not a function"); if (!functionThisValue.IsEmpty() && !functionThisValue->IsObject()) - V8THROW_ERROR("Function.prototype.connect: target this is not an object"); + V4THROW_ERROR("Function.prototype.connect: target this is not an object"); QV8QObjectWrapper *qobjectWrapper = engine->qobjectWrapper(); QHash &connections = qobjectWrapper->m_connections; @@ -1425,10 +1425,10 @@ v8::Handle QV8QObjectWrapper::Connect(const v8::Arguments &args) return QV4::Value::undefinedValue(); } -v8::Handle QV8QObjectWrapper::Disconnect(const v8::Arguments &args) +QV4::Value QV8QObjectWrapper::Disconnect(const v8::Arguments &args) { if (args.Length() == 0) - V8THROW_ERROR("Function.prototype.disconnect: no arguments given"); + V4THROW_ERROR("Function.prototype.disconnect: no arguments given"); QV8Engine *engine = V8ENGINE(); @@ -1437,13 +1437,13 @@ v8::Handle QV8QObjectWrapper::Disconnect(const v8::Arguments &args) int signalIndex = signalInfo.second; if (signalIndex == -1) - V8THROW_ERROR("Function.prototype.disconnect: this object is not a signal"); + V4THROW_ERROR("Function.prototype.disconnect: this object is not a signal"); if (!signalObject) - V8THROW_ERROR("Function.prototype.disconnect: cannot disconnect from deleted QObject"); + V4THROW_ERROR("Function.prototype.disconnect: cannot disconnect from deleted QObject"); if (signalIndex < 0 || signalObject->metaObject()->method(signalIndex).methodType() != QMetaMethod::Signal) - V8THROW_ERROR("Function.prototype.disconnect: this object is not a signal"); + V4THROW_ERROR("Function.prototype.disconnect: this object is not a signal"); v8::Handle functionValue; v8::Handle functionThisValue; @@ -1456,10 +1456,10 @@ v8::Handle QV8QObjectWrapper::Disconnect(const v8::Arguments &args) } if (!functionValue->IsFunction()) - V8THROW_ERROR("Function.prototype.disconnect: target is not a function"); + V4THROW_ERROR("Function.prototype.disconnect: target is not a function"); if (!functionThisValue.IsEmpty() && !functionThisValue->IsObject()) - V8THROW_ERROR("Function.prototype.disconnect: target this is not an object"); + V4THROW_ERROR("Function.prototype.disconnect: target this is not an object"); QV8QObjectWrapper *qobjectWrapper = engine->qobjectWrapper(); QHash &connectionsList = qobjectWrapper->m_connections; @@ -1555,7 +1555,7 @@ private: }; } -static v8::Handle CallMethod(QObject *object, int index, int returnType, int argCount, +static QV4::Value CallMethod(QObject *object, int index, int returnType, int argCount, int *argTypes, QV8Engine *engine, CallArgs &callArgs) { if (argCount > 0) { @@ -1795,7 +1795,7 @@ static const QQmlPropertyData * RelatedMethod(QObject *object, } } -static v8::Handle CallPrecise(QObject *object, const QQmlPropertyData &data, +static QV4::Value CallPrecise(QObject *object, const QQmlPropertyData &data, QV8Engine *engine, CallArgs &callArgs) { QByteArray unknownTypeError; @@ -1805,8 +1805,7 @@ static v8::Handle CallPrecise(QObject *object, const QQmlPropertyData if (returnType == QMetaType::UnknownType) { QString typeName = QString::fromLatin1(unknownTypeError); QString error = QString::fromLatin1("Unknown method return type: %1").arg(typeName); - v8::ThrowException(v8::Exception::Error(engine->toString(error))); - return v8::Handle(); + QV8Engine::getV4(engine)->current->throwError(error); } if (data.hasArguments()) { @@ -1820,14 +1819,12 @@ static v8::Handle CallPrecise(QObject *object, const QQmlPropertyData if (!args) { QString typeName = QString::fromLatin1(unknownTypeError); QString error = QString::fromLatin1("Unknown method parameter type: %1").arg(typeName); - v8::ThrowException(v8::Exception::Error(engine->toString(error))); - return v8::Handle(); + QV8Engine::getV4(engine)->current->throwError(error); } if (args[0] > callArgs.Length()) { QString error = QLatin1String("Insufficient arguments"); - v8::ThrowException(v8::Exception::Error(engine->toString(error))); - return v8::Handle(); + QV8Engine::getV4(engine)->current->throwError(error); } return CallMethod(object, data.coreIndex, returnType, args[0], args + 1, engine, callArgs); @@ -1852,7 +1849,7 @@ Resolve the overloaded method to call. The algorithm works conceptually like th If two or more overloads have the same match score, call the last one. The match score is constructed by adding the matchScore() result for each of the parameters. */ -static v8::Handle CallOverloaded(QObject *object, const QQmlPropertyData &data, +static QV4::Value CallOverloaded(QObject *object, const QQmlPropertyData &data, QV8Engine *engine, CallArgs &callArgs) { int argumentCount = callArgs.Length(); @@ -1923,12 +1920,11 @@ static v8::Handle CallOverloaded(QObject *object, const QQmlPropertyD candidate = RelatedMethod(object, candidate, dummy); } - v8::ThrowException(v8::Exception::Error(engine->toString(error))); - return v8::Handle(); + QV8Engine::getV4(engine)->current->throwError(error); } } -static v8::Handle ToString(QV8Engine *engine, QObject *object, int, v8::Handle) +static QV4::Value ToString(QV8Engine *engine, QObject *object, int, v8::Handle) { QString result; if (object) { @@ -1952,7 +1948,7 @@ static v8::Handle ToString(QV8Engine *engine, QObject *object, int, v return engine->toString(result); } -static v8::Handle Destroy(QV8Engine *, QObject *object, int argCount, v8::Handle args) +static QV4::Value Destroy(QV8Engine *, QObject *object, int argCount, v8::Handle args) { QQmlData *ddata = QQmlData::get(object, false); if (!ddata || ddata->indestructible || ddata->rootObjectInCreation) { @@ -1973,7 +1969,7 @@ static v8::Handle Destroy(QV8Engine *, QObject *object, int argCount, return QV4::Value::undefinedValue(); } -v8::Handle QV8QObjectWrapper::Invoke(const v8::Arguments &args) +QV4::Value QV8QObjectWrapper::Invoke(const v8::Arguments &args) { // object, index, qmlglobal, argCount, args Q_ASSERT(args.Length() == 5); @@ -1992,7 +1988,7 @@ v8::Handle QV8QObjectWrapper::Invoke(const v8::Arguments &args) v8::Handle data = v8::Array::New(2); data->Set(0, args[0]); data->Set(1, args[1]); - return data; + return data->v4Value(); } QObject *object = resource->object; @@ -2043,7 +2039,7 @@ v8::Handle QV8QObjectWrapper::Invoke(const v8::Arguments &args) QMetaObject::metacall(object, QMetaObject::InvokeMetaMethod, method.coreIndex, args); if (rv.IsEmpty()) return QV4::Value::undefinedValue(); - return rv; + return rv->v4Value(); } CallArgs callArgs(argCount, &arguments); @@ -2229,20 +2225,20 @@ void CallArgument::fromValue(int callType, QV8Engine *engine, v8::Handle CallArgument::toValue(QV8Engine *engine) +QV4::Value CallArgument::toValue(QV8Engine *engine) { if (type == qMetaTypeId()) { - return v8::Value::fromV4Value(QJSValuePrivate::get(*qjsValuePtr)->getValue(QV8Engine::getV4(engine))); + return QJSValuePrivate::get(*qjsValuePtr)->getValue(QV8Engine::getV4(engine)); } else if (type == QMetaType::Int) { - return v8::Integer::New(int(intValue)); + return QV4::Value::fromInt32(int(intValue)); } else if (type == QMetaType::UInt) { - return v8::Integer::NewFromUnsigned(intValue); + return QV4::Value::fromUInt32(intValue); } else if (type == QMetaType::Bool) { - return v8::Boolean::New(boolValue); + return QV4::Value::fromBoolean(boolValue); } else if (type == QMetaType::Double) { - return v8::Number::New(doubleValue); + return QV4::Value::fromDouble(doubleValue); } else if (type == QMetaType::Float) { - return v8::Number::New(floatValue); + return QV4::Value::fromDouble(floatValue); } else if (type == QMetaType::QString) { return engine->toString(*qstringPtr); } else if (type == QMetaType::QObjectStar) { @@ -2254,22 +2250,23 @@ v8::Handle CallArgument::toValue(QV8Engine *engine) // XXX Can this be made more by using Array as a prototype and implementing // directly against QList? QList &list = *qlistPtr; - v8::Handle array = v8::Array::New(list.count()); + QV4::ArrayObject *array = QV8Engine::getV4(engine)->newArrayObject(); + array->setArrayLength(list.count()); for (int ii = 0; ii < list.count(); ++ii) - array->Set(ii, engine->newQObject(list.at(ii))); - return array; + array->arrayData[ii].value = engine->newQObject(list.at(ii)); + return QV4::Value::fromObject(array); } else if (type == qMetaTypeId()) { - return handlePtr->toV8Handle(); + return handlePtr->toValue(); } else if (type == QMetaType::QJsonArray) { - return v8::Value::fromV4Value(engine->jsonArrayToJS(*jsonArrayPtr)); + return engine->jsonArrayToJS(*jsonArrayPtr); } else if (type == QMetaType::QJsonObject) { - return v8::Value::fromV4Value(engine->jsonObjectToJS(*jsonObjectPtr)); + return engine->jsonObjectToJS(*jsonObjectPtr); } else if (type == QMetaType::QJsonValue) { - return v8::Value::fromV4Value(engine->jsonValueToJS(*jsonValuePtr)); + return engine->jsonValueToJS(*jsonValuePtr); } else if (type == -1 || type == qMetaTypeId()) { QVariant value = *qvariantPtr; - v8::Handle rv = engine->fromVariant(value); - if (QObject *object = engine->toQObject(rv->v4Value())) + QV4::Value rv = engine->fromVariant(value); + if (QObject *object = engine->toQObject(rv)) QQmlData::get(object, true)->setImplicitDestructible(); return rv; } else { diff --git a/src/qml/qml/v8/qv8qobjectwrapper_p.h b/src/qml/qml/v8/qv8qobjectwrapper_p.h index b0358cc1a7..0dd4b7f85b 100644 --- a/src/qml/qml/v8/qv8qobjectwrapper_p.h +++ b/src/qml/qml/v8/qv8qobjectwrapper_p.h @@ -132,9 +132,9 @@ private: static v8::Handle Query(v8::Handle property, const v8::AccessorInfo &info); static v8::Handle Enumerator(const v8::AccessorInfo &info); - static v8::Handle Connect(const v8::Arguments &args); - static v8::Handle Disconnect(const v8::Arguments &args); - static v8::Handle Invoke(const v8::Arguments &args); + static QV4::Value Connect(const v8::Arguments &args); + static QV4::Value Disconnect(const v8::Arguments &args); + static QV4::Value Invoke(const v8::Arguments &args); static QPair ExtractQtMethod(QV8Engine *, v8::Handle); static QPair ExtractQtSignal(QV8Engine *, v8::Handle); static void WeakQObjectReferenceCallback(v8::Persistent handle, void *wrapper); diff --git a/src/qml/qml/v8/qv8sequencewrapper.cpp b/src/qml/qml/v8/qv8sequencewrapper.cpp index 3f72697d9a..c4579fd73c 100644 --- a/src/qml/qml/v8/qv8sequencewrapper.cpp +++ b/src/qml/qml/v8/qv8sequencewrapper.cpp @@ -265,7 +265,7 @@ v8::Handle QV8SequenceWrapper::SortGetter(v8::Handle prop return info.Data(); } -v8::Handle QV8SequenceWrapper::Sort(const v8::Arguments &args) +QV4::Value QV8SequenceWrapper::Sort(const v8::Arguments &args) { int argCount = args.Length(); @@ -283,24 +283,24 @@ v8::Handle QV8SequenceWrapper::Sort(const v8::Arguments &args) } } - return args.This(); + return args.This()->v4Value(); } -v8::Handle QV8SequenceWrapper::ToString(const v8::Arguments &args) +QV4::Value QV8SequenceWrapper::ToString(const v8::Arguments &args) { QV8SequenceResource *sr = v8_resource_cast(args.This()); Q_ASSERT(sr); return sr->toString(); } -v8::Handle QV8SequenceWrapper::ValueOf(const v8::Arguments &args) +QV4::Value QV8SequenceWrapper::ValueOf(const v8::Arguments &args) { QV8SequenceResource *sr = v8_resource_cast(args.This()); Q_ASSERT(sr); - v8::Handle tostringValue = sr->toString(); - if (!tostringValue.IsEmpty()) + QV4::Value tostringValue = sr->toString(); + if (!tostringValue.isUndefined()) return tostringValue; - return v8::Integer::NewFromUnsigned(sr->lengthGetter()); + return QV4::Value::fromUInt32(sr->lengthGetter()); } v8::Handle QV8SequenceWrapper::Getter(v8::Handle property, diff --git a/src/qml/qml/v8/qv8sequencewrapper_p.h b/src/qml/qml/v8/qv8sequencewrapper_p.h index e63d7af8c4..2408e4a2ae 100644 --- a/src/qml/qml/v8/qv8sequencewrapper_p.h +++ b/src/qml/qml/v8/qv8sequencewrapper_p.h @@ -99,13 +99,13 @@ private: static v8::Handle LengthGetter(v8::Handle property, const v8::AccessorInfo &info); static void LengthSetter(v8::Handle property, v8::Handle value, const v8::AccessorInfo &info); static v8::Handle ToStringGetter(v8::Handle property, const v8::AccessorInfo &info); - static v8::Handle ToString(const v8::Arguments &args); + static QV4::Value ToString(const v8::Arguments &args); static v8::Handle ValueOfGetter(v8::Handle property, const v8::AccessorInfo &info); static v8::Handle SortGetter(v8::Handle property, const v8::AccessorInfo &info); - static v8::Handle ValueOf(const v8::Arguments &args); + static QV4::Value ValueOf(const v8::Arguments &args); static v8::Handle Getter(v8::Handle property, const v8::AccessorInfo &info); static v8::Handle Setter(v8::Handle property, v8::Handle value, const v8::AccessorInfo &info); - static v8::Handle Sort(const v8::Arguments &args); + static QV4::Value Sort(const v8::Arguments &args); }; diff --git a/src/qml/qml/v8/qv8sequencewrapper_p_p.h b/src/qml/qml/v8/qv8sequencewrapper_p_p.h index c8d61422e5..0924d106cd 100644 --- a/src/qml/qml/v8/qv8sequencewrapper_p_p.h +++ b/src/qml/qml/v8/qv8sequencewrapper_p_p.h @@ -87,7 +87,7 @@ public: virtual v8::Handle indexedGetter(quint32 index) = 0; virtual v8::Handle indexedDeleter(quint32 index) = 0; virtual v8::Handle indexedEnumerator() = 0; - virtual v8::Handle toString() = 0; + virtual QV4::Value toString() = 0; virtual void sort(v8::Handle comparer) = 0; ObjectType objectType; @@ -443,7 +443,7 @@ static QString convertUrlToString(QV8Engine *, const QUrl &v) } \ return retn; \ } \ - v8::Handle toString() \ + QV4::Value toString() \ { \ if (objectType == QV8SequenceResource::Reference) { \ if (!object) \ diff --git a/src/qml/qml/v8/qv8valuetypewrapper.cpp b/src/qml/qml/v8/qv8valuetypewrapper.cpp index 1bc2c4b4a7..2215c99241 100644 --- a/src/qml/qml/v8/qv8valuetypewrapper.cpp +++ b/src/qml/qml/v8/qv8valuetypewrapper.cpp @@ -254,7 +254,7 @@ v8::Handle QV8ValueTypeWrapper::ToStringGetter(v8::Handle return info.Data(); } -v8::Handle QV8ValueTypeWrapper::ToString(const v8::Arguments &args) +QV4::Value QV8ValueTypeWrapper::ToString(const v8::Arguments &args) { QV8ValueTypeResource *resource = v8_resource_cast(args.This()); if (resource) { diff --git a/src/qml/qml/v8/qv8valuetypewrapper_p.h b/src/qml/qml/v8/qv8valuetypewrapper_p.h index 620f0bbc78..132ae1ad9c 100644 --- a/src/qml/qml/v8/qv8valuetypewrapper_p.h +++ b/src/qml/qml/v8/qv8valuetypewrapper_p.h @@ -87,7 +87,7 @@ public: private: static v8::Handle ToStringGetter(v8::Handle property, const v8::AccessorInfo &info); - static v8::Handle ToString(const v8::Arguments &args); + static QV4::Value ToString(const v8::Arguments &args); static v8::Handle Getter(v8::Handle property, const v8::AccessorInfo &info); static v8::Handle Setter(v8::Handle property, diff --git a/src/qml/qml/v8/qv8variantwrapper.cpp b/src/qml/qml/v8/qv8variantwrapper.cpp index c2c5988e0e..ffff9e4fd4 100644 --- a/src/qml/qml/v8/qv8variantwrapper.cpp +++ b/src/qml/qml/v8/qv8variantwrapper.cpp @@ -221,7 +221,7 @@ v8::Handle QV8VariantWrapper::ValueOfGetter(v8::Handle pr return info.Data(); } -v8::Handle QV8VariantWrapper::Preserve(const v8::Arguments &args) +QV4::Value QV8VariantWrapper::Preserve(const v8::Arguments &args) { QV8VariantResource *resource = v8_resource_cast(args.This()); if (resource) { @@ -230,7 +230,7 @@ v8::Handle QV8VariantWrapper::Preserve(const v8::Arguments &args) return QV4::Value::undefinedValue(); } -v8::Handle QV8VariantWrapper::Destroy(const v8::Arguments &args) +QV4::Value QV8VariantWrapper::Destroy(const v8::Arguments &args) { QV8VariantResource *resource = v8_resource_cast(args.This()); if (resource) { @@ -240,7 +240,7 @@ v8::Handle QV8VariantWrapper::Destroy(const v8::Arguments &args) return QV4::Value::undefinedValue(); } -v8::Handle QV8VariantWrapper::ToString(const v8::Arguments &args) +QV4::Value QV8VariantWrapper::ToString(const v8::Arguments &args) { QV8VariantResource *resource = v8_resource_cast(args.This()); if (resource) { @@ -253,7 +253,7 @@ v8::Handle QV8VariantWrapper::ToString(const v8::Arguments &args) } } -v8::Handle QV8VariantWrapper::ValueOf(const v8::Arguments &args) +QV4::Value QV8VariantWrapper::ValueOf(const v8::Arguments &args) { QV8VariantResource *resource = v8_resource_cast(args.This()); if (resource) { @@ -266,14 +266,14 @@ v8::Handle QV8VariantWrapper::ValueOf(const v8::Arguments &args) case QVariant::Int: case QVariant::Double: case QVariant::UInt: - return v8::Number::New(v.toDouble()); + return QV4::Value::fromDouble(v.toDouble()); case QVariant::Bool: - return v8::Boolean::New(v.toBool()); + return QV4::Value::fromBoolean(v.toBool()); default: break; } } - return args.This(); + return args.This()->v4Value(); } QT_END_NAMESPACE diff --git a/src/qml/qml/v8/qv8variantwrapper_p.h b/src/qml/qml/v8/qv8variantwrapper_p.h index 125875ab24..a25d4917fc 100644 --- a/src/qml/qml/v8/qv8variantwrapper_p.h +++ b/src/qml/qml/v8/qv8variantwrapper_p.h @@ -90,10 +90,10 @@ private: const v8::AccessorInfo &info); static v8::Handle ValueOfGetter(v8::Handle property, const v8::AccessorInfo &info); - static v8::Handle Preserve(const v8::Arguments &args); - static v8::Handle Destroy(const v8::Arguments &args); - static v8::Handle ToString(const v8::Arguments &args); - static v8::Handle ValueOf(const v8::Arguments &args); + static QV4::Value Preserve(const v8::Arguments &args); + static QV4::Value Destroy(const v8::Arguments &args); + static QV4::Value ToString(const v8::Arguments &args); + static QV4::Value ValueOf(const v8::Arguments &args); QV8Engine *m_engine; v8::Persistent m_constructor; diff --git a/src/qml/types/qquickworkerscript.cpp b/src/qml/types/qquickworkerscript.cpp index 3eb1461d5c..62a125de74 100644 --- a/src/qml/types/qquickworkerscript.cpp +++ b/src/qml/types/qquickworkerscript.cpp @@ -175,7 +175,7 @@ public: int m_nextId; - static v8::Handle sendMessage(const v8::Arguments &args); + static QV4::Value sendMessage(const v8::Arguments &args); signals: void stopThread(); @@ -272,7 +272,7 @@ QQuickWorkerScriptEnginePrivate::QQuickWorkerScriptEnginePrivate(QQmlEngine *eng { } -v8::Handle QQuickWorkerScriptEnginePrivate::sendMessage(const v8::Arguments &args) +QV4::Value QQuickWorkerScriptEnginePrivate::sendMessage(const v8::Arguments &args) { WorkerEngine *engine = (WorkerEngine*)V8ENGINE(); -- cgit v1.2.3