OLD | NEW |
1 // Copyright 2010 the V8 project authors. All rights reserved. | 1 // Copyright 2010 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 9055 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9066 // Slow-case: Non-function called. | 9066 // Slow-case: Non-function called. |
9067 __ bind(&slow); | 9067 __ bind(&slow); |
9068 __ Set(eax, Immediate(argc_)); | 9068 __ Set(eax, Immediate(argc_)); |
9069 __ Set(ebx, Immediate(0)); | 9069 __ Set(ebx, Immediate(0)); |
9070 __ GetBuiltinEntry(edx, Builtins::CALL_NON_FUNCTION); | 9070 __ GetBuiltinEntry(edx, Builtins::CALL_NON_FUNCTION); |
9071 Handle<Code> adaptor(Builtins::builtin(Builtins::ArgumentsAdaptorTrampoline)); | 9071 Handle<Code> adaptor(Builtins::builtin(Builtins::ArgumentsAdaptorTrampoline)); |
9072 __ jmp(adaptor, RelocInfo::CODE_TARGET); | 9072 __ jmp(adaptor, RelocInfo::CODE_TARGET); |
9073 } | 9073 } |
9074 | 9074 |
9075 | 9075 |
9076 int CEntryStub::MinorKey() { | |
9077 ASSERT(result_size_ <= 2); | |
9078 // Result returned in eax, or eax+edx if result_size_ is 2. | |
9079 return 0; | |
9080 } | |
9081 | |
9082 | |
9083 void CEntryStub::GenerateThrowTOS(MacroAssembler* masm) { | 9076 void CEntryStub::GenerateThrowTOS(MacroAssembler* masm) { |
9084 // eax holds the exception. | 9077 // eax holds the exception. |
9085 | 9078 |
9086 // Adjust this code if not the case. | 9079 // Adjust this code if not the case. |
9087 ASSERT(StackHandlerConstants::kSize == 4 * kPointerSize); | 9080 ASSERT(StackHandlerConstants::kSize == 4 * kPointerSize); |
9088 | 9081 |
9089 // Drop the sp to the top of the handler. | 9082 // Drop the sp to the top of the handler. |
9090 ExternalReference handler_address(Top::k_handler_address); | 9083 ExternalReference handler_address(Top::k_handler_address); |
9091 __ mov(esp, Operand::StaticVariable(handler_address)); | 9084 __ mov(esp, Operand::StaticVariable(handler_address)); |
9092 | 9085 |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9182 __ TailCallRuntime(ExternalReference(Runtime::kPromoteScheduledException), | 9175 __ TailCallRuntime(ExternalReference(Runtime::kPromoteScheduledException), |
9183 0, | 9176 0, |
9184 1); | 9177 1); |
9185 } | 9178 } |
9186 | 9179 |
9187 | 9180 |
9188 void CEntryStub::GenerateCore(MacroAssembler* masm, | 9181 void CEntryStub::GenerateCore(MacroAssembler* masm, |
9189 Label* throw_normal_exception, | 9182 Label* throw_normal_exception, |
9190 Label* throw_termination_exception, | 9183 Label* throw_termination_exception, |
9191 Label* throw_out_of_memory_exception, | 9184 Label* throw_out_of_memory_exception, |
9192 ExitFrame::Mode mode, | |
9193 bool do_gc, | 9185 bool do_gc, |
9194 bool always_allocate_scope) { | 9186 bool always_allocate_scope) { |
9195 // eax: result parameter for PerformGC, if any | 9187 // eax: result parameter for PerformGC, if any |
9196 // ebx: pointer to C function (C callee-saved) | 9188 // ebx: pointer to C function (C callee-saved) |
9197 // ebp: frame pointer (restored after C call) | 9189 // ebp: frame pointer (restored after C call) |
9198 // esp: stack pointer (restored after C call) | 9190 // esp: stack pointer (restored after C call) |
9199 // edi: number of arguments including receiver (C callee-saved) | 9191 // edi: number of arguments including receiver (C callee-saved) |
9200 // esi: pointer to the first argument (C callee-saved) | 9192 // esi: pointer to the first argument (C callee-saved) |
9201 | 9193 |
| 9194 // Result returned in eax, or eax+edx if result_size_ is 2. |
| 9195 |
9202 if (do_gc) { | 9196 if (do_gc) { |
9203 __ mov(Operand(esp, 0 * kPointerSize), eax); // Result. | 9197 __ mov(Operand(esp, 0 * kPointerSize), eax); // Result. |
9204 __ call(FUNCTION_ADDR(Runtime::PerformGC), RelocInfo::RUNTIME_ENTRY); | 9198 __ call(FUNCTION_ADDR(Runtime::PerformGC), RelocInfo::RUNTIME_ENTRY); |
9205 } | 9199 } |
9206 | 9200 |
9207 ExternalReference scope_depth = | 9201 ExternalReference scope_depth = |
9208 ExternalReference::heap_always_allocate_scope_depth(); | 9202 ExternalReference::heap_always_allocate_scope_depth(); |
9209 if (always_allocate_scope) { | 9203 if (always_allocate_scope) { |
9210 __ inc(Operand::StaticVariable(scope_depth)); | 9204 __ inc(Operand::StaticVariable(scope_depth)); |
9211 } | 9205 } |
(...skipping 20 matching lines...) Expand all Loading... |
9232 | 9226 |
9233 // Check for failure result. | 9227 // Check for failure result. |
9234 Label failure_returned; | 9228 Label failure_returned; |
9235 ASSERT(((kFailureTag + 1) & kFailureTagMask) == 0); | 9229 ASSERT(((kFailureTag + 1) & kFailureTagMask) == 0); |
9236 __ lea(ecx, Operand(eax, 1)); | 9230 __ lea(ecx, Operand(eax, 1)); |
9237 // Lower 2 bits of ecx are 0 iff eax has failure tag. | 9231 // Lower 2 bits of ecx are 0 iff eax has failure tag. |
9238 __ test(ecx, Immediate(kFailureTagMask)); | 9232 __ test(ecx, Immediate(kFailureTagMask)); |
9239 __ j(zero, &failure_returned, not_taken); | 9233 __ j(zero, &failure_returned, not_taken); |
9240 | 9234 |
9241 // Exit the JavaScript to C++ exit frame. | 9235 // Exit the JavaScript to C++ exit frame. |
9242 __ LeaveExitFrame(mode); | 9236 __ LeaveExitFrame(mode_); |
9243 __ ret(0); | 9237 __ ret(0); |
9244 | 9238 |
9245 // Handling of failure. | 9239 // Handling of failure. |
9246 __ bind(&failure_returned); | 9240 __ bind(&failure_returned); |
9247 | 9241 |
9248 Label retry; | 9242 Label retry; |
9249 // If the returned exception is RETRY_AFTER_GC continue at retry label | 9243 // If the returned exception is RETRY_AFTER_GC continue at retry label |
9250 ASSERT(Failure::RETRY_AFTER_GC == 0); | 9244 ASSERT(Failure::RETRY_AFTER_GC == 0); |
9251 __ test(eax, Immediate(((1 << kFailureTypeTagSize) - 1) << kFailureTagSize)); | 9245 __ test(eax, Immediate(((1 << kFailureTypeTagSize) - 1) << kFailureTagSize)); |
9252 __ j(zero, &retry, taken); | 9246 __ j(zero, &retry, taken); |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9319 // Restore fp from handler and discard handler state. | 9313 // Restore fp from handler and discard handler state. |
9320 ASSERT(StackHandlerConstants::kFPOffset == 1 * kPointerSize); | 9314 ASSERT(StackHandlerConstants::kFPOffset == 1 * kPointerSize); |
9321 __ pop(ebp); | 9315 __ pop(ebp); |
9322 __ pop(edx); // State. | 9316 __ pop(edx); // State. |
9323 | 9317 |
9324 ASSERT(StackHandlerConstants::kPCOffset == 3 * kPointerSize); | 9318 ASSERT(StackHandlerConstants::kPCOffset == 3 * kPointerSize); |
9325 __ ret(0); | 9319 __ ret(0); |
9326 } | 9320 } |
9327 | 9321 |
9328 | 9322 |
9329 void CEntryStub::GenerateBody(MacroAssembler* masm, bool is_debug_break) { | 9323 void CEntryStub::Generate(MacroAssembler* masm) { |
9330 // eax: number of arguments including receiver | 9324 // eax: number of arguments including receiver |
9331 // ebx: pointer to C function (C callee-saved) | 9325 // ebx: pointer to C function (C callee-saved) |
9332 // ebp: frame pointer (restored after C call) | 9326 // ebp: frame pointer (restored after C call) |
9333 // esp: stack pointer (restored after C call) | 9327 // esp: stack pointer (restored after C call) |
9334 // esi: current context (C callee-saved) | 9328 // esi: current context (C callee-saved) |
9335 // edi: JS function of the caller (C callee-saved) | 9329 // edi: JS function of the caller (C callee-saved) |
9336 | 9330 |
9337 // NOTE: Invocations of builtins may return failure objects instead | 9331 // NOTE: Invocations of builtins may return failure objects instead |
9338 // of a proper result. The builtin entry handles this by performing | 9332 // of a proper result. The builtin entry handles this by performing |
9339 // a garbage collection and retrying the builtin (twice). | 9333 // a garbage collection and retrying the builtin (twice). |
9340 | 9334 |
9341 ExitFrame::Mode mode = is_debug_break | |
9342 ? ExitFrame::MODE_DEBUG | |
9343 : ExitFrame::MODE_NORMAL; | |
9344 | |
9345 // Enter the exit frame that transitions from JavaScript to C++. | 9335 // Enter the exit frame that transitions from JavaScript to C++. |
9346 __ EnterExitFrame(mode); | 9336 __ EnterExitFrame(mode_); |
9347 | 9337 |
9348 // eax: result parameter for PerformGC, if any (setup below) | 9338 // eax: result parameter for PerformGC, if any (setup below) |
9349 // ebx: pointer to builtin function (C callee-saved) | 9339 // ebx: pointer to builtin function (C callee-saved) |
9350 // ebp: frame pointer (restored after C call) | 9340 // ebp: frame pointer (restored after C call) |
9351 // esp: stack pointer (restored after C call) | 9341 // esp: stack pointer (restored after C call) |
9352 // edi: number of arguments including receiver (C callee-saved) | 9342 // edi: number of arguments including receiver (C callee-saved) |
9353 // esi: argv pointer (C callee-saved) | 9343 // esi: argv pointer (C callee-saved) |
9354 | 9344 |
9355 Label throw_normal_exception; | 9345 Label throw_normal_exception; |
9356 Label throw_termination_exception; | 9346 Label throw_termination_exception; |
9357 Label throw_out_of_memory_exception; | 9347 Label throw_out_of_memory_exception; |
9358 | 9348 |
9359 // Call into the runtime system. | 9349 // Call into the runtime system. |
9360 GenerateCore(masm, | 9350 GenerateCore(masm, |
9361 &throw_normal_exception, | 9351 &throw_normal_exception, |
9362 &throw_termination_exception, | 9352 &throw_termination_exception, |
9363 &throw_out_of_memory_exception, | 9353 &throw_out_of_memory_exception, |
9364 mode, | |
9365 false, | 9354 false, |
9366 false); | 9355 false); |
9367 | 9356 |
9368 // Do space-specific GC and retry runtime call. | 9357 // Do space-specific GC and retry runtime call. |
9369 GenerateCore(masm, | 9358 GenerateCore(masm, |
9370 &throw_normal_exception, | 9359 &throw_normal_exception, |
9371 &throw_termination_exception, | 9360 &throw_termination_exception, |
9372 &throw_out_of_memory_exception, | 9361 &throw_out_of_memory_exception, |
9373 mode, | |
9374 true, | 9362 true, |
9375 false); | 9363 false); |
9376 | 9364 |
9377 // Do full GC and retry runtime call one final time. | 9365 // Do full GC and retry runtime call one final time. |
9378 Failure* failure = Failure::InternalError(); | 9366 Failure* failure = Failure::InternalError(); |
9379 __ mov(eax, Immediate(reinterpret_cast<int32_t>(failure))); | 9367 __ mov(eax, Immediate(reinterpret_cast<int32_t>(failure))); |
9380 GenerateCore(masm, | 9368 GenerateCore(masm, |
9381 &throw_normal_exception, | 9369 &throw_normal_exception, |
9382 &throw_termination_exception, | 9370 &throw_termination_exception, |
9383 &throw_out_of_memory_exception, | 9371 &throw_out_of_memory_exception, |
9384 mode, | |
9385 true, | 9372 true, |
9386 true); | 9373 true); |
9387 | 9374 |
9388 __ bind(&throw_out_of_memory_exception); | 9375 __ bind(&throw_out_of_memory_exception); |
9389 GenerateThrowUncatchable(masm, OUT_OF_MEMORY); | 9376 GenerateThrowUncatchable(masm, OUT_OF_MEMORY); |
9390 | 9377 |
9391 __ bind(&throw_termination_exception); | 9378 __ bind(&throw_termination_exception); |
9392 GenerateThrowUncatchable(masm, TERMINATION); | 9379 GenerateThrowUncatchable(masm, TERMINATION); |
9393 | 9380 |
9394 __ bind(&throw_normal_exception); | 9381 __ bind(&throw_normal_exception); |
(...skipping 708 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10103 | 10090 |
10104 // Call the runtime; it returns -1 (less), 0 (equal), or 1 (greater) | 10091 // Call the runtime; it returns -1 (less), 0 (equal), or 1 (greater) |
10105 // tagged as a small integer. | 10092 // tagged as a small integer. |
10106 __ bind(&runtime); | 10093 __ bind(&runtime); |
10107 __ TailCallRuntime(ExternalReference(Runtime::kStringCompare), 2, 1); | 10094 __ TailCallRuntime(ExternalReference(Runtime::kStringCompare), 2, 1); |
10108 } | 10095 } |
10109 | 10096 |
10110 #undef __ | 10097 #undef __ |
10111 | 10098 |
10112 } } // namespace v8::internal | 10099 } } // namespace v8::internal |
OLD | NEW |