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

Side by Side Diff: src/jsregexp.cc

Issue 10535164: Unbreak interpreted regexp. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 8 years, 6 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/jsregexp.h ('k') | src/mips/regexp-macro-assembler-mips.h » ('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 213 matching lines...) Expand 10 before | Expand all | Expand 10 after
224 Handle<FixedArray> data(FixedArray::cast(re->data())); 224 Handle<FixedArray> data(FixedArray::cast(re->data()));
225 compilation_cache->PutRegExp(pattern, flags, data); 225 compilation_cache->PutRegExp(pattern, flags, data);
226 226
227 return re; 227 return re;
228 } 228 }
229 229
230 230
231 Handle<Object> RegExpImpl::Exec(Handle<JSRegExp> regexp, 231 Handle<Object> RegExpImpl::Exec(Handle<JSRegExp> regexp,
232 Handle<String> subject, 232 Handle<String> subject,
233 int index, 233 int index,
234 Handle<JSArray> last_match_info, 234 Handle<JSArray> last_match_info) {
235 Zone* zone) {
236 switch (regexp->TypeTag()) { 235 switch (regexp->TypeTag()) {
237 case JSRegExp::ATOM: 236 case JSRegExp::ATOM:
238 return AtomExec(regexp, subject, index, last_match_info); 237 return AtomExec(regexp, subject, index, last_match_info);
239 case JSRegExp::IRREGEXP: { 238 case JSRegExp::IRREGEXP: {
240 Handle<Object> result = 239 Handle<Object> result =
241 IrregexpExec(regexp, subject, index, last_match_info, zone); 240 IrregexpExec(regexp, subject, index, last_match_info);
242 ASSERT(!result.is_null() || 241 ASSERT(!result.is_null() ||
243 regexp->GetIsolate()->has_pending_exception()); 242 regexp->GetIsolate()->has_pending_exception());
244 return result; 243 return result;
245 } 244 }
246 default: 245 default:
247 UNREACHABLE(); 246 UNREACHABLE();
248 return Handle<Object>::null(); 247 return Handle<Object>::null();
249 } 248 }
250 } 249 }
251 250
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
338 337
339 // Irregexp implementation. 338 // Irregexp implementation.
340 339
341 // Ensures that the regexp object contains a compiled version of the 340 // Ensures that the regexp object contains a compiled version of the
342 // source for either ASCII or non-ASCII strings. 341 // source for either ASCII or non-ASCII strings.
343 // If the compiled version doesn't already exist, it is compiled 342 // If the compiled version doesn't already exist, it is compiled
344 // from the source pattern. 343 // from the source pattern.
345 // If compilation fails, an exception is thrown and this function 344 // If compilation fails, an exception is thrown and this function
346 // returns false. 345 // returns false.
347 bool RegExpImpl::EnsureCompiledIrregexp( 346 bool RegExpImpl::EnsureCompiledIrregexp(
348 Handle<JSRegExp> re, Handle<String> sample_subject, bool is_ascii, 347 Handle<JSRegExp> re, Handle<String> sample_subject, bool is_ascii) {
349 Zone* zone) {
350 Object* compiled_code = re->DataAt(JSRegExp::code_index(is_ascii)); 348 Object* compiled_code = re->DataAt(JSRegExp::code_index(is_ascii));
351 #ifdef V8_INTERPRETED_REGEXP 349 #ifdef V8_INTERPRETED_REGEXP
352 if (compiled_code->IsByteArray()) return true; 350 if (compiled_code->IsByteArray()) return true;
353 #else // V8_INTERPRETED_REGEXP (RegExp native code) 351 #else // V8_INTERPRETED_REGEXP (RegExp native code)
354 if (compiled_code->IsCode()) return true; 352 if (compiled_code->IsCode()) return true;
355 #endif 353 #endif
356 // We could potentially have marked this as flushable, but have kept 354 // We could potentially have marked this as flushable, but have kept
357 // a saved version if we did not flush it yet. 355 // a saved version if we did not flush it yet.
358 Object* saved_code = re->DataAt(JSRegExp::saved_code_index(is_ascii)); 356 Object* saved_code = re->DataAt(JSRegExp::saved_code_index(is_ascii));
359 if (saved_code->IsCode()) { 357 if (saved_code->IsCode()) {
360 // Reinstate the code in the original place. 358 // Reinstate the code in the original place.
361 re->SetDataAt(JSRegExp::code_index(is_ascii), saved_code); 359 re->SetDataAt(JSRegExp::code_index(is_ascii), saved_code);
362 ASSERT(compiled_code->IsSmi()); 360 ASSERT(compiled_code->IsSmi());
363 return true; 361 return true;
364 } 362 }
365 return CompileIrregexp(re, sample_subject, is_ascii, zone); 363 return CompileIrregexp(re, sample_subject, is_ascii);
366 } 364 }
367 365
368 366
369 static bool CreateRegExpErrorObjectAndThrow(Handle<JSRegExp> re, 367 static bool CreateRegExpErrorObjectAndThrow(Handle<JSRegExp> re,
370 bool is_ascii, 368 bool is_ascii,
371 Handle<String> error_message, 369 Handle<String> error_message,
372 Isolate* isolate) { 370 Isolate* isolate) {
373 Factory* factory = isolate->factory(); 371 Factory* factory = isolate->factory();
374 Handle<FixedArray> elements = factory->NewFixedArray(2); 372 Handle<FixedArray> elements = factory->NewFixedArray(2);
375 elements->set(0, re->Pattern()); 373 elements->set(0, re->Pattern());
376 elements->set(1, *error_message); 374 elements->set(1, *error_message);
377 Handle<JSArray> array = factory->NewJSArrayWithElements(elements); 375 Handle<JSArray> array = factory->NewJSArrayWithElements(elements);
378 Handle<Object> regexp_err = 376 Handle<Object> regexp_err =
379 factory->NewSyntaxError("malformed_regexp", array); 377 factory->NewSyntaxError("malformed_regexp", array);
380 isolate->Throw(*regexp_err); 378 isolate->Throw(*regexp_err);
381 return false; 379 return false;
382 } 380 }
383 381
384 382
385 bool RegExpImpl::CompileIrregexp(Handle<JSRegExp> re, 383 bool RegExpImpl::CompileIrregexp(Handle<JSRegExp> re,
386 Handle<String> sample_subject, 384 Handle<String> sample_subject,
387 bool is_ascii, 385 bool is_ascii) {
388 Zone* zone) {
389 // Compile the RegExp. 386 // Compile the RegExp.
390 Isolate* isolate = re->GetIsolate(); 387 Isolate* isolate = re->GetIsolate();
391 ZoneScope zone_scope(isolate, DELETE_ON_EXIT); 388 ZoneScope zone_scope(isolate, DELETE_ON_EXIT);
392 PostponeInterruptsScope postpone(isolate); 389 PostponeInterruptsScope postpone(isolate);
393 // If we had a compilation error the last time this is saved at the 390 // If we had a compilation error the last time this is saved at the
394 // saved code index. 391 // saved code index.
395 Object* entry = re->DataAt(JSRegExp::code_index(is_ascii)); 392 Object* entry = re->DataAt(JSRegExp::code_index(is_ascii));
396 // When arriving here entry can only be a smi, either representing an 393 // When arriving here entry can only be a smi, either representing an
397 // uncompiled regexp, a previous compilation error, or code that has 394 // uncompiled regexp, a previous compilation error, or code that has
398 // been flushed. 395 // been flushed.
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
430 return false; 427 return false;
431 } 428 }
432 RegExpEngine::CompilationResult result = 429 RegExpEngine::CompilationResult result =
433 RegExpEngine::Compile(&compile_data, 430 RegExpEngine::Compile(&compile_data,
434 flags.is_ignore_case(), 431 flags.is_ignore_case(),
435 flags.is_global(), 432 flags.is_global(),
436 flags.is_multiline(), 433 flags.is_multiline(),
437 pattern, 434 pattern,
438 sample_subject, 435 sample_subject,
439 is_ascii, 436 is_ascii,
440 zone); 437 isolate->zone());
441 if (result.error_message != NULL) { 438 if (result.error_message != NULL) {
442 // Unable to compile regexp. 439 // Unable to compile regexp.
443 Handle<String> error_message = 440 Handle<String> error_message =
444 isolate->factory()->NewStringFromUtf8(CStrVector(result.error_message)); 441 isolate->factory()->NewStringFromUtf8(CStrVector(result.error_message));
445 CreateRegExpErrorObjectAndThrow(re, is_ascii, error_message, isolate); 442 CreateRegExpErrorObjectAndThrow(re, is_ascii, error_message, isolate);
446 return false; 443 return false;
447 } 444 }
448 445
449 Handle<FixedArray> data = Handle<FixedArray>(FixedArray::cast(re->data())); 446 Handle<FixedArray> data = Handle<FixedArray>(FixedArray::cast(re->data()));
450 data->set(JSRegExp::code_index(is_ascii), result.code); 447 data->set(JSRegExp::code_index(is_ascii), result.code);
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
495 // Initialize compiled code entries to null. 492 // Initialize compiled code entries to null.
496 re->GetIsolate()->factory()->SetRegExpIrregexpData(re, 493 re->GetIsolate()->factory()->SetRegExpIrregexpData(re,
497 JSRegExp::IRREGEXP, 494 JSRegExp::IRREGEXP,
498 pattern, 495 pattern,
499 flags, 496 flags,
500 capture_count); 497 capture_count);
501 } 498 }
502 499
503 500
504 int RegExpImpl::IrregexpPrepare(Handle<JSRegExp> regexp, 501 int RegExpImpl::IrregexpPrepare(Handle<JSRegExp> regexp,
505 Handle<String> subject, 502 Handle<String> subject) {
506 Zone* zone) {
507 if (!subject->IsFlat()) FlattenString(subject); 503 if (!subject->IsFlat()) FlattenString(subject);
508 504
509 // Check the asciiness of the underlying storage. 505 // Check the asciiness of the underlying storage.
510 bool is_ascii = subject->IsAsciiRepresentationUnderneath(); 506 bool is_ascii = subject->IsAsciiRepresentationUnderneath();
511 if (!EnsureCompiledIrregexp(regexp, subject, is_ascii, zone)) return -1; 507 if (!EnsureCompiledIrregexp(regexp, subject, is_ascii)) return -1;
512 508
513 #ifdef V8_INTERPRETED_REGEXP 509 #ifdef V8_INTERPRETED_REGEXP
514 // Byte-code regexp needs space allocated for all its registers. 510 // Byte-code regexp needs space allocated for all its registers.
515 return IrregexpNumberOfRegisters(FixedArray::cast(regexp->data())); 511 return IrregexpNumberOfRegisters(FixedArray::cast(regexp->data()));
516 #else // V8_INTERPRETED_REGEXP 512 #else // V8_INTERPRETED_REGEXP
517 // Native regexp only needs room to output captures. Registers are handled 513 // Native regexp only needs room to output captures. Registers are handled
518 // internally. 514 // internally.
519 return (IrregexpNumberOfCaptures(FixedArray::cast(regexp->data())) + 1) * 2; 515 return (IrregexpNumberOfCaptures(FixedArray::cast(regexp->data())) + 1) * 2;
520 #endif // V8_INTERPRETED_REGEXP 516 #endif // V8_INTERPRETED_REGEXP
521 } 517 }
(...skipping 12 matching lines...) Expand all
534 *max_matches = size / registers_per_match; 530 *max_matches = size / registers_per_match;
535 return size; 531 return size;
536 #endif // V8_INTERPRETED_REGEXP 532 #endif // V8_INTERPRETED_REGEXP
537 } 533 }
538 534
539 535
540 int RegExpImpl::IrregexpExecRaw( 536 int RegExpImpl::IrregexpExecRaw(
541 Handle<JSRegExp> regexp, 537 Handle<JSRegExp> regexp,
542 Handle<String> subject, 538 Handle<String> subject,
543 int index, 539 int index,
544 Vector<int> output, 540 Vector<int> output) {
545 Zone* zone) {
546 Isolate* isolate = regexp->GetIsolate(); 541 Isolate* isolate = regexp->GetIsolate();
547 542
548 Handle<FixedArray> irregexp(FixedArray::cast(regexp->data()), isolate); 543 Handle<FixedArray> irregexp(FixedArray::cast(regexp->data()), isolate);
549 544
550 ASSERT(index >= 0); 545 ASSERT(index >= 0);
551 ASSERT(index <= subject->length()); 546 ASSERT(index <= subject->length());
552 ASSERT(subject->IsFlat()); 547 ASSERT(subject->IsFlat());
553 548
554 bool is_ascii = subject->IsAsciiRepresentationUnderneath(); 549 bool is_ascii = subject->IsAsciiRepresentationUnderneath();
555 550
556 #ifndef V8_INTERPRETED_REGEXP 551 #ifndef V8_INTERPRETED_REGEXP
557 ASSERT(output.length() >= (IrregexpNumberOfCaptures(*irregexp) + 1) * 2); 552 ASSERT(output.length() >= (IrregexpNumberOfCaptures(*irregexp) + 1) * 2);
558 do { 553 do {
559 EnsureCompiledIrregexp(regexp, subject, is_ascii, zone); 554 EnsureCompiledIrregexp(regexp, subject, is_ascii);
560 Handle<Code> code(IrregexpNativeCode(*irregexp, is_ascii), isolate); 555 Handle<Code> code(IrregexpNativeCode(*irregexp, is_ascii), isolate);
561 NativeRegExpMacroAssembler::Result res = 556 NativeRegExpMacroAssembler::Result res =
562 NativeRegExpMacroAssembler::Match(code, 557 NativeRegExpMacroAssembler::Match(code,
563 subject, 558 subject,
564 output.start(), 559 output.start(),
565 output.length(), 560 output.length(),
566 index, 561 index,
567 isolate); 562 isolate);
568 if (res != NativeRegExpMacroAssembler::RETRY) { 563 if (res != NativeRegExpMacroAssembler::RETRY) {
569 ASSERT(res != NativeRegExpMacroAssembler::EXCEPTION || 564 ASSERT(res != NativeRegExpMacroAssembler::EXCEPTION ||
570 isolate->has_pending_exception()); 565 isolate->has_pending_exception());
571 STATIC_ASSERT( 566 STATIC_ASSERT(
572 static_cast<int>(NativeRegExpMacroAssembler::SUCCESS) == RE_SUCCESS); 567 static_cast<int>(NativeRegExpMacroAssembler::SUCCESS) == RE_SUCCESS);
573 STATIC_ASSERT( 568 STATIC_ASSERT(
574 static_cast<int>(NativeRegExpMacroAssembler::FAILURE) == RE_FAILURE); 569 static_cast<int>(NativeRegExpMacroAssembler::FAILURE) == RE_FAILURE);
575 STATIC_ASSERT(static_cast<int>(NativeRegExpMacroAssembler::EXCEPTION) 570 STATIC_ASSERT(static_cast<int>(NativeRegExpMacroAssembler::EXCEPTION)
576 == RE_EXCEPTION); 571 == RE_EXCEPTION);
577 return static_cast<IrregexpResult>(res); 572 return static_cast<IrregexpResult>(res);
578 } 573 }
579 // If result is RETRY, the string has changed representation, and we 574 // If result is RETRY, the string has changed representation, and we
580 // must restart from scratch. 575 // must restart from scratch.
581 // In this case, it means we must make sure we are prepared to handle 576 // In this case, it means we must make sure we are prepared to handle
582 // the, potentially, different subject (the string can switch between 577 // the, potentially, different subject (the string can switch between
583 // being internal and external, and even between being ASCII and UC16, 578 // being internal and external, and even between being ASCII and UC16,
584 // but the characters are always the same). 579 // but the characters are always the same).
585 IrregexpPrepare(regexp, subject, zone); 580 IrregexpPrepare(regexp, subject);
586 is_ascii = subject->IsAsciiRepresentationUnderneath(); 581 is_ascii = subject->IsAsciiRepresentationUnderneath();
587 } while (true); 582 } while (true);
588 UNREACHABLE(); 583 UNREACHABLE();
589 return RE_EXCEPTION; 584 return RE_EXCEPTION;
590 #else // V8_INTERPRETED_REGEXP 585 #else // V8_INTERPRETED_REGEXP
591 586
592 ASSERT(output.length() >= IrregexpNumberOfRegisters(*irregexp)); 587 ASSERT(output.length() >= IrregexpNumberOfRegisters(*irregexp));
593 // We must have done EnsureCompiledIrregexp, so we can get the number of 588 // We must have done EnsureCompiledIrregexp, so we can get the number of
594 // registers. 589 // registers.
595 int* register_vector = output.start(); 590 int* register_vector = output.start();
(...skipping 14 matching lines...) Expand all
610 isolate->StackOverflow(); 605 isolate->StackOverflow();
611 } 606 }
612 return result; 607 return result;
613 #endif // V8_INTERPRETED_REGEXP 608 #endif // V8_INTERPRETED_REGEXP
614 } 609 }
615 610
616 611
617 Handle<Object> RegExpImpl::IrregexpExec(Handle<JSRegExp> jsregexp, 612 Handle<Object> RegExpImpl::IrregexpExec(Handle<JSRegExp> jsregexp,
618 Handle<String> subject, 613 Handle<String> subject,
619 int previous_index, 614 int previous_index,
620 Handle<JSArray> last_match_info, 615 Handle<JSArray> last_match_info) {
621 Zone* zone) {
622 Isolate* isolate = jsregexp->GetIsolate(); 616 Isolate* isolate = jsregexp->GetIsolate();
623 ASSERT_EQ(jsregexp->TypeTag(), JSRegExp::IRREGEXP); 617 ASSERT_EQ(jsregexp->TypeTag(), JSRegExp::IRREGEXP);
624 618
625 // Prepare space for the return values. 619 // Prepare space for the return values.
626 #ifdef V8_INTERPRETED_REGEXP 620 #ifdef V8_INTERPRETED_REGEXP
627 #ifdef DEBUG 621 #ifdef DEBUG
628 if (FLAG_trace_regexp_bytecodes) { 622 if (FLAG_trace_regexp_bytecodes) {
629 String* pattern = jsregexp->Pattern(); 623 String* pattern = jsregexp->Pattern();
630 PrintF("\n\nRegexp match: /%s/\n\n", *(pattern->ToCString())); 624 PrintF("\n\nRegexp match: /%s/\n\n", *(pattern->ToCString()));
631 PrintF("\n\nSubject string: '%s'\n\n", *(subject->ToCString())); 625 PrintF("\n\nSubject string: '%s'\n\n", *(subject->ToCString()));
632 } 626 }
633 #endif 627 #endif
634 #endif 628 #endif
635 int required_registers = RegExpImpl::IrregexpPrepare(jsregexp, subject, zone); 629 int required_registers = RegExpImpl::IrregexpPrepare(jsregexp, subject);
636 if (required_registers < 0) { 630 if (required_registers < 0) {
637 // Compiling failed with an exception. 631 // Compiling failed with an exception.
638 ASSERT(isolate->has_pending_exception()); 632 ASSERT(isolate->has_pending_exception());
639 return Handle<Object>::null(); 633 return Handle<Object>::null();
640 } 634 }
641 635
642 OffsetsVector registers(required_registers, isolate); 636 OffsetsVector registers(required_registers, isolate);
643 637
644 int res = RegExpImpl::IrregexpExecRaw(jsregexp, subject, previous_index, 638 int res = RegExpImpl::IrregexpExecRaw(jsregexp, subject, previous_index,
645 Vector<int>(registers.vector(), 639 Vector<int>(registers.vector(),
646 registers.length()), 640 registers.length()));
647 zone);
648 if (res == RE_SUCCESS) { 641 if (res == RE_SUCCESS) {
649 int capture_register_count = 642 int capture_register_count =
650 (IrregexpNumberOfCaptures(FixedArray::cast(jsregexp->data())) + 1) * 2; 643 (IrregexpNumberOfCaptures(FixedArray::cast(jsregexp->data())) + 1) * 2;
651 last_match_info->EnsureSize(capture_register_count + kLastMatchOverhead); 644 last_match_info->EnsureSize(capture_register_count + kLastMatchOverhead);
652 AssertNoAllocation no_gc; 645 AssertNoAllocation no_gc;
653 int* register_vector = registers.vector(); 646 int* register_vector = registers.vector();
654 FixedArray* array = FixedArray::cast(last_match_info->elements()); 647 FixedArray* array = FixedArray::cast(last_match_info->elements());
655 for (int i = 0; i < capture_register_count; i += 2) { 648 for (int i = 0; i < capture_register_count; i += 2) {
656 SetCapture(array, i, register_vector[i]); 649 SetCapture(array, i, register_vector[i]);
657 SetCapture(array, i + 1, register_vector[i + 1]); 650 SetCapture(array, i + 1, register_vector[i + 1]);
(...skipping 5322 matching lines...) Expand 10 before | Expand all | Expand 10 after
5980 RegExpMacroAssemblerARM macro_assembler(mode, (data->capture_count + 1) * 2, 5973 RegExpMacroAssemblerARM macro_assembler(mode, (data->capture_count + 1) * 2,
5981 zone); 5974 zone);
5982 #elif V8_TARGET_ARCH_MIPS 5975 #elif V8_TARGET_ARCH_MIPS
5983 RegExpMacroAssemblerMIPS macro_assembler(mode, (data->capture_count + 1) * 2, 5976 RegExpMacroAssemblerMIPS macro_assembler(mode, (data->capture_count + 1) * 2,
5984 zone); 5977 zone);
5985 #endif 5978 #endif
5986 5979
5987 #else // V8_INTERPRETED_REGEXP 5980 #else // V8_INTERPRETED_REGEXP
5988 // Interpreted regexp implementation. 5981 // Interpreted regexp implementation.
5989 EmbeddedVector<byte, 1024> codes; 5982 EmbeddedVector<byte, 1024> codes;
5990 RegExpMacroAssemblerIrregexp macro_assembler(codes); 5983 RegExpMacroAssemblerIrregexp macro_assembler(codes, zone);
5991 #endif // V8_INTERPRETED_REGEXP 5984 #endif // V8_INTERPRETED_REGEXP
5992 5985
5993 // Inserted here, instead of in Assembler, because it depends on information 5986 // Inserted here, instead of in Assembler, because it depends on information
5994 // in the AST that isn't replicated in the Node structure. 5987 // in the AST that isn't replicated in the Node structure.
5995 static const int kMaxBacksearchLimit = 1024; 5988 static const int kMaxBacksearchLimit = 1024;
5996 if (is_end_anchored && 5989 if (is_end_anchored &&
5997 !is_start_anchored && 5990 !is_start_anchored &&
5998 max_length < kMaxBacksearchLimit) { 5991 max_length < kMaxBacksearchLimit) {
5999 macro_assembler.SetCurrentPositionFromEnd(max_length); 5992 macro_assembler.SetCurrentPositionFromEnd(max_length);
6000 } 5993 }
6001 5994
6002 if (is_global) { 5995 if (is_global) {
6003 macro_assembler.set_global_mode( 5996 macro_assembler.set_global_mode(
6004 (data->tree->min_match() > 0) 5997 (data->tree->min_match() > 0)
6005 ? RegExpMacroAssembler::GLOBAL_NO_ZERO_LENGTH_CHECK 5998 ? RegExpMacroAssembler::GLOBAL_NO_ZERO_LENGTH_CHECK
6006 : RegExpMacroAssembler::GLOBAL); 5999 : RegExpMacroAssembler::GLOBAL);
6007 } 6000 }
6008 6001
6009 return compiler.Assemble(&macro_assembler, 6002 return compiler.Assemble(&macro_assembler,
6010 node, 6003 node,
6011 data->capture_count, 6004 data->capture_count,
6012 pattern); 6005 pattern);
6013 } 6006 }
6014 6007
6015 6008
6016 }} // namespace v8::internal 6009 }} // namespace v8::internal
OLDNEW
« no previous file with comments | « src/jsregexp.h ('k') | src/mips/regexp-macro-assembler-mips.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698