// Copyright 2014 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Flags: --allow-natives-syntax (function TestThisAccessRestriction() { class Base {} (function() { class C extends Base { constructor() { var y; super(); } }; new C(); }()); assertThrows(function() { class C extends Base { constructor() { super(this.x); } }; new C(); }, ReferenceError); assertThrows(function() { class C extends Base { constructor() { super(this); } }; new C(); }, ReferenceError); assertThrows(function() { class C extends Base { constructor() { super.method(); super(this); } }; new C(); }, ReferenceError); assertThrows(function() { class C extends Base { constructor() { super(super.method()); } }; new C(); }, ReferenceError); assertThrows(function() { class C extends Base { constructor() { super(super()); } }; new C(); }, ReferenceError); assertThrows(function() { class C extends Base { constructor() { super(1, 2, Object.getPrototypeOf(this)); } }; new C(); }, ReferenceError); (function() { class C extends Base { constructor() { { super(1, 2); } } }; new C(); }()); (function() { class C extends Base { constructor() { if (1) super(); } }; new C(); }()); class C1 extends Object { constructor() { 'use strict'; super(); } }; new C1(); class C2 extends Object { constructor() { ; 'use strict';;;;; super(); } }; new C2(); class C3 extends Object { constructor() { ; 'use strict';;;;; // This is a comment. super(); } }; new C3(); }()); function testClassRestrictedProperties(C) { assertEquals(false, C.hasOwnProperty("arguments")); assertThrows(function() { return C.arguments; }, TypeError); assertThrows(function() { C.arguments = {}; }, TypeError); assertEquals(false, C.hasOwnProperty("caller")); assertThrows(function() { return C.caller; }, TypeError); assertThrows(function() { C.caller = {}; }, TypeError); assertEquals(false, (new C).method.hasOwnProperty("arguments")); assertThrows(function() { return new C().method.arguments; }, TypeError); assertThrows(function() { new C().method.arguments = {}; }, TypeError); assertEquals(false, (new C).method.hasOwnProperty("caller")); assertThrows(function() { return new C().method.caller; }, TypeError); assertThrows(function() { new C().method.caller = {}; }, TypeError); } (function testRestrictedPropertiesStrict() { "use strict"; class ClassWithDefaultConstructor { method() {} } class Class { constructor() {} method() {} } class DerivedClassWithDefaultConstructor extends Class {} class DerivedClass extends Class { constructor() { super(); } } testClassRestrictedProperties(ClassWithDefaultConstructor); testClassRestrictedProperties(Class); testClassRestrictedProperties(DerivedClassWithDefaultConstructor); testClassRestrictedProperties(DerivedClass); testClassRestrictedProperties(class { method() {} }); testClassRestrictedProperties(class { constructor() {} method() {} }); testClassRestrictedProperties(class extends Class { }); testClassRestrictedProperties( class extends Class { constructor() { super(); } }); })(); (function testRestrictedPropertiesSloppy() { class ClassWithDefaultConstructor { method() {} } class Class { constructor() {} method() {} } class DerivedClassWithDefaultConstructor extends Class {} class DerivedClass extends Class { constructor() { super(); } } testClassRestrictedProperties(ClassWithDefaultConstructor); testClassRestrictedProperties(Class); testClassRestrictedProperties(DerivedClassWithDefaultConstructor); testClassRestrictedProperties(DerivedClass); testClassRestrictedProperties(class { method() {} }); testClassRestrictedProperties(class { constructor() {} method() {} }); testClassRestrictedProperties(class extends Class { }); testClassRestrictedProperties( class extends Class { constructor() { super(); } }); })();