summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGaming4JC <g4jc@hyperbola.info>2019-06-08 16:16:14 -0400
committerGaming4JC <g4jc@hyperbola.info>2019-07-18 22:38:18 -0400
commitaf32c8553e54455ef8cbfe70a13f79f84c2163a4 (patch)
treefb43f83a507102c33a9631f3a7d9a2a156024545
parentc6fe42095040b0be2ee85bc750bd905bfe396fbd (diff)
downloadUXP-af32c8553e54455ef8cbfe70a13f79f84c2163a4.tar
UXP-af32c8553e54455ef8cbfe70a13f79f84c2163a4.tar.gz
UXP-af32c8553e54455ef8cbfe70a13f79f84c2163a4.tar.lz
UXP-af32c8553e54455ef8cbfe70a13f79f84c2163a4.tar.xz
UXP-af32c8553e54455ef8cbfe70a13f79f84c2163a4.zip
1325606 - Return wrapped async function from caller property.
-rw-r--r--js/src/jsfun.cpp4
-rw-r--r--js/src/tests/ecma_2017/AsyncFunctions/inner-caller.js26
2 files changed, 30 insertions, 0 deletions
diff --git a/js/src/jsfun.cpp b/js/src/jsfun.cpp
index ef5aea768..06d5cced7 100644
--- a/js/src/jsfun.cpp
+++ b/js/src/jsfun.cpp
@@ -284,6 +284,8 @@ CallerGetterImpl(JSContext* cx, const CallArgs& args)
}
RootedObject caller(cx, iter.callee(cx));
+ if (caller->is<JSFunction>() && caller->as<JSFunction>().isAsync())
+ caller = GetWrappedAsyncFunction(&caller->as<JSFunction>());
if (!cx->compartment()->wrap(cx, &caller))
return false;
@@ -304,6 +306,8 @@ CallerGetterImpl(JSContext* cx, const CallArgs& args)
}
JSFunction* callerFun = &callerObj->as<JSFunction>();
+ if (IsWrappedAsyncFunction(callerFun))
+ callerFun = GetUnwrappedAsyncFunction(callerFun);
MOZ_ASSERT(!callerFun->isBuiltin(), "non-builtin iterator returned a builtin?");
if (callerFun->strict()) {
diff --git a/js/src/tests/ecma_2017/AsyncFunctions/inner-caller.js b/js/src/tests/ecma_2017/AsyncFunctions/inner-caller.js
new file mode 100644
index 000000000..523eb79ea
--- /dev/null
+++ b/js/src/tests/ecma_2017/AsyncFunctions/inner-caller.js
@@ -0,0 +1,26 @@
+var BUGNUMBER = 1185106;
+var summary = "caller property of function inside async function should return wrapped async function";
+
+print(BUGNUMBER + ": " + summary);
+
+(async function f() {
+ var inner = (function g() {
+ return g.caller;
+ })();
+ assertEq(inner, f);
+})();
+
+(async function f() {
+ "use strict";
+ try {
+ (function g() {
+ return g.caller;
+ })();
+ assertEq(true, false);
+ } catch (e) {
+ assertEq(e instanceof TypeError, true);
+ }
+})();
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);