| OLD | NEW | 
|     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 #include "src/v8.h" |     5 #include "src/v8.h" | 
|     6  |     6  | 
|     7 #if V8_TARGET_ARCH_ARM |     7 #if V8_TARGET_ARCH_ARM | 
|     8  |     8  | 
|     9 #include "src/code-factory.h" |     9 #include "src/code-factory.h" | 
|    10 #include "src/code-stubs.h" |    10 #include "src/code-stubs.h" | 
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   119 #ifdef DEBUG |   119 #ifdef DEBUG | 
|   120   if (strlen(FLAG_stop_at) > 0 && |   120   if (strlen(FLAG_stop_at) > 0 && | 
|   121       info->function()->name()->IsUtf8EqualTo(CStrVector(FLAG_stop_at))) { |   121       info->function()->name()->IsUtf8EqualTo(CStrVector(FLAG_stop_at))) { | 
|   122     __ stop("stop-at"); |   122     __ stop("stop-at"); | 
|   123   } |   123   } | 
|   124 #endif |   124 #endif | 
|   125  |   125  | 
|   126   // Sloppy mode functions and builtins need to replace the receiver with the |   126   // Sloppy mode functions and builtins need to replace the receiver with the | 
|   127   // global proxy when called as functions (without an explicit receiver |   127   // global proxy when called as functions (without an explicit receiver | 
|   128   // object). |   128   // object). | 
|   129   if (is_sloppy(info->language_mode()) && !info->is_native()) { |   129   if (is_sloppy(info->language_mode()) && !info->is_native() && | 
 |   130       info->scope()->has_this_declaration()) { | 
|   130     Label ok; |   131     Label ok; | 
|   131     int receiver_offset = info->scope()->num_parameters() * kPointerSize; |   132     int receiver_offset = info->scope()->num_parameters() * kPointerSize; | 
|   132     __ ldr(r2, MemOperand(sp, receiver_offset)); |   133     __ ldr(r2, MemOperand(sp, receiver_offset)); | 
|   133     __ CompareRoot(r2, Heap::kUndefinedValueRootIndex); |   134     __ CompareRoot(r2, Heap::kUndefinedValueRootIndex); | 
|   134     __ b(ne, &ok); |   135     __ b(ne, &ok); | 
|   135  |   136  | 
|   136     __ ldr(r2, GlobalObjectOperand()); |   137     __ ldr(r2, GlobalObjectOperand()); | 
|   137     __ ldr(r2, FieldMemOperand(r2, GlobalObject::kGlobalProxyOffset)); |   138     __ ldr(r2, FieldMemOperand(r2, GlobalObject::kGlobalProxyOffset)); | 
|   138  |   139  | 
|   139     __ str(r2, MemOperand(sp, receiver_offset)); |   140     __ str(r2, MemOperand(sp, receiver_offset)); | 
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   208       __ push(r1); |   209       __ push(r1); | 
|   209       __ CallRuntime(Runtime::kNewFunctionContext, 1); |   210       __ CallRuntime(Runtime::kNewFunctionContext, 1); | 
|   210     } |   211     } | 
|   211     function_in_register = false; |   212     function_in_register = false; | 
|   212     // Context is returned in r0.  It replaces the context passed to us. |   213     // Context is returned in r0.  It replaces the context passed to us. | 
|   213     // It's saved in the stack and kept live in cp. |   214     // It's saved in the stack and kept live in cp. | 
|   214     __ mov(cp, r0); |   215     __ mov(cp, r0); | 
|   215     __ str(r0, MemOperand(fp, StandardFrameConstants::kContextOffset)); |   216     __ str(r0, MemOperand(fp, StandardFrameConstants::kContextOffset)); | 
|   216     // Copy any necessary parameters into the context. |   217     // Copy any necessary parameters into the context. | 
|   217     int num_parameters = info->scope()->num_parameters(); |   218     int num_parameters = info->scope()->num_parameters(); | 
|   218     for (int i = 0; i < num_parameters; i++) { |   219     int first_parameter = info->scope()->has_this_declaration() ? -1 : 0; | 
|   219       Variable* var = scope()->parameter(i); |   220     for (int i = first_parameter; i < num_parameters; i++) { | 
 |   221       Variable* var = (i == -1) ? scope()->receiver() : scope()->parameter(i); | 
|   220       if (var->IsContextSlot()) { |   222       if (var->IsContextSlot()) { | 
|   221         int parameter_offset = StandardFrameConstants::kCallerSPOffset + |   223         int parameter_offset = StandardFrameConstants::kCallerSPOffset + | 
|   222             (num_parameters - 1 - i) * kPointerSize; |   224             (num_parameters - 1 - i) * kPointerSize; | 
|   223         // Load parameter from stack. |   225         // Load parameter from stack. | 
|   224         __ ldr(r0, MemOperand(fp, parameter_offset)); |   226         __ ldr(r0, MemOperand(fp, parameter_offset)); | 
|   225         // Store it in the context. |   227         // Store it in the context. | 
|   226         MemOperand target = ContextOperand(cp, var->index()); |   228         MemOperand target = ContextOperand(cp, var->index()); | 
|   227         __ str(r0, target); |   229         __ str(r0, target); | 
|   228  |   230  | 
|   229         // Update the write barrier. |   231         // Update the write barrier. | 
| (...skipping 2860 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  3090   if (arg_count > 0) { |  3092   if (arg_count > 0) { | 
|  3091     __ ldr(r5, MemOperand(sp, arg_count * kPointerSize)); |  3093     __ ldr(r5, MemOperand(sp, arg_count * kPointerSize)); | 
|  3092   } else { |  3094   } else { | 
|  3093     __ LoadRoot(r5, Heap::kUndefinedValueRootIndex); |  3095     __ LoadRoot(r5, Heap::kUndefinedValueRootIndex); | 
|  3094   } |  3096   } | 
|  3095  |  3097  | 
|  3096   // r4: the receiver of the enclosing function. |  3098   // r4: the receiver of the enclosing function. | 
|  3097   __ ldr(r4, MemOperand(fp, JavaScriptFrameConstants::kFunctionOffset)); |  3099   __ ldr(r4, MemOperand(fp, JavaScriptFrameConstants::kFunctionOffset)); | 
|  3098  |  3100  | 
|  3099   // r3: the receiver of the enclosing function. |  3101   // r3: the receiver of the enclosing function. | 
|  3100   int receiver_offset = 2 + info_->scope()->num_parameters(); |  3102   Variable* this_var = scope()->LookupThis(); | 
|  3101   __ ldr(r3, MemOperand(fp, receiver_offset * kPointerSize)); |  3103   DCHECK_NOT_NULL(this_var); | 
 |  3104   __ ldr(r3, VarOperand(this_var, r3)); | 
|  3102  |  3105  | 
|  3103   // r2: language mode. |  3106   // r2: language mode. | 
|  3104   __ mov(r2, Operand(Smi::FromInt(language_mode()))); |  3107   __ mov(r2, Operand(Smi::FromInt(language_mode()))); | 
|  3105  |  3108  | 
|  3106   // r1: the start position of the scope the calls resides in. |  3109   // r1: the start position of the scope the calls resides in. | 
|  3107   __ mov(r1, Operand(Smi::FromInt(scope()->start_position()))); |  3110   __ mov(r1, Operand(Smi::FromInt(scope()->start_position()))); | 
|  3108  |  3111  | 
|  3109   // Do the runtime call. |  3112   // Do the runtime call. | 
|  3110   __ Push(r5); |  3113   __ Push(r5); | 
|  3111   __ Push(r4, r3, r2, r1); |  3114   __ Push(r4, r3, r2, r1); | 
| (...skipping 2424 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  5536  |  5539  | 
|  5537   DCHECK(interrupt_address == |  5540   DCHECK(interrupt_address == | 
|  5538          isolate->builtins()->OsrAfterStackCheck()->entry()); |  5541          isolate->builtins()->OsrAfterStackCheck()->entry()); | 
|  5539   return OSR_AFTER_STACK_CHECK; |  5542   return OSR_AFTER_STACK_CHECK; | 
|  5540 } |  5543 } | 
|  5541  |  5544  | 
|  5542  |  5545  | 
|  5543 } }  // namespace v8::internal |  5546 } }  // namespace v8::internal | 
|  5544  |  5547  | 
|  5545 #endif  // V8_TARGET_ARCH_ARM |  5548 #endif  // V8_TARGET_ARCH_ARM | 
| OLD | NEW |