17d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// Copyright 2014 the V8 project authors. All rights reserved. 27d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// Use of this source code is governed by a BSD-style license that can be 37d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// found in the LICENSE file. 47d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 57d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/v8.h" 67d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 77d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "test/cctest/compiler/function-tester.h" 87d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 97d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgusing namespace v8::internal; 107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgusing namespace v8::internal::compiler; 117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(SimpleCall) { 137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FunctionTester T("(function(foo,a) { return foo(a); })"); 147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Handle<JSFunction> foo = T.NewFunction("(function(a) { return a; })"); 157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(T.Val(3), foo, T.Val(3)); 177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(T.Val(3.1), foo, T.Val(3.1)); 187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(foo, foo, foo); 197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(T.Val("Abba"), foo, T.Val("Abba")); 207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(SimpleCall2) { 247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FunctionTester T("(function(foo,a) { return foo(a); })"); 257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Handle<JSFunction> foo = T.NewFunction("(function(a) { return a; })"); 267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.Compile(foo); 277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(T.Val(3), foo, T.Val(3)); 297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(T.Val(3.1), foo, T.Val(3.1)); 307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(foo, foo, foo); 317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(T.Val("Abba"), foo, T.Val("Abba")); 327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(ConstCall) { 367d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FunctionTester T("(function(foo,a) { return foo(a,3); })"); 377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Handle<JSFunction> foo = T.NewFunction("(function(a,b) { return a + b; })"); 387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.Compile(foo); 397d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 407d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(T.Val(6), foo, T.Val(3)); 417d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(T.Val(6.1), foo, T.Val(3.1)); 427d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(T.Val("function (a,b) { return a + b; }3"), foo, foo); 437d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(T.Val("Abba3"), foo, T.Val("Abba")); 447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(ConstCall2) { 487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FunctionTester T("(function(foo,a) { return foo(a,\"3\"); })"); 497d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Handle<JSFunction> foo = T.NewFunction("(function(a,b) { return a + b; })"); 507d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.Compile(foo); 517d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(T.Val("33"), foo, T.Val(3)); 537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(T.Val("3.13"), foo, T.Val(3.1)); 547d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(T.Val("function (a,b) { return a + b; }3"), foo, foo); 557d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(T.Val("Abba3"), foo, T.Val("Abba")); 567d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 577d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 587d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 597d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(PropertyNamedCall) { 607d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FunctionTester T("(function(a,b) { return a.foo(b,23); })"); 617d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org CompileRun("function foo(y,z) { return this.x + y + z; }"); 627d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 637d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(T.Val(32), T.NewObject("({ foo:foo, x:4 })"), T.Val(5)); 647d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(T.Val("xy23"), T.NewObject("({ foo:foo, x:'x' })"), T.Val("y")); 657d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(T.nan(), T.NewObject("({ foo:foo, y:0 })"), T.Val(3)); 667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 677d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 687d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 697d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(PropertyKeyedCall) { 707d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FunctionTester T("(function(a,b) { var f = 'foo'; return a[f](b,23); })"); 717d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org CompileRun("function foo(y,z) { return this.x + y + z; }"); 727d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 737d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(T.Val(32), T.NewObject("({ foo:foo, x:4 })"), T.Val(5)); 747d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(T.Val("xy23"), T.NewObject("({ foo:foo, x:'x' })"), T.Val("y")); 757d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(T.nan(), T.NewObject("({ foo:foo, y:0 })"), T.Val(3)); 767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 777d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 787d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 797d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(GlobalCall) { 807d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FunctionTester T("(function(a,b) { return foo(a,b); })"); 817d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org CompileRun("function foo(a,b) { return a + b + this.c; }"); 827d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org CompileRun("var c = 23;"); 837d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 847d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(T.Val(32), T.Val(4), T.Val(5)); 857d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(T.Val("xy23"), T.Val("x"), T.Val("y")); 867d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(T.nan(), T.undefined(), T.Val(3)); 877d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 887d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 897d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 907d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(LookupCall) { 917d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FunctionTester T("(function(a,b) { with (a) { return foo(a,b); } })"); 927d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 937d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org CompileRun("function f1(a,b) { return a.val + b; }"); 947d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(T.Val(5), T.NewObject("({ foo:f1, val:2 })"), T.Val(3)); 957d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(T.Val("xy"), T.NewObject("({ foo:f1, val:'x' })"), T.Val("y")); 967d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 977d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org CompileRun("function f2(a,b) { return this.val + b; }"); 987d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(T.Val(9), T.NewObject("({ foo:f2, val:4 })"), T.Val(5)); 997d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(T.Val("xy"), T.NewObject("({ foo:f2, val:'x' })"), T.Val("y")); 1007d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 1017d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 1027d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 1037d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(MismatchCallTooFew) { 1047d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FunctionTester T("(function(a,b) { return foo(a,b); })"); 1057d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org CompileRun("function foo(a,b,c) { return a + b + c; }"); 1067d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 1077d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(T.nan(), T.Val(23), T.Val(42)); 1087d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(T.nan(), T.Val(4.2), T.Val(2.3)); 1097d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(T.Val("abundefined"), T.Val("a"), T.Val("b")); 1107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 1117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 1127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 1137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(MismatchCallTooMany) { 1147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FunctionTester T("(function(a,b) { return foo(a,b); })"); 1157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org CompileRun("function foo(a) { return a; }"); 1167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 1177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(T.Val(23), T.Val(23), T.Val(42)); 1187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(T.Val(4.2), T.Val(4.2), T.Val(2.3)); 1197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(T.Val("a"), T.Val("a"), T.Val("b")); 1207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 1217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 1227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 1237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(ConstructorCall) { 1247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FunctionTester T("(function(a,b) { return new foo(a,b).value; })"); 1257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org CompileRun("function foo(a,b) { return { value: a + b + this.c }; }"); 1267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org CompileRun("foo.prototype.c = 23;"); 1277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 1287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(T.Val(32), T.Val(4), T.Val(5)); 1297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(T.Val("xy23"), T.Val("x"), T.Val("y")); 1307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(T.nan(), T.undefined(), T.Val(3)); 1317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 1327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 1337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 1347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// TODO(titzer): factor these out into test-runtime-calls.cc 1357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(RuntimeCallCPP1) { 1367d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FLAG_allow_natives_syntax = true; 1377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FunctionTester T("(function(a) { return %ToBool(a); })"); 1387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 1397d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(T.true_value(), T.Val(23), T.undefined()); 1407d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(T.true_value(), T.Val(4.2), T.undefined()); 1417d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(T.true_value(), T.Val("str"), T.undefined()); 1427d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(T.true_value(), T.true_value(), T.undefined()); 1437d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(T.false_value(), T.false_value(), T.undefined()); 1447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(T.false_value(), T.undefined(), T.undefined()); 1457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(T.false_value(), T.Val(0.0), T.undefined()); 1467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 1477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 1487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 1497d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(RuntimeCallCPP2) { 1507d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FLAG_allow_natives_syntax = true; 1517d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FunctionTester T("(function(a,b) { return %NumberAdd(a, b); })"); 1527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 1537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(T.Val(65), T.Val(42), T.Val(23)); 1547d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(T.Val(19), T.Val(42), T.Val(-23)); 1557d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(T.Val(6.5), T.Val(4.2), T.Val(2.3)); 1567d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 1577d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 1587d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 1597d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(RuntimeCallJS) { 1607d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FLAG_allow_natives_syntax = true; 1617d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FunctionTester T("(function(a) { return %ToString(a); })"); 1627d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 1637d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(T.Val("23"), T.Val(23), T.undefined()); 1647d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(T.Val("4.2"), T.Val(4.2), T.undefined()); 1657d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(T.Val("str"), T.Val("str"), T.undefined()); 1667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(T.Val("true"), T.true_value(), T.undefined()); 1677d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(T.Val("false"), T.false_value(), T.undefined()); 1687d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(T.Val("undefined"), T.undefined(), T.undefined()); 1697d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 1707d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 1717d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 1727d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(RuntimeCallInline) { 1737d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FLAG_allow_natives_syntax = true; 1747d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FunctionTester T("(function(a) { return %_IsObject(a); })"); 1757d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 1767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(T.false_value(), T.Val(23), T.undefined()); 1777d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(T.false_value(), T.Val(4.2), T.undefined()); 1787d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(T.false_value(), T.Val("str"), T.undefined()); 1797d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(T.false_value(), T.true_value(), T.undefined()); 1807d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(T.false_value(), T.false_value(), T.undefined()); 1817d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(T.false_value(), T.undefined(), T.undefined()); 1827d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(T.true_value(), T.NewObject("({})"), T.undefined()); 1837d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(T.true_value(), T.NewObject("([])"), T.undefined()); 1847d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 1857d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 1867d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 1877d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(RuntimeCallBooleanize) { 1887d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // TODO(turbofan): %Booleanize will disappear, don't hesitate to remove this 1897d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // test case, two-argument case is covered by the above test already. 1907d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FLAG_allow_natives_syntax = true; 1917d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FunctionTester T("(function(a,b) { return %Booleanize(a, b); })"); 1927d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 1937d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(T.true_value(), T.Val(-1), T.Val(Token::LT)); 1947d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(T.false_value(), T.Val(-1), T.Val(Token::EQ)); 1957d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(T.false_value(), T.Val(-1), T.Val(Token::GT)); 1967d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 1977d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(T.false_value(), T.Val(0.0), T.Val(Token::LT)); 1987d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(T.true_value(), T.Val(0.0), T.Val(Token::EQ)); 1997d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(T.false_value(), T.Val(0.0), T.Val(Token::GT)); 2007d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 2017d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(T.false_value(), T.Val(1), T.Val(Token::LT)); 2027d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(T.false_value(), T.Val(1), T.Val(Token::EQ)); 2037d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(T.true_value(), T.Val(1), T.Val(Token::GT)); 2047d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 2057d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 2067d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 2077d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(EvalCall) { 2087d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FunctionTester T("(function(a,b) { return eval(a); })"); 2097d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Handle<JSObject> g(T.function->context()->global_object()->global_proxy()); 2107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 2117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(T.Val(23), T.Val("17 + 6"), T.undefined()); 2127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(T.Val("'Y'; a"), T.Val("'Y'; a"), T.Val("b-val")); 2137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(T.Val("b-val"), T.Val("'Y'; b"), T.Val("b-val")); 2147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(g, T.Val("this"), T.undefined()); 2157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(g, T.Val("'use strict'; this"), T.undefined()); 2167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 2177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org CompileRun("eval = function(x) { return x; }"); 2187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(T.Val("17 + 6"), T.Val("17 + 6"), T.undefined()); 2197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 2207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org CompileRun("eval = function(x) { return this; }"); 2217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(g, T.Val("17 + 6"), T.undefined()); 2227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 2237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org CompileRun("eval = function(x) { 'use strict'; return this; }"); 2247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(T.undefined(), T.Val("17 + 6"), T.undefined()); 2257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 2267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 2277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 2287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(ReceiverPatching) { 2297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // TODO(turbofan): Note that this test only checks that the function prologue 2307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // patches an undefined receiver to the global receiver. If this starts to 2317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // fail once we fix the calling protocol, just remove this test. 2327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FunctionTester T("(function(a) { return this; })"); 2337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Handle<JSObject> g(T.function->context()->global_object()->global_proxy()); 2347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(g, T.undefined()); 2357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 2365e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org 2375e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org 2385e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgTEST(CallEval) { 2395e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org FunctionTester T( 2405e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org "var x = 42;" 2415e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org "(function () {" 2425e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org "function bar() { return eval('x') };" 2435e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org "return bar;" 2445e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org "})();"); 2455e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org 2465e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org T.CheckCall(T.Val(42), T.Val("x"), T.undefined()); 2475e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org} 248a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org 249a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org 250a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.orgTEST(ContextLoadedFromActivation) { 251a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org const char* script = 252a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org "var x = 42;" 253a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org "(function() {" 254a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org " return function () { return x };" 255a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org "})()"; 256a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org 257a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org // Disable context specialization. 258c714f377950c6a8a80b90ddca93ad8bd23ce362amachenbach@chromium.org FunctionTester T(script); 259a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org v8::Local<v8::Context> context = v8::Context::New(CcTest::isolate()); 260a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org v8::Context::Scope scope(context); 261a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org v8::Local<v8::Value> value = CompileRun(script); 262a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org i::Handle<i::Object> ofun = v8::Utils::OpenHandle(*value); 263a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org i::Handle<i::JSFunction> jsfun = Handle<JSFunction>::cast(ofun); 264a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org jsfun->set_code(T.function->code()); 265a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org context->Global()->Set(v8_str("foo"), v8::Utils::ToLocal(jsfun)); 266a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org CompileRun("var x = 24;"); 267a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org ExpectInt32("foo();", 24); 268a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org} 269a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org 270a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org 271a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.orgTEST(BuiltinLoadedFromActivation) { 272a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org const char* script = 273a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org "var x = 42;" 274a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org "(function() {" 275a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org " return function () { return this; };" 276a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org "})()"; 277a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org 278a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org // Disable context specialization. 279c714f377950c6a8a80b90ddca93ad8bd23ce362amachenbach@chromium.org FunctionTester T(script); 280a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org v8::Local<v8::Context> context = v8::Context::New(CcTest::isolate()); 281a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org v8::Context::Scope scope(context); 282a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org v8::Local<v8::Value> value = CompileRun(script); 283a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org i::Handle<i::Object> ofun = v8::Utils::OpenHandle(*value); 284a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org i::Handle<i::JSFunction> jsfun = Handle<JSFunction>::cast(ofun); 285a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org jsfun->set_code(T.function->code()); 286a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org context->Global()->Set(v8_str("foo"), v8::Utils::ToLocal(jsfun)); 287a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org CompileRun("var x = 24;"); 288a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org ExpectObject("foo()", context->Global()); 289a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org} 290