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"
35f78524cb19cf078611235da0d6e361207f7eacdcmachenbach@chromium.org#include "src/parser.h"
36196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "test/cctest/cctest.h"
379a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
389a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comusing namespace v8::internal;
399a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
405b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.orgstatic Handle<Object> GetGlobalProperty(const char* name) {
41528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
422ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  return Object::GetProperty(
439fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org      isolate, isolate->global_object(), name).ToHandleChecked();
449a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
459a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
469a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
479a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comstatic void SetGlobalProperty(const char* name, Object* value) {
48528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
4909d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  Handle<Object> object(value, isolate);
504a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org  Handle<String> internalized_name =
514a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org      isolate->factory()->InternalizeUtf8String(name);
5209d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  Handle<JSObject> global(isolate->context()->global_object());
53248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org  Runtime::SetObjectProperty(isolate, global, internalized_name, object,
548f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org                             SLOPPY).Check();
559a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
569a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
579a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
589a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comstatic Handle<JSFunction> Compile(const char* source) {
59528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
608496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org  Handle<String> source_code = isolate->factory()->NewStringFromUtf8(
618496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org      CStrVector(source)).ToHandleChecked();
624c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  Handle<SharedFunctionInfo> shared_function = Compiler::CompileScript(
634c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org      source_code, Handle<String>(), 0, 0, false,
644c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org      Handle<Context>(isolate->native_context()), NULL, NULL,
654c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org      v8::ScriptCompiler::kNoCompileOptions, NOT_NATIVES_CODE);
66d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  return isolate->factory()->NewFunctionFromSharedFunctionInfo(
67d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org      shared_function, isolate->native_context());
689a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
699a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
709a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
712c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.orgstatic double Inc(Isolate* isolate, int x) {
729a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  const char* source = "result = %d + 1;";
73b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org  EmbeddedVector<char, 512> buffer;
7470ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org  SNPrintF(buffer, source, x);
759a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
76b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org  Handle<JSFunction> fun = Compile(buffer.start());
779a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  if (fun.is_null()) return -1;
789a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
792c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org  Handle<JSObject> global(isolate->context()->global_object());
802ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  Execution::Call(isolate, fun, global, 0, NULL).Check();
815b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  return GetGlobalProperty("result")->Number();
829a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
839a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
849a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
859a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(Inc) {
86e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
87e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
882c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org  CHECK_EQ(4.0, Inc(CcTest::i_isolate(), 3));
899a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
909a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
919a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
922c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.orgstatic double Add(Isolate* isolate, int x, int y) {
939a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  Handle<JSFunction> fun = Compile("result = x + y;");
949a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  if (fun.is_null()) return -1;
959a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
969a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  SetGlobalProperty("x", Smi::FromInt(x));
979a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  SetGlobalProperty("y", Smi::FromInt(y));
982c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org  Handle<JSObject> global(isolate->context()->global_object());
992ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  Execution::Call(isolate, fun, global, 0, NULL).Check();
1005b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  return GetGlobalProperty("result")->Number();
1019a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
1029a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1039a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1049a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(Add) {
105e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
106e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
1072c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org  CHECK_EQ(5.0, Add(CcTest::i_isolate(), 2, 3));
1089a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
1099a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1109a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1112c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.orgstatic double Abs(Isolate* isolate, int x) {
1129a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  Handle<JSFunction> fun = Compile("if (x < 0) result = -x; else result = x;");
1139a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  if (fun.is_null()) return -1;
1149a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1159a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  SetGlobalProperty("x", Smi::FromInt(x));
1162c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org  Handle<JSObject> global(isolate->context()->global_object());
1172ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  Execution::Call(isolate, fun, global, 0, NULL).Check();
1185b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  return GetGlobalProperty("result")->Number();
1199a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
1209a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1219a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1229a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(Abs) {
123e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
124e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
1252c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org  CHECK_EQ(3.0, Abs(CcTest::i_isolate(), -3));
1269a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
1279a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1289a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1292c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.orgstatic double Sum(Isolate* isolate, int n) {
1309a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  Handle<JSFunction> fun =
1319a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com      Compile("s = 0; while (n > 0) { s += n; n -= 1; }; result = s;");
1329a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  if (fun.is_null()) return -1;
1339a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1349a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  SetGlobalProperty("n", Smi::FromInt(n));
1352c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org  Handle<JSObject> global(isolate->context()->global_object());
1362ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  Execution::Call(isolate, fun, global, 0, NULL).Check();
1375b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  return GetGlobalProperty("result")->Number();
1389a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
1399a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1409a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1419a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(Sum) {
142e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
143e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
1442c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org  CHECK_EQ(5050.0, Sum(CcTest::i_isolate(), 100));
1459a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
1469a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1479a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1489a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(Print) {
149e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
150528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  v8::Local<v8::Context> context = CcTest::NewContext(PRINT_EXTENSION);
151528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  v8::Context::Scope context_scope(context);
1529a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  const char* source = "for (n = 0; n < 100; ++n) print(n, 1, 2);";
1539a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  Handle<JSFunction> fun = Compile(source);
1549a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  if (fun.is_null()) return;
1552c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org  Handle<JSObject> global(CcTest::i_isolate()->context()->global_object());
1562ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  Execution::Call(CcTest::i_isolate(), fun, global, 0, NULL).Check();
1579a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
1589a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1599a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1609a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// The following test method stems from my coding efforts today. It
1619a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// tests all the functionality I have added to the compiler today
1629a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(Stuff) {
163e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
164e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
1659a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  const char* source =
1669a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    "r = 0;\n"
1679a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    "a = new Object;\n"
1689a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    "if (a == a) r+=1;\n"  // 1
1699a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    "if (a != new Object()) r+=2;\n"  // 2
1709a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    "a.x = 42;\n"
1719a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    "if (a.x == 42) r+=4;\n"  // 4
1729a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    "function foo() { var x = 87; return x; }\n"
1739a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    "if (foo() == 87) r+=8;\n"  // 8
1749a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    "function bar() { var x; x = 99; return x; }\n"
1759a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    "if (bar() == 99) r+=16;\n"  // 16
1769a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    "function baz() { var x = 1, y, z = 2; y = 3; return x + y + z; }\n"
1779a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    "if (baz() == 6) r+=32;\n"  // 32
1789a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    "function Cons0() { this.x = 42; this.y = 87; }\n"
1799a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    "if (new Cons0().x == 42) r+=64;\n"  // 64
1809a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    "if (new Cons0().y == 87) r+=128;\n"  // 128
1819a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    "function Cons2(x, y) { this.sum = x + y; }\n"
1829a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    "if (new Cons2(3,4).sum == 7) r+=256;";  // 256
1839a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1849a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  Handle<JSFunction> fun = Compile(source);
1859a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(!fun.is_null());
1862c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org  Handle<JSObject> global(CcTest::i_isolate()->context()->global_object());
1872c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org  Execution::Call(
1882ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org      CcTest::i_isolate(), fun, global, 0, NULL).Check();
1895b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  CHECK_EQ(511.0, GetGlobalProperty("r")->Number());
1909a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
1919a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1929a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1939a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(UncaughtThrow) {
194e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
195e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
1969a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1979a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  const char* source = "throw 42;";
1989a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  Handle<JSFunction> fun = Compile(source);
1999a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(!fun.is_null());
20009d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  Isolate* isolate = fun->GetIsolate();
20109d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  Handle<JSObject> global(isolate->context()->global_object());
2022ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  CHECK(Execution::Call(isolate, fun, global, 0, NULL).is_null());
2039e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org  CHECK_EQ(42.0, isolate->pending_exception()->Number());
2049a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
2059a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2069a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2079a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Tests calling a builtin function from C/C++ code, and the builtin function
2089a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// performs GC. It creates a stack frame looks like following:
2099a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//   | C (PerformGC) |
2109a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//   |   JS-to-C     |
2119a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//   |      JS       |
2129a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//   |   C-to-JS     |
2139a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(C2JSFrames) {
214c8cbc43a1fd5fda5d6a1e172f720cbd1215157c8machenbach@chromium.org  FLAG_expose_gc = true;
215e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
216528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  v8::Local<v8::Context> context =
217528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    CcTest::NewContext(PRINT_EXTENSION | GC_EXTENSION);
218528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  v8::Context::Scope context_scope(context);
2199a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2209a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  const char* source = "function foo(a) { gc(), print(a); }";
2219a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2229a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  Handle<JSFunction> fun0 = Compile(source);
2239a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(!fun0.is_null());
22409d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  Isolate* isolate = fun0->GetIsolate();
2259a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2269a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // Run the generated code to populate the global object with 'foo'.
2272c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org  Handle<JSObject> global(isolate->context()->global_object());
2282ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  Execution::Call(isolate, fun0, global, 0, NULL).Check();
2299a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2302c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  Handle<String> foo_string =
2312c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org      isolate->factory()->InternalizeOneByteString(STATIC_CHAR_VECTOR("foo"));
2325b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  Handle<Object> fun1 = Object::GetProperty(
2332ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org      isolate->global_object(), foo_string).ToHandleChecked();
2349a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(fun1->IsJSFunction());
2359a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2362c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  Handle<Object> argv[] = {isolate->factory()->InternalizeOneByteString(
2372c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org      STATIC_CHAR_VECTOR("hello"))};
2382c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org  Execution::Call(isolate,
2392c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org                  Handle<JSFunction>::cast(fun1),
240a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org                  global,
241fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org                  arraysize(argv),
2422ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org                  argv).Check();
2439a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
244381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org
245381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org
246381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org// Regression 236. Calling InitLineEnds on a Script with undefined
247381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org// source resulted in crash.
248381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.orgTEST(Regression236) {
249e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
250528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
251d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Factory* factory = isolate->factory();
252e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
253381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org
254d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Handle<Script> script = factory->NewScript(factory->empty_string());
255528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  script->set_source(CcTest::heap()->undefined_value());
2569fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  CHECK_EQ(-1, Script::GetLineNumber(script, 0));
2579fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  CHECK_EQ(-1, Script::GetLineNumber(script, 100));
2589fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  CHECK_EQ(-1, Script::GetLineNumber(script, -1));
259381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org}
2605c838251403b0be9a882540f1922577abba4c872ager@chromium.org
2615c838251403b0be9a882540f1922577abba4c872ager@chromium.org
2625c838251403b0be9a882540f1922577abba4c872ager@chromium.orgTEST(GetScriptLineNumber) {
263528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  LocalContext context;
264e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
265f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org  v8::ScriptOrigin origin =
266f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org      v8::ScriptOrigin(v8::String::NewFromUtf8(CcTest::isolate(), "test"));
2675c838251403b0be9a882540f1922577abba4c872ager@chromium.org  const char function_f[] = "function f() {}";
2685c838251403b0be9a882540f1922577abba4c872ager@chromium.org  const int max_rows = 1000;
2695c838251403b0be9a882540f1922577abba4c872ager@chromium.org  const int buffer_size = max_rows + sizeof(function_f);
2705c838251403b0be9a882540f1922577abba4c872ager@chromium.org  ScopedVector<char> buffer(buffer_size);
2715c838251403b0be9a882540f1922577abba4c872ager@chromium.org  memset(buffer.start(), '\n', buffer_size - 1);
2725c838251403b0be9a882540f1922577abba4c872ager@chromium.org  buffer[buffer_size - 1] = '\0';
2735c838251403b0be9a882540f1922577abba4c872ager@chromium.org
2745c838251403b0be9a882540f1922577abba4c872ager@chromium.org  for (int i = 0; i < max_rows; ++i) {
2755c838251403b0be9a882540f1922577abba4c872ager@chromium.org    if (i > 0)
2765c838251403b0be9a882540f1922577abba4c872ager@chromium.org      buffer[i - 1] = '\n';
277d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    MemCopy(&buffer[i], function_f, sizeof(function_f) - 1);
278f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org    v8::Handle<v8::String> script_body =
279f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org        v8::String::NewFromUtf8(CcTest::isolate(), buffer.start());
2805c838251403b0be9a882540f1922577abba4c872ager@chromium.org    v8::Script::Compile(script_body, &origin)->Run();
281f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org    v8::Local<v8::Function> f =
282f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org        v8::Local<v8::Function>::Cast(context->Global()->Get(
283f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org            v8::String::NewFromUtf8(CcTest::isolate(), "f")));
2845c838251403b0be9a882540f1922577abba4c872ager@chromium.org    CHECK_EQ(i, f->GetScriptLineNumber());
2855c838251403b0be9a882540f1922577abba4c872ager@chromium.org  }
2865c838251403b0be9a882540f1922577abba4c872ager@chromium.org}
2877304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org
2887304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org
289a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.orgTEST(FeedbackVectorPreservedAcrossRecompiles) {
290a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  if (i::FLAG_always_opt || !i::FLAG_crankshaft) return;
291a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  i::FLAG_allow_natives_syntax = true;
292a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  CcTest::InitializeVM();
293a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  if (!CcTest::i_isolate()->use_crankshaft()) return;
294a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  v8::HandleScope scope(CcTest::isolate());
295a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org
296a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  // Make sure function f has a call that uses a type feedback slot.
297a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  CompileRun("function fun() {};"
298a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org             "fun1 = fun;"
299a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org             "function f(a) { a(); } f(fun1);");
300a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org
301a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  Handle<JSFunction> f =
302a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org      v8::Utils::OpenHandle(
303a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org          *v8::Handle<v8::Function>::Cast(
304a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org              CcTest::global()->Get(v8_str("f"))));
305a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org
306a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  // We shouldn't have deoptimization support. We want to recompile and
307a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  // verify that our feedback vector preserves information.
308a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  CHECK(!f->shared()->has_deoptimization_support());
309a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  Handle<FixedArray> feedback_vector(f->shared()->feedback_vector());
310a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org
311a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  // Verify that we gathered feedback.
3129d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  int expected_count = FLAG_vector_ics ? 2 : 1;
3139d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  CHECK_EQ(expected_count, feedback_vector->length());
3149d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  CHECK(feedback_vector->get(expected_count - 1)->IsJSFunction());
315a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org
316a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  CompileRun("%OptimizeFunctionOnNextCall(f); f(fun1);");
317a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org
318a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  // Verify that the feedback is still "gathered" despite a recompilation
319a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  // of the full code.
320a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  CHECK(f->IsOptimized());
321a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  CHECK(f->shared()->has_deoptimization_support());
3229d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  CHECK(f->shared()->feedback_vector()->
3239d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org        get(expected_count - 1)->IsJSFunction());
324a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org}
325a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org
326a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org
327a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.orgTEST(FeedbackVectorUnaffectedByScopeChanges) {
328a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  if (i::FLAG_always_opt || !i::FLAG_lazy) return;
329a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  CcTest::InitializeVM();
330a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  v8::HandleScope scope(CcTest::isolate());
331a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org
332a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  CompileRun("function builder() {"
333a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org             "  call_target = function() { return 3; };"
334a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org             "  return (function() {"
335a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org             "    eval('');"
336a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org             "    return function() {"
337a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org             "      'use strict';"
338a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org             "      call_target();"
339a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org             "    }"
340a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org             "  })();"
341a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org             "}"
342a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org             "morphing_call = builder();");
343a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org
344a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  Handle<JSFunction> f =
345a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org      v8::Utils::OpenHandle(
346a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org          *v8::Handle<v8::Function>::Cast(
347a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org              CcTest::global()->Get(v8_str("morphing_call"))));
348a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org
3499d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  int expected_count = FLAG_vector_ics ? 2 : 1;
3509d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  CHECK_EQ(expected_count, f->shared()->feedback_vector()->length());
351a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  // And yet it's not compiled.
352a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  CHECK(!f->shared()->is_compiled());
353a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org
354a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  CompileRun("morphing_call();");
355a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org
356a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  // The vector should have the same size despite the new scoping.
3579d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  CHECK_EQ(expected_count, f->shared()->feedback_vector()->length());
358a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  CHECK(f->shared()->is_compiled());
359a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org}
360a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org
361a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org
3625a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org// Test that optimized code for different closures is actually shared
3635a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org// immediately by the FastNewClosureStub when run in the same context.
3645a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.orgTEST(OptimizedCodeSharing) {
365de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org  // Skip test if --cache-optimized-code is not activated by default because
366de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org  // FastNewClosureStub that is baked into the snapshot is incorrect.
367de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org  if (!FLAG_cache_optimized_code) return;
3681510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  FLAG_stress_compaction = false;
3695a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  FLAG_allow_natives_syntax = true;
370e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
371e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
3725a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  for (int i = 0; i < 10; i++) {
3735a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org    LocalContext env;
374f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org    env->Global()->Set(v8::String::NewFromUtf8(CcTest::isolate(), "x"),
3750f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org                       v8::Integer::New(CcTest::isolate(), i));
3765a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org    CompileRun("function MakeClosure() {"
3775a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org               "  return function() { return x; };"
3785a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org               "}"
3795a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org               "var closure0 = MakeClosure();"
3805a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org               "%DebugPrint(closure0());"
3815a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org               "%OptimizeFunctionOnNextCall(closure0);"
3825a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org               "%DebugPrint(closure0());"
3835a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org               "var closure1 = MakeClosure();"
3845a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org               "var closure2 = MakeClosure();");
3855a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org    Handle<JSFunction> fun1 = v8::Utils::OpenHandle(
3865a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org        *v8::Local<v8::Function>::Cast(env->Global()->Get(v8_str("closure1"))));
3875a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org    Handle<JSFunction> fun2 = v8::Utils::OpenHandle(
3885a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org        *v8::Local<v8::Function>::Cast(env->Global()->Get(v8_str("closure2"))));
389c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org    CHECK(fun1->IsOptimized()
390c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org          || !CcTest::i_isolate()->use_crankshaft() || !fun1->IsOptimizable());
391c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org    CHECK(fun2->IsOptimized()
392c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org          || !CcTest::i_isolate()->use_crankshaft() || !fun2->IsOptimizable());
3935a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org    CHECK_EQ(fun1->code(), fun2->code());
3945a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  }
3955a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org}
3965a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org
3975a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org
3987304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org#ifdef ENABLE_DISASSEMBLER
3997304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.orgstatic Handle<JSFunction> GetJSFunction(v8::Handle<v8::Object> obj,
4007304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org                                 const char* property_name) {
4017304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org  v8::Local<v8::Function> fun =
4027304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org      v8::Local<v8::Function>::Cast(obj->Get(v8_str(property_name)));
4037304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org  return v8::Utils::OpenHandle(*fun);
4047304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org}
4057304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org
4067304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org
4077304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.orgstatic void CheckCodeForUnsafeLiteral(Handle<JSFunction> f) {
4087304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org  // Create a disassembler with default name lookup.
4097304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org  disasm::NameConverter name_converter;
4107304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org  disasm::Disassembler d(name_converter);
4117304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org
4127304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org  if (f->code()->kind() == Code::FUNCTION) {
4137304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org    Address pc = f->code()->instruction_start();
4147304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org    int decode_size =
4157304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org        Min(f->code()->instruction_size(),
416e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org            static_cast<int>(f->code()->back_edge_table_offset()));
4177304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org    Address end = pc + decode_size;
4187304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org
4197304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org    v8::internal::EmbeddedVector<char, 128> decode_buffer;
4207a6fc815d62905d0c52705b96225b1bd23e00a43jkummerow@chromium.org    v8::internal::EmbeddedVector<char, 128> smi_hex_buffer;
4217a6fc815d62905d0c52705b96225b1bd23e00a43jkummerow@chromium.org    Smi* smi = Smi::FromInt(12345678);
42270ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org    SNPrintF(smi_hex_buffer, "0x%" V8PRIxPTR, reinterpret_cast<intptr_t>(smi));
4237304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org    while (pc < end) {
4244f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org      int num_const = d.ConstantPoolSizeAt(pc);
4254f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org      if (num_const >= 0) {
4269fa09679c31dd1fc79a07ed24431b6951227240aricow@chromium.org        pc += (num_const + 1) * kPointerSize;
4274f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org      } else {
4284f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org        pc += d.InstructionDecode(decode_buffer, pc);
4297a6fc815d62905d0c52705b96225b1bd23e00a43jkummerow@chromium.org        CHECK(strstr(decode_buffer.start(), smi_hex_buffer.start()) == NULL);
4304f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org      }
4317304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org    }
4327304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org  }
4337304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org}
4347304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org
4357304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org
4367304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.orgTEST(SplitConstantsInFullCompiler) {
437528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  LocalContext context;
438e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
4397304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org
4407304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org  CompileRun("function f() { a = 12345678 }; f();");
441528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CheckCodeForUnsafeLiteral(GetJSFunction(context->Global(), "f"));
4427304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org  CompileRun("function f(x) { a = 12345678 + x}; f(1);");
443528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CheckCodeForUnsafeLiteral(GetJSFunction(context->Global(), "f"));
4447304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org  CompileRun("function f(x) { var arguments = 1; x += 12345678}; f(1);");
445528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CheckCodeForUnsafeLiteral(GetJSFunction(context->Global(), "f"));
4467304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org  CompileRun("function f(x) { var arguments = 1; x = 12345678}; f(1);");
447528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CheckCodeForUnsafeLiteral(GetJSFunction(context->Global(), "f"));
4487304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org}
4497304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org#endif
450