Commit 93043d64 authored by Benedikt Meurer's avatar Benedikt Meurer Committed by Commit Bot

[async] Add CallSite#getPromiseIndex() builtin.

In order for Error.prepareStackTrace() to be able to reconstruct the
same stack frame that the internal mechanism can, we need to also
expose the index for the Promise.all() builtin. The newly added
CallSite#getPromiseIndex() does exactly that.

Bug: v8:7522
Change-Id: I904a4c1005f539536a71926ea1da38b31e2a2e8a
Reviewed-on: https://chromium-review.googlesource.com/c/1304293Reviewed-by: 's avatarYang Guo <yangguo@chromium.org>
Commit-Queue: Benedikt Meurer <bmeurer@chromium.org>
Cr-Commit-Position: refs/heads/master@{#57055}
parent ea8aa6a7
...@@ -4354,6 +4354,7 @@ void Bootstrapper::ExportFromRuntime(Isolate* isolate, ...@@ -4354,6 +4354,7 @@ void Bootstrapper::ExportFromRuntime(Isolate* isolate,
{"getLineNumber", Builtins::kCallSitePrototypeGetLineNumber}, {"getLineNumber", Builtins::kCallSitePrototypeGetLineNumber},
{"getMethodName", Builtins::kCallSitePrototypeGetMethodName}, {"getMethodName", Builtins::kCallSitePrototypeGetMethodName},
{"getPosition", Builtins::kCallSitePrototypeGetPosition}, {"getPosition", Builtins::kCallSitePrototypeGetPosition},
{"getPromiseIndex", Builtins::kCallSitePrototypeGetPromiseIndex},
{"getScriptNameOrSourceURL", {"getScriptNameOrSourceURL",
Builtins::kCallSitePrototypeGetScriptNameOrSourceURL}, Builtins::kCallSitePrototypeGetScriptNameOrSourceURL},
{"getThis", Builtins::kCallSitePrototypeGetThis}, {"getThis", Builtins::kCallSitePrototypeGetThis},
......
...@@ -110,6 +110,14 @@ BUILTIN(CallSitePrototypeGetPosition) { ...@@ -110,6 +110,14 @@ BUILTIN(CallSitePrototypeGetPosition) {
return Smi::FromInt(it.Frame()->GetPosition()); return Smi::FromInt(it.Frame()->GetPosition());
} }
BUILTIN(CallSitePrototypeGetPromiseIndex) {
HandleScope scope(isolate);
CHECK_CALLSITE(recv, "getPromiseIndex");
FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
GetFrameIndex(isolate, recv));
return PositiveNumberOrNull(it.Frame()->GetPromiseIndex(), isolate);
}
BUILTIN(CallSitePrototypeGetScriptNameOrSourceURL) { BUILTIN(CallSitePrototypeGetScriptNameOrSourceURL) {
HandleScope scope(isolate); HandleScope scope(isolate);
CHECK_CALLSITE(recv, "getScriptNameOrSourceUrl"); CHECK_CALLSITE(recv, "getScriptNameOrSourceUrl");
......
...@@ -459,6 +459,7 @@ namespace internal { ...@@ -459,6 +459,7 @@ namespace internal {
CPP(CallSitePrototypeGetLineNumber) \ CPP(CallSitePrototypeGetLineNumber) \
CPP(CallSitePrototypeGetMethodName) \ CPP(CallSitePrototypeGetMethodName) \
CPP(CallSitePrototypeGetPosition) \ CPP(CallSitePrototypeGetPosition) \
CPP(CallSitePrototypeGetPromiseIndex) \
CPP(CallSitePrototypeGetScriptNameOrSourceURL) \ CPP(CallSitePrototypeGetScriptNameOrSourceURL) \
CPP(CallSitePrototypeGetThis) \ CPP(CallSitePrototypeGetThis) \
CPP(CallSitePrototypeGetTypeName) \ CPP(CallSitePrototypeGetTypeName) \
......
...@@ -468,6 +468,10 @@ int JSStackFrame::GetColumnNumber() { ...@@ -468,6 +468,10 @@ int JSStackFrame::GetColumnNumber() {
return -1; return -1;
} }
int JSStackFrame::GetPromiseIndex() const {
return is_promise_all_ ? offset_ : -1;
}
bool JSStackFrame::IsNative() { bool JSStackFrame::IsNative() {
return HasScript() && GetScript()->type() == Script::TYPE_NATIVE; return HasScript() && GetScript()->type() == Script::TYPE_NATIVE;
} }
......
...@@ -69,6 +69,9 @@ class StackFrameBase { ...@@ -69,6 +69,9 @@ class StackFrameBase {
// Return 1-based column number, including column offset if first line. // Return 1-based column number, including column offset if first line.
virtual int GetColumnNumber() = 0; virtual int GetColumnNumber() = 0;
// Returns index for Promise.all() async frames, or -1 for other frames.
virtual int GetPromiseIndex() const = 0;
virtual bool IsNative() = 0; virtual bool IsNative() = 0;
virtual bool IsToplevel() = 0; virtual bool IsToplevel() = 0;
virtual bool IsEval(); virtual bool IsEval();
...@@ -109,6 +112,8 @@ class JSStackFrame : public StackFrameBase { ...@@ -109,6 +112,8 @@ class JSStackFrame : public StackFrameBase {
int GetLineNumber() override; int GetLineNumber() override;
int GetColumnNumber() override; int GetColumnNumber() override;
int GetPromiseIndex() const override;
bool IsNative() override; bool IsNative() override;
bool IsToplevel() override; bool IsToplevel() override;
bool IsAsync() const override { return is_async_; } bool IsAsync() const override { return is_async_; }
...@@ -155,6 +160,8 @@ class WasmStackFrame : public StackFrameBase { ...@@ -155,6 +160,8 @@ class WasmStackFrame : public StackFrameBase {
int GetLineNumber() override { return wasm_func_index_; } int GetLineNumber() override { return wasm_func_index_; }
int GetColumnNumber() override { return -1; } int GetColumnNumber() override { return -1; }
int GetPromiseIndex() const override { return -1; }
bool IsNative() override { return false; } bool IsNative() override { return false; }
bool IsToplevel() override { return false; } bool IsToplevel() override { return false; }
bool IsAsync() const override { return false; } bool IsAsync() const override { return false; }
......
...@@ -9,13 +9,17 @@ ...@@ -9,13 +9,17 @@
Error.prepareStackTrace = (e, frames) => { Error.prepareStackTrace = (e, frames) => {
assertEquals(two, frames[0].getFunction()); assertEquals(two, frames[0].getFunction());
assertEquals(two.name, frames[0].getFunctionName()); assertEquals(two.name, frames[0].getFunctionName());
assertEquals(null, frames[0].getPromiseIndex());
assertFalse(frames[0].isAsync()); assertFalse(frames[0].isAsync());
assertEquals(Promise.all, frames[1].getFunction()); assertEquals(Promise.all, frames[1].getFunction());
assertEquals(0, frames[1].getPromiseIndex());
assertTrue(frames[1].isAsync()); assertTrue(frames[1].isAsync());
assertTrue(frames[1].isPromiseAll()); assertTrue(frames[1].isPromiseAll());
assertEquals(one, frames[2].getFunction()); assertEquals(one, frames[2].getFunction());
assertEquals(one.name, frames[2].getFunctionName()); assertEquals(one.name, frames[2].getFunctionName());
assertEquals(null, frames[2].getPromiseIndex());
assertTrue(frames[2].isAsync()); assertTrue(frames[2].isAsync());
assertFalse(frames[2].isPromiseAll());
return frames; return frames;
}; };
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment