| Index: src/ia32/stub-cache-ia32.cc
|
| ===================================================================
|
| --- src/ia32/stub-cache-ia32.cc (revision 7267)
|
| +++ src/ia32/stub-cache-ia32.cc (working copy)
|
| @@ -39,14 +39,15 @@
|
| #define __ ACCESS_MASM(masm)
|
|
|
|
|
| -static void ProbeTable(MacroAssembler* masm,
|
| +static void ProbeTable(Isolate* isolate,
|
| + MacroAssembler* masm,
|
| Code::Flags flags,
|
| StubCache::Table table,
|
| Register name,
|
| Register offset,
|
| Register extra) {
|
| - ExternalReference key_offset(SCTableReference::keyReference(table));
|
| - ExternalReference value_offset(SCTableReference::valueReference(table));
|
| + ExternalReference key_offset(isolate->stub_cache()->key_reference(table));
|
| + ExternalReference value_offset(isolate->stub_cache()->value_reference(table));
|
|
|
| Label miss;
|
|
|
| @@ -113,8 +114,8 @@
|
| Register r0,
|
| Register r1) {
|
| ASSERT(name->IsSymbol());
|
| - __ IncrementCounter(&Counters::negative_lookups, 1);
|
| - __ IncrementCounter(&Counters::negative_lookups_miss, 1);
|
| + __ IncrementCounter(COUNTERS->negative_lookups(), 1);
|
| + __ IncrementCounter(COUNTERS->negative_lookups_miss(), 1);
|
|
|
| Label done;
|
| __ mov(r0, FieldOperand(receiver, HeapObject::kMapOffset));
|
| @@ -137,7 +138,7 @@
|
|
|
| // Check that the properties array is a dictionary.
|
| __ cmp(FieldOperand(properties, HeapObject::kMapOffset),
|
| - Immediate(Factory::hash_table_map()));
|
| + Immediate(FACTORY->hash_table_map()));
|
| __ j(not_equal, miss_label);
|
|
|
| // Compute the capacity mask.
|
| @@ -177,7 +178,7 @@
|
| ASSERT_EQ(kSmiTagSize, 1);
|
| __ mov(entity_name, Operand(properties, index, times_half_pointer_size,
|
| kElementsStartOffset - kHeapObjectTag));
|
| - __ cmp(entity_name, Factory::undefined_value());
|
| + __ cmp(entity_name, FACTORY->undefined_value());
|
| if (i != kProbes - 1) {
|
| __ j(equal, &done, taken);
|
|
|
| @@ -197,7 +198,7 @@
|
| }
|
|
|
| __ bind(&done);
|
| - __ DecrementCounter(&Counters::negative_lookups_miss, 1);
|
| + __ DecrementCounter(COUNTERS->negative_lookups_miss(), 1);
|
| }
|
|
|
|
|
| @@ -208,6 +209,7 @@
|
| Register scratch,
|
| Register extra,
|
| Register extra2) {
|
| + Isolate* isolate = Isolate::Current();
|
| Label miss;
|
| USE(extra2); // The register extra2 is not used on the ia32 platform.
|
|
|
| @@ -240,7 +242,7 @@
|
| __ and_(scratch, (kPrimaryTableSize - 1) << kHeapObjectTagSize);
|
|
|
| // Probe the primary table.
|
| - ProbeTable(masm, flags, kPrimary, name, scratch, extra);
|
| + ProbeTable(isolate, masm, flags, kPrimary, name, scratch, extra);
|
|
|
| // Primary miss: Compute hash for secondary probe.
|
| __ mov(scratch, FieldOperand(name, String::kHashFieldOffset));
|
| @@ -252,7 +254,7 @@
|
| __ and_(scratch, (kSecondaryTableSize - 1) << kHeapObjectTagSize);
|
|
|
| // Probe the secondary table.
|
| - ProbeTable(masm, flags, kSecondary, name, scratch, extra);
|
| + ProbeTable(isolate, masm, flags, kSecondary, name, scratch, extra);
|
|
|
| // Cache miss: Fall-through and let caller handle the miss by
|
| // entering the runtime system.
|
| @@ -274,10 +276,11 @@
|
| MacroAssembler* masm, int index, Register prototype, Label* miss) {
|
| // Check we're still in the same context.
|
| __ cmp(Operand(esi, Context::SlotOffset(Context::GLOBAL_INDEX)),
|
| - Top::global());
|
| + Isolate::Current()->global());
|
| __ j(not_equal, miss);
|
| // Get the global function with the given index.
|
| - JSFunction* function = JSFunction::cast(Top::global_context()->get(index));
|
| + JSFunction* function = JSFunction::cast(
|
| + Isolate::Current()->global_context()->get(index));
|
| // Load its initial map. The global functions all have initial maps.
|
| __ Set(prototype, Immediate(Handle<Map>(function->initial_map())));
|
| // Load the prototype from the initial map.
|
| @@ -395,7 +398,7 @@
|
| JSObject* holder_obj) {
|
| __ push(name);
|
| InterceptorInfo* interceptor = holder_obj->GetNamedInterceptor();
|
| - ASSERT(!Heap::InNewSpace(interceptor));
|
| + ASSERT(!HEAP->InNewSpace(interceptor));
|
| Register scratch = name;
|
| __ mov(scratch, Immediate(Handle<Object>(interceptor)));
|
| __ push(scratch);
|
| @@ -480,7 +483,7 @@
|
| __ mov(Operand(esp, 2 * kPointerSize), edi);
|
| Object* call_data = optimization.api_call_info()->data();
|
| Handle<CallHandlerInfo> api_call_info_handle(optimization.api_call_info());
|
| - if (Heap::InNewSpace(call_data)) {
|
| + if (HEAP->InNewSpace(call_data)) {
|
| __ mov(ecx, api_call_info_handle);
|
| __ mov(ebx, FieldOperand(ecx, CallHandlerInfo::kDataOffset));
|
| __ mov(Operand(esp, 3 * kPointerSize), ebx);
|
| @@ -574,7 +577,7 @@
|
| name,
|
| holder,
|
| miss);
|
| - return Heap::undefined_value(); // Success.
|
| + return HEAP->undefined_value(); // Success.
|
| }
|
| }
|
|
|
| @@ -610,10 +613,10 @@
|
| (depth2 != kInvalidProtoDepth);
|
| }
|
|
|
| - __ IncrementCounter(&Counters::call_const_interceptor, 1);
|
| + __ IncrementCounter(COUNTERS->call_const_interceptor(), 1);
|
|
|
| if (can_do_fast_api_call) {
|
| - __ IncrementCounter(&Counters::call_const_interceptor_fast_api, 1);
|
| + __ IncrementCounter(COUNTERS->call_const_interceptor_fast_api(), 1);
|
| ReserveSpaceForFastApiCall(masm, scratch1);
|
| }
|
|
|
| @@ -672,7 +675,7 @@
|
| FreeSpaceForFastApiCall(masm, scratch1);
|
| }
|
|
|
| - return Heap::undefined_value(); // Success.
|
| + return HEAP->undefined_value(); // Success.
|
| }
|
|
|
| void CompileRegular(MacroAssembler* masm,
|
| @@ -728,7 +731,7 @@
|
| __ pop(receiver); // Restore the holder.
|
| __ LeaveInternalFrame();
|
|
|
| - __ cmp(eax, Factory::no_interceptor_result_sentinel());
|
| + __ cmp(eax, FACTORY->no_interceptor_result_sentinel());
|
| __ j(not_equal, interceptor_succeeded);
|
| }
|
|
|
| @@ -742,9 +745,9 @@
|
| ASSERT(kind == Code::LOAD_IC || kind == Code::KEYED_LOAD_IC);
|
| Code* code = NULL;
|
| if (kind == Code::LOAD_IC) {
|
| - code = Builtins::builtin(Builtins::LoadIC_Miss);
|
| + code = Isolate::Current()->builtins()->builtin(Builtins::LoadIC_Miss);
|
| } else {
|
| - code = Builtins::builtin(Builtins::KeyedLoadIC_Miss);
|
| + code = Isolate::Current()->builtins()->builtin(Builtins::KeyedLoadIC_Miss);
|
| }
|
|
|
| Handle<Code> ic(code);
|
| @@ -851,10 +854,10 @@
|
| if (Serializer::enabled()) {
|
| __ mov(scratch, Immediate(Handle<Object>(cell)));
|
| __ cmp(FieldOperand(scratch, JSGlobalPropertyCell::kValueOffset),
|
| - Immediate(Factory::the_hole_value()));
|
| + Immediate(FACTORY->the_hole_value()));
|
| } else {
|
| __ cmp(Operand::Cell(Handle<JSGlobalPropertyCell>(cell)),
|
| - Immediate(Factory::the_hole_value()));
|
| + Immediate(FACTORY->the_hole_value()));
|
| }
|
| __ j(not_equal, miss, not_taken);
|
| return cell;
|
| @@ -930,7 +933,7 @@
|
| !current->IsJSGlobalObject() &&
|
| !current->IsJSGlobalProxy()) {
|
| if (!name->IsSymbol()) {
|
| - MaybeObject* maybe_lookup_result = Heap::LookupSymbol(name);
|
| + MaybeObject* maybe_lookup_result = HEAP->LookupSymbol(name);
|
| Object* lookup_result = NULL; // Initialization to please compiler.
|
| if (!maybe_lookup_result->ToObject(&lookup_result)) {
|
| set_failure(Failure::cast(maybe_lookup_result));
|
| @@ -950,7 +953,7 @@
|
| __ mov(scratch1, FieldOperand(reg, HeapObject::kMapOffset));
|
| reg = holder_reg; // from now the object is in holder_reg
|
| __ mov(reg, FieldOperand(scratch1, Map::kPrototypeOffset));
|
| - } else if (Heap::InNewSpace(prototype)) {
|
| + } else if (HEAP->InNewSpace(prototype)) {
|
| // Get the map of the current object.
|
| __ mov(scratch1, FieldOperand(reg, HeapObject::kMapOffset));
|
| __ cmp(Operand(scratch1), Immediate(Handle<Map>(current->map())));
|
| @@ -997,7 +1000,7 @@
|
| ASSERT(current == holder);
|
|
|
| // Log the check depth.
|
| - LOG(IntEvent("check-maps-depth", depth + 1));
|
| + LOG(isolate(), IntEvent("check-maps-depth", depth + 1));
|
|
|
| // Check the holder map.
|
| __ cmp(FieldOperand(reg, HeapObject::kMapOffset),
|
| @@ -1080,7 +1083,7 @@
|
| ASSERT(!scratch2.is(reg));
|
| __ push(reg); // holder
|
| // Push data from AccessorInfo.
|
| - if (Heap::InNewSpace(callback_handle->data())) {
|
| + if (HEAP->InNewSpace(callback_handle->data())) {
|
| __ mov(scratch1, Immediate(callback_handle));
|
| __ push(FieldOperand(scratch1, AccessorInfo::kDataOffset));
|
| } else {
|
| @@ -1204,7 +1207,7 @@
|
| // Check if interceptor provided a value for property. If it's
|
| // the case, return immediately.
|
| Label interceptor_failed;
|
| - __ cmp(eax, Factory::no_interceptor_result_sentinel());
|
| + __ cmp(eax, FACTORY->no_interceptor_result_sentinel());
|
| __ j(equal, &interceptor_failed);
|
| __ LeaveInternalFrame();
|
| __ ret(0);
|
| @@ -1325,7 +1328,7 @@
|
| }
|
|
|
| // Check that the cell contains the same function.
|
| - if (Heap::InNewSpace(function)) {
|
| + if (HEAP->InNewSpace(function)) {
|
| // We can't embed a pointer to a function in new space so we have
|
| // to verify that the shared function info is unchanged. This has
|
| // the nice side effect that multiple closures based on the same
|
| @@ -1348,8 +1351,9 @@
|
|
|
|
|
| MaybeObject* CallStubCompiler::GenerateMissBranch() {
|
| - MaybeObject* maybe_obj = StubCache::ComputeCallMiss(arguments().immediate(),
|
| - kind_);
|
| + MaybeObject* maybe_obj =
|
| + Isolate::Current()->stub_cache()->ComputeCallMiss(
|
| + arguments().immediate(), kind_);
|
| Object* obj;
|
| if (!maybe_obj->ToObject(&obj)) return maybe_obj;
|
| __ jmp(Handle<Code>(Code::cast(obj)), RelocInfo::CODE_TARGET);
|
| @@ -1429,7 +1433,7 @@
|
| // -----------------------------------
|
|
|
| // If object is not an array, bail out to regular call.
|
| - if (!object->IsJSArray() || cell != NULL) return Heap::undefined_value();
|
| + if (!object->IsJSArray() || cell != NULL) return HEAP->undefined_value();
|
|
|
| Label miss;
|
|
|
| @@ -1459,7 +1463,7 @@
|
|
|
| // Check that the elements are in fast mode and writable.
|
| __ cmp(FieldOperand(ebx, HeapObject::kMapOffset),
|
| - Immediate(Factory::fixed_array_map()));
|
| + Immediate(FACTORY->fixed_array_map()));
|
| __ j(not_equal, &call_builtin);
|
|
|
| if (argc == 1) { // Otherwise fall through to call builtin.
|
| @@ -1535,7 +1539,7 @@
|
| // ... and fill the rest with holes.
|
| for (int i = 1; i < kAllocationDelta; i++) {
|
| __ mov(Operand(edx, i * kPointerSize),
|
| - Immediate(Factory::the_hole_value()));
|
| + Immediate(FACTORY->the_hole_value()));
|
| }
|
|
|
| // Restore receiver to edx as finish sequence assumes it's here.
|
| @@ -1581,7 +1585,7 @@
|
| // -----------------------------------
|
|
|
| // If object is not an array, bail out to regular call.
|
| - if (!object->IsJSArray() || cell != NULL) return Heap::undefined_value();
|
| + if (!object->IsJSArray() || cell != NULL) return HEAP->undefined_value();
|
|
|
| Label miss, return_undefined, call_builtin;
|
|
|
| @@ -1603,7 +1607,7 @@
|
|
|
| // Check that the elements are in fast mode and writable.
|
| __ cmp(FieldOperand(ebx, HeapObject::kMapOffset),
|
| - Immediate(Factory::fixed_array_map()));
|
| + Immediate(FACTORY->fixed_array_map()));
|
| __ j(not_equal, &call_builtin);
|
|
|
| // Get the array's length into ecx and calculate new length.
|
| @@ -1617,7 +1621,7 @@
|
| __ mov(eax, FieldOperand(ebx,
|
| ecx, times_half_pointer_size,
|
| FixedArray::kHeaderSize));
|
| - __ cmp(Operand(eax), Immediate(Factory::the_hole_value()));
|
| + __ cmp(Operand(eax), Immediate(FACTORY->the_hole_value()));
|
| __ j(equal, &call_builtin);
|
|
|
| // Set the array's length.
|
| @@ -1627,11 +1631,11 @@
|
| __ mov(FieldOperand(ebx,
|
| ecx, times_half_pointer_size,
|
| FixedArray::kHeaderSize),
|
| - Immediate(Factory::the_hole_value()));
|
| + Immediate(FACTORY->the_hole_value()));
|
| __ ret((argc + 1) * kPointerSize);
|
|
|
| __ bind(&return_undefined);
|
| - __ mov(eax, Immediate(Factory::undefined_value()));
|
| + __ mov(eax, Immediate(FACTORY->undefined_value()));
|
| __ ret((argc + 1) * kPointerSize);
|
|
|
| __ bind(&call_builtin);
|
| @@ -1665,7 +1669,7 @@
|
| // -----------------------------------
|
|
|
| // If object is not a string, bail out to regular call.
|
| - if (!object->IsString() || cell != NULL) return Heap::undefined_value();
|
| + if (!object->IsString() || cell != NULL) return HEAP->undefined_value();
|
|
|
| const int argc = arguments().immediate();
|
|
|
| @@ -1697,7 +1701,7 @@
|
| if (argc > 0) {
|
| __ mov(index, Operand(esp, (argc - 0) * kPointerSize));
|
| } else {
|
| - __ Set(index, Immediate(Factory::undefined_value()));
|
| + __ Set(index, Immediate(FACTORY->undefined_value()));
|
| }
|
|
|
| StringCharCodeAtGenerator char_code_at_generator(receiver,
|
| @@ -1716,7 +1720,7 @@
|
|
|
| if (index_out_of_range.is_linked()) {
|
| __ bind(&index_out_of_range);
|
| - __ Set(eax, Immediate(Factory::nan_value()));
|
| + __ Set(eax, Immediate(FACTORY->nan_value()));
|
| __ ret((argc + 1) * kPointerSize);
|
| }
|
|
|
| @@ -1749,7 +1753,7 @@
|
| // -----------------------------------
|
|
|
| // If object is not a string, bail out to regular call.
|
| - if (!object->IsString() || cell != NULL) return Heap::undefined_value();
|
| + if (!object->IsString() || cell != NULL) return HEAP->undefined_value();
|
|
|
| const int argc = arguments().immediate();
|
|
|
| @@ -1782,7 +1786,7 @@
|
| if (argc > 0) {
|
| __ mov(index, Operand(esp, (argc - 0) * kPointerSize));
|
| } else {
|
| - __ Set(index, Immediate(Factory::undefined_value()));
|
| + __ Set(index, Immediate(FACTORY->undefined_value()));
|
| }
|
|
|
| StringCharAtGenerator char_at_generator(receiver,
|
| @@ -1802,7 +1806,7 @@
|
|
|
| if (index_out_of_range.is_linked()) {
|
| __ bind(&index_out_of_range);
|
| - __ Set(eax, Immediate(Factory::empty_string()));
|
| + __ Set(eax, Immediate(FACTORY->empty_string()));
|
| __ ret((argc + 1) * kPointerSize);
|
| }
|
|
|
| @@ -1838,7 +1842,7 @@
|
|
|
| // If the object is not a JSObject or we got an unexpected number of
|
| // arguments, bail out to the regular call.
|
| - if (!object->IsJSObject() || argc != 1) return Heap::undefined_value();
|
| + if (!object->IsJSObject() || argc != 1) return HEAP->undefined_value();
|
|
|
| Label miss;
|
| GenerateNameCheck(name, &miss);
|
| @@ -1908,14 +1912,15 @@
|
| // -- esp[(argc + 1) * 4] : receiver
|
| // -----------------------------------
|
|
|
| - if (!CpuFeatures::IsSupported(SSE2)) return Heap::undefined_value();
|
| + if (!Isolate::Current()->cpu_features()->IsSupported(SSE2))
|
| + return HEAP->undefined_value();
|
| CpuFeatures::Scope use_sse2(SSE2);
|
|
|
| const int argc = arguments().immediate();
|
|
|
| // If the object is not a JSObject or we got an unexpected number of
|
| // arguments, bail out to the regular call.
|
| - if (!object->IsJSObject() || argc != 1) return Heap::undefined_value();
|
| + if (!object->IsJSObject() || argc != 1) return HEAP->undefined_value();
|
|
|
| Label miss;
|
| GenerateNameCheck(name, &miss);
|
| @@ -1946,7 +1951,7 @@
|
|
|
| // Check if the argument is a heap number and load its value into xmm0.
|
| Label slow;
|
| - __ CheckMap(eax, Factory::heap_number_map(), &slow, true);
|
| + __ CheckMap(eax, FACTORY->heap_number_map(), &slow, true);
|
| __ movdbl(xmm0, FieldOperand(eax, HeapNumber::kValueOffset));
|
|
|
| // Check if the argument is strictly positive. Note this also
|
| @@ -2039,7 +2044,7 @@
|
|
|
| // If the object is not a JSObject or we got an unexpected number of
|
| // arguments, bail out to the regular call.
|
| - if (!object->IsJSObject() || argc != 1) return Heap::undefined_value();
|
| + if (!object->IsJSObject() || argc != 1) return HEAP->undefined_value();
|
|
|
| Label miss;
|
| GenerateNameCheck(name, &miss);
|
| @@ -2090,7 +2095,7 @@
|
| // Check if the argument is a heap number and load its exponent and
|
| // sign into ebx.
|
| __ bind(¬_smi);
|
| - __ CheckMap(eax, Factory::heap_number_map(), &slow, true);
|
| + __ CheckMap(eax, FACTORY->heap_number_map(), &slow, true);
|
| __ mov(ebx, FieldOperand(eax, HeapNumber::kExponentOffset));
|
|
|
| // Check the sign of the argument. If the argument is positive,
|
| @@ -2137,11 +2142,11 @@
|
| ASSERT(optimization.is_simple_api_call());
|
| // Bail out if object is a global object as we don't want to
|
| // repatch it to global receiver.
|
| - if (object->IsGlobalObject()) return Heap::undefined_value();
|
| - if (cell != NULL) return Heap::undefined_value();
|
| + if (object->IsGlobalObject()) return HEAP->undefined_value();
|
| + if (cell != NULL) return HEAP->undefined_value();
|
| int depth = optimization.GetPrototypeDepthOfExpectedType(
|
| JSObject::cast(object), holder);
|
| - if (depth == kInvalidProtoDepth) return Heap::undefined_value();
|
| + if (depth == kInvalidProtoDepth) return HEAP->undefined_value();
|
|
|
| Label miss, miss_before_stack_reserved;
|
|
|
| @@ -2155,8 +2160,8 @@
|
| __ test(edx, Immediate(kSmiTagMask));
|
| __ j(zero, &miss_before_stack_reserved, not_taken);
|
|
|
| - __ IncrementCounter(&Counters::call_const, 1);
|
| - __ IncrementCounter(&Counters::call_const_fast_api, 1);
|
| + __ IncrementCounter(COUNTERS->call_const(), 1);
|
| + __ IncrementCounter(COUNTERS->call_const_fast_api(), 1);
|
|
|
| // Allocate space for v8::Arguments implicit values. Must be initialized
|
| // before calling any runtime function.
|
| @@ -2232,7 +2237,7 @@
|
| SharedFunctionInfo* function_info = function->shared();
|
| switch (check) {
|
| case RECEIVER_MAP_CHECK:
|
| - __ IncrementCounter(&Counters::call_const, 1);
|
| + __ IncrementCounter(COUNTERS->call_const(), 1);
|
|
|
| // Check that the maps haven't changed.
|
| CheckPrototypes(JSObject::cast(object), edx, holder,
|
| @@ -2293,9 +2298,9 @@
|
| } else {
|
| Label fast;
|
| // Check that the object is a boolean.
|
| - __ cmp(edx, Factory::true_value());
|
| + __ cmp(edx, FACTORY->true_value());
|
| __ j(equal, &fast, taken);
|
| - __ cmp(edx, Factory::false_value());
|
| + __ cmp(edx, FACTORY->false_value());
|
| __ j(not_equal, &miss, not_taken);
|
| __ bind(&fast);
|
| // Check that the maps starting from the prototype haven't changed.
|
| @@ -2436,7 +2441,7 @@
|
| __ mov(esi, FieldOperand(edi, JSFunction::kContextOffset));
|
|
|
| // Jump to the cached code (tail call).
|
| - __ IncrementCounter(&Counters::call_global_inline, 1);
|
| + __ IncrementCounter(COUNTERS->call_global_inline(), 1);
|
| ASSERT(function->is_compiled());
|
| ParameterCount expected(function->shared()->formal_parameter_count());
|
| if (V8::UseCrankshaft()) {
|
| @@ -2453,7 +2458,7 @@
|
|
|
| // Handle call cache miss.
|
| __ bind(&miss);
|
| - __ IncrementCounter(&Counters::call_global_inline_miss, 1);
|
| + __ IncrementCounter(COUNTERS->call_global_inline_miss(), 1);
|
| Object* obj;
|
| { MaybeObject* maybe_obj = GenerateMissBranch();
|
| if (!maybe_obj->ToObject(&obj)) return maybe_obj;
|
| @@ -2487,7 +2492,8 @@
|
| // Handle store cache miss.
|
| __ bind(&miss);
|
| __ mov(ecx, Immediate(Handle<String>(name))); // restore name
|
| - Handle<Code> ic(Builtins::builtin(Builtins::StoreIC_Miss));
|
| + Handle<Code> ic(Isolate::Current()->builtins()->builtin(
|
| + Builtins::StoreIC_Miss));
|
| __ jmp(ic, RelocInfo::CODE_TARGET);
|
|
|
| // Return the generated code.
|
| @@ -2538,7 +2544,8 @@
|
|
|
| // Handle store cache miss.
|
| __ bind(&miss);
|
| - Handle<Code> ic(Builtins::builtin(Builtins::StoreIC_Miss));
|
| + Handle<Code> ic(Isolate::Current()->builtins()->builtin(
|
| + Builtins::StoreIC_Miss));
|
| __ jmp(ic, RelocInfo::CODE_TARGET);
|
|
|
| // Return the generated code.
|
| @@ -2588,7 +2595,8 @@
|
|
|
| // Handle store cache miss.
|
| __ bind(&miss);
|
| - Handle<Code> ic(Builtins::builtin(Builtins::StoreIC_Miss));
|
| + Handle<Code> ic(Isolate::Current()->builtins()->builtin(
|
| + Builtins::StoreIC_Miss));
|
| __ jmp(ic, RelocInfo::CODE_TARGET);
|
|
|
| // Return the generated code.
|
| @@ -2624,20 +2632,21 @@
|
| // cell could have been deleted and reintroducing the global needs
|
| // to update the property details in the property dictionary of the
|
| // global object. We bail out to the runtime system to do that.
|
| - __ cmp(cell_operand, Factory::the_hole_value());
|
| + __ cmp(cell_operand, FACTORY->the_hole_value());
|
| __ j(equal, &miss);
|
|
|
| // Store the value in the cell.
|
| __ mov(cell_operand, eax);
|
|
|
| // Return the value (register eax).
|
| - __ IncrementCounter(&Counters::named_store_global_inline, 1);
|
| + __ IncrementCounter(COUNTERS->named_store_global_inline(), 1);
|
| __ ret(0);
|
|
|
| // Handle store cache miss.
|
| __ bind(&miss);
|
| - __ IncrementCounter(&Counters::named_store_global_inline_miss, 1);
|
| - Handle<Code> ic(Builtins::builtin(Builtins::StoreIC_Miss));
|
| + __ IncrementCounter(COUNTERS->named_store_global_inline_miss(), 1);
|
| + Handle<Code> ic(Isolate::Current()->builtins()->builtin(
|
| + Builtins::StoreIC_Miss));
|
| __ jmp(ic, RelocInfo::CODE_TARGET);
|
|
|
| // Return the generated code.
|
| @@ -2657,7 +2666,7 @@
|
| // -----------------------------------
|
| Label miss;
|
|
|
| - __ IncrementCounter(&Counters::keyed_store_field, 1);
|
| + __ IncrementCounter(COUNTERS->keyed_store_field(), 1);
|
|
|
| // Check that the name has not changed.
|
| __ cmp(Operand(ecx), Immediate(Handle<String>(name)));
|
| @@ -2673,8 +2682,9 @@
|
|
|
| // Handle store cache miss.
|
| __ bind(&miss);
|
| - __ DecrementCounter(&Counters::keyed_store_field, 1);
|
| - Handle<Code> ic(Builtins::builtin(Builtins::KeyedStoreIC_Miss));
|
| + __ DecrementCounter(COUNTERS->keyed_store_field(), 1);
|
| + Handle<Code> ic(Isolate::Current()->builtins()->builtin(
|
| + Builtins::KeyedStoreIC_Miss));
|
| __ jmp(ic, RelocInfo::CODE_TARGET);
|
|
|
| // Return the generated code.
|
| @@ -2708,7 +2718,7 @@
|
| // Get the elements array and make sure it is a fast element array, not 'cow'.
|
| __ mov(edi, FieldOperand(edx, JSObject::kElementsOffset));
|
| __ cmp(FieldOperand(edi, HeapObject::kMapOffset),
|
| - Immediate(Factory::fixed_array_map()));
|
| + Immediate(FACTORY->fixed_array_map()));
|
| __ j(not_equal, &miss, not_taken);
|
|
|
| // Check that the key is within bounds.
|
| @@ -2731,7 +2741,8 @@
|
|
|
| // Handle store cache miss.
|
| __ bind(&miss);
|
| - Handle<Code> ic(Builtins::builtin(Builtins::KeyedStoreIC_Miss));
|
| + Handle<Code> ic(
|
| + Isolate::Current()->builtins()->builtin(Builtins::KeyedStoreIC_Miss));
|
| __ jmp(ic, RelocInfo::CODE_TARGET);
|
|
|
| // Return the generated code.
|
| @@ -2776,14 +2787,14 @@
|
|
|
| // Return undefined if maps of the full prototype chain are still the
|
| // same and no global property with this name contains a value.
|
| - __ mov(eax, Factory::undefined_value());
|
| + __ mov(eax, FACTORY->undefined_value());
|
| __ ret(0);
|
|
|
| __ bind(&miss);
|
| GenerateLoadMiss(masm(), Code::LOAD_IC);
|
|
|
| // Return the generated code.
|
| - return GetCode(NONEXISTENT, Heap::empty_string());
|
| + return GetCode(NONEXISTENT, HEAP->empty_string());
|
| }
|
|
|
|
|
| @@ -2920,19 +2931,19 @@
|
|
|
| // Check for deleted property if property can actually be deleted.
|
| if (!is_dont_delete) {
|
| - __ cmp(ebx, Factory::the_hole_value());
|
| + __ cmp(ebx, FACTORY->the_hole_value());
|
| __ j(equal, &miss, not_taken);
|
| } else if (FLAG_debug_code) {
|
| - __ cmp(ebx, Factory::the_hole_value());
|
| + __ cmp(ebx, FACTORY->the_hole_value());
|
| __ Check(not_equal, "DontDelete cells can't contain the hole");
|
| }
|
|
|
| - __ IncrementCounter(&Counters::named_load_global_stub, 1);
|
| + __ IncrementCounter(COUNTERS->named_load_global_stub(), 1);
|
| __ mov(eax, ebx);
|
| __ ret(0);
|
|
|
| __ bind(&miss);
|
| - __ IncrementCounter(&Counters::named_load_global_stub_miss, 1);
|
| + __ IncrementCounter(COUNTERS->named_load_global_stub_miss(), 1);
|
| GenerateLoadMiss(masm(), Code::LOAD_IC);
|
|
|
| // Return the generated code.
|
| @@ -2951,7 +2962,7 @@
|
| // -----------------------------------
|
| Label miss;
|
|
|
| - __ IncrementCounter(&Counters::keyed_load_field, 1);
|
| + __ IncrementCounter(COUNTERS->keyed_load_field(), 1);
|
|
|
| // Check that the name has not changed.
|
| __ cmp(Operand(eax), Immediate(Handle<String>(name)));
|
| @@ -2960,7 +2971,7 @@
|
| GenerateLoadField(receiver, holder, edx, ebx, ecx, edi, index, name, &miss);
|
|
|
| __ bind(&miss);
|
| - __ DecrementCounter(&Counters::keyed_load_field, 1);
|
| + __ DecrementCounter(COUNTERS->keyed_load_field(), 1);
|
| GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC);
|
|
|
| // Return the generated code.
|
| @@ -2980,7 +2991,7 @@
|
| // -----------------------------------
|
| Label miss;
|
|
|
| - __ IncrementCounter(&Counters::keyed_load_callback, 1);
|
| + __ IncrementCounter(COUNTERS->keyed_load_callback(), 1);
|
|
|
| // Check that the name has not changed.
|
| __ cmp(Operand(eax), Immediate(Handle<String>(name)));
|
| @@ -2995,7 +3006,7 @@
|
|
|
| __ bind(&miss);
|
|
|
| - __ DecrementCounter(&Counters::keyed_load_callback, 1);
|
| + __ DecrementCounter(COUNTERS->keyed_load_callback(), 1);
|
| GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC);
|
|
|
| // Return the generated code.
|
| @@ -3014,7 +3025,7 @@
|
| // -----------------------------------
|
| Label miss;
|
|
|
| - __ IncrementCounter(&Counters::keyed_load_constant_function, 1);
|
| + __ IncrementCounter(COUNTERS->keyed_load_constant_function(), 1);
|
|
|
| // Check that the name has not changed.
|
| __ cmp(Operand(eax), Immediate(Handle<String>(name)));
|
| @@ -3023,7 +3034,7 @@
|
| GenerateLoadConstant(receiver, holder, edx, ebx, ecx, edi,
|
| value, name, &miss);
|
| __ bind(&miss);
|
| - __ DecrementCounter(&Counters::keyed_load_constant_function, 1);
|
| + __ DecrementCounter(COUNTERS->keyed_load_constant_function(), 1);
|
| GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC);
|
|
|
| // Return the generated code.
|
| @@ -3041,7 +3052,7 @@
|
| // -----------------------------------
|
| Label miss;
|
|
|
| - __ IncrementCounter(&Counters::keyed_load_interceptor, 1);
|
| + __ IncrementCounter(COUNTERS->keyed_load_interceptor(), 1);
|
|
|
| // Check that the name has not changed.
|
| __ cmp(Operand(eax), Immediate(Handle<String>(name)));
|
| @@ -3060,7 +3071,7 @@
|
| name,
|
| &miss);
|
| __ bind(&miss);
|
| - __ DecrementCounter(&Counters::keyed_load_interceptor, 1);
|
| + __ DecrementCounter(COUNTERS->keyed_load_interceptor(), 1);
|
| GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC);
|
|
|
| // Return the generated code.
|
| @@ -3076,7 +3087,7 @@
|
| // -----------------------------------
|
| Label miss;
|
|
|
| - __ IncrementCounter(&Counters::keyed_load_array_length, 1);
|
| + __ IncrementCounter(COUNTERS->keyed_load_array_length(), 1);
|
|
|
| // Check that the name has not changed.
|
| __ cmp(Operand(eax), Immediate(Handle<String>(name)));
|
| @@ -3084,7 +3095,7 @@
|
|
|
| GenerateLoadArrayLength(masm(), edx, ecx, &miss);
|
| __ bind(&miss);
|
| - __ DecrementCounter(&Counters::keyed_load_array_length, 1);
|
| + __ DecrementCounter(COUNTERS->keyed_load_array_length(), 1);
|
| GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC);
|
|
|
| // Return the generated code.
|
| @@ -3100,7 +3111,7 @@
|
| // -----------------------------------
|
| Label miss;
|
|
|
| - __ IncrementCounter(&Counters::keyed_load_string_length, 1);
|
| + __ IncrementCounter(COUNTERS->keyed_load_string_length(), 1);
|
|
|
| // Check that the name has not changed.
|
| __ cmp(Operand(eax), Immediate(Handle<String>(name)));
|
| @@ -3108,7 +3119,7 @@
|
|
|
| GenerateLoadStringLength(masm(), edx, ecx, ebx, &miss, true);
|
| __ bind(&miss);
|
| - __ DecrementCounter(&Counters::keyed_load_string_length, 1);
|
| + __ DecrementCounter(COUNTERS->keyed_load_string_length(), 1);
|
| GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC);
|
|
|
| // Return the generated code.
|
| @@ -3124,7 +3135,7 @@
|
| // -----------------------------------
|
| Label miss;
|
|
|
| - __ IncrementCounter(&Counters::keyed_load_function_prototype, 1);
|
| + __ IncrementCounter(COUNTERS->keyed_load_function_prototype(), 1);
|
|
|
| // Check that the name has not changed.
|
| __ cmp(Operand(eax), Immediate(Handle<String>(name)));
|
| @@ -3132,7 +3143,7 @@
|
|
|
| GenerateLoadFunctionPrototype(masm(), edx, ecx, ebx, &miss);
|
| __ bind(&miss);
|
| - __ DecrementCounter(&Counters::keyed_load_function_prototype, 1);
|
| + __ DecrementCounter(COUNTERS->keyed_load_function_prototype(), 1);
|
| GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC);
|
|
|
| // Return the generated code.
|
| @@ -3172,7 +3183,7 @@
|
| // Load the result and make sure it's not the hole.
|
| __ mov(ebx, Operand(ecx, eax, times_2,
|
| FixedArray::kHeaderSize - kHeapObjectTag));
|
| - __ cmp(ebx, Factory::the_hole_value());
|
| + __ cmp(ebx, FACTORY->the_hole_value());
|
| __ j(equal, &miss, not_taken);
|
| __ mov(eax, ebx);
|
| __ ret(0);
|
| @@ -3201,7 +3212,7 @@
|
| // code for the function thereby hitting the break points.
|
| __ mov(ebx, FieldOperand(edi, JSFunction::kSharedFunctionInfoOffset));
|
| __ mov(ebx, FieldOperand(ebx, SharedFunctionInfo::kDebugInfoOffset));
|
| - __ cmp(ebx, Factory::undefined_value());
|
| + __ cmp(ebx, FACTORY->undefined_value());
|
| __ j(not_equal, &generic_stub_call, not_taken);
|
| #endif
|
|
|
| @@ -3238,7 +3249,7 @@
|
| // ebx: initial map
|
| // edx: JSObject (untagged)
|
| __ mov(Operand(edx, JSObject::kMapOffset), ebx);
|
| - __ mov(ebx, Factory::empty_fixed_array());
|
| + __ mov(ebx, FACTORY->empty_fixed_array());
|
| __ mov(Operand(edx, JSObject::kPropertiesOffset), ebx);
|
| __ mov(Operand(edx, JSObject::kElementsOffset), ebx);
|
|
|
| @@ -3255,7 +3266,7 @@
|
| __ lea(ecx, Operand(esp, eax, times_4, 1 * kPointerSize));
|
|
|
| // Use edi for holding undefined which is used in several places below.
|
| - __ mov(edi, Factory::undefined_value());
|
| + __ mov(edi, FACTORY->undefined_value());
|
|
|
| // eax: argc
|
| // ecx: first argument
|
| @@ -3272,7 +3283,7 @@
|
| int arg_number = shared->GetThisPropertyAssignmentArgument(i);
|
| __ mov(ebx, edi);
|
| __ cmp(eax, arg_number);
|
| - if (CpuFeatures::IsSupported(CMOV)) {
|
| + if (Isolate::Current()->cpu_features()->IsSupported(CMOV)) {
|
| CpuFeatures::Scope use_cmov(CMOV);
|
| __ cmov(above, ebx, Operand(ecx, arg_number * -kPointerSize));
|
| } else {
|
| @@ -3307,14 +3318,15 @@
|
| __ pop(ecx);
|
| __ lea(esp, Operand(esp, ebx, times_pointer_size, 1 * kPointerSize));
|
| __ push(ecx);
|
| - __ IncrementCounter(&Counters::constructed_objects, 1);
|
| - __ IncrementCounter(&Counters::constructed_objects_stub, 1);
|
| + __ IncrementCounter(COUNTERS->constructed_objects(), 1);
|
| + __ IncrementCounter(COUNTERS->constructed_objects_stub(), 1);
|
| __ ret(0);
|
|
|
| // Jump to the generic stub in case the specialized code cannot handle the
|
| // construction.
|
| __ bind(&generic_stub_call);
|
| - Code* code = Builtins::builtin(Builtins::JSConstructStubGeneric);
|
| + Code* code = Isolate::Current()->builtins()->builtin(
|
| + Builtins::JSConstructStubGeneric);
|
| Handle<Code> generic_construct_stub(code);
|
| __ jmp(generic_construct_stub, RelocInfo::CODE_TARGET);
|
|
|
| @@ -3455,7 +3467,7 @@
|
|
|
| // Slow case: Jump to runtime.
|
| __ bind(&slow);
|
| - __ IncrementCounter(&Counters::keyed_load_external_array_slow, 1);
|
| + __ IncrementCounter(COUNTERS->keyed_load_external_array_slow(), 1);
|
| // ----------- S t a t e -------------
|
| // -- eax : key
|
| // -- edx : receiver
|
| @@ -3568,7 +3580,7 @@
|
| // edi: elements array
|
| // ebx: untagged index
|
| __ cmp(FieldOperand(eax, HeapObject::kMapOffset),
|
| - Immediate(Factory::heap_number_map()));
|
| + Immediate(FACTORY->heap_number_map()));
|
| __ j(not_equal, &slow);
|
|
|
| // The WebGL specification leaves the behavior of storing NaN and
|
| @@ -3589,10 +3601,10 @@
|
| // processors that don't support SSE2. The code in IntegerConvert
|
| // (code-stubs-ia32.cc) is roughly what is needed here though the
|
| // conversion failure case does not need to be handled.
|
| - if (CpuFeatures::IsSupported(SSE2)) {
|
| + if (Isolate::Current()->cpu_features()->IsSupported(SSE2)) {
|
| if (array_type != kExternalIntArray &&
|
| array_type != kExternalUnsignedIntArray) {
|
| - ASSERT(CpuFeatures::IsSupported(SSE2));
|
| + ASSERT(Isolate::Current()->cpu_features()->IsSupported(SSE2));
|
| CpuFeatures::Scope scope(SSE2);
|
| __ cvttsd2si(ecx, FieldOperand(eax, HeapNumber::kValueOffset));
|
| // ecx: untagged integer value
|
| @@ -3620,7 +3632,7 @@
|
| break;
|
| }
|
| } else {
|
| - if (CpuFeatures::IsSupported(SSE3)) {
|
| + if (Isolate::Current()->cpu_features()->IsSupported(SSE3)) {
|
| CpuFeatures::Scope scope(SSE3);
|
| // fisttp stores values as signed integers. To represent the
|
| // entire range of int and unsigned int arrays, store as a
|
| @@ -3633,7 +3645,7 @@
|
| __ pop(ecx);
|
| __ add(Operand(esp), Immediate(kPointerSize));
|
| } else {
|
| - ASSERT(CpuFeatures::IsSupported(SSE2));
|
| + ASSERT(Isolate::Current()->cpu_features()->IsSupported(SSE2));
|
| CpuFeatures::Scope scope(SSE2);
|
| // We can easily implement the correct rounding behavior for the
|
| // range [0, 2^31-1]. For the time being, to keep this code simple,
|
|
|