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