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

Side by Side Diff: src/runtime.cc

Issue 650036: Land patch by Oleg Eterevsky (oleg@chromium.org). (Closed)
Patch Set: Created 10 years, 10 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 2348 matching lines...) Expand 10 before | Expand all | Expand 10 after
2359 // Dispatch to different algorithms. 2359 // Dispatch to different algorithms.
2360 template <typename schar, typename pchar> 2360 template <typename schar, typename pchar>
2361 static int StringMatchStrategy(Vector<const schar> sub, 2361 static int StringMatchStrategy(Vector<const schar> sub,
2362 Vector<const pchar> pat, 2362 Vector<const pchar> pat,
2363 int start_index) { 2363 int start_index) {
2364 ASSERT(pat.length() > 1); 2364 ASSERT(pat.length() > 1);
2365 2365
2366 // We have an ASCII haystack and a non-ASCII needle. Check if there 2366 // We have an ASCII haystack and a non-ASCII needle. Check if there
2367 // really is a non-ASCII character in the needle and bail out if there 2367 // really is a non-ASCII character in the needle and bail out if there
2368 // is. 2368 // is.
2369 if (sizeof(pchar) > 1 && sizeof(schar) == 1) { 2369 if (sizeof(schar) == 1 && sizeof(pchar) > 1) {
2370 for (int i = 0; i < pat.length(); i++) { 2370 for (int i = 0; i < pat.length(); i++) {
2371 uc16 c = pat[i]; 2371 uc16 c = pat[i];
2372 if (c > String::kMaxAsciiCharCode) { 2372 if (c > String::kMaxAsciiCharCode) {
2373 return -1; 2373 return -1;
2374 } 2374 }
2375 } 2375 }
2376 } 2376 }
2377 if (pat.length() < kBMMinPatternLength) { 2377 if (pat.length() < kBMMinPatternLength) {
2378 // We don't believe fancy searching can ever be more efficient. 2378 // We don't believe fancy searching can ever be more efficient.
2379 // The max shift of Boyer-Moore on a pattern of this length does 2379 // The max shift of Boyer-Moore on a pattern of this length does
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
2462 Object* index = args[2]; 2462 Object* index = args[2];
2463 uint32_t start_index; 2463 uint32_t start_index;
2464 if (!Array::IndexFromObject(index, &start_index)) return Smi::FromInt(-1); 2464 if (!Array::IndexFromObject(index, &start_index)) return Smi::FromInt(-1);
2465 2465
2466 RUNTIME_ASSERT(start_index <= static_cast<uint32_t>(sub->length())); 2466 RUNTIME_ASSERT(start_index <= static_cast<uint32_t>(sub->length()));
2467 int position = Runtime::StringMatch(sub, pat, start_index); 2467 int position = Runtime::StringMatch(sub, pat, start_index);
2468 return Smi::FromInt(position); 2468 return Smi::FromInt(position);
2469 } 2469 }
2470 2470
2471 2471
2472 template <typename schar, typename pchar>
2473 static int StringMatchBackwards(Vector<const schar> sub,
2474 Vector<const pchar> pat,
2475 int idx) {
2476 ASSERT(pat.length() >= 1);
2477 ASSERT(idx + pat.length() <= sub.length());
2478
2479 if (sizeof(schar) == 1 && sizeof(pchar) > 1) {
2480 for (int i = 0; i < pat.length(); i++) {
2481 uc16 c = pat[i];
2482 if (c > String::kMaxAsciiCharCode) {
2483 return -1;
2484 }
2485 }
2486 }
2487
2488 pchar pattern_first_char = pat[0];
2489 for (int i = idx; i >= 0; i--) {
2490 if (sub[i] != pattern_first_char) continue;
2491 int j = 1;
2492 while (j < pat.length()) {
2493 if (pat[j] != sub[i+j]) {
2494 break;
2495 }
2496 j++;
2497 }
2498 if (j == pat.length()) {
2499 return i;
2500 }
2501 }
2502 return -1;
2503 }
2504
2472 static Object* Runtime_StringLastIndexOf(Arguments args) { 2505 static Object* Runtime_StringLastIndexOf(Arguments args) {
2473 NoHandleAllocation ha; 2506 HandleScope scope; // create a new handle scope
Mads Ager (chromium) 2010/02/22 11:30:04 Comment seems redundant here.
2474 ASSERT(args.length() == 3); 2507 ASSERT(args.length() == 3);
2475 2508
2476 CONVERT_ARG_CHECKED(String, sub, 0); 2509 CONVERT_ARG_CHECKED(String, sub, 0);
2477 CONVERT_ARG_CHECKED(String, pat, 1); 2510 CONVERT_ARG_CHECKED(String, pat, 1);
2511
2478 Object* index = args[2]; 2512 Object* index = args[2];
2479
2480 uint32_t start_index; 2513 uint32_t start_index;
2481 if (!Array::IndexFromObject(index, &start_index)) return Smi::FromInt(-1); 2514 if (!Array::IndexFromObject(index, &start_index)) return Smi::FromInt(-1);
2482 2515
2516 uint32_t pat_length = pat->length();
2517 uint32_t sub_length = sub->length();
2518
2519 if (start_index + pat_length > sub_length) {
2520 start_index = sub_length - pat_length;
2521 }
2522
2523 if (pat_length == 0) {
2524 return Smi::FromInt(start_index);
2525 }
2526
2483 if (!sub->IsFlat()) { 2527 if (!sub->IsFlat()) {
2484 FlattenString(sub); 2528 FlattenString(sub);
2485 } 2529 }
2486 2530
2487 uint32_t pattern_length = pat->length(); 2531 if (pat_length == 1) {
2488 uint32_t sub_length = sub->length();
2489
2490 if (start_index + pattern_length > sub_length) {
2491 start_index = sub_length - pattern_length;
2492 }
2493
2494 if (pattern_length == 1) {
2495 AssertNoAllocation no_heap_allocation; // ensure vectors stay valid 2532 AssertNoAllocation no_heap_allocation; // ensure vectors stay valid
2496 if (sub->IsAsciiRepresentation()) { 2533 if (sub->IsAsciiRepresentation()) {
2497 uc16 pchar = pat->Get(0); 2534 uc16 pchar = pat->Get(0);
2498 if (pchar > String::kMaxAsciiCharCode) { 2535 if (pchar > String::kMaxAsciiCharCode) {
2499 return Smi::FromInt(-1); 2536 return Smi::FromInt(-1);
2500 } 2537 }
2501 return Smi::FromInt(SingleCharLastIndexOf(sub->ToAsciiVector(), 2538 return Smi::FromInt(SingleCharLastIndexOf(sub->ToAsciiVector(),
2502 static_cast<char>(pat->Get(0)), 2539 static_cast<char>(pat->Get(0)),
2503 start_index)); 2540 start_index));
2504 } else { 2541 } else {
2505 return Smi::FromInt(SingleCharLastIndexOf(sub->ToUC16Vector(), 2542 return Smi::FromInt(SingleCharLastIndexOf(sub->ToUC16Vector(),
2506 pat->Get(0), 2543 pat->Get(0),
2507 start_index)); 2544 start_index));
2508 } 2545 }
2509 } 2546 }
2510 2547
2511 pat->TryFlattenIfNotFlat(); 2548 if (!pat->IsFlat()) {
2512 2549 FlattenString(pat);
2513 for (int i = start_index; i >= 0; i--) {
2514 bool found = true;
2515 for (uint32_t j = 0; j < pattern_length; j++) {
2516 if (sub->Get(i + j) != pat->Get(j)) {
2517 found = false;
2518 break;
2519 }
2520 }
2521 if (found) return Smi::FromInt(i);
2522 } 2550 }
2523 2551
2524 return Smi::FromInt(-1); 2552 AssertNoAllocation no_heap_allocation; // ensure vectors stay valid
2553
2554 int position = -1;
2555
2556 if (pat->IsAsciiRepresentation()) {
2557 Vector<const char> pat_vector = pat->ToAsciiVector();
2558 if (sub->IsAsciiRepresentation()) {
2559 position = StringMatchBackwards(sub->ToAsciiVector(),
2560 pat_vector,
2561 start_index);
2562 } else {
2563 position = StringMatchBackwards(sub->ToUC16Vector(),
2564 pat_vector,
2565 start_index);
2566 }
2567 } else {
2568 Vector<const uc16> pat_vector = pat->ToUC16Vector();
2569 if (sub->IsAsciiRepresentation()) {
2570 position = StringMatchBackwards(sub->ToAsciiVector(),
2571 pat_vector,
2572 start_index);
2573 } else {
2574 position = StringMatchBackwards(sub->ToUC16Vector(),
2575 pat_vector,
2576 start_index);
2577 }
2578 }
2579
2580 return Smi::FromInt(position);
2525 } 2581 }
2526 2582
2527 2583
2528 static Object* Runtime_StringLocaleCompare(Arguments args) { 2584 static Object* Runtime_StringLocaleCompare(Arguments args) {
2529 NoHandleAllocation ha; 2585 NoHandleAllocation ha;
2530 ASSERT(args.length() == 2); 2586 ASSERT(args.length() == 2);
2531 2587
2532 CONVERT_CHECKED(String, str1, args[0]); 2588 CONVERT_CHECKED(String, str1, args[0]);
2533 CONVERT_CHECKED(String, str2, args[1]); 2589 CONVERT_CHECKED(String, str2, args[1]);
2534 2590
(...skipping 5673 matching lines...) Expand 10 before | Expand all | Expand 10 after
8208 } else { 8264 } else {
8209 // Handle last resort GC and make sure to allow future allocations 8265 // Handle last resort GC and make sure to allow future allocations
8210 // to grow the heap without causing GCs (if possible). 8266 // to grow the heap without causing GCs (if possible).
8211 Counters::gc_last_resort_from_js.Increment(); 8267 Counters::gc_last_resort_from_js.Increment();
8212 Heap::CollectAllGarbage(false); 8268 Heap::CollectAllGarbage(false);
8213 } 8269 }
8214 } 8270 }
8215 8271
8216 8272
8217 } } // namespace v8::internal 8273 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698