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