diff options
Diffstat (limited to 'src/3rdparty/v8/test/mjsunit/compiler/inline-accessors.js')
-rw-r--r-- | src/3rdparty/v8/test/mjsunit/compiler/inline-accessors.js | 368 |
1 files changed, 368 insertions, 0 deletions
diff --git a/src/3rdparty/v8/test/mjsunit/compiler/inline-accessors.js b/src/3rdparty/v8/test/mjsunit/compiler/inline-accessors.js new file mode 100644 index 0000000..a4cf7ae --- /dev/null +++ b/src/3rdparty/v8/test/mjsunit/compiler/inline-accessors.js @@ -0,0 +1,368 @@ +// Copyright 2012 the V8 project authors. All rights reserved. +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Flags: --allow-natives-syntax --inline-accessors --max-opt-count=100 + +var accessorCallCount, setterArgument, setterValue, obj, forceDeopt; + +// ----------------------------------------------------------------------------- +// Helpers for testing inlining of getters. + +function TestInlinedGetter(context, obj, expected) { + forceDeopt = { deopt: 0 }; + accessorCallCount = 0; + + assertEquals(expected, context(obj)); + assertEquals(1, accessorCallCount); + + assertEquals(expected, context(obj)); + assertEquals(2, accessorCallCount); + + %OptimizeFunctionOnNextCall(context); + assertEquals(expected, context(obj)); + assertEquals(3, accessorCallCount); + + forceDeopt = { /* empty*/ }; + assertEquals(expected, context(obj)); + assertEquals(4, accessorCallCount); +} + + +function value_context_for_getter(obj) { + return obj.getterProperty; +} + +function test_context_for_getter(obj) { + if (obj.getterProperty) { + return 111; + } else { + return 222; + } +} + +function effect_context_for_getter(obj) { + obj.getterProperty; + return 5678; +} + +function TryGetter(context, getter, obj, expected, expectException) { + try { + TestInlinedGetter(context, obj, expected); + assertFalse(expectException); + } catch (exception) { + assertTrue(expectException); + assertEquals(7, exception.stack.split('\n').length); + } + %DeoptimizeFunction(context); + %ClearFunctionTypeFeedback(context); + %ClearFunctionTypeFeedback(getter); +} + +function TestGetterInAllContexts(getter, obj, expected, expectException) { + TryGetter(value_context_for_getter, getter, obj, expected, expectException); + TryGetter(test_context_for_getter, getter, obj, expected ? 111 : 222, + expectException); + TryGetter(effect_context_for_getter, getter, obj, 5678, expectException); +} + +// ----------------------------------------------------------------------------- +// Test getter returning something 'true'ish in all contexts. + +function getter1() { + assertSame(obj, this); + accessorCallCount++; + forceDeopt.deopt; + return 1234; +} + +function ConstrG1() { } +obj = Object.defineProperty(new ConstrG1(), "getterProperty", { get: getter1 }); +TestGetterInAllContexts(getter1, obj, 1234, false); +obj = Object.create(obj); +TestGetterInAllContexts(getter1, obj, 1234, false); + +// ----------------------------------------------------------------------------- +// Test getter returning false in all contexts. + +function getter2() { + assertSame(obj, this); + accessorCallCount++; + forceDeopt.deopt; + return false; +} + +function ConstrG2() { } +obj = Object.defineProperty(new ConstrG2(), "getterProperty", { get: getter2 }); +TestGetterInAllContexts(getter2, obj, false, false); +obj = Object.create(obj); +TestGetterInAllContexts(getter2, obj, false, false); + +// ----------------------------------------------------------------------------- +// Test getter without a return in all contexts. + +function getter3() { + assertSame(obj, this); + accessorCallCount++; + forceDeopt.deopt; +} + +function ConstrG3() { } +obj = Object.defineProperty(new ConstrG3(), "getterProperty", { get: getter3 }); +TestGetterInAllContexts(getter3, obj, undefined, false); +obj = Object.create(obj); +TestGetterInAllContexts(getter3, obj, undefined, false); + +// ----------------------------------------------------------------------------- +// Test getter with too many arguments without a return in all contexts. + +function getter4(a) { + assertSame(obj, this); + assertEquals(undefined, a); + accessorCallCount++; + forceDeopt.deopt; +} + +function ConstrG4() { } +obj = Object.defineProperty(new ConstrG4(), "getterProperty", { get: getter4 }); +TestGetterInAllContexts(getter4, obj, undefined, false); +obj = Object.create(obj); +TestGetterInAllContexts(getter4, obj, undefined, false); + +// ----------------------------------------------------------------------------- +// Test getter with too many arguments with a return in all contexts. + +function getter5(a) { + assertSame(obj, this); + assertEquals(undefined, a); + accessorCallCount++; + forceDeopt.deopt; + return 9876; +} + +function ConstrG5() { } +obj = Object.defineProperty(new ConstrG5(), "getterProperty", { get: getter5 }); +TestGetterInAllContexts(getter5, obj, 9876, false); +obj = Object.create(obj); +TestGetterInAllContexts(getter5, obj, 9876, false); + +// ----------------------------------------------------------------------------- +// Test getter which throws from optimized code. + +function getter6() { + assertSame(obj, this); + accessorCallCount++; + forceDeopt.deopt; + if (accessorCallCount == 4) { 123 in null; } + return 13579; +} + +function ConstrG6() { } +obj = Object.defineProperty(new ConstrG6(), "getterProperty", { get: getter6 }); +TestGetterInAllContexts(getter6, obj, 13579, true); +obj = Object.create(obj); +TestGetterInAllContexts(getter6, obj, 13579, true); + +// ----------------------------------------------------------------------------- +// Helpers for testing inlining of setters. + +function TestInlinedSetter(context, obj, value, expected) { + forceDeopt = { deopt: 0 }; + accessorCallCount = 0; + setterArgument = value; + + assertEquals(expected, context(obj, value)); + assertEquals(value, setterValue); + assertEquals(1, accessorCallCount); + + assertEquals(expected, context(obj, value)); + assertEquals(value, setterValue); + assertEquals(2, accessorCallCount); + + %OptimizeFunctionOnNextCall(context); + assertEquals(expected, context(obj, value)); + assertEquals(value, setterValue); + assertEquals(3, accessorCallCount); + + forceDeopt = { /* empty*/ }; + assertEquals(expected, context(obj, value)); + assertEquals(value, setterValue); + assertEquals(4, accessorCallCount); +} + +function value_context_for_setter(obj, value) { + return obj.setterProperty = value; +} + +function test_context_for_setter(obj, value) { + if (obj.setterProperty = value) { + return 333; + } else { + return 444; + } +} + +function effect_context_for_setter(obj, value) { + obj.setterProperty = value; + return 666; +} + +function TrySetter(context, setter, obj, expectException, value, expected) { + try { + TestInlinedSetter(context, obj, value, expected); + assertFalse(expectException); + } catch (exception) { + assertTrue(expectException); + assertEquals(7, exception.stack.split('\n').length); + } + %DeoptimizeFunction(context); + %ClearFunctionTypeFeedback(context); + %ClearFunctionTypeFeedback(setter); +} + +function TestSetterInAllContexts(setter, obj, expectException) { + TrySetter(value_context_for_setter, setter, obj, expectException, 111, 111); + TrySetter(test_context_for_setter, setter, obj, expectException, true, 333); + TrySetter(test_context_for_setter, setter, obj, expectException, false, 444); + TrySetter(effect_context_for_setter, setter, obj, expectException, 555, 666); +} + +// ----------------------------------------------------------------------------- +// Test setter without a return in all contexts. + +function setter1(value) { + assertSame(obj, this); + accessorCallCount++; + forceDeopt.deopt; + setterValue = value; +} + +function ConstrS1() { } +obj = Object.defineProperty(new ConstrS1(), "setterProperty", { set: setter1 }); +TestSetterInAllContexts(setter1, obj, false); +obj = Object.create(obj); +TestSetterInAllContexts(setter1, obj, false); + +// ----------------------------------------------------------------------------- +// Test setter returning something different than the RHS in all contexts. + +function setter2(value) { + assertSame(obj, this); + accessorCallCount++; + forceDeopt.deopt; + setterValue = value; + return 1000000; +} + +function ConstrS2() { } +obj = Object.defineProperty(new ConstrS2(), "setterProperty", { set: setter2 }); +TestSetterInAllContexts(setter2, obj, false); +obj = Object.create(obj); +TestSetterInAllContexts(setter2, obj, false); + +// ----------------------------------------------------------------------------- +// Test setter with too few arguments without a return in all contexts. + +function setter3() { + assertSame(obj, this); + accessorCallCount++; + forceDeopt.deopt; + setterValue = setterArgument; +} + +function ConstrS3() { } +obj = Object.defineProperty(new ConstrS3(), "setterProperty", { set: setter3 }); +TestSetterInAllContexts(setter3, obj, false); +obj = Object.create(obj); +TestSetterInAllContexts(setter3, obj, false); + +// ----------------------------------------------------------------------------- +// Test setter with too few arguments with a return in all contexts. + +function setter4() { + assertSame(obj, this); + accessorCallCount++; + forceDeopt.deopt; + setterValue = setterArgument; + return 2000000; +} + +function ConstrS4() { } +obj = Object.defineProperty(new ConstrS4(), "setterProperty", { set: setter4 }); +TestSetterInAllContexts(setter4, obj, false); +obj = Object.create(obj); +TestSetterInAllContexts(setter4, obj, false); + +// ----------------------------------------------------------------------------- +// Test setter with too many arguments without a return in all contexts. + +function setter5(value, foo) { + assertSame(obj, this); + assertEquals(undefined, foo); + accessorCallCount++; + forceDeopt.deopt; + setterValue = value; +} + +function ConstrS5() { } +obj = Object.defineProperty(new ConstrS5(), "setterProperty", { set: setter5 }); +TestSetterInAllContexts(setter5, obj, false); +obj = Object.create(obj); +TestSetterInAllContexts(setter5, obj, false); + +// ----------------------------------------------------------------------------- +// Test setter with too many arguments with a return in all contexts. + +function setter6(value, foo) { + assertSame(obj, this); + assertEquals(undefined, foo); + accessorCallCount++; + forceDeopt.deopt; + setterValue = value; + return 3000000; +} + +function ConstrS6() { } +obj = Object.defineProperty(new ConstrS6(), "setterProperty", { set: setter6 }); +TestSetterInAllContexts(setter6, obj, false); +obj = Object.create(obj); +TestSetterInAllContexts(setter6, obj, false); + +// ----------------------------------------------------------------------------- +// Test setter which throws from optimized code. + +function setter7(value) { + accessorCallCount++; + forceDeopt.deopt; + if (accessorCallCount == 4) { 123 in null; } + setterValue = value; +} + +function ConstrS7() { } +obj = Object.defineProperty(new ConstrS7(), "setterProperty", { set: setter7 }); +TestSetterInAllContexts(setter7, obj, true); +obj = Object.create(obj); +TestSetterInAllContexts(setter7, obj, true); |