| Index: src/ia32/builtins-ia32.cc
|
| ===================================================================
|
| --- src/ia32/builtins-ia32.cc (revision 7267)
|
| +++ src/ia32/builtins-ia32.cc (working copy)
|
| @@ -100,8 +100,8 @@
|
| // Set expected number of arguments to zero (not changing eax).
|
| __ Set(ebx, Immediate(0));
|
| __ GetBuiltinEntry(edx, Builtins::CALL_NON_FUNCTION_AS_CONSTRUCTOR);
|
| - __ jmp(Handle<Code>(builtin(ArgumentsAdaptorTrampoline)),
|
| - RelocInfo::CODE_TARGET);
|
| + __ jmp(Handle<Code>(Isolate::Current()->builtins()->builtin(
|
| + ArgumentsAdaptorTrampoline)), RelocInfo::CODE_TARGET);
|
| }
|
|
|
|
|
| @@ -184,7 +184,7 @@
|
| // ebx: JSObject
|
| // edi: start of next object
|
| __ mov(Operand(ebx, JSObject::kMapOffset), eax);
|
| - __ mov(ecx, Factory::empty_fixed_array());
|
| + __ mov(ecx, FACTORY->empty_fixed_array());
|
| __ mov(Operand(ebx, JSObject::kPropertiesOffset), ecx);
|
| __ mov(Operand(ebx, JSObject::kElementsOffset), ecx);
|
| // Set extra fields in the newly allocated object.
|
| @@ -194,9 +194,9 @@
|
| { Label loop, entry;
|
| // To allow for truncation.
|
| if (count_constructions) {
|
| - __ mov(edx, Factory::one_pointer_filler_map());
|
| + __ mov(edx, FACTORY->one_pointer_filler_map());
|
| } else {
|
| - __ mov(edx, Factory::undefined_value());
|
| + __ mov(edx, FACTORY->undefined_value());
|
| }
|
| __ lea(ecx, Operand(ebx, JSObject::kHeaderSize));
|
| __ jmp(&entry);
|
| @@ -252,7 +252,7 @@
|
| // edi: FixedArray
|
| // edx: number of elements
|
| // ecx: start of next object
|
| - __ mov(eax, Factory::fixed_array_map());
|
| + __ mov(eax, FACTORY->fixed_array_map());
|
| __ mov(Operand(edi, FixedArray::kMapOffset), eax); // setup the map
|
| __ SmiTag(edx);
|
| __ mov(Operand(edi, FixedArray::kLengthOffset), edx); // and length
|
| @@ -262,7 +262,7 @@
|
| // edi: FixedArray
|
| // ecx: start of next object
|
| { Label loop, entry;
|
| - __ mov(edx, Factory::undefined_value());
|
| + __ mov(edx, FACTORY->undefined_value());
|
| __ lea(eax, Operand(edi, FixedArray::kHeaderSize));
|
| __ jmp(&entry);
|
| __ bind(&loop);
|
| @@ -335,7 +335,8 @@
|
| if (is_api_function) {
|
| __ mov(esi, FieldOperand(edi, JSFunction::kContextOffset));
|
| Handle<Code> code = Handle<Code>(
|
| - Builtins::builtin(Builtins::HandleApiCallConstruct));
|
| + Isolate::Current()->builtins()->builtin(
|
| + Builtins::HandleApiCallConstruct));
|
| ParameterCount expected(0);
|
| __ InvokeCode(code, expected, expected,
|
| RelocInfo::CODE_TARGET, CALL_FUNCTION);
|
| @@ -376,7 +377,7 @@
|
| __ pop(ecx);
|
| __ lea(esp, Operand(esp, ebx, times_2, 1 * kPointerSize)); // 1 ~ receiver
|
| __ push(ecx);
|
| - __ IncrementCounter(&Counters::constructed_objects, 1);
|
| + __ IncrementCounter(COUNTERS->constructed_objects(), 1);
|
| __ ret(0);
|
| }
|
|
|
| @@ -436,8 +437,8 @@
|
|
|
| // Invoke the code.
|
| if (is_construct) {
|
| - __ call(Handle<Code>(Builtins::builtin(Builtins::JSConstructCall)),
|
| - RelocInfo::CODE_TARGET);
|
| + __ call(Handle<Code>(Isolate::Current()->builtins()->builtin(
|
| + Builtins::JSConstructCall)), RelocInfo::CODE_TARGET);
|
| } else {
|
| ParameterCount actual(eax);
|
| __ InvokeFunction(edi, actual, CALL_FUNCTION);
|
| @@ -566,7 +567,7 @@
|
| __ test(eax, Operand(eax));
|
| __ j(not_zero, &done, taken);
|
| __ pop(ebx);
|
| - __ push(Immediate(Factory::undefined_value()));
|
| + __ push(Immediate(FACTORY->undefined_value()));
|
| __ push(ebx);
|
| __ inc(eax);
|
| __ bind(&done);
|
| @@ -600,9 +601,9 @@
|
| __ test(ebx, Immediate(kSmiTagMask));
|
| __ j(zero, &convert_to_object);
|
|
|
| - __ cmp(ebx, Factory::null_value());
|
| + __ cmp(ebx, FACTORY->null_value());
|
| __ j(equal, &use_global_receiver);
|
| - __ cmp(ebx, Factory::undefined_value());
|
| + __ cmp(ebx, FACTORY->undefined_value());
|
| __ j(equal, &use_global_receiver);
|
|
|
| // We don't use IsObjectJSObjectType here because we jump on success.
|
| @@ -674,8 +675,8 @@
|
| __ j(not_zero, &function, taken);
|
| __ Set(ebx, Immediate(0));
|
| __ GetBuiltinEntry(edx, Builtins::CALL_NON_FUNCTION);
|
| - __ jmp(Handle<Code>(builtin(ArgumentsAdaptorTrampoline)),
|
| - RelocInfo::CODE_TARGET);
|
| + __ jmp(Handle<Code>(Isolate::Current()->builtins()->builtin(
|
| + ArgumentsAdaptorTrampoline)), RelocInfo::CODE_TARGET);
|
| __ bind(&function);
|
| }
|
|
|
| @@ -688,7 +689,8 @@
|
| __ mov(edx, FieldOperand(edi, JSFunction::kCodeEntryOffset));
|
| __ SmiUntag(ebx);
|
| __ cmp(eax, Operand(ebx));
|
| - __ j(not_equal, Handle<Code>(builtin(ArgumentsAdaptorTrampoline)));
|
| + __ j(not_equal, Handle<Code>(Isolate::Current()->builtins()->builtin(
|
| + ArgumentsAdaptorTrampoline)));
|
|
|
| ParameterCount expected(0);
|
| __ InvokeCode(Operand(edx), expected, expected, JUMP_FUNCTION);
|
| @@ -753,9 +755,9 @@
|
| // Compute the receiver in non-strict mode.
|
| __ test(ebx, Immediate(kSmiTagMask));
|
| __ j(zero, &call_to_object);
|
| - __ cmp(ebx, Factory::null_value());
|
| + __ cmp(ebx, FACTORY->null_value());
|
| __ j(equal, &use_global_receiver);
|
| - __ cmp(ebx, Factory::undefined_value());
|
| + __ cmp(ebx, FACTORY->undefined_value());
|
| __ j(equal, &use_global_receiver);
|
|
|
| // If given receiver is already a JavaScript object then there's no
|
| @@ -795,7 +797,8 @@
|
| __ mov(edx, Operand(ebp, 2 * kPointerSize)); // load arguments
|
|
|
| // Use inline caching to speed up access to arguments.
|
| - Handle<Code> ic(Builtins::builtin(Builtins::KeyedLoadIC_Initialize));
|
| + Handle<Code> ic(Isolate::Current()->builtins()->builtin(
|
| + Builtins::KeyedLoadIC_Initialize));
|
| __ call(ic, RelocInfo::CODE_TARGET);
|
| // It is important that we do not have a test instruction after the
|
| // call. A test instruction after the call is used to indicate that
|
| @@ -867,7 +870,7 @@
|
| // scratch2: start of next object
|
| __ mov(FieldOperand(result, JSObject::kMapOffset), scratch1);
|
| __ mov(FieldOperand(result, JSArray::kPropertiesOffset),
|
| - Factory::empty_fixed_array());
|
| + FACTORY->empty_fixed_array());
|
| // Field JSArray::kElementsOffset is initialized later.
|
| __ mov(FieldOperand(result, JSArray::kLengthOffset), Immediate(0));
|
|
|
| @@ -875,7 +878,7 @@
|
| // fixed array.
|
| if (initial_capacity == 0) {
|
| __ mov(FieldOperand(result, JSArray::kElementsOffset),
|
| - Factory::empty_fixed_array());
|
| + FACTORY->empty_fixed_array());
|
| return;
|
| }
|
|
|
| @@ -892,7 +895,7 @@
|
| // scratch1: elements array
|
| // scratch2: start of next object
|
| __ mov(FieldOperand(scratch1, FixedArray::kMapOffset),
|
| - Factory::fixed_array_map());
|
| + FACTORY->fixed_array_map());
|
| __ mov(FieldOperand(scratch1, FixedArray::kLengthOffset),
|
| Immediate(Smi::FromInt(initial_capacity)));
|
|
|
| @@ -903,7 +906,7 @@
|
| if (initial_capacity <= kLoopUnfoldLimit) {
|
| // Use a scratch register here to have only one reloc info when unfolding
|
| // the loop.
|
| - __ mov(scratch3, Factory::the_hole_value());
|
| + __ mov(scratch3, FACTORY->the_hole_value());
|
| for (int i = 0; i < initial_capacity; i++) {
|
| __ mov(FieldOperand(scratch1,
|
| FixedArray::kHeaderSize + i * kPointerSize),
|
| @@ -913,7 +916,7 @@
|
| Label loop, entry;
|
| __ jmp(&entry);
|
| __ bind(&loop);
|
| - __ mov(Operand(scratch1, 0), Factory::the_hole_value());
|
| + __ mov(Operand(scratch1, 0), FACTORY->the_hole_value());
|
| __ add(Operand(scratch1), Immediate(kPointerSize));
|
| __ bind(&entry);
|
| __ cmp(scratch1, Operand(scratch2));
|
| @@ -968,7 +971,7 @@
|
| // elements_array_end: start of next object
|
| // array_size: size of array (smi)
|
| __ mov(FieldOperand(result, JSObject::kMapOffset), elements_array);
|
| - __ mov(elements_array, Factory::empty_fixed_array());
|
| + __ mov(elements_array, FACTORY->empty_fixed_array());
|
| __ mov(FieldOperand(result, JSArray::kPropertiesOffset), elements_array);
|
| // Field JSArray::kElementsOffset is initialized later.
|
| __ mov(FieldOperand(result, JSArray::kLengthOffset), array_size);
|
| @@ -987,7 +990,7 @@
|
| // elements_array_end: start of next object
|
| // array_size: size of array (smi)
|
| __ mov(FieldOperand(elements_array, FixedArray::kMapOffset),
|
| - Factory::fixed_array_map());
|
| + FACTORY->fixed_array_map());
|
| // For non-empty JSArrays the length of the FixedArray and the JSArray is the
|
| // same.
|
| __ mov(FieldOperand(elements_array, FixedArray::kLengthOffset), array_size);
|
| @@ -999,7 +1002,7 @@
|
| __ SmiUntag(array_size);
|
| __ lea(edi, Operand(elements_array,
|
| FixedArray::kHeaderSize - kHeapObjectTag));
|
| - __ mov(eax, Factory::the_hole_value());
|
| + __ mov(eax, FACTORY->the_hole_value());
|
| __ cld();
|
| // Do not use rep stos when filling less than kRepStosThreshold
|
| // words.
|
| @@ -1063,7 +1066,7 @@
|
| edi,
|
| kPreallocatedArrayElements,
|
| &prepare_generic_code_call);
|
| - __ IncrementCounter(&Counters::array_function_native, 1);
|
| + __ IncrementCounter(COUNTERS->array_function_native(), 1);
|
| __ pop(ebx);
|
| if (construct_call) {
|
| __ pop(edi);
|
| @@ -1119,7 +1122,7 @@
|
| edi,
|
| true,
|
| &prepare_generic_code_call);
|
| - __ IncrementCounter(&Counters::array_function_native, 1);
|
| + __ IncrementCounter(COUNTERS->array_function_native(), 1);
|
| __ mov(eax, ebx);
|
| __ pop(ebx);
|
| if (construct_call) {
|
| @@ -1146,7 +1149,7 @@
|
| edi,
|
| false,
|
| &prepare_generic_code_call);
|
| - __ IncrementCounter(&Counters::array_function_native, 1);
|
| + __ IncrementCounter(COUNTERS->array_function_native(), 1);
|
| __ mov(eax, ebx);
|
| __ pop(ebx);
|
| if (construct_call) {
|
| @@ -1232,7 +1235,8 @@
|
| // Jump to the generic array code in case the specialized code cannot handle
|
| // the construction.
|
| __ bind(&generic_array_code);
|
| - Code* code = Builtins::builtin(Builtins::ArrayCodeGeneric);
|
| + Code* code = Isolate::Current()->builtins()->builtin(
|
| + Builtins::ArrayCodeGeneric);
|
| Handle<Code> array_code(code);
|
| __ jmp(array_code, RelocInfo::CODE_TARGET);
|
| }
|
| @@ -1266,7 +1270,8 @@
|
| // Jump to the generic construct code in case the specialized code cannot
|
| // handle the construction.
|
| __ bind(&generic_constructor);
|
| - 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);
|
| }
|
| @@ -1280,7 +1285,7 @@
|
| // -- esp[(argc - n) * 4] : arg[n] (zero-based)
|
| // -- esp[(argc + 1) * 4] : receiver
|
| // -----------------------------------
|
| - __ IncrementCounter(&Counters::string_ctor_calls, 1);
|
| + __ IncrementCounter(COUNTERS->string_ctor_calls(), 1);
|
|
|
| if (FLAG_debug_code) {
|
| __ LoadGlobalFunction(Context::STRING_FUNCTION_INDEX, ecx);
|
| @@ -1309,7 +1314,7 @@
|
| edx, // Scratch 2.
|
| false, // Input is known to be smi?
|
| ¬_cached);
|
| - __ IncrementCounter(&Counters::string_ctor_cached_number, 1);
|
| + __ IncrementCounter(COUNTERS->string_ctor_cached_number(), 1);
|
| __ bind(&argument_is_string);
|
| // ----------- S t a t e -------------
|
| // -- ebx : argument converted to string
|
| @@ -1338,7 +1343,7 @@
|
| __ mov(FieldOperand(eax, HeapObject::kMapOffset), ecx);
|
|
|
| // Set properties and elements.
|
| - __ Set(ecx, Immediate(Factory::empty_fixed_array()));
|
| + __ Set(ecx, Immediate(FACTORY->empty_fixed_array()));
|
| __ mov(FieldOperand(eax, JSObject::kPropertiesOffset), ecx);
|
| __ mov(FieldOperand(eax, JSObject::kElementsOffset), ecx);
|
|
|
| @@ -1361,12 +1366,12 @@
|
| Condition is_string = masm->IsObjectStringType(eax, ebx, ecx);
|
| __ j(NegateCondition(is_string), &convert_argument);
|
| __ mov(ebx, eax);
|
| - __ IncrementCounter(&Counters::string_ctor_string_value, 1);
|
| + __ IncrementCounter(COUNTERS->string_ctor_string_value(), 1);
|
| __ jmp(&argument_is_string);
|
|
|
| // Invoke the conversion builtin and put the result into ebx.
|
| __ bind(&convert_argument);
|
| - __ IncrementCounter(&Counters::string_ctor_conversions, 1);
|
| + __ IncrementCounter(COUNTERS->string_ctor_conversions(), 1);
|
| __ EnterInternalFrame();
|
| __ push(edi); // Preserve the function.
|
| __ push(eax);
|
| @@ -1379,7 +1384,7 @@
|
| // Load the empty string into ebx, remove the receiver from the
|
| // stack, and jump back to the case where the argument is a string.
|
| __ bind(&no_arguments);
|
| - __ Set(ebx, Immediate(Factory::empty_string()));
|
| + __ Set(ebx, Immediate(FACTORY->empty_string()));
|
| __ pop(ecx);
|
| __ lea(esp, Operand(esp, kPointerSize));
|
| __ push(ecx);
|
| @@ -1388,7 +1393,7 @@
|
| // At this point the argument is already a string. Call runtime to
|
| // create a string wrapper.
|
| __ bind(&gc_required);
|
| - __ IncrementCounter(&Counters::string_ctor_gc_required, 1);
|
| + __ IncrementCounter(COUNTERS->string_ctor_gc_required(), 1);
|
| __ EnterInternalFrame();
|
| __ push(ebx);
|
| __ CallRuntime(Runtime::kNewStringWrapper, 1);
|
| @@ -1439,7 +1444,7 @@
|
| // -----------------------------------
|
|
|
| Label invoke, dont_adapt_arguments;
|
| - __ IncrementCounter(&Counters::arguments_adaptors, 1);
|
| + __ IncrementCounter(COUNTERS->arguments_adaptors(), 1);
|
|
|
| Label enough, too_few;
|
| __ cmp(eax, Operand(ebx));
|
| @@ -1487,7 +1492,7 @@
|
| Label fill;
|
| __ bind(&fill);
|
| __ inc(ecx);
|
| - __ push(Immediate(Factory::undefined_value()));
|
| + __ push(Immediate(FACTORY->undefined_value()));
|
| __ cmp(ecx, Operand(ebx));
|
| __ j(less, &fill);
|
|
|
| @@ -1515,8 +1520,9 @@
|
| // We shouldn't be performing on-stack replacement in the first
|
| // place if the CPU features we need for the optimized Crankshaft
|
| // code aren't supported.
|
| - CpuFeatures::Probe(false);
|
| - if (!CpuFeatures::IsSupported(SSE2)) {
|
| + CpuFeatures* cpu_features = Isolate::Current()->cpu_features();
|
| + cpu_features->Probe(false);
|
| + if (!cpu_features->IsSupported(SSE2)) {
|
| __ Abort("Unreachable code: Cannot optimize without SSE2 support.");
|
| return;
|
| }
|
|
|