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