Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(396)

Side by Side Diff: src/interpreter/bytecode-generator.cc

Issue 1413703007: [Interpreter] Fix a register allocation bug and add a DCHECK. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Rename function Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « src/interpreter/bytecode-array-builder.cc ('k') | test/cctest/interpreter/test-bytecode-generator.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698