diff options
author | Peter Varga <pvarga@inf.u-szeged.hu> | 2012-06-13 09:21:17 +0200 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-06-13 09:55:50 +0200 |
commit | d47c4a1dad750d278bcf00b630af69c4b8bdb97f (patch) | |
tree | 289865bd448633ffec5e8d7e85436b6c0a8a6cad /src/3rdparty/v8/src/api.cc | |
parent | 28017b45db578180d0d54e67aea209ad95f73b9f (diff) |
Updated V8 from git://github.com/v8/v8.git to 3e6ec7e018bbf2c63ef04b85ff688198ea204c04
Update V8 source to version 3.11.4
* Performance and stability improvements on all platforms.
* Fixed native ARM build (issues 1744, 539)
* Fixed several bugs in heap profiles (including issue 2078).
* Throw syntax errors on illegal escape sequences.
* Made handling of const more consistent when combined with 'eval' and
'with'.
* Fixed V8 on MinGW-x64 (issue 2026).
* Put new global var semantics behind a flag until WebKit tests are
cleaned up.
* Enabled inlining some V8 API functions.
* Enabled MIPS cross-compilation.
* Implemented clearing of CompareICs (issue 2102).
* Fixed python deprecations. (issue 1391)
* Fixed GCC 4.7 (C++11) compilation. (issue 2136)
Change-Id: I72594bd22356391dd55e315c022d0c9f3fd5b451
Reviewed-by: Kent Hansen <kent.hansen@nokia.com>
Diffstat (limited to 'src/3rdparty/v8/src/api.cc')
-rw-r--r-- | src/3rdparty/v8/src/api.cc | 307 |
1 files changed, 66 insertions, 241 deletions
diff --git a/src/3rdparty/v8/src/api.cc b/src/3rdparty/v8/src/api.cc index 78fc0b1..52a84ed 100644 --- a/src/3rdparty/v8/src/api.cc +++ b/src/3rdparty/v8/src/api.cc @@ -1152,7 +1152,6 @@ void FunctionTemplate::SetNamedInstancePropertyHandler( NamedPropertyQuery query, NamedPropertyDeleter remover, NamedPropertyEnumerator enumerator, - bool is_fallback, Handle<Value> data) { i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); if (IsDeadCheck(isolate, @@ -1171,7 +1170,6 @@ void FunctionTemplate::SetNamedInstancePropertyHandler( if (query != 0) SET_FIELD_WRAPPED(obj, set_query, query); if (remover != 0) SET_FIELD_WRAPPED(obj, set_deleter, remover); if (enumerator != 0) SET_FIELD_WRAPPED(obj, set_enumerator, enumerator); - obj->set_is_fallback(i::Smi::FromInt(is_fallback)); if (data.IsEmpty()) data = v8::Undefined(); obj->set_data(*Utils::OpenHandle(*data)); @@ -1316,33 +1314,6 @@ void ObjectTemplate::SetNamedPropertyHandler(NamedPropertyGetter getter, query, remover, enumerator, - false, - data); -} - - -void ObjectTemplate::SetFallbackPropertyHandler(NamedPropertyGetter getter, - NamedPropertySetter setter, - NamedPropertyQuery query, - NamedPropertyDeleter remover, - NamedPropertyEnumerator enumerator, - Handle<Value> data) { - i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); - if (IsDeadCheck(isolate, "v8::ObjectTemplate::SetNamedPropertyHandler()")) { - return; - } - ENTER_V8(isolate); - i::HandleScope scope(isolate); - EnsureConstructor(this); - i::FunctionTemplateInfo* constructor = - i::FunctionTemplateInfo::cast(Utils::OpenHandle(this)->constructor()); - i::Handle<i::FunctionTemplateInfo> cons(constructor); - Utils::ToLocal(cons)->SetNamedInstancePropertyHandler(getter, - setter, - query, - remover, - enumerator, - true, data); } @@ -1465,45 +1436,6 @@ void ObjectTemplate::SetInternalFieldCount(int value) { } -bool ObjectTemplate::HasExternalResource() -{ - if (IsDeadCheck(Utils::OpenHandle(this)->GetIsolate(), - "v8::ObjectTemplate::HasExternalResource()")) { - return 0; - } - return !Utils::OpenHandle(this)->has_external_resource()->IsUndefined(); -} - - -void ObjectTemplate::SetHasExternalResource(bool value) -{ - i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); - if (IsDeadCheck(isolate, "v8::ObjectTemplate::SetHasExternalResource()")) { - return; - } - ENTER_V8(isolate); - if (value) { - EnsureConstructor(this); - } - if (value) { - Utils::OpenHandle(this)->set_has_external_resource(i::Smi::FromInt(1)); - } else { - Utils::OpenHandle(this)->set_has_external_resource(Utils::OpenHandle(this)->GetHeap()->undefined_value()); - } -} - - -void ObjectTemplate::MarkAsUseUserObjectComparison() -{ - i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); - if (IsDeadCheck(isolate, "v8::ObjectTemplate::MarkAsUseUserObjectComparison()")) { - return; - } - ENTER_V8(isolate); - EnsureConstructor(this); - Utils::OpenHandle(this)->set_use_user_object_comparison(i::Smi::FromInt(1)); -} - // --- S c r i p t D a t a --- @@ -1554,8 +1486,7 @@ ScriptData* ScriptData::New(const char* data, int length) { Local<Script> Script::New(v8::Handle<String> source, v8::ScriptOrigin* origin, v8::ScriptData* pre_data, - v8::Handle<String> script_data, - v8::Script::CompileFlags compile_flags) { + v8::Handle<String> script_data) { i::Isolate* isolate = i::Isolate::Current(); ON_BAILOUT(isolate, "v8::Script::New()", return Local<Script>()); LOG_API(isolate, "Script::New"); @@ -1596,8 +1527,7 @@ Local<Script> Script::New(v8::Handle<String> source, NULL, pre_data_impl, Utils::OpenHandle(*script_data), - i::NOT_NATIVES_CODE, - compile_flags); + i::NOT_NATIVES_CODE); has_pending_exception = result.is_null(); EXCEPTION_BAILOUT_CHECK(isolate, Local<Script>()); raw_result = *result; @@ -1608,23 +1538,21 @@ Local<Script> Script::New(v8::Handle<String> source, Local<Script> Script::New(v8::Handle<String> source, - v8::Handle<Value> file_name, - v8::Script::CompileFlags compile_flags) { + v8::Handle<Value> file_name) { ScriptOrigin origin(file_name); - return New(source, &origin, 0, Handle<String>(), compile_flags); + return New(source, &origin); } Local<Script> Script::Compile(v8::Handle<String> source, v8::ScriptOrigin* origin, v8::ScriptData* pre_data, - v8::Handle<String> script_data, - v8::Script::CompileFlags compile_flags) { + v8::Handle<String> script_data) { i::Isolate* isolate = i::Isolate::Current(); ON_BAILOUT(isolate, "v8::Script::Compile()", return Local<Script>()); LOG_API(isolate, "Script::Compile"); ENTER_V8(isolate); - Local<Script> generic = New(source, origin, pre_data, script_data, compile_flags); + Local<Script> generic = New(source, origin, pre_data, script_data); if (generic.IsEmpty()) return generic; i::Handle<i::Object> obj = Utils::OpenHandle(*generic); @@ -1640,18 +1568,13 @@ Local<Script> Script::Compile(v8::Handle<String> source, Local<Script> Script::Compile(v8::Handle<String> source, v8::Handle<Value> file_name, - v8::Handle<String> script_data, - v8::Script::CompileFlags compile_flags) { + v8::Handle<String> script_data) { ScriptOrigin origin(file_name); - return Compile(source, &origin, 0, script_data, compile_flags); + return Compile(source, &origin, 0, script_data); } Local<Value> Script::Run() { - return Run(Handle<Object>()); -} - -Local<Value> Script::Run(Handle<Object> qml) { i::Isolate* isolate = i::Isolate::Current(); ON_BAILOUT(isolate, "v8::Script::Run()", return Local<Value>()); LOG_API(isolate, "Script::Run"); @@ -1670,11 +1593,10 @@ Local<Value> Script::Run(Handle<Object> qml) { fun = i::Handle<i::JSFunction>(i::JSFunction::cast(*obj), isolate); } EXCEPTION_PREAMBLE(isolate); - i::Handle<i::Object> qmlglobal = Utils::OpenHandle(*qml); i::Handle<i::Object> receiver( isolate->context()->global_proxy(), isolate); i::Handle<i::Object> result = - i::Execution::Call(fun, receiver, 0, NULL, &has_pending_exception, false, qmlglobal); + i::Execution::Call(fun, receiver, 0, NULL, &has_pending_exception); EXCEPTION_BAILOUT_CHECK_DO_CALLBACK(isolate, Local<Value>()); raw_result = *result; } @@ -2179,17 +2101,21 @@ bool StackFrame::IsConstructor() const { // --- D a t a --- -bool Value::IsUndefined() const { +bool Value::FullIsUndefined() const { if (IsDeadCheck(i::Isolate::Current(), "v8::Value::IsUndefined()")) { return false; } - return Utils::OpenHandle(this)->IsUndefined(); + bool result = Utils::OpenHandle(this)->IsUndefined(); + ASSERT_EQ(result, QuickIsUndefined()); + return result; } -bool Value::IsNull() const { +bool Value::FullIsNull() const { if (IsDeadCheck(i::Isolate::Current(), "v8::Value::IsNull()")) return false; - return Utils::OpenHandle(this)->IsNull(); + bool result = Utils::OpenHandle(this)->IsNull(); + ASSERT_EQ(result, QuickIsNull()); + return result; } @@ -2362,12 +2288,6 @@ bool Value::IsRegExp() const { return obj->IsJSRegExp(); } -bool Value::IsError() const { - if (IsDeadCheck(i::Isolate::Current(), "v8::Value::IsError()")) return false; - i::Handle<i::Object> obj = Utils::OpenHandle(this); - return obj->HasSpecificClassOf(HEAP->Error_symbol()); -} - Local<String> Value::ToString() const { i::Handle<i::Object> obj = Utils::OpenHandle(this); @@ -2893,9 +2813,13 @@ bool v8::Object::ForceDelete(v8::Handle<Value> key) { i::Handle<i::JSObject> self = Utils::OpenHandle(this); i::Handle<i::Object> key_obj = Utils::OpenHandle(*key); - // When turning on access checks for a global object deoptimize all functions - // as optimized code does not always handle access checks. - i::Deoptimizer::DeoptimizeGlobalObject(*self); + // When deleting a property on the global object using ForceDelete + // deoptimize all functions as optimized code does not check for the hole + // value with DontDelete properties. We have to deoptimize all contexts + // because of possible cross-context inlined functions. + if (self->IsJSGlobalProxy() || self->IsGlobalObject()) { + i::Deoptimizer::DeoptimizeAll(); + } EXCEPTION_PREAMBLE(isolate); i::Handle<i::Object> obj = i::ForceDeleteProperty(self, key_obj); @@ -3888,59 +3812,6 @@ bool String::MayContainNonAscii() const { } -uint32_t String::Hash() const { - i::Handle<i::String> str = Utils::OpenHandle(this); - if (IsDeadCheck(str->GetIsolate(), "v8::String::Hash()")) return 0; - return str->Hash(); -} - - -String::CompleteHashData String::CompleteHash() const { - i::Handle<i::String> str = Utils::OpenHandle(this); - if (IsDeadCheck(str->GetIsolate(), "v8::String::CompleteHash()")) { - return CompleteHashData(); - } - CompleteHashData result; - result.length = str->length(); - result.hash = str->Hash(); - if (str->IsSeqString()) - result.symbol_id = i::SeqString::cast(*str)->symbol_id(); - return result; -} - - -uint32_t String::ComputeHash(uint16_t *string, int length) { - return i::HashSequentialString<i::uc16>(string, length, i::kZeroHashSeed) >> - i::String::kHashShift; -} - - -uint32_t String::ComputeHash(char *string, int length) { - return i::HashSequentialString<char>(string, length, i::kZeroHashSeed) >> - i::String::kHashShift; -} - - -uint16_t String::GetCharacter(int index) { - i::Handle<i::String> str = Utils::OpenHandle(this); - return str->Get(index); -} - - -bool String::Equals(uint16_t *string, int length) { - i::Handle<i::String> str = Utils::OpenHandle(this); - if (IsDeadCheck(str->GetIsolate(), "v8::String::Equals()")) return 0; - return str->SlowEqualsExternal(string, length); -} - - -bool String::Equals(char *string, int length) { - i::Handle<i::String> str = Utils::OpenHandle(this); - if (IsDeadCheck(str->GetIsolate(), "v8::String::Equals()")) return 0; - return str->SlowEqualsExternal(string, length); -} - - int String::WriteUtf8(char* buffer, int capacity, int* nchars_ref, @@ -4313,34 +4184,6 @@ void v8::Object::SetPointerInInternalField(int index, void* value) { } -void v8::Object::SetExternalResource(v8::Object::ExternalResource *resource) { - i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); - ENTER_V8(isolate); - i::Handle<i::JSObject> obj = Utils::OpenHandle(this); - if (CanBeEncodedAsSmi(resource)) { - obj->SetExternalResourceObject(EncodeAsSmi(resource)); - } else { - obj->SetExternalResourceObject(*isolate->factory()->NewForeign(static_cast<i::Address>((void *)resource))); - } - if (!obj->IsSymbol()) { - isolate->heap()->external_string_table()->AddObject(*obj); - } -} - - -v8::Object::ExternalResource *v8::Object::GetExternalResource() { - i::Handle<i::JSObject> obj = Utils::OpenHandle(this); - i::Object* value = obj->GetExternalResourceObject(); - if (value->IsSmi()) { - return reinterpret_cast<v8::Object::ExternalResource*>(i::Internals::GetExternalPointerFromSmi(value)); - } else if (value->IsForeign()) { - return reinterpret_cast<v8::Object::ExternalResource*>(i::Foreign::cast(value)->foreign_address()); - } else { - return NULL; - } -} - - // --- E n v i r o n m e n t --- @@ -4607,37 +4450,6 @@ v8::Local<v8::Context> Context::GetCalling() { } -v8::Local<v8::Object> Context::GetCallingQmlGlobal() { - i::Isolate* isolate = i::Isolate::Current(); - if (IsDeadCheck(isolate, "v8::Context::GetCallingQmlGlobal()")) { - return Local<Object>(); - } - - i::Context *context = isolate->context(); - i::JavaScriptFrameIterator it; - if (it.done()) return Local<Object>(); - context = i::Context::cast(it.frame()->context()); - if (!context->qml_global()->IsUndefined()) { - i::Handle<i::Object> qmlglobal(context->qml_global()); - return Utils::ToLocal(i::Handle<i::JSObject>::cast(qmlglobal)); - } else { - return Local<Object>(); - } -} - -v8::Local<v8::Value> Context::GetCallingScriptData() -{ - i::Isolate* isolate = i::Isolate::Current(); - if (IsDeadCheck(isolate, "v8::Context::GetCallingScriptData()")) { - return Local<Object>(); - } - - i::JavaScriptFrameIterator it; - if (it.done()) return Local<Object>(); - i::Handle<i::Script> script(i::Script::cast(i::JSFunction::cast(it.frame()->function())->shared()->script())); - return Utils::ToLocal(i::Handle<i::Object>(script->data())); -} - v8::Local<v8::Object> Context::Global() { if (IsDeadCheck(i::Isolate::Current(), "v8::Context::Global()")) { return Local<v8::Object>(); @@ -4818,7 +4630,9 @@ void* External::Value() const { Local<String> v8::String::Empty() { i::Isolate* isolate = i::Isolate::Current(); - EnsureInitializedForIsolate(isolate, "v8::String::Empty()"); + if (!EnsureInitializedForIsolate(isolate, "v8::String::Empty()")) { + return v8::Local<String>(); + } LOG_API(isolate, "String::Empty()"); return Utils::ToLocal(isolate->factory()->empty_symbol()); } @@ -5381,17 +5195,6 @@ void V8::SetFailedAccessCheckCallbackFunction( isolate->SetFailedAccessCheckCallback(callback); } - -void V8::SetUserObjectComparisonCallbackFunction( - UserObjectComparisonCallback callback) { - i::Isolate* isolate = i::Isolate::Current(); - if (IsDeadCheck(isolate, "v8::V8::SetUserObjectComparisonCallbackFunction()")) { - return; - } - isolate->SetUserObjectComparisonCallback(callback); -} - - void V8::AddObjectGroup(Persistent<Value>* objects, size_t length, RetainedObjectInfo* info) { @@ -5415,7 +5218,7 @@ void V8::AddImplicitReferences(Persistent<Object> parent, } -int V8::AdjustAmountOfExternalAllocatedMemory(int change_in_bytes) { +intptr_t V8::AdjustAmountOfExternalAllocatedMemory(intptr_t change_in_bytes) { i::Isolate* isolate = i::Isolate::Current(); if (IsDeadCheck(isolate, "v8::V8::AdjustAmountOfExternalAllocatedMemory()")) { return 0; @@ -5595,17 +5398,6 @@ void Isolate::Exit() { } -void Isolate::SetData(void* data) { - i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this); - isolate->SetData(data); -} - -void* Isolate::GetData() { - i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this); - return isolate->GetData(); -} - - String::Utf8Value::Utf8Value(v8::Handle<v8::Value> obj) : str_(NULL), length_(0) { i::Isolate* isolate = i::Isolate::Current(); @@ -6205,7 +5997,7 @@ Handle<Value> HeapGraphEdge::GetName() const { const HeapGraphNode* HeapGraphEdge::GetFromNode() const { i::Isolate* isolate = i::Isolate::Current(); IsDeadCheck(isolate, "v8::HeapGraphEdge::GetFromNode"); - const i::HeapEntry* from = ToInternal(this)->From(); + const i::HeapEntry* from = ToInternal(this)->from(); return reinterpret_cast<const HeapGraphNode*>(from); } @@ -6271,7 +6063,7 @@ const HeapGraphEdge* HeapGraphNode::GetChild(int index) const { i::Isolate* isolate = i::Isolate::Current(); IsDeadCheck(isolate, "v8::HeapSnapshot::GetChild"); return reinterpret_cast<const HeapGraphEdge*>( - &ToInternal(this)->children()[index]); + ToInternal(this)->children()[index]); } @@ -6365,7 +6157,7 @@ const HeapGraphNode* HeapSnapshot::GetNodeById(SnapshotObjectId id) const { int HeapSnapshot::GetNodesCount() const { i::Isolate* isolate = i::Isolate::Current(); IsDeadCheck(isolate, "v8::HeapSnapshot::GetNodesCount"); - return ToInternal(this)->entries()->length(); + return ToInternal(this)->entries().length(); } @@ -6373,7 +6165,7 @@ const HeapGraphNode* HeapSnapshot::GetNode(int index) const { i::Isolate* isolate = i::Isolate::Current(); IsDeadCheck(isolate, "v8::HeapSnapshot::GetNode"); return reinterpret_cast<const HeapGraphNode*>( - ToInternal(this)->entries()->at(index)); + &ToInternal(this)->entries().at(index)); } @@ -6425,6 +6217,14 @@ const HeapSnapshot* HeapProfiler::FindSnapshot(unsigned uid) { } +SnapshotObjectId HeapProfiler::GetSnapshotObjectId(Handle<Value> value) { + i::Isolate* isolate = i::Isolate::Current(); + IsDeadCheck(isolate, "v8::HeapProfiler::GetSnapshotObjectId"); + i::Handle<i::Object> obj = Utils::OpenHandle(*value); + return i::HeapProfiler::GetSnapshotObjectId(obj); +} + + const HeapSnapshot* HeapProfiler::TakeSnapshot(Handle<String> title, HeapSnapshot::Type type, ActivityControl* control) { @@ -6444,6 +6244,27 @@ const HeapSnapshot* HeapProfiler::TakeSnapshot(Handle<String> title, } +void HeapProfiler::StartHeapObjectsTracking() { + i::Isolate* isolate = i::Isolate::Current(); + IsDeadCheck(isolate, "v8::HeapProfiler::StartHeapObjectsTracking"); + i::HeapProfiler::StartHeapObjectsTracking(); +} + + +void HeapProfiler::StopHeapObjectsTracking() { + i::Isolate* isolate = i::Isolate::Current(); + IsDeadCheck(isolate, "v8::HeapProfiler::StopHeapObjectsTracking"); + i::HeapProfiler::StopHeapObjectsTracking(); +} + + +void HeapProfiler::PushHeapObjectsStats(OutputStream* stream) { + i::Isolate* isolate = i::Isolate::Current(); + IsDeadCheck(isolate, "v8::HeapProfiler::PushHeapObjectsStats"); + return i::HeapProfiler::PushHeapObjectsStats(stream); +} + + void HeapProfiler::DeleteAllSnapshots() { i::Isolate* isolate = i::Isolate::Current(); IsDeadCheck(isolate, "v8::HeapProfiler::DeleteAllSnapshots"); @@ -6491,7 +6312,11 @@ 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 " + "--max-inlined-source-size=999999 " + "--max-inlined-nodes=999999 " + "--max-inlined-nodes-cumulative=999999 " + "--noalways-opt"; static const char* kForcedOptimizations = "--always-opt"; // If deoptimization stressed turn on frequent deoptimization. If no value |