summaryrefslogtreecommitdiffstats
path: root/js/src/tests/test262/built-ins/Proxy/construct
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/tests/test262/built-ins/Proxy/construct')
-rw-r--r--js/src/tests/test262/built-ins/Proxy/construct/arguments-realm.js21
-rw-r--r--js/src/tests/test262/built-ins/Proxy/construct/browser.js0
-rw-r--r--js/src/tests/test262/built-ins/Proxy/construct/call-parameters-new-target.js42
-rw-r--r--js/src/tests/test262/built-ins/Proxy/construct/call-parameters.js41
-rw-r--r--js/src/tests/test262/built-ins/Proxy/construct/call-result.js26
-rw-r--r--js/src/tests/test262/built-ins/Proxy/construct/null-handler-realm.js22
-rw-r--r--js/src/tests/test262/built-ins/Proxy/construct/null-handler.js21
-rw-r--r--js/src/tests/test262/built-ins/Proxy/construct/return-is-abrupt.js26
-rw-r--r--js/src/tests/test262/built-ins/Proxy/construct/return-not-object-throws-boolean-realm.js29
-rw-r--r--js/src/tests/test262/built-ins/Proxy/construct/return-not-object-throws-boolean.js26
-rw-r--r--js/src/tests/test262/built-ins/Proxy/construct/return-not-object-throws-null-realm.js29
-rw-r--r--js/src/tests/test262/built-ins/Proxy/construct/return-not-object-throws-null.js27
-rw-r--r--js/src/tests/test262/built-ins/Proxy/construct/return-not-object-throws-number-realm.js29
-rw-r--r--js/src/tests/test262/built-ins/Proxy/construct/return-not-object-throws-number.js26
-rw-r--r--js/src/tests/test262/built-ins/Proxy/construct/return-not-object-throws-string-realm.js29
-rw-r--r--js/src/tests/test262/built-ins/Proxy/construct/return-not-object-throws-string.js26
-rw-r--r--js/src/tests/test262/built-ins/Proxy/construct/return-not-object-throws-symbol-realm.js29
-rw-r--r--js/src/tests/test262/built-ins/Proxy/construct/return-not-object-throws-symbol.js26
-rw-r--r--js/src/tests/test262/built-ins/Proxy/construct/return-not-object-throws-undefined-realm.js27
-rw-r--r--js/src/tests/test262/built-ins/Proxy/construct/return-not-object-throws-undefined.js24
-rw-r--r--js/src/tests/test262/built-ins/Proxy/construct/shell.js0
-rw-r--r--js/src/tests/test262/built-ins/Proxy/construct/trap-is-missing-target-is-proxy.js40
-rw-r--r--js/src/tests/test262/built-ins/Proxy/construct/trap-is-not-callable-realm.js20
-rw-r--r--js/src/tests/test262/built-ins/Proxy/construct/trap-is-not-callable.js19
-rw-r--r--js/src/tests/test262/built-ins/Proxy/construct/trap-is-null-target-is-proxy.js47
-rw-r--r--js/src/tests/test262/built-ins/Proxy/construct/trap-is-null.js52
-rw-r--r--js/src/tests/test262/built-ins/Proxy/construct/trap-is-undefined-no-property.js48
-rw-r--r--js/src/tests/test262/built-ins/Proxy/construct/trap-is-undefined-proto-from-cross-realm-newtarget.js49
-rw-r--r--js/src/tests/test262/built-ins/Proxy/construct/trap-is-undefined-proto-from-newtarget-realm.js58
-rw-r--r--js/src/tests/test262/built-ins/Proxy/construct/trap-is-undefined-target-is-proxy.js48
-rw-r--r--js/src/tests/test262/built-ins/Proxy/construct/trap-is-undefined.js52
31 files changed, 959 insertions, 0 deletions
diff --git a/js/src/tests/test262/built-ins/Proxy/construct/arguments-realm.js b/js/src/tests/test262/built-ins/Proxy/construct/arguments-realm.js
new file mode 100644
index 0000000000..feb7ec55a0
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Proxy/construct/arguments-realm.js
@@ -0,0 +1,21 @@
+// Copyright (C) 2016 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+esid: sec-proxy-object-internal-methods-and-internal-slots-construct-argumentslist-newtarget
+description: >
+ Arguments array is created in the Realm of the current execution context
+info: |
+ [...]
+ 7. Let argArray be CreateArrayFromList(argumentsList).
+ 8. Let newObj be ? Call(trap, handler, « target, argArray, newTarget »).
+ [...]
+features: [cross-realm]
+---*/
+
+var C = $262.createRealm().global.eval(
+ 'new Proxy(function() {}, { construct: function(_, args) { return args; } })'
+);
+
+assert.sameValue(new C().constructor, Array);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/Proxy/construct/browser.js b/js/src/tests/test262/built-ins/Proxy/construct/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Proxy/construct/browser.js
diff --git a/js/src/tests/test262/built-ins/Proxy/construct/call-parameters-new-target.js b/js/src/tests/test262/built-ins/Proxy/construct/call-parameters-new-target.js
new file mode 100644
index 0000000000..353c4f4092
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Proxy/construct/call-parameters-new-target.js
@@ -0,0 +1,42 @@
+// Copyright (C) 2017 Aleksey Shvayka. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-proxy-object-internal-methods-and-internal-slots-construct-argumentslist-newtarget
+description: >
+ trap is called with handler object as its context, and parameters are:
+ target, an array list with the called arguments and the NewTarget
+info: |
+ [[Construct]] (argumentsList, newTarget)
+
+ 9. Let newObj be Call(trap, handler, «target, argArray, newTarget»).
+features: [Proxy, Reflect, Reflect.construct]
+---*/
+
+function Target() {}
+
+function NewTarget() {}
+
+var handler = {
+ construct: function(target, args, newTarget) {
+ assert.sameValue(this, handler, "trap context is the handler object");
+ assert.sameValue(target, Target, "first parameter is the target object");
+ assert.sameValue(args.length, 2, "arguments list contains all construct arguments");
+
+ var a = args[0];
+ var b = args[1];
+ assert.sameValue(a, 1, "arguments list has first construct argument");
+ assert.sameValue(b, 2, "arguments list has second construct argument");
+ assert.sameValue(newTarget, NewTarget, "newTarget is passed as the third parameter");
+
+ return {
+ sum: a + b
+ };
+ },
+};
+
+var P = new Proxy(Target, handler);
+var res = Reflect.construct(P, [1, 2], NewTarget);
+assert.sameValue(res.sum, 3);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/Proxy/construct/call-parameters.js b/js/src/tests/test262/built-ins/Proxy/construct/call-parameters.js
new file mode 100644
index 0000000000..cb771c9fb4
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Proxy/construct/call-parameters.js
@@ -0,0 +1,41 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+esid: sec-proxy-object-internal-methods-and-internal-slots-construct-argumentslist-newtarget
+description: >
+ trap is called with handler object as its context, and parameters are:
+ target, an array list with the called arguments and the new target, and the
+ constructor new.target.
+info: |
+ [[Construct]] ( argumentsList, newTarget)
+
+ 9. Let newObj be Call(trap, handler, «target, argArray, newTarget »).
+features: [Proxy]
+---*/
+
+var _target, _handler, _args, _P;
+
+function Target() {}
+
+var handler = {
+ construct: function(t, args, newTarget) {
+ _handler = this;
+ _target = t;
+ _args = args;
+ _P = newTarget;
+
+ return new t(args[0], args[1]);
+ }
+};
+var P = new Proxy(Target, handler);
+
+new P(1, 2);
+
+assert.sameValue(_handler, handler, "trap context is the handler object");
+assert.sameValue(_target, Target, "first parameter is the target object");
+assert.sameValue(_args.length, 2, "arguments list contains all call arguments");
+assert.sameValue(_args[0], 1, "arguments list has first call argument");
+assert.sameValue(_args[1], 2, "arguments list has second call argument");
+assert.sameValue(_P, P, "constructor is sent as the third parameter");
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/Proxy/construct/call-result.js b/js/src/tests/test262/built-ins/Proxy/construct/call-result.js
new file mode 100644
index 0000000000..709016ff62
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Proxy/construct/call-result.js
@@ -0,0 +1,26 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+esid: sec-proxy-object-internal-methods-and-internal-slots-construct-argumentslist-newtarget
+description: >
+ Return the result from the trap method.
+info: |
+ [[Construct]] ( argumentsList, newTarget)
+
+ 12. Return newObj
+features: [Proxy]
+---*/
+
+var P = new Proxy(function() {
+ throw new Test262Error('target should not be called');
+}, {
+ construct: function(t, c, args) {
+ return {
+ sum: 42
+ };
+ }
+});
+
+assert.sameValue((new P(1, 2)).sum, 42);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/Proxy/construct/null-handler-realm.js b/js/src/tests/test262/built-ins/Proxy/construct/null-handler-realm.js
new file mode 100644
index 0000000000..a17fb95e33
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Proxy/construct/null-handler-realm.js
@@ -0,0 +1,22 @@
+// Copyright (C) 2019 Aleksey Shvayka. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+esid: sec-proxy-object-internal-methods-and-internal-slots-construct-argumentslist-newtarget
+description: >
+ [[Construct]] (argumentsList, newTarget)
+
+ 1. Let handler be O.[[ProxyHandler]].
+ 2. If handler is null, throw a TypeError exception.
+features: [cross-realm, Proxy]
+---*/
+
+var OProxy = $262.createRealm().global.Proxy;
+var p = OProxy.revocable(function() {}, {});
+
+p.revoke();
+
+assert.throws(TypeError, function() {
+ new p.proxy();
+});
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/Proxy/construct/null-handler.js b/js/src/tests/test262/built-ins/Proxy/construct/null-handler.js
new file mode 100644
index 0000000000..90a310e4fd
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Proxy/construct/null-handler.js
@@ -0,0 +1,21 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+esid: sec-proxy-object-internal-methods-and-internal-slots-construct-argumentslist-newtarget
+description: >
+ [[Construct]] ( argumentsList, newTarget)
+
+ 2. If handler is null, throw a TypeError exception.
+features: [Proxy]
+---*/
+
+
+var p = Proxy.revocable(function() {}, {});
+
+p.revoke();
+
+assert.throws(TypeError, function() {
+ new p.proxy();
+});
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/Proxy/construct/return-is-abrupt.js b/js/src/tests/test262/built-ins/Proxy/construct/return-is-abrupt.js
new file mode 100644
index 0000000000..d1b2381407
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Proxy/construct/return-is-abrupt.js
@@ -0,0 +1,26 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+esid: sec-proxy-object-internal-methods-and-internal-slots-construct-argumentslist-newtarget
+description: >
+ Return abrupt from constructor call.
+info: |
+ [[Construct]] ( argumentsList, newTarget)
+
+ 9. Let newObj be Call(trap, handler, «target, argArray, newTarget »).
+ 10. ReturnIfAbrupt(newObj).
+features: [Proxy]
+---*/
+
+function Target() {}
+var P = new Proxy(Target, {
+ construct: function() {
+ throw new Test262Error();
+ }
+});
+
+assert.throws(Test262Error, function() {
+ new P();
+});
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/Proxy/construct/return-not-object-throws-boolean-realm.js b/js/src/tests/test262/built-ins/Proxy/construct/return-not-object-throws-boolean-realm.js
new file mode 100644
index 0000000000..fa19b3df39
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Proxy/construct/return-not-object-throws-boolean-realm.js
@@ -0,0 +1,29 @@
+// Copyright (C) 2019 Aleksey Shvayka. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+esid: sec-proxy-object-internal-methods-and-internal-slots-construct-argumentslist-newtarget
+description: >
+ Throws a TypeError if trap result is not an Object: Boolean
+ (honoring the Realm of the current execution context)
+info: |
+ [[Construct]] (argumentsList, newTarget)
+
+ [...]
+ 11. If Type(newObj) is not Object, throw a TypeError exception.
+features: [cross-realm, Proxy]
+---*/
+
+var OProxy = $262.createRealm().global.Proxy;
+var P = new OProxy(function() {
+ throw new Test262Error('target should not be called');
+}, {
+ construct: function() {
+ return true;
+ },
+});
+
+assert.throws(TypeError, function() {
+ new P();
+});
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/Proxy/construct/return-not-object-throws-boolean.js b/js/src/tests/test262/built-ins/Proxy/construct/return-not-object-throws-boolean.js
new file mode 100644
index 0000000000..f3c6857513
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Proxy/construct/return-not-object-throws-boolean.js
@@ -0,0 +1,26 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+esid: sec-proxy-object-internal-methods-and-internal-slots-construct-argumentslist-newtarget
+description: >
+ Throws a TypeError if trap result is not an Object: Boolean
+info: |
+ [[Construct]] ( argumentsList, newTarget)
+
+ 11. If Type(newObj) is not Object, throw a TypeError exception.
+features: [Proxy]
+---*/
+
+var P = new Proxy(function() {
+ throw new Test262Error('target should not be called');
+}, {
+ construct: function() {
+ return true;
+ }
+});
+
+assert.throws(TypeError, function() {
+ new P();
+});
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/Proxy/construct/return-not-object-throws-null-realm.js b/js/src/tests/test262/built-ins/Proxy/construct/return-not-object-throws-null-realm.js
new file mode 100644
index 0000000000..2342dd07b1
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Proxy/construct/return-not-object-throws-null-realm.js
@@ -0,0 +1,29 @@
+// Copyright (C) 2019 Aleksey Shvayka. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+esid: sec-proxy-object-internal-methods-and-internal-slots-construct-argumentslist-newtarget
+description: >
+ Throws a TypeError if trap result is not an Object: null
+ (honoring the Realm of the current execution context)
+info: |
+ [[Construct]] (argumentsList, newTarget)
+
+ [...]
+ 11. If Type(newObj) is not Object, throw a TypeError exception.
+features: [cross-realm, Proxy]
+---*/
+
+var OProxy = $262.createRealm().global.Proxy;
+var P = new OProxy(function() {
+ throw new Test262Error('target should not be called');
+}, {
+ construct: function() {
+ return null;
+ },
+});
+
+assert.throws(TypeError, function() {
+ new P();
+});
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/Proxy/construct/return-not-object-throws-null.js b/js/src/tests/test262/built-ins/Proxy/construct/return-not-object-throws-null.js
new file mode 100644
index 0000000000..f14da08eba
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Proxy/construct/return-not-object-throws-null.js
@@ -0,0 +1,27 @@
+// Copyright (C) 2019 Aleksey Shvayka. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+esid: sec-proxy-object-internal-methods-and-internal-slots-construct-argumentslist-newtarget
+description: >
+ Throws a TypeError if trap result is not an Object: null
+info: |
+ [[Construct]] (argumentsList, newTarget)
+
+ [...]
+ 11. If Type(newObj) is not Object, throw a TypeError exception.
+features: [Proxy]
+---*/
+
+var P = new Proxy(function() {
+ throw new Test262Error('target should not be called');
+}, {
+ construct: function() {
+ return null;
+ },
+});
+
+assert.throws(TypeError, function() {
+ new P();
+});
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/Proxy/construct/return-not-object-throws-number-realm.js b/js/src/tests/test262/built-ins/Proxy/construct/return-not-object-throws-number-realm.js
new file mode 100644
index 0000000000..999159287c
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Proxy/construct/return-not-object-throws-number-realm.js
@@ -0,0 +1,29 @@
+// Copyright (C) 2019 Aleksey Shvayka. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+esid: sec-proxy-object-internal-methods-and-internal-slots-construct-argumentslist-newtarget
+description: >
+ Throws a TypeError if trap result is not an Object: Number
+ (honoring the Realm of the current execution context)
+info: |
+ [[Construct]] (argumentsList, newTarget)
+
+ [...]
+ 11. If Type(newObj) is not Object, throw a TypeError exception.
+features: [cross-realm, Proxy]
+---*/
+
+var OProxy = $262.createRealm().global.Proxy;
+var P = new OProxy(function() {
+ throw new Test262Error('target should not be called');
+}, {
+ construct: function() {
+ return 1;
+ },
+});
+
+assert.throws(TypeError, function() {
+ new P();
+});
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/Proxy/construct/return-not-object-throws-number.js b/js/src/tests/test262/built-ins/Proxy/construct/return-not-object-throws-number.js
new file mode 100644
index 0000000000..bc1c591b28
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Proxy/construct/return-not-object-throws-number.js
@@ -0,0 +1,26 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+esid: sec-proxy-object-internal-methods-and-internal-slots-construct-argumentslist-newtarget
+description: >
+ Throws a TypeError if trap result is not an Object: Number
+info: |
+ [[Construct]] ( argumentsList, newTarget)
+
+ 11. If Type(newObj) is not Object, throw a TypeError exception.
+features: [Proxy]
+---*/
+
+var P = new Proxy(function() {
+ throw new Test262Error('target should not be called');
+}, {
+ construct: function() {
+ return 0;
+ }
+});
+
+assert.throws(TypeError, function() {
+ new P();
+});
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/Proxy/construct/return-not-object-throws-string-realm.js b/js/src/tests/test262/built-ins/Proxy/construct/return-not-object-throws-string-realm.js
new file mode 100644
index 0000000000..6d607d7ffb
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Proxy/construct/return-not-object-throws-string-realm.js
@@ -0,0 +1,29 @@
+// Copyright (C) 2019 Aleksey Shvayka. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+esid: sec-proxy-object-internal-methods-and-internal-slots-construct-argumentslist-newtarget
+description: >
+ Throws a TypeError if trap result is not an Object: String
+ (honoring the Realm of the current execution context)
+info: |
+ [[Construct]] (argumentsList, newTarget)
+
+ [...]
+ 11. If Type(newObj) is not Object, throw a TypeError exception.
+features: [cross-realm, Proxy]
+---*/
+
+var OProxy = $262.createRealm().global.Proxy;
+var P = new OProxy(function() {
+ throw new Test262Error('target should not be called');
+}, {
+ construct: function() {
+ return '';
+ },
+});
+
+assert.throws(TypeError, function() {
+ new P();
+});
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/Proxy/construct/return-not-object-throws-string.js b/js/src/tests/test262/built-ins/Proxy/construct/return-not-object-throws-string.js
new file mode 100644
index 0000000000..32bb69bfa5
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Proxy/construct/return-not-object-throws-string.js
@@ -0,0 +1,26 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+esid: sec-proxy-object-internal-methods-and-internal-slots-construct-argumentslist-newtarget
+description: >
+ Throws a TypeError if trap result is not an Object: String
+info: |
+ [[Construct]] ( argumentsList, newTarget)
+
+ 11. If Type(newObj) is not Object, throw a TypeError exception.
+features: [Proxy]
+---*/
+
+var P = new Proxy(function() {
+ throw new Test262Error('target should not be called');
+}, {
+ construct: function() {
+ return "";
+ }
+});
+
+assert.throws(TypeError, function() {
+ new P();
+});
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/Proxy/construct/return-not-object-throws-symbol-realm.js b/js/src/tests/test262/built-ins/Proxy/construct/return-not-object-throws-symbol-realm.js
new file mode 100644
index 0000000000..90640df61f
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Proxy/construct/return-not-object-throws-symbol-realm.js
@@ -0,0 +1,29 @@
+// Copyright (C) 2019 Aleksey Shvayka. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+esid: sec-proxy-object-internal-methods-and-internal-slots-construct-argumentslist-newtarget
+description: >
+ Throws a TypeError if trap result is not an Object: Symbol
+ (honoring the Realm of the current execution context)
+info: |
+ [[Construct]] (argumentsList, newTarget)
+
+ [...]
+ 11. If Type(newObj) is not Object, throw a TypeError exception.
+features: [cross-realm, Proxy]
+---*/
+
+var OProxy = $262.createRealm().global.Proxy;
+var P = new OProxy(function() {
+ throw new Test262Error('target should not be called');
+}, {
+ construct: function() {
+ return Symbol();
+ },
+});
+
+assert.throws(TypeError, function() {
+ new P();
+});
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/Proxy/construct/return-not-object-throws-symbol.js b/js/src/tests/test262/built-ins/Proxy/construct/return-not-object-throws-symbol.js
new file mode 100644
index 0000000000..857e0b6ae7
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Proxy/construct/return-not-object-throws-symbol.js
@@ -0,0 +1,26 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+esid: sec-proxy-object-internal-methods-and-internal-slots-construct-argumentslist-newtarget
+description: >
+ Throws a TypeError if trap result is not an Object: Symbol
+info: |
+ [[Construct]] ( argumentsList, newTarget)
+
+ 11. If Type(newObj) is not Object, throw a TypeError exception.
+features: [Proxy, Symbol]
+---*/
+
+var P = new Proxy(function() {
+ throw new Test262Error('target should not be called');
+}, {
+ construct: function() {
+ return Symbol();
+ }
+});
+
+assert.throws(TypeError, function() {
+ new P();
+});
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/Proxy/construct/return-not-object-throws-undefined-realm.js b/js/src/tests/test262/built-ins/Proxy/construct/return-not-object-throws-undefined-realm.js
new file mode 100644
index 0000000000..300f9010f6
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Proxy/construct/return-not-object-throws-undefined-realm.js
@@ -0,0 +1,27 @@
+// Copyright (C) 2019 Aleksey Shvayka. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+esid: sec-proxy-object-internal-methods-and-internal-slots-construct-argumentslist-newtarget
+description: >
+ Throws a TypeError if trap result is not an Object: undefined
+ (honoring the Realm of the current execution context)
+info: |
+ [[Construct]] (argumentsList, newTarget)
+
+ [...]
+ 11. If Type(newObj) is not Object, throw a TypeError exception.
+features: [cross-realm, Proxy]
+---*/
+
+var OProxy = $262.createRealm().global.Proxy;
+var P = new OProxy(function() {
+ throw new Test262Error('target should not be called');
+}, {
+ construct: function() {},
+});
+
+assert.throws(TypeError, function() {
+ new P();
+});
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/Proxy/construct/return-not-object-throws-undefined.js b/js/src/tests/test262/built-ins/Proxy/construct/return-not-object-throws-undefined.js
new file mode 100644
index 0000000000..dab78c14d6
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Proxy/construct/return-not-object-throws-undefined.js
@@ -0,0 +1,24 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+esid: sec-proxy-object-internal-methods-and-internal-slots-construct-argumentslist-newtarget
+description: >
+ Throws a TypeError if trap result is not an Object: undefined
+info: |
+ [[Construct]] ( argumentsList, newTarget)
+
+ 11. If Type(newObj) is not Object, throw a TypeError exception.
+features: [Proxy]
+---*/
+
+var P = new Proxy(function() {
+ throw new Test262Error('target should not be called');
+}, {
+ construct: function() {}
+});
+
+assert.throws(TypeError, function() {
+ new P();
+});
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/Proxy/construct/shell.js b/js/src/tests/test262/built-ins/Proxy/construct/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Proxy/construct/shell.js
diff --git a/js/src/tests/test262/built-ins/Proxy/construct/trap-is-missing-target-is-proxy.js b/js/src/tests/test262/built-ins/Proxy/construct/trap-is-missing-target-is-proxy.js
new file mode 100644
index 0000000000..08b9fc06a9
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Proxy/construct/trap-is-missing-target-is-proxy.js
@@ -0,0 +1,40 @@
+// Copyright (C) 2020 Alexey Shvayka. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-proxy-object-internal-methods-and-internal-slots-construct-argumentslist-newtarget
+description: >
+ If "construct" trap is null or undefined, [[Construct]] call is
+ properly forwarded to [[ProxyTarget]] (which is also a Proxy object).
+info: |
+ [[Construct]] ( argumentsList, newTarget )
+
+ [...]
+ 4. Let target be O.[[ProxyTarget]].
+ 5. Assert: IsConstructor(target) is true.
+ 6. Let trap be ? GetMethod(handler, "construct").
+ 7. If trap is undefined, then
+ a. Return ? Construct(target, argumentsList, newTarget).
+features: [class, Proxy, Reflect, Reflect.construct]
+includes: [compareArray.js]
+---*/
+
+var ArrayTarget = new Proxy(Array, {});
+var ArrayProxy = new Proxy(ArrayTarget, {});
+
+var array = new ArrayProxy(1, 2, 3);
+assert(Array.isArray(array));
+assert.compareArray(array, [1, 2, 3]);
+
+class MyArray extends Array {
+ get isMyArray() {
+ return true;
+ }
+}
+
+var myArray = Reflect.construct(ArrayProxy, [], MyArray);
+assert(Array.isArray(myArray));
+assert(myArray instanceof MyArray);
+assert(myArray.isMyArray);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/Proxy/construct/trap-is-not-callable-realm.js b/js/src/tests/test262/built-ins/Proxy/construct/trap-is-not-callable-realm.js
new file mode 100644
index 0000000000..c93e0b0bbb
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Proxy/construct/trap-is-not-callable-realm.js
@@ -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.
+/*---
+esid: sec-proxy-object-internal-methods-and-internal-slots-construct-argumentslist-newtarget
+description: >
+ Throws if trap is not callable (honoring the Realm of the current execution
+ context)
+features: [cross-realm, Proxy]
+---*/
+
+var OProxy = $262.createRealm().global.Proxy;
+var p = new OProxy(function() {}, {
+ construct: {}
+});
+
+assert.throws(TypeError, function() {
+ new p();
+});
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/Proxy/construct/trap-is-not-callable.js b/js/src/tests/test262/built-ins/Proxy/construct/trap-is-not-callable.js
new file mode 100644
index 0000000000..acb58e6dd1
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Proxy/construct/trap-is-not-callable.js
@@ -0,0 +1,19 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+esid: sec-proxy-object-internal-methods-and-internal-slots-construct-argumentslist-newtarget
+description: >
+ Throws if trap is not callable.
+features: [Proxy]
+---*/
+
+function Target() {}
+var p = new Proxy(Target, {
+ construct: {}
+});
+
+assert.throws(TypeError, function() {
+ new p();
+});
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/Proxy/construct/trap-is-null-target-is-proxy.js b/js/src/tests/test262/built-ins/Proxy/construct/trap-is-null-target-is-proxy.js
new file mode 100644
index 0000000000..7cdaa8c741
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Proxy/construct/trap-is-null-target-is-proxy.js
@@ -0,0 +1,47 @@
+// Copyright (C) 2020 Alexey Shvayka. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-proxy-object-internal-methods-and-internal-slots-construct-argumentslist-newtarget
+description: >
+ If "construct" trap is null or undefined, [[Construct]] call is
+ properly forwarded to [[ProxyTarget]] (which is also a Proxy object).
+info: |
+ [[Construct]] ( argumentsList, newTarget )
+
+ [...]
+ 4. Let target be O.[[ProxyTarget]].
+ 5. Assert: IsConstructor(target) is true.
+ 6. Let trap be ? GetMethod(handler, "construct").
+ 7. If trap is undefined, then
+ a. Return ? Construct(target, argumentsList, newTarget).
+features: [class, Proxy, Reflect, Reflect.construct]
+---*/
+
+class Foo {
+ constructor(arg) {
+ this.arg = arg;
+ }
+}
+
+var FooTarget = new Proxy(Foo, {});
+var FooProxy = new Proxy(FooTarget, {
+ construct: null,
+});
+
+var foo = new FooProxy(1);
+assert(foo instanceof Foo);
+assert.sameValue(foo.arg, 1);
+
+class Bar extends Foo {
+ get isBar() {
+ return true;
+ }
+}
+
+var bar = Reflect.construct(FooProxy, [2], Bar);
+assert(bar instanceof Bar);
+assert.sameValue(bar.arg, 2);
+assert(bar.isBar);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/Proxy/construct/trap-is-null.js b/js/src/tests/test262/built-ins/Proxy/construct/trap-is-null.js
new file mode 100644
index 0000000000..962e97c0f0
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Proxy/construct/trap-is-null.js
@@ -0,0 +1,52 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-proxy-object-internal-methods-and-internal-slots-construct-argumentslist-newtarget
+description: >
+ If the construct trap value is null, propagate the construct to the target object.
+info: |
+ [[Construct]] (argumentsList, newTarget)
+
+ ...
+ 5. Let trap be ? GetMethod(handler, "construct").
+ 6. If trap is undefined, then
+ a. Assert: target has a [[Construct]] internal method.
+ b. Return ? Construct(target, argumentsList, newTarget).
+ ...
+
+ GetMethod ( V, P )
+
+ ...
+ 3. If func is either undefined or null, return undefined.
+ ...
+features: [Proxy, Reflect, Reflect.construct]
+---*/
+
+var calls = 0;
+var _NewTarget;
+
+var Target = new Proxy(function() {
+ throw new Test262Error('target should not be called');
+}, {
+ construct: function(_Target, args, NewTarget) {
+ calls += 1;
+ _NewTarget = NewTarget;
+ return {
+ sum: args[0] + args[1]
+ };
+ }
+})
+
+var P = new Proxy(Target, {
+ construct: null
+});
+
+var NewTarget = function() {};
+var obj = Reflect.construct(P, [3, 4], NewTarget);
+
+assert.sameValue(calls, 1, "construct is null: [[Construct]] is invoked once");
+assert.sameValue(_NewTarget, NewTarget, "construct is null: NewTarget is passed to [[Construct]]");
+assert.sameValue(obj.sum, 7, "construct is null: result of [[Construct]] is returned");
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/Proxy/construct/trap-is-undefined-no-property.js b/js/src/tests/test262/built-ins/Proxy/construct/trap-is-undefined-no-property.js
new file mode 100644
index 0000000000..5a5204cd6a
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Proxy/construct/trap-is-undefined-no-property.js
@@ -0,0 +1,48 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+esid: sec-proxy-object-internal-methods-and-internal-slots-construct-argumentslist-newtarget
+description: >
+ If the construct trap is not set, propagate the construct to the target object.
+info: |
+ [[Construct]] (argumentsList, newTarget)
+
+ ...
+ 5. Let trap be ? GetMethod(handler, "construct").
+ 6. If trap is undefined, then
+ a. Assert: target has a [[Construct]] internal method.
+ b. Return ? Construct(target, argumentsList, newTarget).
+ ...
+
+ GetMethod ( V, P )
+
+ ...
+ 3. If func is either undefined or null, return undefined.
+ ...
+features: [Proxy, Reflect, Reflect.construct]
+---*/
+
+var calls = 0;
+var _NewTarget;
+
+var Target = new Proxy(function() {
+ throw new Test262Error('target should not be called');
+}, {
+ construct: function(_Target, args, NewTarget) {
+ calls += 1;
+ _NewTarget = NewTarget;
+ return {
+ sum: args[0] + args[1]
+ };
+ }
+})
+
+var P = new Proxy(Target, {});
+var NewTarget = function() {};
+var obj = Reflect.construct(P, [3, 4], NewTarget);
+
+assert.sameValue(calls, 1, "construct is missing: [[Construct]] is invoked once");
+assert.sameValue(_NewTarget, NewTarget, "construct is missing: NewTarget is passed to [[Construct]]");
+assert.sameValue(obj.sum, 7, "construct is missing: result of [[Construct]] is returned");
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/Proxy/construct/trap-is-undefined-proto-from-cross-realm-newtarget.js b/js/src/tests/test262/built-ins/Proxy/construct/trap-is-undefined-proto-from-cross-realm-newtarget.js
new file mode 100644
index 0000000000..04834fdb5f
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Proxy/construct/trap-is-undefined-proto-from-cross-realm-newtarget.js
@@ -0,0 +1,49 @@
+// Copyright (C) 2016 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+esid: sec-proxy-object-internal-methods-and-internal-slots-construct-argumentslist-newtarget
+description: >
+ If trap is undefined, propagate [[Construct]] to target,
+ passing correct newTarget parameter
+info: |
+ [[Construct]] ( argumentsList, newTarget )
+
+ [...]
+ 7. If trap is undefined, then
+ b. Return ? Construct(target, argumentsList, newTarget).
+
+ Construct ( F [ , argumentsList [ , newTarget ] ] )
+
+ [...]
+ 5. Return ? F.[[Construct]](argumentsList, newTarget).
+
+ [[Construct]] ( argumentsList, newTarget )
+
+ [...]
+ 5. If kind is "base", then
+ a. Let thisArgument be ? OrdinaryCreateFromConstructor(newTarget, "%ObjectPrototype%").
+
+ OrdinaryCreateFromConstructor ( constructor, intrinsicDefaultProto [ , internalSlotsList ] )
+
+ [...]
+ 2. Let proto be ? GetPrototypeFromConstructor(constructor, intrinsicDefaultProto).
+ 3. Return ObjectCreate(proto, internalSlotsList).
+
+ GetPrototypeFromConstructor ( constructor, intrinsicDefaultProto )
+
+ [...]
+ 3. Let proto be ? Get(constructor, "prototype").
+ [...]
+ 5. Return proto.
+features: [cross-realm, Proxy, Reflect, Reflect.construct]
+---*/
+
+var other = $262.createRealm().global;
+var C = new other.Function();
+
+var P = new Proxy(function() {}, {});
+var p = Reflect.construct(P, [], C);
+
+assert.sameValue(Object.getPrototypeOf(p), C.prototype);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/Proxy/construct/trap-is-undefined-proto-from-newtarget-realm.js b/js/src/tests/test262/built-ins/Proxy/construct/trap-is-undefined-proto-from-newtarget-realm.js
new file mode 100644
index 0000000000..dd96640ce5
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Proxy/construct/trap-is-undefined-proto-from-newtarget-realm.js
@@ -0,0 +1,58 @@
+// Copyright (C) 2016 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+esid: sec-proxy-object-internal-methods-and-internal-slots-construct-argumentslist-newtarget
+description: >
+ If trap is undefined, propagate [[Construct]] to target,
+ passing correct newTarget parameter
+info: |
+ [[Construct]] ( argumentsList, newTarget )
+
+ [...]
+ 7. If trap is undefined, then
+ b. Return ? Construct(target, argumentsList, newTarget).
+
+ Construct ( F [ , argumentsList [ , newTarget ] ] )
+
+ [...]
+ 5. Return ? F.[[Construct]](argumentsList, newTarget).
+
+ [[Construct]] ( argumentsList, newTarget )
+
+ [...]
+ 5. If kind is "base", then
+ a. Let thisArgument be ? OrdinaryCreateFromConstructor(newTarget, "%ObjectPrototype%").
+
+ OrdinaryCreateFromConstructor ( constructor, intrinsicDefaultProto [ , internalSlotsList ] )
+
+ [...]
+ 2. Let proto be ? GetPrototypeFromConstructor(constructor, intrinsicDefaultProto).
+ 3. Return ObjectCreate(proto, internalSlotsList).
+
+ GetPrototypeFromConstructor ( constructor, intrinsicDefaultProto )
+
+ [...]
+ 3. Let proto be ? Get(constructor, "prototype").
+ 4. If Type(proto) is not Object, then
+ a. Let realm be ? GetFunctionRealm(constructor).
+ b. Set proto to realm's intrinsic object named intrinsicDefaultProto.
+ 5. Return proto.
+
+ GetFunctionRealm ( obj )
+
+ [...]
+ 2. If obj has a [[Realm]] internal slot, then
+ a. Return obj.[[Realm]].
+features: [cross-realm, Proxy, Reflect, Reflect.construct]
+---*/
+
+var other = $262.createRealm().global;
+var C = new other.Function();
+C.prototype = null;
+
+var P = new Proxy(function() {}, {});
+var p = Reflect.construct(P, [], C);
+
+assert.sameValue(Object.getPrototypeOf(p), other.Object.prototype);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/Proxy/construct/trap-is-undefined-target-is-proxy.js b/js/src/tests/test262/built-ins/Proxy/construct/trap-is-undefined-target-is-proxy.js
new file mode 100644
index 0000000000..068159253c
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Proxy/construct/trap-is-undefined-target-is-proxy.js
@@ -0,0 +1,48 @@
+// Copyright (C) 2020 Alexey Shvayka. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-proxy-object-internal-methods-and-internal-slots-construct-argumentslist-newtarget
+description: >
+ If "construct" trap is null or undefined, [[Construct]] call is
+ properly forwarded to [[ProxyTarget]] (which is also a Proxy object).
+info: |
+ [[Construct]] ( argumentsList, newTarget )
+
+ [...]
+ 4. Let target be O.[[ProxyTarget]].
+ 5. Assert: IsConstructor(target) is true.
+ 6. Let trap be ? GetMethod(handler, "construct").
+ 7. If trap is undefined, then
+ a. Return ? Construct(target, argumentsList, newTarget).
+features: [class, Proxy, Reflect, Reflect.construct]
+---*/
+
+class Foo {
+ constructor(a, b) {
+ this.sum = a + b;
+ }
+}
+
+var FooBound = Foo.bind(null, 1);
+var FooTarget = new Proxy(FooBound, {});
+var FooProxy = new Proxy(FooTarget, {
+ construct: undefined,
+});
+
+var foo = new FooBound(2);
+assert(foo instanceof Foo);
+assert.sameValue(foo.sum, 3);
+
+class Bar extends Foo {
+ get isBar() {
+ return true;
+ }
+}
+
+var bar = Reflect.construct(FooProxy, [3], Bar);
+assert(bar instanceof Bar);
+assert.sameValue(bar.sum, 4);
+assert(bar.isBar);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/Proxy/construct/trap-is-undefined.js b/js/src/tests/test262/built-ins/Proxy/construct/trap-is-undefined.js
new file mode 100644
index 0000000000..5682638564
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Proxy/construct/trap-is-undefined.js
@@ -0,0 +1,52 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-proxy-object-internal-methods-and-internal-slots-construct-argumentslist-newtarget
+description: >
+ If the construct trap value is undefined, propagate the construct to the target object.
+info: |
+ [[Construct]] (argumentsList, newTarget)
+
+ ...
+ 5. Let trap be ? GetMethod(handler, "construct").
+ 6. If trap is undefined, then
+ a. Assert: target has a [[Construct]] internal method.
+ b. Return ? Construct(target, argumentsList, newTarget).
+ ...
+
+ GetMethod ( V, P )
+
+ ...
+ 3. If func is either undefined or null, return undefined.
+ ...
+features: [Proxy, Reflect, Reflect.construct]
+---*/
+
+var calls = 0;
+var _NewTarget;
+
+var Target = new Proxy(function() {
+ throw new Test262Error('target should not be called');
+}, {
+ construct: function(_Target, args, NewTarget) {
+ calls += 1;
+ _NewTarget = NewTarget;
+ return {
+ sum: args[0] + args[1]
+ };
+ },
+});
+
+var P = new Proxy(Target, {
+ construct: undefined
+});
+
+var NewTarget = function() {};
+var obj = Reflect.construct(P, [3, 4], NewTarget);
+
+assert.sameValue(calls, 1, "construct is undefined: [[Construct]] is invoked once");
+assert.sameValue(_NewTarget, NewTarget, "construct is undefined: NewTarget is passed to [[Construct]]");
+assert.sameValue(obj.sum, 7, "construct is undefined: result of [[Construct]] is returned");
+
+reportCompare(0, 0);