diff options
| author | Ben Murdoch <benm@google.com> | 2012-04-12 10:51:47 +0100 |
|---|---|---|
| committer | Ben Murdoch <benm@google.com> | 2012-04-16 16:41:38 +0100 |
| commit | 3ef787dbeca8a5fb1086949cda830dccee07bfbd (patch) | |
| tree | 0a22edd97aa148abffdd405c585b22213fccbc82 /src/v8.cc | |
| parent | 85b71799222b55eb5dd74ea26efe0c64ab655c8c (diff) | |
| download | android_external_v8-3ef787dbeca8a5fb1086949cda830dccee07bfbd.tar.gz android_external_v8-3ef787dbeca8a5fb1086949cda830dccee07bfbd.tar.bz2 android_external_v8-3ef787dbeca8a5fb1086949cda830dccee07bfbd.zip | |
Merge V8 at 3.9.24.13
Bug: 5688872
Change-Id: Id0aa8d23375030494d3189c31774059c0f5398fc
Diffstat (limited to 'src/v8.cc')
| -rw-r--r-- | src/v8.cc | 126 |
1 files changed, 91 insertions, 35 deletions
@@ -1,4 +1,4 @@ -// Copyright 2011 the V8 project authors. All rights reserved. +// Copyright 2012 the V8 project authors. All rights reserved. // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: @@ -36,26 +36,32 @@ #include "hydrogen.h" #include "lithium-allocator.h" #include "log.h" +#include "once.h" +#include "platform.h" #include "runtime-profiler.h" #include "serialize.h" +#include "store-buffer.h" namespace v8 { namespace internal { -static Mutex* init_once_mutex = OS::CreateMutex(); -static bool init_once_called = false; +V8_DECLARE_ONCE(init_once); bool V8::is_running_ = false; -bool V8::has_been_setup_ = false; +bool V8::has_been_set_up_ = false; bool V8::has_been_disposed_ = false; bool V8::has_fatal_error_ = false; bool V8::use_crankshaft_ = true; +List<CallCompletedCallback>* V8::call_completed_callbacks_ = NULL; + +static LazyMutex entropy_mutex = LAZY_MUTEX_INITIALIZER; -static Mutex* entropy_mutex = OS::CreateMutex(); static EntropySource entropy_source; bool V8::Initialize(Deserializer* des) { + FlagList::EnforceFlagImplications(); + InitializeOncePerProcess(); // The current thread may not yet had entered an isolate to run. @@ -78,7 +84,7 @@ bool V8::Initialize(Deserializer* des) { if (isolate->IsInitialized()) return true; is_running_ = true; - has_been_setup_ = true; + has_been_set_up_ = true; has_fatal_error_ = false; has_been_disposed_ = false; @@ -96,11 +102,14 @@ void V8::TearDown() { Isolate* isolate = Isolate::Current(); ASSERT(isolate->IsDefaultIsolate()); - if (!has_been_setup_ || has_been_disposed_) return; + if (!has_been_set_up_ || has_been_disposed_) return; isolate->TearDown(); is_running_ = false; has_been_disposed_ = true; + + delete call_completed_callbacks_; + call_completed_callbacks_ = NULL; } @@ -110,7 +119,7 @@ static void seed_random(uint32_t* state) { state[i] = FLAG_random_seed; } else if (entropy_source != NULL) { uint32_t val; - ScopedLock lock(entropy_mutex); + ScopedLock lock(entropy_mutex.Pointer()); entropy_source(reinterpret_cast<unsigned char*>(&val), sizeof(uint32_t)); state[i] = val; } else { @@ -139,10 +148,17 @@ void V8::SetEntropySource(EntropySource source) { } +void V8::SetReturnAddressLocationResolver( + ReturnAddressLocationResolver resolver) { + StackFrame::SetReturnAddressLocationResolver(resolver); +} + + // Used by JavaScript APIs -uint32_t V8::Random(Isolate* isolate) { - ASSERT(isolate == Isolate::Current()); - return random_base(isolate->random_seed()); +uint32_t V8::Random(Context* context) { + ASSERT(context->IsGlobalContext()); + ByteArray* seed = context->random_seed(); + return random_base(reinterpret_cast<uint32_t*>(seed->GetDataStartAddress())); } @@ -155,13 +171,48 @@ uint32_t V8::RandomPrivate(Isolate* isolate) { } -bool V8::IdleNotification() { +bool V8::IdleNotification(int hint) { // Returning true tells the caller that there is no need to call // IdleNotification again. if (!FLAG_use_idle_notification) return true; // Tell the heap that it may want to adjust. - return HEAP->IdleNotification(); + return HEAP->IdleNotification(hint); +} + + +void V8::AddCallCompletedCallback(CallCompletedCallback callback) { + if (call_completed_callbacks_ == NULL) { // Lazy init. + call_completed_callbacks_ = new List<CallCompletedCallback>(); + } + for (int i = 0; i < call_completed_callbacks_->length(); i++) { + if (callback == call_completed_callbacks_->at(i)) return; + } + call_completed_callbacks_->Add(callback); +} + + +void V8::RemoveCallCompletedCallback(CallCompletedCallback callback) { + if (call_completed_callbacks_ == NULL) return; + for (int i = 0; i < call_completed_callbacks_->length(); i++) { + if (callback == call_completed_callbacks_->at(i)) { + call_completed_callbacks_->Remove(i); + } + } +} + + +void V8::FireCallCompletedCallback(Isolate* isolate) { + if (call_completed_callbacks_ == NULL) return; + HandleScopeImplementer* handle_scope_implementer = + isolate->handle_scope_implementer(); + if (!handle_scope_implementer->CallDepthIsZero()) return; + // Fire callbacks. Increase call depth to prevent recursive callbacks. + handle_scope_implementer->IncrementCallDepth(); + for (int i = 0; i < call_completed_callbacks_->length(); i++) { + call_completed_callbacks_->at(i)(); + } + handle_scope_implementer->DecrementCallDepth(); } @@ -172,31 +223,25 @@ typedef union { } double_int_union; -Object* V8::FillHeapNumberWithRandom(Object* heap_number, Isolate* isolate) { - uint64_t random_bits = Random(isolate); - // Make a double* from address (heap_number + sizeof(double)). - double_int_union* r = reinterpret_cast<double_int_union*>( - reinterpret_cast<char*>(heap_number) + - HeapNumber::kValueOffset - kHeapObjectTag); +Object* V8::FillHeapNumberWithRandom(Object* heap_number, + Context* context) { + double_int_union r; + uint64_t random_bits = Random(context); // Convert 32 random bits to 0.(32 random bits) in a double // by computing: // ( 1.(20 0s)(32 random bits) x 2^20 ) - (1.0 x 2^20)). - const double binary_million = 1048576.0; - r->double_value = binary_million; - r->uint64_t_value |= random_bits; - r->double_value -= binary_million; + static const double binary_million = 1048576.0; + r.double_value = binary_million; + r.uint64_t_value |= random_bits; + r.double_value -= binary_million; + HeapNumber::cast(heap_number)->set_value(r.double_value); return heap_number; } - -void V8::InitializeOncePerProcess() { - ScopedLock lock(init_once_mutex); - if (init_once_called) return; - init_once_called = true; - - // Setup the platform OS support. - OS::Setup(); +void V8::InitializeOncePerProcessImpl() { + // Set up the platform OS support. + OS::SetUp(); use_crankshaft_ = FLAG_crankshaft; @@ -204,17 +249,28 @@ void V8::InitializeOncePerProcess() { use_crankshaft_ = false; } - CPU::Setup(); + CPU::SetUp(); if (!CPU::SupportsCrankshaft()) { use_crankshaft_ = false; } - RuntimeProfiler::GlobalSetup(); + OS::PostSetUp(); - // Peephole optimization might interfere with deoptimization. - FLAG_peephole_optimization = !use_crankshaft_; + RuntimeProfiler::GlobalSetup(); ElementsAccessor::InitializeOncePerProcess(); + + if (FLAG_stress_compaction) { + FLAG_force_marking_deque_overflows = true; + FLAG_gc_global = true; + FLAG_max_new_space_size = (1 << (kPageSizeBits - 10)) * 2; + } + + LOperand::SetUpCaches(); +} + +void V8::InitializeOncePerProcess() { + CallOnce(&init_once, &InitializeOncePerProcessImpl); } } } // namespace v8::internal |
