X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fdeclarative%2Fqml%2Fv8%2Fqv8engine_p.h;h=f46a660c6dd3d63914b71295650003c8fba46cf9;hb=45b14259fc0cf704692df1c00da511527d1fba1d;hp=6f09e977d543eeda8c39944583ff9a831d4d6ca7;hpb=dd3983655c40a6c8879b8980d41a0cd2b7612da9;p=profile%2Fivi%2Fqtdeclarative.git diff --git a/src/declarative/qml/v8/qv8engine_p.h b/src/declarative/qml/v8/qv8engine_p.h index 6f09e97..f46a660 100644 --- a/src/declarative/qml/v8/qv8engine_p.h +++ b/src/declarative/qml/v8/qv8engine_p.h @@ -1,8 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/ ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** @@ -35,6 +34,7 @@ ** ** ** +** ** $QT_END_LICENSE$ ** ****************************************************************************/ @@ -59,6 +59,8 @@ #include #include #include +#include +#include #include #include @@ -77,6 +79,7 @@ #include "qv8listwrapper_p.h" #include "qv8variantwrapper_p.h" #include "qv8valuetypewrapper_p.h" +#include "qv8sequencewrapper_p.h" QT_BEGIN_NAMESPACE @@ -135,7 +138,9 @@ public: QV8ObjectResource(QV8Engine *engine) : engine(engine) { Q_ASSERT(engine); } enum ResourceType { ContextType, QObjectType, TypeType, ListType, VariantType, ValueTypeType, XMLHttpRequestType, DOMNodeType, SQLDatabaseType, - ListModelType, Context2DType, ParticleDataType, SignalHandlerType }; + ListModelType, Context2DType, Context2DStyleType, Context2DPixelArrayType, + ParticleDataType, SignalHandlerType, IncubatorType, VisualDataItemType, + SequenceType, LocaleDataType }; virtual ResourceType resourceType() const = 0; QV8Engine *engine; @@ -218,6 +223,27 @@ class QDeclarativeValueType; class QNetworkAccessManager; class QDeclarativeContextData; +class Q_AUTOTEST_EXPORT QV8GCCallback +{ +private: + class ThreadData; +public: + static void garbageCollectorPrologueCallback(v8::GCType, v8::GCCallbackFlags); + static void registerGcPrologueCallback(); + + class Q_AUTOTEST_EXPORT Node { + public: + typedef void (*PrologueCallback)(Node *node); + Node(PrologueCallback callback); + ~Node(); + + QIntrusiveListNode node; + PrologueCallback prologueCallback; + }; + + static void addGcCallbackNode(Node *node); +}; + class Q_DECLARATIVE_EXPORT QV8Engine { public: @@ -227,6 +253,10 @@ public: QV8Engine(QJSEngine* qq,QJSEngine::ContextOwnership ownership = QJSEngine::CreateNewContext); ~QV8Engine(); + // ### TODO get rid of it, do we really need CppOwnership? + // This enum should be in sync with QDeclarativeEngine::ObjectOwnership + enum ObjectOwnership { CppOwnership, JavaScriptOwnership }; + struct Deletable { virtual ~Deletable() {} }; @@ -274,6 +304,7 @@ public: QV8ListWrapper *listWrapper() { return &m_listWrapper; } QV8VariantWrapper *variantWrapper() { return &m_variantWrapper; } QV8ValueTypeWrapper *valueTypeWrapper() { return &m_valueTypeWrapper; } + QV8SequenceWrapper *sequenceWrapper() { return &m_sequenceWrapper; } void *xmlHttpRequestData() { return m_xmlHttpRequestData; } void *sqlDatabaseData() { return m_sqlDatabaseData; } @@ -310,6 +341,7 @@ public: // Return a JS wrapper for the given QObject \a object inline v8::Handle newQObject(QObject *object); + inline v8::Handle newQObject(QObject *object, const ObjectOwnership ownership); inline bool isQObject(v8::Handle); inline QObject *toQObject(v8::Handle); @@ -320,6 +352,9 @@ public: inline v8::Handle newValueType(QObject *, int coreIndex, QDeclarativeValueType *); inline v8::Handle newValueType(const QVariant &, QDeclarativeValueType *); + // Create a new sequence type object + inline v8::Handle newSequence(int sequenceType, QObject *, int coreIndex, bool *succeeded); + // Create a new QVariant object. This doesn't examine the type of the variant, but always returns // a QVariant wrapper inline v8::Handle newQVariant(const QVariant &); @@ -358,23 +393,23 @@ public: void setExtensionData(int, Deletable *); inline v8::Handle makeJSValue(bool value); - inline v8::Handle makeJSValue(int value); - inline v8::Handle makeJSValue(uint value); - inline v8::Handle makeJSValue(double value); + inline v8::Local makeJSValue(int value); + inline v8::Local makeJSValue(uint value); + inline v8::Local makeJSValue(double value); inline v8::Handle makeJSValue(QJSValue::SpecialValue value); - inline v8::Handle makeJSValue(const QString& value); + inline v8::Local makeJSValue(const QString &value); inline QScriptPassPointer evaluate(const QString &program, const QString &fileName = QString(), int lineNumber = 1); QScriptPassPointer evaluate(v8::Handle script, v8::TryCatch& tryCatch); QScriptPassPointer newArray(uint length); - v8::Handle newVariant(const QVariant &variant); + v8::Local newVariant(const QVariant &variant); QScriptPassPointer newVariant(QJSValuePrivate* value, const QVariant &variant); - v8::Handle variantListToJS(const QVariantList &lst); + v8::Local variantListToJS(const QVariantList &lst); QVariantList variantListFromJS(v8::Handle jsArray); - v8::Handle variantMapToJS(const QVariantMap &vmap); + v8::Local variantMapToJS(const QVariantMap &vmap); QVariantMap variantMapFromJS(v8::Handle jsObject); v8::Handle variantToJS(const QVariant &value); @@ -393,8 +428,35 @@ public: void emitSignalHandlerException(); + // used for console.time(), console.timeEnd() + void startTimer(const QString &timerName); + qint64 stopTimer(const QString &timerName, bool *wasRunning); + + // used for console.count() + int consoleCountHelper(const QString &file, int line, int column); + QObject *qtObjectFromJS(v8::Handle value); QSet visitedConversionObjects; + + static QDateTime qtDateTimeFromJsDate(double jsDate); + + void addRelationshipForGC(QObject *object, v8::Persistent handle); + void addRelationshipForGC(QObject *object, QObject *other); + + struct ThreadData { + ThreadData(); + ~ThreadData(); + v8::Isolate* isolate; + bool gcPrologueCallbackRegistered; + QIntrusiveList gcCallbackNodes; + }; + + static bool hasThreadData(); + static ThreadData* threadData(); + static void ensurePerThreadIsolate(); + + v8::Persistent m_strongReferencer; + protected: QJSEngine* q; QDeclarativeEngine *m_engine; @@ -409,6 +471,7 @@ protected: QV8ListWrapper m_listWrapper; QV8VariantWrapper m_variantWrapper; QV8ValueTypeWrapper m_valueTypeWrapper; + QV8SequenceWrapper m_sequenceWrapper; v8::Persistent m_getOwnPropertyNames; v8::Persistent m_freezeObject; @@ -423,47 +486,20 @@ protected: Exception m_exception; + QElapsedTimer m_time; + QHash m_startedTimers; + + QHash m_consoleCount; + QVariant toBasicVariant(v8::Handle); void initializeGlobal(v8::Handle); - static v8::Handle gc(const v8::Arguments &args); - static v8::Handle print(const v8::Arguments &args); - static v8::Handle isQtObject(const v8::Arguments &args); - static v8::Handle rgba(const v8::Arguments &args); - static v8::Handle hsla(const v8::Arguments &args); - static v8::Handle rect(const v8::Arguments &args); - static v8::Handle point(const v8::Arguments &args); - static v8::Handle size(const v8::Arguments &args); - static v8::Handle vector3d(const v8::Arguments &args); - static v8::Handle vector4d(const v8::Arguments &args); - static v8::Handle lighter(const v8::Arguments &args); - static v8::Handle darker(const v8::Arguments &args); - static v8::Handle tint(const v8::Arguments &args); - static v8::Handle formatDate(const v8::Arguments &args); - static v8::Handle formatTime(const v8::Arguments &args); - static v8::Handle formatDateTime(const v8::Arguments &args); - static v8::Handle openUrlExternally(const v8::Arguments &args); - static v8::Handle fontFamilies(const v8::Arguments &args); - static v8::Handle md5(const v8::Arguments &args); - static v8::Handle btoa(const v8::Arguments &args); - static v8::Handle atob(const v8::Arguments &args); - static v8::Handle quit(const v8::Arguments &args); - static v8::Handle resolvedUrl(const v8::Arguments &args); - static v8::Handle createQmlObject(const v8::Arguments &args); - static v8::Handle createComponent(const v8::Arguments &args); - static v8::Handle qsTranslate(const v8::Arguments &args); - static v8::Handle qsTranslateNoOp(const v8::Arguments &args); - static v8::Handle qsTr(const v8::Arguments &args); - static v8::Handle qsTrNoOp(const v8::Arguments &args); - static v8::Handle qsTrId(const v8::Arguments &args); - static v8::Handle qsTrIdNoOp(const v8::Arguments &args); - static v8::Handle stringArg(const v8::Arguments &args); - double qtDateTimeToJsDate(const QDateTime &dt); - QDateTime qtDateTimeFromJsDate(double jsDate); private: + static v8::Persistent *findOwnerAndStrength(QObject *object, bool *shouldBeStrong); + typedef QScriptIntrusiveList ValueList; ValueList m_values; typedef QScriptIntrusiveList ValueIteratorList; @@ -543,6 +579,20 @@ v8::Handle QV8Engine::newQObject(QObject *object) return m_qobjectWrapper.newQObject(object); } +v8::Handle QV8Engine::newQObject(QObject *object, const ObjectOwnership ownership) +{ + if (!object) + return v8::Null(); + + v8::Handle result = newQObject(object); + QDeclarativeData *ddata = QDeclarativeData::get(object, true); + if (ownership == JavaScriptOwnership && ddata) { + ddata->indestructible = false; + ddata->explicitIndestructibleSet = true; + } + return result; +} + v8::Local QV8Engine::toString(const QString &string) { return m_stringWrapper.toString(string); @@ -558,6 +608,11 @@ v8::Handle QV8Engine::newValueType(const QVariant &value, QDeclarativ return m_valueTypeWrapper.newValueType(value, type); } +v8::Handle QV8Engine::newSequence(int sequenceType, QObject *object, int property, bool *succeeded) +{ + return m_sequenceWrapper.newSequence(sequenceType, object, property, succeeded); +} + // XXX Can this be made more optimal? It is called prior to resolving each and every // unqualified name in QV8ContextWrapper. bool QV8Engine::startsWithUpper(v8::Handle string)