FunctionObject: Mark name/length property configurable
In ES5, these were not configurable, but ES6 changed the behavior. For length, refer to: 9.2.4 (FunctionInitialize) 17 (ECMAScript Standard Built-in Objects): Unless otherwise specified, the length property of a built-in Function object has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }. 19.2.2.1 Function.length 19.2.3.2 (Function.prototype.bind) 19.2.4.1 (Function instances, length) For name, refer to: 9.2.11 (SetFunctionName) This does regress test262 for ES5 for me a little, but improves our es6 test coverage a bit (~682 more tests pass, +1.5%). Change-Id: Icda7c9068dc3e6e4e4aebbb0d359868a30343013 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
This commit is contained in:
parent
dd31156c6c
commit
6653fdb6bf
|
@ -131,7 +131,7 @@ void FunctionObject::init(String *n, bool createProto)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (n)
|
if (n)
|
||||||
defineReadonlyProperty(s.engine->id_name(), *n);
|
defineReadonlyConfigurableProperty(s.engine->id_name(), *n);
|
||||||
}
|
}
|
||||||
|
|
||||||
ReturnedValue FunctionObject::name() const
|
ReturnedValue FunctionObject::name() const
|
||||||
|
@ -258,10 +258,10 @@ void FunctionPrototype::init(ExecutionEngine *engine, Object *ctor)
|
||||||
Scope scope(engine);
|
Scope scope(engine);
|
||||||
ScopedObject o(scope);
|
ScopedObject o(scope);
|
||||||
|
|
||||||
ctor->defineReadonlyProperty(engine->id_length(), Primitive::fromInt32(1));
|
ctor->defineReadonlyConfigurableProperty(engine->id_length(), Primitive::fromInt32(1));
|
||||||
ctor->defineReadonlyProperty(engine->id_prototype(), (o = this));
|
ctor->defineReadonlyProperty(engine->id_prototype(), (o = this));
|
||||||
|
|
||||||
defineReadonlyProperty(engine->id_length(), Primitive::fromInt32(0));
|
defineReadonlyConfigurableProperty(engine->id_length(), Primitive::fromInt32(0));
|
||||||
defineDefaultProperty(QStringLiteral("constructor"), (o = ctor));
|
defineDefaultProperty(QStringLiteral("constructor"), (o = ctor));
|
||||||
defineDefaultProperty(engine->id_toString(), method_toString, 0);
|
defineDefaultProperty(engine->id_toString(), method_toString, 0);
|
||||||
defineDefaultProperty(QStringLiteral("apply"), method_apply, 2);
|
defineDefaultProperty(QStringLiteral("apply"), method_apply, 2);
|
||||||
|
@ -557,7 +557,7 @@ void Heap::BoundFunction::init(QV4::ExecutionContext *scope, QV4::FunctionObject
|
||||||
len -= boundArgs->size();
|
len -= boundArgs->size();
|
||||||
if (len < 0)
|
if (len < 0)
|
||||||
len = 0;
|
len = 0;
|
||||||
f->defineReadonlyProperty(s.engine->id_length(), Primitive::fromInt32(len));
|
f->defineReadonlyConfigurableProperty(s.engine->id_length(), Primitive::fromInt32(len));
|
||||||
|
|
||||||
ScopedProperty pd(s);
|
ScopedProperty pd(s);
|
||||||
pd->value = s.engine->thrower();
|
pd->value = s.engine->thrower();
|
||||||
|
|
|
@ -258,6 +258,7 @@ enum PropertyFlag {
|
||||||
Attr_NotEnumerable = 0x4,
|
Attr_NotEnumerable = 0x4,
|
||||||
Attr_NotConfigurable = 0x8,
|
Attr_NotConfigurable = 0x8,
|
||||||
Attr_ReadOnly = Attr_NotWritable|Attr_NotEnumerable|Attr_NotConfigurable,
|
Attr_ReadOnly = Attr_NotWritable|Attr_NotEnumerable|Attr_NotConfigurable,
|
||||||
|
Attr_ReadOnly_ButConfigurable = Attr_NotWritable|Attr_NotEnumerable,
|
||||||
Attr_Invalid = 0xff
|
Attr_Invalid = 0xff
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -162,7 +162,7 @@ void Object::defineDefaultProperty(const QString &name, ReturnedValue (*code)(Ca
|
||||||
ScopedString s(scope, e->newIdentifier(name));
|
ScopedString s(scope, e->newIdentifier(name));
|
||||||
ExecutionContext *global = e->rootContext();
|
ExecutionContext *global = e->rootContext();
|
||||||
ScopedFunctionObject function(scope, BuiltinFunction::create(global, s, code));
|
ScopedFunctionObject function(scope, BuiltinFunction::create(global, s, code));
|
||||||
function->defineReadonlyProperty(e->id_length(), Primitive::fromInt32(argumentCount));
|
function->defineReadonlyConfigurableProperty(e->id_length(), Primitive::fromInt32(argumentCount));
|
||||||
defineDefaultProperty(s, function);
|
defineDefaultProperty(s, function);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -173,7 +173,7 @@ void Object::defineDefaultProperty(const QString &name, void (*code)(const Built
|
||||||
ScopedString s(scope, e->newIdentifier(name));
|
ScopedString s(scope, e->newIdentifier(name));
|
||||||
ExecutionContext *global = e->rootContext();
|
ExecutionContext *global = e->rootContext();
|
||||||
ScopedFunctionObject function(scope, BuiltinFunction::create(global, s, code));
|
ScopedFunctionObject function(scope, BuiltinFunction::create(global, s, code));
|
||||||
function->defineReadonlyProperty(e->id_length(), Primitive::fromInt32(argumentCount));
|
function->defineReadonlyConfigurableProperty(e->id_length(), Primitive::fromInt32(argumentCount));
|
||||||
defineDefaultProperty(s, function);
|
defineDefaultProperty(s, function);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -183,7 +183,7 @@ void Object::defineDefaultProperty(String *name, ReturnedValue (*code)(CallConte
|
||||||
Scope scope(e);
|
Scope scope(e);
|
||||||
ExecutionContext *global = e->rootContext();
|
ExecutionContext *global = e->rootContext();
|
||||||
ScopedFunctionObject function(scope, BuiltinFunction::create(global, name, code));
|
ScopedFunctionObject function(scope, BuiltinFunction::create(global, name, code));
|
||||||
function->defineReadonlyProperty(e->id_length(), Primitive::fromInt32(argumentCount));
|
function->defineReadonlyConfigurableProperty(e->id_length(), Primitive::fromInt32(argumentCount));
|
||||||
defineDefaultProperty(name, function);
|
defineDefaultProperty(name, function);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -193,7 +193,7 @@ void Object::defineDefaultProperty(String *name, void (*code)(const BuiltinFunct
|
||||||
Scope scope(e);
|
Scope scope(e);
|
||||||
ExecutionContext *global = e->rootContext();
|
ExecutionContext *global = e->rootContext();
|
||||||
ScopedFunctionObject function(scope, BuiltinFunction::create(global, name, code));
|
ScopedFunctionObject function(scope, BuiltinFunction::create(global, name, code));
|
||||||
function->defineReadonlyProperty(e->id_length(), Primitive::fromInt32(argumentCount));
|
function->defineReadonlyConfigurableProperty(e->id_length(), Primitive::fromInt32(argumentCount));
|
||||||
defineDefaultProperty(name, function);
|
defineDefaultProperty(name, function);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -250,6 +250,19 @@ void Object::defineReadonlyProperty(String *name, const Value &value)
|
||||||
insertMember(name, value, Attr_ReadOnly);
|
insertMember(name, value, Attr_ReadOnly);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Object::defineReadonlyConfigurableProperty(const QString &name, const Value &value)
|
||||||
|
{
|
||||||
|
QV4::ExecutionEngine *e = engine();
|
||||||
|
Scope scope(e);
|
||||||
|
ScopedString s(scope, e->newIdentifier(name));
|
||||||
|
defineReadonlyConfigurableProperty(s, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Object::defineReadonlyConfigurableProperty(String *name, const Value &value)
|
||||||
|
{
|
||||||
|
insertMember(name, value, Attr_ReadOnly_ButConfigurable);
|
||||||
|
}
|
||||||
|
|
||||||
void Object::markObjects(Heap::Base *that, ExecutionEngine *e)
|
void Object::markObjects(Heap::Base *that, ExecutionEngine *e)
|
||||||
{
|
{
|
||||||
Heap::Object *o = static_cast<Heap::Object *>(that);
|
Heap::Object *o = static_cast<Heap::Object *>(that);
|
||||||
|
|
|
@ -253,6 +253,10 @@ struct Q_QML_EXPORT Object: Managed {
|
||||||
void defineReadonlyProperty(const QString &name, const Value &value);
|
void defineReadonlyProperty(const QString &name, const Value &value);
|
||||||
void defineReadonlyProperty(String *name, const Value &value);
|
void defineReadonlyProperty(String *name, const Value &value);
|
||||||
|
|
||||||
|
/* Fixed: Writable: false, Enumerable: false, Configurable: true */
|
||||||
|
void defineReadonlyConfigurableProperty(const QString &name, const Value &value);
|
||||||
|
void defineReadonlyConfigurableProperty(String *name, const Value &value);
|
||||||
|
|
||||||
void insertMember(String *s, const Value &v, PropertyAttributes attributes = Attr_Data) {
|
void insertMember(String *s, const Value &v, PropertyAttributes attributes = Attr_Data) {
|
||||||
Scope scope(engine());
|
Scope scope(engine());
|
||||||
ScopedProperty p(scope);
|
ScopedProperty p(scope);
|
||||||
|
|
|
@ -29,3 +29,101 @@ Sbp_12.5_A9_T3 failing
|
||||||
Sbp_12.6.1_A13_T3 failing
|
Sbp_12.6.1_A13_T3 failing
|
||||||
Sbp_12.6.2_A13_T3 failing
|
Sbp_12.6.2_A13_T3 failing
|
||||||
Sbp_12.6.4_A13_T3 failing
|
Sbp_12.6.4_A13_T3 failing
|
||||||
|
|
||||||
|
# function length attributes are configurable in es6
|
||||||
|
S15.1.2.2_A9.2 failing
|
||||||
|
S15.1.3.1_A5.2 failing
|
||||||
|
S15.1.3.2_A5.2 failing
|
||||||
|
S15.1.3.3_A5.2 failing
|
||||||
|
S15.1.2.3_A7.2 failing
|
||||||
|
S15.1.2.4_A2.2 failing
|
||||||
|
S15.1.2.5_A2.2 failing
|
||||||
|
S15.1.3.4_A5.2 failing
|
||||||
|
15.2.3.3-4-186 failing
|
||||||
|
S15.2.4.2_A9 failing
|
||||||
|
S15.2.4.3_A9 failing
|
||||||
|
S15.2.4.4_A9 failing
|
||||||
|
S15.2.4.5_A9 failing
|
||||||
|
S15.2.4.6_A9 failing
|
||||||
|
S15.2.4.7_A9 failing
|
||||||
|
15.3.3.2-1 failing
|
||||||
|
15.4.4.2_A4.2
|
||||||
|
S15.3.4.2_A9 failing
|
||||||
|
S15.3.4.3_A9 failing
|
||||||
|
S15.3.4.4_A9 failing
|
||||||
|
15.3.4.5-15-2 failing
|
||||||
|
S15.4.4.2_A4.2 failing
|
||||||
|
S15.4.4.3_A4.2 failing
|
||||||
|
S15.4.4.4_A4.2 failing
|
||||||
|
S15.4.4.5_A6.2 failing
|
||||||
|
S15.4.4.6_A5.2 failing
|
||||||
|
S15.4.4.7_A6.2 failing
|
||||||
|
S15.4.4.8_A5.2 failing
|
||||||
|
S15.4.4.9_A5.2 failing
|
||||||
|
S15.4.4.10_A5.2 failing
|
||||||
|
S15.4.4.11_A7.2 failing
|
||||||
|
S15.4.4.12_A5.2 failing
|
||||||
|
S15.4.4.13_A5.2 failing
|
||||||
|
S15.5.4.10_A9 failing
|
||||||
|
S15.5.4.11_A9 failing
|
||||||
|
S15.5.4.12_A9 failing
|
||||||
|
S15.5.4.13_A9 failing
|
||||||
|
S15.5.4.14_A9 failing
|
||||||
|
S15.5.4.15_A9 failing
|
||||||
|
S15.5.4.16_A9 failing
|
||||||
|
S15.5.4.17_A9 failing
|
||||||
|
S15.5.4.18_A9 failing
|
||||||
|
S15.5.4.19_A9 failing
|
||||||
|
S15.5.4.4_A9 failing
|
||||||
|
S15.5.4.5_A9 failing
|
||||||
|
S15.5.4.6_A9 failing
|
||||||
|
S15.5.4.7_A9 failing
|
||||||
|
S15.5.4.8_A9 failing
|
||||||
|
S15.5.4.9_A9 failing
|
||||||
|
S15.9.4.2_A3_T2 failing
|
||||||
|
S15.9.4.3_A3_T2 failing
|
||||||
|
S15.9.5.2_A3_T2 failing
|
||||||
|
S15.9.5.3_A3_T2 failing
|
||||||
|
S15.9.5.4_A3_T2 failing
|
||||||
|
S15.9.5.5_A3_T2 failing
|
||||||
|
S15.9.5.10_A3_T2 failing
|
||||||
|
S15.9.5.11_A3_T2 failing
|
||||||
|
S15.9.5.12_A3_T2 failing
|
||||||
|
S15.9.5.13_A3_T2 failing
|
||||||
|
S15.9.5.14_A3_T2 failing
|
||||||
|
S15.9.5.15_A3_T2 failing
|
||||||
|
S15.9.5.16_A3_T2 failing
|
||||||
|
S15.9.5.17_A3_T2 failing
|
||||||
|
S15.9.5.18_A3_T2 failing
|
||||||
|
S15.9.5.19_A3_T2 failing
|
||||||
|
S15.9.5.20_A3_T2 failing
|
||||||
|
S15.9.5.21_A3_T2 failing
|
||||||
|
S15.9.5.22_A3_T2 failing
|
||||||
|
S15.9.5.23_A3_T2 failing
|
||||||
|
S15.9.5.24_A3_T2 failing
|
||||||
|
S15.9.5.25_A3_T2 failing
|
||||||
|
S15.9.5.26_A3_T2 failing
|
||||||
|
S15.9.5.27_A3_T2 failing
|
||||||
|
S15.9.5.28_A3_T2 failing
|
||||||
|
S15.9.5.29_A3_T2 failing
|
||||||
|
S15.9.5.30_A3_T2 failing
|
||||||
|
S15.9.5.31_A3_T2 failing
|
||||||
|
S15.9.5.32_A3_T2 failing
|
||||||
|
S15.9.5.33_A3_T2 failing
|
||||||
|
S15.9.5.34_A3_T2 failing
|
||||||
|
S15.9.5.35_A3_T2 failing
|
||||||
|
S15.9.5.36_A3_T2 failing
|
||||||
|
S15.9.5.37_A3_T2 failing
|
||||||
|
S15.9.5.38_A3_T2 failing
|
||||||
|
S15.9.5.39_A3_T2 failing
|
||||||
|
S15.9.5.40_A3_T2 failing
|
||||||
|
S15.9.5.41_A3_T2 failing
|
||||||
|
S15.9.5.42_A3_T2 failing
|
||||||
|
S15.9.5.6_A3_T2 failing
|
||||||
|
S15.9.5.7_A3_T2 failing
|
||||||
|
S15.9.5.8_A3_T2 failing
|
||||||
|
S15.9.5.9_A3_T2 failing
|
||||||
|
S15.10.6.2_A9 failing
|
||||||
|
S15.10.6.3_A9 failing
|
||||||
|
S15.10.6.4_A9 failing
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue