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

Side by Side Diff: src/interpreter/bytecode-array-builder.cc

Issue 1379793004: [Interpreter] Add support for new local function context creation. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@int_decl
Patch Set: Fix ia32 Created 5 years, 2 months 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-array-builder.h" 5 #include "src/interpreter/bytecode-array-builder.h"
6 6
7 namespace v8 { 7 namespace v8 {
8 namespace internal { 8 namespace internal {
9 namespace interpreter { 9 namespace interpreter {
10 10
11 BytecodeArrayBuilder::BytecodeArrayBuilder(Isolate* isolate, Zone* zone) 11 BytecodeArrayBuilder::BytecodeArrayBuilder(Isolate* isolate, Zone* zone)
12 : isolate_(isolate), 12 : isolate_(isolate),
13 zone_(zone), 13 zone_(zone),
14 bytecodes_(zone), 14 bytecodes_(zone),
15 bytecode_generated_(false), 15 bytecode_generated_(false),
16 last_block_end_(0), 16 last_block_end_(0),
17 last_bytecode_start_(~0), 17 last_bytecode_start_(~0),
18 return_seen_in_block_(false), 18 return_seen_in_block_(false),
19 constants_map_(isolate->heap(), zone), 19 constants_map_(isolate->heap(), zone),
20 constants_(zone), 20 constants_(zone),
21 parameter_count_(-1), 21 parameter_count_(-1),
22 local_register_count_(-1), 22 local_register_count_(-1),
23 context_register_count_(-1),
23 temporary_register_count_(0), 24 temporary_register_count_(0),
24 temporary_register_next_(0) {} 25 temporary_register_next_(0) {}
25 26
26 27
27 void BytecodeArrayBuilder::set_locals_count(int number_of_locals) { 28 void BytecodeArrayBuilder::set_locals_count(int number_of_locals) {
28 local_register_count_ = number_of_locals; 29 local_register_count_ = number_of_locals;
30 DCHECK_LE(context_register_count_, 0);
29 temporary_register_next_ = local_register_count_; 31 temporary_register_next_ = local_register_count_;
30 } 32 }
31 33
32 34
33 int BytecodeArrayBuilder::locals_count() const { return local_register_count_; } 35 int BytecodeArrayBuilder::locals_count() const { return local_register_count_; }
34 36
35 37
36 void BytecodeArrayBuilder::set_parameter_count(int number_of_parameters) { 38 void BytecodeArrayBuilder::set_parameter_count(int number_of_parameters) {
37 parameter_count_ = number_of_parameters; 39 parameter_count_ = number_of_parameters;
38 } 40 }
39 41
40 42
41 int BytecodeArrayBuilder::parameter_count() const { return parameter_count_; } 43 int BytecodeArrayBuilder::parameter_count() const { return parameter_count_; }
42 44
43 45
44 Register BytecodeArrayBuilder::Parameter(int parameter_index) { 46 void BytecodeArrayBuilder::set_context_count(int number_of_contexts) {
47 context_register_count_ = number_of_contexts;
48 DCHECK_GE(local_register_count_, 0);
49 temporary_register_next_ = local_register_count_ + context_register_count_;
50 }
51
52
53 Register BytecodeArrayBuilder::first_context_register() const {
54 DCHECK_GT(context_register_count_, 0);
55 return Register(local_register_count_);
56 }
57
58
59 Register BytecodeArrayBuilder::last_context_register() const {
60 DCHECK_GT(context_register_count_, 0);
61 return Register(local_register_count_ + context_register_count_ - 1);
62 }
63
Michael Starzinger 2015/10/13 09:38:43 nit: Two empty newlines.
rmcilroy 2015/10/13 10:35:22 Done.
64 Register BytecodeArrayBuilder::Parameter(int parameter_index) const {
45 DCHECK_GE(parameter_index, 0); 65 DCHECK_GE(parameter_index, 0);
46 DCHECK_LT(parameter_index, parameter_count_); 66 DCHECK_LT(parameter_index, parameter_count_);
47 return Register::FromParameterIndex(parameter_index, parameter_count_); 67 return Register::FromParameterIndex(parameter_index, parameter_count_);
48 } 68 }
49 69
50 70
51 Handle<BytecodeArray> BytecodeArrayBuilder::ToBytecodeArray() { 71 Handle<BytecodeArray> BytecodeArrayBuilder::ToBytecodeArray() {
52 DCHECK_EQ(bytecode_generated_, false); 72 DCHECK_EQ(bytecode_generated_, false);
53 DCHECK_GE(parameter_count_, 0); 73 DCHECK_GE(parameter_count_, 0);
54 DCHECK_GE(local_register_count_, 0); 74 DCHECK_GE(local_register_count_, 0);
(...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after
315 if (FitsInIdx8Operand(feedback_slot)) { 335 if (FitsInIdx8Operand(feedback_slot)) {
316 Output(bytecode, object.ToOperand(), key.ToOperand(), 336 Output(bytecode, object.ToOperand(), key.ToOperand(),
317 static_cast<uint8_t>(feedback_slot)); 337 static_cast<uint8_t>(feedback_slot));
318 } else { 338 } else {
319 UNIMPLEMENTED(); 339 UNIMPLEMENTED();
320 } 340 }
321 return *this; 341 return *this;
322 } 342 }
323 343
324 344
345 BytecodeArrayBuilder& BytecodeArrayBuilder::PushContext(Register context) {
346 Output(Bytecode::kPushContext, context.ToOperand());
347 return *this;
348 }
349
350
351 BytecodeArrayBuilder& BytecodeArrayBuilder::PopContext(Register context) {
352 Output(Bytecode::kPopContext, context.ToOperand());
353 return *this;
354 }
355
356
325 BytecodeArrayBuilder& BytecodeArrayBuilder::CastAccumulatorToBoolean() { 357 BytecodeArrayBuilder& BytecodeArrayBuilder::CastAccumulatorToBoolean() {
326 if (LastBytecodeInSameBlock()) { 358 if (LastBytecodeInSameBlock()) {
327 // If the previous bytecode puts a boolean in the accumulator 359 // If the previous bytecode puts a boolean in the accumulator
328 // there is no need to emit an instruction. 360 // there is no need to emit an instruction.
329 switch (Bytecodes::FromByte(bytecodes()->at(last_bytecode_start_))) { 361 switch (Bytecodes::FromByte(bytecodes()->at(last_bytecode_start_))) {
330 case Bytecode::kToBoolean: 362 case Bytecode::kToBoolean:
331 UNREACHABLE(); 363 UNREACHABLE();
332 case Bytecode::kLdaTrue: 364 case Bytecode::kLdaTrue:
333 case Bytecode::kLdaFalse: 365 case Bytecode::kLdaFalse:
334 case Bytecode::kLogicalNot: 366 case Bytecode::kLogicalNot:
(...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after
564 case OperandType::kNone: 596 case OperandType::kNone:
565 return false; 597 return false;
566 case OperandType::kIdx16: 598 case OperandType::kIdx16:
567 return static_cast<uint16_t>(operand_value) == operand_value; 599 return static_cast<uint16_t>(operand_value) == operand_value;
568 case OperandType::kCount8: 600 case OperandType::kCount8:
569 case OperandType::kImm8: 601 case OperandType::kImm8:
570 case OperandType::kIdx8: 602 case OperandType::kIdx8:
571 return static_cast<uint8_t>(operand_value) == operand_value; 603 return static_cast<uint8_t>(operand_value) == operand_value;
572 case OperandType::kReg8: { 604 case OperandType::kReg8: {
573 Register reg = Register::FromOperand(static_cast<uint8_t>(operand_value)); 605 Register reg = Register::FromOperand(static_cast<uint8_t>(operand_value));
574 if (reg.is_function_context()) { 606 if (reg.is_function_context() || reg.is_function_closure()) {
575 return true; 607 return true;
576 } else if (reg.is_parameter()) { 608 } else if (reg.is_parameter()) {
577 int parameter_index = reg.ToParameterIndex(parameter_count_); 609 int parameter_index = reg.ToParameterIndex(parameter_count_);
578 return parameter_index >= 0 && parameter_index < parameter_count_; 610 return parameter_index >= 0 && parameter_index < parameter_count_;
579 } else { 611 } else {
580 return (reg.index() >= 0 && reg.index() < temporary_register_next_); 612 return (reg.index() >= 0 && reg.index() < temporary_register_next_);
581 } 613 }
582 } 614 }
583 } 615 }
584 UNREACHABLE(); 616 UNREACHABLE();
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after
744 776
745 Register TemporaryRegisterScope::NewRegister() { 777 Register TemporaryRegisterScope::NewRegister() {
746 count_++; 778 count_++;
747 last_register_index_ = builder_->BorrowTemporaryRegister(); 779 last_register_index_ = builder_->BorrowTemporaryRegister();
748 return Register(last_register_index_); 780 return Register(last_register_index_);
749 } 781 }
750 782
751 } // namespace interpreter 783 } // namespace interpreter
752 } // namespace internal 784 } // namespace internal
753 } // namespace v8 785 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698