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_X64 | 7 #if V8_TARGET_ARCH_X64 |
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 195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
206 __ movp(rsi, rax); | 206 __ movp(rsi, rax); |
207 __ movp(Operand(rbp, StandardFrameConstants::kContextOffset), rax); | 207 __ movp(Operand(rbp, StandardFrameConstants::kContextOffset), rax); |
208 | 208 |
209 // Copy any necessary parameters into the context. | 209 // Copy any necessary parameters into the context. |
210 int num_parameters = info->scope()->num_parameters(); | 210 int num_parameters = info->scope()->num_parameters(); |
211 for (int i = 0; i < num_parameters; i++) { | 211 for (int i = 0; i < num_parameters; i++) { |
212 Variable* var = scope()->parameter(i); | 212 Variable* var = scope()->parameter(i); |
213 if (var->IsContextSlot()) { | 213 if (var->IsContextSlot()) { |
214 int parameter_offset = StandardFrameConstants::kCallerSPOffset + | 214 int parameter_offset = StandardFrameConstants::kCallerSPOffset + |
215 (num_parameters - 1 - i) * kPointerSize; | 215 (num_parameters - 1 - i) * kPointerSize; |
216 | |
Dmitry Lomov (no reviews)
2015/02/11 00:30:50
Stray edit
caitp (gmail)
2015/02/11 21:05:54
Fixed.
| |
216 // Load parameter from stack. | 217 // Load parameter from stack. |
217 __ movp(rax, Operand(rbp, parameter_offset)); | 218 __ movp(rax, Operand(rbp, parameter_offset)); |
218 // Store it in the context. | 219 // Store it in the context. |
219 int context_offset = Context::SlotOffset(var->index()); | 220 int context_offset = Context::SlotOffset(var->index()); |
220 __ movp(Operand(rsi, context_offset), rax); | 221 __ movp(Operand(rsi, context_offset), rax); |
221 // Update the write barrier. This clobbers rax and rbx. | 222 // Update the write barrier. This clobbers rax and rbx. |
222 if (need_write_barrier) { | 223 if (need_write_barrier) { |
223 __ RecordWriteContextSlot( | 224 __ RecordWriteContextSlot( |
224 rsi, context_offset, rax, rbx, kDontSaveFPRegs); | 225 rsi, context_offset, rax, rbx, kDontSaveFPRegs); |
225 } else if (FLAG_debug_code) { | 226 } else if (FLAG_debug_code) { |
226 Label done; | 227 Label done; |
227 __ JumpIfInNewSpace(rsi, rax, &done, Label::kNear); | 228 __ JumpIfInNewSpace(rsi, rax, &done, Label::kNear); |
228 __ Abort(kExpectedNewSpaceObject); | 229 __ Abort(kExpectedNewSpaceObject); |
229 __ bind(&done); | 230 __ bind(&done); |
230 } | 231 } |
231 } | 232 } |
232 } | 233 } |
233 } | 234 } |
234 | 235 |
236 // Possibly allocate RestParameters | |
237 int rest_index; | |
238 Variable* rest_param = scope()->rest_parameter(&rest_index); | |
239 if (rest_param) { | |
240 Comment cmnt(masm_, "[ Allocate rest parameter array"); | |
241 | |
242 int num_parameters = info->scope()->num_parameters(); | |
243 int offset = num_parameters * kPointerSize; | |
244 __ leap(rdx, | |
245 Operand(rbp, StandardFrameConstants::kCallerSPOffset + offset)); | |
246 __ Push(rdx); | |
247 __ Push(Smi::FromInt(num_parameters)); | |
248 __ Push(Smi::FromInt(rest_index)); | |
249 | |
250 RestParamAccessStub stub(isolate()); | |
251 __ CallStub(&stub); | |
252 | |
253 SetVar(rest_param, rax, rbx, rdx); | |
254 } | |
255 | |
235 // Possibly allocate an arguments object. | 256 // Possibly allocate an arguments object. |
236 Variable* arguments = scope()->arguments(); | 257 Variable* arguments = scope()->arguments(); |
237 if (arguments != NULL) { | 258 if (arguments != NULL) { |
238 // Arguments object must be allocated after the context object, in | 259 // Arguments object must be allocated after the context object, in |
239 // case the "arguments" or ".arguments" variables are in the context. | 260 // case the "arguments" or ".arguments" variables are in the context. |
240 Comment cmnt(masm_, "[ Allocate arguments object"); | 261 Comment cmnt(masm_, "[ Allocate arguments object"); |
241 if (function_in_register) { | 262 if (function_in_register) { |
242 __ Push(rdi); | 263 __ Push(rdi); |
243 } else { | 264 } else { |
244 __ Push(Operand(rbp, JavaScriptFrameConstants::kFunctionOffset)); | 265 __ Push(Operand(rbp, JavaScriptFrameConstants::kFunctionOffset)); |
245 } | 266 } |
246 // The receiver is just before the parameters on the caller's stack. | 267 // The receiver is just before the parameters on the caller's stack. |
247 int num_parameters = info->scope()->num_parameters(); | 268 int num_parameters = info->scope()->num_parameters(); |
248 int offset = num_parameters * kPointerSize; | 269 int offset = num_parameters * kPointerSize; |
249 __ leap(rdx, | 270 __ leap(rdx, |
250 Operand(rbp, StandardFrameConstants::kCallerSPOffset + offset)); | 271 Operand(rbp, StandardFrameConstants::kCallerSPOffset + offset)); |
251 __ Push(rdx); | 272 __ Push(rdx); |
252 __ Push(Smi::FromInt(num_parameters)); | 273 __ Push(Smi::FromInt(num_parameters)); |
253 // Arguments to ArgumentsAccessStub: | 274 // Arguments to ArgumentsAccessStub: |
254 // function, receiver address, parameter count. | 275 // function, receiver address, parameter count. |
255 // The stub will rewrite receiver and parameter count if the previous | 276 // The stub will rewrite receiver and parameter count if the previous |
256 // stack frame was an arguments adapter frame. | 277 // stack frame was an arguments adapter frame. |
257 ArgumentsAccessStub::Type type; | 278 ArgumentsAccessStub::Type type; |
258 if (is_strict(language_mode())) { | 279 if (is_strict(language_mode()) || !is_simple_parameter_list()) { |
259 type = ArgumentsAccessStub::NEW_STRICT; | 280 type = ArgumentsAccessStub::NEW_STRICT; |
260 } else if (function()->has_duplicate_parameters()) { | 281 } else if (function()->has_duplicate_parameters()) { |
261 type = ArgumentsAccessStub::NEW_SLOPPY_SLOW; | 282 type = ArgumentsAccessStub::NEW_SLOPPY_SLOW; |
262 } else { | 283 } else { |
263 type = ArgumentsAccessStub::NEW_SLOPPY_FAST; | 284 type = ArgumentsAccessStub::NEW_SLOPPY_FAST; |
264 } | 285 } |
265 ArgumentsAccessStub stub(isolate(), type); | 286 ArgumentsAccessStub stub(isolate(), type); |
266 __ CallStub(&stub); | 287 __ CallStub(&stub); |
267 | 288 |
268 SetVar(arguments, rax, rbx, rdx); | 289 SetVar(arguments, rax, rbx, rdx); |
(...skipping 5046 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
5315 DCHECK_EQ(isolate->builtins()->OsrAfterStackCheck()->entry(), | 5336 DCHECK_EQ(isolate->builtins()->OsrAfterStackCheck()->entry(), |
5316 Assembler::target_address_at(call_target_address, | 5337 Assembler::target_address_at(call_target_address, |
5317 unoptimized_code)); | 5338 unoptimized_code)); |
5318 return OSR_AFTER_STACK_CHECK; | 5339 return OSR_AFTER_STACK_CHECK; |
5319 } | 5340 } |
5320 | 5341 |
5321 | 5342 |
5322 } } // namespace v8::internal | 5343 } } // namespace v8::internal |
5323 | 5344 |
5324 #endif // V8_TARGET_ARCH_X64 | 5345 #endif // V8_TARGET_ARCH_X64 |
OLD | NEW |