aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRobin Burchell <robin.burchell@crimson.no>2017-02-09 00:42:30 +0100
committerRobin Burchell <robin.burchell@crimson.no>2017-02-09 14:53:18 +0000
commitbdb20c74eb452fcd63d88bfc520ec3e1b0cf5788 (patch)
tree0eab1f591e54a77fa43c90740684eff12673e473
parent62268fb2a025fee49d0ac8bcf965cc989b583cae (diff)
As crazy as it is, redefinition of global properties should work
Furthermore, some of the ES6 tests do check for this behavior (this fixes at least 9 of the tests in /test/built-ins/Object/, maybe more elsewhere). createMutableBinding used hasProperty(String*) to determine whether or not it needs to actually define a property, which checks the prototype chain. This would be fine, but when writing values to properties, we used find() on the InternalClass (which is equivilent to Object::hasOwnProperty), which would fail as the property doesn't "really" exist on the object, it's somewhere in the prototype chain. Thus, we'd incorrectly throw an exception in strict mode. I see no regressions in ES5 from this change. Change-Id: I3b097306f220a891955ec11eea860264746bc0ee Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
-rw-r--r--src/qml/jsruntime/qv4context.cpp2
-rw-r--r--tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp15
2 files changed, 16 insertions, 1 deletions
diff --git a/src/qml/jsruntime/qv4context.cpp b/src/qml/jsruntime/qv4context.cpp
index 60b90e4bf0..740ebbe359 100644
--- a/src/qml/jsruntime/qv4context.cpp
+++ b/src/qml/jsruntime/qv4context.cpp
@@ -155,7 +155,7 @@ void ExecutionContext::createMutableBinding(String *name, bool deletable)
ctx = ctx->d()->outer;
}
- if (activation->hasProperty(name))
+ if (activation->hasOwnProperty(name))
return;
ScopedProperty desc(scope);
PropertyAttributes attrs(Attr_Data);
diff --git a/tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp b/tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp
index d6f824c9d5..99fe262cb4 100644
--- a/tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp
+++ b/tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp
@@ -336,6 +336,7 @@ private slots:
void instanceof();
void constkw_data();
void constkw();
+ void redefineGlobalProp();
private:
// static void propertyVarWeakRefCallback(v8::Persistent<v8::Value> object, void* parameter);
@@ -8273,6 +8274,20 @@ void tst_qqmlecmascript::constkw()
}
}
+// Redefine a property found on the global object. It shouldn't throw.
+void tst_qqmlecmascript::redefineGlobalProp()
+{
+ {
+ QJSEngine engine;
+ QJSValue ret = engine.evaluate("\"use strict\"\n var toString = 1;");
+ QVERIFY2(!ret.isError(), qPrintable(ret.toString()));
+ }
+ {
+ QJSEngine engine;
+ QJSValue ret = engine.evaluate("var toString = 1;");
+ QVERIFY2(!ret.isError(), qPrintable(ret.toString()));
+ }
+}
QTEST_MAIN(tst_qqmlecmascript)