OLD | NEW |
1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 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/interpreter/bytecode-generator.h" | 5 #include "src/interpreter/bytecode-generator.h" |
6 | 6 |
7 #include <stack> | 7 #include <stack> |
8 | 8 |
9 #include "src/compiler.h" | 9 #include "src/compiler.h" |
10 #include "src/objects.h" | 10 #include "src/objects.h" |
(...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
244 UNIMPLEMENTED(); | 244 UNIMPLEMENTED(); |
245 } | 245 } |
246 | 246 |
247 | 247 |
248 void BytecodeGenerator::VisitArrayLiteral(ArrayLiteral* expr) { | 248 void BytecodeGenerator::VisitArrayLiteral(ArrayLiteral* expr) { |
249 UNIMPLEMENTED(); | 249 UNIMPLEMENTED(); |
250 } | 250 } |
251 | 251 |
252 | 252 |
253 void BytecodeGenerator::VisitVariableProxy(VariableProxy* proxy) { | 253 void BytecodeGenerator::VisitVariableProxy(VariableProxy* proxy) { |
254 Variable* variable = proxy->var(); | 254 VisitVariableLoad(proxy->var()); |
| 255 } |
| 256 |
| 257 |
| 258 void BytecodeGenerator::VisitVariableLoad(Variable* variable) { |
255 switch (variable->location()) { | 259 switch (variable->location()) { |
256 case VariableLocation::LOCAL: { | 260 case VariableLocation::LOCAL: { |
257 Register source(variable->index()); | 261 Register source(variable->index()); |
258 builder().LoadAccumulatorWithRegister(source); | 262 builder().LoadAccumulatorWithRegister(source); |
259 break; | 263 break; |
260 } | 264 } |
261 case VariableLocation::PARAMETER: { | 265 case VariableLocation::PARAMETER: { |
262 // The parameter indices are shifted by 1 (receiver is variable | 266 // The parameter indices are shifted by 1 (receiver is variable |
263 // index -1 but is parameter index 0 in BytecodeArrayBuilder). | 267 // index -1 but is parameter index 0 in BytecodeArrayBuilder). |
264 Register source(builder().Parameter(variable->index() + 1)); | 268 Register source(builder().Parameter(variable->index() + 1)); |
265 builder().LoadAccumulatorWithRegister(source); | 269 builder().LoadAccumulatorWithRegister(source); |
266 break; | 270 break; |
267 } | 271 } |
268 case VariableLocation::GLOBAL: | 272 case VariableLocation::GLOBAL: { |
| 273 // Global var, const, or let variable. |
| 274 // TODO(rmcilroy): If context chain depth is short enough, do this using |
| 275 // a generic version of LoadGlobalViaContextStub rather than calling the |
| 276 // runtime. |
| 277 DCHECK(variable->IsStaticGlobalObjectProperty()); |
| 278 builder().LoadGlobal(variable->index()); |
| 279 break; |
| 280 } |
269 case VariableLocation::UNALLOCATED: | 281 case VariableLocation::UNALLOCATED: |
270 case VariableLocation::CONTEXT: | 282 case VariableLocation::CONTEXT: |
271 case VariableLocation::LOOKUP: | 283 case VariableLocation::LOOKUP: |
272 UNIMPLEMENTED(); | 284 UNIMPLEMENTED(); |
273 } | 285 } |
274 } | 286 } |
275 | 287 |
276 | 288 |
277 void BytecodeGenerator::VisitAssignment(Assignment* expr) { | 289 void BytecodeGenerator::VisitAssignment(Assignment* expr) { |
278 DCHECK(expr->target()->IsValidReferenceExpression()); | 290 DCHECK(expr->target()->IsValidReferenceExpression()); |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
396 if (property->IsSuperAccess()) { | 408 if (property->IsSuperAccess()) { |
397 UNIMPLEMENTED(); | 409 UNIMPLEMENTED(); |
398 } | 410 } |
399 Visit(property->obj()); | 411 Visit(property->obj()); |
400 builder().StoreAccumulatorInRegister(receiver); | 412 builder().StoreAccumulatorInRegister(receiver); |
401 // Perform a property load of the callee. | 413 // Perform a property load of the callee. |
402 VisitPropertyLoad(receiver, property); | 414 VisitPropertyLoad(receiver, property); |
403 builder().StoreAccumulatorInRegister(callee); | 415 builder().StoreAccumulatorInRegister(callee); |
404 break; | 416 break; |
405 } | 417 } |
406 case Call::GLOBAL_CALL: | 418 case Call::GLOBAL_CALL: { |
| 419 // Receiver is undefined for global calls. |
| 420 builder().LoadUndefined().StoreAccumulatorInRegister(receiver); |
| 421 // Load callee as a global variable. |
| 422 VariableProxy* proxy = callee_expr->AsVariableProxy(); |
| 423 VisitVariableLoad(proxy->var()); |
| 424 builder().StoreAccumulatorInRegister(callee); |
| 425 break; |
| 426 } |
407 case Call::LOOKUP_SLOT_CALL: | 427 case Call::LOOKUP_SLOT_CALL: |
408 case Call::SUPER_CALL: | 428 case Call::SUPER_CALL: |
409 case Call::POSSIBLY_EVAL_CALL: | 429 case Call::POSSIBLY_EVAL_CALL: |
410 case Call::OTHER_CALL: | 430 case Call::OTHER_CALL: |
411 UNIMPLEMENTED(); | 431 UNIMPLEMENTED(); |
412 } | 432 } |
413 | 433 |
414 // Evaluate all arguments to the function call and store in sequential | 434 // Evaluate all arguments to the function call and store in sequential |
415 // registers. | 435 // registers. |
416 ZoneList<Expression*>* args = expr->arguments(); | 436 ZoneList<Expression*>* args = expr->arguments(); |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
506 } | 526 } |
507 | 527 |
508 | 528 |
509 int BytecodeGenerator::feedback_index(FeedbackVectorICSlot slot) const { | 529 int BytecodeGenerator::feedback_index(FeedbackVectorICSlot slot) const { |
510 return info()->feedback_vector()->GetIndex(slot); | 530 return info()->feedback_vector()->GetIndex(slot); |
511 } | 531 } |
512 | 532 |
513 } // namespace interpreter | 533 } // namespace interpreter |
514 } // namespace internal | 534 } // namespace internal |
515 } // namespace v8 | 535 } // namespace v8 |
OLD | NEW |