1f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com// Copyright 2012 the V8 project authors. All rights reserved. 23484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// Use of this source code is governed by a BSD-style license that can be 33484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// found in the LICENSE file. 45a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 55a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 6d6899c3545b051ec84363203d4235f883b4981bfulan@chromium.org// Defined when linking against shared lib on Windows. 7d6899c3545b051ec84363203d4235f883b4981bfulan@chromium.org#if defined(USING_V8_SHARED) && !defined(V8_SHARED) 87c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org#define V8_SHARED 984bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org#endif 1084bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org 116d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org#ifdef COMPRESS_STARTUP_DATA_BZ2 126d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org#include <bzlib.h> 136d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org#endif 1484bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org 15bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org#include <errno.h> 166d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org#include <stdlib.h> 1784bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org#include <string.h> 187c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org#include <sys/stat.h> 19a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 207c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org#ifdef V8_SHARED 2184bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org#include <assert.h> 22ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org#endif // V8_SHARED 23ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org 24ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org#ifndef V8_SHARED 25ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org#include <algorithm> 26ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org#endif // !V8_SHARED 27ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org 28ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org#ifdef V8_SHARED 29196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "include/v8-testing.h" 307c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org#endif // V8_SHARED 31ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 3270d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org#if !defined(V8_SHARED) && defined(ENABLE_GDB_JIT_INTERFACE) 3370d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org#include "src/gdb-jit.h" 3470d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org#endif 3570d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org 36e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#ifdef ENABLE_VTUNE_JIT_INTERFACE 37196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/third_party/vtune/v8-vtune.h" 38e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#endif 39e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 40196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/d8.h" 4184bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org 42d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org#include "include/libplatform/libplatform.h" 437c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org#ifndef V8_SHARED 44196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/api.h" 455de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org#include "src/base/cpu.h" 465de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org#include "src/base/logging.h" 475de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org#include "src/base/platform/platform.h" 487b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org#include "src/base/sys-info.h" 49196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/d8-debug.h" 50196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/debug.h" 51196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/natives.h" 52196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/v8.h" 53865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org#endif // !V8_SHARED 545a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 556db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org#if !defined(_WIN32) && !defined(_WIN64) 566db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org#include <unistd.h> // NOLINT 57a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org#else 58a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org#include <windows.h> // NOLINT 59a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org#if defined(_MSC_VER) 60a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org#include <crtdbg.h> // NOLINT 61a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org#endif // defined(_MSC_VER) 62a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org#endif // !defined(_WIN32) && !defined(_WIN64) 635a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 64e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org#ifndef DCHECK 65e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org#define DCHECK(condition) assert(condition) 667c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org#endif 675a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 6884bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.orgnamespace v8 { 695a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 708e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org 71f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.orgstatic Handle<Value> Throw(Isolate* isolate, const char* message) { 72f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org return isolate->ThrowException(String::NewFromUtf8(isolate, message)); 738e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org} 748e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org 758e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org 768e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org 7732d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.orgclass PerIsolateData { 788e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org public: 7932d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org explicit PerIsolateData(Isolate* isolate) : isolate_(isolate), realms_(NULL) { 802bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org HandleScope scope(isolate); 817ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org isolate->SetData(0, this); 828e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org } 838e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org 8432d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org ~PerIsolateData() { 857ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org isolate_->SetData(0, NULL); // Not really needed, just to be sure... 868e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org } 878e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org 8832d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org inline static PerIsolateData* Get(Isolate* isolate) { 897ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org return reinterpret_cast<PerIsolateData*>(isolate->GetData(0)); 908e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org } 9132d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org 9232d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org class RealmScope { 9332d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org public: 9432d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org explicit RealmScope(PerIsolateData* data); 9532d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org ~RealmScope(); 9632d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org private: 9732d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org PerIsolateData* data_; 9832d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org }; 998e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org 1008e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org private: 10132d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org friend class Shell; 10232d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org friend class RealmScope; 1038e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org Isolate* isolate_; 10432d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org int realm_count_; 10532d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org int realm_current_; 10632d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org int realm_switch_; 10732d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org Persistent<Context>* realms_; 10832d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org Persistent<Value> realm_shared_; 10932d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org 110f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org int RealmIndexOrThrow(const v8::FunctionCallbackInfo<v8::Value>& args, 111f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org int arg_offset); 11232d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org int RealmFind(Handle<Context> context); 1138e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org}; 1148e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org 1158e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org 1164a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.orgLineEditor *LineEditor::current_ = NULL; 1175a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 1185a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 1195a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.orgLineEditor::LineEditor(Type type, const char* name) 1204a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org : type_(type), name_(name) { 1214a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org if (current_ == NULL || current_->type_ < type) current_ = this; 1225a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org} 1235a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 1245a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 1255a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.orgclass DumbLineEditor: public LineEditor { 1265a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org public: 1278e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org explicit DumbLineEditor(Isolate* isolate) 1288e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org : LineEditor(LineEditor::DUMB, "dumb"), isolate_(isolate) { } 1292efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org virtual Handle<String> Prompt(const char* prompt); 1308e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org private: 1318e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org Isolate* isolate_; 1325a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org}; 1335a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 1345a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 1352efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.orgHandle<String> DumbLineEditor::Prompt(const char* prompt) { 1365a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org printf("%s", prompt); 137e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#if defined(__native_client__) 138e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org // Native Client libc is used to being embedded in Chrome and 139e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org // has trouble recognizing when to flush. 140e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org fflush(stdout); 141e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#endif 1428e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org return Shell::ReadFromStdin(isolate_); 1435a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org} 1445a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 1455a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 1462efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org#ifndef V8_SHARED 147f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.orgCounterMap* Shell::counter_map_; 1485de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.orgbase::OS::MemoryMappedFile* Shell::counters_file_ = NULL; 149a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgCounterCollection Shell::local_counters_; 150a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgCounterCollection* Shell::counters_ = &local_counters_; 1515de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.orgbase::Mutex Shell::context_mutex_; 1525de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.orgconst base::TimeTicks Shell::kInitialTicks = 1535de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org base::TimeTicks::HighResolutionNow(); 1545a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.orgPersistent<Context> Shell::utility_context_; 155865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org#endif // !V8_SHARED 15684bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org 1575a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.orgPersistent<Context> Shell::evaluation_context_; 1586db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.orgShellOptions Shell::options; 15984bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.orgconst char* Shell::kPrompt = "d8> "; 1605a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 1615a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 162afbdadc5f06365a7889e7c1c1fdb7dbf596cce68machenbach@chromium.org#ifndef V8_SHARED 163659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.orgconst int MB = 1024 * 1024; 164659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org 165f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.orgbool CounterMap::Match(void* key1, void* key2) { 166f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org const char* name1 = reinterpret_cast<const char*>(key1); 167f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org const char* name2 = reinterpret_cast<const char*>(key2); 168f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org return strcmp(name1, name2) == 0; 169f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org} 170865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org#endif // !V8_SHARED 171f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org 172f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org 173245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org// Converts a V8 value to a C string. 174c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.orgconst char* Shell::ToCString(const v8::String::Utf8Value& value) { 175245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org return *value ? *value : "<string conversion failed>"; 176245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org} 177245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org 178245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org 1794c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org// Compile a string within the current v8 context. 1804c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.orgLocal<UnboundScript> Shell::CompileString( 1814c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org Isolate* isolate, Local<String> source, Local<Value> name, 1824c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org v8::ScriptCompiler::CompileOptions compile_options) { 1834c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org ScriptOrigin origin(name); 1844c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org ScriptCompiler::Source script_source(source, origin); 1854c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org Local<UnboundScript> script = 1864c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org ScriptCompiler::CompileUnbound(isolate, &script_source, compile_options); 1874c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org 1884c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org // Was caching requested & successful? Then compile again, now with cache. 1894c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org if (script_source.GetCachedData()) { 1904c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org if (compile_options == ScriptCompiler::kProduceCodeCache) { 1914c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org compile_options = ScriptCompiler::kConsumeCodeCache; 1924c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org } else if (compile_options == ScriptCompiler::kProduceParserCache) { 1934c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org compile_options = ScriptCompiler::kConsumeParserCache; 1944c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org } else { 195e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(false); // A new compile option? 1964c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org } 1974c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org ScriptCompiler::Source cached_source( 1984c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org source, origin, new v8::ScriptCompiler::CachedData( 1994c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org script_source.GetCachedData()->data, 2004c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org script_source.GetCachedData()->length, 2014c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org v8::ScriptCompiler::CachedData::BufferNotOwned)); 2024c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org script = ScriptCompiler::CompileUnbound(isolate, &cached_source, 2034c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org compile_options); 2044c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org } 2054c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org return script; 2064c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org} 2074c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org 2084c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org 2095a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org// Executes a string within the current v8 context. 2102bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.orgbool Shell::ExecuteString(Isolate* isolate, 2112bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org Handle<String> source, 2125a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org Handle<Value> name, 2135a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org bool print_result, 2145a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org bool report_exceptions) { 215865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org#ifndef V8_SHARED 21684bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org bool FLAG_debugger = i::FLAG_debugger; 21784bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org#else 21884bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org bool FLAG_debugger = false; 219865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org#endif // !V8_SHARED 2202bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org HandleScope handle_scope(isolate); 2215a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org TryCatch try_catch; 2226db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org options.script_executed = true; 22384bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org if (FLAG_debugger) { 22437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com // When debugging make exceptions appear to be uncaught. 22537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com try_catch.SetVerbose(true); 22637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com } 2274c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org 22869f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org Handle<UnboundScript> script = 2294c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org Shell::CompileString(isolate, source, name, options.compile_options); 2305a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org if (script.IsEmpty()) { 2315a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org // Print errors that happened during compilation. 23284bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org if (report_exceptions && !FLAG_debugger) 2332bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org ReportException(isolate, &try_catch); 2345a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org return false; 2355a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org } else { 23632d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org PerIsolateData* data = PerIsolateData::Get(isolate); 23732d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org Local<Context> realm = 23857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org Local<Context>::New(isolate, data->realms_[data->realm_current_]); 23932d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org realm->Enter(); 2406b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org Handle<Value> result = script->BindToCurrentContext()->Run(); 24132d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org realm->Exit(); 24232d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org data->realm_current_ = data->realm_switch_; 2435a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org if (result.IsEmpty()) { 244e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(try_catch.HasCaught()); 2455a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org // Print errors that happened during execution. 24684bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org if (report_exceptions && !FLAG_debugger) 2472bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org ReportException(isolate, &try_catch); 2485a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org return false; 2495a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org } else { 250e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!try_catch.HasCaught()); 251876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org if (print_result) { 2524c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.org#if !defined(V8_SHARED) 253876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org if (options.test_shell) { 2544c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.org#endif 255876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org if (!result->IsUndefined()) { 256876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org // If all went well and the result wasn't undefined then print 257876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org // the returned value. 258876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org v8::String::Utf8Value str(result); 259876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org fwrite(*str, sizeof(**str), str.length(), stdout); 260876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org printf("\n"); 261876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org } 2624c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.org#if !defined(V8_SHARED) 263876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org } else { 264f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org v8::TryCatch try_catch; 265c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org v8::Local<v8::Context> context = 266c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org v8::Local<v8::Context>::New(isolate, utility_context_); 267c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org v8::Context::Scope context_scope(context); 268b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org Handle<Object> global = context->Global(); 269f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org Handle<Value> fun = 270f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org global->Get(String::NewFromUtf8(isolate, "Stringify")); 271876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org Handle<Value> argv[1] = { result }; 272876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org Handle<Value> s = Handle<Function>::Cast(fun)->Call(global, 1, argv); 273f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org if (try_catch.HasCaught()) return true; 274876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org v8::String::Utf8Value str(s); 275876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org fwrite(*str, sizeof(**str), str.length(), stdout); 276876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org printf("\n"); 277876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org } 2784c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.org#endif 2795a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org } 2805a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org return true; 2815a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org } 2825a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org } 2835a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org} 2845a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 2855a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 28632d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.orgPerIsolateData::RealmScope::RealmScope(PerIsolateData* data) : data_(data) { 28732d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org data_->realm_count_ = 1; 28832d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org data_->realm_current_ = 0; 28932d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org data_->realm_switch_ = 0; 29032d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org data_->realms_ = new Persistent<Context>[1]; 291528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org data_->realms_[0].Reset(data_->isolate_, 292528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org data_->isolate_->GetEnteredContext()); 29332d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org} 29432d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org 29532d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org 29632d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.orgPerIsolateData::RealmScope::~RealmScope() { 29732d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org // Drop realms to avoid keeping them alive. 29832d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org for (int i = 0; i < data_->realm_count_; ++i) 299f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org data_->realms_[i].Reset(); 30032d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org delete[] data_->realms_; 30132d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org if (!data_->realm_shared_.IsEmpty()) 302f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org data_->realm_shared_.Reset(); 30332d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org} 30432d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org 30532d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org 30632d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.orgint PerIsolateData::RealmFind(Handle<Context> context) { 30732d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org for (int i = 0; i < realm_count_; ++i) { 30832d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org if (realms_[i] == context) return i; 30932d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org } 31032d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org return -1; 31132d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org} 31232d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org 31332d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org 314f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgint PerIsolateData::RealmIndexOrThrow( 315f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org const v8::FunctionCallbackInfo<v8::Value>& args, 316f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org int arg_offset) { 317f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (args.Length() < arg_offset || !args[arg_offset]->IsNumber()) { 318f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org Throw(args.GetIsolate(), "Invalid argument"); 319f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return -1; 320f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 321f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org int index = args[arg_offset]->Int32Value(); 322f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (index < 0 || 323f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org index >= realm_count_ || 324f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org realms_[index].IsEmpty()) { 325f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org Throw(args.GetIsolate(), "Invalid realm index"); 326f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return -1; 327f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 328f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return index; 329f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 330f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 331f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 332e94b5ff1e1e95fb2c8ef6bce66ce8533786d9792bmeurer@chromium.org#ifndef V8_SHARED 333e94b5ff1e1e95fb2c8ef6bce66ce8533786d9792bmeurer@chromium.org// performance.now() returns a time stamp as double, measured in milliseconds. 3344b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org// When FLAG_verify_predictable mode is enabled it returns current value 3354b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org// of Heap::allocations_count(). 336e94b5ff1e1e95fb2c8ef6bce66ce8533786d9792bmeurer@chromium.orgvoid Shell::PerformanceNow(const v8::FunctionCallbackInfo<v8::Value>& args) { 3374b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org if (i::FLAG_verify_predictable) { 3384b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org Isolate* v8_isolate = args.GetIsolate(); 3394b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org i::Heap* heap = reinterpret_cast<i::Isolate*>(v8_isolate)->heap(); 3404b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org args.GetReturnValue().Set(heap->synthetic_time()); 3414b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org } else { 3425de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org base::TimeDelta delta = 3435de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org base::TimeTicks::HighResolutionNow() - kInitialTicks; 3444b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org args.GetReturnValue().Set(delta.InMillisecondsF()); 3454b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org } 346e94b5ff1e1e95fb2c8ef6bce66ce8533786d9792bmeurer@chromium.org} 347865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org#endif // !V8_SHARED 348e94b5ff1e1e95fb2c8ef6bce66ce8533786d9792bmeurer@chromium.org 349e94b5ff1e1e95fb2c8ef6bce66ce8533786d9792bmeurer@chromium.org 35032d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org// Realm.current() returns the index of the currently active realm. 351d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.orgvoid Shell::RealmCurrent(const v8::FunctionCallbackInfo<v8::Value>& args) { 35232d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org Isolate* isolate = args.GetIsolate(); 35332d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org PerIsolateData* data = PerIsolateData::Get(isolate); 354528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org int index = data->RealmFind(isolate->GetEnteredContext()); 355d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org if (index == -1) return; 356d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org args.GetReturnValue().Set(index); 35732d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org} 35832d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org 35932d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org 36032d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org// Realm.owner(o) returns the index of the realm that created o. 361d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.orgvoid Shell::RealmOwner(const v8::FunctionCallbackInfo<v8::Value>& args) { 36232d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org Isolate* isolate = args.GetIsolate(); 36332d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org PerIsolateData* data = PerIsolateData::Get(isolate); 36432d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org if (args.Length() < 1 || !args[0]->IsObject()) { 365f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org Throw(args.GetIsolate(), "Invalid argument"); 366d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org return; 36732d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org } 36832d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org int index = data->RealmFind(args[0]->ToObject()->CreationContext()); 369d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org if (index == -1) return; 370d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org args.GetReturnValue().Set(index); 37132d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org} 37232d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org 37332d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org 37432d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org// Realm.global(i) returns the global object of realm i. 37532d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org// (Note that properties of global objects cannot be read/written cross-realm.) 376d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.orgvoid Shell::RealmGlobal(const v8::FunctionCallbackInfo<v8::Value>& args) { 37732d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org PerIsolateData* data = PerIsolateData::Get(args.GetIsolate()); 378f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org int index = data->RealmIndexOrThrow(args, 0); 379f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (index == -1) return; 380d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org args.GetReturnValue().Set( 381d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org Local<Context>::New(args.GetIsolate(), data->realms_[index])->Global()); 38232d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org} 38332d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org 38432d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org 38532d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org// Realm.create() creates a new realm and returns its index. 386d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.orgvoid Shell::RealmCreate(const v8::FunctionCallbackInfo<v8::Value>& args) { 38732d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org Isolate* isolate = args.GetIsolate(); 38832d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org PerIsolateData* data = PerIsolateData::Get(isolate); 38932d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org Persistent<Context>* old_realms = data->realms_; 39032d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org int index = data->realm_count_; 39132d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org data->realms_ = new Persistent<Context>[++data->realm_count_]; 392b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org for (int i = 0; i < index; ++i) { 393b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org data->realms_[i].Reset(isolate, old_realms[i]); 394b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org } 39532d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org delete[] old_realms; 39632d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org Handle<ObjectTemplate> global_template = CreateGlobalTemplate(isolate); 397b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org data->realms_[index].Reset( 39832d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org isolate, Context::New(isolate, NULL, global_template)); 399d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org args.GetReturnValue().Set(index); 40032d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org} 40132d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org 40232d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org 40332d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org// Realm.dispose(i) disposes the reference to the realm i. 404d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.orgvoid Shell::RealmDispose(const v8::FunctionCallbackInfo<v8::Value>& args) { 40532d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org Isolate* isolate = args.GetIsolate(); 40632d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org PerIsolateData* data = PerIsolateData::Get(isolate); 407f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org int index = data->RealmIndexOrThrow(args, 0); 408f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (index == -1) return; 409f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (index == 0 || 41032d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org index == data->realm_current_ || index == data->realm_switch_) { 411f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org Throw(args.GetIsolate(), "Invalid realm index"); 412d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org return; 41332d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org } 414f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org data->realms_[index].Reset(); 41532d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org} 41632d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org 41732d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org 41832d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org// Realm.switch(i) switches to the realm i for consecutive interactive inputs. 419d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.orgvoid Shell::RealmSwitch(const v8::FunctionCallbackInfo<v8::Value>& args) { 42032d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org Isolate* isolate = args.GetIsolate(); 42132d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org PerIsolateData* data = PerIsolateData::Get(isolate); 422f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org int index = data->RealmIndexOrThrow(args, 0); 423f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (index == -1) return; 42432d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org data->realm_switch_ = index; 42532d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org} 42632d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org 42732d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org 42832d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org// Realm.eval(i, s) evaluates s in realm i and returns the result. 429d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.orgvoid Shell::RealmEval(const v8::FunctionCallbackInfo<v8::Value>& args) { 43032d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org Isolate* isolate = args.GetIsolate(); 43132d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org PerIsolateData* data = PerIsolateData::Get(isolate); 432f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org int index = data->RealmIndexOrThrow(args, 0); 433f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (index == -1) return; 434f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (args.Length() < 2 || !args[1]->IsString()) { 435f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org Throw(args.GetIsolate(), "Invalid argument"); 436d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org return; 43732d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org } 43869f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org ScriptCompiler::Source script_source(args[1]->ToString()); 4396b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org Handle<UnboundScript> script = ScriptCompiler::CompileUnbound( 44069f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org isolate, &script_source); 441d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org if (script.IsEmpty()) return; 44257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org Local<Context> realm = Local<Context>::New(isolate, data->realms_[index]); 44332d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org realm->Enter(); 4446b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org Handle<Value> result = script->BindToCurrentContext()->Run(); 44532d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org realm->Exit(); 446d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org args.GetReturnValue().Set(result); 44732d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org} 44832d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org 44932d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org 45032d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org// Realm.shared is an accessor for a single shared value across realms. 451d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.orgvoid Shell::RealmSharedGet(Local<String> property, 452d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org const PropertyCallbackInfo<Value>& info) { 45332d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org Isolate* isolate = info.GetIsolate(); 45432d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org PerIsolateData* data = PerIsolateData::Get(isolate); 455d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org if (data->realm_shared_.IsEmpty()) return; 456d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org info.GetReturnValue().Set(data->realm_shared_); 45732d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org} 45832d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org 45932d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.orgvoid Shell::RealmSharedSet(Local<String> property, 46032d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org Local<Value> value, 461d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org const PropertyCallbackInfo<void>& info) { 46232d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org Isolate* isolate = info.GetIsolate(); 46332d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org PerIsolateData* data = PerIsolateData::Get(isolate); 464b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org data->realm_shared_.Reset(isolate, value); 46532d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org} 46632d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org 46732d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org 468d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.orgvoid Shell::Print(const v8::FunctionCallbackInfo<v8::Value>& args) { 469d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org Write(args); 4705a6af92a1549c81fb61855518f43b712e4c0e469christian.plesner.hansen@gmail.com printf("\n"); 471717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org fflush(stdout); 4725a6af92a1549c81fb61855518f43b712e4c0e469christian.plesner.hansen@gmail.com} 4735a6af92a1549c81fb61855518f43b712e4c0e469christian.plesner.hansen@gmail.com 4745a6af92a1549c81fb61855518f43b712e4c0e469christian.plesner.hansen@gmail.com 475d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.orgvoid Shell::Write(const v8::FunctionCallbackInfo<v8::Value>& args) { 4765a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org for (int i = 0; i < args.Length(); i++) { 4772bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org HandleScope handle_scope(args.GetIsolate()); 4785a6af92a1549c81fb61855518f43b712e4c0e469christian.plesner.hansen@gmail.com if (i != 0) { 4795a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org printf(" "); 4805a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org } 48156c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org 48256c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org // Explicitly catch potential exceptions in toString(). 48356c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org v8::TryCatch try_catch; 48456c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org Handle<String> str_obj = args[i]->ToString(); 485d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org if (try_catch.HasCaught()) { 486d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org try_catch.ReThrow(); 487d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org return; 488d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org } 48956c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org 49056c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org v8::String::Utf8Value str(str_obj); 4912c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org int n = static_cast<int>(fwrite(*str, sizeof(**str), str.length(), stdout)); 492ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org if (n != str.length()) { 493ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org printf("Error in fwrite\n"); 49434e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org Exit(1); 495ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org } 4965a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org } 4975a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org} 4985a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 4995a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 500d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.orgvoid Shell::Read(const v8::FunctionCallbackInfo<v8::Value>& args) { 50165dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org String::Utf8Value file(args[0]); 50265dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org if (*file == NULL) { 503f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org Throw(args.GetIsolate(), "Error loading file"); 504d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org return; 50565dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org } 5068e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org Handle<String> source = ReadFile(args.GetIsolate(), *file); 50765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org if (source.IsEmpty()) { 508f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org Throw(args.GetIsolate(), "Error loading file"); 509d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org return; 51065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org } 511d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org args.GetReturnValue().Set(source); 51265dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org} 51365dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 51465dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 5158e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.orgHandle<String> Shell::ReadFromStdin(Isolate* isolate) { 51684bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org static const int kBufferSize = 256; 51784bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org char buffer[kBufferSize]; 518f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org Handle<String> accumulator = String::NewFromUtf8(isolate, ""); 51984bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org int length; 520d4e9e2260ea982962098fd5ccae7593549f7686elrn@chromium.org while (true) { 521d4e9e2260ea982962098fd5ccae7593549f7686elrn@chromium.org // Continue reading if the line ends with an escape '\\' or the line has 522d4e9e2260ea982962098fd5ccae7593549f7686elrn@chromium.org // not been fully read into the buffer yet (does not end with '\n'). 523d4e9e2260ea982962098fd5ccae7593549f7686elrn@chromium.org // If fgets gets an error, just give up. 52405ed9ddc6ff3a1ab3983c50d378cddfa257869b6jkummerow@chromium.org char* input = NULL; 525fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org input = fgets(buffer, kBufferSize, stdin); 52605ed9ddc6ff3a1ab3983c50d378cddfa257869b6jkummerow@chromium.org if (input == NULL) return Handle<String>(); 5272c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org length = static_cast<int>(strlen(buffer)); 528d4e9e2260ea982962098fd5ccae7593549f7686elrn@chromium.org if (length == 0) { 529d4e9e2260ea982962098fd5ccae7593549f7686elrn@chromium.org return accumulator; 530d4e9e2260ea982962098fd5ccae7593549f7686elrn@chromium.org } else if (buffer[length-1] != '\n') { 531f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org accumulator = String::Concat( 532f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org accumulator, 533f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org String::NewFromUtf8(isolate, buffer, String::kNormalString, length)); 534d4e9e2260ea982962098fd5ccae7593549f7686elrn@chromium.org } else if (length > 1 && buffer[length-2] == '\\') { 535d4e9e2260ea982962098fd5ccae7593549f7686elrn@chromium.org buffer[length-2] = '\n'; 536f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org accumulator = String::Concat( 537f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org accumulator, String::NewFromUtf8(isolate, buffer, 538f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org String::kNormalString, length - 1)); 539d4e9e2260ea982962098fd5ccae7593549f7686elrn@chromium.org } else { 540f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org return String::Concat( 541f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org accumulator, String::NewFromUtf8(isolate, buffer, 542f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org String::kNormalString, length - 1)); 543d4e9e2260ea982962098fd5ccae7593549f7686elrn@chromium.org } 544d4e9e2260ea982962098fd5ccae7593549f7686elrn@chromium.org } 545add848f7b25aaacf2ebb523696c074d8be15e215ager@chromium.org} 546add848f7b25aaacf2ebb523696c074d8be15e215ager@chromium.org 547add848f7b25aaacf2ebb523696c074d8be15e215ager@chromium.org 548d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.orgvoid Shell::Load(const v8::FunctionCallbackInfo<v8::Value>& args) { 5495a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org for (int i = 0; i < args.Length(); i++) { 5502bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org HandleScope handle_scope(args.GetIsolate()); 5515a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org String::Utf8Value file(args[i]); 552245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org if (*file == NULL) { 553f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org Throw(args.GetIsolate(), "Error loading file"); 554d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org return; 555245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org } 5568e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org Handle<String> source = ReadFile(args.GetIsolate(), *file); 5575a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org if (source.IsEmpty()) { 558f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org Throw(args.GetIsolate(), "Error loading file"); 559d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org return; 5605a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org } 5612bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org if (!ExecuteString(args.GetIsolate(), 5622bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org source, 563f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org String::NewFromUtf8(args.GetIsolate(), *file), 5642bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org false, 5652bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org true)) { 566f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org Throw(args.GetIsolate(), "Error executing file"); 567d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org return; 5685a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org } 5695a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org } 5705a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org} 5715a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 572d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org 573d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.orgvoid Shell::Quit(const v8::FunctionCallbackInfo<v8::Value>& args) { 5745a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org int exit_code = args[0]->Int32Value(); 5755a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org OnExit(); 5765a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org exit(exit_code); 5775a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org} 5785a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 5795a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 580d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.orgvoid Shell::Version(const v8::FunctionCallbackInfo<v8::Value>& args) { 581f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org args.GetReturnValue().Set( 582f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org String::NewFromUtf8(args.GetIsolate(), V8::GetVersion())); 5835a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org} 5845a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 5855a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 5862bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.orgvoid Shell::ReportException(Isolate* isolate, v8::TryCatch* try_catch) { 5872bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org HandleScope handle_scope(isolate); 588865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org#ifndef V8_SHARED 589b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org Handle<Context> utility_context; 590f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org bool enter_context = !isolate->InContext(); 591b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org if (enter_context) { 592b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org utility_context = Local<Context>::New(isolate, utility_context_); 593b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org utility_context->Enter(); 594b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org } 595865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org#endif // !V8_SHARED 596245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org v8::String::Utf8Value exception(try_catch->Exception()); 597245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org const char* exception_string = ToCString(exception); 5985a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org Handle<Message> message = try_catch->Message(); 5995a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org if (message.IsEmpty()) { 6005a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org // V8 didn't provide any extra information about this error; just 6015a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org // print the exception. 602245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org printf("%s\n", exception_string); 6035a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org } else { 6045a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org // Print (filename):(line number): (message). 6054b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org v8::String::Utf8Value filename(message->GetScriptOrigin().ResourceName()); 606245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org const char* filename_string = ToCString(filename); 6075a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org int linenum = message->GetLineNumber(); 608245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org printf("%s:%i: %s\n", filename_string, linenum, exception_string); 6095a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org // Print line of source code. 610245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org v8::String::Utf8Value sourceline(message->GetSourceLine()); 611245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org const char* sourceline_string = ToCString(sourceline); 612245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org printf("%s\n", sourceline_string); 6135a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org // Print wavy underline (GetUnderline is deprecated). 6145a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org int start = message->GetStartColumn(); 6155a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org for (int i = 0; i < start; i++) { 6165a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org printf(" "); 6175a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org } 6185a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org int end = message->GetEndColumn(); 6195a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org for (int i = start; i < end; i++) { 6205a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org printf("^"); 6215a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org } 6225a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org printf("\n"); 62340cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.org v8::String::Utf8Value stack_trace(try_catch->StackTrace()); 62440cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.org if (stack_trace.length() > 0) { 62540cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.org const char* stack_trace_string = ToCString(stack_trace); 62640cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.org printf("%s\n", stack_trace_string); 62740cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.org } 6285a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org } 62983e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org printf("\n"); 630865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org#ifndef V8_SHARED 631b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org if (enter_context) utility_context->Exit(); 632865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org#endif // !V8_SHARED 6335a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org} 6345a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 6355a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 6367c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org#ifndef V8_SHARED 6372bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.orgHandle<Array> Shell::GetCompletions(Isolate* isolate, 6382bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org Handle<String> text, 6392bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org Handle<String> full) { 640afbdadc5f06365a7889e7c1c1fdb7dbf596cce68machenbach@chromium.org EscapableHandleScope handle_scope(isolate); 641b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org v8::Local<v8::Context> utility_context = 642c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org v8::Local<v8::Context>::New(isolate, utility_context_); 643b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org v8::Context::Scope context_scope(utility_context); 644b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org Handle<Object> global = utility_context->Global(); 645afbdadc5f06365a7889e7c1c1fdb7dbf596cce68machenbach@chromium.org Local<Value> fun = 646f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org global->Get(String::NewFromUtf8(isolate, "GetCompletions")); 6475a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org static const int kArgc = 3; 648b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org v8::Local<v8::Context> evaluation_context = 649b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org v8::Local<v8::Context>::New(isolate, evaluation_context_); 650b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org Handle<Value> argv[kArgc] = { evaluation_context->Global(), text, full }; 651afbdadc5f06365a7889e7c1c1fdb7dbf596cce68machenbach@chromium.org Local<Value> val = Local<Function>::Cast(fun)->Call(global, kArgc, argv); 652afbdadc5f06365a7889e7c1c1fdb7dbf596cce68machenbach@chromium.org return handle_scope.Escape(Local<Array>::Cast(val)); 6535a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org} 6545a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 6555a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 656034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.orgLocal<Object> Shell::DebugMessageDetails(Isolate* isolate, 657034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org Handle<String> message) { 658034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org EscapableHandleScope handle_scope(isolate); 659c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org v8::Local<v8::Context> context = 660c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org v8::Local<v8::Context>::New(isolate, utility_context_); 661c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org v8::Context::Scope context_scope(context); 662b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org Handle<Object> global = context->Global(); 663f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org Handle<Value> fun = 664f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org global->Get(String::NewFromUtf8(isolate, "DebugMessageDetails")); 66537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com static const int kArgc = 1; 6667be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org Handle<Value> argv[kArgc] = { message }; 66737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com Handle<Value> val = Handle<Function>::Cast(fun)->Call(global, kArgc, argv); 668034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org return handle_scope.Escape(Local<Object>(Handle<Object>::Cast(val))); 66937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com} 67037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com 67137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com 672034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.orgLocal<Value> Shell::DebugCommandToJSONRequest(Isolate* isolate, 673034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org Handle<String> command) { 674034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org EscapableHandleScope handle_scope(isolate); 675c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org v8::Local<v8::Context> context = 676c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org v8::Local<v8::Context>::New(isolate, utility_context_); 677c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org v8::Context::Scope context_scope(context); 678b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org Handle<Object> global = context->Global(); 679f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org Handle<Value> fun = 680f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org global->Get(String::NewFromUtf8(isolate, "DebugCommandToJSONRequest")); 68137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com static const int kArgc = 1; 68237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com Handle<Value> argv[kArgc] = { command }; 68337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com Handle<Value> val = Handle<Function>::Cast(fun)->Call(global, kArgc, argv); 684034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org return handle_scope.Escape(Local<Value>(val)); 68537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com} 68605ed9ddc6ff3a1ab3983c50d378cddfa257869b6jkummerow@chromium.org 68705ed9ddc6ff3a1ab3983c50d378cddfa257869b6jkummerow@chromium.org 688d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.orgint32_t* Counter::Bind(const char* name, bool is_histogram) { 689a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org int i; 690a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org for (i = 0; i < kMaxNameSize - 1 && name[i]; i++) 691a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org name_[i] = static_cast<char>(name[i]); 692a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org name_[i] = '\0'; 693d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org is_histogram_ = is_histogram; 694d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org return ptr(); 695d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org} 696d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org 697d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org 698d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.orgvoid Counter::AddSample(int32_t sample) { 699d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org count_++; 700d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org sample_total_ += sample; 701a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 702a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 703a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 704a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgCounterCollection::CounterCollection() { 705a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org magic_number_ = 0xDEADFACE; 706a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org max_counters_ = kMaxCounters; 707a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org max_name_size_ = Counter::kMaxNameSize; 708a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org counters_in_use_ = 0; 709a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 710a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 711a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 712a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgCounter* CounterCollection::GetNextCounter() { 713a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org if (counters_in_use_ == kMaxCounters) return NULL; 714a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org return &counters_[counters_in_use_++]; 715a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 716a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 717a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 7186b0d137a5839eff3ce1a98ca9e12310027eff30fmachenbach@chromium.orgvoid Shell::MapCounters(v8::Isolate* isolate, const char* name) { 7195de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org counters_file_ = base::OS::MemoryMappedFile::create( 72084bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org name, sizeof(CounterCollection), &local_counters_); 721a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org void* memory = (counters_file_ == NULL) ? 722a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org NULL : counters_file_->memory(); 723a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org if (memory == NULL) { 724a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org printf("Could not map counters file %s\n", name); 72534e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org Exit(1); 726a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 727a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org counters_ = static_cast<CounterCollection*>(memory); 7286b0d137a5839eff3ce1a98ca9e12310027eff30fmachenbach@chromium.org isolate->SetCounterFunction(LookupCounter); 7296b0d137a5839eff3ce1a98ca9e12310027eff30fmachenbach@chromium.org isolate->SetCreateHistogramFunction(CreateHistogram); 7306b0d137a5839eff3ce1a98ca9e12310027eff30fmachenbach@chromium.org isolate->SetAddHistogramSampleFunction(AddHistogramSample); 731a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 732a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 733a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 734f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.orgint CounterMap::Hash(const char* name) { 735f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org int h = 0; 736f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org int c; 737f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org while ((c = *name++) != 0) { 738f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org h += h << 5; 739f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org h += c; 740f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org } 741f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org return h; 742f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org} 743f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org 744f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org 745d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.orgCounter* Shell::GetCounter(const char* name, bool is_histogram) { 746f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org Counter* counter = counter_map_->Lookup(name); 747d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org 748d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org if (counter == NULL) { 749d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org counter = counters_->GetNextCounter(); 750d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org if (counter != NULL) { 751d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org counter_map_->Set(name, counter); 752d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org counter->Bind(name, is_histogram); 753d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org } 754d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org } else { 755e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(counter->is_histogram() == is_histogram); 756d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org } 757d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org return counter; 758d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org} 759d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org 760d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org 761d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.orgint* Shell::LookupCounter(const char* name) { 762d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org Counter* counter = GetCounter(name, false); 763d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org 764f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org if (counter != NULL) { 765f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org return counter->ptr(); 766d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org } else { 767d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org return NULL; 7685a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org } 769d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org} 770d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org 771d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org 772d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.orgvoid* Shell::CreateHistogram(const char* name, 773d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org int min, 774d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org int max, 775d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org size_t buckets) { 776d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org return GetCounter(name, true); 777d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org} 778d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org 779d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org 780d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.orgvoid Shell::AddHistogramSample(void* histogram, int sample) { 781d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org Counter* counter = reinterpret_cast<Counter*>(histogram); 782d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org counter->AddSample(sample); 7835a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org} 7845a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 78584bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org 78646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.orgvoid Shell::InstallUtilityScript(Isolate* isolate) { 7872bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org HandleScope scope(isolate); 78804921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org // If we use the utility context, we have to set the security tokens so that 78904921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org // utility, evaluation and debug context can all access each other. 790b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org v8::Local<v8::Context> utility_context = 791c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org v8::Local<v8::Context>::New(isolate, utility_context_); 792b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org v8::Local<v8::Context> evaluation_context = 793b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org v8::Local<v8::Context>::New(isolate, evaluation_context_); 794b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org utility_context->SetSecurityToken(Undefined(isolate)); 795b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org evaluation_context->SetSecurityToken(Undefined(isolate)); 796b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org v8::Context::Scope context_scope(utility_context); 79704921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org 798c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (i::FLAG_debugger) printf("JavaScript debugger enabled\n"); 79904921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org // Install the debugger object in the utility scope 800e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org i::Debug* debug = reinterpret_cast<i::Isolate*>(isolate)->debug(); 80104921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org debug->Load(); 8026a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org i::Handle<i::Context> debug_context = debug->debug_context(); 80304921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org i::Handle<i::JSObject> js_debug 8046a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org = i::Handle<i::JSObject>(debug_context->global_object()); 805f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org utility_context->Global()->Set(String::NewFromUtf8(isolate, "$debug"), 806f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org Utils::ToLocal(js_debug)); 8076a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org debug_context->set_security_token( 808c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org reinterpret_cast<i::Isolate*>(isolate)->heap()->undefined_value()); 80904921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org 8106d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org // Run the d8 shell utility script in the utility context 8116d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org int source_index = i::NativesCollection<i::D8>::GetIndex("d8"); 8126d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org i::Vector<const char> shell_source = 8136d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org i::NativesCollection<i::D8>::GetRawScriptSource(source_index); 8146d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org i::Vector<const char> shell_source_name = 8156d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org i::NativesCollection<i::D8>::GetScriptName(source_index); 816f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org Handle<String> source = 817f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org String::NewFromUtf8(isolate, shell_source.start(), String::kNormalString, 818f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org shell_source.length()); 819f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org Handle<String> name = 820f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org String::NewFromUtf8(isolate, shell_source_name.start(), 821f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org String::kNormalString, shell_source_name.length()); 8226b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org ScriptOrigin origin(name); 8236b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org Handle<Script> script = Script::Compile(source, &origin); 8246d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org script->Run(); 8256d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org // Mark the d8 shell script as native to avoid it showing up as normal source 8266d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org // in the debugger. 8276d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org i::Handle<i::Object> compiled_script = Utils::OpenHandle(*script); 8286d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org i::Handle<i::Script> script_object = compiled_script->IsJSFunction() 82984bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org ? i::Handle<i::Script>(i::Script::cast( 83084bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org i::JSFunction::cast(*compiled_script)->shared()->script())) 83184bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org : i::Handle<i::Script>(i::Script::cast( 83284bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org i::SharedFunctionInfo::cast(*compiled_script)->script())); 8336d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org script_object->set_type(i::Smi::FromInt(i::Script::TYPE_NATIVE)); 8346db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org 8356db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org // Start the in-process debugger if requested. 836aa107b240dc43417fae8469b5c1b0f1ec9f98400machenbach@chromium.org if (i::FLAG_debugger) v8::Debug::SetDebugEventListener(HandleDebugEvent); 8376d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org} 838865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org#endif // !V8_SHARED 8396d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org 84004921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org 8416d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org#ifdef COMPRESS_STARTUP_DATA_BZ2 8426d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.orgclass BZip2Decompressor : public v8::StartupDataDecompressor { 8436d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org public: 8446d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org virtual ~BZip2Decompressor() { } 8456d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org 8466d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org protected: 8476d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org virtual int DecompressData(char* raw_data, 8486d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org int* raw_data_size, 8496d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org const char* compressed_data, 8506d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org int compressed_data_size) { 851e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK_EQ(v8::StartupData::kBZip2, 8526d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org v8::V8::GetCompressedStartupDataAlgorithm()); 8536d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org unsigned int decompressed_size = *raw_data_size; 8546d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org int result = 8556d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org BZ2_bzBuffToBuffDecompress(raw_data, 8566d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org &decompressed_size, 8576d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org const_cast<char*>(compressed_data), 8586d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org compressed_data_size, 8596d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org 0, 1); 8606d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org if (result == BZ_OK) { 8616d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org *raw_data_size = decompressed_size; 8626d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org } 8636d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org return result; 864d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org } 8656d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org}; 8666d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org#endif 867d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org 868c74d674717b2e229addbb9349986cd157947f7edyangguo@chromium.org 8698e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.orgHandle<ObjectTemplate> Shell::CreateGlobalTemplate(Isolate* isolate) { 8709cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org Handle<ObjectTemplate> global_template = ObjectTemplate::New(isolate); 871f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org global_template->Set(String::NewFromUtf8(isolate, "print"), 8724f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org FunctionTemplate::New(isolate, Print)); 873f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org global_template->Set(String::NewFromUtf8(isolate, "write"), 8744f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org FunctionTemplate::New(isolate, Write)); 875f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org global_template->Set(String::NewFromUtf8(isolate, "read"), 8764f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org FunctionTemplate::New(isolate, Read)); 877f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org global_template->Set(String::NewFromUtf8(isolate, "readbuffer"), 8784f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org FunctionTemplate::New(isolate, ReadBuffer)); 879f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org global_template->Set(String::NewFromUtf8(isolate, "readline"), 8804f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org FunctionTemplate::New(isolate, ReadLine)); 881f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org global_template->Set(String::NewFromUtf8(isolate, "load"), 8824f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org FunctionTemplate::New(isolate, Load)); 883f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org global_template->Set(String::NewFromUtf8(isolate, "quit"), 8844f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org FunctionTemplate::New(isolate, Quit)); 885f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org global_template->Set(String::NewFromUtf8(isolate, "version"), 8864f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org FunctionTemplate::New(isolate, Version)); 88771daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org 88832d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org // Bind the Realm object. 8899cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org Handle<ObjectTemplate> realm_template = ObjectTemplate::New(isolate); 890f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org realm_template->Set(String::NewFromUtf8(isolate, "current"), 8914f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org FunctionTemplate::New(isolate, RealmCurrent)); 892f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org realm_template->Set(String::NewFromUtf8(isolate, "owner"), 8934f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org FunctionTemplate::New(isolate, RealmOwner)); 894f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org realm_template->Set(String::NewFromUtf8(isolate, "global"), 8954f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org FunctionTemplate::New(isolate, RealmGlobal)); 896f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org realm_template->Set(String::NewFromUtf8(isolate, "create"), 8974f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org FunctionTemplate::New(isolate, RealmCreate)); 898f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org realm_template->Set(String::NewFromUtf8(isolate, "dispose"), 8994f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org FunctionTemplate::New(isolate, RealmDispose)); 900f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org realm_template->Set(String::NewFromUtf8(isolate, "switch"), 9014f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org FunctionTemplate::New(isolate, RealmSwitch)); 902f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org realm_template->Set(String::NewFromUtf8(isolate, "eval"), 9034f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org FunctionTemplate::New(isolate, RealmEval)); 904f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org realm_template->SetAccessor(String::NewFromUtf8(isolate, "shared"), 90532d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org RealmSharedGet, RealmSharedSet); 906f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org global_template->Set(String::NewFromUtf8(isolate, "Realm"), realm_template); 90732d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org 908e94b5ff1e1e95fb2c8ef6bce66ce8533786d9792bmeurer@chromium.org#ifndef V8_SHARED 9099cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org Handle<ObjectTemplate> performance_template = ObjectTemplate::New(isolate); 910f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org performance_template->Set(String::NewFromUtf8(isolate, "now"), 9114f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org FunctionTemplate::New(isolate, PerformanceNow)); 912f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org global_template->Set(String::NewFromUtf8(isolate, "performance"), 913f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org performance_template); 914865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org#endif // !V8_SHARED 915e94b5ff1e1e95fb2c8ef6bce66ce8533786d9792bmeurer@chromium.org 9169cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org Handle<ObjectTemplate> os_templ = ObjectTemplate::New(isolate); 917f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org AddOSMethods(isolate, os_templ); 918f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org global_template->Set(String::NewFromUtf8(isolate, "os"), os_templ); 9195a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 9206d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org return global_template; 9216d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org} 9226d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org 92304921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org 9248e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.orgvoid Shell::Initialize(Isolate* isolate) { 9256d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org#ifdef COMPRESS_STARTUP_DATA_BZ2 9266d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org BZip2Decompressor startup_data_decompressor; 9276d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org int bz2_result = startup_data_decompressor.Decompress(); 9286d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org if (bz2_result != BZ_OK) { 9296d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org fprintf(stderr, "bzip error code: %d\n", bz2_result); 93034e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org Exit(1); 9316d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org } 9326d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org#endif 9336d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org 9347c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org#ifndef V8_SHARED 9356d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org Shell::counter_map_ = new CounterMap(); 9366d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org // Set up counters 9376d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org if (i::StrLength(i::FLAG_map_counters) != 0) 9386b0d137a5839eff3ce1a98ca9e12310027eff30fmachenbach@chromium.org MapCounters(isolate, i::FLAG_map_counters); 939304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org if (i::FLAG_dump_counters || i::FLAG_track_gc_object_stats) { 94012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org isolate->SetCounterFunction(LookupCounter); 94112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org isolate->SetCreateHistogramFunction(CreateHistogram); 94212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org isolate->SetAddHistogramSampleFunction(AddHistogramSample); 9436d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org } 944865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org#endif // !V8_SHARED 9458e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org} 94604921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org 9478e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org 9488e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.orgvoid Shell::InitializeDebugger(Isolate* isolate) { 9498e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org if (options.test_shell) return; 9507c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org#ifndef V8_SHARED 9512bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org HandleScope scope(isolate); 9528e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org Handle<ObjectTemplate> global_template = CreateGlobalTemplate(isolate); 95357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org utility_context_.Reset(isolate, 95457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org Context::New(isolate, NULL, global_template)); 955865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org#endif // !V8_SHARED 9566d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org} 9575a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 9587be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org 95957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.orgLocal<Context> Shell::CreateEvaluationContext(Isolate* isolate) { 9607c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org#ifndef V8_SHARED 9616db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org // This needs to be a critical section since this is not thread-safe 9625de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org base::LockGuard<base::Mutex> lock_guard(&context_mutex_); 963865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org#endif // !V8_SHARED 9646d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org // Initialize the global objects 9658e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org Handle<ObjectTemplate> global_template = CreateGlobalTemplate(isolate); 966afbdadc5f06365a7889e7c1c1fdb7dbf596cce68machenbach@chromium.org EscapableHandleScope handle_scope(isolate); 96757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org Local<Context> context = Context::New(isolate, NULL, global_template); 968e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!context.IsEmpty()); 9696db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org Context::Scope scope(context); 970a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 9717c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org#ifndef V8_SHARED 972e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org i::Factory* factory = reinterpret_cast<i::Isolate*>(isolate)->factory(); 9737b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org i::JSArguments js_args = i::FLAG_js_arguments; 9747b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org i::Handle<i::FixedArray> arguments_array = 975528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org factory->NewFixedArray(js_args.argc); 976528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org for (int j = 0; j < js_args.argc; j++) { 9777b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org i::Handle<i::String> arg = 9788496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org factory->NewStringFromUtf8(i::CStrVector(js_args[j])).ToHandleChecked(); 9797b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org arguments_array->set(j, *arg); 9807b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org } 9817b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org i::Handle<i::JSArray> arguments_jsarray = 982d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org factory->NewJSArrayWithElements(arguments_array); 983f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org context->Global()->Set(String::NewFromUtf8(isolate, "arguments"), 98484bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org Utils::ToLocal(arguments_jsarray)); 985865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org#endif // !V8_SHARED 986afbdadc5f06365a7889e7c1c1fdb7dbf596cce68machenbach@chromium.org return handle_scope.Escape(context); 9875a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org} 9885a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 9895a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 99034e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.orgvoid Shell::Exit(int exit_code) { 99134e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org // Use _exit instead of exit to avoid races between isolate 99234e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org // threads and static destructors. 99334e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org fflush(stdout); 99434e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org fflush(stderr); 99534e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org _exit(exit_code); 99634e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org} 99734e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org 99834e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org 9997c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org#ifndef V8_SHARED 10001b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.orgstruct CounterAndKey { 10011b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org Counter* counter; 10021b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org const char* key; 10031b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}; 10041b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org 10051b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org 1006ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.orginline bool operator<(const CounterAndKey& lhs, const CounterAndKey& rhs) { 1007ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org return strcmp(lhs.key, rhs.key) < 0; 10081b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org} 1009865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org#endif // !V8_SHARED 10101b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org 10111b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org 10125a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.orgvoid Shell::OnExit() { 101359297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org LineEditor* line_editor = LineEditor::Get(); 101459297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org if (line_editor) line_editor->Close(); 101559297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org#ifndef V8_SHARED 10165a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org if (i::FLAG_dump_counters) { 10171b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org int number_of_counters = 0; 1018f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org for (CounterMap::Iterator i(counter_map_); i.More(); i.Next()) { 10191b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org number_of_counters++; 10201b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org } 10211b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org CounterAndKey* counters = new CounterAndKey[number_of_counters]; 10221b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org int j = 0; 10231b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org for (CounterMap::Iterator i(counter_map_); i.More(); i.Next(), j++) { 10241b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org counters[j].counter = i.CurrentValue(); 10251b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org counters[j].key = i.CurrentKey(); 10261b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org } 1027ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org std::sort(counters, counters + number_of_counters); 102828583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org printf("+----------------------------------------------------------------+" 102928583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org "-------------+\n"); 103028583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org printf("| Name |" 103128583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org " Value |\n"); 103228583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org printf("+----------------------------------------------------------------+" 103328583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org "-------------+\n"); 10341b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org for (j = 0; j < number_of_counters; j++) { 10351b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org Counter* counter = counters[j].counter; 10361b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org const char* key = counters[j].key; 1037d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org if (counter->is_histogram()) { 103828583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org printf("| c:%-60s | %11i |\n", key, counter->count()); 103928583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org printf("| t:%-60s | %11i |\n", key, counter->sample_total()); 1040d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org } else { 104128583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org printf("| %-62s | %11i |\n", key, counter->count()); 1042d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org } 10435a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org } 104428583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org printf("+----------------------------------------------------------------+" 104528583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org "-------------+\n"); 10461b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org delete [] counters; 10475a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org } 10481456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org delete counters_file_; 10491456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org delete counter_map_; 1050865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org#endif // !V8_SHARED 105159297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org} 105259297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org 10537c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org 10547c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org 10557c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.orgstatic FILE* FOpen(const char* path, const char* mode) { 1056c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com#if defined(_MSC_VER) && (defined(_WIN32) || defined(_WIN64)) 10577c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org FILE* result; 10587c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org if (fopen_s(&result, path, mode) == 0) { 10597c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org return result; 10607c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org } else { 10617c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org return NULL; 10627c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org } 10637c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org#else 10647c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org FILE* file = fopen(path, mode); 10657c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org if (file == NULL) return NULL; 10667c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org struct stat file_stat; 10677c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org if (fstat(fileno(file), &file_stat) != 0) return NULL; 10687c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org bool is_regular_file = ((file_stat.st_mode & S_IFREG) != 0); 10697c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org if (is_regular_file) return file; 10707c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org fclose(file); 10717c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org return NULL; 10727c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org#endif 10737c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org} 10745a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 10755a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 10768e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.orgstatic char* ReadChars(Isolate* isolate, const char* name, int* size_out) { 10777c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org FILE* file = FOpen(name, "rb"); 1078ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org if (file == NULL) return NULL; 10795a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 10805a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org fseek(file, 0, SEEK_END); 10815a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org int size = ftell(file); 10825a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org rewind(file); 10835a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 10845a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org char* chars = new char[size + 1]; 10855a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org chars[size] = '\0'; 10865a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org for (int i = 0; i < size;) { 10872c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org int read = static_cast<int>(fread(&chars[i], 1, size - i, file)); 10885a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org i += read; 10895a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org } 10905a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org fclose(file); 1091ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org *size_out = size; 1092ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org return chars; 1093ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org} 1094ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org 1095ddf3811f8018dfe9e8ec7d1b8f4a8be1122fd767machenbach@chromium.org 1096ddf3811f8018dfe9e8ec7d1b8f4a8be1122fd767machenbach@chromium.orgstruct DataAndPersistent { 1097ddf3811f8018dfe9e8ec7d1b8f4a8be1122fd767machenbach@chromium.org uint8_t* data; 1098ddf3811f8018dfe9e8ec7d1b8f4a8be1122fd767machenbach@chromium.org Persistent<ArrayBuffer> handle; 1099ddf3811f8018dfe9e8ec7d1b8f4a8be1122fd767machenbach@chromium.org}; 1100ddf3811f8018dfe9e8ec7d1b8f4a8be1122fd767machenbach@chromium.org 1101ddf3811f8018dfe9e8ec7d1b8f4a8be1122fd767machenbach@chromium.org 1102ddf3811f8018dfe9e8ec7d1b8f4a8be1122fd767machenbach@chromium.orgstatic void ReadBufferWeakCallback( 1103ddf3811f8018dfe9e8ec7d1b8f4a8be1122fd767machenbach@chromium.org const v8::WeakCallbackData<ArrayBuffer, DataAndPersistent>& data) { 1104ddf3811f8018dfe9e8ec7d1b8f4a8be1122fd767machenbach@chromium.org size_t byte_length = data.GetValue()->ByteLength(); 1105ddf3811f8018dfe9e8ec7d1b8f4a8be1122fd767machenbach@chromium.org data.GetIsolate()->AdjustAmountOfExternalAllocatedMemory( 1106a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org -static_cast<intptr_t>(byte_length)); 1107a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org 1108ddf3811f8018dfe9e8ec7d1b8f4a8be1122fd767machenbach@chromium.org delete[] data.GetParameter()->data; 1109ddf3811f8018dfe9e8ec7d1b8f4a8be1122fd767machenbach@chromium.org data.GetParameter()->handle.Reset(); 1110ddf3811f8018dfe9e8ec7d1b8f4a8be1122fd767machenbach@chromium.org delete data.GetParameter(); 1111a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org} 1112ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org 1113e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 1114d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.orgvoid Shell::ReadBuffer(const v8::FunctionCallbackInfo<v8::Value>& args) { 1115e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(sizeof(char) == sizeof(uint8_t)); // NOLINT 1116cb9affa86506f210b7d9b425012b1026b4fd0f2fyangguo@chromium.org String::Utf8Value filename(args[0]); 1117cb9affa86506f210b7d9b425012b1026b4fd0f2fyangguo@chromium.org int length; 1118cb9affa86506f210b7d9b425012b1026b4fd0f2fyangguo@chromium.org if (*filename == NULL) { 1119f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org Throw(args.GetIsolate(), "Error loading file"); 1120d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org return; 1121cb9affa86506f210b7d9b425012b1026b4fd0f2fyangguo@chromium.org } 1122400388edd471bd4d4a97b21c52c1024cd1cc5708rossberg@chromium.org 1123a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org Isolate* isolate = args.GetIsolate(); 1124ddf3811f8018dfe9e8ec7d1b8f4a8be1122fd767machenbach@chromium.org DataAndPersistent* data = new DataAndPersistent; 1125ddf3811f8018dfe9e8ec7d1b8f4a8be1122fd767machenbach@chromium.org data->data = reinterpret_cast<uint8_t*>( 11268e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org ReadChars(args.GetIsolate(), *filename, &length)); 1127ddf3811f8018dfe9e8ec7d1b8f4a8be1122fd767machenbach@chromium.org if (data->data == NULL) { 1128ddf3811f8018dfe9e8ec7d1b8f4a8be1122fd767machenbach@chromium.org delete data; 1129f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org Throw(args.GetIsolate(), "Error reading file"); 1130d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org return; 1131cb9affa86506f210b7d9b425012b1026b4fd0f2fyangguo@chromium.org } 11329cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org Handle<v8::ArrayBuffer> buffer = 11339cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org ArrayBuffer::New(isolate, data->data, length); 1134ddf3811f8018dfe9e8ec7d1b8f4a8be1122fd767machenbach@chromium.org data->handle.Reset(isolate, buffer); 1135ddf3811f8018dfe9e8ec7d1b8f4a8be1122fd767machenbach@chromium.org data->handle.SetWeak(data, ReadBufferWeakCallback); 1136ddf3811f8018dfe9e8ec7d1b8f4a8be1122fd767machenbach@chromium.org data->handle.MarkIndependent(); 1137a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org isolate->AdjustAmountOfExternalAllocatedMemory(length); 1138a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org 1139d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org args.GetReturnValue().Set(buffer); 1140cb9affa86506f210b7d9b425012b1026b4fd0f2fyangguo@chromium.org} 1141cb9affa86506f210b7d9b425012b1026b4fd0f2fyangguo@chromium.org 1142cb9affa86506f210b7d9b425012b1026b4fd0f2fyangguo@chromium.org 1143ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org// Reads a file into a v8 string. 11448e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.orgHandle<String> Shell::ReadFile(Isolate* isolate, const char* name) { 1145ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org int size = 0; 11468e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org char* chars = ReadChars(isolate, name, &size); 1147ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org if (chars == NULL) return Handle<String>(); 1148f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org Handle<String> result = 1149f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org String::NewFromUtf8(isolate, chars, String::kNormalString, size); 11505a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org delete[] chars; 11515a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org return result; 11525a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org} 11535a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 11545a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 11558e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.orgvoid Shell::RunShell(Isolate* isolate) { 11562bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org HandleScope outer_scope(isolate); 1157c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org v8::Local<v8::Context> context = 1158c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org v8::Local<v8::Context>::New(isolate, evaluation_context_); 1159c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org v8::Context::Scope context_scope(context); 116057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org PerIsolateData::RealmScope realm_scope(PerIsolateData::Get(isolate)); 1161f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org Handle<String> name = String::NewFromUtf8(isolate, "(d8)"); 11628e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org LineEditor* console = LineEditor::Get(); 116334e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org printf("V8 version %s [console: %s]\n", V8::GetVersion(), console->name()); 11646e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org console->Open(isolate); 11655a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org while (true) { 11662bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org HandleScope inner_scope(isolate); 11672efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org Handle<String> input = console->Prompt(Shell::kPrompt); 11682efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org if (input.IsEmpty()) break; 11692bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org ExecuteString(isolate, input, name, true, true); 11705a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org } 11715a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org printf("\n"); 11725a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org} 11735a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 11745a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 117583e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.orgSourceGroup::~SourceGroup() { 117683e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org#ifndef V8_SHARED 117783e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org delete thread_; 117883e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org thread_ = NULL; 1179865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org#endif // !V8_SHARED 118083e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org} 118183e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org 118283e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org 11838e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.orgvoid SourceGroup::Execute(Isolate* isolate) { 118463ea3d20e0c5531a4bb0853218d5f746117edea1mvstanton@chromium.org bool exception_was_thrown = false; 11856db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org for (int i = begin_offset_; i < end_offset_; ++i) { 11866db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org const char* arg = argv_[i]; 11876db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org if (strcmp(arg, "-e") == 0 && i + 1 < end_offset_) { 11886db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org // Execute argument given to -e option directly. 11892bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org HandleScope handle_scope(isolate); 1190f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org Handle<String> file_name = String::NewFromUtf8(isolate, "unnamed"); 1191f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org Handle<String> source = String::NewFromUtf8(isolate, argv_[i + 1]); 11922bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org if (!Shell::ExecuteString(isolate, source, file_name, false, true)) { 119363ea3d20e0c5531a4bb0853218d5f746117edea1mvstanton@chromium.org exception_was_thrown = true; 119463ea3d20e0c5531a4bb0853218d5f746117edea1mvstanton@chromium.org break; 11956db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org } 11966db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org ++i; 11976db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org } else if (arg[0] == '-') { 11986db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org // Ignore other options. They have been parsed already. 11996db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org } else { 12006db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org // Use all other arguments as names of files to load and run. 12012bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org HandleScope handle_scope(isolate); 1202f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org Handle<String> file_name = String::NewFromUtf8(isolate, arg); 12038e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org Handle<String> source = ReadFile(isolate, arg); 12046db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org if (source.IsEmpty()) { 12056db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org printf("Error reading '%s'\n", arg); 120634e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org Shell::Exit(1); 12076db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org } 12082bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org if (!Shell::ExecuteString(isolate, source, file_name, false, true)) { 120963ea3d20e0c5531a4bb0853218d5f746117edea1mvstanton@chromium.org exception_was_thrown = true; 121063ea3d20e0c5531a4bb0853218d5f746117edea1mvstanton@chromium.org break; 1211a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 12125a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org } 12136db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org } 121463ea3d20e0c5531a4bb0853218d5f746117edea1mvstanton@chromium.org if (exception_was_thrown != Shell::options.expected_to_throw) { 121563ea3d20e0c5531a4bb0853218d5f746117edea1mvstanton@chromium.org Shell::Exit(1); 121663ea3d20e0c5531a4bb0853218d5f746117edea1mvstanton@chromium.org } 12176db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org} 12187be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org 12196db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org 12208e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.orgHandle<String> SourceGroup::ReadFile(Isolate* isolate, const char* name) { 12217c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org int size; 12228e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org char* chars = ReadChars(isolate, name, &size); 12237c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org if (chars == NULL) return Handle<String>(); 1224f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org Handle<String> result = 1225f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org String::NewFromUtf8(isolate, chars, String::kNormalString, size); 12266db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org delete[] chars; 12276db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org return result; 12286db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org} 12296db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org 12306db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org 12317c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org#ifndef V8_SHARED 12325de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.orgbase::Thread::Options SourceGroup::GetThreadOptions() { 12336db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org // On some systems (OSX 10.6) the stack size default is 0.5Mb or less 12346db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org // which is not enough to parse the big literal expressions used in tests. 12356db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org // The stack size should be at least StackGuard::kLimitSize + some 1236659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org // OS-specific padding for thread startup code. 2Mbytes seems to be enough. 12375de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org return base::Thread::Options("IsolateThread", 2 * MB); 12386db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org} 12396db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org 12406db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org 12416db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.orgvoid SourceGroup::ExecuteInThread() { 12426db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org Isolate* isolate = Isolate::New(); 12436db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org do { 1244e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org next_semaphore_.Wait(); 12456db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org { 12466db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org Isolate::Scope iscope(isolate); 12476db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org { 124857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org HandleScope scope(isolate); 124957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org PerIsolateData data(isolate); 125057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org Local<Context> context = Shell::CreateEvaluationContext(isolate); 125157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org { 125257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org Context::Scope cscope(context); 125357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org PerIsolateData::RealmScope realm_scope(PerIsolateData::Get(isolate)); 125457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org Execute(isolate); 125557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org } 12566db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org } 125746839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org if (Shell::options.send_idle_notification) { 125846839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org const int kLongIdlePauseInMs = 1000; 1259f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org isolate->ContextDisposedNotification(); 1260f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org isolate->IdleNotification(kLongIdlePauseInMs); 126146839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org } 1262d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org if (Shell::options.invoke_weak_callbacks) { 1263d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org // By sending a low memory notifications, we will try hard to collect 1264d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org // all garbage and will therefore also invoke all weak callbacks of 1265d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org // actually unreachable persistent handles. 1266f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org isolate->LowMemoryNotification(); 1267d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org } 1268bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org } 1269e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org done_semaphore_.Signal(); 12706db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org } while (!Shell::options.last_run); 1271d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org 12726db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org isolate->Dispose(); 12736db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org} 12746db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org 12756db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org 12766db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.orgvoid SourceGroup::StartExecuteInThread() { 127783e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org if (thread_ == NULL) { 127883e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org thread_ = new IsolateThread(this); 12796db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org thread_->Start(); 12805a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org } 1281e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org next_semaphore_.Signal(); 12826db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org} 12836db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org 12846d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org 12856db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.orgvoid SourceGroup::WaitForThread() { 128683e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org if (thread_ == NULL) return; 12876db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org if (Shell::options.last_run) { 12886db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org thread_->Join(); 12896db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org } else { 1290e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org done_semaphore_.Wait(); 1291ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org } 12925a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org} 1293865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org#endif // !V8_SHARED 12945a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 12955a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 1296a3b66334e4dd35d9d4874d275ef9c4a756f0225cmachenbach@chromium.orgvoid SetFlagsFromString(const char* flags) { 1297a3b66334e4dd35d9d4874d275ef9c4a756f0225cmachenbach@chromium.org v8::V8::SetFlagsFromString(flags, static_cast<int>(strlen(flags))); 1298a3b66334e4dd35d9d4874d275ef9c4a756f0225cmachenbach@chromium.org} 1299a3b66334e4dd35d9d4874d275ef9c4a756f0225cmachenbach@chromium.org 1300a3b66334e4dd35d9d4874d275ef9c4a756f0225cmachenbach@chromium.org 13016db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.orgbool Shell::SetOptions(int argc, char* argv[]) { 1302a3b66334e4dd35d9d4874d275ef9c4a756f0225cmachenbach@chromium.org bool logfile_per_isolate = false; 13036d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org for (int i = 0; i < argc; i++) { 13046d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org if (strcmp(argv[i], "--stress-opt") == 0) { 13056db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org options.stress_opt = true; 13066d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org argv[i] = NULL; 1307ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org } else if (strcmp(argv[i], "--nostress-opt") == 0) { 1308ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org options.stress_opt = false; 1309ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org argv[i] = NULL; 13106d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org } else if (strcmp(argv[i], "--stress-deopt") == 0) { 13116db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org options.stress_deopt = true; 13126d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org argv[i] = NULL; 1313af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org } else if (strcmp(argv[i], "--mock-arraybuffer-allocator") == 0) { 1314af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org options.mock_arraybuffer_allocator = true; 1315af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org argv[i] = NULL; 13166d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org } else if (strcmp(argv[i], "--noalways-opt") == 0) { 13176d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org // No support for stressing if we can't use --always-opt. 13186db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org options.stress_opt = false; 13196db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org options.stress_deopt = false; 1320a3b66334e4dd35d9d4874d275ef9c4a756f0225cmachenbach@chromium.org } else if (strcmp(argv[i], "--logfile-per-isolate") == 0) { 1321a3b66334e4dd35d9d4874d275ef9c4a756f0225cmachenbach@chromium.org logfile_per_isolate = true; 1322a3b66334e4dd35d9d4874d275ef9c4a756f0225cmachenbach@chromium.org argv[i] = NULL; 13236d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org } else if (strcmp(argv[i], "--shell") == 0) { 13246db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org options.interactive_shell = true; 132504921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org argv[i] = NULL; 132604921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org } else if (strcmp(argv[i], "--test") == 0) { 13276db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org options.test_shell = true; 13286db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org argv[i] = NULL; 132946839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org } else if (strcmp(argv[i], "--send-idle-notification") == 0) { 133046839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org options.send_idle_notification = true; 133146839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org argv[i] = NULL; 1332d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org } else if (strcmp(argv[i], "--invoke-weak-callbacks") == 0) { 1333d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org options.invoke_weak_callbacks = true; 1334d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org // TODO(jochen) See issue 3351 1335d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org options.send_idle_notification = true; 1336d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org argv[i] = NULL; 13376db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org } else if (strcmp(argv[i], "-f") == 0) { 13386db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org // Ignore any -f flags for compatibility with other stand-alone 13396db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org // JavaScript engines. 13406db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org continue; 13416db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org } else if (strcmp(argv[i], "--isolate") == 0) { 13427c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org#ifdef V8_SHARED 134384bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org printf("D8 with shared library does not support multi-threading\n"); 134484bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org return false; 13457c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org#endif // V8_SHARED 13466db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org options.num_isolates++; 1347594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org } else if (strcmp(argv[i], "--dump-heap-constants") == 0) { 1348594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org#ifdef V8_SHARED 1349594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org printf("D8 with shared library does not support constant dumping\n"); 1350594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org return false; 1351594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org#else 1352594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org options.dump_heap_constants = true; 1353594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org argv[i] = NULL; 1354865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org#endif // V8_SHARED 135563ea3d20e0c5531a4bb0853218d5f746117edea1mvstanton@chromium.org } else if (strcmp(argv[i], "--throws") == 0) { 135663ea3d20e0c5531a4bb0853218d5f746117edea1mvstanton@chromium.org options.expected_to_throw = true; 135763ea3d20e0c5531a4bb0853218d5f746117edea1mvstanton@chromium.org argv[i] = NULL; 1358b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org } else if (strncmp(argv[i], "--icu-data-file=", 16) == 0) { 1359b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org options.icu_data_file = argv[i] + 16; 1360b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org argv[i] = NULL; 13617c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org#ifdef V8_SHARED 13621e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org } else if (strcmp(argv[i], "--dump-counters") == 0) { 136384bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org printf("D8 with shared library does not include counters\n"); 136484bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org return false; 136584bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org } else if (strcmp(argv[i], "--debugger") == 0) { 136684bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org printf("Javascript debugger not included\n"); 136784bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org return false; 13687c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org#endif // V8_SHARED 1369975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org#ifdef V8_USE_EXTERNAL_STARTUP_DATA 1370975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org } else if (strncmp(argv[i], "--natives_blob=", 15) == 0) { 1371975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org options.natives_blob = argv[i] + 15; 1372975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org argv[i] = NULL; 1373975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org } else if (strncmp(argv[i], "--snapshot_blob=", 16) == 0) { 1374975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org options.snapshot_blob = argv[i] + 16; 1375975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org argv[i] = NULL; 1376975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org#endif // V8_USE_EXTERNAL_STARTUP_DATA 13774c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org } else if (strcmp(argv[i], "--cache") == 0 || 13784c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org strncmp(argv[i], "--cache=", 8) == 0) { 13794c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org const char* value = argv[i] + 7; 13804c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org if (!*value || strncmp(value, "=code", 6) == 0) { 13814c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org options.compile_options = v8::ScriptCompiler::kProduceCodeCache; 13824c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org } else if (strncmp(value, "=parse", 7) == 0) { 13834c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org options.compile_options = v8::ScriptCompiler::kProduceParserCache; 13844c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org } else if (strncmp(value, "=none", 6) == 0) { 13854c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org options.compile_options = v8::ScriptCompiler::kNoCompileOptions; 13864c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org } else { 13874c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org printf("Unknown option to --cache.\n"); 13884c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org return false; 13894c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org } 13904c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org argv[i] = NULL; 13911e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org } 13926db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org } 13936db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org 13946d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org v8::V8::SetFlagsFromCommandLine(&argc, argv, true); 13956d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org 139634e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org // Set up isolated source groups. 13976db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org options.isolate_sources = new SourceGroup[options.num_isolates]; 13986db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org SourceGroup* current = options.isolate_sources; 13996db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org current->Begin(argv, 1); 14006db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org for (int i = 1; i < argc; i++) { 14016db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org const char* str = argv[i]; 14026db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org if (strcmp(str, "--isolate") == 0) { 14036db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org current->End(i); 14046db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org current++; 14056db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org current->Begin(argv, i + 1); 14066db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org } else if (strncmp(argv[i], "--", 2) == 0) { 14076db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org printf("Warning: unknown flag %s.\nTry --help for options\n", argv[i]); 14086db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org } 14096db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org } 14106db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org current->End(argc); 14116db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org 1412a3b66334e4dd35d9d4874d275ef9c4a756f0225cmachenbach@chromium.org if (!logfile_per_isolate && options.num_isolates) { 1413a3b66334e4dd35d9d4874d275ef9c4a756f0225cmachenbach@chromium.org SetFlagsFromString("--nologfile_per_isolate"); 1414a3b66334e4dd35d9d4874d275ef9c4a756f0225cmachenbach@chromium.org } 1415a3b66334e4dd35d9d4874d275ef9c4a756f0225cmachenbach@chromium.org 14166db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org return true; 14176db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org} 14186db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org 14196db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org 14208e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.orgint Shell::RunMain(Isolate* isolate, int argc, char* argv[]) { 14217c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org#ifndef V8_SHARED 142284bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org for (int i = 1; i < options.num_isolates; ++i) { 142384bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org options.isolate_sources[i].StartExecuteInThread(); 142484bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org } 1425865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org#endif // !V8_SHARED 1426fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org { 1427fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org HandleScope scope(isolate); 1428fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org Local<Context> context = CreateEvaluationContext(isolate); 1429d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org if (options.last_run && options.use_interactive_shell()) { 1430fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org // Keep using the same context in the interactive shell. 1431fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org evaluation_context_.Reset(isolate, context); 1432865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org#ifndef V8_SHARED 1433fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org // If the interactive debugger is enabled make sure to activate 1434fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org // it before running the files passed on the command line. 1435fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org if (i::FLAG_debugger) { 1436fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org InstallUtilityScript(isolate); 143757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org } 1438fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org#endif // !V8_SHARED 14396db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org } 1440fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org { 1441fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org Context::Scope cscope(context); 1442fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org PerIsolateData::RealmScope realm_scope(PerIsolateData::Get(isolate)); 1443fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org options.isolate_sources[0].Execute(isolate); 1444fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org } 1445fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org } 14467e6132b924829c353864933f29124419916db550machenbach@chromium.org if (options.send_idle_notification) { 14477e6132b924829c353864933f29124419916db550machenbach@chromium.org const int kLongIdlePauseInMs = 1000; 1448f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org isolate->ContextDisposedNotification(); 1449f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org isolate->IdleNotification(kLongIdlePauseInMs); 14506db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org } 1451d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org if (options.invoke_weak_callbacks) { 1452d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org // By sending a low memory notifications, we will try hard to collect all 1453d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org // garbage and will therefore also invoke all weak callbacks of actually 1454d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org // unreachable persistent handles. 1455f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org isolate->LowMemoryNotification(); 1456d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org } 14576db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org 14587c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org#ifndef V8_SHARED 14596db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org for (int i = 1; i < options.num_isolates; ++i) { 14606db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org options.isolate_sources[i].WaitForThread(); 14616db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org } 1462865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org#endif // !V8_SHARED 14636db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org return 0; 14646db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org} 14656db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org 14666db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org 1467594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org#ifndef V8_SHARED 1468594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgstatic void DumpHeapConstants(i::Isolate* isolate) { 1469594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org i::Heap* heap = isolate->heap(); 1470594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 1471594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org // Dump the INSTANCE_TYPES table to the console. 1472594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org printf("# List of known V8 instance types.\n"); 1473594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org#define DUMP_TYPE(T) printf(" %d: \"%s\",\n", i::T, #T); 1474594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org printf("INSTANCE_TYPES = {\n"); 1475594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org INSTANCE_TYPE_LIST(DUMP_TYPE) 1476594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org printf("}\n"); 1477594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org#undef DUMP_TYPE 1478594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 1479594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org // Dump the KNOWN_MAP table to the console. 1480594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org printf("\n# List of known V8 maps.\n"); 1481594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org#define ROOT_LIST_CASE(type, name, camel_name) \ 1482594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org if (n == NULL && o == heap->name()) n = #camel_name; 1483594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org#define STRUCT_LIST_CASE(upper_name, camel_name, name) \ 1484594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org if (n == NULL && o == heap->name##_map()) n = #camel_name "Map"; 1485594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org i::HeapObjectIterator it(heap->map_space()); 1486594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org printf("KNOWN_MAPS = {\n"); 1487594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org for (i::Object* o = it.Next(); o != NULL; o = it.Next()) { 1488594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org i::Map* m = i::Map::cast(o); 1489594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org const char* n = NULL; 1490594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org intptr_t p = reinterpret_cast<intptr_t>(m) & 0xfffff; 1491594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org int t = m->instance_type(); 1492594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org ROOT_LIST(ROOT_LIST_CASE) 1493594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org STRUCT_LIST(STRUCT_LIST_CASE) 1494594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org if (n == NULL) continue; 1495594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org printf(" 0x%05" V8PRIxPTR ": (%d, \"%s\"),\n", p, t, n); 1496594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org } 1497594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org printf("}\n"); 1498594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org#undef STRUCT_LIST_CASE 1499594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org#undef ROOT_LIST_CASE 1500594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 1501594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org // Dump the KNOWN_OBJECTS table to the console. 1502594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org printf("\n# List of known V8 objects.\n"); 1503594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org#define ROOT_LIST_CASE(type, name, camel_name) \ 1504594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org if (n == NULL && o == heap->name()) n = #camel_name; 1505594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org i::OldSpaces spit(heap); 1506594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org printf("KNOWN_OBJECTS = {\n"); 1507594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org for (i::PagedSpace* s = spit.next(); s != NULL; s = spit.next()) { 1508594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org i::HeapObjectIterator it(s); 1509594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org const char* sname = AllocationSpaceName(s->identity()); 1510594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org for (i::Object* o = it.Next(); o != NULL; o = it.Next()) { 1511594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org const char* n = NULL; 1512594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org intptr_t p = reinterpret_cast<intptr_t>(o) & 0xfffff; 1513594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org ROOT_LIST(ROOT_LIST_CASE) 1514594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org if (n == NULL) continue; 1515594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org printf(" (\"%s\", 0x%05" V8PRIxPTR "): \"%s\",\n", sname, p, n); 1516594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org } 1517594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org } 1518594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org printf("}\n"); 1519594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org#undef ROOT_LIST_CASE 1520594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org} 1521865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org#endif // !V8_SHARED 1522594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 1523594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 1524837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.orgclass ShellArrayBufferAllocator : public v8::ArrayBuffer::Allocator { 1525837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org public: 1526d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org virtual void* Allocate(size_t length) { 1527285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org void* data = AllocateUninitialized(length); 1528285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org return data == NULL ? data : memset(data, 0, length); 1529d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org } 1530a7cc028b1ce5d5b762b630529fa1956d89f76541machenbach@chromium.org virtual void* AllocateUninitialized(size_t length) { return malloc(length); } 1531307dd6ea3b729c8058ada645b42a1cf083c92128danno@chromium.org virtual void Free(void* data, size_t) { free(data); } 1532837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org}; 1533837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org 1534837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org 1535af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.orgclass MockArrayBufferAllocator : public v8::ArrayBuffer::Allocator { 1536af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org public: 1537ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual void* Allocate(size_t) OVERRIDE { 1538af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org return malloc(0); 1539af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org } 1540ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual void* AllocateUninitialized(size_t length) OVERRIDE { 1541af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org return malloc(0); 1542af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org } 1543ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual void Free(void* p, size_t) OVERRIDE { 1544e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org free(p); 1545af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org } 1546af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org}; 1547af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org 1548af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org 1549975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org#ifdef V8_USE_EXTERNAL_STARTUP_DATA 1550975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.orgclass StartupDataHandler { 1551975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org public: 1552975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org StartupDataHandler(const char* natives_blob, 1553975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org const char* snapshot_blob) { 1554975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org Load(natives_blob, &natives_, v8::V8::SetNativesDataBlob); 1555975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org Load(snapshot_blob, &snapshot_, v8::V8::SetSnapshotDataBlob); 1556975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org } 1557975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org 1558975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org ~StartupDataHandler() { 1559975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org delete[] natives_.data; 1560975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org delete[] snapshot_.data; 1561975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org } 1562975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org 1563975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org private: 1564975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org void Load(const char* blob_file, 1565975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org v8::StartupData* startup_data, 1566975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org void (*setter_fn)(v8::StartupData*)) { 1567975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org startup_data->data = NULL; 1568975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org startup_data->compressed_size = 0; 1569975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org startup_data->raw_size = 0; 1570975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org 1571975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org if (!blob_file) 1572975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org return; 1573975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org 1574975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org FILE* file = fopen(blob_file, "rb"); 1575975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org if (!file) 1576975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org return; 1577975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org 1578975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org fseek(file, 0, SEEK_END); 1579975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org startup_data->raw_size = ftell(file); 1580975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org rewind(file); 1581975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org 1582975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org startup_data->data = new char[startup_data->raw_size]; 1583975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org startup_data->compressed_size = fread( 1584975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org const_cast<char*>(startup_data->data), 1, startup_data->raw_size, 1585975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org file); 1586975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org fclose(file); 1587975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org 1588975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org if (startup_data->raw_size == startup_data->compressed_size) 1589975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org (*setter_fn)(startup_data); 1590975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org } 1591975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org 1592975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org v8::StartupData natives_; 1593975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org v8::StartupData snapshot_; 1594975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org 1595975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org // Disallow copy & assign. 1596975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org StartupDataHandler(const StartupDataHandler& other); 1597975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org void operator=(const StartupDataHandler& other); 1598975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org}; 1599975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org#endif // V8_USE_EXTERNAL_STARTUP_DATA 1600975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org 1601975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org 16026db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.orgint Shell::Main(int argc, char* argv[]) { 1603a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org#if (defined(_WIN32) || defined(_WIN64)) 1604a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org UINT new_flags = 1605a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX; 1606a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org UINT existing_flags = SetErrorMode(new_flags); 1607a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org SetErrorMode(existing_flags | new_flags); 1608a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org#if defined(_MSC_VER) 1609a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_DEBUG | _CRTDBG_MODE_FILE); 1610a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org _CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDERR); 1611a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_DEBUG | _CRTDBG_MODE_FILE); 1612a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR); 1613a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org _CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_DEBUG | _CRTDBG_MODE_FILE); 1614a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org _CrtSetReportFile(_CRT_ERROR, _CRTDBG_FILE_STDERR); 1615a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org _set_error_mode(_OUT_TO_STDERR); 1616a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org#endif // defined(_MSC_VER) 1617a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org#endif // defined(_WIN32) || defined(_WIN64) 16186db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org if (!SetOptions(argc, argv)) return 1; 1619b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org v8::V8::InitializeICU(options.icu_data_file); 1620d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org v8::Platform* platform = v8::platform::CreateDefaultPlatform(); 1621d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org v8::V8::InitializePlatform(platform); 1622a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org v8::V8::Initialize(); 1623975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org#ifdef V8_USE_EXTERNAL_STARTUP_DATA 1624975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org StartupDataHandler startup_data(options.natives_blob, options.snapshot_blob); 1625975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org#endif 1626a3b66334e4dd35d9d4874d275ef9c4a756f0225cmachenbach@chromium.org SetFlagsFromString("--trace-hydrogen-file=hydrogen.cfg"); 1627a3b66334e4dd35d9d4874d275ef9c4a756f0225cmachenbach@chromium.org SetFlagsFromString("--redirect-code-traces-to=code.asm"); 1628837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org ShellArrayBufferAllocator array_buffer_allocator; 1629af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org MockArrayBufferAllocator mock_arraybuffer_allocator; 1630af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org if (options.mock_arraybuffer_allocator) { 1631af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org v8::V8::SetArrayBufferAllocator(&mock_arraybuffer_allocator); 1632af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org } else { 1633af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org v8::V8::SetArrayBufferAllocator(&array_buffer_allocator); 1634af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org } 16356d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org int result = 0; 16369e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org Isolate::CreateParams create_params; 16379e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org#if !defined(V8_SHARED) && defined(ENABLE_GDB_JIT_INTERFACE) 16389e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org if (i::FLAG_gdbjit) { 16399e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org create_params.code_event_handler = i::GDBJITInterface::EventHandler; 16409e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org } 16419e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org#endif 16429e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org#ifdef ENABLE_VTUNE_JIT_INTERFACE 16439e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org vTune::InitializeVtuneForV8(create_params); 16449e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org#endif 1645feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org#ifndef V8_SHARED 1646d3df75b4472c9d5d4d2615aaea74d2adce4160f8machenbach@chromium.org create_params.constraints.ConfigureDefaults( 1647d3df75b4472c9d5d4d2615aaea74d2adce4160f8machenbach@chromium.org base::SysInfo::AmountOfPhysicalMemory(), 1648d3df75b4472c9d5d4d2615aaea74d2adce4160f8machenbach@chromium.org base::SysInfo::AmountOfVirtualMemory(), 1649d3df75b4472c9d5d4d2615aaea74d2adce4160f8machenbach@chromium.org base::SysInfo::NumberOfProcessors()); 1650feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org#endif 1651d3df75b4472c9d5d4d2615aaea74d2adce4160f8machenbach@chromium.org Isolate* isolate = Isolate::New(create_params); 16527c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org DumbLineEditor dumb_line_editor(isolate); 16538e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org { 16543c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org Isolate::Scope scope(isolate); 16558e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org Initialize(isolate); 165632d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org PerIsolateData data(isolate); 16578e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org InitializeDebugger(isolate); 16588e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org 1659594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org#ifndef V8_SHARED 1660594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org if (options.dump_heap_constants) { 1661594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org DumpHeapConstants(reinterpret_cast<i::Isolate*>(isolate)); 1662594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org return 0; 1663594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org } 1664594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org#endif 1665594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 16668e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org if (options.stress_opt || options.stress_deopt) { 16678e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org Testing::SetStressRunType(options.stress_opt 16688e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org ? Testing::kStressTypeOpt 16698e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org : Testing::kStressTypeDeopt); 16708e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org int stress_runs = Testing::GetStressRuns(); 16718e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org for (int i = 0; i < stress_runs && result == 0; i++) { 16728e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org printf("============ Stress %d/%d ============\n", i + 1, stress_runs); 16738e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org Testing::PrepareStressRun(i); 16748e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org options.last_run = (i == stress_runs - 1); 16758e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org result = RunMain(isolate, argc, argv); 16768e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org } 16778e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org printf("======== Full Deoptimization =======\n"); 16788e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org Testing::DeoptimizeAll(); 16791145ef852a4e230e1f642eecd8de155f2b26bc53jkummerow@chromium.org#if !defined(V8_SHARED) 16808e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org } else if (i::FLAG_stress_runs > 0) { 16818e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org int stress_runs = i::FLAG_stress_runs; 16828e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org for (int i = 0; i < stress_runs && result == 0; i++) { 16838e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org printf("============ Run %d/%d ============\n", i + 1, stress_runs); 16848e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org options.last_run = (i == stress_runs - 1); 16858e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org result = RunMain(isolate, argc, argv); 16868e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org } 16871145ef852a4e230e1f642eecd8de155f2b26bc53jkummerow@chromium.org#endif 16888e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org } else { 16898e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org result = RunMain(isolate, argc, argv); 16908e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org } 16916d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org 16928e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org // Run interactive shell if explicitly requested or if no script has been 16938e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org // executed, but never on --test 1694d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org if (options.use_interactive_shell()) { 1695865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org#ifndef V8_SHARED 16968e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org if (!i::FLAG_debugger) { 169746a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org InstallUtilityScript(isolate); 16988e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org } 1699865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org#endif // !V8_SHARED 17008e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org RunShell(isolate); 17018e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org } 17026d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org } 17033c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org isolate->Dispose(); 17046db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org V8::Dispose(); 1705d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org V8::ShutdownPlatform(); 1706d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org delete platform; 17076d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org 1708ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org OnExit(); 1709ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org 17106d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org return result; 17116d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org} 17126d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org 17135a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org} // namespace v8 17145a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 17155a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 171640cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.org#ifndef GOOGLE3 17175a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.orgint main(int argc, char* argv[]) { 17185a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org return v8::Shell::Main(argc, argv); 17195a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org} 172040cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.org#endif 1721