| 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 "src/compiler.h" | 7 #include "src/compiler.h" |
| 8 #include "src/interpreter/control-flow-builders.h" | 8 #include "src/interpreter/control-flow-builders.h" |
| 9 #include "src/objects.h" | 9 #include "src/objects.h" |
| 10 #include "src/parser.h" | 10 #include "src/parser.h" |
| (...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 186 } | 186 } |
| 187 | 187 |
| 188 protected: | 188 protected: |
| 189 void set_result_identified() { | 189 void set_result_identified() { |
| 190 DCHECK(!result_identified()); | 190 DCHECK(!result_identified()); |
| 191 result_identified_ = true; | 191 result_identified_ = true; |
| 192 } | 192 } |
| 193 | 193 |
| 194 bool result_identified() const { return result_identified_; } | 194 bool result_identified() const { return result_identified_; } |
| 195 | 195 |
| 196 const TemporaryRegisterScope* allocator() const { return &allocator_; } |
| 197 |
| 196 private: | 198 private: |
| 197 BytecodeGenerator* generator_; | 199 BytecodeGenerator* generator_; |
| 198 Expression::Context kind_; | 200 Expression::Context kind_; |
| 199 ExpressionResultScope* outer_; | 201 ExpressionResultScope* outer_; |
| 200 TemporaryRegisterScope allocator_; | 202 TemporaryRegisterScope allocator_; |
| 201 bool result_identified_; | 203 bool result_identified_; |
| 202 | 204 |
| 203 DISALLOW_COPY_AND_ASSIGN(ExpressionResultScope); | 205 DISALLOW_COPY_AND_ASSIGN(ExpressionResultScope); |
| 204 }; | 206 }; |
| 205 | 207 |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 245 : ExpressionResultScope(generator, Expression::kValue) {} | 247 : ExpressionResultScope(generator, Expression::kValue) {} |
| 246 | 248 |
| 247 virtual void SetResultInAccumulator() { | 249 virtual void SetResultInAccumulator() { |
| 248 result_register_ = outer()->NewRegister(); | 250 result_register_ = outer()->NewRegister(); |
| 249 builder()->StoreAccumulatorInRegister(result_register_); | 251 builder()->StoreAccumulatorInRegister(result_register_); |
| 250 set_result_identified(); | 252 set_result_identified(); |
| 251 } | 253 } |
| 252 | 254 |
| 253 virtual void SetResultInRegister(Register reg) { | 255 virtual void SetResultInRegister(Register reg) { |
| 254 DCHECK(builder()->RegisterIsParameterOrLocal(reg) || | 256 DCHECK(builder()->RegisterIsParameterOrLocal(reg) || |
| 255 builder()->RegisterIsTemporary(reg)); | 257 (builder()->RegisterIsTemporary(reg) && |
| 258 !allocator()->RegisterIsAllocatedInThisScope(reg))); |
| 256 result_register_ = reg; | 259 result_register_ = reg; |
| 257 set_result_identified(); | 260 set_result_identified(); |
| 258 } | 261 } |
| 259 | 262 |
| 260 Register ResultRegister() const { return result_register_; } | 263 Register ResultRegister() const { return result_register_; } |
| 261 | 264 |
| 262 private: | 265 private: |
| 263 Register result_register_; | 266 Register result_register_; |
| 264 }; | 267 }; |
| 265 | 268 |
| (...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 468 builder()->LoadLiteral(Smi::FromInt(encoded_flags)); | 471 builder()->LoadLiteral(Smi::FromInt(encoded_flags)); |
| 469 builder()->StoreAccumulatorInRegister(flags); | 472 builder()->StoreAccumulatorInRegister(flags); |
| 470 DCHECK(flags.index() == pairs.index() + 1); | 473 DCHECK(flags.index() == pairs.index() + 1); |
| 471 | 474 |
| 472 builder()->CallRuntime(Runtime::kDeclareGlobals, pairs, 2); | 475 builder()->CallRuntime(Runtime::kDeclareGlobals, pairs, 2); |
| 473 globals()->clear(); | 476 globals()->clear(); |
| 474 } | 477 } |
| 475 | 478 |
| 476 | 479 |
| 477 void BytecodeGenerator::VisitExpressionStatement(ExpressionStatement* stmt) { | 480 void BytecodeGenerator::VisitExpressionStatement(ExpressionStatement* stmt) { |
| 481 // TODO(rmcilroy): Replace this with a StatementResultScope when it exists. |
| 482 EffectResultScope effect_scope(this); |
| 478 VisitForEffect(stmt->expression()); | 483 VisitForEffect(stmt->expression()); |
| 479 } | 484 } |
| 480 | 485 |
| 481 | 486 |
| 482 void BytecodeGenerator::VisitEmptyStatement(EmptyStatement* stmt) { | 487 void BytecodeGenerator::VisitEmptyStatement(EmptyStatement* stmt) { |
| 483 } | 488 } |
| 484 | 489 |
| 485 | 490 |
| 486 void BytecodeGenerator::VisitIfStatement(IfStatement* stmt) { | 491 void BytecodeGenerator::VisitIfStatement(IfStatement* stmt) { |
| 487 // TODO(oth): Spot easy cases where there code would not need to | 492 // TODO(oth): Spot easy cases where there code would not need to |
| (...skipping 27 matching lines...) Expand all Loading... |
| 515 execution_control()->Continue(stmt->target()); | 520 execution_control()->Continue(stmt->target()); |
| 516 } | 521 } |
| 517 | 522 |
| 518 | 523 |
| 519 void BytecodeGenerator::VisitBreakStatement(BreakStatement* stmt) { | 524 void BytecodeGenerator::VisitBreakStatement(BreakStatement* stmt) { |
| 520 execution_control()->Break(stmt->target()); | 525 execution_control()->Break(stmt->target()); |
| 521 } | 526 } |
| 522 | 527 |
| 523 | 528 |
| 524 void BytecodeGenerator::VisitReturnStatement(ReturnStatement* stmt) { | 529 void BytecodeGenerator::VisitReturnStatement(ReturnStatement* stmt) { |
| 530 EffectResultScope effect_scope(this); |
| 525 VisitForAccumulatorValue(stmt->expression()); | 531 VisitForAccumulatorValue(stmt->expression()); |
| 526 builder()->Return(); | 532 builder()->Return(); |
| 527 } | 533 } |
| 528 | 534 |
| 529 | 535 |
| 530 void BytecodeGenerator::VisitWithStatement(WithStatement* stmt) { | 536 void BytecodeGenerator::VisitWithStatement(WithStatement* stmt) { |
| 531 UNIMPLEMENTED(); | 537 UNIMPLEMENTED(); |
| 532 } | 538 } |
| 533 | 539 |
| 534 | 540 |
| (...skipping 942 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1477 UNIMPLEMENTED(); | 1483 UNIMPLEMENTED(); |
| 1478 } | 1484 } |
| 1479 | 1485 |
| 1480 // Convert old value into a number. | 1486 // Convert old value into a number. |
| 1481 if (!is_strong(language_mode())) { | 1487 if (!is_strong(language_mode())) { |
| 1482 builder()->CastAccumulatorToNumber(); | 1488 builder()->CastAccumulatorToNumber(); |
| 1483 } | 1489 } |
| 1484 | 1490 |
| 1485 // Save result for postfix expressions. | 1491 // Save result for postfix expressions. |
| 1486 if (is_postfix) { | 1492 if (is_postfix) { |
| 1487 old_value = execution_result()->NewRegister(); | 1493 old_value = execution_result()->outer()->NewRegister(); |
| 1488 builder()->StoreAccumulatorInRegister(old_value); | 1494 builder()->StoreAccumulatorInRegister(old_value); |
| 1489 } | 1495 } |
| 1490 | 1496 |
| 1491 // Perform +1/-1 operation. | 1497 // Perform +1/-1 operation. |
| 1492 builder()->CountOperation(expr->binary_op(), language_mode_strength()); | 1498 builder()->CountOperation(expr->binary_op(), language_mode_strength()); |
| 1493 | 1499 |
| 1494 // Store the value. | 1500 // Store the value. |
| 1495 FeedbackVectorSlot feedback_slot = expr->CountSlot(); | 1501 FeedbackVectorSlot feedback_slot = expr->CountSlot(); |
| 1496 switch (assign_type) { | 1502 switch (assign_type) { |
| 1497 case VARIABLE: { | 1503 case VARIABLE: { |
| (...skipping 382 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1880 } | 1886 } |
| 1881 | 1887 |
| 1882 | 1888 |
| 1883 int BytecodeGenerator::feedback_index(FeedbackVectorSlot slot) const { | 1889 int BytecodeGenerator::feedback_index(FeedbackVectorSlot slot) const { |
| 1884 return info()->feedback_vector()->GetIndex(slot); | 1890 return info()->feedback_vector()->GetIndex(slot); |
| 1885 } | 1891 } |
| 1886 | 1892 |
| 1887 } // namespace interpreter | 1893 } // namespace interpreter |
| 1888 } // namespace internal | 1894 } // namespace internal |
| 1889 } // namespace v8 | 1895 } // namespace v8 |
| OLD | NEW |