| 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 17650 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 17661 v8::Isolate* isolate = env->GetIsolate(); | 17661 v8::Isolate* isolate = env->GetIsolate(); |
| 17662 v8::HandleScope scope(isolate); | 17662 v8::HandleScope scope(isolate); |
| 17663 | 17663 |
| 17664 isolate->SetPromiseRejectCallback(PromiseRejectCallback); | 17664 isolate->SetPromiseRejectCallback(PromiseRejectCallback); |
| 17665 | 17665 |
| 17666 ResetPromiseStates(); | 17666 ResetPromiseStates(); |
| 17667 | 17667 |
| 17668 // Create promise p0. | 17668 // Create promise p0. |
| 17669 CompileRun( | 17669 CompileRun( |
| 17670 "var reject; \n" | 17670 "var reject; \n" |
| 17671 "var p0 = new Promise( \n" | 17671 "var p0 = new Promise( \n" |
| 17672 " function(res, rej) { \n" | 17672 " function(res, rej) { \n" |
| 17673 " reject = rej; \n" | 17673 " reject = rej; \n" |
| 17674 " } \n" | 17674 " } \n" |
| 17675 "); \n"); | 17675 "); \n"); |
| 17676 CHECK(!GetPromise("p0")->HasHandler()); | |
| 17677 CHECK_EQ(0, promise_reject_counter); | 17676 CHECK_EQ(0, promise_reject_counter); |
| 17678 CHECK_EQ(0, promise_revoke_counter); | 17677 CHECK_EQ(0, promise_revoke_counter); |
| 17679 | 17678 |
| 17680 // Add resolve handler (and default reject handler) to p0. | 17679 // Add resolve handler (and default reject handler) to p0. |
| 17681 CompileRun("var p1 = p0.then(function(){});"); | 17680 CompileRun("var p1 = p0.then(function(){});"); |
| 17682 CHECK(GetPromise("p0")->HasHandler()); | |
| 17683 CHECK(!GetPromise("p1")->HasHandler()); | |
| 17684 CHECK_EQ(0, promise_reject_counter); | 17681 CHECK_EQ(0, promise_reject_counter); |
| 17685 CHECK_EQ(0, promise_revoke_counter); | 17682 CHECK_EQ(0, promise_revoke_counter); |
| 17686 | 17683 |
| 17687 // Reject p0. | 17684 // Reject p0. |
| 17688 CompileRun("reject('ppp');"); | 17685 CompileRun("reject('ppp');"); |
| 17689 CHECK(GetPromise("p0")->HasHandler()); | |
| 17690 CHECK(!GetPromise("p1")->HasHandler()); | |
| 17691 CHECK_EQ(1, promise_reject_counter); | 17686 CHECK_EQ(1, promise_reject_counter); |
| 17692 CHECK_EQ(0, promise_revoke_counter); | 17687 CHECK_EQ(0, promise_revoke_counter); |
| 17693 CHECK_EQ(v8::kPromiseRejectWithNoHandler, reject_event); | 17688 CHECK_EQ(v8::kPromiseRejectWithNoHandler, reject_event); |
| 17694 CHECK(GetPromise("rejected")->Equals(GetPromise("p1"))); | 17689 CHECK(GetPromise("rejected")->Equals(GetPromise("p1"))); |
| 17695 CHECK(RejectValue()->Equals(v8_str("ppp"))); | 17690 CHECK(RejectValue()->Equals(v8_str("ppp"))); |
| 17696 | 17691 |
| 17697 // Reject p0 again. Callback is not triggered again. | 17692 // Reject p0 again. Callback is not triggered again. |
| 17698 CompileRun("reject();"); | 17693 CompileRun("reject();"); |
| 17699 CHECK(GetPromise("p0")->HasHandler()); | |
| 17700 CHECK(!GetPromise("p1")->HasHandler()); | |
| 17701 CHECK_EQ(1, promise_reject_counter); | 17694 CHECK_EQ(1, promise_reject_counter); |
| 17702 CHECK_EQ(0, promise_revoke_counter); | 17695 CHECK_EQ(0, promise_revoke_counter); |
| 17703 | 17696 |
| 17704 // Add resolve handler to p1. | 17697 // Add resolve handler to p1. |
| 17705 CompileRun("var p2 = p1.then(function(){});"); | 17698 CompileRun("var p2 = p1.then(function(){});"); |
| 17706 CHECK(GetPromise("p0")->HasHandler()); | |
| 17707 CHECK(GetPromise("p1")->HasHandler()); | |
| 17708 CHECK(!GetPromise("p2")->HasHandler()); | |
| 17709 CHECK_EQ(2, promise_reject_counter); | 17699 CHECK_EQ(2, promise_reject_counter); |
| 17710 CHECK_EQ(1, promise_revoke_counter); | 17700 CHECK_EQ(1, promise_revoke_counter); |
| 17711 CHECK(GetPromise("rejected")->Equals(GetPromise("p2"))); | 17701 CHECK(GetPromise("rejected")->Equals(GetPromise("p2"))); |
| 17712 CHECK(RejectValue()->Equals(v8_str("ppp"))); | 17702 CHECK(RejectValue()->Equals(v8_str("ppp"))); |
| 17713 CHECK(GetPromise("revoked")->Equals(GetPromise("p1"))); | 17703 CHECK(GetPromise("revoked")->Equals(GetPromise("p1"))); |
| 17714 | 17704 |
| 17715 ResetPromiseStates(); | 17705 ResetPromiseStates(); |
| 17716 | 17706 |
| 17717 // Create promise q0. | 17707 // Create promise q0. |
| 17718 CompileRun( | 17708 CompileRun( |
| 17719 "var q0 = new Promise( \n" | 17709 "var q0 = new Promise( \n" |
| 17720 " function(res, rej) { \n" | 17710 " function(res, rej) { \n" |
| 17721 " reject = rej; \n" | 17711 " reject = rej; \n" |
| 17722 " } \n" | 17712 " } \n" |
| 17723 "); \n"); | 17713 "); \n"); |
| 17724 CHECK(!GetPromise("q0")->HasHandler()); | |
| 17725 CHECK_EQ(0, promise_reject_counter); | 17714 CHECK_EQ(0, promise_reject_counter); |
| 17726 CHECK_EQ(0, promise_revoke_counter); | 17715 CHECK_EQ(0, promise_revoke_counter); |
| 17727 | 17716 |
| 17728 // Add reject handler to q0. | 17717 // Add reject handler to q0. |
| 17729 CompileRun("var q1 = q0.catch(function() {});"); | 17718 CompileRun("var q1 = q0.catch(function() {});"); |
| 17730 CHECK(GetPromise("q0")->HasHandler()); | |
| 17731 CHECK(!GetPromise("q1")->HasHandler()); | |
| 17732 CHECK_EQ(0, promise_reject_counter); | 17719 CHECK_EQ(0, promise_reject_counter); |
| 17733 CHECK_EQ(0, promise_revoke_counter); | 17720 CHECK_EQ(0, promise_revoke_counter); |
| 17734 | 17721 |
| 17735 // Reject q0. | 17722 // Reject q0. |
| 17736 CompileRun("reject('qq')"); | 17723 CompileRun("reject('qq')"); |
| 17737 CHECK(GetPromise("q0")->HasHandler()); | |
| 17738 CHECK(!GetPromise("q1")->HasHandler()); | |
| 17739 CHECK_EQ(0, promise_reject_counter); | 17724 CHECK_EQ(0, promise_reject_counter); |
| 17740 CHECK_EQ(0, promise_revoke_counter); | 17725 CHECK_EQ(0, promise_revoke_counter); |
| 17741 | 17726 |
| 17742 // Add a new reject handler, which rejects by returning Promise.reject(). | 17727 // Add a new reject handler, which rejects by returning Promise.reject(). |
| 17743 // The returned promise q_ triggers a reject callback at first, only to | 17728 // The returned promise q_ triggers a reject callback at first, only to |
| 17744 // revoke it when returning it causes q2 to be rejected. | 17729 // revoke it when returning it causes q2 to be rejected. |
| 17745 CompileRun( | 17730 CompileRun( |
| 17746 "var q_;" | 17731 "var q_;" |
| 17747 "var q2 = q0.catch( \n" | 17732 "var q2 = q0.catch( \n" |
| 17748 " function() { \n" | 17733 " function() { \n" |
| 17749 " q_ = Promise.reject('qqq'); \n" | 17734 " q_ = Promise.reject('qqq'); \n" |
| 17750 " return q_; \n" | 17735 " return q_; \n" |
| 17751 " } \n" | 17736 " } \n" |
| 17752 "); \n"); | 17737 "); \n"); |
| 17753 CHECK(GetPromise("q0")->HasHandler()); | 17738 CHECK_EQ(1, promise_reject_counter); |
| 17754 CHECK(!GetPromise("q1")->HasHandler()); | 17739 CHECK_EQ(0, promise_revoke_counter); |
| 17755 CHECK(!GetPromise("q2")->HasHandler()); | |
| 17756 CHECK(GetPromise("q_")->HasHandler()); | |
| 17757 CHECK_EQ(2, promise_reject_counter); | |
| 17758 CHECK_EQ(1, promise_revoke_counter); | |
| 17759 CHECK(GetPromise("rejected")->Equals(GetPromise("q2"))); | 17740 CHECK(GetPromise("rejected")->Equals(GetPromise("q2"))); |
| 17760 CHECK(GetPromise("revoked")->Equals(GetPromise("q_"))); | |
| 17761 CHECK(RejectValue()->Equals(v8_str("qqq"))); | 17741 CHECK(RejectValue()->Equals(v8_str("qqq"))); |
| 17762 | 17742 |
| 17763 // Add a reject handler to the resolved q1, which rejects by throwing. | 17743 // Add a reject handler to the resolved q1, which rejects by throwing. |
| 17764 CompileRun( | 17744 CompileRun( |
| 17765 "var q3 = q1.then( \n" | 17745 "var q3 = q1.then( \n" |
| 17766 " function() { \n" | 17746 " function() { \n" |
| 17767 " throw 'qqqq'; \n" | 17747 " throw 'qqqq'; \n" |
| 17768 " } \n" | 17748 " } \n" |
| 17769 "); \n"); | 17749 "); \n"); |
| 17770 CHECK(GetPromise("q0")->HasHandler()); | 17750 CHECK_EQ(2, promise_reject_counter); |
| 17771 CHECK(GetPromise("q1")->HasHandler()); | 17751 CHECK_EQ(0, promise_revoke_counter); |
| 17772 CHECK(!GetPromise("q2")->HasHandler()); | |
| 17773 CHECK(!GetPromise("q3")->HasHandler()); | |
| 17774 CHECK_EQ(3, promise_reject_counter); | |
| 17775 CHECK_EQ(1, promise_revoke_counter); | |
| 17776 CHECK(GetPromise("rejected")->Equals(GetPromise("q3"))); | 17752 CHECK(GetPromise("rejected")->Equals(GetPromise("q3"))); |
| 17777 CHECK(RejectValue()->Equals(v8_str("qqqq"))); | 17753 CHECK(RejectValue()->Equals(v8_str("qqqq"))); |
| 17778 | 17754 |
| 17779 ResetPromiseStates(); | 17755 ResetPromiseStates(); |
| 17780 | 17756 |
| 17781 // Create promise r0, which has three handlers, two of which handle rejects. | 17757 // Create promise r0, which has three handlers, two of which handle rejects. |
| 17782 CompileRun( | 17758 CompileRun( |
| 17783 "var r0 = new Promise( \n" | 17759 "var r0 = new Promise( \n" |
| 17784 " function(res, rej) { \n" | 17760 " function(res, rej) { \n" |
| 17785 " reject = rej; \n" | 17761 " reject = rej; \n" |
| 17786 " } \n" | 17762 " } \n" |
| 17787 "); \n" | 17763 "); \n" |
| 17788 "var r1 = r0.catch(function() {}); \n" | 17764 "var r1 = r0.catch(function() {}); \n" |
| 17789 "var r2 = r0.then(function() {}); \n" | 17765 "var r2 = r0.then(function() {}); \n" |
| 17790 "var r3 = r0.then(function() {}, \n" | 17766 "var r3 = r0.then(function() {}, \n" |
| 17791 " function() {}); \n"); | 17767 " function() {}); \n"); |
| 17792 CHECK(GetPromise("r0")->HasHandler()); | |
| 17793 CHECK(!GetPromise("r1")->HasHandler()); | |
| 17794 CHECK(!GetPromise("r2")->HasHandler()); | |
| 17795 CHECK(!GetPromise("r3")->HasHandler()); | |
| 17796 CHECK_EQ(0, promise_reject_counter); | 17768 CHECK_EQ(0, promise_reject_counter); |
| 17797 CHECK_EQ(0, promise_revoke_counter); | 17769 CHECK_EQ(0, promise_revoke_counter); |
| 17798 | 17770 |
| 17799 // Reject r0. | 17771 // Reject r0. |
| 17800 CompileRun("reject('rrr')"); | 17772 CompileRun("reject('rrr')"); |
| 17801 CHECK(GetPromise("r0")->HasHandler()); | |
| 17802 CHECK(!GetPromise("r1")->HasHandler()); | |
| 17803 CHECK(!GetPromise("r2")->HasHandler()); | |
| 17804 CHECK(!GetPromise("r3")->HasHandler()); | |
| 17805 CHECK_EQ(1, promise_reject_counter); | 17773 CHECK_EQ(1, promise_reject_counter); |
| 17806 CHECK_EQ(0, promise_revoke_counter); | 17774 CHECK_EQ(0, promise_revoke_counter); |
| 17807 CHECK(GetPromise("rejected")->Equals(GetPromise("r2"))); | 17775 CHECK(GetPromise("rejected")->Equals(GetPromise("r2"))); |
| 17808 CHECK(RejectValue()->Equals(v8_str("rrr"))); | 17776 CHECK(RejectValue()->Equals(v8_str("rrr"))); |
| 17809 | 17777 |
| 17810 // Add reject handler to r2. | 17778 // Add reject handler to r2. |
| 17811 CompileRun("var r4 = r2.catch(function() {});"); | 17779 CompileRun("var r4 = r2.catch(function() {});"); |
| 17812 CHECK(GetPromise("r0")->HasHandler()); | |
| 17813 CHECK(!GetPromise("r1")->HasHandler()); | |
| 17814 CHECK(GetPromise("r2")->HasHandler()); | |
| 17815 CHECK(!GetPromise("r3")->HasHandler()); | |
| 17816 CHECK(!GetPromise("r4")->HasHandler()); | |
| 17817 CHECK_EQ(1, promise_reject_counter); | 17780 CHECK_EQ(1, promise_reject_counter); |
| 17818 CHECK_EQ(1, promise_revoke_counter); | 17781 CHECK_EQ(1, promise_revoke_counter); |
| 17819 CHECK(GetPromise("revoked")->Equals(GetPromise("r2"))); | 17782 CHECK(GetPromise("revoked")->Equals(GetPromise("r2"))); |
| 17820 CHECK(RejectValue()->Equals(v8_str("rrr"))); | 17783 CHECK(RejectValue()->Equals(v8_str("rrr"))); |
| 17821 | 17784 |
| 17822 // Add reject handlers to r4. | 17785 // Add reject handlers to r4. |
| 17823 CompileRun("var r5 = r4.then(function() {}, function() {});"); | 17786 CompileRun("var r5 = r4.then(function() {}, function() {});"); |
| 17824 CHECK(GetPromise("r0")->HasHandler()); | |
| 17825 CHECK(!GetPromise("r1")->HasHandler()); | |
| 17826 CHECK(GetPromise("r2")->HasHandler()); | |
| 17827 CHECK(!GetPromise("r3")->HasHandler()); | |
| 17828 CHECK(GetPromise("r4")->HasHandler()); | |
| 17829 CHECK(!GetPromise("r5")->HasHandler()); | |
| 17830 CHECK_EQ(1, promise_reject_counter); | 17787 CHECK_EQ(1, promise_reject_counter); |
| 17831 CHECK_EQ(1, promise_revoke_counter); | 17788 CHECK_EQ(1, promise_revoke_counter); |
| 17832 | 17789 |
| 17833 ResetPromiseStates(); | 17790 ResetPromiseStates(); |
| 17834 | 17791 |
| 17835 // Create promise s0, which has three handlers, none of which handle rejects. | 17792 // Create promise s0, which has three handlers, none of which handle rejects. |
| 17836 CompileRun( | 17793 CompileRun( |
| 17837 "var s0 = new Promise( \n" | 17794 "var s0 = new Promise( \n" |
| 17838 " function(res, rej) { \n" | 17795 " function(res, rej) { \n" |
| 17839 " reject = rej; \n" | 17796 " reject = rej; \n" |
| 17840 " } \n" | 17797 " } \n" |
| 17841 "); \n" | 17798 "); \n" |
| 17842 "var s1 = s0.then(function() {}); \n" | 17799 "var s1 = s0.then(function() {}); \n" |
| 17843 "var s2 = s0.then(function() {}); \n" | 17800 "var s2 = s0.then(function() {}); \n" |
| 17844 "var s3 = s0.then(function() {}); \n"); | 17801 "var s3 = s0.then(function() {}); \n"); |
| 17845 CHECK(GetPromise("s0")->HasHandler()); | |
| 17846 CHECK(!GetPromise("s1")->HasHandler()); | |
| 17847 CHECK(!GetPromise("s2")->HasHandler()); | |
| 17848 CHECK(!GetPromise("s3")->HasHandler()); | |
| 17849 CHECK_EQ(0, promise_reject_counter); | 17802 CHECK_EQ(0, promise_reject_counter); |
| 17850 CHECK_EQ(0, promise_revoke_counter); | 17803 CHECK_EQ(0, promise_revoke_counter); |
| 17851 | 17804 |
| 17852 // Reject s0. | 17805 // Reject s0. |
| 17853 CompileRun("reject('sss')"); | 17806 CompileRun("reject('sss')"); |
| 17854 CHECK(GetPromise("s0")->HasHandler()); | |
| 17855 CHECK(!GetPromise("s1")->HasHandler()); | |
| 17856 CHECK(!GetPromise("s2")->HasHandler()); | |
| 17857 CHECK(!GetPromise("s3")->HasHandler()); | |
| 17858 CHECK_EQ(3, promise_reject_counter); | 17807 CHECK_EQ(3, promise_reject_counter); |
| 17859 CHECK_EQ(0, promise_revoke_counter); | 17808 CHECK_EQ(0, promise_revoke_counter); |
| 17860 CHECK(RejectValue()->Equals(v8_str("sss"))); | 17809 CHECK(RejectValue()->Equals(v8_str("sss"))); |
| 17810 |
| 17811 ResetPromiseStates(); |
| 17812 |
| 17813 // Create promise m0, which has three handlers, which will be handled at a |
| 17814 // microtask checkpoint. |
| 17815 CompileRun( |
| 17816 "var m0 = new Promise( \n" |
| 17817 " function(res, rej) { \n" |
| 17818 " reject = rej; \n" |
| 17819 " } \n" |
| 17820 "); \n" |
| 17821 "var m1 = m0.then(function() {}); \n" |
| 17822 "var m2 = m0.then(function() {}); \n" |
| 17823 "var m3 = m0.then(function() {}); \n" |
| 17824 "var m4; \n" |
| 17825 "m0.catch(function() { \n" |
| 17826 " m2.catch(function() { \n" |
| 17827 " m1.catch(function() { \n" |
| 17828 " m4 = m3.then(function() {})\n" |
| 17829 " }); \n" |
| 17830 " }); \n" |
| 17831 "}); \n"); |
| 17832 CHECK_EQ(0, promise_reject_counter); |
| 17833 CHECK_EQ(0, promise_revoke_counter); |
| 17834 |
| 17835 // Reject m0: m1-m3 promises should be handled at "the end of turn". |
| 17836 CompileRun("reject('mmm')"); |
| 17837 CHECK_EQ(1, promise_reject_counter); |
| 17838 CHECK_EQ(0, promise_revoke_counter); |
| 17839 CHECK(GetPromise("rejected")->Equals(GetPromise("m4"))); |
| 17840 CHECK(RejectValue()->Equals(v8_str("mmm"))); |
| 17861 } | 17841 } |
| 17862 | 17842 |
| 17863 | 17843 |
| 17864 void AnalyzeStackOfEvalWithSourceURL( | 17844 void AnalyzeStackOfEvalWithSourceURL( |
| 17865 const v8::FunctionCallbackInfo<v8::Value>& args) { | 17845 const v8::FunctionCallbackInfo<v8::Value>& args) { |
| 17866 v8::HandleScope scope(args.GetIsolate()); | 17846 v8::HandleScope scope(args.GetIsolate()); |
| 17867 v8::Handle<v8::StackTrace> stackTrace = v8::StackTrace::CurrentStackTrace( | 17847 v8::Handle<v8::StackTrace> stackTrace = v8::StackTrace::CurrentStackTrace( |
| 17868 args.GetIsolate(), 10, v8::StackTrace::kDetailed); | 17848 args.GetIsolate(), 10, v8::StackTrace::kDetailed); |
| 17869 CHECK_EQ(5, stackTrace->GetFrameCount()); | 17849 CHECK_EQ(5, stackTrace->GetFrameCount()); |
| 17870 v8::Handle<v8::String> url = v8_str("eval_url"); | 17850 v8::Handle<v8::String> url = v8_str("eval_url"); |
| (...skipping 5818 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 23689 " var foobXXXXX"; // Too many bytes which look like incomplete chars! | 23669 " var foobXXXXX"; // Too many bytes which look like incomplete chars! |
| 23690 char chunk2[] = | 23670 char chunk2[] = |
| 23691 "r = 13;\n" | 23671 "r = 13;\n" |
| 23692 " return foob\xeb\x91\x80\x80\x80r;\n" | 23672 " return foob\xeb\x91\x80\x80\x80r;\n" |
| 23693 "}\n"; | 23673 "}\n"; |
| 23694 for (int i = 0; i < 5; ++i) chunk1[strlen(chunk1) - 5 + i] = reference[i]; | 23674 for (int i = 0; i < 5; ++i) chunk1[strlen(chunk1) - 5 + i] = reference[i]; |
| 23695 | 23675 |
| 23696 const char* chunks[] = {chunk1, chunk2, "foo();", NULL}; | 23676 const char* chunks[] = {chunk1, chunk2, "foo();", NULL}; |
| 23697 RunStreamingTest(chunks, v8::ScriptCompiler::StreamedSource::UTF8, false); | 23677 RunStreamingTest(chunks, v8::ScriptCompiler::StreamedSource::UTF8, false); |
| 23698 } | 23678 } |
| OLD | NEW |