| Index: src/arm/code-stubs-arm.cc
|
| diff --git a/src/arm/code-stubs-arm.cc b/src/arm/code-stubs-arm.cc
|
| index ac46fe8c12e8f5c668827cb7caa1bce5ed8aa56c..81da4658154f791e0915508b6aeafefa3b3932a4 100644
|
| --- a/src/arm/code-stubs-arm.cc
|
| +++ b/src/arm/code-stubs-arm.cc
|
| @@ -165,6 +165,26 @@ void KeyedLoadFieldStub::InitializeInterfaceDescriptor(
|
| }
|
|
|
|
|
| +void StringLengthStub::InitializeInterfaceDescriptor(
|
| + Isolate* isolate,
|
| + CodeStubInterfaceDescriptor* descriptor) {
|
| + static Register registers[] = { r0, r2 };
|
| + descriptor->register_param_count_ = 2;
|
| + descriptor->register_params_ = registers;
|
| + descriptor->deoptimization_handler_ = NULL;
|
| +}
|
| +
|
| +
|
| +void KeyedStringLengthStub::InitializeInterfaceDescriptor(
|
| + Isolate* isolate,
|
| + CodeStubInterfaceDescriptor* descriptor) {
|
| + static Register registers[] = { r1, r0 };
|
| + descriptor->register_param_count_ = 2;
|
| + descriptor->register_params_ = registers;
|
| + descriptor->deoptimization_handler_ = NULL;
|
| +}
|
| +
|
| +
|
| void KeyedStoreFastElementStub::InitializeInterfaceDescriptor(
|
| Isolate* isolate,
|
| CodeStubInterfaceDescriptor* descriptor) {
|
| @@ -490,7 +510,7 @@ void HydrogenCodeStub::GenerateLightweightMiss(MacroAssembler* masm) {
|
| int param_count = descriptor->register_param_count_;
|
| {
|
| // Call the runtime system in a fresh internal frame.
|
| - FrameScope scope(masm, StackFrame::INTERNAL);
|
| + FrameAndConstantPoolScope scope(masm, StackFrame::INTERNAL);
|
| ASSERT(descriptor->register_param_count_ == 0 ||
|
| r0.is(descriptor->register_params_[param_count - 1]));
|
| // Push arguments
|
| @@ -1606,14 +1626,15 @@ void CEntryStub::GenerateCore(MacroAssembler* masm,
|
| JumpIfOOM(masm, r0, ip, throw_out_of_memory_exception);
|
|
|
| // Clear the pending exception.
|
| - __ mov(r3, Operand(isolate->factory()->the_hole_value()));
|
| + __ LoadRoot(r3, Heap::kTheHoleValueRootIndex);
|
| __ mov(ip, Operand(ExternalReference(Isolate::kPendingExceptionAddress,
|
| isolate)));
|
| __ str(r3, MemOperand(ip));
|
|
|
| // Special handling of termination exceptions which are uncatchable
|
| // by javascript code.
|
| - __ cmp(r0, Operand(isolate->factory()->termination_exception()));
|
| + __ LoadRoot(r3, Heap::kTerminationExceptionRootIndex);
|
| + __ cmp(r0, r3);
|
| __ b(eq, throw_termination_exception);
|
|
|
| // Handle normal exception.
|
| @@ -1645,7 +1666,7 @@ void CEntryStub::Generate(MacroAssembler* masm) {
|
| __ sub(r6, r6, Operand(kPointerSize));
|
|
|
| // Enter the exit frame that transitions from JavaScript to C++.
|
| - FrameScope scope(masm, StackFrame::MANUAL);
|
| + FrameAndConstantPoolScope scope(masm, StackFrame::MANUAL);
|
| __ EnterExitFrame(save_doubles_);
|
|
|
| // Set up argc and the builtin function in callee-saved registers.
|
| @@ -1898,8 +1919,7 @@ void JSEntryStub::GenerateBody(MacroAssembler* masm, bool is_construct) {
|
| // * function: r1 or at sp.
|
| //
|
| // An inlined call site may have been generated before calling this stub.
|
| -// In this case the offset to the inline site to patch is passed on the stack,
|
| -// in the safepoint slot for register r4.
|
| +// In this case the offset to the inline site to patch is passed in r5.
|
| // (See LCodeGen::DoInstanceOfKnownGlobal)
|
| void InstanceofStub::Generate(MacroAssembler* masm) {
|
| // Call site inlining and patching implies arguments in registers.
|
| @@ -1958,14 +1978,14 @@ void InstanceofStub::Generate(MacroAssembler* masm) {
|
| ASSERT(HasArgsInRegisters());
|
| // Patch the (relocated) inlined map check.
|
|
|
| - // The offset was stored in r4 safepoint slot.
|
| - // (See LCodeGen::DoDeferredLInstanceOfKnownGlobal)
|
| - __ LoadFromSafepointRegisterSlot(scratch, r4);
|
| - __ sub(inline_site, lr, scratch);
|
| - // Get the map location in scratch and patch it.
|
| - __ GetRelocatedValueLocation(inline_site, scratch);
|
| - __ ldr(scratch, MemOperand(scratch));
|
| - __ str(map, FieldMemOperand(scratch, Cell::kValueOffset));
|
| + // The offset was stored in r5
|
| + // (See LCodeGen::DoDeferredLInstanceOfKnownGlobal).
|
| + const Register offset = r5;
|
| + __ sub(inline_site, lr, offset);
|
| + // Get the map location in r5 and patch it.
|
| + __ GetRelocatedValueLocation(inline_site, offset);
|
| + __ ldr(offset, MemOperand(offset));
|
| + __ str(map, FieldMemOperand(offset, Cell::kValueOffset));
|
| }
|
|
|
| // Register mapping: r3 is object map and r4 is function prototype.
|
| @@ -2058,7 +2078,7 @@ void InstanceofStub::Generate(MacroAssembler* masm) {
|
| __ InvokeBuiltin(Builtins::INSTANCE_OF, JUMP_FUNCTION);
|
| } else {
|
| {
|
| - FrameScope scope(masm, StackFrame::INTERNAL);
|
| + FrameAndConstantPoolScope scope(masm, StackFrame::INTERNAL);
|
| __ Push(r0, r1);
|
| __ InvokeBuiltin(Builtins::INSTANCE_OF, CALL_FUNCTION);
|
| }
|
| @@ -2100,37 +2120,6 @@ void FunctionPrototypeStub::Generate(MacroAssembler* masm) {
|
| }
|
|
|
|
|
| -void StringLengthStub::Generate(MacroAssembler* masm) {
|
| - Label miss;
|
| - Register receiver;
|
| - if (kind() == Code::KEYED_LOAD_IC) {
|
| - // ----------- S t a t e -------------
|
| - // -- lr : return address
|
| - // -- r0 : key
|
| - // -- r1 : receiver
|
| - // -----------------------------------
|
| - __ cmp(r0, Operand(masm->isolate()->factory()->length_string()));
|
| - __ b(ne, &miss);
|
| - receiver = r1;
|
| - } else {
|
| - ASSERT(kind() == Code::LOAD_IC);
|
| - // ----------- S t a t e -------------
|
| - // -- r2 : name
|
| - // -- lr : return address
|
| - // -- r0 : receiver
|
| - // -- sp[0] : receiver
|
| - // -----------------------------------
|
| - receiver = r0;
|
| - }
|
| -
|
| - StubCompiler::GenerateLoadStringLength(masm, receiver, r3, r4, &miss);
|
| -
|
| - __ bind(&miss);
|
| - StubCompiler::TailCallBuiltin(
|
| - masm, BaseLoadStoreStubCompiler::MissBuiltin(kind()));
|
| -}
|
| -
|
| -
|
| void StoreArrayLengthStub::Generate(MacroAssembler* masm) {
|
| // This accepts as a receiver anything JSArray::SetElementsLength accepts
|
| // (currently anything except for external arrays which means anything with
|
| @@ -2259,7 +2248,7 @@ void ArgumentsAccessStub::GenerateReadElement(MacroAssembler* masm) {
|
| }
|
|
|
|
|
| -void ArgumentsAccessStub::GenerateNewNonStrictSlow(MacroAssembler* masm) {
|
| +void ArgumentsAccessStub::GenerateNewSloppySlow(MacroAssembler* masm) {
|
| // sp[0] : number of parameters
|
| // sp[4] : receiver displacement
|
| // sp[8] : function
|
| @@ -2283,7 +2272,7 @@ void ArgumentsAccessStub::GenerateNewNonStrictSlow(MacroAssembler* masm) {
|
| }
|
|
|
|
|
| -void ArgumentsAccessStub::GenerateNewNonStrictFast(MacroAssembler* masm) {
|
| +void ArgumentsAccessStub::GenerateNewSloppyFast(MacroAssembler* masm) {
|
| // Stack layout:
|
| // sp[0] : number of parameters (tagged)
|
| // sp[4] : address of receiver argument
|
| @@ -2337,7 +2326,7 @@ void ArgumentsAccessStub::GenerateNewNonStrictFast(MacroAssembler* masm) {
|
| __ add(r9, r9, Operand(FixedArray::kHeaderSize));
|
|
|
| // 3. Arguments object.
|
| - __ add(r9, r9, Operand(Heap::kArgumentsObjectSize));
|
| + __ add(r9, r9, Operand(Heap::kSloppyArgumentsObjectSize));
|
|
|
| // Do the allocation of all three objects in one go.
|
| __ Allocate(r9, r0, r3, r4, &runtime, TAG_OBJECT);
|
| @@ -2346,7 +2335,7 @@ void ArgumentsAccessStub::GenerateNewNonStrictFast(MacroAssembler* masm) {
|
| // r2 = argument count (tagged)
|
| // Get the arguments boilerplate from the current native context into r4.
|
| const int kNormalOffset =
|
| - Context::SlotOffset(Context::ARGUMENTS_BOILERPLATE_INDEX);
|
| + Context::SlotOffset(Context::SLOPPY_ARGUMENTS_BOILERPLATE_INDEX);
|
| const int kAliasedOffset =
|
| Context::SlotOffset(Context::ALIASED_ARGUMENTS_BOILERPLATE_INDEX);
|
|
|
| @@ -2382,7 +2371,7 @@ void ArgumentsAccessStub::GenerateNewNonStrictFast(MacroAssembler* masm) {
|
| // Set up the elements pointer in the allocated arguments object.
|
| // If we allocated a parameter map, r4 will point there, otherwise
|
| // it will point to the backing store.
|
| - __ add(r4, r0, Operand(Heap::kArgumentsObjectSize));
|
| + __ add(r4, r0, Operand(Heap::kSloppyArgumentsObjectSize));
|
| __ str(r4, FieldMemOperand(r0, JSObject::kElementsOffset));
|
|
|
| // r0 = address of new object (tagged)
|
| @@ -2397,7 +2386,7 @@ void ArgumentsAccessStub::GenerateNewNonStrictFast(MacroAssembler* masm) {
|
| __ mov(r3, r4, LeaveCC, eq);
|
| __ b(eq, &skip_parameter_map);
|
|
|
| - __ LoadRoot(r6, Heap::kNonStrictArgumentsElementsMapRootIndex);
|
| + __ LoadRoot(r6, Heap::kSloppyArgumentsElementsMapRootIndex);
|
| __ str(r6, FieldMemOperand(r4, FixedArray::kMapOffset));
|
| __ add(r6, r1, Operand(Smi::FromInt(2)));
|
| __ str(r6, FieldMemOperand(r4, FixedArray::kLengthOffset));
|
| @@ -2427,7 +2416,7 @@ void ArgumentsAccessStub::GenerateNewNonStrictFast(MacroAssembler* masm) {
|
| // r1 = mapping index (tagged)
|
| // r3 = address of backing store (tagged)
|
| // r4 = address of parameter map (tagged), which is also the address of new
|
| - // object + Heap::kArgumentsObjectSize (tagged)
|
| + // object + Heap::kSloppyArgumentsObjectSize (tagged)
|
| // r0 = temporary scratch (a.o., for address calculation)
|
| // r5 = the hole value
|
| __ jmp(¶meters_test);
|
| @@ -2445,7 +2434,7 @@ void ArgumentsAccessStub::GenerateNewNonStrictFast(MacroAssembler* masm) {
|
| __ b(ne, ¶meters_loop);
|
|
|
| // Restore r0 = new object (tagged)
|
| - __ sub(r0, r4, Operand(Heap::kArgumentsObjectSize));
|
| + __ sub(r0, r4, Operand(Heap::kSloppyArgumentsObjectSize));
|
|
|
| __ bind(&skip_parameter_map);
|
| // r0 = address of new object (tagged)
|
| @@ -2518,7 +2507,7 @@ void ArgumentsAccessStub::GenerateNewStrict(MacroAssembler* masm) {
|
| __ b(eq, &add_arguments_object);
|
| __ add(r1, r1, Operand(FixedArray::kHeaderSize / kPointerSize));
|
| __ bind(&add_arguments_object);
|
| - __ add(r1, r1, Operand(Heap::kArgumentsObjectSizeStrict / kPointerSize));
|
| + __ add(r1, r1, Operand(Heap::kStrictArgumentsObjectSize / kPointerSize));
|
|
|
| // Do the allocation of both objects in one go.
|
| __ Allocate(r1, r0, r2, r3, &runtime,
|
| @@ -2528,7 +2517,7 @@ void ArgumentsAccessStub::GenerateNewStrict(MacroAssembler* masm) {
|
| __ ldr(r4, MemOperand(cp, Context::SlotOffset(Context::GLOBAL_OBJECT_INDEX)));
|
| __ ldr(r4, FieldMemOperand(r4, GlobalObject::kNativeContextOffset));
|
| __ ldr(r4, MemOperand(r4, Context::SlotOffset(
|
| - Context::STRICT_MODE_ARGUMENTS_BOILERPLATE_INDEX)));
|
| + Context::STRICT_ARGUMENTS_BOILERPLATE_INDEX)));
|
|
|
| // Copy the JS object part.
|
| __ CopyFields(r0, r4, d0, JSObject::kHeaderSize / kPointerSize);
|
| @@ -2549,7 +2538,7 @@ void ArgumentsAccessStub::GenerateNewStrict(MacroAssembler* masm) {
|
|
|
| // Set up the elements pointer in the allocated arguments object and
|
| // initialize the header in the elements fixed array.
|
| - __ add(r4, r0, Operand(Heap::kArgumentsObjectSizeStrict));
|
| + __ add(r4, r0, Operand(Heap::kStrictArgumentsObjectSize));
|
| __ str(r4, FieldMemOperand(r0, JSObject::kElementsOffset));
|
| __ LoadRoot(r3, Heap::kFixedArrayMapRootIndex);
|
| __ str(r3, FieldMemOperand(r4, FixedArray::kMapOffset));
|
| @@ -3015,9 +3004,9 @@ static void GenerateRecordCallTarget(MacroAssembler* masm) {
|
| Label initialize, done, miss, megamorphic, not_array_function;
|
|
|
| ASSERT_EQ(*TypeFeedbackInfo::MegamorphicSentinel(masm->isolate()),
|
| - masm->isolate()->heap()->undefined_value());
|
| + masm->isolate()->heap()->megamorphic_symbol());
|
| ASSERT_EQ(*TypeFeedbackInfo::UninitializedSentinel(masm->isolate()),
|
| - masm->isolate()->heap()->the_hole_value());
|
| + masm->isolate()->heap()->uninitialized_symbol());
|
|
|
| // Load the cache state into r4.
|
| __ add(r4, r2, Operand::PointerOffsetFromSmiKey(r3));
|
| @@ -3046,13 +3035,13 @@ static void GenerateRecordCallTarget(MacroAssembler* masm) {
|
|
|
| // A monomorphic miss (i.e, here the cache is not uninitialized) goes
|
| // megamorphic.
|
| - __ CompareRoot(r4, Heap::kTheHoleValueRootIndex);
|
| + __ CompareRoot(r4, Heap::kUninitializedSymbolRootIndex);
|
| __ b(eq, &initialize);
|
| // MegamorphicSentinel is an immortal immovable object (undefined) so no
|
| // write-barrier is needed.
|
| __ bind(&megamorphic);
|
| __ add(r4, r2, Operand::PointerOffsetFromSmiKey(r3));
|
| - __ LoadRoot(ip, Heap::kUndefinedValueRootIndex);
|
| + __ LoadRoot(ip, Heap::kMegamorphicSymbolRootIndex);
|
| __ str(ip, FieldMemOperand(r4, FixedArray::kHeaderSize));
|
| __ jmp(&done);
|
|
|
| @@ -3067,7 +3056,7 @@ static void GenerateRecordCallTarget(MacroAssembler* masm) {
|
| // The target function is the Array constructor,
|
| // Create an AllocationSite if we don't already have it, store it in the slot.
|
| {
|
| - FrameScope scope(masm, StackFrame::INTERNAL);
|
| + FrameAndConstantPoolScope scope(masm, StackFrame::INTERNAL);
|
|
|
| // Arguments register must be smi-tagged to call out.
|
| __ SmiTag(r0);
|
| @@ -3099,7 +3088,8 @@ static void GenerateRecordCallTarget(MacroAssembler* masm) {
|
| void CallFunctionStub::Generate(MacroAssembler* masm) {
|
| // r1 : the function to call
|
| // r2 : feedback vector
|
| - // r3 : (only if r2 is not undefined) slot in feedback vector (Smi)
|
| + // r3 : (only if r2 is not the megamorphic symbol) slot in feedback
|
| + // vector (Smi)
|
| Label slow, non_function, wrap, cont;
|
|
|
| if (NeedsChecks()) {
|
| @@ -3134,7 +3124,7 @@ void CallFunctionStub::Generate(MacroAssembler* masm) {
|
| __ b(ne, &cont);
|
| }
|
|
|
| - // Compute the receiver in non-strict mode.
|
| + // Compute the receiver in sloppy mode.
|
| __ ldr(r3, MemOperand(sp, argc_ * kPointerSize));
|
|
|
| if (NeedsChecks()) {
|
| @@ -3155,11 +3145,11 @@ void CallFunctionStub::Generate(MacroAssembler* masm) {
|
| if (RecordCallTarget()) {
|
| // If there is a call target cache, mark it megamorphic in the
|
| // non-function case. MegamorphicSentinel is an immortal immovable
|
| - // object (undefined) so no write barrier is needed.
|
| + // object (megamorphic symbol) so no write barrier is needed.
|
| ASSERT_EQ(*TypeFeedbackInfo::MegamorphicSentinel(masm->isolate()),
|
| - masm->isolate()->heap()->undefined_value());
|
| + masm->isolate()->heap()->megamorphic_symbol());
|
| __ add(r5, r2, Operand::PointerOffsetFromSmiKey(r3));
|
| - __ LoadRoot(ip, Heap::kUndefinedValueRootIndex);
|
| + __ LoadRoot(ip, Heap::kMegamorphicSymbolRootIndex);
|
| __ str(ip, FieldMemOperand(r5, FixedArray::kHeaderSize));
|
| }
|
| // Check for function proxy.
|
| @@ -3189,7 +3179,7 @@ void CallFunctionStub::Generate(MacroAssembler* masm) {
|
| if (CallAsMethod()) {
|
| __ bind(&wrap);
|
| // Wrap the receiver and patch it back onto the stack.
|
| - { FrameScope frame_scope(masm, StackFrame::INTERNAL);
|
| + { FrameAndConstantPoolScope frame_scope(masm, StackFrame::INTERNAL);
|
| __ Push(r1, r3);
|
| __ InvokeBuiltin(Builtins::TO_OBJECT, CALL_FUNCTION);
|
| __ pop(r1);
|
| @@ -3204,7 +3194,8 @@ void CallConstructStub::Generate(MacroAssembler* masm) {
|
| // r0 : number of arguments
|
| // r1 : the function to call
|
| // r2 : feedback vector
|
| - // r3 : (only if r2 is not undefined) slot in feedback vector (Smi)
|
| + // r3 : (only if r2 is not the megamorphic symbol) slot in feedback
|
| + // vector (Smi)
|
| Label slow, non_function_call;
|
|
|
| // Check that the function is not a smi.
|
| @@ -4473,7 +4464,7 @@ void ICCompareStub::GenerateMiss(MacroAssembler* masm) {
|
| ExternalReference miss =
|
| ExternalReference(IC_Utility(IC::kCompareIC_Miss), masm->isolate());
|
|
|
| - FrameScope scope(masm, StackFrame::INTERNAL);
|
| + FrameAndConstantPoolScope scope(masm, StackFrame::INTERNAL);
|
| __ Push(r1, r0);
|
| __ Push(lr, r1, r0);
|
| __ mov(ip, Operand(Smi::FromInt(op_)));
|
| @@ -4838,7 +4829,7 @@ void RecordWriteStub::GenerateIncremental(MacroAssembler* masm, Mode mode) {
|
| // remembered set.
|
| CheckNeedsToInformIncrementalMarker(
|
| masm, kUpdateRememberedSetOnNoNeedToInformIncrementalMarker, mode);
|
| - InformIncrementalMarker(masm, mode);
|
| + InformIncrementalMarker(masm);
|
| regs_.Restore(masm);
|
| __ RememberedSetHelper(object_,
|
| address_,
|
| @@ -4851,13 +4842,13 @@ void RecordWriteStub::GenerateIncremental(MacroAssembler* masm, Mode mode) {
|
|
|
| CheckNeedsToInformIncrementalMarker(
|
| masm, kReturnOnNoNeedToInformIncrementalMarker, mode);
|
| - InformIncrementalMarker(masm, mode);
|
| + InformIncrementalMarker(masm);
|
| regs_.Restore(masm);
|
| __ Ret();
|
| }
|
|
|
|
|
| -void RecordWriteStub::InformIncrementalMarker(MacroAssembler* masm, Mode mode) {
|
| +void RecordWriteStub::InformIncrementalMarker(MacroAssembler* masm) {
|
| regs_.SaveCallerSaveRegisters(masm, save_fp_regs_mode_);
|
| int argument_count = 3;
|
| __ PrepareCallCFunction(argument_count, regs_.scratch0());
|
| @@ -4871,18 +4862,10 @@ void RecordWriteStub::InformIncrementalMarker(MacroAssembler* masm, Mode mode) {
|
| __ mov(r2, Operand(ExternalReference::isolate_address(masm->isolate())));
|
|
|
| AllowExternalCallThatCantCauseGC scope(masm);
|
| - if (mode == INCREMENTAL_COMPACTION) {
|
| - __ CallCFunction(
|
| - ExternalReference::incremental_evacuation_record_write_function(
|
| - masm->isolate()),
|
| - argument_count);
|
| - } else {
|
| - ASSERT(mode == INCREMENTAL);
|
| - __ CallCFunction(
|
| - ExternalReference::incremental_marking_record_write_function(
|
| - masm->isolate()),
|
| - argument_count);
|
| - }
|
| + __ CallCFunction(
|
| + ExternalReference::incremental_marking_record_write_function(
|
| + masm->isolate()),
|
| + argument_count);
|
| regs_.RestoreCallerSaveRegisters(masm, save_fp_regs_mode_);
|
| }
|
|
|
| @@ -5297,11 +5280,15 @@ void ArrayConstructorStub::Generate(MacroAssembler* masm) {
|
| // ----------- S t a t e -------------
|
| // -- r0 : argc (only if argument_count_ == ANY)
|
| // -- r1 : constructor
|
| - // -- r2 : feedback vector (fixed array or undefined)
|
| + // -- r2 : feedback vector (fixed array or megamorphic symbol)
|
| // -- r3 : slot index (if r2 is fixed array)
|
| // -- sp[0] : return address
|
| // -- sp[4] : last argument
|
| // -----------------------------------
|
| +
|
| + ASSERT_EQ(*TypeFeedbackInfo::MegamorphicSentinel(masm->isolate()),
|
| + masm->isolate()->heap()->megamorphic_symbol());
|
| +
|
| if (FLAG_debug_code) {
|
| // The array construct code is only set for the global and natives
|
| // builtin Array functions which always have maps.
|
| @@ -5314,10 +5301,11 @@ void ArrayConstructorStub::Generate(MacroAssembler* masm) {
|
| __ CompareObjectType(r4, r4, r5, MAP_TYPE);
|
| __ Assert(eq, kUnexpectedInitialMapForArrayFunction);
|
|
|
| - // We should either have undefined in ebx or a valid fixed array.
|
| + // We should either have the megamorphic symbol in ebx or a valid
|
| + // fixed array.
|
| Label okay_here;
|
| Handle<Map> fixed_array_map = masm->isolate()->factory()->fixed_array_map();
|
| - __ CompareRoot(r2, Heap::kUndefinedValueRootIndex);
|
| + __ CompareRoot(r2, Heap::kMegamorphicSymbolRootIndex);
|
| __ b(eq, &okay_here);
|
| __ ldr(r4, FieldMemOperand(r2, 0));
|
| __ cmp(r4, Operand(fixed_array_map));
|
| @@ -5331,7 +5319,7 @@ void ArrayConstructorStub::Generate(MacroAssembler* masm) {
|
|
|
| Label no_info;
|
| // Get the elements kind and case on that.
|
| - __ CompareRoot(r2, Heap::kUndefinedValueRootIndex);
|
| + __ CompareRoot(r2, Heap::kMegamorphicSymbolRootIndex);
|
| __ b(eq, &no_info);
|
| __ add(r2, r2, Operand::PointerOffsetFromSmiKey(r3));
|
| __ ldr(r2, FieldMemOperand(r2, FixedArray::kHeaderSize));
|
| @@ -5498,7 +5486,7 @@ void CallApiFunctionStub::Generate(MacroAssembler* masm) {
|
| // it's not controlled by GC.
|
| const int kApiStackSpace = 4;
|
|
|
| - FrameScope frame_scope(masm, StackFrame::MANUAL);
|
| + FrameAndConstantPoolScope frame_scope(masm, StackFrame::MANUAL);
|
| __ EnterExitFrame(false, kApiStackSpace);
|
|
|
| ASSERT(!api_function_address.is(r0) && !scratch.is(r0));
|
| @@ -5558,7 +5546,7 @@ void CallApiGetterStub::Generate(MacroAssembler* masm) {
|
| __ add(r1, r0, Operand(1 * kPointerSize)); // r1 = PCA
|
|
|
| const int kApiStackSpace = 1;
|
| - FrameScope frame_scope(masm, StackFrame::MANUAL);
|
| + FrameAndConstantPoolScope frame_scope(masm, StackFrame::MANUAL);
|
| __ EnterExitFrame(false, kApiStackSpace);
|
|
|
| // Create PropertyAccessorInfo instance on the stack above the exit frame with
|
|
|