| 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 21 matching lines...) Expand all Loading... |
| 32 | 32 |
| 33 #include "src/v8.h" | 33 #include "src/v8.h" |
| 34 | 34 |
| 35 #if V8_OS_POSIX | 35 #if V8_OS_POSIX |
| 36 #include <unistd.h> // NOLINT | 36 #include <unistd.h> // NOLINT |
| 37 #endif | 37 #endif |
| 38 | 38 |
| 39 #include "include/v8-util.h" | 39 #include "include/v8-util.h" |
| 40 #include "src/api.h" | 40 #include "src/api.h" |
| 41 #include "src/arguments.h" | 41 #include "src/arguments.h" |
| 42 #include "src/base/platform/platform.h" |
| 42 #include "src/compilation-cache.h" | 43 #include "src/compilation-cache.h" |
| 43 #include "src/cpu-profiler.h" | 44 #include "src/cpu-profiler.h" |
| 44 #include "src/execution.h" | 45 #include "src/execution.h" |
| 45 #include "src/isolate.h" | 46 #include "src/isolate.h" |
| 46 #include "src/objects.h" | 47 #include "src/objects.h" |
| 47 #include "src/parser.h" | 48 #include "src/parser.h" |
| 48 #include "src/platform.h" | |
| 49 #include "src/snapshot.h" | 49 #include "src/snapshot.h" |
| 50 #include "src/unicode-inl.h" | 50 #include "src/unicode-inl.h" |
| 51 #include "src/utils.h" | 51 #include "src/utils.h" |
| 52 #include "src/vm-state.h" | 52 #include "src/vm-state.h" |
| 53 #include "test/cctest/cctest.h" | 53 #include "test/cctest/cctest.h" |
| 54 | 54 |
| 55 static const bool kLogThreading = false; | 55 static const bool kLogThreading = false; |
| 56 | 56 |
| 57 using ::v8::Boolean; | 57 using ::v8::Boolean; |
| 58 using ::v8::BooleanObject; | 58 using ::v8::BooleanObject; |
| (...skipping 5333 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5392 CHECK_EQ(v8_num(1.00), v8_num(1)); | 5392 CHECK_EQ(v8_num(1.00), v8_num(1)); |
| 5393 CHECK_NE(v8_num(1), v8_num(2)); | 5393 CHECK_NE(v8_num(1), v8_num(2)); |
| 5394 | 5394 |
| 5395 // Assume String is not internalized. | 5395 // Assume String is not internalized. |
| 5396 CHECK(v8_str("a")->StrictEquals(v8_str("a"))); | 5396 CHECK(v8_str("a")->StrictEquals(v8_str("a"))); |
| 5397 CHECK(!v8_str("a")->StrictEquals(v8_str("b"))); | 5397 CHECK(!v8_str("a")->StrictEquals(v8_str("b"))); |
| 5398 CHECK(!v8_str("5")->StrictEquals(v8_num(5))); | 5398 CHECK(!v8_str("5")->StrictEquals(v8_num(5))); |
| 5399 CHECK(v8_num(1)->StrictEquals(v8_num(1))); | 5399 CHECK(v8_num(1)->StrictEquals(v8_num(1))); |
| 5400 CHECK(!v8_num(1)->StrictEquals(v8_num(2))); | 5400 CHECK(!v8_num(1)->StrictEquals(v8_num(2))); |
| 5401 CHECK(v8_num(0.0)->StrictEquals(v8_num(-0.0))); | 5401 CHECK(v8_num(0.0)->StrictEquals(v8_num(-0.0))); |
| 5402 Local<Value> not_a_number = v8_num(i::OS::nan_value()); | 5402 Local<Value> not_a_number = v8_num(v8::base::OS::nan_value()); |
| 5403 CHECK(!not_a_number->StrictEquals(not_a_number)); | 5403 CHECK(!not_a_number->StrictEquals(not_a_number)); |
| 5404 CHECK(v8::False(isolate)->StrictEquals(v8::False(isolate))); | 5404 CHECK(v8::False(isolate)->StrictEquals(v8::False(isolate))); |
| 5405 CHECK(!v8::False(isolate)->StrictEquals(v8::Undefined(isolate))); | 5405 CHECK(!v8::False(isolate)->StrictEquals(v8::Undefined(isolate))); |
| 5406 | 5406 |
| 5407 v8::Handle<v8::Object> obj = v8::Object::New(isolate); | 5407 v8::Handle<v8::Object> obj = v8::Object::New(isolate); |
| 5408 v8::Persistent<v8::Object> alias(isolate, obj); | 5408 v8::Persistent<v8::Object> alias(isolate, obj); |
| 5409 CHECK(v8::Local<v8::Object>::New(isolate, alias)->StrictEquals(obj)); | 5409 CHECK(v8::Local<v8::Object>::New(isolate, alias)->StrictEquals(obj)); |
| 5410 alias.Reset(); | 5410 alias.Reset(); |
| 5411 | 5411 |
| 5412 CHECK(v8_str("a")->SameValue(v8_str("a"))); | 5412 CHECK(v8_str("a")->SameValue(v8_str("a"))); |
| (...skipping 7676 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 13089 CHECK(c->IsObject() && c->ToObject()->GetConstructorName()->Equals( | 13089 CHECK(c->IsObject() && c->ToObject()->GetConstructorName()->Equals( |
| 13090 v8_str("Child"))); | 13090 v8_str("Child"))); |
| 13091 | 13091 |
| 13092 Local<v8::Value> x = context->Global()->Get(v8_str("x")); | 13092 Local<v8::Value> x = context->Global()->Get(v8_str("x")); |
| 13093 CHECK(x->IsObject() && x->ToObject()->GetConstructorName()->Equals( | 13093 CHECK(x->IsObject() && x->ToObject()->GetConstructorName()->Equals( |
| 13094 v8_str("outer.inner"))); | 13094 v8_str("outer.inner"))); |
| 13095 } | 13095 } |
| 13096 | 13096 |
| 13097 | 13097 |
| 13098 bool ApiTestFuzzer::fuzzing_ = false; | 13098 bool ApiTestFuzzer::fuzzing_ = false; |
| 13099 i::Semaphore ApiTestFuzzer::all_tests_done_(0); | 13099 v8::base::Semaphore ApiTestFuzzer::all_tests_done_(0); |
| 13100 int ApiTestFuzzer::active_tests_; | 13100 int ApiTestFuzzer::active_tests_; |
| 13101 int ApiTestFuzzer::tests_being_run_; | 13101 int ApiTestFuzzer::tests_being_run_; |
| 13102 int ApiTestFuzzer::current_; | 13102 int ApiTestFuzzer::current_; |
| 13103 | 13103 |
| 13104 | 13104 |
| 13105 // We are in a callback and want to switch to another thread (if we | 13105 // We are in a callback and want to switch to another thread (if we |
| 13106 // are currently running the thread fuzzing test). | 13106 // are currently running the thread fuzzing test). |
| 13107 void ApiTestFuzzer::Fuzz() { | 13107 void ApiTestFuzzer::Fuzz() { |
| 13108 if (!fuzzing_) return; | 13108 if (!fuzzing_) return; |
| 13109 ApiTestFuzzer* test = RegisterThreadedTest::nth(current_)->fuzzer_; | 13109 ApiTestFuzzer* test = RegisterThreadedTest::nth(current_)->fuzzer_; |
| (...skipping 2041 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 15151 | 15151 |
| 15152 #ifndef V8_INTERPRETED_REGEXP | 15152 #ifndef V8_INTERPRETED_REGEXP |
| 15153 | 15153 |
| 15154 struct RegExpInterruptionData { | 15154 struct RegExpInterruptionData { |
| 15155 int loop_count; | 15155 int loop_count; |
| 15156 UC16VectorResource* string_resource; | 15156 UC16VectorResource* string_resource; |
| 15157 v8::Persistent<v8::String> string; | 15157 v8::Persistent<v8::String> string; |
| 15158 } regexp_interruption_data; | 15158 } regexp_interruption_data; |
| 15159 | 15159 |
| 15160 | 15160 |
| 15161 class RegExpInterruptionThread : public i::Thread { | 15161 class RegExpInterruptionThread : public v8::base::Thread { |
| 15162 public: | 15162 public: |
| 15163 explicit RegExpInterruptionThread(v8::Isolate* isolate) | 15163 explicit RegExpInterruptionThread(v8::Isolate* isolate) |
| 15164 : Thread("TimeoutThread"), isolate_(isolate) {} | 15164 : Thread("TimeoutThread"), isolate_(isolate) {} |
| 15165 | 15165 |
| 15166 virtual void Run() { | 15166 virtual void Run() { |
| 15167 for (regexp_interruption_data.loop_count = 0; | 15167 for (regexp_interruption_data.loop_count = 0; |
| 15168 regexp_interruption_data.loop_count < 7; | 15168 regexp_interruption_data.loop_count < 7; |
| 15169 regexp_interruption_data.loop_count++) { | 15169 regexp_interruption_data.loop_count++) { |
| 15170 i::OS::Sleep(50); // Wait a bit before requesting GC. | 15170 v8::base::OS::Sleep(50); // Wait a bit before requesting GC. |
| 15171 reinterpret_cast<i::Isolate*>(isolate_)->stack_guard()->RequestGC(); | 15171 reinterpret_cast<i::Isolate*>(isolate_)->stack_guard()->RequestGC(); |
| 15172 } | 15172 } |
| 15173 i::OS::Sleep(50); // Wait a bit before terminating. | 15173 v8::base::OS::Sleep(50); // Wait a bit before terminating. |
| 15174 v8::V8::TerminateExecution(isolate_); | 15174 v8::V8::TerminateExecution(isolate_); |
| 15175 } | 15175 } |
| 15176 | 15176 |
| 15177 private: | 15177 private: |
| 15178 v8::Isolate* isolate_; | 15178 v8::Isolate* isolate_; |
| 15179 }; | 15179 }; |
| 15180 | 15180 |
| 15181 | 15181 |
| 15182 void RunBeforeGC(v8::GCType type, v8::GCCallbackFlags flags) { | 15182 void RunBeforeGC(v8::GCType type, v8::GCCallbackFlags flags) { |
| 15183 if (regexp_interruption_data.loop_count != 2) return; | 15183 if (regexp_interruption_data.loop_count != 2) return; |
| (...skipping 1061 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 16245 CHECK_EQ(false, result->BooleanValue()); | 16245 CHECK_EQ(false, result->BooleanValue()); |
| 16246 | 16246 |
| 16247 // Check other boundary conditions, values and operations. | 16247 // Check other boundary conditions, values and operations. |
| 16248 result = CompileRun("for (var i = 0; i < 8; i++) {" | 16248 result = CompileRun("for (var i = 0; i < 8; i++) {" |
| 16249 " ext_array[7] = undefined;" | 16249 " ext_array[7] = undefined;" |
| 16250 "}" | 16250 "}" |
| 16251 "ext_array[7];"); | 16251 "ext_array[7];"); |
| 16252 CHECK_EQ(0, result->Int32Value()); | 16252 CHECK_EQ(0, result->Int32Value()); |
| 16253 if (array_type == v8::kExternalFloat64Array || | 16253 if (array_type == v8::kExternalFloat64Array || |
| 16254 array_type == v8::kExternalFloat32Array) { | 16254 array_type == v8::kExternalFloat32Array) { |
| 16255 CHECK_EQ(static_cast<int>(i::OS::nan_value()), | 16255 CHECK_EQ(static_cast<int>(v8::base::OS::nan_value()), |
| 16256 static_cast<int>( | 16256 static_cast<int>( |
| 16257 i::Object::GetElement( | 16257 i::Object::GetElement( |
| 16258 isolate, jsobj, 7).ToHandleChecked()->Number())); | 16258 isolate, jsobj, 7).ToHandleChecked()->Number())); |
| 16259 } else { | 16259 } else { |
| 16260 CheckElementValue(isolate, 0, jsobj, 7); | 16260 CheckElementValue(isolate, 0, jsobj, 7); |
| 16261 } | 16261 } |
| 16262 | 16262 |
| 16263 result = CompileRun("for (var i = 0; i < 8; i++) {" | 16263 result = CompileRun("for (var i = 0; i < 8; i++) {" |
| 16264 " ext_array[6] = '2.3';" | 16264 " ext_array[6] = '2.3';" |
| 16265 "}" | 16265 "}" |
| (...skipping 1758 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 18024 static uint64_t DoubleToBits(double value) { | 18024 static uint64_t DoubleToBits(double value) { |
| 18025 uint64_t target; | 18025 uint64_t target; |
| 18026 i::MemCopy(&target, &value, sizeof(target)); | 18026 i::MemCopy(&target, &value, sizeof(target)); |
| 18027 return target; | 18027 return target; |
| 18028 } | 18028 } |
| 18029 | 18029 |
| 18030 | 18030 |
| 18031 static double DoubleToDateTime(double input) { | 18031 static double DoubleToDateTime(double input) { |
| 18032 double date_limit = 864e13; | 18032 double date_limit = 864e13; |
| 18033 if (std::isnan(input) || input < -date_limit || input > date_limit) { | 18033 if (std::isnan(input) || input < -date_limit || input > date_limit) { |
| 18034 return i::OS::nan_value(); | 18034 return v8::base::OS::nan_value(); |
| 18035 } | 18035 } |
| 18036 return (input < 0) ? -(std::floor(-input)) : std::floor(input); | 18036 return (input < 0) ? -(std::floor(-input)) : std::floor(input); |
| 18037 } | 18037 } |
| 18038 | 18038 |
| 18039 | 18039 |
| 18040 // We don't have a consistent way to write 64-bit constants syntactically, so we | 18040 // We don't have a consistent way to write 64-bit constants syntactically, so we |
| 18041 // split them into two 32-bit constants and combine them programmatically. | 18041 // split them into two 32-bit constants and combine them programmatically. |
| 18042 static double DoubleFromBits(uint32_t high_bits, uint32_t low_bits) { | 18042 static double DoubleFromBits(uint32_t high_bits, uint32_t low_bits) { |
| 18043 return DoubleFromBits((static_cast<uint64_t>(high_bits) << 32) | low_bits); | 18043 return DoubleFromBits((static_cast<uint64_t>(high_bits) << 32) | low_bits); |
| 18044 } | 18044 } |
| (...skipping 1310 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 19355 i::SNPrintF(code, "function fib(n) {" | 19355 i::SNPrintF(code, "function fib(n) {" |
| 19356 " if (n <= 2) return 1;" | 19356 " if (n <= 2) return 1;" |
| 19357 " return fib(n-1) + fib(n-2);" | 19357 " return fib(n-1) + fib(n-2);" |
| 19358 "}" | 19358 "}" |
| 19359 "fib(%d)", limit); | 19359 "fib(%d)", limit); |
| 19360 Local<Value> value = CompileRun(code.start()); | 19360 Local<Value> value = CompileRun(code.start()); |
| 19361 CHECK(value->IsNumber()); | 19361 CHECK(value->IsNumber()); |
| 19362 return static_cast<int>(value->NumberValue()); | 19362 return static_cast<int>(value->NumberValue()); |
| 19363 } | 19363 } |
| 19364 | 19364 |
| 19365 class IsolateThread : public v8::internal::Thread { | 19365 class IsolateThread : public v8::base::Thread { |
| 19366 public: | 19366 public: |
| 19367 IsolateThread(v8::Isolate* isolate, int fib_limit) | 19367 IsolateThread(v8::Isolate* isolate, int fib_limit) |
| 19368 : Thread("IsolateThread"), | 19368 : Thread("IsolateThread"), |
| 19369 isolate_(isolate), | 19369 isolate_(isolate), |
| 19370 fib_limit_(fib_limit), | 19370 fib_limit_(fib_limit), |
| 19371 result_(0) { } | 19371 result_(0) { } |
| 19372 | 19372 |
| 19373 void Run() { | 19373 void Run() { |
| 19374 result_ = CalcFibonacci(isolate_, fib_limit_); | 19374 result_ = CalcFibonacci(isolate_, fib_limit_); |
| 19375 } | 19375 } |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 19429 v8::HandleScope handle_scope(isolate); | 19429 v8::HandleScope handle_scope(isolate); |
| 19430 context = v8::Context::New(isolate); | 19430 context = v8::Context::New(isolate); |
| 19431 v8::Context::Scope context_scope(context); | 19431 v8::Context::Scope context_scope(context); |
| 19432 Local<Value> v = CompileRun("22"); | 19432 Local<Value> v = CompileRun("22"); |
| 19433 CHECK(v->IsNumber()); | 19433 CHECK(v->IsNumber()); |
| 19434 CHECK_EQ(22, static_cast<int>(v->NumberValue())); | 19434 CHECK_EQ(22, static_cast<int>(v->NumberValue())); |
| 19435 } | 19435 } |
| 19436 isolate->Dispose(); | 19436 isolate->Dispose(); |
| 19437 } | 19437 } |
| 19438 | 19438 |
| 19439 class InitDefaultIsolateThread : public v8::internal::Thread { | 19439 class InitDefaultIsolateThread : public v8::base::Thread { |
| 19440 public: | 19440 public: |
| 19441 enum TestCase { | 19441 enum TestCase { |
| 19442 SetResourceConstraints, | 19442 SetResourceConstraints, |
| 19443 SetFatalHandler, | 19443 SetFatalHandler, |
| 19444 SetCounterFunction, | 19444 SetCounterFunction, |
| 19445 SetCreateHistogramFunction, | 19445 SetCreateHistogramFunction, |
| 19446 SetAddHistogramSampleFunction | 19446 SetAddHistogramSampleFunction |
| 19447 }; | 19447 }; |
| 19448 | 19448 |
| 19449 explicit InitDefaultIsolateThread(TestCase testCase) | 19449 explicit InitDefaultIsolateThread(TestCase testCase) |
| (...skipping 1089 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 20539 TestReceiver(i, foreign_context->Global(), "func()"); | 20539 TestReceiver(i, foreign_context->Global(), "func()"); |
| 20540 // Calling with no base. | 20540 // Calling with no base. |
| 20541 TestReceiver(i, foreign_context->Global(), "(1,func)()"); | 20541 TestReceiver(i, foreign_context->Global(), "(1,func)()"); |
| 20542 } | 20542 } |
| 20543 | 20543 |
| 20544 | 20544 |
| 20545 uint8_t callback_fired = 0; | 20545 uint8_t callback_fired = 0; |
| 20546 | 20546 |
| 20547 | 20547 |
| 20548 void CallCompletedCallback1() { | 20548 void CallCompletedCallback1() { |
| 20549 i::OS::Print("Firing callback 1.\n"); | 20549 v8::base::OS::Print("Firing callback 1.\n"); |
| 20550 callback_fired ^= 1; // Toggle first bit. | 20550 callback_fired ^= 1; // Toggle first bit. |
| 20551 } | 20551 } |
| 20552 | 20552 |
| 20553 | 20553 |
| 20554 void CallCompletedCallback2() { | 20554 void CallCompletedCallback2() { |
| 20555 i::OS::Print("Firing callback 2.\n"); | 20555 v8::base::OS::Print("Firing callback 2.\n"); |
| 20556 callback_fired ^= 2; // Toggle second bit. | 20556 callback_fired ^= 2; // Toggle second bit. |
| 20557 } | 20557 } |
| 20558 | 20558 |
| 20559 | 20559 |
| 20560 void RecursiveCall(const v8::FunctionCallbackInfo<v8::Value>& args) { | 20560 void RecursiveCall(const v8::FunctionCallbackInfo<v8::Value>& args) { |
| 20561 int32_t level = args[0]->Int32Value(); | 20561 int32_t level = args[0]->Int32Value(); |
| 20562 if (level < 3) { | 20562 if (level < 3) { |
| 20563 level++; | 20563 level++; |
| 20564 i::OS::Print("Entering recursion level %d.\n", level); | 20564 v8::base::OS::Print("Entering recursion level %d.\n", level); |
| 20565 char script[64]; | 20565 char script[64]; |
| 20566 i::Vector<char> script_vector(script, sizeof(script)); | 20566 i::Vector<char> script_vector(script, sizeof(script)); |
| 20567 i::SNPrintF(script_vector, "recursion(%d)", level); | 20567 i::SNPrintF(script_vector, "recursion(%d)", level); |
| 20568 CompileRun(script_vector.start()); | 20568 CompileRun(script_vector.start()); |
| 20569 i::OS::Print("Leaving recursion level %d.\n", level); | 20569 v8::base::OS::Print("Leaving recursion level %d.\n", level); |
| 20570 CHECK_EQ(0, callback_fired); | 20570 CHECK_EQ(0, callback_fired); |
| 20571 } else { | 20571 } else { |
| 20572 i::OS::Print("Recursion ends.\n"); | 20572 v8::base::OS::Print("Recursion ends.\n"); |
| 20573 CHECK_EQ(0, callback_fired); | 20573 CHECK_EQ(0, callback_fired); |
| 20574 } | 20574 } |
| 20575 } | 20575 } |
| 20576 | 20576 |
| 20577 | 20577 |
| 20578 TEST(CallCompletedCallback) { | 20578 TEST(CallCompletedCallback) { |
| 20579 LocalContext env; | 20579 LocalContext env; |
| 20580 v8::HandleScope scope(env->GetIsolate()); | 20580 v8::HandleScope scope(env->GetIsolate()); |
| 20581 v8::Handle<v8::FunctionTemplate> recursive_runtime = | 20581 v8::Handle<v8::FunctionTemplate> recursive_runtime = |
| 20582 v8::FunctionTemplate::New(env->GetIsolate(), RecursiveCall); | 20582 v8::FunctionTemplate::New(env->GetIsolate(), RecursiveCall); |
| 20583 env->Global()->Set(v8_str("recursion"), | 20583 env->Global()->Set(v8_str("recursion"), |
| 20584 recursive_runtime->GetFunction()); | 20584 recursive_runtime->GetFunction()); |
| 20585 // Adding the same callback a second time has no effect. | 20585 // Adding the same callback a second time has no effect. |
| 20586 env->GetIsolate()->AddCallCompletedCallback(CallCompletedCallback1); | 20586 env->GetIsolate()->AddCallCompletedCallback(CallCompletedCallback1); |
| 20587 env->GetIsolate()->AddCallCompletedCallback(CallCompletedCallback1); | 20587 env->GetIsolate()->AddCallCompletedCallback(CallCompletedCallback1); |
| 20588 env->GetIsolate()->AddCallCompletedCallback(CallCompletedCallback2); | 20588 env->GetIsolate()->AddCallCompletedCallback(CallCompletedCallback2); |
| 20589 i::OS::Print("--- Script (1) ---\n"); | 20589 v8::base::OS::Print("--- Script (1) ---\n"); |
| 20590 Local<Script> script = v8::Script::Compile( | 20590 Local<Script> script = v8::Script::Compile( |
| 20591 v8::String::NewFromUtf8(env->GetIsolate(), "recursion(0)")); | 20591 v8::String::NewFromUtf8(env->GetIsolate(), "recursion(0)")); |
| 20592 script->Run(); | 20592 script->Run(); |
| 20593 CHECK_EQ(3, callback_fired); | 20593 CHECK_EQ(3, callback_fired); |
| 20594 | 20594 |
| 20595 i::OS::Print("\n--- Script (2) ---\n"); | 20595 v8::base::OS::Print("\n--- Script (2) ---\n"); |
| 20596 callback_fired = 0; | 20596 callback_fired = 0; |
| 20597 env->GetIsolate()->RemoveCallCompletedCallback(CallCompletedCallback1); | 20597 env->GetIsolate()->RemoveCallCompletedCallback(CallCompletedCallback1); |
| 20598 script->Run(); | 20598 script->Run(); |
| 20599 CHECK_EQ(2, callback_fired); | 20599 CHECK_EQ(2, callback_fired); |
| 20600 | 20600 |
| 20601 i::OS::Print("\n--- Function ---\n"); | 20601 v8::base::OS::Print("\n--- Function ---\n"); |
| 20602 callback_fired = 0; | 20602 callback_fired = 0; |
| 20603 Local<Function> recursive_function = | 20603 Local<Function> recursive_function = |
| 20604 Local<Function>::Cast(env->Global()->Get(v8_str("recursion"))); | 20604 Local<Function>::Cast(env->Global()->Get(v8_str("recursion"))); |
| 20605 v8::Handle<Value> args[] = { v8_num(0) }; | 20605 v8::Handle<Value> args[] = { v8_num(0) }; |
| 20606 recursive_function->Call(env->Global(), 1, args); | 20606 recursive_function->Call(env->Global(), 1, args); |
| 20607 CHECK_EQ(2, callback_fired); | 20607 CHECK_EQ(2, callback_fired); |
| 20608 } | 20608 } |
| 20609 | 20609 |
| 20610 | 20610 |
| 20611 void CallCompletedCallbackNoException() { | 20611 void CallCompletedCallbackNoException() { |
| (...skipping 887 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 21499 InterruptThread i_thread(this); | 21499 InterruptThread i_thread(this); |
| 21500 i_thread.Start(); | 21500 i_thread.Start(); |
| 21501 | 21501 |
| 21502 sem_.Wait(); | 21502 sem_.Wait(); |
| 21503 CHECK_EQ(kExpectedValue, sem_value_); | 21503 CHECK_EQ(kExpectedValue, sem_value_); |
| 21504 } | 21504 } |
| 21505 | 21505 |
| 21506 private: | 21506 private: |
| 21507 static const int kExpectedValue = 1; | 21507 static const int kExpectedValue = 1; |
| 21508 | 21508 |
| 21509 class InterruptThread : public i::Thread { | 21509 class InterruptThread : public v8::base::Thread { |
| 21510 public: | 21510 public: |
| 21511 explicit InterruptThread(ThreadInterruptTest* test) | 21511 explicit InterruptThread(ThreadInterruptTest* test) |
| 21512 : Thread("InterruptThread"), test_(test) {} | 21512 : Thread("InterruptThread"), test_(test) {} |
| 21513 | 21513 |
| 21514 virtual void Run() { | 21514 virtual void Run() { |
| 21515 struct sigaction action; | 21515 struct sigaction action; |
| 21516 | 21516 |
| 21517 // Ensure that we'll enter waiting condition | 21517 // Ensure that we'll enter waiting condition |
| 21518 i::OS::Sleep(100); | 21518 v8::base::OS::Sleep(100); |
| 21519 | 21519 |
| 21520 // Setup signal handler | 21520 // Setup signal handler |
| 21521 memset(&action, 0, sizeof(action)); | 21521 memset(&action, 0, sizeof(action)); |
| 21522 action.sa_handler = SignalHandler; | 21522 action.sa_handler = SignalHandler; |
| 21523 sigaction(SIGCHLD, &action, NULL); | 21523 sigaction(SIGCHLD, &action, NULL); |
| 21524 | 21524 |
| 21525 // Send signal | 21525 // Send signal |
| 21526 kill(getpid(), SIGCHLD); | 21526 kill(getpid(), SIGCHLD); |
| 21527 | 21527 |
| 21528 // Ensure that if wait has returned because of error | 21528 // Ensure that if wait has returned because of error |
| 21529 i::OS::Sleep(100); | 21529 v8::base::OS::Sleep(100); |
| 21530 | 21530 |
| 21531 // Set value and signal semaphore | 21531 // Set value and signal semaphore |
| 21532 test_->sem_value_ = 1; | 21532 test_->sem_value_ = 1; |
| 21533 test_->sem_.Signal(); | 21533 test_->sem_.Signal(); |
| 21534 } | 21534 } |
| 21535 | 21535 |
| 21536 static void SignalHandler(int signal) { | 21536 static void SignalHandler(int signal) { |
| 21537 } | 21537 } |
| 21538 | 21538 |
| 21539 private: | 21539 private: |
| 21540 ThreadInterruptTest* test_; | 21540 ThreadInterruptTest* test_; |
| 21541 }; | 21541 }; |
| 21542 | 21542 |
| 21543 i::Semaphore sem_; | 21543 v8::base::Semaphore sem_; |
| 21544 volatile int sem_value_; | 21544 volatile int sem_value_; |
| 21545 }; | 21545 }; |
| 21546 | 21546 |
| 21547 | 21547 |
| 21548 THREADED_TEST(SemaphoreInterruption) { | 21548 THREADED_TEST(SemaphoreInterruption) { |
| 21549 ThreadInterruptTest().RunTest(); | 21549 ThreadInterruptTest().RunTest(); |
| 21550 } | 21550 } |
| 21551 | 21551 |
| 21552 | 21552 |
| 21553 #endif // V8_OS_POSIX | 21553 #endif // V8_OS_POSIX |
| (...skipping 339 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 21893 static void ShouldContinueCallback( | 21893 static void ShouldContinueCallback( |
| 21894 const v8::FunctionCallbackInfo<Value>& info) { | 21894 const v8::FunctionCallbackInfo<Value>& info) { |
| 21895 RequestInterruptTestBase* test = | 21895 RequestInterruptTestBase* test = |
| 21896 reinterpret_cast<RequestInterruptTestBase*>( | 21896 reinterpret_cast<RequestInterruptTestBase*>( |
| 21897 info.Data().As<v8::External>()->Value()); | 21897 info.Data().As<v8::External>()->Value()); |
| 21898 info.GetReturnValue().Set(test->ShouldContinue()); | 21898 info.GetReturnValue().Set(test->ShouldContinue()); |
| 21899 } | 21899 } |
| 21900 | 21900 |
| 21901 LocalContext env_; | 21901 LocalContext env_; |
| 21902 v8::Isolate* isolate_; | 21902 v8::Isolate* isolate_; |
| 21903 i::Semaphore sem_; | 21903 v8::base::Semaphore sem_; |
| 21904 int warmup_; | 21904 int warmup_; |
| 21905 bool should_continue_; | 21905 bool should_continue_; |
| 21906 }; | 21906 }; |
| 21907 | 21907 |
| 21908 | 21908 |
| 21909 class RequestInterruptTestBaseWithSimpleInterrupt | 21909 class RequestInterruptTestBaseWithSimpleInterrupt |
| 21910 : public RequestInterruptTestBase { | 21910 : public RequestInterruptTestBase { |
| 21911 public: | 21911 public: |
| 21912 RequestInterruptTestBaseWithSimpleInterrupt() : i_thread(this) { } | 21912 RequestInterruptTestBaseWithSimpleInterrupt() : i_thread(this) { } |
| 21913 | 21913 |
| 21914 virtual void StartInterruptThread() { | 21914 virtual void StartInterruptThread() { |
| 21915 i_thread.Start(); | 21915 i_thread.Start(); |
| 21916 } | 21916 } |
| 21917 | 21917 |
| 21918 private: | 21918 private: |
| 21919 class InterruptThread : public i::Thread { | 21919 class InterruptThread : public v8::base::Thread { |
| 21920 public: | 21920 public: |
| 21921 explicit InterruptThread(RequestInterruptTestBase* test) | 21921 explicit InterruptThread(RequestInterruptTestBase* test) |
| 21922 : Thread("RequestInterruptTest"), test_(test) {} | 21922 : Thread("RequestInterruptTest"), test_(test) {} |
| 21923 | 21923 |
| 21924 virtual void Run() { | 21924 virtual void Run() { |
| 21925 test_->sem_.Wait(); | 21925 test_->sem_.Wait(); |
| 21926 test_->isolate_->RequestInterrupt(&OnInterrupt, test_); | 21926 test_->isolate_->RequestInterrupt(&OnInterrupt, test_); |
| 21927 } | 21927 } |
| 21928 | 21928 |
| 21929 static void OnInterrupt(v8::Isolate* isolate, void* data) { | 21929 static void OnInterrupt(v8::Isolate* isolate, void* data) { |
| (...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 22129 | 22129 |
| 22130 virtual void TestBody() { | 22130 virtual void TestBody() { |
| 22131 Local<Function> func = Function::New( | 22131 Local<Function> func = Function::New( |
| 22132 isolate_, ShouldContinueCallback, v8::External::New(isolate_, this)); | 22132 isolate_, ShouldContinueCallback, v8::External::New(isolate_, this)); |
| 22133 env_->Global()->Set(v8_str("ShouldContinue"), func); | 22133 env_->Global()->Set(v8_str("ShouldContinue"), func); |
| 22134 | 22134 |
| 22135 CompileRun("while (ShouldContinue()) { }"); | 22135 CompileRun("while (ShouldContinue()) { }"); |
| 22136 } | 22136 } |
| 22137 | 22137 |
| 22138 private: | 22138 private: |
| 22139 class InterruptThread : public i::Thread { | 22139 class InterruptThread : public v8::base::Thread { |
| 22140 public: | 22140 public: |
| 22141 explicit InterruptThread(ClearInterruptFromAnotherThread* test) | 22141 explicit InterruptThread(ClearInterruptFromAnotherThread* test) |
| 22142 : Thread("RequestInterruptTest"), test_(test) {} | 22142 : Thread("RequestInterruptTest"), test_(test) {} |
| 22143 | 22143 |
| 22144 virtual void Run() { | 22144 virtual void Run() { |
| 22145 test_->sem_.Wait(); | 22145 test_->sem_.Wait(); |
| 22146 test_->isolate_->RequestInterrupt(&OnInterrupt, test_); | 22146 test_->isolate_->RequestInterrupt(&OnInterrupt, test_); |
| 22147 test_->sem_.Wait(); | 22147 test_->sem_.Wait(); |
| 22148 test_->isolate_->ClearInterrupt(); | 22148 test_->isolate_->ClearInterrupt(); |
| 22149 test_->sem2_.Signal(); | 22149 test_->sem2_.Signal(); |
| 22150 } | 22150 } |
| 22151 | 22151 |
| 22152 static void OnInterrupt(v8::Isolate* isolate, void* data) { | 22152 static void OnInterrupt(v8::Isolate* isolate, void* data) { |
| 22153 ClearInterruptFromAnotherThread* test = | 22153 ClearInterruptFromAnotherThread* test = |
| 22154 reinterpret_cast<ClearInterruptFromAnotherThread*>(data); | 22154 reinterpret_cast<ClearInterruptFromAnotherThread*>(data); |
| 22155 test->sem_.Signal(); | 22155 test->sem_.Signal(); |
| 22156 bool success = test->sem2_.WaitFor(i::TimeDelta::FromSeconds(2)); | 22156 bool success = test->sem2_.WaitFor(v8::base::TimeDelta::FromSeconds(2)); |
| 22157 // Crash instead of timeout to make this failure more prominent. | 22157 // Crash instead of timeout to make this failure more prominent. |
| 22158 CHECK(success); | 22158 CHECK(success); |
| 22159 test->should_continue_ = false; | 22159 test->should_continue_ = false; |
| 22160 } | 22160 } |
| 22161 | 22161 |
| 22162 private: | 22162 private: |
| 22163 ClearInterruptFromAnotherThread* test_; | 22163 ClearInterruptFromAnotherThread* test_; |
| 22164 }; | 22164 }; |
| 22165 | 22165 |
| 22166 InterruptThread i_thread; | 22166 InterruptThread i_thread; |
| 22167 i::Semaphore sem2_; | 22167 v8::base::Semaphore sem2_; |
| 22168 }; | 22168 }; |
| 22169 | 22169 |
| 22170 | 22170 |
| 22171 TEST(ClearInterruptFromAnotherThread) { | 22171 TEST(ClearInterruptFromAnotherThread) { |
| 22172 ClearInterruptFromAnotherThread().RunTest(); | 22172 ClearInterruptFromAnotherThread().RunTest(); |
| 22173 } | 22173 } |
| 22174 | 22174 |
| 22175 | 22175 |
| 22176 static Local<Value> function_new_expected_env; | 22176 static Local<Value> function_new_expected_env; |
| 22177 static void FunctionNewCallback(const v8::FunctionCallbackInfo<Value>& info) { | 22177 static void FunctionNewCallback(const v8::FunctionCallbackInfo<Value>& info) { |
| (...skipping 576 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 22754 call_eval_context = v8::Context::New(isolate); | 22754 call_eval_context = v8::Context::New(isolate); |
| 22755 v8::Context::Scope scope(call_eval_context); | 22755 v8::Context::Scope scope(call_eval_context); |
| 22756 call_eval_bound_function = | 22756 call_eval_bound_function = |
| 22757 Local<Function>::Cast(CompileRun("eval.bind(this, '1')")); | 22757 Local<Function>::Cast(CompileRun("eval.bind(this, '1')")); |
| 22758 } | 22758 } |
| 22759 env->Global()->Set(v8_str("CallEval"), | 22759 env->Global()->Set(v8_str("CallEval"), |
| 22760 v8::FunctionTemplate::New(isolate, CallEval)->GetFunction()); | 22760 v8::FunctionTemplate::New(isolate, CallEval)->GetFunction()); |
| 22761 Local<Value> result = CompileRun("CallEval();"); | 22761 Local<Value> result = CompileRun("CallEval();"); |
| 22762 CHECK_EQ(result, v8::Integer::New(isolate, 1)); | 22762 CHECK_EQ(result, v8::Integer::New(isolate, 1)); |
| 22763 } | 22763 } |
| OLD | NEW |