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

Side by Side Diff: src/ia32/code-stubs-ia32.cc

Issue 1335723002: [stubs] Simplify the non-function case of CallConstructStub. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Address Michi's comment. Created 5 years, 3 months 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
« no previous file with comments | « src/full-codegen/x64/full-codegen-x64.cc ('k') | src/mips/code-stubs-mips.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #if V8_TARGET_ARCH_IA32 5 #if V8_TARGET_ARCH_IA32
6 6
7 #include "src/base/bits.h" 7 #include "src/base/bits.h"
8 #include "src/bootstrapper.h" 8 #include "src/bootstrapper.h"
9 #include "src/code-stubs.h" 9 #include "src/code-stubs.h"
10 #include "src/codegen.h" 10 #include "src/codegen.h"
(...skipping 2160 matching lines...) Expand 10 before | Expand all | Expand 10 after
2171 __ mov(jmp_reg, FieldOperand(edi, JSFunction::kSharedFunctionInfoOffset)); 2171 __ mov(jmp_reg, FieldOperand(edi, JSFunction::kSharedFunctionInfoOffset));
2172 __ mov(jmp_reg, FieldOperand(jmp_reg, 2172 __ mov(jmp_reg, FieldOperand(jmp_reg,
2173 SharedFunctionInfo::kConstructStubOffset)); 2173 SharedFunctionInfo::kConstructStubOffset));
2174 __ lea(jmp_reg, FieldOperand(jmp_reg, Code::kHeaderSize)); 2174 __ lea(jmp_reg, FieldOperand(jmp_reg, Code::kHeaderSize));
2175 __ jmp(jmp_reg); 2175 __ jmp(jmp_reg);
2176 2176
2177 // edi: called object 2177 // edi: called object
2178 // eax: number of arguments 2178 // eax: number of arguments
2179 // ecx: object map 2179 // ecx: object map
2180 // esp[0]: original receiver (for IsSuperConstructorCall) 2180 // esp[0]: original receiver (for IsSuperConstructorCall)
2181 Label do_call;
2182 __ bind(&slow); 2181 __ bind(&slow);
2183 __ CmpInstanceType(ecx, JS_FUNCTION_PROXY_TYPE); 2182 {
2184 __ j(not_equal, &non_function_call); 2183 __ CmpInstanceType(ecx, JS_FUNCTION_PROXY_TYPE);
2185 __ GetBuiltinEntry(edx, 2184 __ j(not_equal, &non_function_call, Label::kNear);
2186 Context::CALL_FUNCTION_PROXY_AS_CONSTRUCTOR_BUILTIN_INDEX); 2185 if (IsSuperConstructorCall()) __ Drop(1);
2187 __ jmp(&do_call); 2186 // TODO(neis): This doesn't match the ES6 spec for [[Construct]] on proxies.
2187 __ mov(edi, FieldOperand(edi, JSFunctionProxy::kConstructTrapOffset));
2188 __ Jump(isolate()->builtins()->Call(), RelocInfo::CODE_TARGET);
2188 2189
2189 __ bind(&non_function_call); 2190 __ bind(&non_function_call);
2190 __ GetBuiltinEntry(edx, 2191 if (IsSuperConstructorCall()) __ Drop(1);
2191 Context::CALL_NON_FUNCTION_AS_CONSTRUCTOR_BUILTIN_INDEX); 2192 {
2192 __ bind(&do_call); 2193 // Determine the delegate for the target (if any).
2193 if (IsSuperConstructorCall()) { 2194 FrameScope scope(masm, StackFrame::INTERNAL);
2194 __ Drop(1); 2195 __ SmiTag(eax);
2196 __ Push(eax);
2197 __ Push(edi);
2198 __ CallRuntime(Runtime::kGetConstructorDelegate, 1);
2199 __ mov(edi, eax);
2200 __ Pop(eax);
2201 __ SmiUntag(eax);
2202 }
2203 // The delegate is always a regular function.
2204 __ AssertFunction(edi);
2205 __ Jump(isolate()->builtins()->CallFunction(), RelocInfo::CODE_TARGET);
2195 } 2206 }
2196 // Set expected number of arguments to zero (not changing eax).
2197 __ Move(ebx, Immediate(0));
2198 Handle<Code> arguments_adaptor =
2199 isolate()->builtins()->ArgumentsAdaptorTrampoline();
2200 __ jmp(arguments_adaptor, RelocInfo::CODE_TARGET);
2201 } 2207 }
2202 2208
2203 2209
2204 static void EmitLoadTypeFeedbackVector(MacroAssembler* masm, Register vector) { 2210 static void EmitLoadTypeFeedbackVector(MacroAssembler* masm, Register vector) {
2205 __ mov(vector, Operand(ebp, JavaScriptFrameConstants::kFunctionOffset)); 2211 __ mov(vector, Operand(ebp, JavaScriptFrameConstants::kFunctionOffset));
2206 __ mov(vector, FieldOperand(vector, JSFunction::kSharedFunctionInfoOffset)); 2212 __ mov(vector, FieldOperand(vector, JSFunction::kSharedFunctionInfoOffset));
2207 __ mov(vector, FieldOperand(vector, 2213 __ mov(vector, FieldOperand(vector,
2208 SharedFunctionInfo::kFeedbackVectorOffset)); 2214 SharedFunctionInfo::kFeedbackVectorOffset));
2209 } 2215 }
2210 2216
(...skipping 3589 matching lines...) Expand 10 before | Expand all | Expand 10 after
5800 Operand(ebp, 7 * kPointerSize), NULL); 5806 Operand(ebp, 7 * kPointerSize), NULL);
5801 } 5807 }
5802 5808
5803 5809
5804 #undef __ 5810 #undef __
5805 5811
5806 } // namespace internal 5812 } // namespace internal
5807 } // namespace v8 5813 } // namespace v8
5808 5814
5809 #endif // V8_TARGET_ARCH_IA32 5815 #endif // V8_TARGET_ARCH_IA32
OLDNEW
« no previous file with comments | « src/full-codegen/x64/full-codegen-x64.cc ('k') | src/mips/code-stubs-mips.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698