Revision: 22086
Author: [email protected]
Date: Mon Jun 30 11:12:42 2014 UTC
Log: Introduce debug events for promises.
[email protected], [email protected]
BUG=v8:3093
LOG=Y
Review URL: https://codereview.chromium.org/357603005
http://code.google.com/p/v8/source/detail?r=22086
Added:
/branches/bleeding_edge/test/mjsunit/es6/debug-promises-new-event.js
/branches/bleeding_edge/test/mjsunit/runtime-gen/debugpromiseevent.js
Modified:
/branches/bleeding_edge/include/v8-debug.h
/branches/bleeding_edge/src/debug-debugger.js
/branches/bleeding_edge/src/debug.cc
/branches/bleeding_edge/src/debug.h
/branches/bleeding_edge/src/promise.js
/branches/bleeding_edge/src/runtime.cc
/branches/bleeding_edge/src/runtime.h
/branches/bleeding_edge/tools/generate-runtime-tests.py
=======================================
--- /dev/null
+++ /branches/bleeding_edge/test/mjsunit/es6/debug-promises-new-event.js
Mon Jun 30 11:12:42 2014 UTC
@@ -0,0 +1,40 @@
+// 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 != Debug.DebugEvent.PromiseEvent) 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);
=======================================
--- /dev/null
+++ /branches/bleeding_edge/test/mjsunit/runtime-gen/debugpromiseevent.js
Mon Jun 30 11:12:42 2014 UTC
@@ -0,0 +1,5 @@
+// Copyright 2014 the V8 project authors. All rights reserved.
+// AUTO-GENERATED BY tools/generate-runtime-tests.py, DO NOT MODIFY
+// Flags: --allow-natives-syntax --harmony
+var _data = new Object();
+%DebugPromiseEvent(_data);
=======================================
--- /branches/bleeding_edge/include/v8-debug.h Fri Jun 27 12:10:43 2014 UTC
+++ /branches/bleeding_edge/include/v8-debug.h Mon Jun 30 11:12:42 2014 UTC
@@ -20,7 +20,8 @@
BeforeCompile = 4,
AfterCompile = 5,
CompileError = 6,
- BreakForCommand = 7
+ PromiseEvent = 7,
+ BreakForCommand = 8
};
=======================================
--- /branches/bleeding_edge/src/debug-debugger.js Fri Jun 27 12:10:43 2014
UTC
+++ /branches/bleeding_edge/src/debug-debugger.js Mon Jun 30 11:12:42 2014
UTC
@@ -19,7 +19,8 @@
NewFunction: 3,
BeforeCompile: 4,
AfterCompile: 5,
- CompileError: 6 };
+ CompileError: 6,
+ PromiseEvent: 7 };
// Types of exceptions that can be broken upon.
Debug.ExceptionBreak = { Caught : 0,
@@ -1197,6 +1198,32 @@
}
return o;
}
+
+
+function MakePromiseEvent(event_data) {
+ if (event_data.type = "new Promise") {
+ return new NewPromiseEvent(event_data);
+ }
+}
+
+
+function PromiseGetter() {
+ return MakeMirror(this.promise_);
+}
+
+
+function NewPromiseEvent(event_data) {
+ this.resolver_ = event_data.resolver;
+ this.promise_ = event_data.promise;
+}
+
+
+NewPromiseEvent.prototype.promise = PromiseGetter;
+
+
+NewPromiseEvent.prototype.resolver = function() {
+ return MakeMirror(this.resolver_);
+}
function DebugCommandProcessor(exec_state, opt_is_running) {
=======================================
--- /branches/bleeding_edge/src/debug.cc Fri Jun 27 12:10:43 2014 UTC
+++ /branches/bleeding_edge/src/debug.cc Mon Jun 30 11:12:42 2014 UTC
@@ -2542,6 +2542,13 @@
isolate_->factory()->NewNumberFromInt(type) };
return MakeJSObject("MakeCompileEvent", ARRAY_SIZE(argv), argv);
}
+
+
+MaybeHandle<Object> Debug::MakePromiseEvent(Handle<JSObject> event_data) {
+ // Create the promise event object.
+ Handle<Object> argv[] = { event_data };
+ return MakeJSObject("MakePromiseEvent", ARRAY_SIZE(argv), argv);
+}
void Debug::OnException(Handle<Object> exception, bool uncaught) {
@@ -2687,6 +2694,25 @@
// Process debug event.
ProcessDebugEvent(v8::AfterCompile, Handle<JSObject>::cast(event_data),
true);
}
+
+
+void Debug::OnPromiseEvent(Handle<JSObject> data) {
+ if (in_debug_scope() || ignore_events()) return;
+
+ HandleScope scope(isolate_);
+ DebugScope debug_scope(this);
+ if (debug_scope.failed()) return;
+
+ // Create the script collected state object.
+ Handle<Object> event_data;
+ // Bail out and don't call debugger if exception.
+ if (!MakePromiseEvent(data).ToHandle(&event_data)) return;
+
+ // Process debug event.
+ ProcessDebugEvent(v8::PromiseEvent,
+ Handle<JSObject>::cast(event_data),
+ true);
+}
void Debug::ProcessDebugEvent(v8::DebugEvent event,
=======================================
--- /branches/bleeding_edge/src/debug.h Fri Jun 27 12:10:43 2014 UTC
+++ /branches/bleeding_edge/src/debug.h Mon Jun 30 11:12:42 2014 UTC
@@ -365,6 +365,7 @@
void OnCompileError(Handle<Script> script);
void OnBeforeCompile(Handle<Script> script);
void OnAfterCompile(Handle<Script> script);
+ void OnPromiseEvent(Handle<JSObject> data);
// API facing.
void SetEventListener(Handle<Object> callback, Handle<Object> data);
@@ -535,6 +536,8 @@
Handle<Object> promise);
MUST_USE_RESULT MaybeHandle<Object> MakeCompileEvent(
Handle<Script> script, v8::DebugEvent type);
+ MUST_USE_RESULT MaybeHandle<Object> MakePromiseEvent(
+ Handle<JSObject> promise_event);
// Mirror cache handling.
void ClearMirrorCache();
=======================================
--- /branches/bleeding_edge/src/promise.js Fri Jun 27 13:48:37 2014 UTC
+++ /branches/bleeding_edge/src/promise.js Mon Jun 30 11:12:42 2014 UTC
@@ -38,6 +38,11 @@
if (!IS_SPEC_FUNCTION(resolver))
throw MakeTypeError('resolver_not_a_function', [resolver]);
var promise = PromiseInit(this);
+ if (DEBUG_IS_ACTIVE) {
+ %DebugPromiseEvent({ type : "new Promise",
+ promise: this,
+ resolver: resolver });
+ }
try {
%DebugPromiseHandlePrologue(function() { return promise });
resolver(function(x) { PromiseResolve(promise, x) },
=======================================
--- /branches/bleeding_edge/src/runtime.cc Mon Jun 30 10:19:31 2014 UTC
+++ /branches/bleeding_edge/src/runtime.cc Mon Jun 30 11:12:42 2014 UTC
@@ -5528,6 +5528,15 @@
isolate->debug()->PromiseHandleEpilogue();
return isolate->heap()->undefined_value();
}
+
+
+RUNTIME_FUNCTION(Runtime_DebugPromiseEvent) {
+ ASSERT(args.length() == 1);
+ HandleScope scope(isolate);
+ CONVERT_ARG_HANDLE_CHECKED(JSObject, data, 0);
+ isolate->debug()->OnPromiseEvent(data);
+ return isolate->heap()->undefined_value();
+}
RUNTIME_FUNCTION(Runtime_DeleteProperty) {
=======================================
--- /branches/bleeding_edge/src/runtime.h Sat Jun 28 00:33:04 2014 UTC
+++ /branches/bleeding_edge/src/runtime.h Mon Jun 30 11:12:42 2014 UTC
@@ -77,6 +77,7 @@
F(DebugPrepareStepInIfStepping, 1, 1) \
F(DebugPromiseHandlePrologue, 1, 1) \
F(DebugPromiseHandleEpilogue, 0, 1) \
+ F(DebugPromiseEvent, 1, 1) \
F(FlattenString, 1, 1) \
F(LoadMutableDouble, 2, 1) \
F(TryMigrateInstance, 1, 1) \
=======================================
--- /branches/bleeding_edge/tools/generate-runtime-tests.py Sat Jun 28
00:33:04 2014 UTC
+++ /branches/bleeding_edge/tools/generate-runtime-tests.py Mon Jun 30
11:12:42 2014 UTC
@@ -47,11 +47,11 @@
# that the parser doesn't bit-rot. Change the values as needed when you
add,
# remove or change runtime functions, but make sure we don't lose our
ability
# to parse them!
-EXPECTED_FUNCTION_COUNT = 415
-EXPECTED_FUZZABLE_COUNT = 330
+EXPECTED_FUNCTION_COUNT = 416
+EXPECTED_FUZZABLE_COUNT = 331
EXPECTED_CCTEST_COUNT = 6
EXPECTED_UNKNOWN_COUNT = 4
-EXPECTED_BUILTINS_COUNT = 806
+EXPECTED_BUILTINS_COUNT = 809
# 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.