diff options
Diffstat (limited to 'deps/v8/src/ic/x87/handler-compiler-x87.cc')
-rw-r--r-- | deps/v8/src/ic/x87/handler-compiler-x87.cc | 76 |
1 files changed, 38 insertions, 38 deletions
diff --git a/deps/v8/src/ic/x87/handler-compiler-x87.cc b/deps/v8/src/ic/x87/handler-compiler-x87.cc index cc43ed298d..1b25f06347 100644 --- a/deps/v8/src/ic/x87/handler-compiler-x87.cc +++ b/deps/v8/src/ic/x87/handler-compiler-x87.cc @@ -4,8 +4,10 @@ #if V8_TARGET_ARCH_X87 -#include "src/ic/call-optimization.h" #include "src/ic/handler-compiler.h" + +#include "src/field-type.h" +#include "src/ic/call-optimization.h" #include "src/ic/ic.h" #include "src/isolate-inl.h" @@ -197,9 +199,13 @@ void PropertyHandlerCompiler::GenerateApiAccessorCall( call_data_undefined = true; __ mov(data, Immediate(isolate->factory()->undefined_value())); } else { - __ mov(data, FieldOperand(callee, JSFunction::kSharedFunctionInfoOffset)); - __ mov(data, FieldOperand(data, SharedFunctionInfo::kFunctionDataOffset)); - __ mov(data, FieldOperand(data, FunctionTemplateInfo::kCallCodeOffset)); + if (optimization.is_constant_call()) { + __ mov(data, FieldOperand(callee, JSFunction::kSharedFunctionInfoOffset)); + __ mov(data, FieldOperand(data, SharedFunctionInfo::kFunctionDataOffset)); + __ mov(data, FieldOperand(data, FunctionTemplateInfo::kCallCodeOffset)); + } else { + __ mov(data, FieldOperand(callee, FunctionTemplateInfo::kCallCodeOffset)); + } __ mov(data, FieldOperand(data, CallHandlerInfo::kDataOffset)); } @@ -214,7 +220,8 @@ void PropertyHandlerCompiler::GenerateApiAccessorCall( __ mov(api_function_address, Immediate(function_address)); // Jump to stub. - CallApiAccessorStub stub(isolate, is_store, call_data_undefined); + CallApiAccessorStub stub(isolate, is_store, call_data_undefined, + !optimization.is_constant_call()); __ TailCallStub(&stub); } @@ -399,8 +406,7 @@ void NamedStoreHandlerCompiler::GenerateConstantCheck(Register map_reg, __ j(not_equal, miss_label); } - -void NamedStoreHandlerCompiler::GenerateFieldTypeChecks(HeapType* field_type, +void NamedStoreHandlerCompiler::GenerateFieldTypeChecks(FieldType* field_type, Register value_reg, Label* miss_label) { Register map_reg = scratch1(); @@ -408,20 +414,11 @@ void NamedStoreHandlerCompiler::GenerateFieldTypeChecks(HeapType* field_type, DCHECK(!value_reg.is(map_reg)); DCHECK(!value_reg.is(scratch)); __ JumpIfSmi(value_reg, miss_label); - HeapType::Iterator<Map> it = field_type->Classes(); - if (!it.Done()) { - Label do_store; + if (field_type->IsClass()) { __ mov(map_reg, FieldOperand(value_reg, HeapObject::kMapOffset)); - while (true) { - __ CmpWeakValue(map_reg, Map::WeakCellForMap(it.Current()), scratch); - it.Advance(); - if (it.Done()) { - __ j(not_equal, miss_label); - break; - } - __ j(equal, &do_store, Label::kNear); - } - __ bind(&do_store); + __ CmpWeakValue(map_reg, Map::WeakCellForMap(field_type->AsClass()), + scratch); + __ j(not_equal, miss_label); } } @@ -593,24 +590,30 @@ void NamedStoreHandlerCompiler::FrontendFooter(Handle<Name> name, Label* miss) { void NamedLoadHandlerCompiler::GenerateLoadCallback( - Register reg, Handle<ExecutableAccessorInfo> callback) { + Register reg, Handle<AccessorInfo> callback) { + DCHECK(!AreAliased(scratch2(), scratch3(), receiver())); + DCHECK(!AreAliased(scratch2(), scratch3(), reg)); + // Insert additional parameters into the stack frame above return address. - DCHECK(!scratch3().is(reg)); __ pop(scratch3()); // Get return address to place it below. - STATIC_ASSERT(PropertyCallbackArguments::kHolderIndex == 0); - STATIC_ASSERT(PropertyCallbackArguments::kIsolateIndex == 1); - STATIC_ASSERT(PropertyCallbackArguments::kReturnValueDefaultValueIndex == 2); - STATIC_ASSERT(PropertyCallbackArguments::kReturnValueOffset == 3); - STATIC_ASSERT(PropertyCallbackArguments::kDataIndex == 4); - STATIC_ASSERT(PropertyCallbackArguments::kThisIndex == 5); + // Build v8::PropertyCallbackInfo::args_ array on the stack and push property + // name below the exit frame to make GC aware of them. + STATIC_ASSERT(PropertyCallbackArguments::kShouldThrowOnErrorIndex == 0); + STATIC_ASSERT(PropertyCallbackArguments::kHolderIndex == 1); + STATIC_ASSERT(PropertyCallbackArguments::kIsolateIndex == 2); + STATIC_ASSERT(PropertyCallbackArguments::kReturnValueDefaultValueIndex == 3); + STATIC_ASSERT(PropertyCallbackArguments::kReturnValueOffset == 4); + STATIC_ASSERT(PropertyCallbackArguments::kDataIndex == 5); + STATIC_ASSERT(PropertyCallbackArguments::kThisIndex == 6); + STATIC_ASSERT(PropertyCallbackArguments::kArgsLength == 7); + __ push(receiver()); // receiver - // Push data from ExecutableAccessorInfo. + // Push data from AccessorInfo. Handle<Object> data(callback->data(), isolate()); if (data->IsUndefined() || data->IsSmi()) { __ push(Immediate(data)); } else { - DCHECK(!scratch2().is(reg)); Handle<WeakCell> cell = isolate()->factory()->NewWeakCell(Handle<HeapObject>::cast(data)); // The callback is alive if this instruction is executed, @@ -623,13 +626,9 @@ void NamedLoadHandlerCompiler::GenerateLoadCallback( __ push(Immediate(isolate()->factory()->undefined_value())); __ push(Immediate(reinterpret_cast<int>(isolate()))); __ push(reg); // holder - - // Save a pointer to where we pushed the arguments. This will be - // passed as the const PropertyAccessorInfo& to the C++ callback. - __ push(esp); + __ push(Immediate(Smi::FromInt(0))); // should_throw_on_error -> false __ push(name()); // name - __ push(scratch3()); // Restore return address. // Abi for CallApiGetter @@ -731,8 +730,8 @@ void NamedLoadHandlerCompiler::GenerateLoadInterceptor(Register holder_reg) { Handle<Code> NamedStoreHandlerCompiler::CompileStoreCallback( - Handle<JSObject> object, Handle<Name> name, - Handle<ExecutableAccessorInfo> callback) { + Handle<JSObject> object, Handle<Name> name, Handle<AccessorInfo> callback, + LanguageMode language_mode) { Register holder_reg = Frontend(name); __ pop(scratch1()); // remove the return address @@ -748,6 +747,7 @@ Handle<Code> NamedStoreHandlerCompiler::CompileStoreCallback( } __ Push(name); __ push(value()); + __ push(Immediate(Smi::FromInt(language_mode))); __ push(scratch1()); // restore return address // Do tail-call to the runtime system. @@ -802,7 +802,7 @@ Handle<Code> NamedLoadHandlerCompiler::CompileLoadGlobal( } Counters* counters = isolate()->counters(); - __ IncrementCounter(counters->named_load_global_stub(), 1); + __ IncrementCounter(counters->ic_named_load_global_stub(), 1); // The code above already loads the result into the return register. if (IC::ICUseVector(kind())) { DiscardVectorAndSlot(); |