aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@digia.com>2013-04-12 17:26:44 +0200
committerSimon Hausmann <simon.hausmann@digia.com>2013-04-14 07:07:32 +0200
commit802fe16471828bb52c4e8106d09e6191bd975db3 (patch)
treec784feaed60ab033f65e311cb4f064a74daff6be /src
parentcaddc2a7b4f0b6433462d2b4660a2d9ac26585fd (diff)
Move the lookup class into it's own file
Change-Id: Id57b23ebd6de4579f8e425bd2964b1249fb327c1 Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
Diffstat (limited to 'src')
-rw-r--r--src/v4/qv4functionobject.h64
-rw-r--r--src/v4/qv4isel_masm.cpp1
-rw-r--r--src/v4/qv4lookup.cpp73
-rw-r--r--src/v4/qv4lookup.h126
-rw-r--r--src/v4/qv4runtime.cpp19
-rw-r--r--src/v4/v4.pro2
6 files changed, 205 insertions, 80 deletions
diff --git a/src/v4/qv4functionobject.h b/src/v4/qv4functionobject.h
index 4ef9db196c..4dddc048f9 100644
--- a/src/v4/qv4functionobject.h
+++ b/src/v4/qv4functionobject.h
@@ -101,69 +101,7 @@ struct SyntaxErrorPrototype;
struct TypeErrorPrototype;
struct URIErrorPrototype;
struct InternalClass;
-
-struct Lookup {
- enum { Size = 4 };
- InternalClass *classList[Size];
- int level;
- uint index;
- String *name;
-
- Property *lookup(Object *obj, PropertyAttributes *attrs) {
- int i = 0;
- while (i < level && obj && obj->internalClass == classList[i]) {
- obj = obj->prototype;
- ++i;
- }
-
- if (index != UINT_MAX && obj->internalClass == classList[i]) {
- *attrs = obj->internalClass->propertyData.at(index);
- return obj->memberData + index;
- }
-
- while (i < Size && obj) {
- classList[i] = obj->internalClass;
-
- index = obj->internalClass->find(name);
- if (index != UINT_MAX) {
- level = i;
- *attrs = obj->internalClass->propertyData.at(index);
- return obj->memberData + index;
- }
-
- obj = obj->prototype;
- ++i;
- }
- level = i;
-
- while (obj) {
- index = obj->internalClass->find(name);
- if (index != UINT_MAX) {
- *attrs = obj->internalClass->propertyData.at(index);
- return obj->memberData + index;
- }
-
- obj = obj->prototype;
- }
- return 0;
- }
-
- Property *setterLookup(Object *o, PropertyAttributes *attrs) {
- if (o->internalClass == classList[0]) {
- *attrs = o->internalClass->propertyData[index];
- return o->memberData + index;
- }
-
- uint idx = o->internalClass->find(name);
- if (idx != UINT_MAX) {
- classList[0] = o->internalClass;
- index = idx;
- *attrs = o->internalClass->propertyData[index];
- return o->memberData + index;
- }
- return 0;
- }
-};
+struct Lookup;
struct Function {
String *name;
diff --git a/src/v4/qv4isel_masm.cpp b/src/v4/qv4isel_masm.cpp
index 45e9450187..9205eac41a 100644
--- a/src/v4/qv4isel_masm.cpp
+++ b/src/v4/qv4isel_masm.cpp
@@ -45,6 +45,7 @@
#include "qv4functionobject.h"
#include "qv4regexpobject.h"
#include "qv4unwindhelper.h"
+#include "qv4lookup.h"
#include <assembler/LinkBuffer.h>
#include <WTFStubs.h>
diff --git a/src/v4/qv4lookup.cpp b/src/v4/qv4lookup.cpp
new file mode 100644
index 0000000000..5e00a82522
--- /dev/null
+++ b/src/v4/qv4lookup.cpp
@@ -0,0 +1,73 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the V4VM module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, 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, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.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 the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "qv4lookup.h"
+
+QT_BEGIN_NAMESPACE
+
+namespace QQmlJS {
+namespace VM {
+
+void QQmlJS::VM::Lookup::lookupName(QQmlJS::VM::Lookup *l, ExecutionContext *ctx, QQmlJS::VM::Value *result, const QQmlJS::VM::Value &object)
+{
+ Value res;
+ if (Object *o = object.asObject()) {
+ PropertyAttributes attrs;
+ Property *p = l->lookup(o, &attrs);
+ if (p)
+ res = attrs.isData() ? p->value : o->getValue(ctx, p, attrs);
+ else
+ res = Value::undefinedValue();
+ } else {
+ if (Managed *m = object.asManaged()) {
+ res = m->get(ctx, l->name);
+ } else {
+ o = __qmljs_convert_to_object(ctx, object);
+ res = o->get(ctx, l->name);
+ }
+ }
+ if (result)
+ *result = res;
+}
+
+}
+}
+
+QT_END_NAMESPACE
diff --git a/src/v4/qv4lookup.h b/src/v4/qv4lookup.h
new file mode 100644
index 0000000000..d670d8e550
--- /dev/null
+++ b/src/v4/qv4lookup.h
@@ -0,0 +1,126 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the V4VM module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, 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, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.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 the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#ifndef QV4LOOKUP_H
+#define QV4LOOKUP_H
+
+#include "qv4global.h"
+#include "qv4runtime.h"
+#include "qv4engine.h"
+#include "qv4context.h"
+#include "qv4object.h"
+#include "qv4internalclass.h"
+
+QT_BEGIN_NAMESPACE
+
+namespace QQmlJS {
+namespace VM {
+
+struct Lookup {
+ enum { Size = 4 };
+ InternalClass *classList[Size];
+ int level;
+ uint index;
+ String *name;
+
+ static void lookupName(Lookup *l, ExecutionContext *ctx, Value *result, const Value &object);
+
+ Property *lookup(Object *obj, PropertyAttributes *attrs) {
+ int i = 0;
+ while (i < level && obj && obj->internalClass == classList[i]) {
+ obj = obj->prototype;
+ ++i;
+ }
+
+ if (index != UINT_MAX && obj->internalClass == classList[i]) {
+ *attrs = obj->internalClass->propertyData.at(index);
+ return obj->memberData + index;
+ }
+
+ while (i < Size && obj) {
+ classList[i] = obj->internalClass;
+
+ index = obj->internalClass->find(name);
+ if (index != UINT_MAX) {
+ level = i;
+ *attrs = obj->internalClass->propertyData.at(index);
+ return obj->memberData + index;
+ }
+
+ obj = obj->prototype;
+ ++i;
+ }
+ level = i;
+
+ while (obj) {
+ index = obj->internalClass->find(name);
+ if (index != UINT_MAX) {
+ *attrs = obj->internalClass->propertyData.at(index);
+ return obj->memberData + index;
+ }
+
+ obj = obj->prototype;
+ }
+ return 0;
+ }
+
+ Property *setterLookup(Object *o, PropertyAttributes *attrs) {
+ if (o->internalClass == classList[0]) {
+ *attrs = o->internalClass->propertyData[index];
+ return o->memberData + index;
+ }
+
+ uint idx = o->internalClass->find(name);
+ if (idx != UINT_MAX) {
+ classList[0] = o->internalClass;
+ index = idx;
+ *attrs = o->internalClass->propertyData[index];
+ return o->memberData + index;
+ }
+ return 0;
+ }
+};
+
+}
+}
+
+QT_END_NAMESPACE
+
+#endif
diff --git a/src/v4/qv4runtime.cpp b/src/v4/qv4runtime.cpp
index 6f1e1c9c89..edec0a293e 100644
--- a/src/v4/qv4runtime.cpp
+++ b/src/v4/qv4runtime.cpp
@@ -47,6 +47,7 @@
#include "qv4objectproto.h"
#include "qv4globalobject.h"
#include "qv4stringobject.h"
+#include "qv4lookup.h"
#include "private/qlocale_tools_p.h"
#include <QtCore/qmath.h>
@@ -724,23 +725,7 @@ void __qmljs_get_property_lookup(ExecutionContext *ctx, Value *result, const Val
{
Value res;
Lookup *l = ctx->lookups + lookupIndex;
- if (Object *o = object.asObject()) {
- PropertyAttributes attrs;
- Property *p = l->lookup(o, &attrs);
- if (p)
- res = attrs.isData() ? p->value : o->getValue(ctx, p, attrs);
- else
- res = Value::undefinedValue();
- } else {
- if (Managed *m = object.asManaged()) {
- res = m->get(ctx, l->name);
- } else {
- o = __qmljs_convert_to_object(ctx, object);
- res = o->get(ctx, l->name);
- }
- }
- if (result)
- *result = res;
+ l->lookupName(l, ctx, result, object);
}
void __qmljs_set_property_lookup(ExecutionContext *ctx, const Value &object, int lookupIndex, const Value &value)
diff --git a/src/v4/v4.pro b/src/v4/v4.pro
index 7f5e3e5071..325a1013b1 100644
--- a/src/v4/v4.pro
+++ b/src/v4/v4.pro
@@ -27,6 +27,7 @@ SOURCES += \
llvm_runtime.cpp \
qv4isel_p.cpp \
debugging.cpp \
+ qv4lookup.cpp \
qv4mm.cpp \
qv4managed.cpp \
qv4internalclass.cpp \
@@ -66,6 +67,7 @@ HEADERS += \
qv4isel_p.h \
qv4isel_util_p.h \
debugging.h \
+ qv4lookup.h \
qv4identifier.h \
qv4mm.h \
qv4managed.h \