From 5f72593d166e1d604d6061573bd220da5ce64db4 Mon Sep 17 00:00:00 2001 From: arv Date: Thu, 11 Jun 2015 14:24:31 -0700 Subject: [PATCH] [es6] Make sure we call add property when adding a new property When setting a property using `super.prop = val` we need to use add property if we are adding a new property and not set property. BUG=493566 LOG=N R=verwaest@chromium.org, dslomov@chromium.org Review URL: https://codereview.chromium.org/1161073002 Cr-Commit-Position: refs/heads/master@{#28971} --- test/mjsunit/es6/regress/regress-cr493566.js | 80 ++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 test/mjsunit/es6/regress/regress-cr493566.js diff --git a/test/mjsunit/es6/regress/regress-cr493566.js b/test/mjsunit/es6/regress/regress-cr493566.js new file mode 100644 index 0000000..9bb313f --- /dev/null +++ b/test/mjsunit/es6/regress/regress-cr493566.js @@ -0,0 +1,80 @@ +// 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: --harmony-proxies + +"use strict"; + + +var global = this; + + +(function TestGlobalReceiver() { + class A { + s() { + super.bla = 10; + } + } + new A().s.call(global); + assertEquals(10, global.bla); +})(); + + +(function TestProxyProto() { + var calls = 0; + var handler = { + getPropertyDescriptor: function(name) { + calls++; + return undefined; + } + }; + + var proto = {}; + var proxy = Proxy.create(handler, proto); + var object = { + __proto__: proxy, + setX(v) { + super.x = v; + }, + setSymbol(sym, v) { + super[sym] = v; + } + }; + + object.setX(1); + assertEquals(1, Object.getOwnPropertyDescriptor(object, 'x').value); + assertEquals(1, calls); + + var sym = Symbol(); + object.setSymbol.call(global, sym, 2); + assertEquals(2, Object.getOwnPropertyDescriptor(global, sym).value); + // We currently do not invoke proxy traps for symbols + assertEquals(1, calls); +})(); + + +(function TestProxyReceiver() { + var object = { + setY(v) { + super.y = v; + } + }; + + var calls = 0; + var handler = { + getPropertyDescriptor(name) { + assertUnreachable(); + }, + set(receiver, name, value) { + calls++; + assertEquals(proxy, receiver); + assertEquals('y', name); + assertEquals(3, value); + } + }; + + var proxy = Proxy.create(handler); + object.setY.call(proxy, 3); + assertEquals(1, calls); +})(); -- 2.7.4