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