| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 3073 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3084 | 3084 |
| 3085 __ bind(&miss); | 3085 __ bind(&miss); |
| 3086 TailCallBuiltin(masm(), MissBuiltin(kind())); | 3086 TailCallBuiltin(masm(), MissBuiltin(kind())); |
| 3087 | 3087 |
| 3088 // Return the generated code. | 3088 // Return the generated code. |
| 3089 return GetICCode( | 3089 return GetICCode( |
| 3090 kind(), Code::NORMAL, factory()->empty_string(), POLYMORPHIC); | 3090 kind(), Code::NORMAL, factory()->empty_string(), POLYMORPHIC); |
| 3091 } | 3091 } |
| 3092 | 3092 |
| 3093 | 3093 |
| 3094 Handle<Code> ConstructStubCompiler::CompileConstructStub( | |
| 3095 Handle<JSFunction> function) { | |
| 3096 // ----------- S t a t e ------------- | |
| 3097 // -- r0 : argc | |
| 3098 // -- r1 : constructor | |
| 3099 // -- lr : return address | |
| 3100 // -- [sp] : last argument | |
| 3101 // ----------------------------------- | |
| 3102 Label generic_stub_call; | |
| 3103 | |
| 3104 // Use r7 for holding undefined which is used in several places below. | |
| 3105 __ LoadRoot(r7, Heap::kUndefinedValueRootIndex); | |
| 3106 | |
| 3107 #ifdef ENABLE_DEBUGGER_SUPPORT | |
| 3108 // Check to see whether there are any break points in the function code. If | |
| 3109 // there are jump to the generic constructor stub which calls the actual | |
| 3110 // code for the function thereby hitting the break points. | |
| 3111 __ ldr(r2, FieldMemOperand(r1, JSFunction::kSharedFunctionInfoOffset)); | |
| 3112 __ ldr(r2, FieldMemOperand(r2, SharedFunctionInfo::kDebugInfoOffset)); | |
| 3113 __ cmp(r2, r7); | |
| 3114 __ b(ne, &generic_stub_call); | |
| 3115 #endif | |
| 3116 | |
| 3117 // Load the initial map and verify that it is in fact a map. | |
| 3118 // r1: constructor function | |
| 3119 // r7: undefined | |
| 3120 __ ldr(r2, FieldMemOperand(r1, JSFunction::kPrototypeOrInitialMapOffset)); | |
| 3121 __ JumpIfSmi(r2, &generic_stub_call); | |
| 3122 __ CompareObjectType(r2, r3, r4, MAP_TYPE); | |
| 3123 __ b(ne, &generic_stub_call); | |
| 3124 | |
| 3125 #ifdef DEBUG | |
| 3126 // Cannot construct functions this way. | |
| 3127 // r0: argc | |
| 3128 // r1: constructor function | |
| 3129 // r2: initial map | |
| 3130 // r7: undefined | |
| 3131 __ CompareInstanceType(r2, r3, JS_FUNCTION_TYPE); | |
| 3132 __ Check(ne, "Function constructed by construct stub."); | |
| 3133 #endif | |
| 3134 | |
| 3135 // Now allocate the JSObject in new space. | |
| 3136 // r0: argc | |
| 3137 // r1: constructor function | |
| 3138 // r2: initial map | |
| 3139 // r7: undefined | |
| 3140 ASSERT(function->has_initial_map()); | |
| 3141 __ ldrb(r3, FieldMemOperand(r2, Map::kInstanceSizeOffset)); | |
| 3142 #ifdef DEBUG | |
| 3143 int instance_size = function->initial_map()->instance_size(); | |
| 3144 __ cmp(r3, Operand(instance_size >> kPointerSizeLog2)); | |
| 3145 __ Check(eq, "Instance size of initial map changed."); | |
| 3146 #endif | |
| 3147 __ Allocate(r3, r4, r5, r6, &generic_stub_call, SIZE_IN_WORDS); | |
| 3148 | |
| 3149 // Allocated the JSObject, now initialize the fields. Map is set to initial | |
| 3150 // map and properties and elements are set to empty fixed array. | |
| 3151 // r0: argc | |
| 3152 // r1: constructor function | |
| 3153 // r2: initial map | |
| 3154 // r3: object size (in words) | |
| 3155 // r4: JSObject (not tagged) | |
| 3156 // r7: undefined | |
| 3157 __ LoadRoot(r6, Heap::kEmptyFixedArrayRootIndex); | |
| 3158 __ mov(r5, r4); | |
| 3159 ASSERT_EQ(0 * kPointerSize, JSObject::kMapOffset); | |
| 3160 __ str(r2, MemOperand(r5, kPointerSize, PostIndex)); | |
| 3161 ASSERT_EQ(1 * kPointerSize, JSObject::kPropertiesOffset); | |
| 3162 __ str(r6, MemOperand(r5, kPointerSize, PostIndex)); | |
| 3163 ASSERT_EQ(2 * kPointerSize, JSObject::kElementsOffset); | |
| 3164 __ str(r6, MemOperand(r5, kPointerSize, PostIndex)); | |
| 3165 | |
| 3166 // Calculate the location of the first argument. The stack contains only the | |
| 3167 // argc arguments. | |
| 3168 __ add(r1, sp, Operand(r0, LSL, kPointerSizeLog2)); | |
| 3169 | |
| 3170 // Fill all the in-object properties with undefined. | |
| 3171 // r0: argc | |
| 3172 // r1: first argument | |
| 3173 // r3: object size (in words) | |
| 3174 // r4: JSObject (not tagged) | |
| 3175 // r5: First in-object property of JSObject (not tagged) | |
| 3176 // r7: undefined | |
| 3177 // Fill the initialized properties with a constant value or a passed argument | |
| 3178 // depending on the this.x = ...; assignment in the function. | |
| 3179 Handle<SharedFunctionInfo> shared(function->shared()); | |
| 3180 for (int i = 0; i < shared->this_property_assignments_count(); i++) { | |
| 3181 if (shared->IsThisPropertyAssignmentArgument(i)) { | |
| 3182 Label not_passed, next; | |
| 3183 // Check if the argument assigned to the property is actually passed. | |
| 3184 int arg_number = shared->GetThisPropertyAssignmentArgument(i); | |
| 3185 __ cmp(r0, Operand(arg_number)); | |
| 3186 __ b(le, ¬_passed); | |
| 3187 // Argument passed - find it on the stack. | |
| 3188 __ ldr(r2, MemOperand(r1, (arg_number + 1) * -kPointerSize)); | |
| 3189 __ str(r2, MemOperand(r5, kPointerSize, PostIndex)); | |
| 3190 __ b(&next); | |
| 3191 __ bind(¬_passed); | |
| 3192 // Set the property to undefined. | |
| 3193 __ str(r7, MemOperand(r5, kPointerSize, PostIndex)); | |
| 3194 __ bind(&next); | |
| 3195 } else { | |
| 3196 // Set the property to the constant value. | |
| 3197 Handle<Object> constant(shared->GetThisPropertyAssignmentConstant(i), | |
| 3198 isolate()); | |
| 3199 __ mov(r2, Operand(constant)); | |
| 3200 __ str(r2, MemOperand(r5, kPointerSize, PostIndex)); | |
| 3201 } | |
| 3202 } | |
| 3203 | |
| 3204 // Fill the unused in-object property fields with undefined. | |
| 3205 for (int i = shared->this_property_assignments_count(); | |
| 3206 i < function->initial_map()->inobject_properties(); | |
| 3207 i++) { | |
| 3208 __ str(r7, MemOperand(r5, kPointerSize, PostIndex)); | |
| 3209 } | |
| 3210 | |
| 3211 // r0: argc | |
| 3212 // r4: JSObject (not tagged) | |
| 3213 // Move argc to r1 and the JSObject to return to r0 and tag it. | |
| 3214 __ mov(r1, r0); | |
| 3215 __ mov(r0, r4); | |
| 3216 __ orr(r0, r0, Operand(kHeapObjectTag)); | |
| 3217 | |
| 3218 // r0: JSObject | |
| 3219 // r1: argc | |
| 3220 // Remove caller arguments and receiver from the stack and return. | |
| 3221 __ add(sp, sp, Operand(r1, LSL, kPointerSizeLog2)); | |
| 3222 __ add(sp, sp, Operand(kPointerSize)); | |
| 3223 Counters* counters = isolate()->counters(); | |
| 3224 __ IncrementCounter(counters->constructed_objects(), 1, r1, r2); | |
| 3225 __ IncrementCounter(counters->constructed_objects_stub(), 1, r1, r2); | |
| 3226 __ Jump(lr); | |
| 3227 | |
| 3228 // Jump to the generic stub in case the specialized code cannot handle the | |
| 3229 // construction. | |
| 3230 __ bind(&generic_stub_call); | |
| 3231 Handle<Code> code = isolate()->builtins()->JSConstructStubGeneric(); | |
| 3232 __ Jump(code, RelocInfo::CODE_TARGET); | |
| 3233 | |
| 3234 // Return the generated code. | |
| 3235 return GetCode(); | |
| 3236 } | |
| 3237 | |
| 3238 | |
| 3239 #undef __ | 3094 #undef __ |
| 3240 #define __ ACCESS_MASM(masm) | 3095 #define __ ACCESS_MASM(masm) |
| 3241 | 3096 |
| 3242 | 3097 |
| 3243 void KeyedLoadStubCompiler::GenerateLoadDictionaryElement( | 3098 void KeyedLoadStubCompiler::GenerateLoadDictionaryElement( |
| 3244 MacroAssembler* masm) { | 3099 MacroAssembler* masm) { |
| 3245 // ---------- S t a t e -------------- | 3100 // ---------- S t a t e -------------- |
| 3246 // -- lr : return address | 3101 // -- lr : return address |
| 3247 // -- r0 : key | 3102 // -- r0 : key |
| 3248 // -- r1 : receiver | 3103 // -- r1 : receiver |
| (...skipping 533 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3782 TailCallBuiltin(masm, Builtins::kKeyedStoreIC_Slow); | 3637 TailCallBuiltin(masm, Builtins::kKeyedStoreIC_Slow); |
| 3783 } | 3638 } |
| 3784 } | 3639 } |
| 3785 | 3640 |
| 3786 | 3641 |
| 3787 #undef __ | 3642 #undef __ |
| 3788 | 3643 |
| 3789 } } // namespace v8::internal | 3644 } } // namespace v8::internal |
| 3790 | 3645 |
| 3791 #endif // V8_TARGET_ARCH_ARM | 3646 #endif // V8_TARGET_ARCH_ARM |
| OLD | NEW |