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