Changeset 846 for trunk/src/script/api/qscriptengine_p.h
- Timestamp:
- May 5, 2011, 5:36:53 AM (14 years ago)
- Location:
- trunk
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk
- Property svn:mergeinfo changed
/branches/vendor/nokia/qt/4.7.2 (added) merged: 845 /branches/vendor/nokia/qt/current merged: 844 /branches/vendor/nokia/qt/4.6.3 removed
- Property svn:mergeinfo changed
-
trunk/src/script/api/qscriptengine_p.h
r769 r846 1 1 /**************************************************************************** 2 2 ** 3 ** Copyright (C) 201 0Nokia Corporation and/or its subsidiary(-ies).3 ** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). 4 4 ** All rights reserved. 5 5 ** Contact: Nokia Corporation (qt-info@nokia.com) … … 38 38 #include "private/qobject_p.h" 39 39 40 #include <QtCore/qdatetime.h> 40 41 #include <QtCore/qhash.h> 42 #include <QtCore/qnumeric.h> 43 #include <QtCore/qregexp.h> 41 44 #include <QtCore/qset.h> 42 45 #include "qscriptvalue_p.h" 43 46 #include "qscriptstring_p.h" 44 47 #include "bridge/qscriptclassobject_p.h" 48 #include "bridge/qscriptdeclarativeclass_p.h" 49 #include "bridge/qscriptdeclarativeobject_p.h" 50 #include "bridge/qscriptobject_p.h" 51 #include "bridge/qscriptqobject_p.h" 52 #include "bridge/qscriptvariant_p.h" 53 54 #include "DateConstructor.h" 55 #include "DateInstance.h" 45 56 #include "Debugger.h" 57 #include "ErrorInstance.h" 58 #include "JSArray.h" 59 #include "Executable.h" 46 60 #include "Lexer.h" 47 61 #include "RefPtr.h" 62 #include "RegExpConstructor.h" 63 #include "RegExpObject.h" 48 64 #include "SourceProvider.h" 49 65 #include "Structure.h" 66 #include "UString.h" 50 67 #include "JSGlobalObject.h" 51 68 #include "JSValue.h" … … 58 75 class JSCell; 59 76 class JSGlobalObject; 60 class UString;61 77 } 62 78 … … 73 89 class QScriptSyntaxCheckResult; 74 90 class QScriptEngine; 91 class QScriptProgramPrivate; 75 92 76 93 namespace QScript … … 84 101 class TimeoutCheckerProxy; 85 102 103 qint32 ToInt32(qsreal); 104 quint32 ToUInt32(qsreal); 105 quint16 ToUInt16(qsreal); 106 qsreal ToInteger(qsreal); 107 108 inline bool ToBool(qsreal); 109 inline bool ToBool(const QString &); 110 inline qint32 ToInt32(const QString &); 111 inline quint32 ToUInt32(const QString &); 112 inline quint16 ToUInt16(const QString &); 113 inline qsreal ToInteger(const QString &); 114 #ifdef Q_CC_MSVC 115 // MSVC2008 crashes if these are inlined. 116 qsreal ToNumber(const QString &); 117 QString ToString(qsreal); 118 #else 119 inline qsreal ToNumber(const QString &); 120 inline QString ToString(qsreal); 121 #endif 122 123 QDateTime MsToDateTime(JSC::ExecState *, qsreal); 124 qsreal DateTimeToMs(JSC::ExecState *, const QDateTime &); 125 86 126 //some conversion helper functions 87 127 inline QScriptEnginePrivate *scriptEngineFromExec(const JSC::ExecState *exec); 88 128 bool isFunction(JSC::JSValue value); 129 130 inline void convertToLatin1_helper(const UChar *i, int length, char *s); 131 inline QByteArray convertToLatin1(const JSC::UString &str); 89 132 90 133 class UStringSourceProviderWithFeedback; … … 115 158 static QScriptEngine *get(QScriptEnginePrivate *d) { return d ? d->q_func() : 0; } 116 159 117 static bool convert(const QScriptValue &value, 118 int type, void *ptr, 119 QScriptEnginePrivate *eng); 120 QScriptValue create(int type, const void *ptr); 160 static inline bool isArray(JSC::JSValue); 161 static inline bool isDate(JSC::JSValue); 162 static inline bool isError(JSC::JSValue); 163 static inline bool isObject(JSC::JSValue); 164 static inline bool isRegExp(JSC::JSValue); 165 static inline bool isVariant(JSC::JSValue); 166 static inline bool isQObject(JSC::JSValue); 167 static inline bool isQMetaObject(JSC::JSValue); 168 169 static inline bool toBool(JSC::ExecState *, JSC::JSValue); 170 static inline qsreal toInteger(JSC::ExecState *, JSC::JSValue); 171 static inline qsreal toNumber(JSC::ExecState *, JSC::JSValue); 172 static inline qint32 toInt32(JSC::ExecState *, JSC::JSValue); 173 static inline quint32 toUInt32(JSC::ExecState *, JSC::JSValue); 174 static inline quint16 toUInt16(JSC::ExecState *, JSC::JSValue); 175 static inline JSC::UString toString(JSC::ExecState *, JSC::JSValue); 176 177 static inline QDateTime toDateTime(JSC::ExecState *, JSC::JSValue); 178 #ifndef QT_NO_REGEXP 179 static QRegExp toRegExp(JSC::ExecState*, JSC::JSValue); 180 #endif 181 static QVariant toVariant(JSC::ExecState *, JSC::JSValue); 182 static inline QObject *toQObject(JSC::ExecState *, JSC::JSValue); 183 static inline const QMetaObject *toQMetaObject(JSC::ExecState *, JSC::JSValue); 184 185 static inline JSC::JSValue property(JSC::ExecState*, JSC::JSValue, const JSC::Identifier &id, 186 int resolveMode = QScriptValue::ResolvePrototype); 187 static JSC::JSValue propertyHelper(JSC::ExecState*, JSC::JSValue, const JSC::Identifier &id, int resolveMode); 188 static inline JSC::JSValue property(JSC::ExecState*, JSC::JSValue, quint32 index, 189 int resolveMode = QScriptValue::ResolvePrototype); 190 static JSC::JSValue propertyHelper(JSC::ExecState*, JSC::JSValue, quint32, int resolveMode); 191 static inline JSC::JSValue property(JSC::ExecState*, JSC::JSValue, const JSC::UString &, int resolveMode); 192 static inline void setProperty(JSC::ExecState*, JSC::JSValue object, const JSC::UString &name, JSC::JSValue, 193 const QScriptValue::PropertyFlags &flags = QScriptValue::KeepExistingFlags); 194 static void setProperty(JSC::ExecState*, JSC::JSValue object, const JSC::Identifier &id, JSC::JSValue, 195 const QScriptValue::PropertyFlags &flags = QScriptValue::KeepExistingFlags); 196 static void setProperty(JSC::ExecState*, JSC::JSValue object, quint32 index, JSC::JSValue, 197 const QScriptValue::PropertyFlags &flags = QScriptValue::KeepExistingFlags); 198 static QScriptValue::PropertyFlags propertyFlags(JSC::ExecState*, JSC::JSValue value, 199 const JSC::Identifier &id, const QScriptValue::ResolveFlags &mode); 200 static inline QScriptValue::PropertyFlags propertyFlags(JSC::ExecState*, JSC::JSValue value, 201 const JSC::UString &name, const QScriptValue::ResolveFlags &mode); 202 203 static bool convertValue(JSC::ExecState*, JSC::JSValue value, 204 int type, void *ptr); 205 static bool convertNumber(qsreal, int type, void *ptr); 206 static bool convertString(const QString &, int type, void *ptr); 207 static JSC::JSValue create(JSC::ExecState*, int type, const void *ptr); 121 208 bool hasDemarshalFunction(int type) const; 122 209 123 210 inline QScriptValue scriptValueFromJSCValue(JSC::JSValue value); 124 211 inline JSC::JSValue scriptValueToJSCValue(const QScriptValue &value); 125 126 QScriptValue scriptValueFromVariant(const QVariant &value); 127 QVariant scriptValueToVariant(const QScriptValue &value, int targetType);128 129 JSC::JSValue jscValueFromVariant(const QVariant &value);130 QVariant jscValueToVariant(JSC::JSValue value, int targetType);131 132 QScriptValue arrayFromStringList(const QStringList &lst);133 static QStringList stringListFromArray( const QScriptValue &arr);134 135 QScriptValue arrayFromVariantList(const QVariantList &lst);136 static QVariantList variantListFromArray( const QScriptValue &arr);137 138 QScriptValue objectFromVariantMap(const QVariantMap &vmap);139 static QVariantMap variantMapFromObject( const QScriptValue &obj);212 static inline unsigned propertyFlagsToJSCAttributes(const QScriptValue::PropertyFlags &flags); 213 214 static inline JSC::JSValue jscValueFromVariant(JSC::ExecState*, const QVariant &value); 215 static QVariant jscValueToVariant(JSC::ExecState*, JSC::JSValue value, int targetType); 216 static inline QVariant &variantValue(JSC::JSValue value); 217 static inline void setVariantValue(JSC::JSValue objectValue, const QVariant &value); 218 219 static JSC::JSValue arrayFromStringList(JSC::ExecState*, const QStringList &lst); 220 static QStringList stringListFromArray(JSC::ExecState*, JSC::JSValue arr); 221 222 static JSC::JSValue arrayFromVariantList(JSC::ExecState*, const QVariantList &lst); 223 static QVariantList variantListFromArray(JSC::ExecState*, JSC::JSArray *arr); 224 225 static JSC::JSValue objectFromVariantMap(JSC::ExecState*, const QVariantMap &vmap); 226 static QVariantMap variantMapFromObject(JSC::ExecState*, JSC::JSObject *obj); 140 227 141 228 JSC::JSValue defaultPrototype(int metaTypeId) const; … … 145 232 static inline JSC::ExecState *frameForContext(QScriptContext *context); 146 233 static inline const JSC::ExecState *frameForContext(const QScriptContext *context); 234 235 static inline bool hasValidCodeBlockRegister(JSC::ExecState *frame); 147 236 148 237 JSC::JSGlobalObject *originalGlobalObject() const; … … 163 252 bool isCollecting() const; 164 253 void collectGarbage(); 254 void reportAdditionalMemoryCost(int size); 165 255 166 256 //flags that we set on the return value register for native function. (ie when codeBlock is 0) … … 178 268 void agentDeleted(QScriptEngineAgent *agent); 179 269 270 static inline void saveException(JSC::ExecState *, JSC::JSValue *); 271 static inline void restoreException(JSC::ExecState *, JSC::JSValue); 272 180 273 void setCurrentException(QScriptValue exception) { m_currentException = exception; } 181 274 QScriptValue currentException() const { return m_currentException; } 182 275 void clearCurrentException() { m_currentException.d_ptr.reset(); } 276 277 static QScriptSyntaxCheckResult checkSyntax(const QString &program); 278 static bool canEvaluate(const QString &program); 279 280 inline void registerScriptProgram(QScriptProgramPrivate *program); 281 inline void unregisterScriptProgram(QScriptProgramPrivate *program); 282 void detachAllRegisteredScriptPrograms(); 283 284 inline QScriptValuePrivate *allocateScriptValuePrivate(size_t); 285 inline void freeScriptValuePrivate(QScriptValuePrivate *p); 286 287 inline void registerScriptValue(QScriptValuePrivate *value); 288 inline void unregisterScriptValue(QScriptValuePrivate *value); 289 void detachAllRegisteredScriptValues(); 290 291 inline void registerScriptString(QScriptStringPrivate *value); 292 inline void unregisterScriptString(QScriptStringPrivate *value); 293 void detachAllRegisteredScriptStrings(); 294 QScriptString toStringHandle(const JSC::Identifier &name); 295 296 static inline JSC::JSValue newArray(JSC::ExecState *, uint length); 297 static inline JSC::JSValue newDate(JSC::ExecState *, qsreal value); 298 static inline JSC::JSValue newDate(JSC::ExecState *, const QDateTime &); 299 inline JSC::JSValue newObject(); 300 301 #ifndef QT_NO_REGEXP 302 static JSC::JSValue newRegExp(JSC::ExecState *, const QRegExp &); 303 #endif 304 305 static JSC::JSValue newRegExp(JSC::ExecState *, const QString &pattern, const QString &flags); 306 JSC::JSValue newVariant(const QVariant &); 307 JSC::JSValue newVariant(JSC::JSValue objectValue, const QVariant &); 308 309 static inline QScriptDeclarativeClass *declarativeClass(JSC::JSValue); 310 static inline QScriptDeclarativeClass::Object *declarativeObject(JSC::JSValue); 311 312 JSC::UString translationContextFromUrl(const JSC::UString &); 183 313 184 314 #ifndef QT_NO_QOBJECT … … 189 319 JSC::JSValue ctor); 190 320 191 static QScriptSyntaxCheckResult checkSyntax(const QString &program); 192 static bool canEvaluate(const QString &program); 193 static bool convertToNativeQObject(const QScriptValue &value, 321 static bool convertToNativeQObject(JSC::ExecState*, JSC::JSValue, 194 322 const QByteArray &targetType, 195 323 void **result); … … 221 349 JSC::JSValue function); 222 350 223 inline QScriptValuePrivate *allocateScriptValuePrivate(size_t);224 inline void freeScriptValuePrivate(QScriptValuePrivate *p);225 226 inline void registerScriptValue(QScriptValuePrivate *value);227 inline void unregisterScriptValue(QScriptValuePrivate *value);228 void detachAllRegisteredScriptValues();229 230 inline void registerScriptString(QScriptStringPrivate *value);231 inline void unregisterScriptString(QScriptStringPrivate *value);232 void detachAllRegisteredScriptStrings();233 234 351 // private slots 235 352 void _q_objectDestroyed(QObject *); … … 241 358 242 359 WTF::RefPtr<JSC::Structure> scriptObjectStructure; 360 WTF::RefPtr<JSC::Structure> staticScopeObjectStructure; 243 361 244 362 QScript::QObjectPrototype *qobjectPrototype; … … 259 377 int freeScriptValuesCount; 260 378 QScriptStringPrivate *registeredScriptStrings; 379 QSet<QScriptProgramPrivate*> registeredScriptPrograms; 261 380 QHash<int, QScriptTypeInfo*> m_typeInfos; 262 381 int processEventsInterval; 263 382 QScriptValue abortResult; 264 383 bool inEval; 384 385 JSC::UString cachedTranslationUrl; 386 JSC::UString cachedTranslationContext; 265 387 266 388 QSet<QString> importedExtensions; … … 270 392 QScriptValue m_currentException; 271 393 394 QSet<JSC::JSObject*> visitedConversionObjects; 395 272 396 #ifndef QT_NO_QOBJECT 273 397 QHash<QObject*, QScript::QObjectData*> m_qobjectData; … … 281 405 namespace QScript 282 406 { 407 408 class APIShim 409 { 410 public: 411 APIShim(QScriptEnginePrivate *engine) 412 : m_engine(engine), m_oldTable(JSC::setCurrentIdentifierTable(engine->globalData->identifierTable)) 413 { 414 } 415 ~APIShim() 416 { 417 JSC::setCurrentIdentifierTable(m_oldTable); 418 } 419 420 private: 421 QScriptEnginePrivate *m_engine; 422 JSC::IdentifierTable *m_oldTable; 423 }; 283 424 284 425 /*Helper class. Main purpose is to give debugger feedback about unloading and loading scripts. … … 373 514 } 374 515 516 #ifndef Q_CC_MSVC 517 // MSVC2008 crashes if these are inlined. 518 519 inline QString ToString(qsreal value) 520 { 521 return JSC::UString::from(value); 522 } 523 524 inline qsreal ToNumber(const QString &value) 525 { 526 return ((JSC::UString)value).toDouble(); 527 } 528 529 #endif 530 531 inline qint32 ToInt32(const QString &value) 532 { 533 return ToInt32(ToNumber(value)); 534 } 535 536 inline quint32 ToUInt32(const QString &value) 537 { 538 return ToUInt32(ToNumber(value)); 539 } 540 541 inline quint16 ToUInt16(const QString &value) 542 { 543 return ToUInt16(ToNumber(value)); 544 } 545 546 inline qsreal ToInteger(const QString &value) 547 { 548 return ToInteger(ToNumber(value)); 549 } 550 551 inline bool ToBool(qsreal value) 552 { 553 return (value != 0) && !qIsNaN(value); 554 } 555 556 inline bool ToBool(const QString &value) 557 { 558 return !value.isEmpty(); 559 } 560 561 inline void convertToLatin1_helper(const UChar *i, int length, char *s) 562 { 563 const UChar *e = i + length; 564 while (i != e) 565 *(s++) = (uchar) *(i++); 566 *s = '\0'; 567 } 568 569 inline QByteArray convertToLatin1(const JSC::UString &str) 570 { 571 QByteArray ba(str.size(), Qt::Uninitialized); 572 convertToLatin1_helper(str.data(), str.size(), ba.data()); 573 return ba; 574 } 575 375 576 } // namespace QScript 577 578 inline void QScriptEnginePrivate::registerScriptProgram(QScriptProgramPrivate *program) 579 { 580 Q_ASSERT(!registeredScriptPrograms.contains(program)); 581 registeredScriptPrograms.insert(program); 582 } 583 584 inline void QScriptEnginePrivate::unregisterScriptProgram(QScriptProgramPrivate *program) 585 { 586 Q_ASSERT(registeredScriptPrograms.contains(program)); 587 registeredScriptPrograms.remove(program); 588 } 376 589 377 590 inline QScriptValuePrivate *QScriptEnginePrivate::allocateScriptValuePrivate(size_t size) … … 416 629 value->prev = 0; 417 630 value->next = 0; 631 } 632 633 inline JSC::JSValue QScriptEnginePrivate::jscValueFromVariant(JSC::ExecState *exec, const QVariant &v) 634 { 635 JSC::JSValue result = create(exec, v.userType(), v.data()); 636 Q_ASSERT(result); 637 return result; 418 638 } 419 639 … … 445 665 } 446 666 667 inline unsigned QScriptEnginePrivate::propertyFlagsToJSCAttributes(const QScriptValue::PropertyFlags &flags) 668 { 669 unsigned attribs = 0; 670 if (flags & QScriptValue::ReadOnly) 671 attribs |= JSC::ReadOnly; 672 if (flags & QScriptValue::SkipInEnumeration) 673 attribs |= JSC::DontEnum; 674 if (flags & QScriptValue::Undeletable) 675 attribs |= JSC::DontDelete; 676 attribs |= flags & QScriptValue::UserRange; 677 return attribs; 678 } 679 447 680 inline QScriptValuePrivate::~QScriptValuePrivate() 448 681 { … … 479 712 } 480 713 481 inline QScriptValue QScriptValuePrivate::property(const QString &name, int resolveMode) const 482 { 483 JSC::ExecState *exec = engine->currentFrame; 484 return property(JSC::Identifier(exec, name), resolveMode); 485 } 486 487 inline QScriptValue QScriptValuePrivate::property(const JSC::Identifier &id, int resolveMode) const 488 { 489 Q_ASSERT(isObject()); 490 JSC::ExecState *exec = engine->currentFrame; 491 JSC::JSObject *object = JSC::asObject(jscValue); 714 inline JSC::JSValue QScriptEnginePrivate::property(JSC::ExecState *exec, JSC::JSValue value, const JSC::UString &name, int resolveMode) 715 { 716 return property(exec, value, JSC::Identifier(exec, name), resolveMode); 717 } 718 719 inline JSC::JSValue QScriptEnginePrivate::property(JSC::ExecState *exec, JSC::JSValue value, const JSC::Identifier &id, int resolveMode) 720 { 721 Q_ASSERT(isObject(value)); 722 JSC::JSObject *object = JSC::asObject(value); 492 723 JSC::PropertySlot slot(object); 493 724 if ((resolveMode & QScriptValue::ResolvePrototype) && object->getPropertySlot(exec, id, slot)) 494 return engine->scriptValueFromJSCValue(slot.getValue(exec, id)); 495 return propertyHelper(id, resolveMode); 496 } 497 498 inline QScriptValue QScriptValuePrivate::property(quint32 index, int resolveMode) const 499 { 500 Q_ASSERT(isObject()); 501 JSC::ExecState *exec = engine->currentFrame; 502 JSC::JSObject *object = JSC::asObject(jscValue); 725 return slot.getValue(exec, id); 726 return propertyHelper(exec, value, id, resolveMode); 727 } 728 729 inline JSC::JSValue QScriptEnginePrivate::property(JSC::ExecState *exec, JSC::JSValue value, quint32 index, int resolveMode) 730 { 731 Q_ASSERT(isObject(value)); 732 JSC::JSObject *object = JSC::asObject(value); 503 733 JSC::PropertySlot slot(object); 504 734 if ((resolveMode & QScriptValue::ResolvePrototype) && object->getPropertySlot(exec, index, slot)) 505 return engine->scriptValueFromJSCValue(slot.getValue(exec, index)); 506 return propertyHelper(index, resolveMode); 735 return slot.getValue(exec, index); 736 return propertyHelper(exec, value, index, resolveMode); 737 } 738 739 inline QScriptValue::PropertyFlags QScriptEnginePrivate::propertyFlags(JSC::ExecState *exec, JSC::JSValue value, 740 const JSC::UString &name, 741 const QScriptValue::ResolveFlags &mode) 742 { 743 return propertyFlags(exec, value, JSC::Identifier(exec, name), mode); 744 } 745 746 inline void QScriptEnginePrivate::setProperty(JSC::ExecState *exec, JSC::JSValue objectValue, const JSC::UString &name, 747 JSC::JSValue value, const QScriptValue::PropertyFlags &flags) 748 { 749 setProperty(exec, objectValue, JSC::Identifier(exec, name), value, flags); 750 } 751 752 inline JSC::JSValue QScriptValuePrivate::property(const JSC::Identifier &id, const QScriptValue::ResolveFlags &resolveMode) const 753 { 754 return QScriptEnginePrivate::property(engine->currentFrame, jscValue, id, resolveMode); 755 } 756 757 inline JSC::JSValue QScriptValuePrivate::property(quint32 index, const QScriptValue::ResolveFlags &resolveMode) const 758 { 759 return QScriptEnginePrivate::property(engine->currentFrame, jscValue, index, resolveMode); 760 } 761 762 inline JSC::JSValue QScriptValuePrivate::property(const JSC::UString &name, const QScriptValue::ResolveFlags &resolveMode) const 763 { 764 JSC::ExecState *exec = engine->currentFrame; 765 return QScriptEnginePrivate::property(exec, jscValue, JSC::Identifier(exec, name), resolveMode); 766 } 767 768 inline QScriptValue::PropertyFlags QScriptValuePrivate::propertyFlags( 769 const JSC::Identifier &id, const QScriptValue::ResolveFlags &mode) const 770 { 771 return QScriptEnginePrivate::propertyFlags(engine->currentFrame, jscValue, id, mode); 772 } 773 774 inline void QScriptValuePrivate::setProperty(const JSC::Identifier &id, const JSC::JSValue &value, 775 const QScriptValue::PropertyFlags &flags) 776 { 777 QScriptEnginePrivate::setProperty(engine->currentFrame, jscValue, id, value, flags); 778 } 779 780 inline void QScriptValuePrivate::setProperty(quint32 index, const JSC::JSValue &value, 781 const QScriptValue::PropertyFlags &flags) 782 { 783 QScriptEnginePrivate::setProperty(engine->currentFrame, jscValue, index, value, flags); 784 } 785 786 inline void QScriptValuePrivate::setProperty(const JSC::UString &name, const JSC::JSValue &value, 787 const QScriptValue::PropertyFlags &flags) 788 { 789 JSC::ExecState *exec = engine->currentFrame; 790 QScriptEnginePrivate::setProperty(exec, jscValue, JSC::Identifier(exec, name), value, flags); 507 791 } 508 792 … … 523 807 } 524 808 525 inline void QScript ValuePrivate::saveException(JSC::ExecState *exec, JSC::JSValue *val)809 inline void QScriptEnginePrivate::saveException(JSC::ExecState *exec, JSC::JSValue *val) 526 810 { 527 811 if (exec) { … … 533 817 } 534 818 535 inline void QScript ValuePrivate::restoreException(JSC::ExecState *exec, JSC::JSValue val)819 inline void QScriptEnginePrivate::restoreException(JSC::ExecState *exec, JSC::JSValue val) 536 820 { 537 821 if (exec && val) … … 582 866 } 583 867 868 inline bool QScriptEnginePrivate::hasValidCodeBlockRegister(JSC::ExecState *frame) 869 { 870 #if ENABLE(JIT) 871 // Frames created by the VM don't have their CodeBlock register 872 // initialized. We can detect such frames by checking if the 873 // callee is a host JSFunction. 874 JSC::JSObject *callee = frame->callee(); 875 return !(callee && callee->inherits(&JSC::JSFunction::info) 876 && JSC::asFunction(callee)->isHostFunction()); 877 #else 878 Q_UNUSED(frame); 879 return true; 880 #endif 881 } 882 584 883 inline JSC::ExecState *QScriptEnginePrivate::globalExec() const 585 884 { … … 587 886 } 588 887 888 inline JSC::JSValue QScriptEnginePrivate::newArray(JSC::ExecState *exec, uint length) 889 { 890 return JSC::constructEmptyArray(exec, length); 891 } 892 893 inline JSC::JSValue QScriptEnginePrivate::newDate(JSC::ExecState *exec, qsreal value) 894 { 895 JSC::JSValue val = JSC::jsNumber(exec, value); 896 JSC::ArgList args(&val, 1); 897 return JSC::constructDate(exec, args); 898 } 899 900 inline JSC::JSValue QScriptEnginePrivate::newDate(JSC::ExecState *exec, const QDateTime &value) 901 { 902 return newDate(exec, QScript::DateTimeToMs(exec, value)); 903 } 904 905 inline JSC::JSValue QScriptEnginePrivate::newObject() 906 { 907 return new (currentFrame)QScriptObject(scriptObjectStructure); 908 } 909 910 inline bool QScriptEnginePrivate::isObject(JSC::JSValue value) 911 { 912 return value && value.isObject(); 913 } 914 915 inline bool QScriptEnginePrivate::isArray(JSC::JSValue value) 916 { 917 return isObject(value) && value.inherits(&JSC::JSArray::info); 918 } 919 920 inline bool QScriptEnginePrivate::isDate(JSC::JSValue value) 921 { 922 return isObject(value) && value.inherits(&JSC::DateInstance::info); 923 } 924 925 inline bool QScriptEnginePrivate::isError(JSC::JSValue value) 926 { 927 return isObject(value) && value.inherits(&JSC::ErrorInstance::info); 928 } 929 930 inline bool QScriptEnginePrivate::isRegExp(JSC::JSValue value) 931 { 932 return isObject(value) && value.inherits(&JSC::RegExpObject::info); 933 } 934 935 inline bool QScriptEnginePrivate::isVariant(JSC::JSValue value) 936 { 937 if (!isObject(value) || !value.inherits(&QScriptObject::info)) 938 return false; 939 QScriptObject *object = static_cast<QScriptObject*>(JSC::asObject(value)); 940 QScriptObjectDelegate *delegate = object->delegate(); 941 return (delegate && (delegate->type() == QScriptObjectDelegate::Variant)); 942 } 943 944 inline bool QScriptEnginePrivate::isQObject(JSC::JSValue value) 945 { 946 #ifndef QT_NO_QOBJECT 947 if (!isObject(value) || !value.inherits(&QScriptObject::info)) 948 return false; 949 QScriptObject *object = static_cast<QScriptObject*>(JSC::asObject(value)); 950 QScriptObjectDelegate *delegate = object->delegate(); 951 return (delegate && (delegate->type() == QScriptObjectDelegate::QtObject || 952 (delegate->type() == QScriptObjectDelegate::DeclarativeClassObject && 953 static_cast<QScript::DeclarativeObjectDelegate*>(delegate)->scriptClass()->isQObject()))); 954 #else 955 return false; 956 #endif 957 } 958 959 inline bool QScriptEnginePrivate::isQMetaObject(JSC::JSValue value) 960 { 961 #ifndef QT_NO_QOBJECT 962 return isObject(value) && JSC::asObject(value)->inherits(&QScript::QMetaObjectWrapperObject::info); 963 #else 964 return false; 965 #endif 966 } 967 968 inline bool QScriptEnginePrivate::toBool(JSC::ExecState *exec, JSC::JSValue value) 969 { 970 JSC::JSValue savedException; 971 saveException(exec, &savedException); 972 bool result = value.toBoolean(exec); 973 restoreException(exec, savedException); 974 return result; 975 } 976 977 inline qsreal QScriptEnginePrivate::toInteger(JSC::ExecState *exec, JSC::JSValue value) 978 { 979 JSC::JSValue savedException; 980 saveException(exec, &savedException); 981 qsreal result = value.toInteger(exec); 982 restoreException(exec, savedException); 983 return result; 984 } 985 986 inline qsreal QScriptEnginePrivate::toNumber(JSC::ExecState *exec, JSC::JSValue value) 987 { 988 JSC::JSValue savedException; 989 saveException(exec, &savedException); 990 qsreal result = value.toNumber(exec); 991 restoreException(exec, savedException); 992 return result; 993 } 994 995 inline qint32 QScriptEnginePrivate::toInt32(JSC::ExecState *exec, JSC::JSValue value) 996 { 997 JSC::JSValue savedException; 998 saveException(exec, &savedException); 999 qint32 result = value.toInt32(exec); 1000 restoreException(exec, savedException); 1001 return result; 1002 } 1003 1004 inline quint32 QScriptEnginePrivate::toUInt32(JSC::ExecState *exec, JSC::JSValue value) 1005 { 1006 JSC::JSValue savedException; 1007 saveException(exec, &savedException); 1008 quint32 result = value.toUInt32(exec); 1009 restoreException(exec, savedException); 1010 return result; 1011 } 1012 1013 inline quint16 QScriptEnginePrivate::toUInt16(JSC::ExecState *exec, JSC::JSValue value) 1014 { 1015 // ### no equivalent function in JSC 1016 return QScript::ToUInt16(toNumber(exec, value)); 1017 } 1018 1019 inline JSC::UString QScriptEnginePrivate::toString(JSC::ExecState *exec, JSC::JSValue value) 1020 { 1021 JSC::JSValue savedException; 1022 saveException(exec, &savedException); 1023 JSC::UString str = value.toString(exec); 1024 if (exec && exec->hadException() && !str.size()) { 1025 JSC::JSValue savedException2; 1026 saveException(exec, &savedException2); 1027 str = savedException2.toString(exec); 1028 restoreException(exec, savedException2); 1029 } 1030 if (savedException) 1031 restoreException(exec, savedException); 1032 return str; 1033 } 1034 1035 inline QDateTime QScriptEnginePrivate::toDateTime(JSC::ExecState *exec, JSC::JSValue value) 1036 { 1037 if (!isDate(value)) 1038 return QDateTime(); 1039 qsreal t = static_cast<JSC::DateInstance*>(JSC::asObject(value))->internalNumber(); 1040 return QScript::MsToDateTime(exec, t); 1041 } 1042 1043 inline QObject *QScriptEnginePrivate::toQObject(JSC::ExecState *exec, JSC::JSValue value) 1044 { 1045 #ifndef QT_NO_QOBJECT 1046 if (isObject(value) && value.inherits(&QScriptObject::info)) { 1047 QScriptObject *object = static_cast<QScriptObject*>(JSC::asObject(value)); 1048 QScriptObjectDelegate *delegate = object->delegate(); 1049 if (!delegate) 1050 return 0; 1051 if (delegate->type() == QScriptObjectDelegate::QtObject) 1052 return static_cast<QScript::QObjectDelegate*>(delegate)->value(); 1053 if (delegate->type() == QScriptObjectDelegate::DeclarativeClassObject) 1054 return static_cast<QScript::DeclarativeObjectDelegate*>(delegate)->scriptClass()->toQObject(declarativeObject(value)); 1055 if (delegate->type() == QScriptObjectDelegate::Variant) { 1056 QVariant var = variantValue(value); 1057 int type = var.userType(); 1058 if ((type == QMetaType::QObjectStar) || (type == QMetaType::QWidgetStar)) 1059 return *reinterpret_cast<QObject* const *>(var.constData()); 1060 } 1061 } 1062 #endif 1063 return 0; 1064 } 1065 1066 inline const QMetaObject *QScriptEnginePrivate::toQMetaObject(JSC::ExecState*, JSC::JSValue value) 1067 { 1068 #ifndef QT_NO_QOBJECT 1069 if (isQMetaObject(value)) 1070 return static_cast<QScript::QMetaObjectWrapperObject*>(JSC::asObject(value))->value(); 1071 #endif 1072 return 0; 1073 } 1074 1075 inline QVariant &QScriptEnginePrivate::variantValue(JSC::JSValue value) 1076 { 1077 Q_ASSERT(value.inherits(&QScriptObject::info)); 1078 QScriptObjectDelegate *delegate = static_cast<QScriptObject*>(JSC::asObject(value))->delegate(); 1079 Q_ASSERT(delegate && (delegate->type() == QScriptObjectDelegate::Variant)); 1080 return static_cast<QScript::QVariantDelegate*>(delegate)->value(); 1081 } 1082 1083 inline void QScriptEnginePrivate::setVariantValue(JSC::JSValue objectValue, const QVariant &value) 1084 { 1085 Q_ASSERT(objectValue.inherits(&QScriptObject::info)); 1086 QScriptObjectDelegate *delegate = static_cast<QScriptObject*>(JSC::asObject(objectValue))->delegate(); 1087 Q_ASSERT(delegate && (delegate->type() == QScriptObjectDelegate::Variant)); 1088 static_cast<QScript::QVariantDelegate*>(delegate)->setValue(value); 1089 } 1090 1091 inline QScriptDeclarativeClass *QScriptEnginePrivate::declarativeClass(JSC::JSValue v) 1092 { 1093 if (!QScriptEnginePrivate::isObject(v) || !v.inherits(&QScriptObject::info)) 1094 return 0; 1095 QScriptObject *scriptObject = static_cast<QScriptObject*>(JSC::asObject(v)); 1096 QScriptObjectDelegate *delegate = scriptObject->delegate(); 1097 if (!delegate || (delegate->type() != QScriptObjectDelegate::DeclarativeClassObject)) 1098 return 0; 1099 return static_cast<QScript::DeclarativeObjectDelegate*>(delegate)->scriptClass(); 1100 } 1101 1102 inline QScriptDeclarativeClass::Object *QScriptEnginePrivate::declarativeObject(JSC::JSValue v) 1103 { 1104 if (!QScriptEnginePrivate::isObject(v) || !v.inherits(&QScriptObject::info)) 1105 return 0; 1106 QScriptObject *scriptObject = static_cast<QScriptObject*>(JSC::asObject(v)); 1107 QScriptObjectDelegate *delegate = scriptObject->delegate(); 1108 if (!delegate || (delegate->type() != QScriptObjectDelegate::DeclarativeClassObject)) 1109 return 0; 1110 return static_cast<QScript::DeclarativeObjectDelegate*>(delegate)->object(); 1111 } 1112 589 1113 QT_END_NAMESPACE 590 1114
Note:
See TracChangeset
for help on using the changeset viewer.