| OLD | NEW |
| (Empty) |
| 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 | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "src/v8.h" | |
| 6 | |
| 7 #include "src/ast.h" | |
| 8 #include "src/regexp-macro-assembler.h" | |
| 9 #include "src/regexp-macro-assembler-tracer.h" | |
| 10 | |
| 11 namespace v8 { | |
| 12 namespace internal { | |
| 13 | |
| 14 RegExpMacroAssemblerTracer::RegExpMacroAssemblerTracer( | |
| 15 Isolate* isolate, RegExpMacroAssembler* assembler) | |
| 16 : RegExpMacroAssembler(isolate, assembler->zone()), assembler_(assembler) { | |
| 17 unsigned int type = assembler->Implementation(); | |
| 18 DCHECK(type < 6); | |
| 19 const char* impl_names[] = {"IA32", "ARM", "ARM64", | |
| 20 "MIPS", "X64", "X87", "Bytecode"}; | |
| 21 PrintF("RegExpMacroAssembler%s();\n", impl_names[type]); | |
| 22 } | |
| 23 | |
| 24 | |
| 25 RegExpMacroAssemblerTracer::~RegExpMacroAssemblerTracer() { | |
| 26 } | |
| 27 | |
| 28 | |
| 29 void RegExpMacroAssemblerTracer::AbortedCodeGeneration() { | |
| 30 PrintF(" AbortedCodeGeneration\n"); | |
| 31 assembler_->AbortedCodeGeneration(); | |
| 32 } | |
| 33 | |
| 34 | |
| 35 // This is used for printing out debugging information. It makes an integer | |
| 36 // that is closely related to the address of an object. | |
| 37 static int LabelToInt(Label* label) { | |
| 38 return static_cast<int>(reinterpret_cast<intptr_t>(label)); | |
| 39 } | |
| 40 | |
| 41 | |
| 42 void RegExpMacroAssemblerTracer::Bind(Label* label) { | |
| 43 PrintF("label[%08x]: (Bind)\n", LabelToInt(label)); | |
| 44 assembler_->Bind(label); | |
| 45 } | |
| 46 | |
| 47 | |
| 48 void RegExpMacroAssemblerTracer::AdvanceCurrentPosition(int by) { | |
| 49 PrintF(" AdvanceCurrentPosition(by=%d);\n", by); | |
| 50 assembler_->AdvanceCurrentPosition(by); | |
| 51 } | |
| 52 | |
| 53 | |
| 54 void RegExpMacroAssemblerTracer::CheckGreedyLoop(Label* label) { | |
| 55 PrintF(" CheckGreedyLoop(label[%08x]);\n\n", LabelToInt(label)); | |
| 56 assembler_->CheckGreedyLoop(label); | |
| 57 } | |
| 58 | |
| 59 | |
| 60 void RegExpMacroAssemblerTracer::PopCurrentPosition() { | |
| 61 PrintF(" PopCurrentPosition();\n"); | |
| 62 assembler_->PopCurrentPosition(); | |
| 63 } | |
| 64 | |
| 65 | |
| 66 void RegExpMacroAssemblerTracer::PushCurrentPosition() { | |
| 67 PrintF(" PushCurrentPosition();\n"); | |
| 68 assembler_->PushCurrentPosition(); | |
| 69 } | |
| 70 | |
| 71 | |
| 72 void RegExpMacroAssemblerTracer::Backtrack() { | |
| 73 PrintF(" Backtrack();\n"); | |
| 74 assembler_->Backtrack(); | |
| 75 } | |
| 76 | |
| 77 | |
| 78 void RegExpMacroAssemblerTracer::GoTo(Label* label) { | |
| 79 PrintF(" GoTo(label[%08x]);\n\n", LabelToInt(label)); | |
| 80 assembler_->GoTo(label); | |
| 81 } | |
| 82 | |
| 83 | |
| 84 void RegExpMacroAssemblerTracer::PushBacktrack(Label* label) { | |
| 85 PrintF(" PushBacktrack(label[%08x]);\n", LabelToInt(label)); | |
| 86 assembler_->PushBacktrack(label); | |
| 87 } | |
| 88 | |
| 89 | |
| 90 bool RegExpMacroAssemblerTracer::Succeed() { | |
| 91 bool restart = assembler_->Succeed(); | |
| 92 PrintF(" Succeed();%s\n", restart ? " [restart for global match]" : ""); | |
| 93 return restart; | |
| 94 } | |
| 95 | |
| 96 | |
| 97 void RegExpMacroAssemblerTracer::Fail() { | |
| 98 PrintF(" Fail();"); | |
| 99 assembler_->Fail(); | |
| 100 } | |
| 101 | |
| 102 | |
| 103 void RegExpMacroAssemblerTracer::PopRegister(int register_index) { | |
| 104 PrintF(" PopRegister(register=%d);\n", register_index); | |
| 105 assembler_->PopRegister(register_index); | |
| 106 } | |
| 107 | |
| 108 | |
| 109 void RegExpMacroAssemblerTracer::PushRegister( | |
| 110 int register_index, | |
| 111 StackCheckFlag check_stack_limit) { | |
| 112 PrintF(" PushRegister(register=%d, %s);\n", | |
| 113 register_index, | |
| 114 check_stack_limit ? "check stack limit" : ""); | |
| 115 assembler_->PushRegister(register_index, check_stack_limit); | |
| 116 } | |
| 117 | |
| 118 | |
| 119 void RegExpMacroAssemblerTracer::AdvanceRegister(int reg, int by) { | |
| 120 PrintF(" AdvanceRegister(register=%d, by=%d);\n", reg, by); | |
| 121 assembler_->AdvanceRegister(reg, by); | |
| 122 } | |
| 123 | |
| 124 | |
| 125 void RegExpMacroAssemblerTracer::SetCurrentPositionFromEnd(int by) { | |
| 126 PrintF(" SetCurrentPositionFromEnd(by=%d);\n", by); | |
| 127 assembler_->SetCurrentPositionFromEnd(by); | |
| 128 } | |
| 129 | |
| 130 | |
| 131 void RegExpMacroAssemblerTracer::SetRegister(int register_index, int to) { | |
| 132 PrintF(" SetRegister(register=%d, to=%d);\n", register_index, to); | |
| 133 assembler_->SetRegister(register_index, to); | |
| 134 } | |
| 135 | |
| 136 | |
| 137 void RegExpMacroAssemblerTracer::WriteCurrentPositionToRegister(int reg, | |
| 138 int cp_offset) { | |
| 139 PrintF(" WriteCurrentPositionToRegister(register=%d,cp_offset=%d);\n", | |
| 140 reg, | |
| 141 cp_offset); | |
| 142 assembler_->WriteCurrentPositionToRegister(reg, cp_offset); | |
| 143 } | |
| 144 | |
| 145 | |
| 146 void RegExpMacroAssemblerTracer::ClearRegisters(int reg_from, int reg_to) { | |
| 147 PrintF(" ClearRegister(from=%d, to=%d);\n", reg_from, reg_to); | |
| 148 assembler_->ClearRegisters(reg_from, reg_to); | |
| 149 } | |
| 150 | |
| 151 | |
| 152 void RegExpMacroAssemblerTracer::ReadCurrentPositionFromRegister(int reg) { | |
| 153 PrintF(" ReadCurrentPositionFromRegister(register=%d);\n", reg); | |
| 154 assembler_->ReadCurrentPositionFromRegister(reg); | |
| 155 } | |
| 156 | |
| 157 | |
| 158 void RegExpMacroAssemblerTracer::WriteStackPointerToRegister(int reg) { | |
| 159 PrintF(" WriteStackPointerToRegister(register=%d);\n", reg); | |
| 160 assembler_->WriteStackPointerToRegister(reg); | |
| 161 } | |
| 162 | |
| 163 | |
| 164 void RegExpMacroAssemblerTracer::ReadStackPointerFromRegister(int reg) { | |
| 165 PrintF(" ReadStackPointerFromRegister(register=%d);\n", reg); | |
| 166 assembler_->ReadStackPointerFromRegister(reg); | |
| 167 } | |
| 168 | |
| 169 | |
| 170 void RegExpMacroAssemblerTracer::LoadCurrentCharacter(int cp_offset, | |
| 171 Label* on_end_of_input, | |
| 172 bool check_bounds, | |
| 173 int characters) { | |
| 174 const char* check_msg = check_bounds ? "" : " (unchecked)"; | |
| 175 PrintF(" LoadCurrentCharacter(cp_offset=%d, label[%08x]%s (%d chars));\n", | |
| 176 cp_offset, | |
| 177 LabelToInt(on_end_of_input), | |
| 178 check_msg, | |
| 179 characters); | |
| 180 assembler_->LoadCurrentCharacter(cp_offset, | |
| 181 on_end_of_input, | |
| 182 check_bounds, | |
| 183 characters); | |
| 184 } | |
| 185 | |
| 186 | |
| 187 class PrintablePrinter { | |
| 188 public: | |
| 189 explicit PrintablePrinter(uc16 character) : character_(character) { } | |
| 190 | |
| 191 const char* operator*() { | |
| 192 if (character_ >= ' ' && character_ <= '~') { | |
| 193 buffer_[0] = '('; | |
| 194 buffer_[1] = static_cast<char>(character_); | |
| 195 buffer_[2] = ')'; | |
| 196 buffer_[3] = '\0'; | |
| 197 } else { | |
| 198 buffer_[0] = '\0'; | |
| 199 } | |
| 200 return &buffer_[0]; | |
| 201 } | |
| 202 | |
| 203 private: | |
| 204 uc16 character_; | |
| 205 char buffer_[4]; | |
| 206 }; | |
| 207 | |
| 208 | |
| 209 void RegExpMacroAssemblerTracer::CheckCharacterLT(uc16 limit, Label* on_less) { | |
| 210 PrintablePrinter printable(limit); | |
| 211 PrintF(" CheckCharacterLT(c=0x%04x%s, label[%08x]);\n", | |
| 212 limit, | |
| 213 *printable, | |
| 214 LabelToInt(on_less)); | |
| 215 assembler_->CheckCharacterLT(limit, on_less); | |
| 216 } | |
| 217 | |
| 218 | |
| 219 void RegExpMacroAssemblerTracer::CheckCharacterGT(uc16 limit, | |
| 220 Label* on_greater) { | |
| 221 PrintablePrinter printable(limit); | |
| 222 PrintF(" CheckCharacterGT(c=0x%04x%s, label[%08x]);\n", | |
| 223 limit, | |
| 224 *printable, | |
| 225 LabelToInt(on_greater)); | |
| 226 assembler_->CheckCharacterGT(limit, on_greater); | |
| 227 } | |
| 228 | |
| 229 | |
| 230 void RegExpMacroAssemblerTracer::CheckCharacter(unsigned c, Label* on_equal) { | |
| 231 PrintablePrinter printable(c); | |
| 232 PrintF(" CheckCharacter(c=0x%04x%s, label[%08x]);\n", | |
| 233 c, | |
| 234 *printable, | |
| 235 LabelToInt(on_equal)); | |
| 236 assembler_->CheckCharacter(c, on_equal); | |
| 237 } | |
| 238 | |
| 239 | |
| 240 void RegExpMacroAssemblerTracer::CheckAtStart(Label* on_at_start) { | |
| 241 PrintF(" CheckAtStart(label[%08x]);\n", LabelToInt(on_at_start)); | |
| 242 assembler_->CheckAtStart(on_at_start); | |
| 243 } | |
| 244 | |
| 245 | |
| 246 void RegExpMacroAssemblerTracer::CheckNotAtStart(Label* on_not_at_start) { | |
| 247 PrintF(" CheckNotAtStart(label[%08x]);\n", LabelToInt(on_not_at_start)); | |
| 248 assembler_->CheckNotAtStart(on_not_at_start); | |
| 249 } | |
| 250 | |
| 251 | |
| 252 void RegExpMacroAssemblerTracer::CheckNotCharacter(unsigned c, | |
| 253 Label* on_not_equal) { | |
| 254 PrintablePrinter printable(c); | |
| 255 PrintF(" CheckNotCharacter(c=0x%04x%s, label[%08x]);\n", | |
| 256 c, | |
| 257 *printable, | |
| 258 LabelToInt(on_not_equal)); | |
| 259 assembler_->CheckNotCharacter(c, on_not_equal); | |
| 260 } | |
| 261 | |
| 262 | |
| 263 void RegExpMacroAssemblerTracer::CheckCharacterAfterAnd( | |
| 264 unsigned c, | |
| 265 unsigned mask, | |
| 266 Label* on_equal) { | |
| 267 PrintablePrinter printable(c); | |
| 268 PrintF(" CheckCharacterAfterAnd(c=0x%04x%s, mask=0x%04x, label[%08x]);\n", | |
| 269 c, | |
| 270 *printable, | |
| 271 mask, | |
| 272 LabelToInt(on_equal)); | |
| 273 assembler_->CheckCharacterAfterAnd(c, mask, on_equal); | |
| 274 } | |
| 275 | |
| 276 | |
| 277 void RegExpMacroAssemblerTracer::CheckNotCharacterAfterAnd( | |
| 278 unsigned c, | |
| 279 unsigned mask, | |
| 280 Label* on_not_equal) { | |
| 281 PrintablePrinter printable(c); | |
| 282 PrintF(" CheckNotCharacterAfterAnd(c=0x%04x%s, mask=0x%04x, label[%08x]);\n", | |
| 283 c, | |
| 284 *printable, | |
| 285 mask, | |
| 286 LabelToInt(on_not_equal)); | |
| 287 assembler_->CheckNotCharacterAfterAnd(c, mask, on_not_equal); | |
| 288 } | |
| 289 | |
| 290 | |
| 291 void RegExpMacroAssemblerTracer::CheckNotCharacterAfterMinusAnd( | |
| 292 uc16 c, | |
| 293 uc16 minus, | |
| 294 uc16 mask, | |
| 295 Label* on_not_equal) { | |
| 296 PrintF(" CheckNotCharacterAfterMinusAnd(c=0x%04x, minus=%04x, mask=0x%04x, " | |
| 297 "label[%08x]);\n", | |
| 298 c, | |
| 299 minus, | |
| 300 mask, | |
| 301 LabelToInt(on_not_equal)); | |
| 302 assembler_->CheckNotCharacterAfterMinusAnd(c, minus, mask, on_not_equal); | |
| 303 } | |
| 304 | |
| 305 | |
| 306 void RegExpMacroAssemblerTracer::CheckCharacterInRange( | |
| 307 uc16 from, | |
| 308 uc16 to, | |
| 309 Label* on_not_in_range) { | |
| 310 PrintablePrinter printable_from(from); | |
| 311 PrintablePrinter printable_to(to); | |
| 312 PrintF(" CheckCharacterInRange(from=0x%04x%s, to=0x%04x%s, label[%08x]);\n", | |
| 313 from, | |
| 314 *printable_from, | |
| 315 to, | |
| 316 *printable_to, | |
| 317 LabelToInt(on_not_in_range)); | |
| 318 assembler_->CheckCharacterInRange(from, to, on_not_in_range); | |
| 319 } | |
| 320 | |
| 321 | |
| 322 void RegExpMacroAssemblerTracer::CheckCharacterNotInRange( | |
| 323 uc16 from, | |
| 324 uc16 to, | |
| 325 Label* on_in_range) { | |
| 326 PrintablePrinter printable_from(from); | |
| 327 PrintablePrinter printable_to(to); | |
| 328 PrintF( | |
| 329 " CheckCharacterNotInRange(from=0x%04x%s," " to=%04x%s, label[%08x]);\n", | |
| 330 from, | |
| 331 *printable_from, | |
| 332 to, | |
| 333 *printable_to, | |
| 334 LabelToInt(on_in_range)); | |
| 335 assembler_->CheckCharacterNotInRange(from, to, on_in_range); | |
| 336 } | |
| 337 | |
| 338 | |
| 339 void RegExpMacroAssemblerTracer::CheckBitInTable( | |
| 340 Handle<ByteArray> table, Label* on_bit_set) { | |
| 341 PrintF(" CheckBitInTable(label[%08x] ", LabelToInt(on_bit_set)); | |
| 342 for (int i = 0; i < kTableSize; i++) { | |
| 343 PrintF("%c", table->get(i) != 0 ? 'X' : '.'); | |
| 344 if (i % 32 == 31 && i != kTableMask) { | |
| 345 PrintF("\n "); | |
| 346 } | |
| 347 } | |
| 348 PrintF(");\n"); | |
| 349 assembler_->CheckBitInTable(table, on_bit_set); | |
| 350 } | |
| 351 | |
| 352 | |
| 353 void RegExpMacroAssemblerTracer::CheckNotBackReference(int start_reg, | |
| 354 Label* on_no_match) { | |
| 355 PrintF(" CheckNotBackReference(register=%d, label[%08x]);\n", start_reg, | |
| 356 LabelToInt(on_no_match)); | |
| 357 assembler_->CheckNotBackReference(start_reg, on_no_match); | |
| 358 } | |
| 359 | |
| 360 | |
| 361 void RegExpMacroAssemblerTracer::CheckNotBackReferenceIgnoreCase( | |
| 362 int start_reg, | |
| 363 Label* on_no_match) { | |
| 364 PrintF(" CheckNotBackReferenceIgnoreCase(register=%d, label[%08x]);\n", | |
| 365 start_reg, LabelToInt(on_no_match)); | |
| 366 assembler_->CheckNotBackReferenceIgnoreCase(start_reg, on_no_match); | |
| 367 } | |
| 368 | |
| 369 | |
| 370 bool RegExpMacroAssemblerTracer::CheckSpecialCharacterClass( | |
| 371 uc16 type, | |
| 372 Label* on_no_match) { | |
| 373 bool supported = assembler_->CheckSpecialCharacterClass(type, | |
| 374 on_no_match); | |
| 375 PrintF(" CheckSpecialCharacterClass(type='%c', label[%08x]): %s;\n", | |
| 376 type, | |
| 377 LabelToInt(on_no_match), | |
| 378 supported ? "true" : "false"); | |
| 379 return supported; | |
| 380 } | |
| 381 | |
| 382 | |
| 383 void RegExpMacroAssemblerTracer::IfRegisterLT(int register_index, | |
| 384 int comparand, Label* if_lt) { | |
| 385 PrintF(" IfRegisterLT(register=%d, number=%d, label[%08x]);\n", | |
| 386 register_index, comparand, LabelToInt(if_lt)); | |
| 387 assembler_->IfRegisterLT(register_index, comparand, if_lt); | |
| 388 } | |
| 389 | |
| 390 | |
| 391 void RegExpMacroAssemblerTracer::IfRegisterEqPos(int register_index, | |
| 392 Label* if_eq) { | |
| 393 PrintF(" IfRegisterEqPos(register=%d, label[%08x]);\n", | |
| 394 register_index, LabelToInt(if_eq)); | |
| 395 assembler_->IfRegisterEqPos(register_index, if_eq); | |
| 396 } | |
| 397 | |
| 398 | |
| 399 void RegExpMacroAssemblerTracer::IfRegisterGE(int register_index, | |
| 400 int comparand, Label* if_ge) { | |
| 401 PrintF(" IfRegisterGE(register=%d, number=%d, label[%08x]);\n", | |
| 402 register_index, comparand, LabelToInt(if_ge)); | |
| 403 assembler_->IfRegisterGE(register_index, comparand, if_ge); | |
| 404 } | |
| 405 | |
| 406 | |
| 407 RegExpMacroAssembler::IrregexpImplementation | |
| 408 RegExpMacroAssemblerTracer::Implementation() { | |
| 409 return assembler_->Implementation(); | |
| 410 } | |
| 411 | |
| 412 | |
| 413 Handle<HeapObject> RegExpMacroAssemblerTracer::GetCode(Handle<String> source) { | |
| 414 PrintF(" GetCode(%s);\n", source->ToCString().get()); | |
| 415 return assembler_->GetCode(source); | |
| 416 } | |
| 417 | |
| 418 } // namespace internal | |
| 419 } // namespace v8 | |
| OLD | NEW |