diff options
| author | Ben Murdoch <benm@google.com> | 2012-04-11 18:30:58 +0100 |
|---|---|---|
| committer | Ben Murdoch <benm@google.com> | 2012-04-11 18:39:07 +0100 |
| commit | 85b71799222b55eb5dd74ea26efe0c64ab655c8c (patch) | |
| tree | 0d0fa6be365df4b76fe2985458b3a9b9afd80988 /src/api.cc | |
| parent | 5d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0b (diff) | |
| download | android_external_v8-85b71799222b55eb5dd74ea26efe0c64ab655c8c.tar.gz android_external_v8-85b71799222b55eb5dd74ea26efe0c64ab655c8c.tar.bz2 android_external_v8-85b71799222b55eb5dd74ea26efe0c64ab655c8c.zip | |
Roll V8 back to 3.6
Roll back to V8 3.6 to fix x86 build, we don't have ucontext.h.
This reverts commits:
5d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0b
c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9
592a9fc1d8ea420377a2e7efd0600e20b058be2b
Bug: 5688872
Change-Id: Ic961bb5e65b778e98bbfb71cce71d99fa949e995
Diffstat (limited to 'src/api.cc')
| -rw-r--r-- | src/api.cc | 558 |
1 files changed, 146 insertions, 412 deletions
@@ -1,4 +1,4 @@ -// Copyright 2012 the V8 project authors. All rights reserved. +// Copyright 2011 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: @@ -25,39 +25,34 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +#include "v8.h" + #include "api.h" -#include <math.h> // For isnan. -#include <string.h> // For memcpy, strlen. -#include "../include/v8-debug.h" -#include "../include/v8-profiler.h" -#include "../include/v8-testing.h" +#include "arguments.h" #include "bootstrapper.h" #include "compiler.h" -#include "conversions-inl.h" -#include "counters.h" #include "debug.h" #include "deoptimizer.h" #include "execution.h" +#include "flags.h" #include "global-handles.h" #include "heap-profiler.h" #include "messages.h" -#ifdef COMPRESS_STARTUP_DATA_BZ2 #include "natives.h" -#endif #include "parser.h" #include "platform.h" #include "profile-generator-inl.h" -#include "property-details.h" -#include "property.h" #include "runtime-profiler.h" #include "scanner-character-streams.h" +#include "serialize.h" #include "snapshot.h" -#include "unicode-inl.h" #include "v8threads.h" #include "version.h" #include "vm-state-inl.h" +#include "../include/v8-profiler.h" +#include "../include/v8-testing.h" #define LOG_API(isolate, expr) LOG(isolate, ApiEntryCall(expr)) @@ -83,7 +78,7 @@ namespace v8 { bool has_pending_exception = false -#define EXCEPTION_BAILOUT_CHECK_GENERIC(isolate, value, do_callback) \ +#define EXCEPTION_BAILOUT_CHECK(isolate, value) \ do { \ i::HandleScopeImplementer* handle_scope_implementer = \ (isolate)->handle_scope_implementer(); \ @@ -96,22 +91,11 @@ namespace v8 { } \ bool call_depth_is_zero = handle_scope_implementer->CallDepthIsZero(); \ (isolate)->OptionalRescheduleException(call_depth_is_zero); \ - do_callback \ return value; \ } \ - do_callback \ } while (false) -#define EXCEPTION_BAILOUT_CHECK_DO_CALLBACK(isolate, value) \ - EXCEPTION_BAILOUT_CHECK_GENERIC( \ - isolate, value, i::V8::FireCallCompletedCallback(isolate);) - - -#define EXCEPTION_BAILOUT_CHECK(isolate, value) \ - EXCEPTION_BAILOUT_CHECK_GENERIC(isolate, value, ;) - - #define API_ENTRY_CHECK(isolate, msg) \ do { \ if (v8::Locker::IsActive()) { \ @@ -201,10 +185,7 @@ void i::V8::FatalProcessOutOfMemory(const char* location, bool take_snapshot) { int end_marker; heap_stats.end_marker = &end_marker; i::Isolate* isolate = i::Isolate::Current(); - // BUG(1718): - // Don't use the take_snapshot since we don't support HeapIterator here - // without doing a special GC. - isolate->heap()->RecordStats(&heap_stats, false); + isolate->heap()->RecordStats(&heap_stats, take_snapshot); i::V8::SetFatalError(); FatalErrorCallback callback = GetFatalErrorHandler(); { @@ -360,7 +341,6 @@ int StartupDataDecompressor::Decompress() { compressed_data[i].data = decompressed; } V8::SetDecompressedStartupData(compressed_data); - i::DeleteArray(compressed_data); return 0; } @@ -503,7 +483,7 @@ RegisteredExtension* RegisteredExtension::first_extension_ = NULL; RegisteredExtension::RegisteredExtension(Extension* extension) - : extension_(extension) { } + : extension_(extension), state_(UNVISITED) { } void RegisteredExtension::Register(RegisteredExtension* that) { @@ -521,13 +501,9 @@ void RegisterExtension(Extension* that) { Extension::Extension(const char* name, const char* source, int dep_count, - const char** deps, - int source_length) + const char** deps) : name_(name), - source_length_(source_length >= 0 ? - source_length : - (source ? static_cast<int>(strlen(source)) : 0)), - source_(source, source_length_), + source_(source), dep_count_(dep_count), deps_(deps), auto_enable_(false) { } @@ -748,7 +724,6 @@ void Context::Exit() { i::Context* last_context = isolate->handle_scope_implementer()->RestoreContext(); isolate->set_context(last_context); - isolate->set_context_exit_happened(true); } @@ -1430,21 +1405,21 @@ void ObjectTemplate::SetInternalFieldCount(int value) { ScriptData* ScriptData::PreCompile(const char* input, int length) { - i::Utf8ToUtf16CharacterStream stream( + i::Utf8ToUC16CharacterStream stream( reinterpret_cast<const unsigned char*>(input), length); - return i::ParserApi::PreParse(&stream, NULL, i::FLAG_harmony_scoping); + return i::ParserApi::PreParse(&stream, NULL, i::FLAG_harmony_block_scoping); } ScriptData* ScriptData::PreCompile(v8::Handle<String> source) { i::Handle<i::String> str = Utils::OpenHandle(*source); if (str->IsExternalTwoByteString()) { - i::ExternalTwoByteStringUtf16CharacterStream stream( + i::ExternalTwoByteStringUC16CharacterStream stream( i::Handle<i::ExternalTwoByteString>::cast(str), 0, str->length()); - return i::ParserApi::PreParse(&stream, NULL, i::FLAG_harmony_scoping); + return i::ParserApi::PreParse(&stream, NULL, i::FLAG_harmony_block_scoping); } else { - i::GenericStringUtf16CharacterStream stream(str, 0, str->length()); - return i::ParserApi::PreParse(&stream, NULL, i::FLAG_harmony_scoping); + i::GenericStringUC16CharacterStream stream(str, 0, str->length()); + return i::ParserApi::PreParse(&stream, NULL, i::FLAG_harmony_block_scoping); } } @@ -1587,7 +1562,7 @@ Local<Value> Script::Run() { isolate->context()->global_proxy(), isolate); i::Handle<i::Object> result = i::Execution::Call(fun, receiver, 0, NULL, &has_pending_exception); - EXCEPTION_BAILOUT_CHECK_DO_CALLBACK(isolate, Local<Value>()); + EXCEPTION_BAILOUT_CHECK(isolate, Local<Value>()); raw_result = *result; } i::Handle<i::Object> result(raw_result, isolate); @@ -1813,7 +1788,7 @@ v8::Handle<v8::StackTrace> Message::GetStackTrace() const { static i::Handle<i::Object> CallV8HeapFunction(const char* name, i::Handle<i::Object> recv, int argc, - i::Handle<i::Object> argv[], + i::Object** argv[], bool* has_pending_exception) { i::Isolate* isolate = i::Isolate::Current(); i::Handle<i::String> fmt_str = isolate->factory()->LookupAsciiSymbol(name); @@ -1830,10 +1805,10 @@ static i::Handle<i::Object> CallV8HeapFunction(const char* name, static i::Handle<i::Object> CallV8HeapFunction(const char* name, i::Handle<i::Object> data, bool* has_pending_exception) { - i::Handle<i::Object> argv[] = { data }; + i::Object** argv[1] = { data.location() }; return CallV8HeapFunction(name, i::Isolate::Current()->js_builtins_object(), - ARRAY_SIZE(argv), + 1, argv, has_pending_exception); } @@ -2173,11 +2148,6 @@ bool Value::IsInt32() const { if (obj->IsSmi()) return true; if (obj->IsNumber()) { double value = obj->Number(); - static const i::DoubleRepresentation minus_zero(-0.0); - i::DoubleRepresentation rep(value); - if (rep.bits == minus_zero.bits) { - return false; - } return i::FastI2D(i::FastD2I(value)) == value; } return false; @@ -2190,11 +2160,6 @@ bool Value::IsUint32() const { if (obj->IsSmi()) return i::Smi::cast(*obj)->value() >= 0; if (obj->IsNumber()) { double value = obj->Number(); - static const i::DoubleRepresentation minus_zero(-0.0); - i::DoubleRepresentation rep(value); - if (rep.bits == minus_zero.bits) { - return false; - } return i::FastUI2D(i::FastD2UI(value)) == value; } return false; @@ -2663,11 +2628,10 @@ bool Value::Equals(Handle<Value> that) const { if (obj->IsJSObject() && other->IsJSObject()) { return *obj == *other; } - i::Handle<i::Object> args[] = { other }; + i::Object** args[1] = { other.location() }; EXCEPTION_PREAMBLE(isolate); i::Handle<i::Object> result = - CallV8HeapFunction("EQUALS", obj, ARRAY_SIZE(args), args, - &has_pending_exception); + CallV8HeapFunction("EQUALS", obj, 1, args, &has_pending_exception); EXCEPTION_BAILOUT_CHECK(isolate, false); return *result == i::Smi::FromInt(i::EQUAL); } @@ -2757,11 +2721,10 @@ bool v8::Object::Set(uint32_t index, v8::Handle<Value> value) { i::Handle<i::JSObject> self = Utils::OpenHandle(this); i::Handle<i::Object> value_obj = Utils::OpenHandle(*value); EXCEPTION_PREAMBLE(isolate); - i::Handle<i::Object> obj = i::JSObject::SetElement( + i::Handle<i::Object> obj = i::SetElement( self, index, value_obj, - NONE, i::kNonStrictMode); has_pending_exception = obj.is_null(); EXCEPTION_BAILOUT_CHECK(isolate, false); @@ -2831,7 +2794,7 @@ Local<Value> v8::Object::Get(uint32_t index) { ENTER_V8(isolate); i::Handle<i::JSObject> self = Utils::OpenHandle(this); EXCEPTION_PREAMBLE(isolate); - i::Handle<i::Object> result = i::Object::GetElement(self, index); + i::Handle<i::Object> result = i::GetElement(self, index); has_pending_exception = result.is_null(); EXCEPTION_BAILOUT_CHECK(isolate, Local<Value>()); return Utils::ToLocal(result); @@ -2864,7 +2827,7 @@ Local<Value> v8::Object::GetPrototype() { return Local<v8::Value>()); ENTER_V8(isolate); i::Handle<i::Object> self = Utils::OpenHandle(this); - i::Handle<i::Object> result(self->GetPrototype()); + i::Handle<i::Object> result = i::GetPrototype(self); return Utils::ToLocal(result); } @@ -2911,10 +2874,8 @@ Local<Array> v8::Object::GetPropertyNames() { ENTER_V8(isolate); i::HandleScope scope(isolate); i::Handle<i::JSObject> self = Utils::OpenHandle(this); - bool threw = false; i::Handle<i::FixedArray> value = - i::GetKeysInFixedArrayFor(self, i::INCLUDE_PROTOS, &threw); - if (threw) return Local<v8::Array>(); + i::GetKeysInFixedArrayFor(self, i::INCLUDE_PROTOS); // Because we use caching to speed up enumeration it is important // to never change the result of the basic enumeration function so // we clone the result. @@ -2932,10 +2893,8 @@ Local<Array> v8::Object::GetOwnPropertyNames() { ENTER_V8(isolate); i::HandleScope scope(isolate); i::Handle<i::JSObject> self = Utils::OpenHandle(this); - bool threw = false; i::Handle<i::FixedArray> value = - i::GetKeysInFixedArrayFor(self, i::LOCAL_ONLY, &threw); - if (threw) return Local<v8::Array>(); + i::GetKeysInFixedArrayFor(self, i::LOCAL_ONLY); // Because we use caching to speed up enumeration it is important // to never change the result of the basic enumeration function so // we clone the result. @@ -3018,7 +2977,7 @@ bool v8::Object::Delete(v8::Handle<String> key) { i::HandleScope scope(isolate); i::Handle<i::JSObject> self = Utils::OpenHandle(this); i::Handle<i::String> key_obj = Utils::OpenHandle(*key); - return i::JSObject::DeleteProperty(self, key_obj)->IsTrue(); + return i::DeleteProperty(self, key_obj)->IsTrue(); } @@ -3039,7 +2998,7 @@ bool v8::Object::Delete(uint32_t index) { ENTER_V8(isolate); HandleScope scope; i::Handle<i::JSObject> self = Utils::OpenHandle(this); - return i::JSObject::DeleteElement(self, index)->IsTrue(); + return i::DeleteElement(self, index)->IsTrue(); } @@ -3064,11 +3023,8 @@ bool Object::SetAccessor(Handle<String> name, i::Handle<i::AccessorInfo> info = MakeAccessorInfo(name, getter, setter, data, settings, attributes); - bool fast = Utils::OpenHandle(this)->HasFastProperties(); i::Handle<i::Object> result = i::SetAccessor(Utils::OpenHandle(this), info); - if (result.is_null() || result->IsUndefined()) return false; - if (fast) i::JSObject::TransformToFastProperties(Utils::OpenHandle(this), 0); - return true; + return !result.is_null() && !result->IsUndefined(); } @@ -3137,10 +3093,7 @@ static Local<Value> GetPropertyByLookup(i::Isolate* isolate, // If the property being looked up is a callback, it can throw // an exception. EXCEPTION_PREAMBLE(isolate); - PropertyAttributes ignored; - i::Handle<i::Object> result = - i::Object::GetProperty(receiver, receiver, lookup, name, - &ignored); + i::Handle<i::Object> result = i::GetProperty(receiver, name, lookup); has_pending_exception = result.is_null(); EXCEPTION_BAILOUT_CHECK(isolate, Local<Value>()); @@ -3157,7 +3110,7 @@ Local<Value> v8::Object::GetRealNamedPropertyInPrototypeChain( ENTER_V8(isolate); i::Handle<i::JSObject> self_obj = Utils::OpenHandle(this); i::Handle<i::String> key_obj = Utils::OpenHandle(*key); - i::LookupResult lookup(isolate); + i::LookupResult lookup; self_obj->LookupRealNamedPropertyInPrototypes(*key_obj, &lookup); return GetPropertyByLookup(isolate, self_obj, key_obj, &lookup); } @@ -3170,7 +3123,7 @@ Local<Value> v8::Object::GetRealNamedProperty(Handle<String> key) { ENTER_V8(isolate); i::Handle<i::JSObject> self_obj = Utils::OpenHandle(this); i::Handle<i::String> key_obj = Utils::OpenHandle(*key); - i::LookupResult lookup(isolate); + i::LookupResult lookup; self_obj->LookupRealNamedProperty(*key_obj, &lookup); return GetPropertyByLookup(isolate, self_obj, key_obj, &lookup); } @@ -3247,7 +3200,7 @@ int v8::Object::GetIdentityHash() { ENTER_V8(isolate); i::HandleScope scope(isolate); i::Handle<i::JSObject> self = Utils::OpenHandle(this); - return i::JSObject::GetIdentityHash(self); + return i::GetIdentityHash(self); } @@ -3258,11 +3211,21 @@ bool v8::Object::SetHiddenValue(v8::Handle<v8::String> key, ENTER_V8(isolate); i::HandleScope scope(isolate); i::Handle<i::JSObject> self = Utils::OpenHandle(this); - i::Handle<i::String> key_obj = Utils::OpenHandle(*key); + i::Handle<i::Object> hidden_props(i::GetHiddenProperties( + self, + i::JSObject::ALLOW_CREATION)); + i::Handle<i::Object> key_obj = Utils::OpenHandle(*key); i::Handle<i::Object> value_obj = Utils::OpenHandle(*value); - i::Handle<i::Object> result = - i::JSObject::SetHiddenProperty(self, key_obj, value_obj); - return *result == *self; + EXCEPTION_PREAMBLE(isolate); + i::Handle<i::Object> obj = i::SetProperty( + hidden_props, + key_obj, + value_obj, + static_cast<PropertyAttributes>(None), + i::kNonStrictMode); + has_pending_exception = obj.is_null(); + EXCEPTION_BAILOUT_CHECK(isolate, false); + return true; } @@ -3272,9 +3235,20 @@ v8::Local<v8::Value> v8::Object::GetHiddenValue(v8::Handle<v8::String> key) { return Local<v8::Value>()); ENTER_V8(isolate); i::Handle<i::JSObject> self = Utils::OpenHandle(this); + i::Handle<i::Object> hidden_props(i::GetHiddenProperties( + self, + i::JSObject::OMIT_CREATION)); + if (hidden_props->IsUndefined()) { + return v8::Local<v8::Value>(); + } i::Handle<i::String> key_obj = Utils::OpenHandle(*key); - i::Handle<i::Object> result(self->GetHiddenProperty(*key_obj)); - if (result->IsUndefined()) return v8::Local<v8::Value>(); + EXCEPTION_PREAMBLE(isolate); + i::Handle<i::Object> result = i::GetProperty(hidden_props, key_obj); + has_pending_exception = result.is_null(); + EXCEPTION_BAILOUT_CHECK(isolate, v8::Local<v8::Value>()); + if (result->IsUndefined()) { + return v8::Local<v8::Value>(); + } return Utils::ToLocal(result); } @@ -3285,9 +3259,15 @@ bool v8::Object::DeleteHiddenValue(v8::Handle<v8::String> key) { ENTER_V8(isolate); i::HandleScope scope(isolate); i::Handle<i::JSObject> self = Utils::OpenHandle(this); + i::Handle<i::Object> hidden_props(i::GetHiddenProperties( + self, + i::JSObject::OMIT_CREATION)); + if (hidden_props->IsUndefined()) { + return true; + } + i::Handle<i::JSObject> js_obj(i::JSObject::cast(*hidden_props)); i::Handle<i::String> key_obj = Utils::OpenHandle(*key); - self->DeleteHiddenProperty(*key_obj); - return true; + return i::DeleteProperty(js_obj, key_obj)->IsTrue(); } @@ -3337,12 +3317,22 @@ void PrepareExternalArrayElements(i::Handle<i::JSObject> object, i::Handle<i::ExternalArray> array = isolate->factory()->NewExternalArray(length, array_type, data); - i::Handle<i::Map> external_array_map = - isolate->factory()->GetElementsTransitionMap( - object, - GetElementsKindFromExternalArrayType(array_type)); - - object->set_map(*external_array_map); + // If the object already has external elements, create a new, unique + // map if the element type is now changing, because assumptions about + // generated code based on the receiver's map will be invalid. + i::Handle<i::HeapObject> elements(object->elements()); + bool cant_reuse_map = + elements->map()->IsUndefined() || + !elements->map()->has_external_array_elements() || + elements->map() != isolate->heap()->MapForExternalArrayType(array_type); + if (cant_reuse_map) { + i::Handle<i::Map> external_array_map = + isolate->factory()->GetElementsTransitionMap( + i::Handle<i::Map>(object->map()), + GetElementsKindFromExternalArrayType(array_type), + object->HasFastProperties()); + object->set_map(*external_array_map); + } object->set_elements(*array); } @@ -3501,8 +3491,7 @@ bool v8::Object::IsCallable() { } -Local<v8::Value> Object::CallAsFunction(v8::Handle<v8::Object> recv, - int argc, +Local<v8::Value> Object::CallAsFunction(v8::Handle<v8::Object> recv, int argc, v8::Handle<v8::Value> argv[]) { i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); ON_BAILOUT(isolate, "v8::Object::CallAsFunction()", @@ -3513,7 +3502,7 @@ Local<v8::Value> Object::CallAsFunction(v8::Handle<v8::Object> recv, i::Handle<i::JSObject> obj = Utils::OpenHandle(this); i::Handle<i::Object> recv_obj = Utils::OpenHandle(*recv); STATIC_ASSERT(sizeof(v8::Handle<v8::Value>) == sizeof(i::Object**)); - i::Handle<i::Object>* args = reinterpret_cast<i::Handle<i::Object>*>(argv); + i::Object*** args = reinterpret_cast<i::Object***>(argv); i::Handle<i::JSFunction> fun = i::Handle<i::JSFunction>(); if (obj->IsJSFunction()) { fun = i::Handle<i::JSFunction>::cast(obj); @@ -3528,7 +3517,7 @@ Local<v8::Value> Object::CallAsFunction(v8::Handle<v8::Object> recv, EXCEPTION_PREAMBLE(isolate); i::Handle<i::Object> returned = i::Execution::Call(fun, recv_obj, argc, args, &has_pending_exception); - EXCEPTION_BAILOUT_CHECK_DO_CALLBACK(isolate, Local<Value>()); + EXCEPTION_BAILOUT_CHECK(isolate, Local<Value>()); return Utils::ToLocal(scope.CloseAndEscape(returned)); } @@ -3543,13 +3532,13 @@ Local<v8::Value> Object::CallAsConstructor(int argc, i::HandleScope scope(isolate); i::Handle<i::JSObject> obj = Utils::OpenHandle(this); STATIC_ASSERT(sizeof(v8::Handle<v8::Value>) == sizeof(i::Object**)); - i::Handle<i::Object>* args = reinterpret_cast<i::Handle<i::Object>*>(argv); + i::Object*** args = reinterpret_cast<i::Object***>(argv); if (obj->IsJSFunction()) { i::Handle<i::JSFunction> fun = i::Handle<i::JSFunction>::cast(obj); EXCEPTION_PREAMBLE(isolate); i::Handle<i::Object> returned = i::Execution::New(fun, argc, args, &has_pending_exception); - EXCEPTION_BAILOUT_CHECK_DO_CALLBACK(isolate, Local<v8::Object>()); + EXCEPTION_BAILOUT_CHECK(isolate, Local<v8::Object>()); return Utils::ToLocal(scope.CloseAndEscape( i::Handle<i::JSObject>::cast(returned))); } @@ -3562,7 +3551,7 @@ Local<v8::Value> Object::CallAsConstructor(int argc, EXCEPTION_PREAMBLE(isolate); i::Handle<i::Object> returned = i::Execution::Call(fun, obj, argc, args, &has_pending_exception); - EXCEPTION_BAILOUT_CHECK_DO_CALLBACK(isolate, Local<v8::Object>()); + EXCEPTION_BAILOUT_CHECK(isolate, Local<v8::Object>()); ASSERT(!delegate->IsUndefined()); return Utils::ToLocal(scope.CloseAndEscape(returned)); } @@ -3585,11 +3574,11 @@ Local<v8::Object> Function::NewInstance(int argc, HandleScope scope; i::Handle<i::JSFunction> function = Utils::OpenHandle(this); STATIC_ASSERT(sizeof(v8::Handle<v8::Value>) == sizeof(i::Object**)); - i::Handle<i::Object>* args = reinterpret_cast<i::Handle<i::Object>*>(argv); + i::Object*** args = reinterpret_cast<i::Object***>(argv); EXCEPTION_PREAMBLE(isolate); i::Handle<i::Object> returned = i::Execution::New(function, argc, args, &has_pending_exception); - EXCEPTION_BAILOUT_CHECK_DO_CALLBACK(isolate, Local<v8::Object>()); + EXCEPTION_BAILOUT_CHECK(isolate, Local<v8::Object>()); return scope.Close(Utils::ToLocal(i::Handle<i::JSObject>::cast(returned))); } @@ -3606,11 +3595,11 @@ Local<v8::Value> Function::Call(v8::Handle<v8::Object> recv, int argc, i::Handle<i::JSFunction> fun = Utils::OpenHandle(this); i::Handle<i::Object> recv_obj = Utils::OpenHandle(*recv); STATIC_ASSERT(sizeof(v8::Handle<v8::Value>) == sizeof(i::Object**)); - i::Handle<i::Object>* args = reinterpret_cast<i::Handle<i::Object>*>(argv); + i::Object*** args = reinterpret_cast<i::Object***>(argv); EXCEPTION_PREAMBLE(isolate); i::Handle<i::Object> returned = i::Execution::Call(fun, recv_obj, argc, args, &has_pending_exception); - EXCEPTION_BAILOUT_CHECK_DO_CALLBACK(isolate, Local<Object>()); + EXCEPTION_BAILOUT_CHECK(isolate, Local<Object>()); raw_result = *returned; } i::Handle<i::Object> result(raw_result); @@ -3633,12 +3622,6 @@ Handle<Value> Function::GetName() const { } -Handle<Value> Function::GetInferredName() const { - i::Handle<i::JSFunction> func = Utils::OpenHandle(this); - return Utils::ToLocal(i::Handle<i::Object>(func->shared()->inferred_name())); -} - - ScriptOrigin Function::GetScriptOrigin() const { i::Handle<i::JSFunction> func = Utils::OpenHandle(this); if (func->shared()->script()->IsScript()) { @@ -3666,23 +3649,6 @@ int Function::GetScriptLineNumber() const { } -int Function::GetScriptColumnNumber() const { - i::Handle<i::JSFunction> func = Utils::OpenHandle(this); - if (func->shared()->script()->IsScript()) { - i::Handle<i::Script> script(i::Script::cast(func->shared()->script())); - return i::GetScriptColumnNumber(script, func->shared()->start_position()); - } - return kLineOffsetNotFound; -} - -Handle<Value> Function::GetScriptId() const { - i::Handle<i::JSFunction> func = Utils::OpenHandle(this); - if (!func->shared()->script()->IsScript()) - return v8::Undefined(); - i::Handle<i::Script> script(i::Script::cast(func->shared()->script())); - return Utils::ToLocal(i::Handle<i::Object>(script->id())); -} - int String::Length() const { i::Handle<i::String> str = Utils::OpenHandle(this); if (IsDeadCheck(str->GetIsolate(), "v8::String::Length()")) return 0; @@ -3693,104 +3659,7 @@ int String::Length() const { int String::Utf8Length() const { i::Handle<i::String> str = Utils::OpenHandle(this); if (IsDeadCheck(str->GetIsolate(), "v8::String::Utf8Length()")) return 0; - return i::Utf8Length(str); -} - - -// Will fail with a negative answer if the recursion depth is too high. -static int RecursivelySerializeToUtf8(i::String* string, - char* buffer, - int start, - int end, - int recursion_budget, - int32_t previous_character, - int32_t* last_character) { - int utf8_bytes = 0; - while (true) { - if (string->IsAsciiRepresentation()) { - i::String::WriteToFlat(string, buffer, start, end); - *last_character = unibrow::Utf16::kNoPreviousCharacter; - return utf8_bytes + end - start; - } - switch (i::StringShape(string).representation_tag()) { - case i::kExternalStringTag: { - const uint16_t* data = i::ExternalTwoByteString::cast(string)-> - ExternalTwoByteStringGetData(0); - char* current = buffer; - for (int i = start; i < end; i++) { - uint16_t character = data[i]; - current += - unibrow::Utf8::Encode(current, character, previous_character); - previous_character = character; - } - *last_character = previous_character; - return static_cast<int>(utf8_bytes + current - buffer); - } - case i::kSeqStringTag: { - const uint16_t* data = - i::SeqTwoByteString::cast(string)->SeqTwoByteStringGetData(0); - char* current = buffer; - for (int i = start; i < end; i++) { - uint16_t character = data[i]; - current += - unibrow::Utf8::Encode(current, character, previous_character); - previous_character = character; - } - *last_character = previous_character; - return static_cast<int>(utf8_bytes + current - buffer); - } - case i::kSlicedStringTag: { - i::SlicedString* slice = i::SlicedString::cast(string); - unsigned offset = slice->offset(); - string = slice->parent(); - start += offset; - end += offset; - continue; - } - case i::kConsStringTag: { - i::ConsString* cons_string = i::ConsString::cast(string); - i::String* first = cons_string->first(); - int boundary = first->length(); - if (start >= boundary) { - // Only need RHS. - string = cons_string->second(); - start -= boundary; - end -= boundary; - continue; - } else if (end <= boundary) { - // Only need LHS. - string = first; - } else { - if (recursion_budget == 0) return -1; - int extra_utf8_bytes = - RecursivelySerializeToUtf8(first, - buffer, - start, - boundary, - recursion_budget - 1, - previous_character, - &previous_character); - if (extra_utf8_bytes < 0) return extra_utf8_bytes; - buffer += extra_utf8_bytes; - utf8_bytes += extra_utf8_bytes; - string = cons_string->second(); - start = 0; - end -= boundary; - } - } - } - } - UNREACHABLE(); - return 0; -} - - -bool String::MayContainNonAscii() const { - i::Handle<i::String> str = Utils::OpenHandle(this); - if (IsDeadCheck(str->GetIsolate(), "v8::String::MayContainNonAscii()")) { - return false; - } - return !str->HasOnlyAsciiChars(); + return str->Utf8Length(); } @@ -3802,67 +3671,13 @@ int String::WriteUtf8(char* buffer, if (IsDeadCheck(isolate, "v8::String::WriteUtf8()")) return 0; LOG_API(isolate, "String::WriteUtf8"); ENTER_V8(isolate); - i::Handle<i::String> str = Utils::OpenHandle(this); - int string_length = str->length(); - if (str->IsAsciiRepresentation()) { - int len; - if (capacity == -1) { - capacity = str->length() + 1; - len = string_length; - } else { - len = i::Min(capacity, str->length()); - } - i::String::WriteToFlat(*str, buffer, 0, len); - if (nchars_ref != NULL) *nchars_ref = len; - if (!(options & NO_NULL_TERMINATION) && capacity > len) { - buffer[len] = '\0'; - return len + 1; - } - return len; - } - - if (capacity == -1 || capacity / 3 >= string_length) { - int32_t previous = unibrow::Utf16::kNoPreviousCharacter; - const int kMaxRecursion = 100; - int utf8_bytes = - RecursivelySerializeToUtf8(*str, - buffer, - 0, - string_length, - kMaxRecursion, - previous, - &previous); - if (utf8_bytes >= 0) { - // Success serializing with recursion. - if ((options & NO_NULL_TERMINATION) == 0 && - (capacity > utf8_bytes || capacity == -1)) { - buffer[utf8_bytes++] = '\0'; - } - if (nchars_ref != NULL) *nchars_ref = string_length; - return utf8_bytes; - } - FlattenString(str); - // Recurse once. This time around the string is flat and the serializing - // with recursion will certainly succeed. - return WriteUtf8(buffer, capacity, nchars_ref, options); - } else if (capacity >= string_length) { - // First check that the buffer is large enough. If it is, then recurse - // once without a capacity limit, which will get into the other branch of - // this 'if'. - int utf8_bytes = i::Utf8Length(str); - if ((options & NO_NULL_TERMINATION) == 0) utf8_bytes++; - if (utf8_bytes <= capacity) { - return WriteUtf8(buffer, -1, nchars_ref, options); - } - } - - // Slow case. i::StringInputBuffer& write_input_buffer = *isolate->write_input_buffer(); + i::Handle<i::String> str = Utils::OpenHandle(this); isolate->string_tracker()->RecordWrite(str); if (options & HINT_MANY_WRITES_EXPECTED) { // Flatten the string for efficiency. This applies whether we are // using StringInputBuffer or Get(i) to access the characters. - FlattenString(str); + str->TryFlatten(); } write_input_buffer.Reset(0, *str); int len = str->length(); @@ -3873,13 +3688,11 @@ int String::WriteUtf8(char* buffer, int i; int pos = 0; int nchars = 0; - int previous = unibrow::Utf16::kNoPreviousCharacter; for (i = 0; i < len && (capacity == -1 || pos < fast_end); i++) { i::uc32 c = write_input_buffer.GetNext(); - int written = unibrow::Utf8::Encode(buffer + pos, c, previous); + int written = unibrow::Utf8::Encode(buffer + pos, c); pos += written; nchars++; - previous = c; } if (i < len) { // For the last characters we need to check the length for each one @@ -3888,33 +3701,16 @@ int String::WriteUtf8(char* buffer, char intermediate[unibrow::Utf8::kMaxEncodedSize]; for (; i < len && pos < capacity; i++) { i::uc32 c = write_input_buffer.GetNext(); - if (unibrow::Utf16::IsTrailSurrogate(c) && - unibrow::Utf16::IsLeadSurrogate(previous)) { - // We can't use the intermediate buffer here because the encoding - // of surrogate pairs is done under assumption that you can step - // back and fix the UTF8 stream. Luckily we only need space for one - // more byte, so there is always space. - ASSERT(pos < capacity); - int written = unibrow::Utf8::Encode(buffer + pos, c, previous); - ASSERT(written == 1); + int written = unibrow::Utf8::Encode(intermediate, c); + if (pos + written <= capacity) { + for (int j = 0; j < written; j++) + buffer[pos + j] = intermediate[j]; pos += written; nchars++; } else { - int written = - unibrow::Utf8::Encode(intermediate, - c, - unibrow::Utf16::kNoPreviousCharacter); - if (pos + written <= capacity) { - for (int j = 0; j < written; j++) - buffer[pos + j] = intermediate[j]; - pos += written; - nchars++; - } else { - // We've reached the end of the buffer - break; - } + // We've reached the end of the buffer + break; } - previous = c; } } if (nchars_ref != NULL) *nchars_ref = nchars; @@ -4010,11 +3806,10 @@ bool v8::String::IsExternalAscii() const { void v8::String::VerifyExternalStringResource( v8::String::ExternalStringResource* value) const { i::Handle<i::String> str = Utils::OpenHandle(this); - const v8::String::ExternalStringResource* expected; + v8::String::ExternalStringResource* expected; if (i::StringShape(*str).IsExternalTwoByte()) { - const void* resource = - i::Handle<i::ExternalTwoByteString>::cast(str)->resource(); - expected = reinterpret_cast<const ExternalStringResource*>(resource); + void* resource = i::Handle<i::ExternalTwoByteString>::cast(str)->resource(); + expected = reinterpret_cast<ExternalStringResource*>(resource); } else { expected = NULL; } @@ -4022,7 +3817,7 @@ void v8::String::VerifyExternalStringResource( } -const v8::String::ExternalAsciiStringResource* +v8::String::ExternalAsciiStringResource* v8::String::GetExternalAsciiStringResource() const { i::Handle<i::String> str = Utils::OpenHandle(this); if (IsDeadCheck(str->GetIsolate(), @@ -4030,9 +3825,8 @@ const v8::String::ExternalAsciiStringResource* return NULL; } if (i::StringShape(*str).IsExternalAscii()) { - const void* resource = - i::Handle<i::ExternalAsciiString>::cast(str)->resource(); - return reinterpret_cast<const ExternalAsciiStringResource*>(resource); + void* resource = i::Handle<i::ExternalAsciiString>::cast(str)->resource(); + return reinterpret_cast<ExternalAsciiStringResource*>(resource); } else { return NULL; } @@ -4170,7 +3964,7 @@ void v8::Object::SetPointerInInternalField(int index, void* value) { bool v8::V8::Initialize() { - i::Isolate* isolate = i::Isolate::Current(); + i::Isolate* isolate = i::Isolate::UncheckedCurrent(); if (isolate != NULL && isolate->IsInitialized()) { return true; } @@ -4183,12 +3977,6 @@ void v8::V8::SetEntropySource(EntropySource source) { } -void v8::V8::SetReturnAddressLocationResolver( - ReturnAddressLocationResolver return_address_resolver) { - i::V8::SetReturnAddressLocationResolver(return_address_resolver); -} - - bool v8::V8::Dispose() { i::Isolate* isolate = i::Isolate::Current(); if (!ApiCheck(isolate != NULL && isolate->IsDefaultIsolate(), @@ -4208,15 +3996,6 @@ HeapStatistics::HeapStatistics(): total_heap_size_(0), void v8::V8::GetHeapStatistics(HeapStatistics* heap_statistics) { - if (!i::Isolate::Current()->IsInitialized()) { - // Isolate is unitialized thus heap is not configured yet. - heap_statistics->set_total_heap_size(0); - heap_statistics->set_total_heap_size_executable(0); - heap_statistics->set_used_heap_size(0); - heap_statistics->set_heap_size_limit(0); - return; - } - i::Heap* heap = i::Isolate::Current()->heap(); heap_statistics->set_total_heap_size(heap->CommittedMemory()); heap_statistics->set_total_heap_size_executable( @@ -4226,26 +4005,18 @@ void v8::V8::GetHeapStatistics(HeapStatistics* heap_statistics) { } -void v8::V8::VisitExternalResources(ExternalResourceVisitor* visitor) { - i::Isolate* isolate = i::Isolate::Current(); - IsDeadCheck(isolate, "v8::V8::VisitExternalResources"); - isolate->heap()->VisitExternalResources(visitor); -} - - -bool v8::V8::IdleNotification(int hint) { +bool v8::V8::IdleNotification() { // Returning true tells the caller that it need not // continue to call IdleNotification. - i::Isolate* isolate = i::Isolate::Current(); - if (isolate == NULL || !isolate->IsInitialized()) return true; - return i::V8::IdleNotification(hint); + if (!i::Isolate::Current()->IsInitialized()) return true; + return i::V8::IdleNotification(); } void v8::V8::LowMemoryNotification() { i::Isolate* isolate = i::Isolate::Current(); - if (isolate == NULL || !isolate->IsInitialized()) return; - isolate->heap()->CollectAllAvailableGarbage("low memory notification"); + if (!isolate->IsInitialized()) return; + isolate->heap()->CollectAllGarbage(true); } @@ -4339,9 +4110,8 @@ Persistent<Context> v8::Context::New( } // Leave V8. - if (env.is_null()) { + if (env.is_null()) return Persistent<Context>(); - } return Persistent<Context>(Utils::ToLocal(env)); } @@ -4481,20 +4251,6 @@ void Context::AllowCodeGenerationFromStrings(bool allow) { } -bool Context::IsCodeGenerationFromStringsAllowed() { - i::Isolate* isolate = i::Isolate::Current(); - if (IsDeadCheck(isolate, - "v8::Context::IsCodeGenerationFromStringsAllowed()")) { - return false; - } - ENTER_V8(isolate); - i::Object** ctx = reinterpret_cast<i::Object**>(this); - i::Handle<i::Context> context = - i::Handle<i::Context>::cast(i::Handle<i::Object>(ctx)); - return !context->allow_code_gen_from_strings()->IsFalse(); -} - - void V8::SetWrapperClassId(i::Object** global_handle, uint16_t class_id) { i::GlobalHandles::SetWrapperClassId(global_handle, class_id); } @@ -4543,7 +4299,7 @@ static Local<External> ExternalNewImpl(void* data) { } static void* ExternalValueImpl(i::Handle<i::Object> obj) { - return reinterpret_cast<void*>(i::Foreign::cast(*obj)->foreign_address()); + return reinterpret_cast<void*>(i::Foreign::cast(*obj)->address()); } @@ -4569,7 +4325,7 @@ void* v8::Object::SlowGetPointerFromInternalField(int index) { if (value->IsSmi()) { return i::Internals::GetExternalPointerFromSmi(value); } else if (value->IsForeign()) { - return reinterpret_cast<void*>(i::Foreign::cast(value)->foreign_address()); + return reinterpret_cast<void*>(i::Foreign::cast(value)->address()); } else { return NULL; } @@ -4779,13 +4535,15 @@ bool v8::String::MakeExternal( bool v8::String::CanMakeExternal() { - if (!internal::FLAG_clever_optimizations) return false; i::Handle<i::String> obj = Utils::OpenHandle(this); i::Isolate* isolate = obj->GetIsolate(); if (IsDeadCheck(isolate, "v8::String::CanMakeExternal()")) return false; - if (isolate->string_tracker()->IsFreshUnusedString(obj)) return false; + if (isolate->string_tracker()->IsFreshUnusedString(obj)) { + return false; + } int size = obj->Size(); // Byte size of the original string. - if (size < i::ExternalString::kShortSize) return false; + if (size < i::ExternalString::kSize) + return false; i::StringShape shape(*obj); return !shape.IsExternal(); } @@ -4891,8 +4649,8 @@ double v8::Date::NumberValue() const { if (IsDeadCheck(isolate, "v8::Date::NumberValue()")) return 0; LOG_API(isolate, "Date::NumberValue"); i::Handle<i::Object> obj = Utils::OpenHandle(this); - i::Handle<i::JSDate> jsdate = i::Handle<i::JSDate>::cast(obj); - return jsdate->value()->Number(); + i::Handle<i::JSValue> jsvalue = i::Handle<i::JSValue>::cast(obj); + return jsvalue->value()->Number(); } @@ -4903,10 +4661,8 @@ void v8::Date::DateTimeConfigurationChangeNotification() { LOG_API(isolate, "Date::DateTimeConfigurationChangeNotification"); ENTER_V8(isolate); - isolate->date_cache()->ResetDateCache(); - i::HandleScope scope(isolate); - // Get the function ResetDateCache (defined in date.js). + // Get the function ResetDateCache (defined in date-delay.js). i::Handle<i::String> func_name_str = isolate->factory()->LookupAsciiSymbol("ResetDateCache"); i::MaybeObject* result = @@ -5063,7 +4819,7 @@ Local<Number> v8::Number::New(double value) { Local<Integer> v8::Integer::New(int32_t value) { - i::Isolate* isolate = i::Isolate::Current(); + i::Isolate* isolate = i::Isolate::UncheckedCurrent(); EnsureInitializedForIsolate(isolate, "v8::Integer::New()"); if (i::Smi::IsValid(value)) { return Utils::IntegerToLocal(i::Handle<i::Object>(i::Smi::FromInt(value), @@ -5121,7 +4877,7 @@ void V8::RemoveMessageListeners(MessageCallback that) { NeanderObject listener(i::JSObject::cast(listeners.get(i))); i::Handle<i::Foreign> callback_obj(i::Foreign::cast(listener.get(0))); - if (callback_obj->foreign_address() == FUNCTION_ADDR(that)) { + if (callback_obj->address() == FUNCTION_ADDR(that)) { listeners.set(i, isolate->heap()->undefined_value()); } } @@ -5267,21 +5023,6 @@ void V8::RemoveMemoryAllocationCallback(MemoryAllocationCallback callback) { } -void V8::AddCallCompletedCallback(CallCompletedCallback callback) { - if (callback == NULL) return; - i::Isolate* isolate = i::Isolate::Current(); - if (IsDeadCheck(isolate, "v8::V8::AddLeaveScriptCallback()")) return; - i::V8::AddCallCompletedCallback(callback); -} - - -void V8::RemoveCallCompletedCallback(CallCompletedCallback callback) { - i::Isolate* isolate = i::Isolate::Current(); - if (IsDeadCheck(isolate, "v8::V8::RemoveLeaveScriptCallback()")) return; - i::V8::RemoveCallCompletedCallback(callback); -} - - void V8::PauseProfiler() { i::Isolate* isolate = i::Isolate::Current(); isolate->logger()->PauseProfiler(); @@ -5341,7 +5082,7 @@ bool V8::IsExecutionTerminating(Isolate* isolate) { Isolate* Isolate::GetCurrent() { - i::Isolate* isolate = i::Isolate::Current(); + i::Isolate* isolate = i::Isolate::UncheckedCurrent(); return reinterpret_cast<Isolate*>(isolate); } @@ -5396,8 +5137,7 @@ String::Utf8Value::Utf8Value(v8::Handle<v8::Value> obj) TryCatch try_catch; Handle<String> str = obj->ToString(); if (str.IsEmpty()) return; - i::Handle<i::String> i_str = Utils::OpenHandle(*str); - length_ = i::Utf8Length(i_str); + length_ = str->Utf8Length(); str_ = i::NewArray<char>(length_ + 1); str->WriteUtf8(str_); } @@ -5747,14 +5487,8 @@ bool Debug::EnableAgent(const char* name, int port, bool wait_for_connection) { wait_for_connection); } - -void Debug::DisableAgent() { - return i::Isolate::Current()->debugger()->StopAgent(); -} - - void Debug::ProcessDebugMessages() { - i::Execution::ProcessDebugMessages(true); + i::Execution::ProcessDebugMesssages(true); } Local<Context> Debug::GetDebugContext() { @@ -6033,10 +5767,10 @@ int HeapGraphNode::GetSelfSize() const { } -int HeapGraphNode::GetRetainedSize() const { +int HeapGraphNode::GetRetainedSize(bool exact) const { i::Isolate* isolate = i::Isolate::Current(); IsDeadCheck(isolate, "v8::HeapSnapshot::GetRetainedSize"); - return ToInternal(this)->retained_size(); + return ToInternal(this)->RetainedSize(exact); } @@ -6138,7 +5872,7 @@ const HeapGraphNode* HeapSnapshot::GetNodeById(uint64_t id) const { i::Isolate* isolate = i::Isolate::Current(); IsDeadCheck(isolate, "v8::HeapSnapshot::GetNodeById"); return reinterpret_cast<const HeapGraphNode*>( - ToInternal(this)->GetEntryById(static_cast<i::SnapshotObjectId>(id))); + ToInternal(this)->GetEntryById(id)); } @@ -6231,11 +5965,6 @@ void HeapProfiler::DefineWrapperClass(uint16_t class_id, } -int HeapProfiler::GetPersistentHandleCount() { - i::Isolate* isolate = i::Isolate::Current(); - return isolate->global_handles()->NumberOfGlobalHandles(); -} - v8::Testing::StressType internal::Testing::stress_type_ = v8::Testing::kStressTypeOpt; @@ -6264,7 +5993,9 @@ static void SetFlagsFromString(const char* flags) { void Testing::PrepareStressRun(int run) { static const char* kLazyOptimizations = - "--prepare-always-opt --nolimit-inlining --noalways-opt"; + "--prepare-always-opt --nolimit-inlining " + "--noalways-opt --noopt-eagerly"; + static const char* kEagerOptimizations = "--opt-eagerly"; static const char* kForcedOptimizations = "--always-opt"; // If deoptimization stressed turn on frequent deoptimization. If no value @@ -6281,12 +6012,15 @@ void Testing::PrepareStressRun(int run) { if (run == GetStressRuns() - 1) { SetFlagsFromString(kForcedOptimizations); } else { + SetFlagsFromString(kEagerOptimizations); SetFlagsFromString(kLazyOptimizations); } #else if (run == GetStressRuns() - 1) { SetFlagsFromString(kForcedOptimizations); - } else if (run != GetStressRuns() - 2) { + } else if (run == GetStressRuns() - 2) { + SetFlagsFromString(kEagerOptimizations); + } else { SetFlagsFromString(kLazyOptimizations); } #endif |
