7a75d5828b
While working on crrev.com/c/1141045 I caused 3 assertThrows() tests under the 'Deeply nested target' tests to fail. The tests for defineProperty, isExtensible, and preventExtensions began to fail under a couple build configurations because my change modified the stack check code such that it no longer inhibited tail call optimization. Under some build configurations the methods responsible for causing a stack oveflow for those 3 methods were tail call optimized and the tests no longer threw an exception. Other built-in implementations of proxy handler methods could also fail in the future due to refactors moving variables off the stack. Change the test to ensure v8 doesn't crash but don't rely on stack overflow exceptions being thrown for the 'deeply nested target' test. BUG=chromium:864705 Change-Id: Iefeaa1d5402986c1831d0f259f83025452756387 Reviewed-on: https://chromium-review.googlesource.com/1159356 Reviewed-by: Georg Neis <neis@chromium.org> Commit-Queue: Georg Neis <neis@chromium.org> Cr-Commit-Position: refs/heads/master@{#54878}
52 lines
2.0 KiB
JavaScript
52 lines
2.0 KiB
JavaScript
// Copyright 2018 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.
|
|
|
|
|
|
// Deeply nested target.
|
|
|
|
let proxy = new Proxy(function(){}, {});
|
|
for (let i = 0; i < 100000; i++) {
|
|
proxy = new Proxy(proxy, {});
|
|
}
|
|
|
|
// Ensure these nested calls don't segfault. They may not all throw exceptions
|
|
// depending on whether the compiler is able to perform tail call optimization
|
|
// on the affected routines.
|
|
try { Reflect.apply(proxy, {}, []) } catch(_) {}
|
|
try { Reflect.construct(proxy, []) } catch(_) {}
|
|
try { Reflect.defineProperty(proxy, "x", {}) } catch(_) {}
|
|
try { Reflect.deleteProperty(proxy, "x") } catch(_) {}
|
|
try { Reflect.get(proxy, "x") } catch(_) {}
|
|
try { Reflect.getOwnPropertyDescriptor(proxy, "x") } catch(_) {}
|
|
try { Reflect.getPrototypeOf(proxy) } catch(_) {}
|
|
try { Reflect.has(proxy, "x") } catch(_) {}
|
|
try { Reflect.isExtensible(proxy) } catch(_) {}
|
|
try { Reflect.ownKeys(proxy) } catch(_) {}
|
|
try { Reflect.preventExtensions(proxy) } catch(_) {}
|
|
try { Reflect.setPrototypeOf(proxy, {}) } catch(_) {}
|
|
try { Reflect.set(proxy, "x", {}) } catch(_) {}
|
|
|
|
|
|
// Recursive handler.
|
|
|
|
function run(trap, ...args) {
|
|
let handler = {};
|
|
const proxy = new Proxy(function(){}, handler);
|
|
handler[trap] = (target, ...args) => Reflect[trap](proxy, ...args);
|
|
return Reflect[trap](proxy, ...args);
|
|
}
|
|
|
|
assertThrows(() => run("apply", {}, []), RangeError);
|
|
assertThrows(() => run("construct", []), RangeError);
|
|
assertThrows(() => run("defineProperty", "x", {}), RangeError);
|
|
assertThrows(() => run("deleteProperty", "x"), RangeError);
|
|
assertThrows(() => run("get", "x"), RangeError);
|
|
assertThrows(() => run("getOwnPropertyDescriptor", "x"), RangeError);
|
|
assertThrows(() => run("has", "x"), RangeError);
|
|
assertThrows(() => run("isExtensible"), RangeError);
|
|
assertThrows(() => run("ownKeys"), RangeError);
|
|
assertThrows(() => run("preventExtensions"), RangeError);
|
|
assertThrows(() => run("setPrototypeOf", {}), RangeError);
|
|
assertThrows(() => run("set", "x", {}), RangeError);
|