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

Side by Side Diff: src/jsregexp.cc

Issue 165443: X64: Implement RegExp natively. (Closed)
Patch Set: Addressed review comments. Created 11 years, 4 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
OLDNEW
1 // Copyright 2006-2009 the V8 project authors. All rights reserved. 1 // Copyright 2006-2009 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 252 matching lines...) Expand 10 before | Expand all | Expand 10 after
263 263
264 // Irregexp implementation. 264 // Irregexp implementation.
265 265
266 // Ensures that the regexp object contains a compiled version of the 266 // Ensures that the regexp object contains a compiled version of the
267 // source for either ASCII or non-ASCII strings. 267 // source for either ASCII or non-ASCII strings.
268 // If the compiled version doesn't already exist, it is compiled 268 // If the compiled version doesn't already exist, it is compiled
269 // from the source pattern. 269 // from the source pattern.
270 // If compilation fails, an exception is thrown and this function 270 // If compilation fails, an exception is thrown and this function
271 // returns false. 271 // returns false.
272 bool RegExpImpl::EnsureCompiledIrregexp(Handle<JSRegExp> re, bool is_ascii) { 272 bool RegExpImpl::EnsureCompiledIrregexp(Handle<JSRegExp> re, bool is_ascii) {
273 Object* compiled_code = re->DataAt(JSRegExp::code_index(is_ascii));
273 #ifdef V8_NATIVE_REGEXP 274 #ifdef V8_NATIVE_REGEXP
274 if (re->DataAt(JSRegExp::code_index(is_ascii))->IsCode()) return true; 275 if (compiled_code->IsCode()) return true;
275 #else // ! V8_NATIVE_REGEXP (RegExp interpreter code) 276 #else // ! V8_NATIVE_REGEXP (RegExp interpreter code)
276 if (re->DataAt(JSRegExp::code_index(is_ascii))->IsByteArray()) return true; 277 if (compiled_code->IsByteArray()) return true;
277 #endif 278 #endif
278 return CompileIrregexp(re, is_ascii); 279 return CompileIrregexp(re, is_ascii);
279 } 280 }
280 281
281 282
282 bool RegExpImpl::CompileIrregexp(Handle<JSRegExp> re, bool is_ascii) { 283 bool RegExpImpl::CompileIrregexp(Handle<JSRegExp> re, bool is_ascii) {
283 // Compile the RegExp. 284 // Compile the RegExp.
284 CompilationZoneScope zone_scope(DELETE_ON_EXIT); 285 CompilationZoneScope zone_scope(DELETE_ON_EXIT);
285 Object* entry = re->DataAt(JSRegExp::code_index(is_ascii)); 286 Object* entry = re->DataAt(JSRegExp::code_index(is_ascii));
286 if (entry->IsJSObject()) { 287 if (entry->IsJSObject()) {
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
407 if (!subject->IsFlat()) { 408 if (!subject->IsFlat()) {
408 FlattenString(subject); 409 FlattenString(subject);
409 } 410 }
410 411
411 last_match_info->EnsureSize(number_of_capture_registers + kLastMatchOverhead); 412 last_match_info->EnsureSize(number_of_capture_registers + kLastMatchOverhead);
412 413
413 Handle<FixedArray> array; 414 Handle<FixedArray> array;
414 415
415 // Dispatch to the correct RegExp implementation. 416 // Dispatch to the correct RegExp implementation.
416 Handle<FixedArray> regexp(FixedArray::cast(jsregexp->data())); 417 Handle<FixedArray> regexp(FixedArray::cast(jsregexp->data()));
418
417 #ifdef V8_NATIVE_REGEXP 419 #ifdef V8_NATIVE_REGEXP
418 #if V8_TARGET_ARCH_IA32 420 #ifdef V8_TARGET_ARCH_ARM
421 UNIMPLEMENTED();
422 #else // Native regexp supported.
419 OffsetsVector captures(number_of_capture_registers); 423 OffsetsVector captures(number_of_capture_registers);
420 int* captures_vector = captures.vector(); 424 int* captures_vector = captures.vector();
421 RegExpMacroAssemblerIA32::Result res; 425 NativeRegExpMacroAssembler::Result res;
422 do { 426 do {
423 bool is_ascii = subject->IsAsciiRepresentation(); 427 bool is_ascii = subject->IsAsciiRepresentation();
424 if (!EnsureCompiledIrregexp(jsregexp, is_ascii)) { 428 if (!EnsureCompiledIrregexp(jsregexp, is_ascii)) {
425 return Handle<Object>::null(); 429 return Handle<Object>::null();
426 } 430 }
427 Handle<Code> code(RegExpImpl::IrregexpNativeCode(*regexp, is_ascii)); 431 Handle<Code> code(RegExpImpl::IrregexpNativeCode(*regexp, is_ascii));
428 res = RegExpMacroAssemblerIA32::Match(code, 432 res = NativeRegExpMacroAssembler::Match(code,
429 subject, 433 subject,
430 captures_vector, 434 captures_vector,
431 captures.length(), 435 captures.length(),
432 previous_index); 436 previous_index);
433 // If result is RETRY, the string have changed representation, and we 437 // If result is RETRY, the string have changed representation, and we
434 // must restart from scratch. 438 // must restart from scratch.
435 } while (res == RegExpMacroAssemblerIA32::RETRY); 439 } while (res == NativeRegExpMacroAssembler::RETRY);
436 if (res == RegExpMacroAssemblerIA32::EXCEPTION) { 440 if (res == NativeRegExpMacroAssembler::EXCEPTION) {
437 ASSERT(Top::has_pending_exception()); 441 ASSERT(Top::has_pending_exception());
438 return Handle<Object>::null(); 442 return Handle<Object>::null();
439 } 443 }
440 ASSERT(res == RegExpMacroAssemblerIA32::SUCCESS 444 ASSERT(res == NativeRegExpMacroAssembler::SUCCESS
441 || res == RegExpMacroAssemblerIA32::FAILURE); 445 || res == NativeRegExpMacroAssembler::FAILURE);
442 446
443 if (res != RegExpMacroAssemblerIA32::SUCCESS) return Factory::null_value(); 447 if (res != NativeRegExpMacroAssembler::SUCCESS) return Factory::null_value();
444 448
445 array = Handle<FixedArray>(FixedArray::cast(last_match_info->elements())); 449 array = Handle<FixedArray>(FixedArray::cast(last_match_info->elements()));
446 ASSERT(array->length() >= number_of_capture_registers + kLastMatchOverhead); 450 ASSERT(array->length() >= number_of_capture_registers + kLastMatchOverhead);
447 // The captures come in (start, end+1) pairs. 451 // The captures come in (start, end+1) pairs.
448 for (int i = 0; i < number_of_capture_registers; i += 2) { 452 for (int i = 0; i < number_of_capture_registers; i += 2) {
449 SetCapture(*array, i, captures_vector[i]); 453 SetCapture(*array, i, captures_vector[i]);
450 SetCapture(*array, i + 1, captures_vector[i + 1]); 454 SetCapture(*array, i + 1, captures_vector[i + 1]);
451 } 455 }
452 #else // !V8_TARGET_ARCH_IA32 456 #endif // Native regexp supported.
453 UNREACHABLE(); 457
454 #endif // V8_TARGET_ARCH_IA32 458 #else // ! V8_NATIVE_REGEXP
455 #else // !V8_NATIVE_REGEXP
456 bool is_ascii = subject->IsAsciiRepresentation(); 459 bool is_ascii = subject->IsAsciiRepresentation();
457 if (!EnsureCompiledIrregexp(jsregexp, is_ascii)) { 460 if (!EnsureCompiledIrregexp(jsregexp, is_ascii)) {
458 return Handle<Object>::null(); 461 return Handle<Object>::null();
459 } 462 }
460 // Now that we have done EnsureCompiledIrregexp we can get the number of 463 // Now that we have done EnsureCompiledIrregexp we can get the number of
461 // registers. 464 // registers.
462 int number_of_registers = 465 int number_of_registers =
463 IrregexpNumberOfRegisters(FixedArray::cast(jsregexp->data())); 466 IrregexpNumberOfRegisters(FixedArray::cast(jsregexp->data()));
464 OffsetsVector registers(number_of_registers); 467 OffsetsVector registers(number_of_registers);
465 int* register_vector = registers.vector(); 468 int* register_vector = registers.vector();
(...skipping 3984 matching lines...) Expand 10 before | Expand all | Expand 10 after
4450 data->node = node; 4453 data->node = node;
4451 Analysis analysis(ignore_case); 4454 Analysis analysis(ignore_case);
4452 analysis.EnsureAnalyzed(node); 4455 analysis.EnsureAnalyzed(node);
4453 if (analysis.has_failed()) { 4456 if (analysis.has_failed()) {
4454 const char* error_message = analysis.error_message(); 4457 const char* error_message = analysis.error_message();
4455 return CompilationResult(error_message); 4458 return CompilationResult(error_message);
4456 } 4459 }
4457 4460
4458 NodeInfo info = *node->info(); 4461 NodeInfo info = *node->info();
4459 4462
4463 // Create the correct assembler for the architecture.
4460 #ifdef V8_NATIVE_REGEXP 4464 #ifdef V8_NATIVE_REGEXP
4461 #ifdef V8_TARGET_ARCH_ARM 4465 // Native regexp implementation.
4462 // ARM native regexp not implemented yet. 4466
4463 UNREACHABLE(); 4467 NativeRegExpMacroAssembler::Mode mode =
4468 is_ascii ? NativeRegExpMacroAssembler::ASCII
4469 : NativeRegExpMacroAssembler::UC16;
4470
4471 #ifdef V8_TARGET_ARCH_IA32
4472 RegExpMacroAssemblerIA32 macro_assembler(mode,
4473 (data->capture_count + 1) * 2);
4464 #endif 4474 #endif
4465 #ifdef V8_TARGET_ARCH_X64 4475 #ifdef V8_TARGET_ARCH_X64
4466 // X64 native regexp not implemented yet. 4476 RegExpMacroAssemblerX64 macro_assembler(mode,
4467 UNREACHABLE(); 4477 (data->capture_count + 1) * 2);
4468 #endif 4478 #endif
4469 #ifdef V8_TARGET_ARCH_IA32 4479 #ifdef V8_TARGET_ARCH_ARM
4470 RegExpMacroAssemblerIA32::Mode mode; 4480 UNIMPLEMENTED();
4471 if (is_ascii) { 4481 #endif
4472 mode = RegExpMacroAssemblerIA32::ASCII; 4482
4473 } else { 4483 #else // ! V8_NATIVE_REGEXP
4474 mode = RegExpMacroAssemblerIA32::UC16; 4484 // Interpreted regexp implementation.
4475 } 4485 EmbeddedVector<byte, 1024> codes;
4476 RegExpMacroAssemblerIA32 macro_assembler(mode, 4486 RegExpMacroAssemblerIrregexp macro_assembler(codes);
4477 (data->capture_count + 1) * 2); 4487 #endif
4488
4478 return compiler.Assemble(&macro_assembler, 4489 return compiler.Assemble(&macro_assembler,
4479 node, 4490 node,
4480 data->capture_count, 4491 data->capture_count,
4481 pattern); 4492 pattern);
4482 #endif
4483 #else // ! V8_NATIVE_REGEXP
4484 // Interpreted regexp.
4485 EmbeddedVector<byte, 1024> codes;
4486 RegExpMacroAssemblerIrregexp macro_assembler(codes);
4487 return compiler.Assemble(&macro_assembler,
4488 node,
4489 data->capture_count,
4490 pattern);
4491 #endif // V8_NATIVE_REGEXP
4492 } 4493 }
4493 4494
4494 }} // namespace v8::internal 4495 }} // namespace v8::internal
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698