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 #include "src/ast.h" | 7 #include "src/ast.h" |
8 #include "src/compiler.h" | 8 #include "src/compiler.h" |
9 #include "src/execution.h" | 9 #include "src/execution.h" |
10 #include "src/factory.h" | 10 #include "src/factory.h" |
(...skipping 1187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1198 affected_registers->Set(action->reg(), zone); | 1198 affected_registers->Set(action->reg(), zone); |
1199 if (action->reg() > max_register) max_register = action->reg(); | 1199 if (action->reg() > max_register) max_register = action->reg(); |
1200 } | 1200 } |
1201 } | 1201 } |
1202 return max_register; | 1202 return max_register; |
1203 } | 1203 } |
1204 | 1204 |
1205 | 1205 |
1206 void Trace::RestoreAffectedRegisters(RegExpMacroAssembler* assembler, | 1206 void Trace::RestoreAffectedRegisters(RegExpMacroAssembler* assembler, |
1207 int max_register, | 1207 int max_register, |
1208 OutSet& registers_to_pop, | 1208 const OutSet& registers_to_pop, |
1209 OutSet& registers_to_clear) { | 1209 const OutSet& registers_to_clear) { |
1210 for (int reg = max_register; reg >= 0; reg--) { | 1210 for (int reg = max_register; reg >= 0; reg--) { |
1211 if (registers_to_pop.Get(reg)) assembler->PopRegister(reg); | 1211 if (registers_to_pop.Get(reg)) assembler->PopRegister(reg); |
1212 else if (registers_to_clear.Get(reg)) { | 1212 else if (registers_to_clear.Get(reg)) { |
1213 int clear_to = reg; | 1213 int clear_to = reg; |
1214 while (reg > 0 && registers_to_clear.Get(reg - 1)) { | 1214 while (reg > 0 && registers_to_clear.Get(reg - 1)) { |
1215 reg--; | 1215 reg--; |
1216 } | 1216 } |
1217 assembler->ClearRegisters(reg, clear_to); | 1217 assembler->ClearRegisters(reg, clear_to); |
1218 } | 1218 } |
1219 } | 1219 } |
1220 } | 1220 } |
1221 | 1221 |
1222 | 1222 |
1223 void Trace::PerformDeferredActions(RegExpMacroAssembler* assembler, | 1223 void Trace::PerformDeferredActions(RegExpMacroAssembler* assembler, |
1224 int max_register, | 1224 int max_register, |
1225 OutSet& affected_registers, | 1225 const OutSet& affected_registers, |
1226 OutSet* registers_to_pop, | 1226 OutSet* registers_to_pop, |
1227 OutSet* registers_to_clear, | 1227 OutSet* registers_to_clear, |
1228 Zone* zone) { | 1228 Zone* zone) { |
1229 // The "+1" is to avoid a push_limit of zero if stack_limit_slack() is 1. | 1229 // The "+1" is to avoid a push_limit of zero if stack_limit_slack() is 1. |
1230 const int push_limit = (assembler->stack_limit_slack() + 1) / 2; | 1230 const int push_limit = (assembler->stack_limit_slack() + 1) / 2; |
1231 | 1231 |
1232 // Count pushes performed to force a stack limit check occasionally. | 1232 // Count pushes performed to force a stack limit check occasionally. |
1233 int pushes = 0; | 1233 int pushes = 0; |
1234 | 1234 |
1235 for (int reg = 0; reg <= max_register; reg++) { | 1235 for (int reg = 0; reg <= max_register; reg++) { |
(...skipping 4304 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5540 first_ |= (1 << value); | 5540 first_ |= (1 << value); |
5541 } else { | 5541 } else { |
5542 if (remaining_ == NULL) | 5542 if (remaining_ == NULL) |
5543 remaining_ = new(zone) ZoneList<unsigned>(1, zone); | 5543 remaining_ = new(zone) ZoneList<unsigned>(1, zone); |
5544 if (remaining_->is_empty() || !remaining_->Contains(value)) | 5544 if (remaining_->is_empty() || !remaining_->Contains(value)) |
5545 remaining_->Add(value, zone); | 5545 remaining_->Add(value, zone); |
5546 } | 5546 } |
5547 } | 5547 } |
5548 | 5548 |
5549 | 5549 |
5550 bool OutSet::Get(unsigned value) { | 5550 bool OutSet::Get(unsigned value) const { |
5551 if (value < kFirstLimit) { | 5551 if (value < kFirstLimit) { |
5552 return (first_ & (1 << value)) != 0; | 5552 return (first_ & (1 << value)) != 0; |
5553 } else if (remaining_ == NULL) { | 5553 } else if (remaining_ == NULL) { |
5554 return false; | 5554 return false; |
5555 } else { | 5555 } else { |
5556 return remaining_->Contains(value); | 5556 return remaining_->Contains(value); |
5557 } | 5557 } |
5558 } | 5558 } |
5559 | 5559 |
5560 | 5560 |
(...skipping 545 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6106 } | 6106 } |
6107 | 6107 |
6108 return compiler.Assemble(¯o_assembler, | 6108 return compiler.Assemble(¯o_assembler, |
6109 node, | 6109 node, |
6110 data->capture_count, | 6110 data->capture_count, |
6111 pattern); | 6111 pattern); |
6112 } | 6112 } |
6113 | 6113 |
6114 | 6114 |
6115 }} // namespace v8::internal | 6115 }} // namespace v8::internal |
OLD | NEW |