forked from qt-creator/qt-creator
		
	
		
			
	
	
		
			883 lines
		
	
	
		
			29 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
		
		
			
		
	
	
			883 lines
		
	
	
		
			29 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
|   | /**************************************************************************
 | ||
|  | ** | ||
|  | ** This file is part of Qt Creator | ||
|  | ** | ||
|  | ** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies). | ||
|  | ** | ||
|  | ** Contact: Nokia Corporation (info@qt.nokia.com) | ||
|  | ** | ||
|  | ** | ||
|  | ** GNU Lesser General Public License Usage | ||
|  | ** | ||
|  | ** This file may be used under the terms of the GNU Lesser General Public | ||
|  | ** License version 2.1 as published by the Free Software Foundation and | ||
|  | ** appearing in the file LICENSE.LGPL included in the packaging of this file. | ||
|  | ** Please review the following information to ensure the GNU Lesser General | ||
|  | ** Public License version 2.1 requirements will be met: | ||
|  | ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
 | ||
|  | ** | ||
|  | ** In addition, as a special exception, Nokia gives you certain additional | ||
|  | ** rights. These rights are described in the Nokia Qt LGPL Exception | ||
|  | ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. | ||
|  | ** | ||
|  | ** Other Usage | ||
|  | ** | ||
|  | ** Alternatively, this file may be used in accordance with the terms and | ||
|  | ** conditions contained in a signed written agreement between you and Nokia. | ||
|  | ** | ||
|  | ** If you have questions regarding the use of this file, please contact | ||
|  | ** Nokia at info@qt.nokia.com. | ||
|  | ** | ||
|  | **************************************************************************/ | ||
|  | 
 | ||
|  | #include "qmljsvalueowner.h"
 | ||
|  | 
 | ||
|  | using namespace QmlJS; | ||
|  | 
 | ||
|  | namespace { | ||
|  | 
 | ||
|  | ////////////////////////////////////////////////////////////////////////////////
 | ||
|  | // constructors
 | ||
|  | ////////////////////////////////////////////////////////////////////////////////
 | ||
|  | class ObjectCtor: public Function | ||
|  | { | ||
|  | public: | ||
|  |     ObjectCtor(ValueOwner *valueOwner); | ||
|  | 
 | ||
|  |     virtual const Value *invoke(const Activation *activation) const; | ||
|  | }; | ||
|  | 
 | ||
|  | class FunctionCtor: public Function | ||
|  | { | ||
|  | public: | ||
|  |     FunctionCtor(ValueOwner *valueOwner); | ||
|  | 
 | ||
|  |     virtual const Value *invoke(const Activation *activation) const; | ||
|  | }; | ||
|  | 
 | ||
|  | class ArrayCtor: public Function | ||
|  | { | ||
|  | public: | ||
|  |     ArrayCtor(ValueOwner *valueOwner); | ||
|  | 
 | ||
|  |     virtual const Value *invoke(const Activation *activation) const; | ||
|  | }; | ||
|  | 
 | ||
|  | class StringCtor: public Function | ||
|  | { | ||
|  | public: | ||
|  |     StringCtor(ValueOwner *valueOwner); | ||
|  | 
 | ||
|  |     virtual const Value *invoke(const Activation *activation) const; | ||
|  | }; | ||
|  | 
 | ||
|  | class BooleanCtor: public Function | ||
|  | { | ||
|  | public: | ||
|  |     BooleanCtor(ValueOwner *valueOwner); | ||
|  | 
 | ||
|  |     virtual const Value *invoke(const Activation *activation) const; | ||
|  | }; | ||
|  | 
 | ||
|  | class NumberCtor: public Function | ||
|  | { | ||
|  | public: | ||
|  |     NumberCtor(ValueOwner *valueOwner); | ||
|  | 
 | ||
|  |     virtual const Value *invoke(const Activation *activation) const; | ||
|  | }; | ||
|  | 
 | ||
|  | class DateCtor: public Function | ||
|  | { | ||
|  | public: | ||
|  |     DateCtor(ValueOwner *valueOwner); | ||
|  | 
 | ||
|  |     virtual const Value *invoke(const Activation *activation) const; | ||
|  | }; | ||
|  | 
 | ||
|  | class RegExpCtor: public Function | ||
|  | { | ||
|  | public: | ||
|  |     RegExpCtor(ValueOwner *valueOwner); | ||
|  | 
 | ||
|  |     virtual const Value *invoke(const Activation *activation) const; | ||
|  | }; | ||
|  | 
 | ||
|  | ObjectCtor::ObjectCtor(ValueOwner *valueOwner) | ||
|  |     : Function(valueOwner) | ||
|  | { | ||
|  | } | ||
|  | 
 | ||
|  | FunctionCtor::FunctionCtor(ValueOwner *valueOwner) | ||
|  |     : Function(valueOwner) | ||
|  | { | ||
|  | } | ||
|  | 
 | ||
|  | ArrayCtor::ArrayCtor(ValueOwner *valueOwner) | ||
|  |     : Function(valueOwner) | ||
|  | { | ||
|  | } | ||
|  | 
 | ||
|  | StringCtor::StringCtor(ValueOwner *valueOwner) | ||
|  |     : Function(valueOwner) | ||
|  | { | ||
|  | } | ||
|  | 
 | ||
|  | BooleanCtor::BooleanCtor(ValueOwner *valueOwner) | ||
|  |     : Function(valueOwner) | ||
|  | { | ||
|  | } | ||
|  | 
 | ||
|  | NumberCtor::NumberCtor(ValueOwner *valueOwner) | ||
|  |     : Function(valueOwner) | ||
|  | { | ||
|  | } | ||
|  | 
 | ||
|  | DateCtor::DateCtor(ValueOwner *valueOwner) | ||
|  |     : Function(valueOwner) | ||
|  | { | ||
|  | } | ||
|  | 
 | ||
|  | RegExpCtor::RegExpCtor(ValueOwner *valueOwner) | ||
|  |     : Function(valueOwner) | ||
|  | { | ||
|  | } | ||
|  | 
 | ||
|  | const Value *ObjectCtor::invoke(const Activation *activation) const | ||
|  | { | ||
|  |     ObjectValue *thisObject = activation->thisObject(); | ||
|  |     if (activation->calledAsFunction()) | ||
|  |         thisObject = valueOwner()->newObject(); | ||
|  | 
 | ||
|  |     thisObject->setClassName("Object"); | ||
|  |     thisObject->setPrototype(valueOwner()->objectPrototype()); | ||
|  |     thisObject->setMember("length", valueOwner()->numberValue()); | ||
|  |     return thisObject; | ||
|  | } | ||
|  | 
 | ||
|  | const Value *FunctionCtor::invoke(const Activation *activation) const | ||
|  | { | ||
|  |     ObjectValue *thisObject = activation->thisObject(); | ||
|  |     if (activation->calledAsFunction()) | ||
|  |         thisObject = valueOwner()->newObject(); | ||
|  | 
 | ||
|  |     thisObject->setClassName("Function"); | ||
|  |     thisObject->setPrototype(valueOwner()->functionPrototype()); | ||
|  |     thisObject->setMember("length", valueOwner()->numberValue()); | ||
|  |     return thisObject; | ||
|  | } | ||
|  | 
 | ||
|  | const Value *ArrayCtor::invoke(const Activation *activation) const | ||
|  | { | ||
|  |     ObjectValue *thisObject = activation->thisObject(); | ||
|  |     if (activation->calledAsFunction()) | ||
|  |         thisObject = valueOwner()->newObject(); | ||
|  | 
 | ||
|  |     thisObject->setClassName("Array"); | ||
|  |     thisObject->setPrototype(valueOwner()->arrayPrototype()); | ||
|  |     thisObject->setMember("length", valueOwner()->numberValue()); | ||
|  |     return thisObject; | ||
|  | } | ||
|  | 
 | ||
|  | const Value *StringCtor::invoke(const Activation *activation) const | ||
|  | { | ||
|  |     if (activation->calledAsFunction()) | ||
|  |         return valueOwner()->convertToString(activation->thisObject()); | ||
|  | 
 | ||
|  |     ObjectValue *thisObject = activation->thisObject(); | ||
|  |     thisObject->setClassName("String"); | ||
|  |     thisObject->setPrototype(valueOwner()->stringPrototype()); | ||
|  |     thisObject->setMember("length", valueOwner()->numberValue()); | ||
|  |     return thisObject; | ||
|  | } | ||
|  | 
 | ||
|  | const Value *BooleanCtor::invoke(const Activation *activation) const | ||
|  | { | ||
|  |     if (activation->calledAsFunction()) | ||
|  |         return valueOwner()->convertToBoolean(activation->thisObject()); | ||
|  | 
 | ||
|  |     ObjectValue *thisObject = activation->thisObject(); | ||
|  |     thisObject->setClassName("Boolean"); | ||
|  |     thisObject->setPrototype(valueOwner()->booleanPrototype()); | ||
|  |     return thisObject; | ||
|  | } | ||
|  | 
 | ||
|  | const Value *NumberCtor::invoke(const Activation *activation) const | ||
|  | { | ||
|  |     if (activation->calledAsFunction()) | ||
|  |         return valueOwner()->convertToNumber(activation->thisObject()); | ||
|  | 
 | ||
|  |     ObjectValue *thisObject = activation->thisObject(); | ||
|  |     thisObject->setClassName("Number"); | ||
|  |     thisObject->setPrototype(valueOwner()->numberPrototype()); | ||
|  |     return thisObject; | ||
|  | } | ||
|  | 
 | ||
|  | const Value *DateCtor::invoke(const Activation *activation) const | ||
|  | { | ||
|  |     if (activation->calledAsFunction()) | ||
|  |         return valueOwner()->stringValue(); | ||
|  | 
 | ||
|  |     ObjectValue *thisObject = activation->thisObject(); | ||
|  |     thisObject->setClassName("Date"); | ||
|  |     thisObject->setPrototype(valueOwner()->datePrototype()); | ||
|  |     return thisObject; | ||
|  | } | ||
|  | 
 | ||
|  | const Value *RegExpCtor::invoke(const Activation *activation) const | ||
|  | { | ||
|  |     ObjectValue *thisObject = activation->thisObject(); | ||
|  |     if (activation->calledAsFunction()) | ||
|  |         thisObject = valueOwner()->newObject(); | ||
|  | 
 | ||
|  |     thisObject->setClassName("RegExp"); | ||
|  |     thisObject->setPrototype(valueOwner()->regexpPrototype()); | ||
|  |     thisObject->setMember("source", valueOwner()->stringValue()); | ||
|  |     thisObject->setMember("global", valueOwner()->booleanValue()); | ||
|  |     thisObject->setMember("ignoreCase", valueOwner()->booleanValue()); | ||
|  |     thisObject->setMember("multiline", valueOwner()->booleanValue()); | ||
|  |     thisObject->setMember("lastIndex", valueOwner()->numberValue()); | ||
|  |     return thisObject; | ||
|  | } | ||
|  | 
 | ||
|  | } // end of anonymous namespace
 | ||
|  | 
 | ||
|  | 
 | ||
|  | ValueOwner::ValueOwner() | ||
|  |     : _objectPrototype(0), | ||
|  |       _functionPrototype(0), | ||
|  |       _numberPrototype(0), | ||
|  |       _booleanPrototype(0), | ||
|  |       _stringPrototype(0), | ||
|  |       _arrayPrototype(0), | ||
|  |       _datePrototype(0), | ||
|  |       _regexpPrototype(0), | ||
|  |       _objectCtor(0), | ||
|  |       _functionCtor(0), | ||
|  |       _arrayCtor(0), | ||
|  |       _stringCtor(0), | ||
|  |       _booleanCtor(0), | ||
|  |       _numberCtor(0), | ||
|  |       _dateCtor(0), | ||
|  |       _regexpCtor(0), | ||
|  |       _globalObject(0), | ||
|  |       _mathObject(0), | ||
|  |       _qtObject(0), | ||
|  |       _qmlKeysObject(0), | ||
|  |       _qmlFontObject(0), | ||
|  |       _qmlPointObject(0), | ||
|  |       _qmlSizeObject(0), | ||
|  |       _qmlRectObject(0), | ||
|  |       _qmlVector3DObject(0), | ||
|  |       _convertToNumber(this), | ||
|  |       _convertToString(this), | ||
|  |       _convertToObject(this) | ||
|  | { | ||
|  |     initializePrototypes(); | ||
|  | } | ||
|  | 
 | ||
|  | ValueOwner::~ValueOwner() | ||
|  | { | ||
|  |     qDeleteAll(_registeredValues); | ||
|  | } | ||
|  | 
 | ||
|  | const NullValue *ValueOwner::nullValue() const | ||
|  | { | ||
|  |     return &_nullValue; | ||
|  | } | ||
|  | 
 | ||
|  | const UndefinedValue *ValueOwner::undefinedValue() const | ||
|  | { | ||
|  |     return &_undefinedValue; | ||
|  | } | ||
|  | 
 | ||
|  | const NumberValue *ValueOwner::numberValue() const | ||
|  | { | ||
|  |     return &_numberValue; | ||
|  | } | ||
|  | 
 | ||
|  | const RealValue *ValueOwner::realValue() const | ||
|  | { | ||
|  |     return &_realValue; | ||
|  | } | ||
|  | 
 | ||
|  | const IntValue *ValueOwner::intValue() const | ||
|  | { | ||
|  |     return &_intValue; | ||
|  | } | ||
|  | 
 | ||
|  | const BooleanValue *ValueOwner::booleanValue() const | ||
|  | { | ||
|  |     return &_booleanValue; | ||
|  | } | ||
|  | 
 | ||
|  | const StringValue *ValueOwner::stringValue() const | ||
|  | { | ||
|  |     return &_stringValue; | ||
|  | } | ||
|  | 
 | ||
|  | const UrlValue *ValueOwner::urlValue() const | ||
|  | { | ||
|  |     return &_urlValue; | ||
|  | } | ||
|  | 
 | ||
|  | const ColorValue *ValueOwner::colorValue() const | ||
|  | { | ||
|  |     return &_colorValue; | ||
|  | } | ||
|  | 
 | ||
|  | const AnchorLineValue *ValueOwner::anchorLineValue() const | ||
|  | { | ||
|  |     return &_anchorLineValue; | ||
|  | } | ||
|  | 
 | ||
|  | const Value *ValueOwner::newArray() | ||
|  | { | ||
|  |     return arrayCtor()->construct(); | ||
|  | } | ||
|  | 
 | ||
|  | ObjectValue *ValueOwner::newObject() | ||
|  | { | ||
|  |     return newObject(_objectPrototype); | ||
|  | } | ||
|  | 
 | ||
|  | ObjectValue *ValueOwner::newObject(const ObjectValue *prototype) | ||
|  | { | ||
|  |     ObjectValue *object = new ObjectValue(this); | ||
|  |     object->setPrototype(prototype); | ||
|  |     return object; | ||
|  | } | ||
|  | 
 | ||
|  | Function *ValueOwner::newFunction() | ||
|  | { | ||
|  |     Function *function = new Function(this); | ||
|  |     function->setPrototype(functionPrototype()); | ||
|  |     return function; | ||
|  | } | ||
|  | 
 | ||
|  | ObjectValue *ValueOwner::globalObject() const | ||
|  | { | ||
|  |     return _globalObject; | ||
|  | } | ||
|  | 
 | ||
|  | ObjectValue *ValueOwner::objectPrototype() const | ||
|  | { | ||
|  |     return _objectPrototype; | ||
|  | } | ||
|  | 
 | ||
|  | ObjectValue *ValueOwner::functionPrototype() const | ||
|  | { | ||
|  |     return _functionPrototype; | ||
|  | } | ||
|  | 
 | ||
|  | ObjectValue *ValueOwner::numberPrototype() const | ||
|  | { | ||
|  |     return _numberPrototype; | ||
|  | } | ||
|  | 
 | ||
|  | ObjectValue *ValueOwner::booleanPrototype() const | ||
|  | { | ||
|  |     return _booleanPrototype; | ||
|  | } | ||
|  | 
 | ||
|  | ObjectValue *ValueOwner::stringPrototype() const | ||
|  | { | ||
|  |     return _stringPrototype; | ||
|  | } | ||
|  | 
 | ||
|  | ObjectValue *ValueOwner::arrayPrototype() const | ||
|  | { | ||
|  |     return _arrayPrototype; | ||
|  | } | ||
|  | 
 | ||
|  | ObjectValue *ValueOwner::datePrototype() const | ||
|  | { | ||
|  |     return _datePrototype; | ||
|  | } | ||
|  | 
 | ||
|  | ObjectValue *ValueOwner::regexpPrototype() const | ||
|  | { | ||
|  |     return _regexpPrototype; | ||
|  | } | ||
|  | 
 | ||
|  | const FunctionValue *ValueOwner::objectCtor() const | ||
|  | { | ||
|  |     return _objectCtor; | ||
|  | } | ||
|  | 
 | ||
|  | const FunctionValue *ValueOwner::functionCtor() const | ||
|  | { | ||
|  |     return _functionCtor; | ||
|  | } | ||
|  | 
 | ||
|  | const FunctionValue *ValueOwner::arrayCtor() const | ||
|  | { | ||
|  |     return _arrayCtor; | ||
|  | } | ||
|  | 
 | ||
|  | const FunctionValue *ValueOwner::stringCtor() const | ||
|  | { | ||
|  |     return _stringCtor; | ||
|  | } | ||
|  | 
 | ||
|  | const FunctionValue *ValueOwner::booleanCtor() const | ||
|  | { | ||
|  |     return _booleanCtor; | ||
|  | } | ||
|  | 
 | ||
|  | const FunctionValue *ValueOwner::numberCtor() const | ||
|  | { | ||
|  |     return _numberCtor; | ||
|  | } | ||
|  | 
 | ||
|  | const FunctionValue *ValueOwner::dateCtor() const | ||
|  | { | ||
|  |     return _dateCtor; | ||
|  | } | ||
|  | 
 | ||
|  | const FunctionValue *ValueOwner::regexpCtor() const | ||
|  | { | ||
|  |     return _regexpCtor; | ||
|  | } | ||
|  | 
 | ||
|  | const ObjectValue *ValueOwner::mathObject() const | ||
|  | { | ||
|  |     return _mathObject; | ||
|  | } | ||
|  | 
 | ||
|  | const ObjectValue *ValueOwner::qtObject() const | ||
|  | { | ||
|  |     return _qtObject; | ||
|  | } | ||
|  | 
 | ||
|  | void ValueOwner::registerValue(Value *value) | ||
|  | { | ||
|  |     QMutexLocker locker(&_mutex); | ||
|  |     _registeredValues.append(value); | ||
|  | } | ||
|  | 
 | ||
|  | const Value *ValueOwner::convertToBoolean(const Value *value) | ||
|  | { | ||
|  |     return _convertToNumber(value);  // ### implement convert to bool
 | ||
|  | } | ||
|  | 
 | ||
|  | const Value *ValueOwner::convertToNumber(const Value *value) | ||
|  | { | ||
|  |     return _convertToNumber(value); | ||
|  | } | ||
|  | 
 | ||
|  | const Value *ValueOwner::convertToString(const Value *value) | ||
|  | { | ||
|  |     return _convertToString(value); | ||
|  | } | ||
|  | 
 | ||
|  | const Value *ValueOwner::convertToObject(const Value *value) | ||
|  | { | ||
|  |     return _convertToObject(value); | ||
|  | } | ||
|  | 
 | ||
|  | QString ValueOwner::typeId(const Value *value) | ||
|  | { | ||
|  |     return _typeId(value); | ||
|  | } | ||
|  | 
 | ||
|  | void ValueOwner::addFunction(ObjectValue *object, const QString &name, const Value *result, int argumentCount) | ||
|  | { | ||
|  |     Function *function = newFunction(); | ||
|  |     function->setReturnValue(result); | ||
|  |     for (int i = 0; i < argumentCount; ++i) | ||
|  |         function->addArgument(undefinedValue()); // ### introduce unknownValue
 | ||
|  |     object->setMember(name, function); | ||
|  | } | ||
|  | 
 | ||
|  | void ValueOwner::addFunction(ObjectValue *object, const QString &name, int argumentCount) | ||
|  | { | ||
|  |     Function *function = newFunction(); | ||
|  |     for (int i = 0; i < argumentCount; ++i) | ||
|  |         function->addArgument(undefinedValue()); // ### introduce unknownValue
 | ||
|  |     object->setMember(name, function); | ||
|  | } | ||
|  | 
 | ||
|  | void ValueOwner::initializePrototypes() | ||
|  | { | ||
|  |     _objectPrototype   = newObject(/*prototype = */ 0); | ||
|  |     _functionPrototype = newObject(_objectPrototype); | ||
|  |     _numberPrototype   = newObject(_objectPrototype); | ||
|  |     _booleanPrototype  = newObject(_objectPrototype); | ||
|  |     _stringPrototype   = newObject(_objectPrototype); | ||
|  |     _arrayPrototype    = newObject(_objectPrototype); | ||
|  |     _datePrototype     = newObject(_objectPrototype); | ||
|  |     _regexpPrototype   = newObject(_objectPrototype); | ||
|  | 
 | ||
|  |     // set up the Global object
 | ||
|  |     _globalObject = newObject(); | ||
|  |     _globalObject->setClassName("Global"); | ||
|  | 
 | ||
|  |     // set up the default Object prototype
 | ||
|  |     _objectCtor = new ObjectCtor(this); | ||
|  |     _objectCtor->setPrototype(_functionPrototype); | ||
|  |     _objectCtor->setMember("prototype", _objectPrototype); | ||
|  |     _objectCtor->setReturnValue(newObject()); | ||
|  | 
 | ||
|  |     _functionCtor = new FunctionCtor(this); | ||
|  |     _functionCtor->setPrototype(_functionPrototype); | ||
|  |     _functionCtor->setMember("prototype", _functionPrototype); | ||
|  |     _functionCtor->setReturnValue(newFunction()); | ||
|  | 
 | ||
|  |     _arrayCtor = new ArrayCtor(this); | ||
|  |     _arrayCtor->setPrototype(_functionPrototype); | ||
|  |     _arrayCtor->setMember("prototype", _arrayPrototype); | ||
|  |     _arrayCtor->setReturnValue(newArray()); | ||
|  | 
 | ||
|  |     _stringCtor = new StringCtor(this); | ||
|  |     _stringCtor->setPrototype(_functionPrototype); | ||
|  |     _stringCtor->setMember("prototype", _stringPrototype); | ||
|  |     _stringCtor->setReturnValue(stringValue()); | ||
|  | 
 | ||
|  |     _booleanCtor = new BooleanCtor(this); | ||
|  |     _booleanCtor->setPrototype(_functionPrototype); | ||
|  |     _booleanCtor->setMember("prototype", _booleanPrototype); | ||
|  |     _booleanCtor->setReturnValue(booleanValue()); | ||
|  | 
 | ||
|  |     _numberCtor = new NumberCtor(this); | ||
|  |     _numberCtor->setPrototype(_functionPrototype); | ||
|  |     _numberCtor->setMember("prototype", _numberPrototype); | ||
|  |     _numberCtor->setReturnValue(numberValue()); | ||
|  | 
 | ||
|  |     _dateCtor = new DateCtor(this); | ||
|  |     _dateCtor->setPrototype(_functionPrototype); | ||
|  |     _dateCtor->setMember("prototype", _datePrototype); | ||
|  |     _dateCtor->setReturnValue(_datePrototype); | ||
|  | 
 | ||
|  |     _regexpCtor = new RegExpCtor(this); | ||
|  |     _regexpCtor->setPrototype(_functionPrototype); | ||
|  |     _regexpCtor->setMember("prototype", _regexpPrototype); | ||
|  |     _regexpCtor->setReturnValue(_regexpPrototype); | ||
|  | 
 | ||
|  |     addFunction(_objectCtor, "getPrototypeOf", 1); | ||
|  |     addFunction(_objectCtor, "getOwnPropertyDescriptor", 2); | ||
|  |     addFunction(_objectCtor, "getOwnPropertyNames", newArray(), 1); | ||
|  |     addFunction(_objectCtor, "create", 1); | ||
|  |     addFunction(_objectCtor, "defineProperty", 3); | ||
|  |     addFunction(_objectCtor, "defineProperties", 2); | ||
|  |     addFunction(_objectCtor, "seal", 1); | ||
|  |     addFunction(_objectCtor, "freeze", 1); | ||
|  |     addFunction(_objectCtor, "preventExtensions", 1); | ||
|  |     addFunction(_objectCtor, "isSealed", booleanValue(), 1); | ||
|  |     addFunction(_objectCtor, "isFrozen", booleanValue(), 1); | ||
|  |     addFunction(_objectCtor, "isExtensible", booleanValue(), 1); | ||
|  |     addFunction(_objectCtor, "keys", newArray(), 1); | ||
|  | 
 | ||
|  |     addFunction(_objectPrototype, "toString", stringValue(), 0); | ||
|  |     addFunction(_objectPrototype, "toLocaleString", stringValue(), 0); | ||
|  |     addFunction(_objectPrototype, "valueOf", 0); // ### FIXME it should return thisObject
 | ||
|  |     addFunction(_objectPrototype, "hasOwnProperty", booleanValue(), 1); | ||
|  |     addFunction(_objectPrototype, "isPrototypeOf", booleanValue(), 1); | ||
|  |     addFunction(_objectPrototype, "propertyIsEnumerable", booleanValue(), 1); | ||
|  | 
 | ||
|  |     // set up the default Function prototype
 | ||
|  |     _functionPrototype->setMember("constructor", _functionCtor); | ||
|  |     addFunction(_functionPrototype, "toString", stringValue(), 0); | ||
|  |     addFunction(_functionPrototype, "apply", 2); | ||
|  |     addFunction(_functionPrototype, "call", 1); | ||
|  |     addFunction(_functionPrototype, "bind", 1); | ||
|  | 
 | ||
|  |     // set up the default Array prototype
 | ||
|  |     addFunction(_arrayCtor, "isArray", booleanValue(), 1); | ||
|  | 
 | ||
|  |     _arrayPrototype->setMember("constructor", _arrayCtor); | ||
|  |     addFunction(_arrayPrototype, "toString", stringValue(), 0); | ||
|  |     addFunction(_arrayPrototype, "toLocalString", stringValue(), 0); | ||
|  |     addFunction(_arrayPrototype, "concat", 0); | ||
|  |     addFunction(_arrayPrototype, "join", 1); | ||
|  |     addFunction(_arrayPrototype, "pop", 0); | ||
|  |     addFunction(_arrayPrototype, "push", 0); | ||
|  |     addFunction(_arrayPrototype, "reverse", 0); | ||
|  |     addFunction(_arrayPrototype, "shift", 0); | ||
|  |     addFunction(_arrayPrototype, "slice", 2); | ||
|  |     addFunction(_arrayPrototype, "sort", 1); | ||
|  |     addFunction(_arrayPrototype, "splice", 2); | ||
|  |     addFunction(_arrayPrototype, "unshift", 0); | ||
|  |     addFunction(_arrayPrototype, "indexOf", numberValue(), 1); | ||
|  |     addFunction(_arrayPrototype, "lastIndexOf", numberValue(), 1); | ||
|  |     addFunction(_arrayPrototype, "every", 1); | ||
|  |     addFunction(_arrayPrototype, "some", 1); | ||
|  |     addFunction(_arrayPrototype, "forEach", 1); | ||
|  |     addFunction(_arrayPrototype, "map", 1); | ||
|  |     addFunction(_arrayPrototype, "filter", 1); | ||
|  |     addFunction(_arrayPrototype, "reduce", 1); | ||
|  |     addFunction(_arrayPrototype, "reduceRight", 1); | ||
|  | 
 | ||
|  |     // set up the default String prototype
 | ||
|  |     addFunction(_stringCtor, "fromCharCode", stringValue(), 0); | ||
|  | 
 | ||
|  |     _stringPrototype->setMember("constructor", _stringCtor); | ||
|  |     addFunction(_stringPrototype, "toString", stringValue(), 0); | ||
|  |     addFunction(_stringPrototype, "valueOf", stringValue(), 0); | ||
|  |     addFunction(_stringPrototype, "charAt", stringValue(), 1); | ||
|  |     addFunction(_stringPrototype, "charCodeAt", stringValue(), 1); | ||
|  |     addFunction(_stringPrototype, "concat", stringValue(), 0); | ||
|  |     addFunction(_stringPrototype, "indexOf", numberValue(), 2); | ||
|  |     addFunction(_stringPrototype, "lastIndexOf", numberValue(), 2); | ||
|  |     addFunction(_stringPrototype, "localeCompare", booleanValue(), 1); | ||
|  |     addFunction(_stringPrototype, "match", newArray(), 1); | ||
|  |     addFunction(_stringPrototype, "replace", stringValue(), 2); | ||
|  |     addFunction(_stringPrototype, "search", numberValue(), 1); | ||
|  |     addFunction(_stringPrototype, "slice", stringValue(), 2); | ||
|  |     addFunction(_stringPrototype, "split", newArray(), 1); | ||
|  |     addFunction(_stringPrototype, "substring", stringValue(), 2); | ||
|  |     addFunction(_stringPrototype, "toLowerCase", stringValue(), 0); | ||
|  |     addFunction(_stringPrototype, "toLocaleLowerCase", stringValue(), 0); | ||
|  |     addFunction(_stringPrototype, "toUpperCase", stringValue(), 0); | ||
|  |     addFunction(_stringPrototype, "toLocaleUpperCase", stringValue(), 0); | ||
|  |     addFunction(_stringPrototype, "trim", stringValue(), 0); | ||
|  | 
 | ||
|  |     // set up the default Boolean prototype
 | ||
|  |     addFunction(_booleanCtor, "fromCharCode", 0); | ||
|  | 
 | ||
|  |     _booleanPrototype->setMember("constructor", _booleanCtor); | ||
|  |     addFunction(_booleanPrototype, "toString", stringValue(), 0); | ||
|  |     addFunction(_booleanPrototype, "valueOf", booleanValue(), 0); | ||
|  | 
 | ||
|  |     // set up the default Number prototype
 | ||
|  |     _numberCtor->setMember("MAX_VALUE", numberValue()); | ||
|  |     _numberCtor->setMember("MIN_VALUE", numberValue()); | ||
|  |     _numberCtor->setMember("NaN", numberValue()); | ||
|  |     _numberCtor->setMember("NEGATIVE_INFINITY", numberValue()); | ||
|  |     _numberCtor->setMember("POSITIVE_INFINITY", numberValue()); | ||
|  | 
 | ||
|  |     addFunction(_numberCtor, "fromCharCode", 0); | ||
|  | 
 | ||
|  |     _numberPrototype->setMember("constructor", _numberCtor); | ||
|  |     addFunction(_numberPrototype, "toString", stringValue(), 0); | ||
|  |     addFunction(_numberPrototype, "toLocaleString", stringValue(), 0); | ||
|  |     addFunction(_numberPrototype, "valueOf", numberValue(), 0); | ||
|  |     addFunction(_numberPrototype, "toFixed", numberValue(), 1); | ||
|  |     addFunction(_numberPrototype, "toExponential", numberValue(), 1); | ||
|  |     addFunction(_numberPrototype, "toPrecision", numberValue(), 1); | ||
|  | 
 | ||
|  |     // set up the Math object
 | ||
|  |     _mathObject = newObject(); | ||
|  |     _mathObject->setMember("E", numberValue()); | ||
|  |     _mathObject->setMember("LN10", numberValue()); | ||
|  |     _mathObject->setMember("LN2", numberValue()); | ||
|  |     _mathObject->setMember("LOG2E", numberValue()); | ||
|  |     _mathObject->setMember("LOG10E", numberValue()); | ||
|  |     _mathObject->setMember("PI", numberValue()); | ||
|  |     _mathObject->setMember("SQRT1_2", numberValue()); | ||
|  |     _mathObject->setMember("SQRT2", numberValue()); | ||
|  | 
 | ||
|  |     addFunction(_mathObject, "abs", numberValue(), 1); | ||
|  |     addFunction(_mathObject, "acos", numberValue(), 1); | ||
|  |     addFunction(_mathObject, "asin", numberValue(), 1); | ||
|  |     addFunction(_mathObject, "atan", numberValue(), 1); | ||
|  |     addFunction(_mathObject, "atan2", numberValue(), 2); | ||
|  |     addFunction(_mathObject, "ceil", numberValue(), 1); | ||
|  |     addFunction(_mathObject, "cos", numberValue(), 1); | ||
|  |     addFunction(_mathObject, "exp", numberValue(), 1); | ||
|  |     addFunction(_mathObject, "floor", numberValue(), 1); | ||
|  |     addFunction(_mathObject, "log", numberValue(), 1); | ||
|  |     addFunction(_mathObject, "max", numberValue(), 0); | ||
|  |     addFunction(_mathObject, "min", numberValue(), 0); | ||
|  |     addFunction(_mathObject, "pow", numberValue(), 2); | ||
|  |     addFunction(_mathObject, "random", numberValue(), 1); | ||
|  |     addFunction(_mathObject, "round", numberValue(), 1); | ||
|  |     addFunction(_mathObject, "sin", numberValue(), 1); | ||
|  |     addFunction(_mathObject, "sqrt", numberValue(), 1); | ||
|  |     addFunction(_mathObject, "tan", numberValue(), 1); | ||
|  | 
 | ||
|  |     // set up the default Boolean prototype
 | ||
|  |     addFunction(_dateCtor, "parse", numberValue(), 1); | ||
|  |     addFunction(_dateCtor, "now", numberValue(), 0); | ||
|  | 
 | ||
|  |     _datePrototype->setMember("constructor", _dateCtor); | ||
|  |     addFunction(_datePrototype, "toString", stringValue(), 0); | ||
|  |     addFunction(_datePrototype, "toDateString", stringValue(), 0); | ||
|  |     addFunction(_datePrototype, "toTimeString", stringValue(), 0); | ||
|  |     addFunction(_datePrototype, "toLocaleString", stringValue(), 0); | ||
|  |     addFunction(_datePrototype, "toLocaleDateString", stringValue(), 0); | ||
|  |     addFunction(_datePrototype, "toLocaleTimeString", stringValue(), 0); | ||
|  |     addFunction(_datePrototype, "valueOf", numberValue(), 0); | ||
|  |     addFunction(_datePrototype, "getTime", numberValue(), 0); | ||
|  |     addFunction(_datePrototype, "getFullYear", numberValue(), 0); | ||
|  |     addFunction(_datePrototype, "getUTCFullYear", numberValue(), 0); | ||
|  |     addFunction(_datePrototype, "getMonth", numberValue(), 0); | ||
|  |     addFunction(_datePrototype, "getUTCMonth", numberValue(), 0); | ||
|  |     addFunction(_datePrototype, "getDate", numberValue(), 0); | ||
|  |     addFunction(_datePrototype, "getUTCDate", numberValue(), 0); | ||
|  |     addFunction(_datePrototype, "getHours", numberValue(), 0); | ||
|  |     addFunction(_datePrototype, "getUTCHours", numberValue(), 0); | ||
|  |     addFunction(_datePrototype, "getMinutes", numberValue(), 0); | ||
|  |     addFunction(_datePrototype, "getUTCMinutes", numberValue(), 0); | ||
|  |     addFunction(_datePrototype, "getSeconds", numberValue(), 0); | ||
|  |     addFunction(_datePrototype, "getUTCSeconds", numberValue(), 0); | ||
|  |     addFunction(_datePrototype, "getMilliseconds", numberValue(), 0); | ||
|  |     addFunction(_datePrototype, "getUTCMilliseconds", numberValue(), 0); | ||
|  |     addFunction(_datePrototype, "getTimezoneOffset", numberValue(), 0); | ||
|  |     addFunction(_datePrototype, "setTime", 1); | ||
|  |     addFunction(_datePrototype, "setMilliseconds", 1); | ||
|  |     addFunction(_datePrototype, "setUTCMilliseconds", 1); | ||
|  |     addFunction(_datePrototype, "setSeconds", 1); | ||
|  |     addFunction(_datePrototype, "setUTCSeconds", 1); | ||
|  |     addFunction(_datePrototype, "setMinutes", 1); | ||
|  |     addFunction(_datePrototype, "setUTCMinutes", 1); | ||
|  |     addFunction(_datePrototype, "setHours", 1); | ||
|  |     addFunction(_datePrototype, "setUTCHours", 1); | ||
|  |     addFunction(_datePrototype, "setDate", 1); | ||
|  |     addFunction(_datePrototype, "setUTCDate", 1); | ||
|  |     addFunction(_datePrototype, "setMonth", 1); | ||
|  |     addFunction(_datePrototype, "setUTCMonth", 1); | ||
|  |     addFunction(_datePrototype, "setFullYear", 1); | ||
|  |     addFunction(_datePrototype, "setUTCFullYear", 1); | ||
|  |     addFunction(_datePrototype, "toUTCString", stringValue(), 0); | ||
|  |     addFunction(_datePrototype, "toISOString", stringValue(), 0); | ||
|  |     addFunction(_datePrototype, "toJSON", stringValue(), 1); | ||
|  | 
 | ||
|  |     // set up the default Boolean prototype
 | ||
|  |     _regexpPrototype->setMember("constructor", _regexpCtor); | ||
|  |     addFunction(_regexpPrototype, "exec", newArray(), 1); | ||
|  |     addFunction(_regexpPrototype, "test", booleanValue(), 1); | ||
|  |     addFunction(_regexpPrototype, "toString", stringValue(), 0); | ||
|  | 
 | ||
|  |     // fill the Global object
 | ||
|  |     _globalObject->setMember("Math", _mathObject); | ||
|  |     _globalObject->setMember("Object", objectCtor()); | ||
|  |     _globalObject->setMember("Function", functionCtor()); | ||
|  |     _globalObject->setMember("Array", arrayCtor()); | ||
|  |     _globalObject->setMember("String", stringCtor()); | ||
|  |     _globalObject->setMember("Boolean", booleanCtor()); | ||
|  |     _globalObject->setMember("Number", numberCtor()); | ||
|  |     _globalObject->setMember("Date", dateCtor()); | ||
|  |     _globalObject->setMember("RegExp", regexpCtor()); | ||
|  | 
 | ||
|  | 
 | ||
|  |     // global Qt object, in alphabetic order
 | ||
|  |     _qtObject = newObject(/*prototype */ 0); | ||
|  |     addFunction(_qtObject, QLatin1String("atob"), 1); | ||
|  |     addFunction(_qtObject, QLatin1String("btoa"), 1); | ||
|  |     addFunction(_qtObject, QLatin1String("createComponent"), 1); | ||
|  |     addFunction(_qtObject, QLatin1String("createQmlObject"), 3); | ||
|  |     addFunction(_qtObject, QLatin1String("darker"), 1); | ||
|  |     addFunction(_qtObject, QLatin1String("fontFamilies"), 0); | ||
|  |     addFunction(_qtObject, QLatin1String("formatDate"), 2); | ||
|  |     addFunction(_qtObject, QLatin1String("formatDateTime"), 2); | ||
|  |     addFunction(_qtObject, QLatin1String("formatTime"), 2); | ||
|  |     addFunction(_qtObject, QLatin1String("hsla"), 4); | ||
|  |     addFunction(_qtObject, QLatin1String("include"), 2); | ||
|  |     addFunction(_qtObject, QLatin1String("isQtObject"), 1); | ||
|  |     addFunction(_qtObject, QLatin1String("lighter"), 1); | ||
|  |     addFunction(_qtObject, QLatin1String("md5"), 1); | ||
|  |     addFunction(_qtObject, QLatin1String("openUrlExternally"), 1); | ||
|  |     addFunction(_qtObject, QLatin1String("point"), 2); | ||
|  |     addFunction(_qtObject, QLatin1String("quit"), 0); | ||
|  |     addFunction(_qtObject, QLatin1String("rect"), 4); | ||
|  |     addFunction(_qtObject, QLatin1String("resolvedUrl"), 1); | ||
|  |     addFunction(_qtObject, QLatin1String("rgba"), 4); | ||
|  |     addFunction(_qtObject, QLatin1String("size"), 2); | ||
|  |     addFunction(_qtObject, QLatin1String("tint"), 2); | ||
|  |     addFunction(_qtObject, QLatin1String("vector3d"), 3); | ||
|  |     _globalObject->setMember(QLatin1String("Qt"), _qtObject); | ||
|  | 
 | ||
|  |     // firebug/webkit compat
 | ||
|  |     ObjectValue *consoleObject = newObject(/*prototype */ 0); | ||
|  |     addFunction(consoleObject, QLatin1String("log"), 1); | ||
|  |     addFunction(consoleObject, QLatin1String("debug"), 1); | ||
|  |     _globalObject->setMember(QLatin1String("console"), consoleObject); | ||
|  | 
 | ||
|  |     // translation functions
 | ||
|  |     addFunction(_globalObject, QLatin1String("qsTr"), 3); | ||
|  |     addFunction(_globalObject, QLatin1String("QT_TR_NOOP"), 1); | ||
|  |     addFunction(_globalObject, QLatin1String("qsTranslate"), 5); | ||
|  |     addFunction(_globalObject, QLatin1String("QT_TRANSLATE_NOOP"), 2); | ||
|  |     addFunction(_globalObject, QLatin1String("qsTrId"), 2); | ||
|  |     addFunction(_globalObject, QLatin1String("QT_TRID_NOOP"), 1); | ||
|  | 
 | ||
|  |     // QML objects
 | ||
|  |     _qmlFontObject = newObject(/*prototype =*/ 0); | ||
|  |     _qmlFontObject->setClassName(QLatin1String("Font")); | ||
|  |     _qmlFontObject->setMember("family", stringValue()); | ||
|  |     _qmlFontObject->setMember("weight", undefinedValue()); // ### make me an object
 | ||
|  |     _qmlFontObject->setMember("capitalization", undefinedValue()); // ### make me an object
 | ||
|  |     _qmlFontObject->setMember("bold", booleanValue()); | ||
|  |     _qmlFontObject->setMember("italic", booleanValue()); | ||
|  |     _qmlFontObject->setMember("underline", booleanValue()); | ||
|  |     _qmlFontObject->setMember("overline", booleanValue()); | ||
|  |     _qmlFontObject->setMember("strikeout", booleanValue()); | ||
|  |     _qmlFontObject->setMember("pointSize", intValue()); | ||
|  |     _qmlFontObject->setMember("pixelSize", intValue()); | ||
|  |     _qmlFontObject->setMember("letterSpacing", realValue()); | ||
|  |     _qmlFontObject->setMember("wordSpacing", realValue()); | ||
|  | 
 | ||
|  |     _qmlPointObject = newObject(/*prototype =*/ 0); | ||
|  |     _qmlPointObject->setClassName(QLatin1String("Point")); | ||
|  |     _qmlPointObject->setMember("x", numberValue()); | ||
|  |     _qmlPointObject->setMember("y", numberValue()); | ||
|  | 
 | ||
|  |     _qmlSizeObject = newObject(/*prototype =*/ 0); | ||
|  |     _qmlSizeObject->setClassName(QLatin1String("Size")); | ||
|  |     _qmlSizeObject->setMember("width", numberValue()); | ||
|  |     _qmlSizeObject->setMember("height", numberValue()); | ||
|  | 
 | ||
|  |     _qmlRectObject = newObject(/*prototype =*/ 0); | ||
|  |     _qmlRectObject->setClassName("Rect"); | ||
|  |     _qmlRectObject->setMember("x", numberValue()); | ||
|  |     _qmlRectObject->setMember("y", numberValue()); | ||
|  |     _qmlRectObject->setMember("width", numberValue()); | ||
|  |     _qmlRectObject->setMember("height", numberValue()); | ||
|  | 
 | ||
|  |     _qmlVector3DObject = newObject(/*prototype =*/ 0); | ||
|  |     _qmlVector3DObject->setClassName(QLatin1String("Vector3D")); | ||
|  |     _qmlVector3DObject->setMember("x", realValue()); | ||
|  |     _qmlVector3DObject->setMember("y", realValue()); | ||
|  |     _qmlVector3DObject->setMember("z", realValue()); | ||
|  | } | ||
|  | 
 | ||
|  | const ObjectValue *ValueOwner::qmlKeysObject() | ||
|  | { | ||
|  |     return _qmlKeysObject; | ||
|  | } | ||
|  | 
 | ||
|  | const ObjectValue *ValueOwner::qmlFontObject() | ||
|  | { | ||
|  |     return _qmlFontObject; | ||
|  | } | ||
|  | 
 | ||
|  | const ObjectValue *ValueOwner::qmlPointObject() | ||
|  | { | ||
|  |     return _qmlPointObject; | ||
|  | } | ||
|  | 
 | ||
|  | const ObjectValue *ValueOwner::qmlSizeObject() | ||
|  | { | ||
|  |     return _qmlSizeObject; | ||
|  | } | ||
|  | 
 | ||
|  | const ObjectValue *ValueOwner::qmlRectObject() | ||
|  | { | ||
|  |     return _qmlRectObject; | ||
|  | } | ||
|  | 
 | ||
|  | const ObjectValue *ValueOwner::qmlVector3DObject() | ||
|  | { | ||
|  |     return _qmlVector3DObject; | ||
|  | } | ||
|  | 
 | ||
|  | const Value *ValueOwner::defaultValueForBuiltinType(const QString &typeName) const | ||
|  | { | ||
|  |     if (typeName == QLatin1String("string")) | ||
|  |         return stringValue(); | ||
|  |     else if (typeName == QLatin1String("url")) | ||
|  |         return urlValue(); | ||
|  |     else if (typeName == QLatin1String("bool")) | ||
|  |         return booleanValue(); | ||
|  |     else if (typeName == QLatin1String("int")) | ||
|  |         return intValue(); | ||
|  |     else if (typeName == QLatin1String("real")) | ||
|  |         return realValue(); | ||
|  |     else if (typeName == QLatin1String("color")) | ||
|  |         return colorValue(); | ||
|  |     // ### more types...
 | ||
|  | 
 | ||
|  |     return undefinedValue(); | ||
|  | } |