Add tests for Subclassing the built-in Function Object

This commit is contained in:
Leonardo Balter 2016-01-07 14:37:22 -05:00
parent cde62d08d8
commit 1bcc056914
4 changed files with 121 additions and 0 deletions

View File

@ -0,0 +1,27 @@
// Copyright (C) 2016 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 19.2.4.1
description: Subclassed Function instances has length and name properties
info: >
19.2.4.1 length
The value of the length property is an integer that indicates the typical
number of arguments expected by the function. However, the language permits
the function to be invoked with some other number of arguments. The behaviour
of a function when invoked on a number of arguments other than the number
specified by its length property depends on the function. This property has
the attributes { [[Writable]]: false, [[Enumerable]]: false,
[[Configurable]]: true }.
includes: [propertyHelper.js]
---*/
class Fn extends Function {}
var fn = new Fn('a', 'b', 'return a + b');
assert.sameValue(fn.length, 2);
verifyNotEnumerable(fn, 'length');
verifyNotWritable(fn, 'length');
verifyConfigurable(fn, 'length');

View File

@ -0,0 +1,39 @@
// Copyright (C) 2016 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 19.2.4.2
description: Subclassed Function instances has length and name properties
info: >
19.2.4.2 name
The value of the name property is an String that is descriptive of the
function. The name has no semantic significance but is typically a variable or
property name that is used to refer to the function at its point of definition
in ECMAScript code. This property has the attributes { [[Writable]]: false,
[[Enumerable]]: false, [[Configurable]]: true }.
Anonymous functions objects that do not have a contextual name associated with
them by this specification do not have a name own property but inherit the
name property of %FunctionPrototype%.
19.2.1.1.1 RuntimeSemantics: CreateDynamicFunction(constructor, newTarget,
kind, args)
...
29. Perform SetFunctionName(F, "anonymous").
...
includes: [propertyHelper.js]
---*/
class Fn extends Function {}
var fn = new Fn('a', 'b', 'return a + b');
assert.sameValue(
fn.name, 'anonymous',
'Dynamic Functions are called anonymous'
);
verifyNotEnumerable(fn, 'name');
verifyNotWritable(fn, 'name');
verifyConfigurable(fn, 'name');

View File

@ -0,0 +1,20 @@
// Copyright (C) 2016 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 19.2.1
description: Subclassing Function
info: >
19.2.1 The Function Constructor
...
The Function constructor is designed to be subclassable. It may be used as the
value of an extends clause of a class definition.
...
---*/
class Fn extends Function {}
var fn = new Fn('a', 'return a * 2');
assert.sameValue(fn(42), 84);

View File

@ -0,0 +1,35 @@
// Copyright (C) 2016 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 19.2.1
description: >
super must be called to initialize Function internal slots
info: >
19.2.1 The Function Constructor
...
The Function constructor is designed to be subclassable. It may be used as the
value of an extends clause of a class definition. Subclass constructors that
intend to inherit the specified Function behaviour must include a super call
to the Function constructor to create and initialize a subclass instances with
the internal slots necessary for built-in function behaviour.
...
---*/
class Fn extends Function {
constructor() {}
}
assert.throws(ReferenceError, function() {
new Fn();
});
class Fn2 extends Function {
constructor() {
super();
}
}
var fn = new Fn2();
assert(fn instanceof Function);