PageRenderTime 26ms CodeModel.GetById 18ms RepoModel.GetById 1ms app.codeStats 0ms

/src/regexp-macro-assembler-tracer.cc

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