Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(356)

Side by Side Diff: src/ia32/stub-cache-ia32.cc

Issue 8399032: Handlify CompileConstructStub. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 9 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2011 the V8 project authors. All rights reserved. 1 // Copyright 2011 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 3061 matching lines...) Expand 10 before | Expand all | Expand 10 after
3072 __ bind(&miss); 3072 __ bind(&miss);
3073 GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC); 3073 GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC);
3074 3074
3075 // Return the generated code. 3075 // Return the generated code.
3076 return GetCode(NORMAL, factory()->empty_string(), MEGAMORPHIC); 3076 return GetCode(NORMAL, factory()->empty_string(), MEGAMORPHIC);
3077 } 3077 }
3078 3078
3079 3079
3080 // Specialized stub for constructing objects from functions which only have only 3080 // Specialized stub for constructing objects from functions which only have only
3081 // simple assignments of the form this.x = ...; in their body. 3081 // simple assignments of the form this.x = ...; in their body.
3082 MaybeObject* ConstructStubCompiler::CompileConstructStub(JSFunction* function) { 3082 Handle<Code> ConstructStubCompiler::CompileConstructStub(
3083 Handle<JSFunction> function) {
3083 // ----------- S t a t e ------------- 3084 // ----------- S t a t e -------------
3084 // -- eax : argc 3085 // -- eax : argc
3085 // -- edi : constructor 3086 // -- edi : constructor
3086 // -- esp[0] : return address 3087 // -- esp[0] : return address
3087 // -- esp[4] : last argument 3088 // -- esp[4] : last argument
3088 // ----------------------------------- 3089 // -----------------------------------
3089 Label generic_stub_call; 3090 Label generic_stub_call;
3090 #ifdef ENABLE_DEBUGGER_SUPPORT 3091 #ifdef ENABLE_DEBUGGER_SUPPORT
3091 // Check to see whether there are any break points in the function code. If 3092 // Check to see whether there are any break points in the function code. If
3092 // there are jump to the generic constructor stub which calls the actual 3093 // there are jump to the generic constructor stub which calls the actual
(...skipping 18 matching lines...) Expand all
3111 __ CmpInstanceType(ebx, JS_FUNCTION_TYPE); 3112 __ CmpInstanceType(ebx, JS_FUNCTION_TYPE);
3112 __ Assert(not_equal, "Function constructed by construct stub."); 3113 __ Assert(not_equal, "Function constructed by construct stub.");
3113 #endif 3114 #endif
3114 3115
3115 // Now allocate the JSObject on the heap by moving the new space allocation 3116 // Now allocate the JSObject on the heap by moving the new space allocation
3116 // top forward. 3117 // top forward.
3117 // edi: constructor 3118 // edi: constructor
3118 // ebx: initial map 3119 // ebx: initial map
3119 __ movzx_b(ecx, FieldOperand(ebx, Map::kInstanceSizeOffset)); 3120 __ movzx_b(ecx, FieldOperand(ebx, Map::kInstanceSizeOffset));
3120 __ shl(ecx, kPointerSizeLog2); 3121 __ shl(ecx, kPointerSizeLog2);
3121 __ AllocateInNewSpace(ecx, 3122 __ AllocateInNewSpace(ecx, edx, ecx, no_reg,
3122 edx, 3123 &generic_stub_call, NO_ALLOCATION_FLAGS);
3123 ecx,
3124 no_reg,
3125 &generic_stub_call,
3126 NO_ALLOCATION_FLAGS);
3127 3124
3128 // Allocated the JSObject, now initialize the fields and add the heap tag. 3125 // Allocated the JSObject, now initialize the fields and add the heap tag.
3129 // ebx: initial map 3126 // ebx: initial map
3130 // edx: JSObject (untagged) 3127 // edx: JSObject (untagged)
3131 __ mov(Operand(edx, JSObject::kMapOffset), ebx); 3128 __ mov(Operand(edx, JSObject::kMapOffset), ebx);
3132 __ mov(ebx, factory()->empty_fixed_array()); 3129 __ mov(ebx, factory()->empty_fixed_array());
3133 __ mov(Operand(edx, JSObject::kPropertiesOffset), ebx); 3130 __ mov(Operand(edx, JSObject::kPropertiesOffset), ebx);
3134 __ mov(Operand(edx, JSObject::kElementsOffset), ebx); 3131 __ mov(Operand(edx, JSObject::kElementsOffset), ebx);
3135 3132
3136 // Push the allocated object to the stack. This is the object that will be 3133 // Push the allocated object to the stack. This is the object that will be
(...skipping 10 matching lines...) Expand all
3147 3144
3148 // Use edi for holding undefined which is used in several places below. 3145 // Use edi for holding undefined which is used in several places below.
3149 __ mov(edi, factory()->undefined_value()); 3146 __ mov(edi, factory()->undefined_value());
3150 3147
3151 // eax: argc 3148 // eax: argc
3152 // ecx: first argument 3149 // ecx: first argument
3153 // edx: first in-object property of the JSObject 3150 // edx: first in-object property of the JSObject
3154 // edi: undefined 3151 // edi: undefined
3155 // Fill the initialized properties with a constant value or a passed argument 3152 // Fill the initialized properties with a constant value or a passed argument
3156 // depending on the this.x = ...; assignment in the function. 3153 // depending on the this.x = ...; assignment in the function.
3157 SharedFunctionInfo* shared = function->shared(); 3154 Handle<SharedFunctionInfo> shared(function->shared());
3158 for (int i = 0; i < shared->this_property_assignments_count(); i++) { 3155 for (int i = 0; i < shared->this_property_assignments_count(); i++) {
3159 if (shared->IsThisPropertyAssignmentArgument(i)) { 3156 if (shared->IsThisPropertyAssignmentArgument(i)) {
3160 // Check if the argument assigned to the property is actually passed. 3157 // Check if the argument assigned to the property is actually passed.
3161 // If argument is not passed the property is set to undefined, 3158 // If argument is not passed the property is set to undefined,
3162 // otherwise find it on the stack. 3159 // otherwise find it on the stack.
3163 int arg_number = shared->GetThisPropertyAssignmentArgument(i); 3160 int arg_number = shared->GetThisPropertyAssignmentArgument(i);
3164 __ mov(ebx, edi); 3161 __ mov(ebx, edi);
3165 __ cmp(eax, arg_number); 3162 __ cmp(eax, arg_number);
3166 if (CpuFeatures::IsSupported(CMOV)) { 3163 if (CpuFeatures::IsSupported(CMOV)) {
3167 CpuFeatures::Scope use_cmov(CMOV); 3164 CpuFeatures::Scope use_cmov(CMOV);
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
3199 __ lea(esp, Operand(esp, ebx, times_pointer_size, 1 * kPointerSize)); 3196 __ lea(esp, Operand(esp, ebx, times_pointer_size, 1 * kPointerSize));
3200 __ push(ecx); 3197 __ push(ecx);
3201 Counters* counters = isolate()->counters(); 3198 Counters* counters = isolate()->counters();
3202 __ IncrementCounter(counters->constructed_objects(), 1); 3199 __ IncrementCounter(counters->constructed_objects(), 1);
3203 __ IncrementCounter(counters->constructed_objects_stub(), 1); 3200 __ IncrementCounter(counters->constructed_objects_stub(), 1);
3204 __ ret(0); 3201 __ ret(0);
3205 3202
3206 // Jump to the generic stub in case the specialized code cannot handle the 3203 // Jump to the generic stub in case the specialized code cannot handle the
3207 // construction. 3204 // construction.
3208 __ bind(&generic_stub_call); 3205 __ bind(&generic_stub_call);
3209 Handle<Code> generic_construct_stub = 3206 Handle<Code> code = isolate()->builtins()->JSConstructStubGeneric();
3210 isolate()->builtins()->JSConstructStubGeneric(); 3207 __ jmp(code, RelocInfo::CODE_TARGET);
3211 __ jmp(generic_construct_stub, RelocInfo::CODE_TARGET);
3212 3208
3213 // Return the generated code. 3209 // Return the generated code.
3214 return GetCode(); 3210 return GetCode();
3215 } 3211 }
3216 3212
3217 3213
3218 #undef __ 3214 #undef __
3219 #define __ ACCESS_MASM(masm) 3215 #define __ ACCESS_MASM(masm)
3220 3216
3221 3217
(...skipping 633 matching lines...) Expand 10 before | Expand all | Expand 10 after
3855 Handle<Code> ic_miss = masm->isolate()->builtins()->KeyedStoreIC_Miss(); 3851 Handle<Code> ic_miss = masm->isolate()->builtins()->KeyedStoreIC_Miss();
3856 __ jmp(ic_miss, RelocInfo::CODE_TARGET); 3852 __ jmp(ic_miss, RelocInfo::CODE_TARGET);
3857 } 3853 }
3858 3854
3859 3855
3860 #undef __ 3856 #undef __
3861 3857
3862 } } // namespace v8::internal 3858 } } // namespace v8::internal
3863 3859
3864 #endif // V8_TARGET_ARCH_IA32 3860 #endif // V8_TARGET_ARCH_IA32
OLDNEW
« no previous file with comments | « src/arm/stub-cache-arm.cc ('k') | src/objects.h » ('j') | src/runtime.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698