OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 1851 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1862 bit ^= 1; | 1862 bit ^= 1; |
1863 for (int i = start_index; i < end_index; i++) { | 1863 for (int i = start_index; i < end_index; i++) { |
1864 for (j = (ranges->at(i) & kMask); j < (ranges->at(i + 1) & kMask); j++) { | 1864 for (j = (ranges->at(i) & kMask); j < (ranges->at(i + 1) & kMask); j++) { |
1865 templ[j] = bit; | 1865 templ[j] = bit; |
1866 } | 1866 } |
1867 bit ^= 1; | 1867 bit ^= 1; |
1868 } | 1868 } |
1869 for (int i = j; i < kSize; i++) { | 1869 for (int i = j; i < kSize; i++) { |
1870 templ[i] = bit; | 1870 templ[i] = bit; |
1871 } | 1871 } |
1872 Factory* factory = Isolate::Current()->factory(); | 1872 Factory* factory = masm->zone()->isolate()->factory(); |
1873 // TODO(erikcorry): Cache these. | 1873 // TODO(erikcorry): Cache these. |
1874 Handle<ByteArray> ba = factory->NewByteArray(kSize, TENURED); | 1874 Handle<ByteArray> ba = factory->NewByteArray(kSize, TENURED); |
1875 for (int i = 0; i < kSize; i++) { | 1875 for (int i = 0; i < kSize; i++) { |
1876 ba->set(i, templ[i]); | 1876 ba->set(i, templ[i]); |
1877 } | 1877 } |
1878 masm->CheckBitInTable(ba, on_bit_set); | 1878 masm->CheckBitInTable(ba, on_bit_set); |
1879 if (on_bit_clear != fall_through) masm->GoTo(on_bit_clear); | 1879 if (on_bit_clear != fall_through) masm->GoTo(on_bit_clear); |
1880 } | 1880 } |
1881 | 1881 |
1882 | 1882 |
(...skipping 658 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2541 // | 2541 // |
2542 // We iterate along the text object, building up for each character a | 2542 // We iterate along the text object, building up for each character a |
2543 // mask and value that can be used to test for a quick failure to match. | 2543 // mask and value that can be used to test for a quick failure to match. |
2544 // The masks and values for the positions will be combined into a single | 2544 // The masks and values for the positions will be combined into a single |
2545 // machine word for the current character width in order to be used in | 2545 // machine word for the current character width in order to be used in |
2546 // generating a quick check. | 2546 // generating a quick check. |
2547 void TextNode::GetQuickCheckDetails(QuickCheckDetails* details, | 2547 void TextNode::GetQuickCheckDetails(QuickCheckDetails* details, |
2548 RegExpCompiler* compiler, | 2548 RegExpCompiler* compiler, |
2549 int characters_filled_in, | 2549 int characters_filled_in, |
2550 bool not_at_start) { | 2550 bool not_at_start) { |
2551 Isolate* isolate = Isolate::Current(); | 2551 Isolate* isolate = compiler->macro_assembler()->zone()->isolate(); |
2552 ASSERT(characters_filled_in < details->characters()); | 2552 ASSERT(characters_filled_in < details->characters()); |
2553 int characters = details->characters(); | 2553 int characters = details->characters(); |
2554 int char_mask; | 2554 int char_mask; |
2555 if (compiler->ascii()) { | 2555 if (compiler->ascii()) { |
2556 char_mask = String::kMaxOneByteCharCode; | 2556 char_mask = String::kMaxOneByteCharCode; |
2557 } else { | 2557 } else { |
2558 char_mask = String::kMaxUtf16CodeUnit; | 2558 char_mask = String::kMaxUtf16CodeUnit; |
2559 } | 2559 } |
2560 for (int k = 0; k < elms_->length(); k++) { | 2560 for (int k = 0; k < elms_->length(); k++) { |
2561 TextElement elm = elms_->at(k); | 2561 TextElement elm = elms_->at(k); |
(...skipping 677 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3239 // loading characters, which means we do not need to recheck the bounds | 3239 // loading characters, which means we do not need to recheck the bounds |
3240 // up to the limit the quick check already checked. In addition the quick | 3240 // up to the limit the quick check already checked. In addition the quick |
3241 // check can have involved a mask and compare operation which may simplify | 3241 // check can have involved a mask and compare operation which may simplify |
3242 // or obviate the need for further checks at some character positions. | 3242 // or obviate the need for further checks at some character positions. |
3243 void TextNode::TextEmitPass(RegExpCompiler* compiler, | 3243 void TextNode::TextEmitPass(RegExpCompiler* compiler, |
3244 TextEmitPassType pass, | 3244 TextEmitPassType pass, |
3245 bool preloaded, | 3245 bool preloaded, |
3246 Trace* trace, | 3246 Trace* trace, |
3247 bool first_element_checked, | 3247 bool first_element_checked, |
3248 int* checked_up_to) { | 3248 int* checked_up_to) { |
3249 Isolate* isolate = Isolate::Current(); | |
3250 RegExpMacroAssembler* assembler = compiler->macro_assembler(); | 3249 RegExpMacroAssembler* assembler = compiler->macro_assembler(); |
| 3250 Isolate* isolate = assembler->zone()->isolate(); |
3251 bool ascii = compiler->ascii(); | 3251 bool ascii = compiler->ascii(); |
3252 Label* backtrack = trace->backtrack(); | 3252 Label* backtrack = trace->backtrack(); |
3253 QuickCheckDetails* quick_check = trace->quick_check_performed(); | 3253 QuickCheckDetails* quick_check = trace->quick_check_performed(); |
3254 int element_count = elms_->length(); | 3254 int element_count = elms_->length(); |
3255 for (int i = preloaded ? 0 : element_count - 1; i >= 0; i--) { | 3255 for (int i = preloaded ? 0 : element_count - 1; i >= 0; i--) { |
3256 TextElement elm = elms_->at(i); | 3256 TextElement elm = elms_->at(i); |
3257 int cp_offset = trace->cp_offset() + elm.cp_offset(); | 3257 int cp_offset = trace->cp_offset() + elm.cp_offset(); |
3258 if (elm.text_type() == TextElement::ATOM) { | 3258 if (elm.text_type() == TextElement::ATOM) { |
3259 Vector<const uc16> quarks = elm.atom()->data(); | 3259 Vector<const uc16> quarks = elm.atom()->data(); |
3260 for (int j = preloaded ? 0 : quarks.length() - 1; j >= 0; j--) { | 3260 for (int j = preloaded ? 0 : quarks.length() - 1; j >= 0; j--) { |
(...skipping 552 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3813 &cont); | 3813 &cont); |
3814 } else { | 3814 } else { |
3815 masm->CheckCharacter(single_character, &cont); | 3815 masm->CheckCharacter(single_character, &cont); |
3816 } | 3816 } |
3817 masm->AdvanceCurrentPosition(lookahead_width); | 3817 masm->AdvanceCurrentPosition(lookahead_width); |
3818 masm->GoTo(&again); | 3818 masm->GoTo(&again); |
3819 masm->Bind(&cont); | 3819 masm->Bind(&cont); |
3820 return true; | 3820 return true; |
3821 } | 3821 } |
3822 | 3822 |
3823 Factory* factory = Isolate::Current()->factory(); | 3823 Factory* factory = masm->zone()->isolate()->factory(); |
3824 Handle<ByteArray> boolean_skip_table = factory->NewByteArray(kSize, TENURED); | 3824 Handle<ByteArray> boolean_skip_table = factory->NewByteArray(kSize, TENURED); |
3825 int skip_distance = GetSkipTable( | 3825 int skip_distance = GetSkipTable( |
3826 min_lookahead, max_lookahead, boolean_skip_table); | 3826 min_lookahead, max_lookahead, boolean_skip_table); |
3827 ASSERT(skip_distance != 0); | 3827 ASSERT(skip_distance != 0); |
3828 | 3828 |
3829 Label cont, again; | 3829 Label cont, again; |
3830 masm->Bind(&again); | 3830 masm->Bind(&again); |
3831 masm->LoadCurrentCharacter(max_lookahead, &cont, true); | 3831 masm->LoadCurrentCharacter(max_lookahead, &cont, true); |
3832 masm->CheckBitInTable(boolean_skip_table, &cont); | 3832 masm->CheckBitInTable(boolean_skip_table, &cont); |
3833 masm->AdvanceCurrentPosition(skip_distance); | 3833 masm->AdvanceCurrentPosition(skip_distance); |
(...skipping 1451 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5285 CharacterRangeSplitter::kInOverlay, zone); | 5285 CharacterRangeSplitter::kInOverlay, zone); |
5286 } | 5286 } |
5287 CharacterRangeSplitter callback(included, excluded, zone); | 5287 CharacterRangeSplitter callback(included, excluded, zone); |
5288 table.ForEach(&callback); | 5288 table.ForEach(&callback); |
5289 } | 5289 } |
5290 | 5290 |
5291 | 5291 |
5292 void CharacterRange::AddCaseEquivalents(ZoneList<CharacterRange>* ranges, | 5292 void CharacterRange::AddCaseEquivalents(ZoneList<CharacterRange>* ranges, |
5293 bool is_ascii, | 5293 bool is_ascii, |
5294 Zone* zone) { | 5294 Zone* zone) { |
5295 Isolate* isolate = Isolate::Current(); | 5295 Isolate* isolate = zone->isolate(); |
5296 uc16 bottom = from(); | 5296 uc16 bottom = from(); |
5297 uc16 top = to(); | 5297 uc16 top = to(); |
5298 if (is_ascii && !RangeContainsLatin1Equivalents(*this)) { | 5298 if (is_ascii && !RangeContainsLatin1Equivalents(*this)) { |
5299 if (bottom > String::kMaxOneByteCharCode) return; | 5299 if (bottom > String::kMaxOneByteCharCode) return; |
5300 if (top > String::kMaxOneByteCharCode) top = String::kMaxOneByteCharCode; | 5300 if (top > String::kMaxOneByteCharCode) top = String::kMaxOneByteCharCode; |
5301 } | 5301 } |
5302 unibrow::uchar chars[unibrow::Ecma262UnCanonicalize::kMaxWidth]; | 5302 unibrow::uchar chars[unibrow::Ecma262UnCanonicalize::kMaxWidth]; |
5303 if (top == bottom) { | 5303 if (top == bottom) { |
5304 // If this is a singleton we just expand the one character. | 5304 // If this is a singleton we just expand the one character. |
5305 int length = isolate->jsregexp_uncanonicalize()->get(bottom, '\0', chars); | 5305 int length = isolate->jsregexp_uncanonicalize()->get(bottom, '\0', chars); |
(...skipping 367 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5673 else | 5673 else |
5674 return empty(); | 5674 return empty(); |
5675 } | 5675 } |
5676 | 5676 |
5677 | 5677 |
5678 // ------------------------------------------------------------------- | 5678 // ------------------------------------------------------------------- |
5679 // Analysis | 5679 // Analysis |
5680 | 5680 |
5681 | 5681 |
5682 void Analysis::EnsureAnalyzed(RegExpNode* that) { | 5682 void Analysis::EnsureAnalyzed(RegExpNode* that) { |
5683 StackLimitCheck check(Isolate::Current()); | 5683 StackLimitCheck check(that->zone()->isolate()); |
5684 if (check.HasOverflowed()) { | 5684 if (check.HasOverflowed()) { |
5685 fail("Stack overflow"); | 5685 fail("Stack overflow"); |
5686 return; | 5686 return; |
5687 } | 5687 } |
5688 if (that->info()->been_analyzed || that->info()->being_analyzed) | 5688 if (that->info()->been_analyzed || that->info()->being_analyzed) |
5689 return; | 5689 return; |
5690 that->info()->being_analyzed = true; | 5690 that->info()->being_analyzed = true; |
5691 that->Accept(this); | 5691 that->Accept(this); |
5692 that->info()->being_analyzed = false; | 5692 that->info()->being_analyzed = false; |
5693 that->info()->been_analyzed = true; | 5693 that->info()->been_analyzed = true; |
(...skipping 417 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6111 } | 6111 } |
6112 | 6112 |
6113 return compiler.Assemble(¯o_assembler, | 6113 return compiler.Assemble(¯o_assembler, |
6114 node, | 6114 node, |
6115 data->capture_count, | 6115 data->capture_count, |
6116 pattern); | 6116 pattern); |
6117 } | 6117 } |
6118 | 6118 |
6119 | 6119 |
6120 }} // namespace v8::internal | 6120 }} // namespace v8::internal |
OLD | NEW |