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
319a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include "v8.h"
329a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
339a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include "compiler.h"
347304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org#include "disasm.h"
357304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org#include "disassembler.h"
369a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include "execution.h"
379a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include "factory.h"
389a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include "platform.h"
399a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include "cctest.h"
409a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
419a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comusing namespace v8::internal;
429a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
4341044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org// --- P r i n t   E x t e n s i o n ---
4441044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org
4541044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.orgclass PrintExtension : public v8::Extension {
4641044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org public:
4741044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org  PrintExtension() : v8::Extension("v8/print", kSource) { }
4841044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org  virtual v8::Handle<v8::FunctionTemplate> GetNativeFunction(
4941044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org      v8::Handle<v8::String> name);
501510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  static void Print(const v8::FunctionCallbackInfo<v8::Value>& args);
5141044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org private:
5241044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org  static const char* kSource;
5341044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org};
5441044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org
5541044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org
5641044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.orgconst char* PrintExtension::kSource = "native function print();";
5741044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org
5841044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org
5941044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.orgv8::Handle<v8::FunctionTemplate> PrintExtension::GetNativeFunction(
6041044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org    v8::Handle<v8::String> str) {
6141044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org  return v8::FunctionTemplate::New(PrintExtension::Print);
6241044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
6341044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org
6441044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org
651510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgvoid PrintExtension::Print(const v8::FunctionCallbackInfo<v8::Value>& args) {
6641044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org  for (int i = 0; i < args.Length(); i++) {
6741044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org    if (i != 0) printf(" ");
682bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org    v8::HandleScope scope(args.GetIsolate());
6956c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org    v8::String::Utf8Value str(args[i]);
701510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    if (*str == NULL) return;
7156c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org    printf("%s", *str);
7241044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org  }
7341044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org  printf("\n");
7441044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
7541044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org
7641044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org
7741044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.orgstatic PrintExtension kPrintExtension;
7841044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.orgv8::DeclareExtension kPrintExtensionDeclaration(&kPrintExtension);
7941044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org
8041044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org
81303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.orgstatic MaybeObject* GetGlobalProperty(const char* name) {
82d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Isolate* isolate = Isolate::Current();
83d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Handle<String> internalized_name =
84d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org      isolate->factory()->InternalizeUtf8String(name);
85d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  return isolate->context()->global_object()->GetProperty(*internalized_name);
869a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
879a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
889a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
899a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comstatic void SetGlobalProperty(const char* name, Object* value) {
908e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  Isolate* isolate = Isolate::Current();
9109d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  Handle<Object> object(value, isolate);
924a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org  Handle<String> internalized_name =
934a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org      isolate->factory()->InternalizeUtf8String(name);
9409d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  Handle<JSObject> global(isolate->context()->global_object());
954a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org  SetProperty(isolate, global, internalized_name, object, NONE, kNonStrictMode);
969a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
979a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
989a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
999a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comstatic Handle<JSFunction> Compile(const char* source) {
100d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Isolate* isolate = Isolate::Current();
101d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Handle<String> source_code(
102d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org      isolate->factory()->NewStringFromUtf8(CStrVector(source)));
1035d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org  Handle<SharedFunctionInfo> shared_function =
104086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org      Compiler::Compile(source_code,
105086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org                        Handle<String>(),
106086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org                        0,
107086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org                        0,
108d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org                        false,
109d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org                        Handle<Context>(isolate->native_context()),
110086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org                        NULL,
111086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org                        NULL,
112086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org                        Handle<String>::null(),
113086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org                        NOT_NATIVES_CODE);
114d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  return isolate->factory()->NewFunctionFromSharedFunctionInfo(
115d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org      shared_function, isolate->native_context());
1169a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
1179a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1189a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1199a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comstatic double Inc(int x) {
1209a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  const char* source = "result = %d + 1;";
121b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org  EmbeddedVector<char, 512> buffer;
122b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org  OS::SNPrintF(buffer, source, x);
1239a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
124b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org  Handle<JSFunction> fun = Compile(buffer.start());
1259a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  if (fun.is_null()) return -1;
1269a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1279a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  bool has_pending_exception;
12846839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  Handle<JSObject> global(Isolate::Current()->context()->global_object());
1299a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  Execution::Call(fun, global, 0, NULL, &has_pending_exception);
1309a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(!has_pending_exception);
131303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org  return GetGlobalProperty("result")->ToObjectChecked()->Number();
1329a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
1339a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1349a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1359a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(Inc) {
136e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
137e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
1389a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK_EQ(4.0, Inc(3));
1399a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
1409a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1419a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1429a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comstatic double Add(int x, int y) {
1439a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  Handle<JSFunction> fun = Compile("result = x + y;");
1449a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  if (fun.is_null()) return -1;
1459a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1469a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  SetGlobalProperty("x", Smi::FromInt(x));
1479a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  SetGlobalProperty("y", Smi::FromInt(y));
1489a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  bool has_pending_exception;
14946839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  Handle<JSObject> global(Isolate::Current()->context()->global_object());
1509a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  Execution::Call(fun, global, 0, NULL, &has_pending_exception);
1519a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(!has_pending_exception);
152303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org  return GetGlobalProperty("result")->ToObjectChecked()->Number();
1539a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
1549a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1559a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1569a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(Add) {
157e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
158e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
1599a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK_EQ(5.0, Add(2, 3));
1609a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
1619a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1629a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1639a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comstatic double Abs(int x) {
1649a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  Handle<JSFunction> fun = Compile("if (x < 0) result = -x; else result = x;");
1659a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  if (fun.is_null()) return -1;
1669a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1679a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  SetGlobalProperty("x", Smi::FromInt(x));
1689a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  bool has_pending_exception;
16946839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  Handle<JSObject> global(Isolate::Current()->context()->global_object());
1709a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  Execution::Call(fun, global, 0, NULL, &has_pending_exception);
1719a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(!has_pending_exception);
172303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org  return GetGlobalProperty("result")->ToObjectChecked()->Number();
1739a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
1749a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1759a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1769a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(Abs) {
177e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
178e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
1799a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK_EQ(3.0, Abs(-3));
1809a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
1819a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1829a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1839a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comstatic double Sum(int n) {
1849a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  Handle<JSFunction> fun =
1859a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com      Compile("s = 0; while (n > 0) { s += n; n -= 1; }; result = s;");
1869a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  if (fun.is_null()) return -1;
1879a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1889a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  SetGlobalProperty("n", Smi::FromInt(n));
1899a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  bool has_pending_exception;
19046839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  Handle<JSObject> global(Isolate::Current()->context()->global_object());
1919a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  Execution::Call(fun, global, 0, NULL, &has_pending_exception);
1929a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(!has_pending_exception);
193303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org  return GetGlobalProperty("result")->ToObjectChecked()->Number();
1949a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
1959a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1969a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1979a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(Sum) {
198e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
199e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
2009a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK_EQ(5050.0, Sum(100));
2019a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
2029a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2039a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2049a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(Print) {
205e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM(PRINT_EXTENSION);
206e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
2079a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  const char* source = "for (n = 0; n < 100; ++n) print(n, 1, 2);";
2089a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  Handle<JSFunction> fun = Compile(source);
2099a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  if (fun.is_null()) return;
2109a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  bool has_pending_exception;
21146839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  Handle<JSObject> global(Isolate::Current()->context()->global_object());
2129a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  Execution::Call(fun, global, 0, NULL, &has_pending_exception);
2139a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(!has_pending_exception);
2149a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
2159a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2169a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2179a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// The following test method stems from my coding efforts today. It
2189a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// tests all the functionality I have added to the compiler today
2199a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(Stuff) {
220e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
221e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
2229a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  const char* source =
2239a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    "r = 0;\n"
2249a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    "a = new Object;\n"
2259a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    "if (a == a) r+=1;\n"  // 1
2269a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    "if (a != new Object()) r+=2;\n"  // 2
2279a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    "a.x = 42;\n"
2289a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    "if (a.x == 42) r+=4;\n"  // 4
2299a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    "function foo() { var x = 87; return x; }\n"
2309a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    "if (foo() == 87) r+=8;\n"  // 8
2319a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    "function bar() { var x; x = 99; return x; }\n"
2329a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    "if (bar() == 99) r+=16;\n"  // 16
2339a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    "function baz() { var x = 1, y, z = 2; y = 3; return x + y + z; }\n"
2349a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    "if (baz() == 6) r+=32;\n"  // 32
2359a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    "function Cons0() { this.x = 42; this.y = 87; }\n"
2369a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    "if (new Cons0().x == 42) r+=64;\n"  // 64
2379a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    "if (new Cons0().y == 87) r+=128;\n"  // 128
2389a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    "function Cons2(x, y) { this.sum = x + y; }\n"
2399a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    "if (new Cons2(3,4).sum == 7) r+=256;";  // 256
2409a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2419a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  Handle<JSFunction> fun = Compile(source);
2429a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(!fun.is_null());
2439a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  bool has_pending_exception;
24446839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  Handle<JSObject> global(Isolate::Current()->context()->global_object());
2459a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  Execution::Call(fun, global, 0, NULL, &has_pending_exception);
2469a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(!has_pending_exception);
247303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org  CHECK_EQ(511.0, GetGlobalProperty("r")->ToObjectChecked()->Number());
2489a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
2499a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2509a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2519a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(UncaughtThrow) {
252e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
253e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
2549a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2559a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  const char* source = "throw 42;";
2569a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  Handle<JSFunction> fun = Compile(source);
2579a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(!fun.is_null());
2589a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  bool has_pending_exception;
25909d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  Isolate* isolate = fun->GetIsolate();
26009d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  Handle<JSObject> global(isolate->context()->global_object());
261659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org  Execution::Call(fun, global, 0, NULL, &has_pending_exception);
2629a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(has_pending_exception);
26309d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  CHECK_EQ(42.0, isolate->pending_exception()->ToObjectChecked()->Number());
2649a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
2659a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2669a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2679a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Tests calling a builtin function from C/C++ code, and the builtin function
2689a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// performs GC. It creates a stack frame looks like following:
2699a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//   | C (PerformGC) |
2709a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//   |   JS-to-C     |
2719a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//   |      JS       |
2729a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//   |   C-to-JS     |
2739a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(C2JSFrames) {
274e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM(PRINT_EXTENSION | GC_EXTENSION);
275e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
2769a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2779a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  const char* source = "function foo(a) { gc(), print(a); }";
2789a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2799a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  Handle<JSFunction> fun0 = Compile(source);
2809a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(!fun0.is_null());
28109d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  Isolate* isolate = fun0->GetIsolate();
2829a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2839a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // Run the generated code to populate the global object with 'foo'.
2849a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  bool has_pending_exception;
28546839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  Handle<JSObject> global(Isolate::Current()->context()->global_object());
2869a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  Execution::Call(fun0, global, 0, NULL, &has_pending_exception);
2879a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(!has_pending_exception);
2889a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
289d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Object* foo_string = isolate->factory()->InternalizeOneByteString(
290d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org      STATIC_ASCII_VECTOR("foo"))->ToObjectChecked();
29109d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  MaybeObject* fun1_object = isolate->context()->global_object()->
2924a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org      GetProperty(String::cast(foo_string));
29309d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  Handle<Object> fun1(fun1_object->ToObjectChecked(), isolate);
2949a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(fun1->IsJSFunction());
2959a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
296d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Handle<Object> argv[] = { isolate->factory()->InternalizeOneByteString(
297d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org      STATIC_ASCII_VECTOR("hello")) };
298a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org  Execution::Call(Handle<JSFunction>::cast(fun1),
299a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org                  global,
300a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org                  ARRAY_SIZE(argv),
301a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org                  argv,
3029a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                  &has_pending_exception);
3039a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(!has_pending_exception);
3049a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
305381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org
306381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org
307381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org// Regression 236. Calling InitLineEnds on a Script with undefined
308381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org// source resulted in crash.
309381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.orgTEST(Regression236) {
310e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
311d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Isolate* isolate = Isolate::Current();
312d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Factory* factory = isolate->factory();
313e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
314381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org
315d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Handle<Script> script = factory->NewScript(factory->empty_string());
316ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  script->set_source(HEAP->undefined_value());
3177be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  CHECK_EQ(-1, GetScriptLineNumber(script, 0));
3187be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  CHECK_EQ(-1, GetScriptLineNumber(script, 100));
3197be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  CHECK_EQ(-1, GetScriptLineNumber(script, -1));
320381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org}
3215c838251403b0be9a882540f1922577abba4c872ager@chromium.org
3225c838251403b0be9a882540f1922577abba4c872ager@chromium.org
3235c838251403b0be9a882540f1922577abba4c872ager@chromium.orgTEST(GetScriptLineNumber) {
324e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
325e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
3265c838251403b0be9a882540f1922577abba4c872ager@chromium.org  v8::ScriptOrigin origin = v8::ScriptOrigin(v8::String::New("test"));
3275c838251403b0be9a882540f1922577abba4c872ager@chromium.org  const char function_f[] = "function f() {}";
3285c838251403b0be9a882540f1922577abba4c872ager@chromium.org  const int max_rows = 1000;
3295c838251403b0be9a882540f1922577abba4c872ager@chromium.org  const int buffer_size = max_rows + sizeof(function_f);
3305c838251403b0be9a882540f1922577abba4c872ager@chromium.org  ScopedVector<char> buffer(buffer_size);
3315c838251403b0be9a882540f1922577abba4c872ager@chromium.org  memset(buffer.start(), '\n', buffer_size - 1);
3325c838251403b0be9a882540f1922577abba4c872ager@chromium.org  buffer[buffer_size - 1] = '\0';
3335c838251403b0be9a882540f1922577abba4c872ager@chromium.org
3345c838251403b0be9a882540f1922577abba4c872ager@chromium.org  for (int i = 0; i < max_rows; ++i) {
3355c838251403b0be9a882540f1922577abba4c872ager@chromium.org    if (i > 0)
3365c838251403b0be9a882540f1922577abba4c872ager@chromium.org      buffer[i - 1] = '\n';
337e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org    OS::MemCopy(&buffer[i], function_f, sizeof(function_f) - 1);
3385c838251403b0be9a882540f1922577abba4c872ager@chromium.org    v8::Handle<v8::String> script_body = v8::String::New(buffer.start());
3395c838251403b0be9a882540f1922577abba4c872ager@chromium.org    v8::Script::Compile(script_body, &origin)->Run();
3405c838251403b0be9a882540f1922577abba4c872ager@chromium.org    v8::Local<v8::Function> f = v8::Local<v8::Function>::Cast(
341e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org        CcTest::env()->Global()->Get(v8::String::New("f")));
3425c838251403b0be9a882540f1922577abba4c872ager@chromium.org    CHECK_EQ(i, f->GetScriptLineNumber());
3435c838251403b0be9a882540f1922577abba4c872ager@chromium.org  }
3445c838251403b0be9a882540f1922577abba4c872ager@chromium.org}
3457304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org
3467304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org
3475a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org// Test that optimized code for different closures is actually shared
3485a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org// immediately by the FastNewClosureStub when run in the same context.
3495a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.orgTEST(OptimizedCodeSharing) {
350de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org  // Skip test if --cache-optimized-code is not activated by default because
351de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org  // FastNewClosureStub that is baked into the snapshot is incorrect.
352de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org  if (!FLAG_cache_optimized_code) return;
3531510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  FLAG_stress_compaction = false;
3545a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  FLAG_allow_natives_syntax = true;
355e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
356e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
3575a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  for (int i = 0; i < 10; i++) {
3585a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org    LocalContext env;
3595a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org    env->Global()->Set(v8::String::New("x"), v8::Integer::New(i));
3605a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org    CompileRun("function MakeClosure() {"
3615a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org               "  return function() { return x; };"
3625a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org               "}"
3635a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org               "var closure0 = MakeClosure();"
3645a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org               "%DebugPrint(closure0());"
3655a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org               "%OptimizeFunctionOnNextCall(closure0);"
3665a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org               "%DebugPrint(closure0());"
3675a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org               "var closure1 = MakeClosure();"
3685a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org               "var closure2 = MakeClosure();");
3695a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org    Handle<JSFunction> fun1 = v8::Utils::OpenHandle(
3705a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org        *v8::Local<v8::Function>::Cast(env->Global()->Get(v8_str("closure1"))));
3715a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org    Handle<JSFunction> fun2 = v8::Utils::OpenHandle(
3725a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org        *v8::Local<v8::Function>::Cast(env->Global()->Get(v8_str("closure2"))));
3735a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org    CHECK(fun1->IsOptimized() || !fun1->IsOptimizable());
3745a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org    CHECK(fun2->IsOptimized() || !fun2->IsOptimizable());
3755a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org    CHECK_EQ(fun1->code(), fun2->code());
3765a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  }
3775a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org}
3785a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org
3795a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org
3807304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org#ifdef ENABLE_DISASSEMBLER
3817304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.orgstatic Handle<JSFunction> GetJSFunction(v8::Handle<v8::Object> obj,
3827304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org                                 const char* property_name) {
3837304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org  v8::Local<v8::Function> fun =
3847304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org      v8::Local<v8::Function>::Cast(obj->Get(v8_str(property_name)));
3857304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org  return v8::Utils::OpenHandle(*fun);
3867304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org}
3877304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org
3887304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org
3897304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.orgstatic void CheckCodeForUnsafeLiteral(Handle<JSFunction> f) {
3907304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org  // Create a disassembler with default name lookup.
3917304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org  disasm::NameConverter name_converter;
3927304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org  disasm::Disassembler d(name_converter);
3937304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org
3947304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org  if (f->code()->kind() == Code::FUNCTION) {
3957304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org    Address pc = f->code()->instruction_start();
3967304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org    int decode_size =
3977304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org        Min(f->code()->instruction_size(),
398e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org            static_cast<int>(f->code()->back_edge_table_offset()));
3997304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org    Address end = pc + decode_size;
4007304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org
4017304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org    v8::internal::EmbeddedVector<char, 128> decode_buffer;
4027a6fc815d62905d0c52705b96225b1bd23e00a43jkummerow@chromium.org    v8::internal::EmbeddedVector<char, 128> smi_hex_buffer;
4037a6fc815d62905d0c52705b96225b1bd23e00a43jkummerow@chromium.org    Smi* smi = Smi::FromInt(12345678);
4047a6fc815d62905d0c52705b96225b1bd23e00a43jkummerow@chromium.org    OS::SNPrintF(smi_hex_buffer, "0x%lx", reinterpret_cast<intptr_t>(smi));
4057304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org    while (pc < end) {
4064f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org      int num_const = d.ConstantPoolSizeAt(pc);
4074f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org      if (num_const >= 0) {
4089fa09679c31dd1fc79a07ed24431b6951227240aricow@chromium.org        pc += (num_const + 1) * kPointerSize;
4094f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org      } else {
4104f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org        pc += d.InstructionDecode(decode_buffer, pc);
4117a6fc815d62905d0c52705b96225b1bd23e00a43jkummerow@chromium.org        CHECK(strstr(decode_buffer.start(), smi_hex_buffer.start()) == NULL);
4124f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org      }
4137304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org    }
4147304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org  }
4157304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org}
4167304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org
4177304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org
4187304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.orgTEST(SplitConstantsInFullCompiler) {
419e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
420e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
4217304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org
4227304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org  CompileRun("function f() { a = 12345678 }; f();");
423e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CheckCodeForUnsafeLiteral(GetJSFunction(CcTest::env()->Global(), "f"));
4247304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org  CompileRun("function f(x) { a = 12345678 + x}; f(1);");
425e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CheckCodeForUnsafeLiteral(GetJSFunction(CcTest::env()->Global(), "f"));
4267304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org  CompileRun("function f(x) { var arguments = 1; x += 12345678}; f(1);");
427e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CheckCodeForUnsafeLiteral(GetJSFunction(CcTest::env()->Global(), "f"));
4287304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org  CompileRun("function f(x) { var arguments = 1; x = 12345678}; f(1);");
429e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CheckCodeForUnsafeLiteral(GetJSFunction(CcTest::env()->Global(), "f"));
4307304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org}
4317304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org#endif
432