| OLD | NEW |
| (Empty) | |
| 1 // Copyright 2008 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are |
| 4 // met: |
| 5 // |
| 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided |
| 11 // with the distribution. |
| 12 // * Neither the name of Google Inc. nor the names of its |
| 13 // contributors may be used to endorse or promote products derived |
| 14 // from this software without specific prior written permission. |
| 15 // |
| 16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
| 17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
| 18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
| 19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
| 20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
| 21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
| 22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| 23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| 24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| 25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| 26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 27 |
| 28 #include "v8.h" |
| 29 #include "ast.h" |
| 30 #include "regexp-macro-assembler.h" |
| 31 #include "regexp-macro-assembler-tracer.h" |
| 32 |
| 33 namespace v8 { namespace internal { |
| 34 |
| 35 RegExpMacroAssemblerTracer::RegExpMacroAssemblerTracer( |
| 36 RegExpMacroAssembler* assembler) : |
| 37 assembler_(assembler) { |
| 38 unsigned int type = assembler->Implementation(); |
| 39 ASSERT(type < 3); |
| 40 const char* impl_names[3] = {"IA32", "ARM", "Bytecode"}; |
| 41 PrintF("RegExpMacroAssembler%s();\n", impl_names[type]); |
| 42 } |
| 43 |
| 44 RegExpMacroAssemblerTracer::~RegExpMacroAssemblerTracer() { |
| 45 } |
| 46 |
| 47 void RegExpMacroAssemblerTracer::Bind(Label* label) { |
| 48 PrintF("label[%08x]: (Bind)\n", label, label); |
| 49 assembler_->Bind(label); |
| 50 } |
| 51 |
| 52 void RegExpMacroAssemblerTracer::EmitOrLink(Label* label) { |
| 53 PrintF(" EmitOrLink(label[%08x]);\n", label); |
| 54 assembler_->EmitOrLink(label); |
| 55 } |
| 56 |
| 57 void RegExpMacroAssemblerTracer::AdvanceCurrentPosition(int by) { |
| 58 PrintF(" AdvanceCurrentPosition(by=%d);\n", by); |
| 59 assembler_->AdvanceCurrentPosition(by); |
| 60 } |
| 61 |
| 62 void RegExpMacroAssemblerTracer::PopCurrentPosition() { |
| 63 PrintF(" PopCurrentPosition();\n"); |
| 64 assembler_->PopCurrentPosition(); |
| 65 } |
| 66 |
| 67 void RegExpMacroAssemblerTracer::PushCurrentPosition() { |
| 68 PrintF(" PushCurrentPosition();\n"); |
| 69 assembler_->PushCurrentPosition(); |
| 70 } |
| 71 |
| 72 void RegExpMacroAssemblerTracer::Backtrack() { |
| 73 PrintF(" Backtrack();\n"); |
| 74 assembler_->Backtrack(); |
| 75 } |
| 76 |
| 77 void RegExpMacroAssemblerTracer::GoTo(Label* label) { |
| 78 PrintF(" GoTo(label[%08x]);\n\n", label); |
| 79 assembler_->GoTo(label); |
| 80 } |
| 81 |
| 82 void RegExpMacroAssemblerTracer::PushBacktrack(Label* label) { |
| 83 PrintF(" PushBacktrack(label[%08x]);\n", label); |
| 84 assembler_->PushBacktrack(label); |
| 85 } |
| 86 |
| 87 void RegExpMacroAssemblerTracer::Succeed() { |
| 88 PrintF(" Succeed();\n"); |
| 89 assembler_->Succeed(); |
| 90 } |
| 91 |
| 92 void RegExpMacroAssemblerTracer::Fail() { |
| 93 PrintF(" Fail();\n"); |
| 94 assembler_->Fail(); |
| 95 } |
| 96 |
| 97 void RegExpMacroAssemblerTracer::PopRegister(int register_index) { |
| 98 PrintF(" PopRegister(register=%d);\n", register_index); |
| 99 assembler_->PopRegister(register_index); |
| 100 } |
| 101 |
| 102 void RegExpMacroAssemblerTracer::PushRegister(int register_index) { |
| 103 PrintF(" PushRegister(register=%d);\n", register_index); |
| 104 assembler_->PushRegister(register_index); |
| 105 } |
| 106 |
| 107 void RegExpMacroAssemblerTracer::AdvanceRegister(int reg, int by) { |
| 108 PrintF(" AdvanceRegister(register=%d, by=%d);\n", reg, by); |
| 109 assembler_->AdvanceRegister(reg, by); |
| 110 } |
| 111 |
| 112 void RegExpMacroAssemblerTracer::SetRegister(int register_index, int to) { |
| 113 PrintF(" SetRegister(register=%d, to=%d);\n", register_index, to); |
| 114 assembler_->SetRegister(register_index, to); |
| 115 } |
| 116 |
| 117 void RegExpMacroAssemblerTracer::WriteCurrentPositionToRegister(int reg) { |
| 118 PrintF(" WriteCurrentPositionToRegister(register=%d);\n", reg); |
| 119 assembler_->WriteCurrentPositionToRegister(reg); |
| 120 } |
| 121 |
| 122 void RegExpMacroAssemblerTracer::ReadCurrentPositionFromRegister(int reg) { |
| 123 PrintF(" ReadCurrentPositionFromRegister(register=%d);\n", reg); |
| 124 assembler_->ReadCurrentPositionFromRegister(reg); |
| 125 } |
| 126 |
| 127 void RegExpMacroAssemblerTracer::WriteStackPointerToRegister(int reg) { |
| 128 PrintF(" WriteStackPointerToRegister(register=%d);\n", reg); |
| 129 assembler_->WriteStackPointerToRegister(reg); |
| 130 } |
| 131 |
| 132 void RegExpMacroAssemblerTracer::ReadStackPointerFromRegister(int reg) { |
| 133 PrintF(" ReadStackPointerFromRegister(register=%d);\n", reg); |
| 134 assembler_->ReadStackPointerFromRegister(reg); |
| 135 } |
| 136 |
| 137 void RegExpMacroAssemblerTracer::LoadCurrentCharacter(int cp_offset, |
| 138 Label* on_end_of_input) { |
| 139 PrintF(" LoadCurrentCharacter(cp_offset=%d, label[%08x]);\n", cp_offset, |
| 140 on_end_of_input); |
| 141 assembler_->LoadCurrentCharacter(cp_offset, on_end_of_input); |
| 142 } |
| 143 |
| 144 void RegExpMacroAssemblerTracer::CheckCharacterLT(uc16 limit, Label* on_less) { |
| 145 PrintF(" CheckCharacterLT(c='u%04x', label[%08x]);\n", limit, on_less); |
| 146 assembler_->CheckCharacterLT(limit, on_less); |
| 147 } |
| 148 |
| 149 void RegExpMacroAssemblerTracer::CheckCharacterGT(uc16 limit, |
| 150 Label* on_greater) { |
| 151 PrintF(" CheckCharacterGT(c='u%04x', label[%08x]);\n", limit, on_greater); |
| 152 assembler_->CheckCharacterGT(limit, on_greater); |
| 153 } |
| 154 |
| 155 void RegExpMacroAssemblerTracer::CheckCharacter(uc16 c, Label* on_equal) { |
| 156 PrintF(" CheckCharacter(c='u%04x', label[%08x]);\n", c, on_equal); |
| 157 assembler_->CheckCharacter(c, on_equal); |
| 158 } |
| 159 |
| 160 void RegExpMacroAssemblerTracer::CheckNotCharacter(uc16 c, |
| 161 Label* on_not_equal) { |
| 162 PrintF(" CheckNotCharacter(c='u%04x', label[%08x]);\n", c, on_not_equal); |
| 163 assembler_->CheckNotCharacter(c, on_not_equal); |
| 164 } |
| 165 |
| 166 void RegExpMacroAssemblerTracer::CheckNotCharacterAfterOr(uc16 c, uc16 mask, |
| 167 Label* on_not_equal) { |
| 168 PrintF(" CheckNotCharacterAfterOr(c='u%04x', mask=0x%04x, label[%08x]);\n", c, |
| 169 mask, on_not_equal); |
| 170 assembler_->CheckNotCharacterAfterOr(c, mask, on_not_equal); |
| 171 } |
| 172 |
| 173 void RegExpMacroAssemblerTracer::CheckNotCharacterAfterMinusOr( |
| 174 uc16 c, |
| 175 uc16 mask, |
| 176 Label* on_not_equal) { |
| 177 PrintF(" CheckNotCharacterAfterMinusOr(c='u%04x', mask=0x%04x, " |
| 178 "label[%08x]);\n", c, mask, on_not_equal); |
| 179 assembler_->CheckNotCharacterAfterMinusOr(c, mask, on_not_equal); |
| 180 } |
| 181 |
| 182 void RegExpMacroAssemblerTracer::CheckNotBackReference(int start_reg, |
| 183 Label* on_no_match) { |
| 184 PrintF(" CheckNotBackReference(register=%d, label[%08x]);\n", start_reg, |
| 185 on_no_match); |
| 186 assembler_->CheckNotBackReference(start_reg, on_no_match); |
| 187 } |
| 188 |
| 189 void RegExpMacroAssemblerTracer::CheckNotBackReferenceIgnoreCase( |
| 190 int start_reg, |
| 191 Label* on_no_match) { |
| 192 PrintF(" CheckNotBackReferenceIgnoreCase(register=%d, label[%08x]);\n", |
| 193 start_reg, on_no_match); |
| 194 assembler_->CheckNotBackReferenceIgnoreCase(start_reg, on_no_match); |
| 195 } |
| 196 |
| 197 void RegExpMacroAssemblerTracer::CheckCharacters(Vector<const uc16> str, |
| 198 int cp_offset, |
| 199 Label* on_failure) { |
| 200 PrintF(" CheckCharacters(str=\""); |
| 201 for (int i = 0; i < str.length(); i++) { |
| 202 PrintF("u%04x", str[i]); |
| 203 } |
| 204 PrintF("\", cp_offset=%d, label[%08x])\n", cp_offset, on_failure); |
| 205 assembler_->CheckCharacters(str, cp_offset, on_failure); |
| 206 } |
| 207 |
| 208 void RegExpMacroAssemblerTracer::CheckCurrentPosition(int register_index, |
| 209 Label* on_equal) { |
| 210 PrintF(" CheckCurrentPosition(register=%d, label[%08x]);\n", register_index, |
| 211 on_equal); |
| 212 assembler_->CheckCurrentPosition(register_index, on_equal); |
| 213 } |
| 214 |
| 215 void RegExpMacroAssemblerTracer::CheckBitmap(uc16 start, Label* bitmap, |
| 216 Label* on_zero) { |
| 217 PrintF(" CheckBitmap(start=u$04x, <bitmap>, label[%08x]);\n", start, on_zero); |
| 218 assembler_->CheckBitmap(start, bitmap, on_zero); |
| 219 } |
| 220 |
| 221 void RegExpMacroAssemblerTracer::DispatchHalfNibbleMap( |
| 222 uc16 start, |
| 223 Label* half_nibble_map, |
| 224 const Vector<Label*>& destinations) { |
| 225 PrintF(" DispatchHalfNibbleMap(start=u$04x, <half_nibble_map>, [", start); |
| 226 for (int i = 0; i < destinations.length(); i++) { |
| 227 if (i > 0) |
| 228 PrintF(", "); |
| 229 PrintF("label[%08x]", destinations[i]); |
| 230 } |
| 231 PrintF(");\n"); |
| 232 assembler_->DispatchHalfNibbleMap(start, half_nibble_map, destinations); |
| 233 } |
| 234 |
| 235 void RegExpMacroAssemblerTracer::DispatchByteMap( |
| 236 uc16 start, |
| 237 Label* byte_map, |
| 238 const Vector<Label*>& destinations) { |
| 239 PrintF(" DispatchByteMap(start=u$04x, <byte_map>, [", start); |
| 240 for (int i = 0; i < destinations.length(); i++) { |
| 241 if (i > 0) |
| 242 PrintF(", "); |
| 243 PrintF("label[%08x]", destinations[i]); |
| 244 } |
| 245 PrintF(");\n"); |
| 246 assembler_->DispatchByteMap(start, byte_map, destinations); |
| 247 } |
| 248 |
| 249 void RegExpMacroAssemblerTracer::DispatchHighByteMap( |
| 250 byte start, |
| 251 Label* byte_map, |
| 252 const Vector<Label*>& destinations) { |
| 253 PrintF(" DispatchHighByteMap(start=u$04x, <byte_map>, [", start); |
| 254 for (int i = 0; i < destinations.length(); i++) { |
| 255 if (i > 0) |
| 256 PrintF(", "); |
| 257 PrintF("label[%08x]", destinations[i]); |
| 258 } |
| 259 PrintF(");\n"); |
| 260 assembler_->DispatchHighByteMap(start, byte_map, destinations); |
| 261 } |
| 262 |
| 263 void RegExpMacroAssemblerTracer::IfRegisterLT(int register_index, |
| 264 int comparand, Label* if_lt) { |
| 265 PrintF(" IfRegisterLT(register=%d, number=%d, label[%08x]);\n", |
| 266 register_index, comparand, if_lt); |
| 267 assembler_->IfRegisterLT(register_index, comparand, if_lt); |
| 268 } |
| 269 |
| 270 void RegExpMacroAssemblerTracer::IfRegisterGE(int register_index, |
| 271 int comparand, Label* if_ge) { |
| 272 PrintF(" IfRegisterGE(register=%d, number=%d, label[%08x]);\n", |
| 273 register_index, comparand, if_ge); |
| 274 assembler_->IfRegisterGE(register_index, comparand, if_ge); |
| 275 } |
| 276 |
| 277 RegExpMacroAssembler::IrregexpImplementation |
| 278 RegExpMacroAssemblerTracer::Implementation() { |
| 279 return assembler_->Implementation(); |
| 280 } |
| 281 |
| 282 Handle<Object> RegExpMacroAssemblerTracer::GetCode() { |
| 283 PrintF(" GetCode();\n"); |
| 284 return assembler_->GetCode(); |
| 285 } |
| 286 |
| 287 }} // namespace v8::internal |
| OLD | NEW |