Removed a bunch of GetExistingThreadLocal calls by threading the Isolate.
For Octane, the number of calls go down from 7341629 to 1947880, i.e. they are reduced by more than 73%. TLS access is not especially cheap, so this exercise seems worthwhile. Review URL: https://codereview.chromium.org/11412007 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@12979 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
5dec1423a4
commit
d5f589808d
@ -905,7 +905,7 @@ i::Object** v8::HandleScope::RawClose(i::Object** value) {
|
||||
}
|
||||
|
||||
// Allocate a new handle on the previous handle block.
|
||||
i::Handle<i::Object> handle(result);
|
||||
i::Handle<i::Object> handle(result, isolate_);
|
||||
return handle.location();
|
||||
}
|
||||
|
||||
@ -3414,7 +3414,7 @@ v8::Local<v8::Value> v8::Object::GetHiddenValue(v8::Handle<v8::String> key) {
|
||||
i::Handle<i::JSObject> self = Utils::OpenHandle(this);
|
||||
i::Handle<i::String> key_obj = Utils::OpenHandle(*key);
|
||||
i::Handle<i::String> key_symbol = FACTORY->LookupSymbol(key_obj);
|
||||
i::Handle<i::Object> result(self->GetHiddenProperty(*key_symbol));
|
||||
i::Handle<i::Object> result(self->GetHiddenProperty(*key_symbol), isolate);
|
||||
if (result->IsUndefined()) return v8::Local<v8::Value>();
|
||||
return Utils::ToLocal(result);
|
||||
}
|
||||
@ -4649,13 +4649,14 @@ v8::Local<v8::Context> Context::GetCalling() {
|
||||
|
||||
|
||||
v8::Local<v8::Object> Context::Global() {
|
||||
if (IsDeadCheck(i::Isolate::Current(), "v8::Context::Global()")) {
|
||||
i::Isolate* isolate = i::Isolate::Current();
|
||||
if (IsDeadCheck(isolate, "v8::Context::Global()")) {
|
||||
return Local<v8::Object>();
|
||||
}
|
||||
i::Object** ctx = reinterpret_cast<i::Object**>(this);
|
||||
i::Handle<i::Context> context =
|
||||
i::Handle<i::Context>::cast(i::Handle<i::Object>(ctx));
|
||||
i::Handle<i::Object> global(context->global_proxy());
|
||||
i::Handle<i::Object> global(context->global_proxy(), isolate);
|
||||
return Utils::ToLocal(i::Handle<i::JSObject>::cast(global));
|
||||
}
|
||||
|
||||
|
@ -130,7 +130,7 @@ void FullCodeGenerator::Generate() {
|
||||
handler_table_ =
|
||||
isolate()->factory()->NewFixedArray(function()->handler_count(), TENURED);
|
||||
profiling_counter_ = isolate()->factory()->NewJSGlobalPropertyCell(
|
||||
Handle<Smi>(Smi::FromInt(FLAG_interrupt_budget)));
|
||||
Handle<Smi>(Smi::FromInt(FLAG_interrupt_budget), isolate()));
|
||||
SetFunctionPosition(function());
|
||||
Comment cmnt(masm_, "[ function compiled by full code generator");
|
||||
|
||||
@ -2377,7 +2377,7 @@ void FullCodeGenerator::VisitCall(Call* expr) {
|
||||
VariableProxy* proxy = callee->AsVariableProxy();
|
||||
Property* property = callee->AsProperty();
|
||||
|
||||
if (proxy != NULL && proxy->var()->is_possibly_eval()) {
|
||||
if (proxy != NULL && proxy->var()->is_possibly_eval(isolate())) {
|
||||
// In a call to eval, we first call %ResolvePossiblyDirectEval to
|
||||
// resolve the function we need to call and the receiver of the
|
||||
// call. Then we call the resolved function using the given
|
||||
|
@ -1367,7 +1367,7 @@ Handle<Map> Factory::ObjectLiteralMapFromCache(Handle<Context> context,
|
||||
// Check to see whether there is a matching element in the cache.
|
||||
Handle<MapCache> cache =
|
||||
Handle<MapCache>(MapCache::cast(context->map_cache()));
|
||||
Handle<Object> result = Handle<Object>(cache->Lookup(*keys));
|
||||
Handle<Object> result = Handle<Object>(cache->Lookup(*keys), isolate());
|
||||
if (result->IsMap()) return Handle<Map>::cast(result);
|
||||
// Create a new map and add it to the cache.
|
||||
Handle<Map> map =
|
||||
@ -1419,7 +1419,7 @@ void Factory::ConfigureInstance(Handle<FunctionTemplateInfo> desc,
|
||||
bool* pending_exception) {
|
||||
// Configure the instance by adding the properties specified by the
|
||||
// instance template.
|
||||
Handle<Object> instance_template = Handle<Object>(desc->instance_template());
|
||||
Handle<Object> instance_template(desc->instance_template(), isolate());
|
||||
if (!instance_template->IsUndefined()) {
|
||||
Execution::ConfigureInstance(instance,
|
||||
instance_template,
|
||||
|
@ -97,8 +97,8 @@ class Handle {
|
||||
|
||||
// Convenience wrapper.
|
||||
template<class T>
|
||||
inline Handle<T> handle(T* t) {
|
||||
return Handle<T>(t);
|
||||
inline Handle<T> handle(T* t, Isolate* isolate) {
|
||||
return Handle<T>(t, isolate);
|
||||
}
|
||||
|
||||
|
||||
|
@ -3237,9 +3237,8 @@ HGraph* HGraphBuilder::CreateGraph() {
|
||||
// optimization. Disable optimistic LICM in that case.
|
||||
Handle<Code> unoptimized_code(info()->shared_info()->code());
|
||||
ASSERT(unoptimized_code->kind() == Code::FUNCTION);
|
||||
Handle<Object> maybe_type_info(unoptimized_code->type_feedback_info());
|
||||
Handle<TypeFeedbackInfo> type_info(
|
||||
Handle<TypeFeedbackInfo>::cast(maybe_type_info));
|
||||
TypeFeedbackInfo::cast(unoptimized_code->type_feedback_info()));
|
||||
int checksum = type_info->own_type_change_checksum();
|
||||
int composite_checksum = graph()->update_type_change_checksum(checksum);
|
||||
graph()->set_use_optimistic_licm(
|
||||
@ -7115,9 +7114,8 @@ bool HGraphBuilder::TryInline(CallKind call_kind,
|
||||
inlined_count_ += nodes_added;
|
||||
|
||||
ASSERT(unoptimized_code->kind() == Code::FUNCTION);
|
||||
Handle<Object> maybe_type_info(unoptimized_code->type_feedback_info());
|
||||
Handle<TypeFeedbackInfo> type_info(
|
||||
Handle<TypeFeedbackInfo>::cast(maybe_type_info));
|
||||
TypeFeedbackInfo::cast(unoptimized_code->type_feedback_info()));
|
||||
graph()->update_type_change_checksum(type_info->own_type_change_checksum());
|
||||
|
||||
TraceInline(target, caller, NULL);
|
||||
@ -7642,7 +7640,7 @@ void HGraphBuilder::VisitCall(Call* expr) {
|
||||
VariableProxy* proxy = expr->expression()->AsVariableProxy();
|
||||
bool global_call = proxy != NULL && proxy->var()->IsUnallocated();
|
||||
|
||||
if (proxy != NULL && proxy->var()->is_possibly_eval()) {
|
||||
if (proxy != NULL && proxy->var()->is_possibly_eval(isolate())) {
|
||||
return Bailout("possible direct call to eval");
|
||||
}
|
||||
|
||||
|
@ -119,7 +119,7 @@ void FullCodeGenerator::Generate() {
|
||||
handler_table_ =
|
||||
isolate()->factory()->NewFixedArray(function()->handler_count(), TENURED);
|
||||
profiling_counter_ = isolate()->factory()->NewJSGlobalPropertyCell(
|
||||
Handle<Smi>(Smi::FromInt(FLAG_interrupt_budget)));
|
||||
Handle<Smi>(Smi::FromInt(FLAG_interrupt_budget), isolate()));
|
||||
SetFunctionPosition(function());
|
||||
Comment cmnt(masm_, "[ function compiled by full code generator");
|
||||
|
||||
@ -2329,7 +2329,7 @@ void FullCodeGenerator::VisitCall(Call* expr) {
|
||||
VariableProxy* proxy = callee->AsVariableProxy();
|
||||
Property* property = callee->AsProperty();
|
||||
|
||||
if (proxy != NULL && proxy->var()->is_possibly_eval()) {
|
||||
if (proxy != NULL && proxy->var()->is_possibly_eval(isolate())) {
|
||||
// In a call to eval, we first call %ResolvePossiblyDirectEval to
|
||||
// resolve the function we need to call and the receiver of the call.
|
||||
// Then we call the resolved function using the given arguments.
|
||||
|
@ -43,7 +43,8 @@ Address IC::address() const {
|
||||
Address result = Assembler::target_address_from_return_address(pc());
|
||||
|
||||
#ifdef ENABLE_DEBUGGER_SUPPORT
|
||||
Debug* debug = Isolate::Current()->debug();
|
||||
ASSERT(Isolate::Current() == isolate());
|
||||
Debug* debug = isolate()->debug();
|
||||
// First check if any break points are active if not just return the address
|
||||
// of the call.
|
||||
if (!debug->has_break_points()) return result;
|
||||
|
@ -310,7 +310,8 @@ void IC::PostPatching(Address address, Code* target, Code* old_target) {
|
||||
if (FLAG_type_info_threshold == 0 && !FLAG_watch_ic_patching) {
|
||||
return;
|
||||
}
|
||||
Code* host = target->GetHeap()->isolate()->
|
||||
Isolate* isolate = target->GetHeap()->isolate();
|
||||
Code* host = isolate->
|
||||
inner_pointer_to_code_cache()->GetCacheEntry(address)->code;
|
||||
if (host->kind() != Code::FUNCTION) return;
|
||||
|
||||
@ -333,7 +334,7 @@ void IC::PostPatching(Address address, Code* target, Code* old_target) {
|
||||
}
|
||||
if (FLAG_watch_ic_patching) {
|
||||
host->set_profiler_ticks(0);
|
||||
Isolate::Current()->runtime_profiler()->NotifyICChanged();
|
||||
isolate->runtime_profiler()->NotifyICChanged();
|
||||
}
|
||||
// TODO(2029): When an optimized function is patched, it would
|
||||
// be nice to propagate the corresponding type information to its
|
||||
|
@ -139,7 +139,7 @@ void FullCodeGenerator::Generate() {
|
||||
handler_table_ =
|
||||
isolate()->factory()->NewFixedArray(function()->handler_count(), TENURED);
|
||||
profiling_counter_ = isolate()->factory()->NewJSGlobalPropertyCell(
|
||||
Handle<Smi>(Smi::FromInt(FLAG_interrupt_budget)));
|
||||
Handle<Smi>(Smi::FromInt(FLAG_interrupt_budget), isolate()));
|
||||
SetFunctionPosition(function());
|
||||
Comment cmnt(masm_, "[ function compiled by full code generator");
|
||||
|
||||
@ -2405,7 +2405,7 @@ void FullCodeGenerator::VisitCall(Call* expr) {
|
||||
VariableProxy* proxy = callee->AsVariableProxy();
|
||||
Property* property = callee->AsProperty();
|
||||
|
||||
if (proxy != NULL && proxy->var()->is_possibly_eval()) {
|
||||
if (proxy != NULL && proxy->var()->is_possibly_eval(isolate())) {
|
||||
// In a call to eval, we first call %ResolvePossiblyDirectEval to
|
||||
// resolve the function we need to call and the receiver of the
|
||||
// call. Then we call the resolved function using the given
|
||||
|
@ -1678,6 +1678,7 @@ MaybeObject* JSObject::AddProperty(String* name,
|
||||
ASSERT(!IsJSGlobalProxy());
|
||||
Map* map_of_this = map();
|
||||
Heap* heap = GetHeap();
|
||||
Isolate* isolate = heap->isolate();
|
||||
MaybeObject* result;
|
||||
if (extensibility_check == PERFORM_EXTENSIBILITY_CHECK &&
|
||||
!map_of_this->is_extensible()) {
|
||||
@ -1685,7 +1686,7 @@ MaybeObject* JSObject::AddProperty(String* name,
|
||||
return value;
|
||||
} else {
|
||||
Handle<Object> args[1] = {Handle<String>(name)};
|
||||
return heap->isolate()->Throw(
|
||||
return isolate->Throw(
|
||||
*FACTORY->NewTypeError("object_not_extensible",
|
||||
HandleVector(args, 1)));
|
||||
}
|
||||
@ -1715,11 +1716,13 @@ MaybeObject* JSObject::AddProperty(String* name,
|
||||
}
|
||||
|
||||
Handle<Object> hresult;
|
||||
if (!result->ToHandle(&hresult)) return result;
|
||||
if (!result->ToHandle(&hresult, isolate)) return result;
|
||||
|
||||
if (FLAG_harmony_observation && map()->is_observed()) {
|
||||
EnqueueChangeRecord(handle(this), "new", handle(name),
|
||||
handle(heap->the_hole_value()));
|
||||
EnqueueChangeRecord(handle(this, isolate),
|
||||
"new",
|
||||
handle(name, isolate),
|
||||
handle(heap->the_hole_value(), isolate));
|
||||
}
|
||||
|
||||
return *hresult;
|
||||
@ -2855,6 +2858,7 @@ MaybeObject* JSObject::SetPropertyForResult(LookupResult* lookup,
|
||||
StrictModeFlag strict_mode,
|
||||
StoreFromKeyed store_mode) {
|
||||
Heap* heap = GetHeap();
|
||||
Isolate* isolate = heap->isolate();
|
||||
// Make sure that the top context does not change when doing callbacks or
|
||||
// interceptor calls.
|
||||
AssertNoContextChange ncc;
|
||||
@ -2873,7 +2877,7 @@ MaybeObject* JSObject::SetPropertyForResult(LookupResult* lookup,
|
||||
|
||||
// Check access rights if needed.
|
||||
if (IsAccessCheckNeeded()) {
|
||||
if (!heap->isolate()->MayNamedAccess(this, name_raw, v8::ACCESS_SET)) {
|
||||
if (!isolate->MayNamedAccess(this, name_raw, v8::ACCESS_SET)) {
|
||||
return SetPropertyWithFailedAccessCheck(
|
||||
lookup, name_raw, value_raw, true, strict_mode);
|
||||
}
|
||||
@ -2889,10 +2893,10 @@ MaybeObject* JSObject::SetPropertyForResult(LookupResult* lookup,
|
||||
|
||||
// From this point on everything needs to be handlified, because
|
||||
// SetPropertyViaPrototypes might call back into JavaScript.
|
||||
HandleScope scope(GetIsolate());
|
||||
HandleScope scope(isolate);
|
||||
Handle<JSObject> self(this);
|
||||
Handle<String> name(name_raw);
|
||||
Handle<Object> value(value_raw);
|
||||
Handle<Object> value(value_raw, isolate);
|
||||
|
||||
if (!lookup->IsProperty() && !self->IsJSContextExtensionObject()) {
|
||||
bool done = false;
|
||||
@ -2910,16 +2914,16 @@ MaybeObject* JSObject::SetPropertyForResult(LookupResult* lookup,
|
||||
if (lookup->IsProperty() && lookup->IsReadOnly()) {
|
||||
if (strict_mode == kStrictMode) {
|
||||
Handle<Object> args[] = { name, self };
|
||||
return heap->isolate()->Throw(*heap->isolate()->factory()->NewTypeError(
|
||||
return isolate->Throw(*isolate->factory()->NewTypeError(
|
||||
"strict_read_only_property", HandleVector(args, ARRAY_SIZE(args))));
|
||||
} else {
|
||||
return *value;
|
||||
}
|
||||
}
|
||||
|
||||
Handle<Object> old_value(heap->the_hole_value());
|
||||
Handle<Object> old_value(heap->the_hole_value(), isolate);
|
||||
if (FLAG_harmony_observation && map()->is_observed()) {
|
||||
old_value = handle(lookup->GetLazyValue());
|
||||
old_value = handle(lookup->GetLazyValue(), isolate);
|
||||
}
|
||||
|
||||
// This is a real property that is not read-only, or it is a
|
||||
@ -2997,13 +3001,13 @@ MaybeObject* JSObject::SetPropertyForResult(LookupResult* lookup,
|
||||
}
|
||||
|
||||
Handle<Object> hresult;
|
||||
if (!result->ToHandle(&hresult)) return result;
|
||||
if (!result->ToHandle(&hresult, isolate)) return result;
|
||||
|
||||
if (FLAG_harmony_observation && map()->is_observed()) {
|
||||
if (lookup->IsTransition()) {
|
||||
EnqueueChangeRecord(self, "new", name, old_value);
|
||||
} else {
|
||||
LookupResult new_lookup(self->GetIsolate());
|
||||
LookupResult new_lookup(isolate);
|
||||
self->LocalLookup(*name, &new_lookup);
|
||||
ASSERT(!new_lookup.GetLazyValue()->IsTheHole());
|
||||
if (!new_lookup.GetLazyValue()->SameValue(*old_value)) {
|
||||
@ -3076,15 +3080,15 @@ MaybeObject* JSObject::SetLocalPropertyIgnoreAttributes(
|
||||
}
|
||||
|
||||
// From this point on everything needs to be handlified.
|
||||
HandleScope scope(GetIsolate());
|
||||
HandleScope scope(isolate);
|
||||
Handle<JSObject> self(this);
|
||||
Handle<String> name(name_raw);
|
||||
Handle<Object> value(value_raw);
|
||||
Handle<Object> value(value_raw, isolate);
|
||||
|
||||
Handle<Object> old_value(isolate->heap()->the_hole_value());
|
||||
Handle<Object> old_value(isolate->heap()->the_hole_value(), isolate);
|
||||
PropertyAttributes old_attributes = ABSENT;
|
||||
if (FLAG_harmony_observation && map()->is_observed()) {
|
||||
old_value = handle(lookup.GetLazyValue());
|
||||
old_value = handle(lookup.GetLazyValue(), isolate);
|
||||
old_attributes = lookup.GetAttributes();
|
||||
}
|
||||
|
||||
@ -3146,7 +3150,7 @@ MaybeObject* JSObject::SetLocalPropertyIgnoreAttributes(
|
||||
}
|
||||
|
||||
Handle<Object> hresult;
|
||||
if (!result->ToHandle(&hresult)) return result;
|
||||
if (!result->ToHandle(&hresult, isolate)) return result;
|
||||
|
||||
if (FLAG_harmony_observation && map()->is_observed()) {
|
||||
if (lookup.IsTransition()) {
|
||||
@ -4153,7 +4157,7 @@ MaybeObject* JSObject::DeleteElement(uint32_t index, DeleteMode mode) {
|
||||
}
|
||||
|
||||
Handle<Object> hresult;
|
||||
if (!result->ToHandle(&hresult)) return result;
|
||||
if (!result->ToHandle(&hresult, isolate)) return result;
|
||||
|
||||
if (FLAG_harmony_observation && map()->is_observed()) {
|
||||
if (preexists && !self->HasLocalElement(index))
|
||||
@ -4218,7 +4222,7 @@ MaybeObject* JSObject::DeleteProperty(String* name, DeleteMode mode) {
|
||||
|
||||
Handle<Object> old_value(isolate->heap()->the_hole_value());
|
||||
if (FLAG_harmony_observation && map()->is_observed()) {
|
||||
old_value = handle(lookup.GetLazyValue());
|
||||
old_value = handle(lookup.GetLazyValue(), isolate);
|
||||
}
|
||||
MaybeObject* result;
|
||||
|
||||
@ -4240,7 +4244,7 @@ MaybeObject* JSObject::DeleteProperty(String* name, DeleteMode mode) {
|
||||
}
|
||||
|
||||
Handle<Object> hresult;
|
||||
if (!result->ToHandle(&hresult)) return result;
|
||||
if (!result->ToHandle(&hresult, isolate)) return result;
|
||||
|
||||
if (FLAG_harmony_observation && map()->is_observed()) {
|
||||
if (!self->HasLocalProperty(*hname))
|
||||
@ -4878,7 +4882,7 @@ MaybeObject* JSObject::DefineAccessor(String* name_raw,
|
||||
if (!CanSetCallback(name_raw)) return isolate->heap()->undefined_value();
|
||||
|
||||
// From this point on everything needs to be handlified.
|
||||
HandleScope scope(GetIsolate());
|
||||
HandleScope scope(isolate);
|
||||
Handle<JSObject> self(this);
|
||||
Handle<String> name(name_raw);
|
||||
Handle<Object> getter(getter_raw);
|
||||
@ -4899,7 +4903,7 @@ MaybeObject* JSObject::DefineAccessor(String* name_raw,
|
||||
LookupResult lookup(isolate);
|
||||
LocalLookup(*name, &lookup);
|
||||
preexists = lookup.IsProperty();
|
||||
if (preexists) old_value = handle(lookup.GetLazyValue());
|
||||
if (preexists) old_value = handle(lookup.GetLazyValue(), isolate);
|
||||
}
|
||||
}
|
||||
|
||||
@ -4908,7 +4912,7 @@ MaybeObject* JSObject::DefineAccessor(String* name_raw,
|
||||
self->DefinePropertyAccessor(*name, *getter, *setter, attributes);
|
||||
|
||||
Handle<Object> hresult;
|
||||
if (!result->ToHandle(&hresult)) return result;
|
||||
if (!result->ToHandle(&hresult, isolate)) return result;
|
||||
|
||||
if (FLAG_harmony_observation && map()->is_observed()) {
|
||||
const char* type = preexists ? "reconfigured" : "new";
|
||||
@ -9414,7 +9418,7 @@ MaybeObject* JSArray::SetElementsLength(Object* len) {
|
||||
MaybeObject* result =
|
||||
self->GetElementsAccessor()->SetLength(*self, *new_length_handle);
|
||||
Handle<Object> hresult;
|
||||
if (!result->ToHandle(&hresult)) return result;
|
||||
if (!result->ToHandle(&hresult, isolate)) return result;
|
||||
|
||||
CHECK(self->length()->ToArrayIndex(&new_length));
|
||||
if (old_length != new_length) {
|
||||
@ -10375,7 +10379,7 @@ MaybeObject* JSObject::SetElement(uint32_t index,
|
||||
// Don't allow element properties to be redefined for external arrays.
|
||||
if (HasExternalArrayElements() && set_mode == DEFINE_PROPERTY) {
|
||||
Handle<Object> number = isolate->factory()->NewNumberFromUint(index);
|
||||
Handle<Object> args[] = { handle(this), number };
|
||||
Handle<Object> args[] = { handle(this, isolate), number };
|
||||
Handle<Object> error = isolate->factory()->NewTypeError(
|
||||
"redef_external_array_element", HandleVector(args, ARRAY_SIZE(args)));
|
||||
return isolate->Throw(*error);
|
||||
@ -10410,7 +10414,7 @@ MaybeObject* JSObject::SetElement(uint32_t index,
|
||||
old_value = Object::GetElement(self, index);
|
||||
} else if (self->IsJSArray()) {
|
||||
// Store old array length in case adding an element grows the array.
|
||||
old_length = handle(Handle<JSArray>::cast(self)->length());
|
||||
old_length = handle(Handle<JSArray>::cast(self)->length(), isolate);
|
||||
}
|
||||
|
||||
// Check for lookup interceptor
|
||||
@ -10421,7 +10425,7 @@ MaybeObject* JSObject::SetElement(uint32_t index,
|
||||
index, *value, attributes, strict_mode, check_prototype, set_mode);
|
||||
|
||||
Handle<Object> hresult;
|
||||
if (!result->ToHandle(&hresult)) return result;
|
||||
if (!result->ToHandle(&hresult, isolate)) return result;
|
||||
|
||||
Handle<String> name = isolate->factory()->Uint32ToString(index);
|
||||
PropertyAttributes new_attributes = self->GetLocalElementAttribute(index);
|
||||
|
@ -789,9 +789,9 @@ class MaybeObject BASE_EMBEDDED {
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
inline bool ToHandle(Handle<T>* obj) {
|
||||
inline bool ToHandle(Handle<T>* obj, Isolate* isolate) {
|
||||
if (IsFailure()) return false;
|
||||
*obj = handle(T::cast(reinterpret_cast<Object*>(this)));
|
||||
*obj = handle(T::cast(reinterpret_cast<Object*>(this)), isolate);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -3203,7 +3203,8 @@ Expression* Parser::ParseUnaryExpression(bool* ok) {
|
||||
if (op == Token::NOT) {
|
||||
// Convert the literal to a boolean condition and negate it.
|
||||
bool condition = literal->ToBoolean()->IsTrue();
|
||||
Handle<Object> result(isolate()->heap()->ToBoolean(!condition));
|
||||
Handle<Object> result(isolate()->heap()->ToBoolean(!condition),
|
||||
isolate());
|
||||
return factory()->NewLiteral(result);
|
||||
} else if (literal->IsNumber()) {
|
||||
// Compute some expressions involving only number literals.
|
||||
|
@ -3153,7 +3153,7 @@ MUST_USE_RESULT static MaybeObject* StringReplaceRegExpWithEmptyString(
|
||||
// Shortcut for simple non-regexp global replacements
|
||||
if (is_global &&
|
||||
regexp->TypeTag() == JSRegExp::ATOM) {
|
||||
Handle<String> empty_string(HEAP->empty_string());
|
||||
Handle<String> empty_string = isolate->factory()->empty_string();
|
||||
if (subject->HasOnlyAsciiChars()) {
|
||||
return StringReplaceAtomRegExpWithString<SeqOneByteString>(
|
||||
isolate,
|
||||
|
@ -120,7 +120,8 @@ Handle<Code> StubCache::ComputeLoadNonexistent(Handle<String> name,
|
||||
// name specific if there are global objects involved.
|
||||
Code::Flags flags =
|
||||
Code::ComputeMonomorphicFlags(Code::LOAD_IC, Code::NONEXISTENT);
|
||||
Handle<Object> probe(receiver->map()->FindInCodeCache(*cache_name, flags));
|
||||
Handle<Object> probe(receiver->map()->FindInCodeCache(*cache_name, flags),
|
||||
isolate_);
|
||||
if (probe->IsCode()) return Handle<Code>::cast(probe);
|
||||
|
||||
LoadStubCompiler compiler(isolate_);
|
||||
@ -139,7 +140,8 @@ Handle<Code> StubCache::ComputeLoadField(Handle<String> name,
|
||||
PropertyIndex field_index) {
|
||||
ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP);
|
||||
Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, Code::FIELD);
|
||||
Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags));
|
||||
Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags),
|
||||
isolate_);
|
||||
if (probe->IsCode()) return Handle<Code>::cast(probe);
|
||||
|
||||
LoadStubCompiler compiler(isolate_);
|
||||
@ -160,7 +162,8 @@ Handle<Code> StubCache::ComputeLoadCallback(Handle<String> name,
|
||||
ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP);
|
||||
Code::Flags flags =
|
||||
Code::ComputeMonomorphicFlags(Code::LOAD_IC, Code::CALLBACKS);
|
||||
Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags));
|
||||
Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags),
|
||||
isolate_);
|
||||
if (probe->IsCode()) return Handle<Code>::cast(probe);
|
||||
|
||||
LoadStubCompiler compiler(isolate_);
|
||||
@ -180,7 +183,8 @@ Handle<Code> StubCache::ComputeLoadViaGetter(Handle<String> name,
|
||||
ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP);
|
||||
Code::Flags flags =
|
||||
Code::ComputeMonomorphicFlags(Code::LOAD_IC, Code::CALLBACKS);
|
||||
Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags));
|
||||
Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags),
|
||||
isolate_);
|
||||
if (probe->IsCode()) return Handle<Code>::cast(probe);
|
||||
|
||||
LoadStubCompiler compiler(isolate_);
|
||||
@ -200,7 +204,8 @@ Handle<Code> StubCache::ComputeLoadConstant(Handle<String> name,
|
||||
ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP);
|
||||
Code::Flags flags =
|
||||
Code::ComputeMonomorphicFlags(Code::LOAD_IC, Code::CONSTANT_FUNCTION);
|
||||
Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags));
|
||||
Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags),
|
||||
isolate_);
|
||||
if (probe->IsCode()) return Handle<Code>::cast(probe);
|
||||
|
||||
LoadStubCompiler compiler(isolate_);
|
||||
@ -219,7 +224,8 @@ Handle<Code> StubCache::ComputeLoadInterceptor(Handle<String> name,
|
||||
ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP);
|
||||
Code::Flags flags =
|
||||
Code::ComputeMonomorphicFlags(Code::LOAD_IC, Code::INTERCEPTOR);
|
||||
Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags));
|
||||
Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags),
|
||||
isolate_);
|
||||
if (probe->IsCode()) return Handle<Code>::cast(probe);
|
||||
|
||||
LoadStubCompiler compiler(isolate_);
|
||||
@ -245,7 +251,8 @@ Handle<Code> StubCache::ComputeLoadGlobal(Handle<String> name,
|
||||
ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP);
|
||||
Code::Flags flags =
|
||||
Code::ComputeMonomorphicFlags(Code::LOAD_IC, Code::NORMAL);
|
||||
Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags));
|
||||
Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags),
|
||||
isolate_);
|
||||
if (probe->IsCode()) return Handle<Code>::cast(probe);
|
||||
|
||||
LoadStubCompiler compiler(isolate_);
|
||||
@ -265,7 +272,8 @@ Handle<Code> StubCache::ComputeKeyedLoadField(Handle<String> name,
|
||||
ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP);
|
||||
Code::Flags flags =
|
||||
Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, Code::FIELD);
|
||||
Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags));
|
||||
Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags),
|
||||
isolate_);
|
||||
if (probe->IsCode()) return Handle<Code>::cast(probe);
|
||||
|
||||
KeyedLoadStubCompiler compiler(isolate_);
|
||||
@ -285,7 +293,8 @@ Handle<Code> StubCache::ComputeKeyedLoadConstant(Handle<String> name,
|
||||
ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP);
|
||||
Code::Flags flags = Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC,
|
||||
Code::CONSTANT_FUNCTION);
|
||||
Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags));
|
||||
Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags),
|
||||
isolate_);
|
||||
if (probe->IsCode()) return Handle<Code>::cast(probe);
|
||||
|
||||
KeyedLoadStubCompiler compiler(isolate_);
|
||||
@ -304,7 +313,8 @@ Handle<Code> StubCache::ComputeKeyedLoadInterceptor(Handle<String> name,
|
||||
ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP);
|
||||
Code::Flags flags =
|
||||
Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, Code::INTERCEPTOR);
|
||||
Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags));
|
||||
Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags),
|
||||
isolate_);
|
||||
if (probe->IsCode()) return Handle<Code>::cast(probe);
|
||||
|
||||
KeyedLoadStubCompiler compiler(isolate_);
|
||||
@ -324,7 +334,8 @@ Handle<Code> StubCache::ComputeKeyedLoadCallback(
|
||||
ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP);
|
||||
Code::Flags flags =
|
||||
Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, Code::CALLBACKS);
|
||||
Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags));
|
||||
Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags),
|
||||
isolate_);
|
||||
if (probe->IsCode()) return Handle<Code>::cast(probe);
|
||||
|
||||
KeyedLoadStubCompiler compiler(isolate_);
|
||||
@ -341,7 +352,8 @@ Handle<Code> StubCache::ComputeKeyedLoadArrayLength(Handle<String> name,
|
||||
Handle<JSArray> receiver) {
|
||||
Code::Flags flags =
|
||||
Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, Code::CALLBACKS);
|
||||
Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags));
|
||||
Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags),
|
||||
isolate_);
|
||||
if (probe->IsCode()) return Handle<Code>::cast(probe);
|
||||
|
||||
KeyedLoadStubCompiler compiler(isolate_);
|
||||
@ -358,7 +370,7 @@ Handle<Code> StubCache::ComputeKeyedLoadStringLength(Handle<String> name,
|
||||
Code::Flags flags =
|
||||
Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, Code::CALLBACKS);
|
||||
Handle<Map> map(receiver->map());
|
||||
Handle<Object> probe(map->FindInCodeCache(*name, flags));
|
||||
Handle<Object> probe(map->FindInCodeCache(*name, flags), isolate_);
|
||||
if (probe->IsCode()) return Handle<Code>::cast(probe);
|
||||
|
||||
KeyedLoadStubCompiler compiler(isolate_);
|
||||
@ -375,7 +387,8 @@ Handle<Code> StubCache::ComputeKeyedLoadFunctionPrototype(
|
||||
Handle<JSFunction> receiver) {
|
||||
Code::Flags flags =
|
||||
Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, Code::CALLBACKS);
|
||||
Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags));
|
||||
Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags),
|
||||
isolate_);
|
||||
if (probe->IsCode()) return Handle<Code>::cast(probe);
|
||||
|
||||
KeyedLoadStubCompiler compiler(isolate_);
|
||||
@ -396,7 +409,8 @@ Handle<Code> StubCache::ComputeStoreField(Handle<String> name,
|
||||
(transition.is_null()) ? Code::FIELD : Code::MAP_TRANSITION;
|
||||
Code::Flags flags = Code::ComputeMonomorphicFlags(
|
||||
Code::STORE_IC, type, strict_mode);
|
||||
Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags));
|
||||
Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags),
|
||||
isolate_);
|
||||
if (probe->IsCode()) return Handle<Code>::cast(probe);
|
||||
|
||||
StoreStubCompiler compiler(isolate_, strict_mode);
|
||||
@ -438,7 +452,7 @@ Handle<Code> StubCache::ComputeKeyedLoadOrStoreElement(
|
||||
UNREACHABLE();
|
||||
break;
|
||||
}
|
||||
Handle<Object> probe(receiver_map->FindInCodeCache(*name, flags));
|
||||
Handle<Object> probe(receiver_map->FindInCodeCache(*name, flags), isolate_);
|
||||
if (probe->IsCode()) return Handle<Code>::cast(probe);
|
||||
|
||||
Handle<Code> code;
|
||||
@ -490,7 +504,8 @@ Handle<Code> StubCache::ComputeStoreGlobal(Handle<String> name,
|
||||
StrictModeFlag strict_mode) {
|
||||
Code::Flags flags = Code::ComputeMonomorphicFlags(
|
||||
Code::STORE_IC, Code::NORMAL, strict_mode);
|
||||
Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags));
|
||||
Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags),
|
||||
isolate_);
|
||||
if (probe->IsCode()) return Handle<Code>::cast(probe);
|
||||
|
||||
StoreStubCompiler compiler(isolate_, strict_mode);
|
||||
@ -510,7 +525,8 @@ Handle<Code> StubCache::ComputeStoreCallback(Handle<String> name,
|
||||
ASSERT(v8::ToCData<Address>(callback->setter()) != 0);
|
||||
Code::Flags flags = Code::ComputeMonomorphicFlags(
|
||||
Code::STORE_IC, Code::CALLBACKS, strict_mode);
|
||||
Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags));
|
||||
Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags),
|
||||
isolate_);
|
||||
if (probe->IsCode()) return Handle<Code>::cast(probe);
|
||||
|
||||
StoreStubCompiler compiler(isolate_, strict_mode);
|
||||
@ -530,7 +546,8 @@ Handle<Code> StubCache::ComputeStoreViaSetter(Handle<String> name,
|
||||
StrictModeFlag strict_mode) {
|
||||
Code::Flags flags = Code::ComputeMonomorphicFlags(
|
||||
Code::STORE_IC, Code::CALLBACKS, strict_mode);
|
||||
Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags));
|
||||
Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags),
|
||||
isolate_);
|
||||
if (probe->IsCode()) return Handle<Code>::cast(probe);
|
||||
|
||||
StoreStubCompiler compiler(isolate_, strict_mode);
|
||||
@ -548,7 +565,8 @@ Handle<Code> StubCache::ComputeStoreInterceptor(Handle<String> name,
|
||||
StrictModeFlag strict_mode) {
|
||||
Code::Flags flags = Code::ComputeMonomorphicFlags(
|
||||
Code::STORE_IC, Code::INTERCEPTOR, strict_mode);
|
||||
Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags));
|
||||
Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags),
|
||||
isolate_);
|
||||
if (probe->IsCode()) return Handle<Code>::cast(probe);
|
||||
|
||||
StoreStubCompiler compiler(isolate_, strict_mode);
|
||||
@ -568,7 +586,8 @@ Handle<Code> StubCache::ComputeKeyedStoreField(Handle<String> name,
|
||||
(transition.is_null()) ? Code::FIELD : Code::MAP_TRANSITION;
|
||||
Code::Flags flags = Code::ComputeMonomorphicFlags(
|
||||
Code::KEYED_STORE_IC, type, strict_mode);
|
||||
Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags));
|
||||
Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags),
|
||||
isolate_);
|
||||
if (probe->IsCode()) return Handle<Code>::cast(probe);
|
||||
|
||||
KeyedStoreStubCompiler compiler(isolate(), strict_mode,
|
||||
@ -610,7 +629,8 @@ Handle<Code> StubCache::ComputeCallConstant(int argc,
|
||||
Code::Flags flags =
|
||||
Code::ComputeMonomorphicFlags(kind, Code::CONSTANT_FUNCTION, extra_state,
|
||||
cache_holder, argc);
|
||||
Handle<Object> probe(map_holder->map()->FindInCodeCache(*name, flags));
|
||||
Handle<Object> probe(map_holder->map()->FindInCodeCache(*name, flags),
|
||||
isolate_);
|
||||
if (probe->IsCode()) return Handle<Code>::cast(probe);
|
||||
|
||||
CallStubCompiler compiler(isolate_, argc, kind, extra_state, cache_holder);
|
||||
@ -648,7 +668,8 @@ Handle<Code> StubCache::ComputeCallField(int argc,
|
||||
Code::Flags flags =
|
||||
Code::ComputeMonomorphicFlags(kind, Code::FIELD, extra_state,
|
||||
cache_holder, argc);
|
||||
Handle<Object> probe(map_holder->map()->FindInCodeCache(*name, flags));
|
||||
Handle<Object> probe(map_holder->map()->FindInCodeCache(*name, flags),
|
||||
isolate_);
|
||||
if (probe->IsCode()) return Handle<Code>::cast(probe);
|
||||
|
||||
CallStubCompiler compiler(isolate_, argc, kind, extra_state, cache_holder);
|
||||
@ -685,7 +706,8 @@ Handle<Code> StubCache::ComputeCallInterceptor(int argc,
|
||||
Code::Flags flags =
|
||||
Code::ComputeMonomorphicFlags(kind, Code::INTERCEPTOR, extra_state,
|
||||
cache_holder, argc);
|
||||
Handle<Object> probe(map_holder->map()->FindInCodeCache(*name, flags));
|
||||
Handle<Object> probe(map_holder->map()->FindInCodeCache(*name, flags),
|
||||
isolate_);
|
||||
if (probe->IsCode()) return Handle<Code>::cast(probe);
|
||||
|
||||
CallStubCompiler compiler(isolate(), argc, kind, extra_state, cache_holder);
|
||||
@ -715,7 +737,8 @@ Handle<Code> StubCache::ComputeCallGlobal(int argc,
|
||||
Code::Flags flags =
|
||||
Code::ComputeMonomorphicFlags(kind, Code::NORMAL, extra_state,
|
||||
cache_holder, argc);
|
||||
Handle<Object> probe(map_holder->map()->FindInCodeCache(*name, flags));
|
||||
Handle<Object> probe(map_holder->map()->FindInCodeCache(*name, flags),
|
||||
isolate_);
|
||||
if (probe->IsCode()) return Handle<Code>::cast(probe);
|
||||
|
||||
CallStubCompiler compiler(isolate(), argc, kind, extra_state, cache_holder);
|
||||
|
@ -79,7 +79,7 @@ static uint32_t IdToKey(TypeFeedbackId ast_id) {
|
||||
Handle<Object> TypeFeedbackOracle::GetInfo(TypeFeedbackId ast_id) {
|
||||
int entry = dictionary_->FindEntry(IdToKey(ast_id));
|
||||
return entry != UnseededNumberDictionary::kNotFound
|
||||
? Handle<Object>(dictionary_->ValueAt(entry))
|
||||
? Handle<Object>(dictionary_->ValueAt(entry), isolate_)
|
||||
: Handle<Object>::cast(isolate_->factory()->undefined_value());
|
||||
}
|
||||
|
||||
|
@ -130,8 +130,8 @@ class Variable: public ZoneObject {
|
||||
bool is_arguments() const { return kind_ == ARGUMENTS; }
|
||||
|
||||
// True if the variable is named eval and not known to be shadowed.
|
||||
bool is_possibly_eval() const {
|
||||
return IsVariable(FACTORY->eval_symbol());
|
||||
bool is_possibly_eval(Isolate* isolate) const {
|
||||
return IsVariable(isolate->factory()->eval_symbol());
|
||||
}
|
||||
|
||||
Variable* local_if_not_shadowed() const {
|
||||
|
@ -119,7 +119,7 @@ void FullCodeGenerator::Generate() {
|
||||
handler_table_ =
|
||||
isolate()->factory()->NewFixedArray(function()->handler_count(), TENURED);
|
||||
profiling_counter_ = isolate()->factory()->NewJSGlobalPropertyCell(
|
||||
Handle<Smi>(Smi::FromInt(FLAG_interrupt_budget)));
|
||||
Handle<Smi>(Smi::FromInt(FLAG_interrupt_budget), isolate()));
|
||||
SetFunctionPosition(function());
|
||||
Comment cmnt(masm_, "[ function compiled by full code generator");
|
||||
|
||||
@ -2304,7 +2304,7 @@ void FullCodeGenerator::VisitCall(Call* expr) {
|
||||
VariableProxy* proxy = callee->AsVariableProxy();
|
||||
Property* property = callee->AsProperty();
|
||||
|
||||
if (proxy != NULL && proxy->var()->is_possibly_eval()) {
|
||||
if (proxy != NULL && proxy->var()->is_possibly_eval(isolate())) {
|
||||
// In a call to eval, we first call %ResolvePossiblyDirectEval to
|
||||
// resolve the function we need to call and the receiver of the call.
|
||||
// Then we call the resolved function using the given arguments.
|
||||
|
Loading…
Reference in New Issue
Block a user