1659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org// Copyright 2012 the V8 project authors. All rights reserved.
29a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Redistribution and use in source and binary forms, with or without
39a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// modification, are permitted provided that the following conditions are
49a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// met:
59a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//
69a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//     * Redistributions of source code must retain the above copyright
79a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//       notice, this list of conditions and the following disclaimer.
89a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//     * Redistributions in binary form must reproduce the above
99a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//       copyright notice, this list of conditions and the following
109a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//       disclaimer in the documentation and/or other materials provided
119a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//       with the distribution.
129a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//     * Neither the name of Google Inc. nor the names of its
139a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//       contributors may be used to endorse or promote products derived
149a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//       from this software without specific prior written permission.
159a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//
169a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
179a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
189a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
199a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
209a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
219a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
229a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
239a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
249a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
259a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
269a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
279a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
289a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include <stdlib.h>
29486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org#include <wchar.h>
309a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
31196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/v8.h"
329a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
33196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/compiler.h"
34196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/disasm.h"
35196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "test/cctest/cctest.h"
369a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
379a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comusing namespace v8::internal;
389a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
395b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.orgstatic Handle<Object> GetGlobalProperty(const char* name) {
40528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
412ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  return Object::GetProperty(
429fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org      isolate, isolate->global_object(), name).ToHandleChecked();
439a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
449a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
459a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
469a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comstatic void SetGlobalProperty(const char* name, Object* value) {
47528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
4809d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  Handle<Object> object(value, isolate);
494a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org  Handle<String> internalized_name =
504a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org      isolate->factory()->InternalizeUtf8String(name);
5109d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  Handle<JSObject> global(isolate->context()->global_object());
52e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  Runtime::SetObjectProperty(isolate, global, internalized_name, object, NONE,
538f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org                             SLOPPY).Check();
549a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
559a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
569a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
579a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comstatic Handle<JSFunction> Compile(const char* source) {
58528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
598496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org  Handle<String> source_code = isolate->factory()->NewStringFromUtf8(
608496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org      CStrVector(source)).ToHandleChecked();
615d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org  Handle<SharedFunctionInfo> shared_function =
624954674151afa960af66efb4831df06bde727333yangguo@chromium.org      Compiler::CompileScript(source_code,
634954674151afa960af66efb4831df06bde727333yangguo@chromium.org                              Handle<String>(),
644954674151afa960af66efb4831df06bde727333yangguo@chromium.org                              0,
654954674151afa960af66efb4831df06bde727333yangguo@chromium.org                              0,
664954674151afa960af66efb4831df06bde727333yangguo@chromium.org                              false,
674954674151afa960af66efb4831df06bde727333yangguo@chromium.org                              Handle<Context>(isolate->native_context()),
6869f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org                              NULL, NULL, NO_CACHED_DATA,
694954674151afa960af66efb4831df06bde727333yangguo@chromium.org                              NOT_NATIVES_CODE);
70d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  return isolate->factory()->NewFunctionFromSharedFunctionInfo(
71d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org      shared_function, isolate->native_context());
729a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
739a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
749a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
752c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.orgstatic double Inc(Isolate* isolate, int x) {
769a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  const char* source = "result = %d + 1;";
77b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org  EmbeddedVector<char, 512> buffer;
7870ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org  SNPrintF(buffer, source, x);
799a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
80b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org  Handle<JSFunction> fun = Compile(buffer.start());
819a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  if (fun.is_null()) return -1;
829a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
832c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org  Handle<JSObject> global(isolate->context()->global_object());
842ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  Execution::Call(isolate, fun, global, 0, NULL).Check();
855b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  return GetGlobalProperty("result")->Number();
869a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
879a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
889a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
899a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(Inc) {
90e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
91e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
922c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org  CHECK_EQ(4.0, Inc(CcTest::i_isolate(), 3));
939a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
949a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
959a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
962c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.orgstatic double Add(Isolate* isolate, int x, int y) {
979a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  Handle<JSFunction> fun = Compile("result = x + y;");
989a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  if (fun.is_null()) return -1;
999a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1009a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  SetGlobalProperty("x", Smi::FromInt(x));
1019a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  SetGlobalProperty("y", Smi::FromInt(y));
1022c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org  Handle<JSObject> global(isolate->context()->global_object());
1032ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  Execution::Call(isolate, fun, global, 0, NULL).Check();
1045b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  return GetGlobalProperty("result")->Number();
1059a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
1069a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1079a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1089a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(Add) {
109e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
110e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
1112c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org  CHECK_EQ(5.0, Add(CcTest::i_isolate(), 2, 3));
1129a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
1139a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1149a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1152c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.orgstatic double Abs(Isolate* isolate, int x) {
1169a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  Handle<JSFunction> fun = Compile("if (x < 0) result = -x; else result = x;");
1179a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  if (fun.is_null()) return -1;
1189a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1199a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  SetGlobalProperty("x", Smi::FromInt(x));
1202c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org  Handle<JSObject> global(isolate->context()->global_object());
1212ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  Execution::Call(isolate, fun, global, 0, NULL).Check();
1225b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  return GetGlobalProperty("result")->Number();
1239a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
1249a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1259a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1269a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(Abs) {
127e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
128e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
1292c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org  CHECK_EQ(3.0, Abs(CcTest::i_isolate(), -3));
1309a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
1319a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1329a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1332c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.orgstatic double Sum(Isolate* isolate, int n) {
1349a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  Handle<JSFunction> fun =
1359a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com      Compile("s = 0; while (n > 0) { s += n; n -= 1; }; result = s;");
1369a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  if (fun.is_null()) return -1;
1379a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1389a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  SetGlobalProperty("n", Smi::FromInt(n));
1392c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org  Handle<JSObject> global(isolate->context()->global_object());
1402ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  Execution::Call(isolate, fun, global, 0, NULL).Check();
1415b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  return GetGlobalProperty("result")->Number();
1429a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
1439a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1449a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1459a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(Sum) {
146e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
147e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
1482c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org  CHECK_EQ(5050.0, Sum(CcTest::i_isolate(), 100));
1499a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
1509a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1519a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1529a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(Print) {
153e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
154528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  v8::Local<v8::Context> context = CcTest::NewContext(PRINT_EXTENSION);
155528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  v8::Context::Scope context_scope(context);
1569a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  const char* source = "for (n = 0; n < 100; ++n) print(n, 1, 2);";
1579a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  Handle<JSFunction> fun = Compile(source);
1589a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  if (fun.is_null()) return;
1592c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org  Handle<JSObject> global(CcTest::i_isolate()->context()->global_object());
1602ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  Execution::Call(CcTest::i_isolate(), fun, global, 0, NULL).Check();
1619a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
1629a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1639a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1649a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// The following test method stems from my coding efforts today. It
1659a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// tests all the functionality I have added to the compiler today
1669a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(Stuff) {
167e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
168e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
1699a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  const char* source =
1709a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    "r = 0;\n"
1719a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    "a = new Object;\n"
1729a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    "if (a == a) r+=1;\n"  // 1
1739a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    "if (a != new Object()) r+=2;\n"  // 2
1749a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    "a.x = 42;\n"
1759a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    "if (a.x == 42) r+=4;\n"  // 4
1769a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    "function foo() { var x = 87; return x; }\n"
1779a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    "if (foo() == 87) r+=8;\n"  // 8
1789a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    "function bar() { var x; x = 99; return x; }\n"
1799a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    "if (bar() == 99) r+=16;\n"  // 16
1809a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    "function baz() { var x = 1, y, z = 2; y = 3; return x + y + z; }\n"
1819a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    "if (baz() == 6) r+=32;\n"  // 32
1829a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    "function Cons0() { this.x = 42; this.y = 87; }\n"
1839a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    "if (new Cons0().x == 42) r+=64;\n"  // 64
1849a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    "if (new Cons0().y == 87) r+=128;\n"  // 128
1859a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    "function Cons2(x, y) { this.sum = x + y; }\n"
1869a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    "if (new Cons2(3,4).sum == 7) r+=256;";  // 256
1879a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1889a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  Handle<JSFunction> fun = Compile(source);
1899a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(!fun.is_null());
1902c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org  Handle<JSObject> global(CcTest::i_isolate()->context()->global_object());
1912c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org  Execution::Call(
1922ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org      CcTest::i_isolate(), fun, global, 0, NULL).Check();
1935b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  CHECK_EQ(511.0, GetGlobalProperty("r")->Number());
1949a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
1959a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1969a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1979a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(UncaughtThrow) {
198e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
199e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
2009a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2019a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  const char* source = "throw 42;";
2029a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  Handle<JSFunction> fun = Compile(source);
2039a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(!fun.is_null());
20409d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  Isolate* isolate = fun->GetIsolate();
20509d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  Handle<JSObject> global(isolate->context()->global_object());
2062ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  CHECK(Execution::Call(isolate, fun, global, 0, NULL).is_null());
2079e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org  CHECK_EQ(42.0, isolate->pending_exception()->Number());
2089a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
2099a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2109a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2119a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Tests calling a builtin function from C/C++ code, and the builtin function
2129a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// performs GC. It creates a stack frame looks like following:
2139a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//   | C (PerformGC) |
2149a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//   |   JS-to-C     |
2159a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//   |      JS       |
2169a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//   |   C-to-JS     |
2179a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(C2JSFrames) {
218c8cbc43a1fd5fda5d6a1e172f720cbd1215157c8machenbach@chromium.org  FLAG_expose_gc = true;
219e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
220528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  v8::Local<v8::Context> context =
221528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    CcTest::NewContext(PRINT_EXTENSION | GC_EXTENSION);
222528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  v8::Context::Scope context_scope(context);
2239a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2249a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  const char* source = "function foo(a) { gc(), print(a); }";
2259a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2269a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  Handle<JSFunction> fun0 = Compile(source);
2279a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(!fun0.is_null());
22809d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  Isolate* isolate = fun0->GetIsolate();
2299a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2309a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // Run the generated code to populate the global object with 'foo'.
2312c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org  Handle<JSObject> global(isolate->context()->global_object());
2322ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  Execution::Call(isolate, fun0, global, 0, NULL).Check();
2339a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2345b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  Handle<String> foo_string = isolate->factory()->InternalizeOneByteString(
2355b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org      STATIC_ASCII_VECTOR("foo"));
2365b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  Handle<Object> fun1 = Object::GetProperty(
2372ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org      isolate->global_object(), foo_string).ToHandleChecked();
2389a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(fun1->IsJSFunction());
2399a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
240d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Handle<Object> argv[] = { isolate->factory()->InternalizeOneByteString(
241d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org      STATIC_ASCII_VECTOR("hello")) };
2422c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org  Execution::Call(isolate,
2432c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org                  Handle<JSFunction>::cast(fun1),
244a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org                  global,
245a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org                  ARRAY_SIZE(argv),
2462ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org                  argv).Check();
2479a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
248381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org
249381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org
250381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org// Regression 236. Calling InitLineEnds on a Script with undefined
251381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org// source resulted in crash.
252381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.orgTEST(Regression236) {
253e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
254528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
255d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Factory* factory = isolate->factory();
256e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
257381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org
258d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Handle<Script> script = factory->NewScript(factory->empty_string());
259528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  script->set_source(CcTest::heap()->undefined_value());
2609fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  CHECK_EQ(-1, Script::GetLineNumber(script, 0));
2619fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  CHECK_EQ(-1, Script::GetLineNumber(script, 100));
2629fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  CHECK_EQ(-1, Script::GetLineNumber(script, -1));
263381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org}
2645c838251403b0be9a882540f1922577abba4c872ager@chromium.org
2655c838251403b0be9a882540f1922577abba4c872ager@chromium.org
2665c838251403b0be9a882540f1922577abba4c872ager@chromium.orgTEST(GetScriptLineNumber) {
267528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  LocalContext context;
268e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
269f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org  v8::ScriptOrigin origin =
270f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org      v8::ScriptOrigin(v8::String::NewFromUtf8(CcTest::isolate(), "test"));
2715c838251403b0be9a882540f1922577abba4c872ager@chromium.org  const char function_f[] = "function f() {}";
2725c838251403b0be9a882540f1922577abba4c872ager@chromium.org  const int max_rows = 1000;
2735c838251403b0be9a882540f1922577abba4c872ager@chromium.org  const int buffer_size = max_rows + sizeof(function_f);
2745c838251403b0be9a882540f1922577abba4c872ager@chromium.org  ScopedVector<char> buffer(buffer_size);
2755c838251403b0be9a882540f1922577abba4c872ager@chromium.org  memset(buffer.start(), '\n', buffer_size - 1);
2765c838251403b0be9a882540f1922577abba4c872ager@chromium.org  buffer[buffer_size - 1] = '\0';
2775c838251403b0be9a882540f1922577abba4c872ager@chromium.org
2785c838251403b0be9a882540f1922577abba4c872ager@chromium.org  for (int i = 0; i < max_rows; ++i) {
2795c838251403b0be9a882540f1922577abba4c872ager@chromium.org    if (i > 0)
2805c838251403b0be9a882540f1922577abba4c872ager@chromium.org      buffer[i - 1] = '\n';
281d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    MemCopy(&buffer[i], function_f, sizeof(function_f) - 1);
282f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org    v8::Handle<v8::String> script_body =
283f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org        v8::String::NewFromUtf8(CcTest::isolate(), buffer.start());
2845c838251403b0be9a882540f1922577abba4c872ager@chromium.org    v8::Script::Compile(script_body, &origin)->Run();
285f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org    v8::Local<v8::Function> f =
286f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org        v8::Local<v8::Function>::Cast(context->Global()->Get(
287f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org            v8::String::NewFromUtf8(CcTest::isolate(), "f")));
2885c838251403b0be9a882540f1922577abba4c872ager@chromium.org    CHECK_EQ(i, f->GetScriptLineNumber());
2895c838251403b0be9a882540f1922577abba4c872ager@chromium.org  }
2905c838251403b0be9a882540f1922577abba4c872ager@chromium.org}
2917304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org
2927304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org
293a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.orgTEST(FeedbackVectorPreservedAcrossRecompiles) {
294a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  if (i::FLAG_always_opt || !i::FLAG_crankshaft) return;
295a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  i::FLAG_allow_natives_syntax = true;
296a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  CcTest::InitializeVM();
297a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  if (!CcTest::i_isolate()->use_crankshaft()) return;
298a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  v8::HandleScope scope(CcTest::isolate());
299a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org
300a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  // Make sure function f has a call that uses a type feedback slot.
301a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  CompileRun("function fun() {};"
302a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org             "fun1 = fun;"
303a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org             "function f(a) { a(); } f(fun1);");
304a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org
305a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  Handle<JSFunction> f =
306a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org      v8::Utils::OpenHandle(
307a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org          *v8::Handle<v8::Function>::Cast(
308a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org              CcTest::global()->Get(v8_str("f"))));
309a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org
310a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  // We shouldn't have deoptimization support. We want to recompile and
311a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  // verify that our feedback vector preserves information.
312a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  CHECK(!f->shared()->has_deoptimization_support());
313a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  Handle<FixedArray> feedback_vector(f->shared()->feedback_vector());
314a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org
315a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  // Verify that we gathered feedback.
316a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  CHECK_EQ(1, feedback_vector->length());
317a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  CHECK(feedback_vector->get(0)->IsJSFunction());
318a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org
319a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  CompileRun("%OptimizeFunctionOnNextCall(f); f(fun1);");
320a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org
321a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  // Verify that the feedback is still "gathered" despite a recompilation
322a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  // of the full code.
323a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  CHECK(f->IsOptimized());
324a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  CHECK(f->shared()->has_deoptimization_support());
325a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  CHECK(f->shared()->feedback_vector()->get(0)->IsJSFunction());
326a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org}
327a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org
328a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org
329a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.orgTEST(FeedbackVectorUnaffectedByScopeChanges) {
330a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  if (i::FLAG_always_opt || !i::FLAG_lazy) return;
331a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  CcTest::InitializeVM();
332a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  v8::HandleScope scope(CcTest::isolate());
333a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org
334a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  CompileRun("function builder() {"
335a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org             "  call_target = function() { return 3; };"
336a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org             "  return (function() {"
337a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org             "    eval('');"
338a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org             "    return function() {"
339a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org             "      'use strict';"
340a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org             "      call_target();"
341a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org             "    }"
342a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org             "  })();"
343a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org             "}"
344a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org             "morphing_call = builder();");
345a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org
346a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  Handle<JSFunction> f =
347a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org      v8::Utils::OpenHandle(
348a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org          *v8::Handle<v8::Function>::Cast(
349a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org              CcTest::global()->Get(v8_str("morphing_call"))));
350a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org
351a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  // morphing_call should have one feedback vector slot for the call to
352a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  // call_target().
353a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  CHECK_EQ(1, f->shared()->feedback_vector()->length());
354a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  // And yet it's not compiled.
355a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  CHECK(!f->shared()->is_compiled());
356a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org
357a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  CompileRun("morphing_call();");
358a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org
359a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  // The vector should have the same size despite the new scoping.
360a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  CHECK_EQ(1, f->shared()->feedback_vector()->length());
361a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  CHECK(f->shared()->is_compiled());
362a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org}
363a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org
364a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org
3655a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org// Test that optimized code for different closures is actually shared
3665a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org// immediately by the FastNewClosureStub when run in the same context.
3675a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.orgTEST(OptimizedCodeSharing) {
368de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org  // Skip test if --cache-optimized-code is not activated by default because
369de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org  // FastNewClosureStub that is baked into the snapshot is incorrect.
370de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org  if (!FLAG_cache_optimized_code) return;
3711510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  FLAG_stress_compaction = false;
3725a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  FLAG_allow_natives_syntax = true;
373e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
374e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
3755a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  for (int i = 0; i < 10; i++) {
3765a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org    LocalContext env;
377f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org    env->Global()->Set(v8::String::NewFromUtf8(CcTest::isolate(), "x"),
3780f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org                       v8::Integer::New(CcTest::isolate(), i));
3795a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org    CompileRun("function MakeClosure() {"
3805a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org               "  return function() { return x; };"
3815a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org               "}"
3825a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org               "var closure0 = MakeClosure();"
3835a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org               "%DebugPrint(closure0());"
3845a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org               "%OptimizeFunctionOnNextCall(closure0);"
3855a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org               "%DebugPrint(closure0());"
3865a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org               "var closure1 = MakeClosure();"
3875a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org               "var closure2 = MakeClosure();");
3885a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org    Handle<JSFunction> fun1 = v8::Utils::OpenHandle(
3895a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org        *v8::Local<v8::Function>::Cast(env->Global()->Get(v8_str("closure1"))));
3905a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org    Handle<JSFunction> fun2 = v8::Utils::OpenHandle(
3915a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org        *v8::Local<v8::Function>::Cast(env->Global()->Get(v8_str("closure2"))));
392c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org    CHECK(fun1->IsOptimized()
393c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org          || !CcTest::i_isolate()->use_crankshaft() || !fun1->IsOptimizable());
394c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org    CHECK(fun2->IsOptimized()
395c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org          || !CcTest::i_isolate()->use_crankshaft() || !fun2->IsOptimizable());
3965a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org    CHECK_EQ(fun1->code(), fun2->code());
3975a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  }
3985a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org}
3995a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org
4005a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org
4017304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org#ifdef ENABLE_DISASSEMBLER
4027304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.orgstatic Handle<JSFunction> GetJSFunction(v8::Handle<v8::Object> obj,
4037304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org                                 const char* property_name) {
4047304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org  v8::Local<v8::Function> fun =
4057304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org      v8::Local<v8::Function>::Cast(obj->Get(v8_str(property_name)));
4067304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org  return v8::Utils::OpenHandle(*fun);
4077304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org}
4087304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org
4097304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org
4107304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.orgstatic void CheckCodeForUnsafeLiteral(Handle<JSFunction> f) {
4117304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org  // Create a disassembler with default name lookup.
4127304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org  disasm::NameConverter name_converter;
4137304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org  disasm::Disassembler d(name_converter);
4147304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org
4157304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org  if (f->code()->kind() == Code::FUNCTION) {
4167304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org    Address pc = f->code()->instruction_start();
4177304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org    int decode_size =
4187304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org        Min(f->code()->instruction_size(),
419e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org            static_cast<int>(f->code()->back_edge_table_offset()));
4207304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org    Address end = pc + decode_size;
4217304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org
4227304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org    v8::internal::EmbeddedVector<char, 128> decode_buffer;
4237a6fc815d62905d0c52705b96225b1bd23e00a43jkummerow@chromium.org    v8::internal::EmbeddedVector<char, 128> smi_hex_buffer;
4247a6fc815d62905d0c52705b96225b1bd23e00a43jkummerow@chromium.org    Smi* smi = Smi::FromInt(12345678);
42570ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org    SNPrintF(smi_hex_buffer, "0x%" V8PRIxPTR, reinterpret_cast<intptr_t>(smi));
4267304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org    while (pc < end) {
4274f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org      int num_const = d.ConstantPoolSizeAt(pc);
4284f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org      if (num_const >= 0) {
4299fa09679c31dd1fc79a07ed24431b6951227240aricow@chromium.org        pc += (num_const + 1) * kPointerSize;
4304f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org      } else {
4314f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org        pc += d.InstructionDecode(decode_buffer, pc);
4327a6fc815d62905d0c52705b96225b1bd23e00a43jkummerow@chromium.org        CHECK(strstr(decode_buffer.start(), smi_hex_buffer.start()) == NULL);
4334f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org      }
4347304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org    }
4357304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org  }
4367304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org}
4377304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org
4387304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org
4397304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.orgTEST(SplitConstantsInFullCompiler) {
440528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  LocalContext context;
441e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
4427304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org
4437304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org  CompileRun("function f() { a = 12345678 }; f();");
444528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CheckCodeForUnsafeLiteral(GetJSFunction(context->Global(), "f"));
4457304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org  CompileRun("function f(x) { a = 12345678 + x}; f(1);");
446528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CheckCodeForUnsafeLiteral(GetJSFunction(context->Global(), "f"));
4477304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org  CompileRun("function f(x) { var arguments = 1; x += 12345678}; f(1);");
448528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CheckCodeForUnsafeLiteral(GetJSFunction(context->Global(), "f"));
4497304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org  CompileRun("function f(x) { var arguments = 1; x = 12345678}; f(1);");
450528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CheckCodeForUnsafeLiteral(GetJSFunction(context->Global(), "f"));
4517304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org}
4527304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org#endif
453