Chromium Code Reviews| 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 17613 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 17624 v8::V8::SetCaptureStackTraceForUncaughtExceptions(true); | 17624 v8::V8::SetCaptureStackTraceForUncaughtExceptions(true); |
| 17625 CompileRun(source); | 17625 CompileRun(source); |
| 17626 v8::V8::SetCaptureStackTraceForUncaughtExceptions(false); | 17626 v8::V8::SetCaptureStackTraceForUncaughtExceptions(false); |
| 17627 v8::V8::RemoveMessageListeners(RethrowBogusErrorStackTraceHandler); | 17627 v8::V8::RemoveMessageListeners(RethrowBogusErrorStackTraceHandler); |
| 17628 } | 17628 } |
| 17629 | 17629 |
| 17630 | 17630 |
| 17631 v8::PromiseRejectEvent reject_event = v8::kPromiseRejectWithNoHandler; | 17631 v8::PromiseRejectEvent reject_event = v8::kPromiseRejectWithNoHandler; |
| 17632 int promise_reject_counter = 0; | 17632 int promise_reject_counter = 0; |
| 17633 int promise_revoke_counter = 0; | 17633 int promise_revoke_counter = 0; |
| 17634 int promise_reject_line_number = -1; | |
| 17635 int promise_reject_frame_count = -1; | |
| 17634 | 17636 |
| 17635 void PromiseRejectCallback(v8::Handle<v8::Promise> promise, | 17637 void PromiseRejectCallback(v8::Handle<v8::Promise> promise, |
| 17638 v8::PromiseRejectEvent event, | |
| 17636 v8::Handle<v8::Value> value, | 17639 v8::Handle<v8::Value> value, |
| 17637 v8::PromiseRejectEvent event) { | 17640 v8::Handle<v8::StackTrace> stack_trace) { |
| 17638 if (event == v8::kPromiseRejectWithNoHandler) { | 17641 if (event == v8::kPromiseRejectWithNoHandler) { |
| 17639 promise_reject_counter++; | 17642 promise_reject_counter++; |
| 17640 CcTest::global()->Set(v8_str("rejected"), promise); | 17643 CcTest::global()->Set(v8_str("rejected"), promise); |
| 17641 CcTest::global()->Set(v8_str("value"), value); | 17644 CcTest::global()->Set(v8_str("value"), value); |
| 17645 if (!stack_trace.IsEmpty()) { | |
| 17646 promise_reject_frame_count = stack_trace->GetFrameCount(); | |
| 17647 if (promise_reject_frame_count > 0) { | |
| 17648 CHECK(stack_trace->GetFrame(0)->GetScriptName()->Equals(v8_str("pro"))); | |
| 17649 promise_reject_line_number = stack_trace->GetFrame(0)->GetLineNumber(); | |
| 17650 } else { | |
| 17651 promise_reject_line_number = -1; | |
| 17652 } | |
| 17653 } | |
| 17642 } else { | 17654 } else { |
| 17643 promise_revoke_counter++; | 17655 promise_revoke_counter++; |
| 17644 CcTest::global()->Set(v8_str("revoked"), promise); | 17656 CcTest::global()->Set(v8_str("revoked"), promise); |
| 17645 CHECK(value.IsEmpty()); | 17657 CHECK(value.IsEmpty()); |
| 17658 CHECK(stack_trace.IsEmpty()); | |
| 17646 } | 17659 } |
| 17647 } | 17660 } |
| 17648 | 17661 |
| 17649 | 17662 |
| 17650 v8::Handle<v8::Promise> GetPromise(const char* name) { | 17663 v8::Handle<v8::Promise> GetPromise(const char* name) { |
| 17651 return v8::Handle<v8::Promise>::Cast(CcTest::global()->Get(v8_str(name))); | 17664 return v8::Handle<v8::Promise>::Cast(CcTest::global()->Get(v8_str(name))); |
| 17652 } | 17665 } |
| 17653 | 17666 |
| 17654 | 17667 |
| 17655 v8::Handle<v8::Value> RejectValue() { | 17668 v8::Handle<v8::Value> RejectValue() { |
| 17656 return CcTest::global()->Get(v8_str("value")); | 17669 return CcTest::global()->Get(v8_str("value")); |
| 17657 } | 17670 } |
| 17658 | 17671 |
| 17659 | 17672 |
| 17660 void ResetPromiseStates() { | 17673 void ResetPromiseStates() { |
| 17661 promise_reject_counter = 0; | 17674 promise_reject_counter = 0; |
| 17662 promise_revoke_counter = 0; | 17675 promise_revoke_counter = 0; |
| 17676 promise_reject_line_number = -1; | |
| 17677 promise_reject_frame_count = -1; | |
| 17663 CcTest::global()->Set(v8_str("rejected"), v8_str("")); | 17678 CcTest::global()->Set(v8_str("rejected"), v8_str("")); |
| 17664 CcTest::global()->Set(v8_str("value"), v8_str("")); | 17679 CcTest::global()->Set(v8_str("value"), v8_str("")); |
| 17665 CcTest::global()->Set(v8_str("revoked"), v8_str("")); | 17680 CcTest::global()->Set(v8_str("revoked"), v8_str("")); |
| 17666 } | 17681 } |
| 17667 | 17682 |
| 17668 | 17683 |
| 17669 TEST(PromiseRejectCallback) { | 17684 TEST(PromiseRejectCallback) { |
| 17670 LocalContext env; | 17685 LocalContext env; |
| 17671 v8::Isolate* isolate = env->GetIsolate(); | 17686 v8::Isolate* isolate = env->GetIsolate(); |
| 17672 v8::HandleScope scope(isolate); | 17687 v8::HandleScope scope(isolate); |
| 17673 | 17688 |
| 17674 isolate->SetPromiseRejectCallback(PromiseRejectCallback); | 17689 isolate->SetPromiseRejectCallback(PromiseRejectCallback); |
| 17675 | 17690 |
| 17676 ResetPromiseStates(); | 17691 ResetPromiseStates(); |
| 17677 | 17692 |
| 17678 // Create promise p0. | 17693 // Create promise p0. |
| 17679 CompileRun( | 17694 CompileRun( |
| 17680 "var reject; \n" | 17695 "var reject; \n" |
| 17681 "var p0 = new Promise( \n" | 17696 "var p0 = new Promise( \n" |
| 17682 " function(res, rej) { \n" | 17697 " function(res, rej) { \n" |
| 17683 " reject = rej; \n" | 17698 " reject = rej; \n" |
| 17684 " } \n" | 17699 " } \n" |
| 17685 "); \n"); | 17700 "); \n"); |
| 17686 CHECK(!GetPromise("p0")->HasHandler()); | 17701 CHECK(!GetPromise("p0")->HasHandler()); |
| 17687 CHECK_EQ(0, promise_reject_counter); | 17702 CHECK_EQ(0, promise_reject_counter); |
| 17688 CHECK_EQ(0, promise_revoke_counter); | 17703 CHECK_EQ(0, promise_revoke_counter); |
| 17689 | 17704 |
| 17690 // Add resolve handler (and default reject handler) to p0. | 17705 // Add resolve handler (and default reject handler) to p0. |
| 17691 CompileRun("var p1 = p0.then(function(){});"); | 17706 CompileRun("var p1 = p0.then(function(){});"); |
| (...skipping 27 matching lines...) Expand all Loading... | |
| 17719 CHECK_EQ(2, promise_reject_counter); | 17734 CHECK_EQ(2, promise_reject_counter); |
| 17720 CHECK_EQ(1, promise_revoke_counter); | 17735 CHECK_EQ(1, promise_revoke_counter); |
| 17721 CHECK(GetPromise("rejected")->Equals(GetPromise("p2"))); | 17736 CHECK(GetPromise("rejected")->Equals(GetPromise("p2"))); |
| 17722 CHECK(RejectValue()->Equals(v8_str("ppp"))); | 17737 CHECK(RejectValue()->Equals(v8_str("ppp"))); |
| 17723 CHECK(GetPromise("revoked")->Equals(GetPromise("p1"))); | 17738 CHECK(GetPromise("revoked")->Equals(GetPromise("p1"))); |
| 17724 | 17739 |
| 17725 ResetPromiseStates(); | 17740 ResetPromiseStates(); |
| 17726 | 17741 |
| 17727 // Create promise q0. | 17742 // Create promise q0. |
| 17728 CompileRun( | 17743 CompileRun( |
| 17729 "var q0 = new Promise( \n" | 17744 "var q0 = new Promise( \n" |
| 17730 " function(res, rej) { \n" | 17745 " function(res, rej) { \n" |
| 17731 " reject = rej; \n" | 17746 " reject = rej; \n" |
| 17732 " } \n" | 17747 " } \n" |
| 17733 "); \n"); | 17748 "); \n"); |
| 17734 CHECK(!GetPromise("q0")->HasHandler()); | 17749 CHECK(!GetPromise("q0")->HasHandler()); |
| 17735 CHECK_EQ(0, promise_reject_counter); | 17750 CHECK_EQ(0, promise_reject_counter); |
| 17736 CHECK_EQ(0, promise_revoke_counter); | 17751 CHECK_EQ(0, promise_revoke_counter); |
| 17737 | 17752 |
| 17738 // Add reject handler to q0. | 17753 // Add reject handler to q0. |
| 17739 CompileRun("var q1 = q0.catch(function() {});"); | 17754 CompileRun("var q1 = q0.catch(function() {});"); |
| (...skipping 25 matching lines...) Expand all Loading... | |
| 17765 CHECK(!GetPromise("q2")->HasHandler()); | 17780 CHECK(!GetPromise("q2")->HasHandler()); |
| 17766 CHECK(GetPromise("q_")->HasHandler()); | 17781 CHECK(GetPromise("q_")->HasHandler()); |
| 17767 CHECK_EQ(2, promise_reject_counter); | 17782 CHECK_EQ(2, promise_reject_counter); |
| 17768 CHECK_EQ(1, promise_revoke_counter); | 17783 CHECK_EQ(1, promise_revoke_counter); |
| 17769 CHECK(GetPromise("rejected")->Equals(GetPromise("q2"))); | 17784 CHECK(GetPromise("rejected")->Equals(GetPromise("q2"))); |
| 17770 CHECK(GetPromise("revoked")->Equals(GetPromise("q_"))); | 17785 CHECK(GetPromise("revoked")->Equals(GetPromise("q_"))); |
| 17771 CHECK(RejectValue()->Equals(v8_str("qqq"))); | 17786 CHECK(RejectValue()->Equals(v8_str("qqq"))); |
| 17772 | 17787 |
| 17773 // Add a reject handler to the resolved q1, which rejects by throwing. | 17788 // Add a reject handler to the resolved q1, which rejects by throwing. |
| 17774 CompileRun( | 17789 CompileRun( |
| 17775 "var q3 = q1.then( \n" | 17790 "var q3 = q1.then( \n" |
| 17776 " function() { \n" | 17791 " function() { \n" |
| 17777 " throw 'qqqq'; \n" | 17792 " throw 'qqqq'; \n" |
| 17778 " } \n" | 17793 " } \n" |
| 17779 "); \n"); | 17794 "); \n"); |
| 17780 CHECK(GetPromise("q0")->HasHandler()); | 17795 CHECK(GetPromise("q0")->HasHandler()); |
| 17781 CHECK(GetPromise("q1")->HasHandler()); | 17796 CHECK(GetPromise("q1")->HasHandler()); |
| 17782 CHECK(!GetPromise("q2")->HasHandler()); | 17797 CHECK(!GetPromise("q2")->HasHandler()); |
| 17783 CHECK(!GetPromise("q3")->HasHandler()); | 17798 CHECK(!GetPromise("q3")->HasHandler()); |
| 17784 CHECK_EQ(3, promise_reject_counter); | 17799 CHECK_EQ(3, promise_reject_counter); |
| 17785 CHECK_EQ(1, promise_revoke_counter); | 17800 CHECK_EQ(1, promise_revoke_counter); |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 17861 | 17876 |
| 17862 // Reject s0. | 17877 // Reject s0. |
| 17863 CompileRun("reject('sss')"); | 17878 CompileRun("reject('sss')"); |
| 17864 CHECK(GetPromise("s0")->HasHandler()); | 17879 CHECK(GetPromise("s0")->HasHandler()); |
| 17865 CHECK(!GetPromise("s1")->HasHandler()); | 17880 CHECK(!GetPromise("s1")->HasHandler()); |
| 17866 CHECK(!GetPromise("s2")->HasHandler()); | 17881 CHECK(!GetPromise("s2")->HasHandler()); |
| 17867 CHECK(!GetPromise("s3")->HasHandler()); | 17882 CHECK(!GetPromise("s3")->HasHandler()); |
| 17868 CHECK_EQ(3, promise_reject_counter); | 17883 CHECK_EQ(3, promise_reject_counter); |
| 17869 CHECK_EQ(0, promise_revoke_counter); | 17884 CHECK_EQ(0, promise_revoke_counter); |
| 17870 CHECK(RejectValue()->Equals(v8_str("sss"))); | 17885 CHECK(RejectValue()->Equals(v8_str("sss"))); |
| 17886 | |
| 17887 // Test stack frames. | |
| 17888 V8::SetCaptureStackTraceForUncaughtExceptions(true); | |
| 17889 | |
| 17890 ResetPromiseStates(); | |
| 17891 | |
| 17892 // Create promise t0, which is rejected in the constructor with an error. | |
| 17893 CompileRunWithOrigin( | |
| 17894 "var t0 = new Promise( \n" | |
| 17895 " function(res, rej) { \n" | |
| 17896 " reference_error; \n" | |
| 17897 " } \n" | |
| 17898 "); \n", | |
| 17899 "pro", 0, 0); | |
| 17900 CHECK(!GetPromise("t0")->HasHandler()); | |
| 17901 CHECK_EQ(1, promise_reject_counter); | |
| 17902 CHECK_EQ(0, promise_revoke_counter); | |
| 17903 CHECK_EQ(2, promise_reject_frame_count); | |
| 17904 CHECK_EQ(3, promise_reject_line_number); | |
| 17905 | |
| 17906 ResetPromiseStates(); | |
| 17907 | |
| 17908 // Create promise u0 and chain u1 to it, which is rejected via throw. | |
| 17909 CompileRunWithOrigin( | |
| 17910 "var u0 = Promise.resolve(); \n" | |
| 17911 "var u1 = u0.then( \n" | |
| 17912 " function() { \n" | |
| 17913 " (function() { \n" | |
| 17914 " throw new Error(); \n" | |
| 17915 " })(); \n" | |
| 17916 " } \n" | |
| 17917 " ); \n", | |
| 17918 "pro", 0, 0); | |
| 17919 CHECK(GetPromise("u0")->HasHandler()); | |
| 17920 CHECK(!GetPromise("u1")->HasHandler()); | |
| 17921 CHECK_EQ(1, promise_reject_counter); | |
| 17922 CHECK_EQ(0, promise_revoke_counter); | |
| 17923 CHECK_EQ(2, promise_reject_frame_count); | |
| 17924 CHECK_EQ(5, promise_reject_line_number); | |
| 17925 | |
| 17926 // Throw in u3, which handles u1's rejection. | |
| 17927 CompileRunWithOrigin( | |
| 17928 "function f() { \n" | |
| 17929 " return (function() { \n" | |
| 17930 " return new Error(); \n" | |
| 17931 " })(); \n" | |
| 17932 "} \n" | |
| 17933 "var u2 = Promise.reject(f()); \n" | |
| 17934 "var u3 = u1.catch( \n" | |
| 17935 " function() { \n" | |
| 17936 " return u2; \n" | |
| 17937 " } \n" | |
| 17938 " ); \n", | |
| 17939 "pro", 0, 0); | |
| 17940 CHECK(GetPromise("u0")->HasHandler()); | |
| 17941 CHECK(GetPromise("u1")->HasHandler()); | |
| 17942 CHECK(GetPromise("u2")->HasHandler()); | |
| 17943 CHECK(!GetPromise("u3")->HasHandler()); | |
| 17944 CHECK_EQ(3, promise_reject_counter); | |
| 17945 CHECK_EQ(2, promise_revoke_counter); | |
| 17946 CHECK_EQ(3, promise_reject_frame_count); | |
| 17947 CHECK_EQ(3, promise_reject_line_number); | |
| 17948 | |
| 17949 ResetPromiseStates(); | |
| 17950 | |
| 17951 // Create promise rejected promise v0, which is incorrectly handled by v1 | |
| 17952 // via chaining cycle. | |
| 17953 CompileRunWithOrigin( | |
| 17954 "var v0 = Promise.reject(); \n" | |
| 17955 "var v1 = v0.catch( \n" | |
| 17956 " function() { \n" | |
| 17957 " return v1; \n" | |
| 17958 " } \n" | |
| 17959 " ); \n", | |
| 17960 "pro", 0, 0); | |
| 17961 CHECK(GetPromise("v0")->HasHandler()); | |
| 17962 CHECK(!GetPromise("v1")->HasHandler()); | |
| 17963 CHECK_EQ(2, promise_reject_counter); | |
| 17964 CHECK_EQ(1, promise_revoke_counter); | |
| 17965 CHECK_EQ(0, promise_reject_frame_count); | |
|
aandrey
2014/10/07 10:49:05
CHECK_EQ(-1, promise_reject_line_number);
| |
| 17871 } | 17966 } |
| 17872 | 17967 |
| 17873 | 17968 |
| 17874 void AnalyzeStackOfEvalWithSourceURL( | 17969 void AnalyzeStackOfEvalWithSourceURL( |
| 17875 const v8::FunctionCallbackInfo<v8::Value>& args) { | 17970 const v8::FunctionCallbackInfo<v8::Value>& args) { |
| 17876 v8::HandleScope scope(args.GetIsolate()); | 17971 v8::HandleScope scope(args.GetIsolate()); |
| 17877 v8::Handle<v8::StackTrace> stackTrace = v8::StackTrace::CurrentStackTrace( | 17972 v8::Handle<v8::StackTrace> stackTrace = v8::StackTrace::CurrentStackTrace( |
| 17878 args.GetIsolate(), 10, v8::StackTrace::kDetailed); | 17973 args.GetIsolate(), 10, v8::StackTrace::kDetailed); |
| 17879 CHECK_EQ(5, stackTrace->GetFrameCount()); | 17974 CHECK_EQ(5, stackTrace->GetFrameCount()); |
| 17880 v8::Handle<v8::String> url = v8_str("eval_url"); | 17975 v8::Handle<v8::String> url = v8_str("eval_url"); |
| (...skipping 5819 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 23700 " var foobXXXXX"; // Too many bytes which look like incomplete chars! | 23795 " var foobXXXXX"; // Too many bytes which look like incomplete chars! |
| 23701 char chunk2[] = | 23796 char chunk2[] = |
| 23702 "r = 13;\n" | 23797 "r = 13;\n" |
| 23703 " return foob\xeb\x91\x80\x80\x80r;\n" | 23798 " return foob\xeb\x91\x80\x80\x80r;\n" |
| 23704 "}\n"; | 23799 "}\n"; |
| 23705 for (int i = 0; i < 5; ++i) chunk1[strlen(chunk1) - 5 + i] = reference[i]; | 23800 for (int i = 0; i < 5; ++i) chunk1[strlen(chunk1) - 5 + i] = reference[i]; |
| 23706 | 23801 |
| 23707 const char* chunks[] = {chunk1, chunk2, "foo();", NULL}; | 23802 const char* chunks[] = {chunk1, chunk2, "foo();", NULL}; |
| 23708 RunStreamingTest(chunks, v8::ScriptCompiler::StreamedSource::UTF8, false); | 23803 RunStreamingTest(chunks, v8::ScriptCompiler::StreamedSource::UTF8, false); |
| 23709 } | 23804 } |
| OLD | NEW |