📄 qscriptecmaobject.cpp
字号:
/******************************************************************************** Copyright (C) 1992-2007 Trolltech ASA. All rights reserved.**** This file is part of the QtScript module of the Qt Toolkit.**** This file may be used under the terms of the GNU General Public** License version 2.0 as published by the Free Software Foundation** and appearing in the file LICENSE.GPL included in the packaging of** this file. Please review the following information to ensure GNU** General Public Licensing requirements will be met:** http://trolltech.com/products/qt/licenses/licensing/opensource/**** If you are unsure which license is appropriate for your use, please** review the following information:** http://trolltech.com/products/qt/licenses/licensing/licensingoverview** or contact the sales department at sales@trolltech.com.**** In addition, as a special exception, Trolltech gives you certain** additional rights. These rights are described in the Trolltech GPL** Exception version 1.0, which can be found at** http://www.trolltech.com/products/qt/gplexception/ and in the file** GPL_EXCEPTION.txt in this package.**** In addition, as a special exception, Trolltech, as the sole copyright** holder for Qt Designer, grants users of the Qt/Eclipse Integration** plug-in the right for the Qt/Eclipse Integration to link to** functionality provided by Qt Designer and its related libraries.**** Trolltech reserves all rights not expressly granted herein.**** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.******************************************************************************/#include "qscriptecmaobject_p.h"#ifndef QT_NO_SCRIPT#include "qscriptengine_p.h"#include "qscriptvalueimpl_p.h"#include "qscriptcontext_p.h"#include "qscriptmember_p.h"#include "qscriptobject_p.h"#include <QtCore/QtDebug>namespace QScript { namespace Ecma {Object::Object(QScriptEnginePrivate *eng, QScriptClassInfo *classInfo): Core(eng), m_classInfo(classInfo){ newObject(&publicPrototype, eng->nullValue());}Object::~Object(){}void Object::initialize(){ QScriptEnginePrivate *eng = engine(); eng->newConstructor(&ctor, this, publicPrototype); const QScriptValue::PropertyFlags flags = QScriptValue::SkipInEnumeration; publicPrototype.setProperty(QLatin1String("toString"), eng->createFunction(method_toString, 1, m_classInfo), flags); publicPrototype.setProperty(QLatin1String("toLocaleString"), eng->createFunction(method_toLocaleString, 1, m_classInfo), flags); publicPrototype.setProperty(QLatin1String("valueOf"), eng->createFunction(method_valueOf, 0, m_classInfo), flags); publicPrototype.setProperty(QLatin1String("hasOwnProperty"), eng->createFunction(method_hasOwnProperty, 1, m_classInfo), flags); publicPrototype.setProperty(QLatin1String("isPrototypeOf"), eng->createFunction(method_isPrototypeOf, 1, m_classInfo), flags); publicPrototype.setProperty(QLatin1String("propertyIsEnumerable"), eng->createFunction(method_propertyIsEnumerable, 1, m_classInfo), flags); publicPrototype.setProperty(QLatin1String("__defineGetter__"), eng->createFunction(method_defineGetter, 2, m_classInfo), flags); publicPrototype.setProperty(QLatin1String("__defineSetter__"), eng->createFunction(method_defineSetter, 2, m_classInfo), flags);}void Object::execute(QScriptContextPrivate *context){ QScriptValueImpl value; if (context->argumentCount() > 0) value = context->argument(0).toObject(); else value.invalidate(); if (! value.isValid()) newObject(&value); context->setReturnValue(value);}void Object::newObject(QScriptValueImpl *result, const QScriptValueImpl &proto){ engine()->newObject(result, proto, classInfo());}QScriptValueImpl Object::method_toString(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *){ QScriptValueImpl glo = eng->globalObject(); QString s = QLatin1String("[object "); QScriptValueImpl self = context->thisObject(); if (self.objectValue() == glo.objectValue()) s += QLatin1String("global"); else s += self.classInfo()->name(); s += QLatin1String("]"); return (QScriptValueImpl(eng, s));}QScriptValueImpl Object::method_toLocaleString(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo){ return method_toString(context, eng, classInfo);}QScriptValueImpl Object::method_valueOf(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *){ return (context->thisObject());}QScriptValueImpl Object::method_hasOwnProperty(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *){ bool result = false; if (context->thisObject().isObject() && (context->argumentCount() > 0)) { QScriptValueImpl arg = context->argument(0); QScriptNameIdImpl *id = 0; if (arg.isString()) id = arg.stringValue(); if (! id || ! id->unique) { QString str = arg.toString(); id = eng->nameId(str); } QScript::Member member; QScriptValueImpl base; QScriptValueImpl self = context->thisObject(); if (self.resolve(id, &member, &base, QScriptValue::ResolveLocal)) result = true; } return (QScriptValueImpl(eng, result));}QScriptValueImpl Object::method_isPrototypeOf(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *){ bool result = false; if (context->thisObject().isObject() && (context->argumentCount() > 0)) { QScriptValueImpl arg = context->argument(0); if (arg.isObject()) { QScriptValueImpl proto = arg.prototype(); if (proto.isObject()) { QScriptValueImpl self = context->thisObject(); result = self.objectValue() == proto.objectValue(); } } } return (QScriptValueImpl(eng, result));}QScriptValueImpl Object::method_propertyIsEnumerable(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *){ bool result = false; if (context->thisObject().isObject() && (context->argumentCount() > 0)) { QScriptValueImpl arg = context->argument(0); QScriptNameIdImpl *id = 0; if (arg.isString()) id = arg.stringValue(); if (! id || ! id->unique) { QString str = arg.toString(); id = eng->nameId(str); } QScript::Member member; QScriptValueImpl base; QScriptValueImpl self = context->thisObject(); if (self.resolve(id, &member, &base, QScriptValue::ResolveLocal)) { result = ! member.dontEnum(); if (result) { QScriptValueImpl tmp; base.get(member, &tmp); result = tmp.isValid(); } } } return (QScriptValueImpl(eng, result));}QScriptValueImpl Object::method_defineGetter(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *){ QString propertyName = context->argument(0).toString(); QScriptValueImpl getter = context->argument(1); if (!getter.isFunction()) return context->throwError(QLatin1String("getter must be a function")); context->thisObject().setProperty(propertyName, getter, QScriptValue::PropertyGetter); return eng->undefinedValue();}QScriptValueImpl Object::method_defineSetter(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *){ QString propertyName = context->argument(0).toString(); QScriptValueImpl setter = context->argument(1); if (!setter.isFunction()) return context->throwError(QLatin1String("setter must be a function")); context->thisObject().setProperty(propertyName, setter, QScriptValue::PropertySetter); return eng->undefinedValue();}} } // namespace QScript::Ecma#endif // QT_NO_SCRIPT
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -