Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(416)

Side by Side Diff: src/jsregexp.cc

Issue 228093004: Implement handlified String::Flatten. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: even shorter Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/json-stringifier.h ('k') | src/liveedit.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 166 matching lines...) Expand 10 before | Expand all | Expand 10 after
177 CompilationCache* compilation_cache = isolate->compilation_cache(); 177 CompilationCache* compilation_cache = isolate->compilation_cache();
178 Handle<FixedArray> cached = compilation_cache->LookupRegExp(pattern, flags); 178 Handle<FixedArray> cached = compilation_cache->LookupRegExp(pattern, flags);
179 bool in_cache = !cached.is_null(); 179 bool in_cache = !cached.is_null();
180 LOG(isolate, RegExpCompileEvent(re, in_cache)); 180 LOG(isolate, RegExpCompileEvent(re, in_cache));
181 181
182 Handle<Object> result; 182 Handle<Object> result;
183 if (in_cache) { 183 if (in_cache) {
184 re->set_data(*cached); 184 re->set_data(*cached);
185 return re; 185 return re;
186 } 186 }
187 pattern = FlattenGetString(pattern); 187 pattern = String::Flatten(pattern);
188 PostponeInterruptsScope postpone(isolate); 188 PostponeInterruptsScope postpone(isolate);
189 RegExpCompileData parse_result; 189 RegExpCompileData parse_result;
190 FlatStringReader reader(isolate, pattern); 190 FlatStringReader reader(isolate, pattern);
191 if (!RegExpParser::ParseRegExp(&reader, flags.is_multiline(), 191 if (!RegExpParser::ParseRegExp(&reader, flags.is_multiline(),
192 &parse_result, &zone)) { 192 &parse_result, &zone)) {
193 // Throw an exception if we fail to parse the pattern. 193 // Throw an exception if we fail to parse the pattern.
194 ThrowRegExpException(re, 194 ThrowRegExpException(re,
195 pattern, 195 pattern,
196 parse_result.error, 196 parse_result.error,
197 "malformed_regexp"); 197 "malformed_regexp");
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
283 int RegExpImpl::AtomExecRaw(Handle<JSRegExp> regexp, 283 int RegExpImpl::AtomExecRaw(Handle<JSRegExp> regexp,
284 Handle<String> subject, 284 Handle<String> subject,
285 int index, 285 int index,
286 int32_t* output, 286 int32_t* output,
287 int output_size) { 287 int output_size) {
288 Isolate* isolate = regexp->GetIsolate(); 288 Isolate* isolate = regexp->GetIsolate();
289 289
290 ASSERT(0 <= index); 290 ASSERT(0 <= index);
291 ASSERT(index <= subject->length()); 291 ASSERT(index <= subject->length());
292 292
293 if (!subject->IsFlat()) FlattenString(subject); 293 subject = String::Flatten(subject);
294 DisallowHeapAllocation no_gc; // ensure vectors stay valid 294 DisallowHeapAllocation no_gc; // ensure vectors stay valid
295 295
296 String* needle = String::cast(regexp->DataAt(JSRegExp::kAtomPatternIndex)); 296 String* needle = String::cast(regexp->DataAt(JSRegExp::kAtomPatternIndex));
297 int needle_len = needle->length(); 297 int needle_len = needle->length();
298 ASSERT(needle->IsFlat()); 298 ASSERT(needle->IsFlat());
299 ASSERT_LT(0, needle_len); 299 ASSERT_LT(0, needle_len);
300 300
301 if (index + needle_len > subject->length()) { 301 if (index + needle_len > subject->length()) {
302 return RegExpImpl::RE_FAILURE; 302 return RegExpImpl::RE_FAILURE;
303 } 303 }
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
432 Object* error_string = re->DataAt(JSRegExp::saved_code_index(is_ascii)); 432 Object* error_string = re->DataAt(JSRegExp::saved_code_index(is_ascii));
433 ASSERT(error_string->IsString()); 433 ASSERT(error_string->IsString());
434 Handle<String> error_message(String::cast(error_string)); 434 Handle<String> error_message(String::cast(error_string));
435 CreateRegExpErrorObjectAndThrow(re, is_ascii, error_message, isolate); 435 CreateRegExpErrorObjectAndThrow(re, is_ascii, error_message, isolate);
436 return false; 436 return false;
437 } 437 }
438 438
439 JSRegExp::Flags flags = re->GetFlags(); 439 JSRegExp::Flags flags = re->GetFlags();
440 440
441 Handle<String> pattern(re->Pattern()); 441 Handle<String> pattern(re->Pattern());
442 if (!pattern->IsFlat()) FlattenString(pattern); 442 pattern = String::Flatten(pattern);
443 RegExpCompileData compile_data; 443 RegExpCompileData compile_data;
444 FlatStringReader reader(isolate, pattern); 444 FlatStringReader reader(isolate, pattern);
445 if (!RegExpParser::ParseRegExp(&reader, flags.is_multiline(), 445 if (!RegExpParser::ParseRegExp(&reader, flags.is_multiline(),
446 &compile_data, 446 &compile_data,
447 &zone)) { 447 &zone)) {
448 // Throw an exception if we fail to parse the pattern. 448 // Throw an exception if we fail to parse the pattern.
449 // THIS SHOULD NOT HAPPEN. We already pre-parsed it successfully once. 449 // THIS SHOULD NOT HAPPEN. We already pre-parsed it successfully once.
450 ThrowRegExpException(re, 450 ThrowRegExpException(re,
451 pattern, 451 pattern,
452 compile_data.error, 452 compile_data.error,
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
521 re->GetIsolate()->factory()->SetRegExpIrregexpData(re, 521 re->GetIsolate()->factory()->SetRegExpIrregexpData(re,
522 JSRegExp::IRREGEXP, 522 JSRegExp::IRREGEXP,
523 pattern, 523 pattern,
524 flags, 524 flags,
525 capture_count); 525 capture_count);
526 } 526 }
527 527
528 528
529 int RegExpImpl::IrregexpPrepare(Handle<JSRegExp> regexp, 529 int RegExpImpl::IrregexpPrepare(Handle<JSRegExp> regexp,
530 Handle<String> subject) { 530 Handle<String> subject) {
531 if (!subject->IsFlat()) FlattenString(subject); 531 subject = String::Flatten(subject);
532 532
533 // Check the asciiness of the underlying storage. 533 // Check the asciiness of the underlying storage.
534 bool is_ascii = subject->IsOneByteRepresentationUnderneath(); 534 bool is_ascii = subject->IsOneByteRepresentationUnderneath();
535 if (!EnsureCompiledIrregexp(regexp, subject, is_ascii)) return -1; 535 if (!EnsureCompiledIrregexp(regexp, subject, is_ascii)) return -1;
536 536
537 #ifdef V8_INTERPRETED_REGEXP 537 #ifdef V8_INTERPRETED_REGEXP
538 // Byte-code regexp needs space allocated for all its registers. 538 // Byte-code regexp needs space allocated for all its registers.
539 // The result captures are copied to the start of the registers array 539 // The result captures are copied to the start of the registers array
540 // if the match succeeds. This way those registers are not clobbered 540 // if the match succeeds. This way those registers are not clobbered
541 // when we set the last match info from last successful match. 541 // when we set the last match info from last successful match.
(...skipping 5466 matching lines...) Expand 10 before | Expand all | Expand 10 after
6008 bool is_ascii, 6008 bool is_ascii,
6009 Zone* zone) { 6009 Zone* zone) {
6010 if ((data->capture_count + 1) * 2 - 1 > RegExpMacroAssembler::kMaxRegister) { 6010 if ((data->capture_count + 1) * 2 - 1 > RegExpMacroAssembler::kMaxRegister) {
6011 return IrregexpRegExpTooBig(zone->isolate()); 6011 return IrregexpRegExpTooBig(zone->isolate());
6012 } 6012 }
6013 RegExpCompiler compiler(data->capture_count, ignore_case, is_ascii, zone); 6013 RegExpCompiler compiler(data->capture_count, ignore_case, is_ascii, zone);
6014 6014
6015 // Sample some characters from the middle of the string. 6015 // Sample some characters from the middle of the string.
6016 static const int kSampleSize = 128; 6016 static const int kSampleSize = 128;
6017 6017
6018 FlattenString(sample_subject); 6018 sample_subject = String::Flatten(sample_subject);
6019 int chars_sampled = 0; 6019 int chars_sampled = 0;
6020 int half_way = (sample_subject->length() - kSampleSize) / 2; 6020 int half_way = (sample_subject->length() - kSampleSize) / 2;
6021 for (int i = Max(0, half_way); 6021 for (int i = Max(0, half_way);
6022 i < sample_subject->length() && chars_sampled < kSampleSize; 6022 i < sample_subject->length() && chars_sampled < kSampleSize;
6023 i++, chars_sampled++) { 6023 i++, chars_sampled++) {
6024 compiler.frequency_collator()->CountCharacter(sample_subject->Get(i)); 6024 compiler.frequency_collator()->CountCharacter(sample_subject->Get(i));
6025 } 6025 }
6026 6026
6027 // Wrap the body of the regexp in capture #0. 6027 // Wrap the body of the regexp in capture #0.
6028 RegExpNode* captured_body = RegExpCapture::ToNode(data->tree, 6028 RegExpNode* captured_body = RegExpCapture::ToNode(data->tree,
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
6125 } 6125 }
6126 6126
6127 return compiler.Assemble(&macro_assembler, 6127 return compiler.Assemble(&macro_assembler,
6128 node, 6128 node,
6129 data->capture_count, 6129 data->capture_count,
6130 pattern); 6130 pattern);
6131 } 6131 }
6132 6132
6133 6133
6134 }} // namespace v8::internal 6134 }} // namespace v8::internal
OLDNEW
« no previous file with comments | « src/json-stringifier.h ('k') | src/liveedit.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698