| 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 |