| 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 15382 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  15393     v8::Local<v8::String> source = |  15393     v8::Local<v8::String> source = | 
|  15394         v8::String::NewExternal(context->GetIsolate(), uc16_resource); |  15394         v8::String::NewExternal(context->GetIsolate(), uc16_resource); | 
|  15395     v8::Script::Compile(source); |  15395     v8::Script::Compile(source); | 
|  15396   } |  15396   } | 
|  15397 } |  15397 } | 
|  15398  |  15398  | 
|  15399  |  15399  | 
|  15400 #ifndef V8_INTERPRETED_REGEXP |  15400 #ifndef V8_INTERPRETED_REGEXP | 
|  15401  |  15401  | 
|  15402 struct RegExpInterruptionData { |  15402 struct RegExpInterruptionData { | 
|  15403   int loop_count; |  15403   v8::base::Atomic32 loop_count; | 
|  15404   UC16VectorResource* string_resource; |  15404   UC16VectorResource* string_resource; | 
|  15405   v8::Persistent<v8::String> string; |  15405   v8::Persistent<v8::String> string; | 
|  15406 } regexp_interruption_data; |  15406 } regexp_interruption_data; | 
|  15407  |  15407  | 
|  15408  |  15408  | 
|  15409 class RegExpInterruptionThread : public v8::base::Thread { |  15409 class RegExpInterruptionThread : public v8::base::Thread { | 
|  15410  public: |  15410  public: | 
|  15411   explicit RegExpInterruptionThread(v8::Isolate* isolate) |  15411   explicit RegExpInterruptionThread(v8::Isolate* isolate) | 
|  15412       : Thread(Options("TimeoutThread")), isolate_(isolate) {} |  15412       : Thread(Options("TimeoutThread")), isolate_(isolate) {} | 
|  15413  |  15413  | 
|  15414   virtual void Run() { |  15414   virtual void Run() { | 
|  15415     for (regexp_interruption_data.loop_count = 0; |  15415     for (v8::base::NoBarrier_Store(®exp_interruption_data.loop_count, 0); | 
|  15416          regexp_interruption_data.loop_count < 7; |  15416          v8::base::NoBarrier_Load(®exp_interruption_data.loop_count) < 7; | 
|  15417          regexp_interruption_data.loop_count++) { |  15417          v8::base::NoBarrier_AtomicIncrement( | 
 |  15418              ®exp_interruption_data.loop_count, 1)) { | 
|  15418       v8::base::OS::Sleep(50);  // Wait a bit before requesting GC. |  15419       v8::base::OS::Sleep(50);  // Wait a bit before requesting GC. | 
|  15419       reinterpret_cast<i::Isolate*>(isolate_)->stack_guard()->RequestGC(); |  15420       reinterpret_cast<i::Isolate*>(isolate_)->stack_guard()->RequestGC(); | 
|  15420     } |  15421     } | 
|  15421     v8::base::OS::Sleep(50);  // Wait a bit before terminating. |  15422     v8::base::OS::Sleep(50);  // Wait a bit before terminating. | 
|  15422     v8::V8::TerminateExecution(isolate_); |  15423     v8::V8::TerminateExecution(isolate_); | 
|  15423   } |  15424   } | 
|  15424  |  15425  | 
|  15425  private: |  15426  private: | 
|  15426   v8::Isolate* isolate_; |  15427   v8::Isolate* isolate_; | 
|  15427 }; |  15428 }; | 
|  15428  |  15429  | 
|  15429  |  15430  | 
|  15430 void RunBeforeGC(v8::GCType type, v8::GCCallbackFlags flags) { |  15431 void RunBeforeGC(v8::GCType type, v8::GCCallbackFlags flags) { | 
|  15431   if (regexp_interruption_data.loop_count != 2) return; |  15432   if (v8::base::NoBarrier_Load(®exp_interruption_data.loop_count) != 2) { | 
 |  15433     return; | 
 |  15434   } | 
|  15432   v8::HandleScope scope(CcTest::isolate()); |  15435   v8::HandleScope scope(CcTest::isolate()); | 
|  15433   v8::Local<v8::String> string = v8::Local<v8::String>::New( |  15436   v8::Local<v8::String> string = v8::Local<v8::String>::New( | 
|  15434       CcTest::isolate(), regexp_interruption_data.string); |  15437       CcTest::isolate(), regexp_interruption_data.string); | 
|  15435   string->MakeExternal(regexp_interruption_data.string_resource); |  15438   string->MakeExternal(regexp_interruption_data.string_resource); | 
|  15436 } |  15439 } | 
|  15437  |  15440  | 
|  15438  |  15441  | 
|  15439 // Test that RegExp execution can be interrupted.  Specifically, we test |  15442 // Test that RegExp execution can be interrupted.  Specifically, we test | 
|  15440 // * interrupting with GC |  15443 // * interrupting with GC | 
|  15441 // * turn the subject string from one-byte internal to two-byte external string |  15444 // * turn the subject string from one-byte internal to two-byte external string | 
| (...skipping 8258 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  23700       "  var foobXXXXX";  // Too many bytes which look like incomplete chars! |  23703       "  var foobXXXXX";  // Too many bytes which look like incomplete chars! | 
|  23701   char chunk2[] = |  23704   char chunk2[] = | 
|  23702       "r = 13;\n" |  23705       "r = 13;\n" | 
|  23703       "  return foob\xeb\x91\x80\x80\x80r;\n" |  23706       "  return foob\xeb\x91\x80\x80\x80r;\n" | 
|  23704       "}\n"; |  23707       "}\n"; | 
|  23705   for (int i = 0; i < 5; ++i) chunk1[strlen(chunk1) - 5 + i] = reference[i]; |  23708   for (int i = 0; i < 5; ++i) chunk1[strlen(chunk1) - 5 + i] = reference[i]; | 
|  23706  |  23709  | 
|  23707   const char* chunks[] = {chunk1, chunk2, "foo();", NULL}; |  23710   const char* chunks[] = {chunk1, chunk2, "foo();", NULL}; | 
|  23708   RunStreamingTest(chunks, v8::ScriptCompiler::StreamedSource::UTF8, false); |  23711   RunStreamingTest(chunks, v8::ScriptCompiler::StreamedSource::UTF8, false); | 
|  23709 } |  23712 } | 
| OLD | NEW |