v8/test/mjsunit/strong/class-object-frozen.js
conradw 24ec2a0baa [strong] Implement revised strong class semantics
Weak classes can inherit from strong ones again, a strong base class makes
instances strong.

BUG=v8:3956
LOG=N

Review URL: https://codereview.chromium.org/1347243004

Cr-Commit-Position: refs/heads/master@{#30867}
2015-09-22 16:34:52 +00:00

99 lines
2.4 KiB
JavaScript

// Copyright 2015 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: --strong-mode
"use strict";
function getClass() {
class Foo {
static get bar() { return 0 }
get bar() { return 0 }
}
return Foo;
}
function getClassExpr() {
return (class { static get bar() { return 0 } get bar() { return 0 } });
}
function getClassStrong() {
"use strong";
class Foo {
static get bar() { return 0 }
get bar() { return 0 }
}
return Foo;
}
function getClassExprStrong() {
"use strong";
return (class { static get bar() { return 0 } get bar() { return 0 } });
}
function addProperty(o) {
o.baz = 1;
}
function convertPropertyToData(o) {
assertTrue(o.hasOwnProperty("bar"));
Object.defineProperty(o, "bar", { value: 1 });
}
function testWeakClass(classFunc) {
assertDoesNotThrow(function(){addProperty(classFunc())});
assertDoesNotThrow(function(){addProperty(classFunc().prototype)});
assertDoesNotThrow(function(){convertPropertyToData(classFunc())});
assertDoesNotThrow(function(){convertPropertyToData(classFunc().prototype)});
}
function testStrongClass(classFunc) {
assertThrows(function(){addProperty(classFunc())}, TypeError);
assertThrows(function(){addProperty(classFunc().prototype)}, TypeError);
assertThrows(function(){convertPropertyToData(classFunc())}, TypeError);
assertThrows(function(){convertPropertyToData(classFunc().prototype)},
TypeError);
}
testWeakClass(getClass);
testWeakClass(getClassExpr);
testStrongClass(getClassStrong);
testStrongClass(getClassExprStrong);
// Check strong classes don't freeze their parents.
(function() {
let parent = getClass();
let classFunc = function() {
"use strong";
class Foo extends parent {
static get bar() { return 0 }
get bar() { return 0 }
}
return Foo;
}
testStrongClass(classFunc);
assertDoesNotThrow(function(){addProperty(parent)});
assertDoesNotThrow(function(){convertPropertyToData(parent)});
})();
// Check strong classes don't freeze their children.
(function() {
let parent = getClassStrong();
let classFunc = function() {
class Foo extends parent {
static get bar() { return 0 }
get bar() { return 0 }
}
return Foo;
}
assertThrows(function(){addProperty(parent)}, TypeError);
assertThrows(function(){convertPropertyToData(parent)}, TypeError);
testWeakClass(classFunc);
})();