Revision: 22846
Author: [email protected]
Date: Tue Aug 5 07:42:06 2014 UTC
Log: Merge three PromiseEvent's into one.
This also adds missing instrumentation and removes resolver tracking.
BUG=v8:3093
LOG=N
[email protected], [email protected]
Review URL: https://codereview.chromium.org/416213004
Patch from Alexandra Mikhaylova <[email protected]>.
http://code.google.com/p/v8/source/detail?r=22846
Added:
/branches/bleeding_edge/test/mjsunit/es6/debug-promise-events.js
Deleted:
/branches/bleeding_edge/test/mjsunit/es6/debug-promises-new-event.js
Modified:
/branches/bleeding_edge/src/debug-debugger.js
/branches/bleeding_edge/src/promise.js
/branches/bleeding_edge/tools/generate-runtime-tests.py
=======================================
--- /dev/null
+++ /branches/bleeding_edge/test/mjsunit/es6/debug-promise-events.js Tue
Aug 5 07:42:06 2014 UTC
@@ -0,0 +1,122 @@
+// Copyright 2014 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Flags: --allow-natives-syntax --expose-debug-as debug
+
+Debug = debug.Debug;
+
+var eventsExpected = 16;
+var exception = null;
+var result = [];
+
+function updatePromise(promise, parentPromise, status, value) {
+ var i;
+ for (i = 0; i < result.length; ++i) {
+ if (result[i].promise === promise) {
+ result[i].parentPromise = parentPromise || result[i].parentPromise;
+ result[i].status = status || result[i].status;
+ result[i].value = value || result[i].value;
+ break;
+ }
+ }
+ assertTrue(i < result.length);
+}
+
+function listener(event, exec_state, event_data, data) {
+ if (event != Debug.DebugEvent.PromiseEvent) return;
+ try {
+ eventsExpected--;
+ assertTrue(event_data.promise().isPromise());
+ if (event_data.status() === 0) {
+ // New promise.
+ assertEquals("pending", event_data.promise().status());
+ result.push({ promise: event_data.promise().value(), status: 0 });
+ } else if (event_data.status() !== undefined) {
+ // Resolve/reject promise.
+ updatePromise(event_data.promise().value(),
+ undefined,
+ event_data.status(),
+ event_data.value().value());
+ } else {
+ // Chain promises.
+ assertTrue(event_data.parentPromise().isPromise());
+ updatePromise(event_data.promise().value(),
+ event_data.parentPromise().value());
+ }
+ } catch (e) {
+ print(e + e.stack)
+ exception = e;
+ }
+}
+
+Debug.setListener(listener);
+
+function resolver(resolve, reject) {
+ resolve();
+}
+
+var p1 = new Promise(resolver);
+var p2 = p1.then().then();
+var p3 = new Promise(function(resolve, reject) { reject("rejected"); });
+var p4 = p3.then();
+var p5 = p1.then();
+
+function assertAsync(b, s) {
+ if (b) {
+ print(s, "succeeded");
+ } else {
+ %AbortJS(s + " FAILED!");
+ }
+}
+
+function testDone(iteration) {
+ function checkResult() {
+ if (eventsExpected === 0) {
+ assertAsync(result.length === 6, "result.length");
+
+ assertAsync(result[0].promise === p1, "result[0].promise");
+ assertAsync(result[0].parentPromise === undefined,
+ "result[0].parentPromise");
+ assertAsync(result[0].status === 1, "result[0].status");
+ assertAsync(result[0].value === undefined, "result[0].value");
+
+ assertAsync(result[1].parentPromise === p1,
+ "result[1].parentPromise");
+ assertAsync(result[1].status === 1, "result[1].status");
+
+ assertAsync(result[2].promise === p2, "result[2].promise");
+
+ assertAsync(result[3].promise === p3, "result[3].promise");
+ assertAsync(result[3].parentPromise === undefined,
+ "result[3].parentPromise");
+ assertAsync(result[3].status === -1, "result[3].status");
+ assertAsync(result[3].value === "rejected", "result[3].value");
+
+ assertAsync(result[4].promise === p4, "result[4].promise");
+ assertAsync(result[4].parentPromise === p3,
+ "result[4].parentPromise");
+ assertAsync(result[4].status === -1, "result[4].status");
+ assertAsync(result[4].value === "rejected", "result[4].value");
+
+ assertAsync(result[5].promise === p5, "result[5].promise");
+ assertAsync(result[5].parentPromise === p1,
+ "result[5].parentPromise");
+ assertAsync(result[5].status === 1, "result[5].status");
+
+ assertAsync(exception === null, "exception === null");
+ Debug.setListener(null);
+ } else if (iteration > 10) {
+ %AbortJS("Not all events were received!");
+ } else {
+ testDone(iteration + 1);
+ }
+ }
+
+ var iteration = iteration || 0;
+ var dummy = {};
+ Object.observe(dummy, checkResult);
+ dummy.dummy = dummy;
+}
+
+testDone();
=======================================
--- /branches/bleeding_edge/test/mjsunit/es6/debug-promises-new-event.js
Thu Jul 24 10:43:41 2014 UTC
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright 2014 the V8 project authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Flags: --expose-debug-as debug
-
-Debug = debug.Debug;
-
-var exception = null;
-var new_promise;
-
-function listener(event, exec_state, event_data, data) {
- if (!(event_data instanceof debug.NewPromiseEvent)) return;
- try {
- assertTrue(event_data.resolver().isFunction());
- assertEquals(resolver, event_data.resolver().value());
- assertTrue(event_data.resolver().resolved());
- assertEquals("resolver", event_data.resolver().name());
- assertTrue(event_data.resolver().source().indexOf("Token") > 0);
-
- assertTrue(event_data.promise().isPromise());
- new_promise = event_data.promise().value();
- assertEquals("pending", event_data.promise().status());
- } catch (e) {
- print(e + e.stack)
- exception = e;
- }
-}
-
-Debug.setListener(listener);
-
-function resolver(resolve, reject) {
- resolve(); // Token
-}
-
-var p = new Promise(resolver);
-assertEquals(new_promise, p);
-
-assertNull(exception);
-Debug.setListener(null);
=======================================
--- /branches/bleeding_edge/src/debug-debugger.js Thu Jul 24 10:43:41 2014
UTC
+++ /branches/bleeding_edge/src/debug-debugger.js Tue Aug 5 07:42:06 2014
UTC
@@ -1202,69 +1202,36 @@
function MakePromiseEvent(event_data) {
- if (event_data.type == "new") {
- return new NewPromiseEvent(event_data);
- }
- if (event_data.type == "update") {
- return new UpdatePromiseStatusEvent(event_data);
- }
- if (event_data.type == "chain") {
- return new UpdatePromiseParentEvent(event_data);
- }
+ return new PromiseEvent(event_data);
}
-function PromiseGetter() {
- return MakeMirror(this.promise_);
-}
-
-
-function NewPromiseEvent(event_data) {
- this.resolver_ = event_data.resolver;
+function PromiseEvent(event_data) {
this.promise_ = event_data.promise;
+ this.parentPromise_ = event_data.parentPromise;
+ this.status_ = event_data.status;
+ this.value_ = event_data.value;
}
-NewPromiseEvent.prototype.promise = PromiseGetter;
-
-
-NewPromiseEvent.prototype.resolver = function() {
- return MakeMirror(this.resolver_);
+PromiseEvent.prototype.promise = function() {
+ return MakeMirror(this.promise_);
}
-function UpdatePromiseStatusEvent(event_data) {
- this.promise_ = event_data.promise;
- this.status_ = event_data.status;
- this.value_ = event_data.value;
+PromiseEvent.prototype.parentPromise = function() {
+ return MakeMirror(this.parentPromise_);
}
-UpdatePromiseStatusEvent.prototype.promise = PromiseGetter;
-
-
-UpdatePromiseStatusEvent.prototype.status = function() {
+PromiseEvent.prototype.status = function() {
return this.status_;
}
-UpdatePromiseStatusEvent.prototype.value = function() {
+PromiseEvent.prototype.value = function() {
return MakeMirror(this.value_);
}
-
-
-function UpdatePromiseParentEvent(event_data) {
- this.promise_ = event_data.promise;
- this.parentPromise_ = event_data.parentPromise;
-}
-
-
-UpdatePromiseParentEvent.prototype.promise = PromiseGetter;
-
-
-UpdatePromiseParentEvent.prototype.parentPromise = function() {
- return MakeMirror(this.parentPromise_);
-}
function MakeAsyncTaskEvent(event_data) {
=======================================
--- /branches/bleeding_edge/src/promise.js Thu Jul 24 10:43:41 2014 UTC
+++ /branches/bleeding_edge/src/promise.js Tue Aug 5 07:42:06 2014 UTC
@@ -39,11 +39,6 @@
if (!IS_SPEC_FUNCTION(resolver))
throw MakeTypeError('resolver_not_a_function', [resolver]);
var promise = PromiseInit(this);
- if (DEBUG_IS_ACTIVE) {
- %DebugPromiseEvent({ type : "new",
- promise: this,
- resolver: resolver });
- }
try {
%DebugPromiseHandlePrologue(function() { return promise });
resolver(function(x) { PromiseResolve(promise, x) },
@@ -62,11 +57,8 @@
SET_PRIVATE(promise, promiseValue, value);
SET_PRIVATE(promise, promiseOnResolve, onResolve);
SET_PRIVATE(promise, promiseOnReject, onReject);
- if (DEBUG_IS_ACTIVE && status !== 0) {
- %DebugPromiseEvent({ type: "update",
- promise: promise,
- status: status,
- value: value });
+ if (DEBUG_IS_ACTIVE) {
+ %DebugPromiseEvent({ promise: promise, status: status, value: value
});
}
return promise;
}
@@ -241,9 +233,7 @@
break;
}
if (DEBUG_IS_ACTIVE) {
- %DebugPromiseEvent({ type: "chain",
- promise: deferred.promise,
- parentPromise: this });
+ %DebugPromiseEvent({ promise: deferred.promise, parentPromise: this
});
}
return deferred.promise;
}
=======================================
--- /branches/bleeding_edge/tools/generate-runtime-tests.py Mon Aug 4
11:45:52 2014 UTC
+++ /branches/bleeding_edge/tools/generate-runtime-tests.py Tue Aug 5
07:42:06 2014 UTC
@@ -51,7 +51,7 @@
EXPECTED_FUZZABLE_COUNT = 328
EXPECTED_CCTEST_COUNT = 7
EXPECTED_UNKNOWN_COUNT = 16
-EXPECTED_BUILTINS_COUNT = 816
+EXPECTED_BUILTINS_COUNT = 813
# Don't call these at all.
--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
---
You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.