Skip to content
Snippets Groups Projects
Commit 1bcc0569 authored by Leonardo Balter's avatar Leonardo Balter
Browse files

Add tests for Subclassing the built-in Function Object

parent cde62d08
No related branches found
No related tags found
No related merge requests found
// 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');
// 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');
// 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);
// 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);
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment