| 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 3040 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3051 __ cmp(ebp, 0); | 3051 __ cmp(ebp, 0); |
| 3052 __ j(equal, &skip, not_taken); | 3052 __ j(equal, &skip, not_taken); |
| 3053 __ mov(esi, Operand(ebp, StandardFrameConstants::kContextOffset)); | 3053 __ mov(esi, Operand(ebp, StandardFrameConstants::kContextOffset)); |
| 3054 __ bind(&skip); | 3054 __ bind(&skip); |
| 3055 | 3055 |
| 3056 STATIC_ASSERT(StackHandlerConstants::kPCOffset == 3 * kPointerSize); | 3056 STATIC_ASSERT(StackHandlerConstants::kPCOffset == 3 * kPointerSize); |
| 3057 __ ret(0); | 3057 __ ret(0); |
| 3058 } | 3058 } |
| 3059 | 3059 |
| 3060 | 3060 |
| 3061 // If true, a Handle<T> passed by value is passed and returned by | |
| 3062 // using the location_ field directly. If false, it is passed and | |
| 3063 // returned as a pointer to a handle. | |
| 3064 #ifdef USING_BSD_ABI | |
| 3065 static const bool kPassHandlesDirectly = true; | |
| 3066 #else | |
| 3067 static const bool kPassHandlesDirectly = false; | |
| 3068 #endif | |
| 3069 | |
| 3070 | |
| 3071 void ApiGetterEntryStub::Generate(MacroAssembler* masm) { | 3061 void ApiGetterEntryStub::Generate(MacroAssembler* masm) { |
| 3072 Label empty_handle; | 3062 __ PrepareCallApiFunction(kStackSpace, kArgc); |
| 3073 Label prologue; | 3063 STATIC_ASSERT(kArgc == 2); |
| 3074 Label promote_scheduled_exception; | 3064 __ mov(ApiParameterOperand(0), ebx); // name. |
| 3075 __ EnterApiExitFrame(kStackSpace, kArgc); | 3065 __ mov(ApiParameterOperand(1), eax); // arguments pointer. |
| 3076 STATIC_ASSERT(kArgc == 4); | 3066 __ CallApiFunctionAndReturn(fun(), kArgc); |
| 3077 if (kPassHandlesDirectly) { | |
| 3078 // When handles as passed directly we don't have to allocate extra | |
| 3079 // space for and pass an out parameter. | |
| 3080 __ mov(Operand(esp, 0 * kPointerSize), ebx); // name. | |
| 3081 __ mov(Operand(esp, 1 * kPointerSize), eax); // arguments pointer. | |
| 3082 } else { | |
| 3083 // The function expects three arguments to be passed but we allocate | |
| 3084 // four to get space for the output cell. The argument slots are filled | |
| 3085 // as follows: | |
| 3086 // | |
| 3087 // 3: output cell | |
| 3088 // 2: arguments pointer | |
| 3089 // 1: name | |
| 3090 // 0: pointer to the output cell | |
| 3091 // | |
| 3092 // Note that this is one more "argument" than the function expects | |
| 3093 // so the out cell will have to be popped explicitly after returning | |
| 3094 // from the function. | |
| 3095 __ mov(Operand(esp, 1 * kPointerSize), ebx); // name. | |
| 3096 __ mov(Operand(esp, 2 * kPointerSize), eax); // arguments pointer. | |
| 3097 __ mov(ebx, esp); | |
| 3098 __ add(Operand(ebx), Immediate(3 * kPointerSize)); | |
| 3099 __ mov(Operand(esp, 0 * kPointerSize), ebx); // output | |
| 3100 __ mov(Operand(esp, 3 * kPointerSize), Immediate(0)); // out cell. | |
| 3101 } | |
| 3102 // Call the api function! | |
| 3103 __ call(fun()->address(), RelocInfo::RUNTIME_ENTRY); | |
| 3104 // Check if the function scheduled an exception. | |
| 3105 ExternalReference scheduled_exception_address = | |
| 3106 ExternalReference::scheduled_exception_address(); | |
| 3107 __ cmp(Operand::StaticVariable(scheduled_exception_address), | |
| 3108 Immediate(Factory::the_hole_value())); | |
| 3109 __ j(not_equal, &promote_scheduled_exception, not_taken); | |
| 3110 if (!kPassHandlesDirectly) { | |
| 3111 // The returned value is a pointer to the handle holding the result. | |
| 3112 // Dereference this to get to the location. | |
| 3113 __ mov(eax, Operand(eax, 0)); | |
| 3114 } | |
| 3115 // Check if the result handle holds 0. | |
| 3116 __ test(eax, Operand(eax)); | |
| 3117 __ j(zero, &empty_handle, not_taken); | |
| 3118 // It was non-zero. Dereference to get the result value. | |
| 3119 __ mov(eax, Operand(eax, 0)); | |
| 3120 __ bind(&prologue); | |
| 3121 __ LeaveExitFrame(); | |
| 3122 __ ret(0); | |
| 3123 __ bind(&promote_scheduled_exception); | |
| 3124 __ TailCallRuntime(Runtime::kPromoteScheduledException, 0, 1); | |
| 3125 __ bind(&empty_handle); | |
| 3126 // It was zero; the result is undefined. | |
| 3127 __ mov(eax, Factory::undefined_value()); | |
| 3128 __ jmp(&prologue); | |
| 3129 } | 3067 } |
| 3130 | 3068 |
| 3131 | 3069 |
| 3132 void CEntryStub::GenerateCore(MacroAssembler* masm, | 3070 void CEntryStub::GenerateCore(MacroAssembler* masm, |
| 3133 Label* throw_normal_exception, | 3071 Label* throw_normal_exception, |
| 3134 Label* throw_termination_exception, | 3072 Label* throw_termination_exception, |
| 3135 Label* throw_out_of_memory_exception, | 3073 Label* throw_out_of_memory_exception, |
| 3136 bool do_gc, | 3074 bool do_gc, |
| 3137 bool always_allocate_scope, | 3075 bool always_allocate_scope, |
| 3138 int /* alignment_skew */) { | 3076 int /* alignment_skew */) { |
| (...skipping 1502 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4641 // tagged as a small integer. | 4579 // tagged as a small integer. |
| 4642 __ bind(&runtime); | 4580 __ bind(&runtime); |
| 4643 __ TailCallRuntime(Runtime::kStringCompare, 2, 1); | 4581 __ TailCallRuntime(Runtime::kStringCompare, 2, 1); |
| 4644 } | 4582 } |
| 4645 | 4583 |
| 4646 #undef __ | 4584 #undef __ |
| 4647 | 4585 |
| 4648 } } // namespace v8::internal | 4586 } } // namespace v8::internal |
| 4649 | 4587 |
| 4650 #endif // V8_TARGET_ARCH_IA32 | 4588 #endif // V8_TARGET_ARCH_IA32 |
| OLD | NEW |