summaryrefslogtreecommitdiffstats
path: root/js/src/vm/AsyncFunction.cpp
diff options
context:
space:
mode:
authorwolfbeast <mcwerewolf@gmail.com>2018-03-18 17:54:38 +0100
committerwolfbeast <mcwerewolf@gmail.com>2018-03-18 17:56:16 +0100
commit122938a4398ae8db07060dca3561ff46f93b5925 (patch)
tree965b4bcf2ea8133c172170cf66e5c87cf1e17df3 /js/src/vm/AsyncFunction.cpp
parentdda392cd4edb3258889188af5a5644eb8d36aeb7 (diff)
parentaf300f36f11293c12f2ee01580fc749a7e114376 (diff)
downloadUXP-122938a4398ae8db07060dca3561ff46f93b5925.tar
UXP-122938a4398ae8db07060dca3561ff46f93b5925.tar.gz
UXP-122938a4398ae8db07060dca3561ff46f93b5925.tar.lz
UXP-122938a4398ae8db07060dca3561ff46f93b5925.tar.xz
UXP-122938a4398ae8db07060dca3561ff46f93b5925.zip
Support ES6's "new function" construct
This resolves #75. Merged remote-tracking branch 'janek/js_function_new_1'
Diffstat (limited to 'js/src/vm/AsyncFunction.cpp')
-rw-r--r--js/src/vm/AsyncFunction.cpp19
1 files changed, 13 insertions, 6 deletions
diff --git a/js/src/vm/AsyncFunction.cpp b/js/src/vm/AsyncFunction.cpp
index bd0b4f32a..1e0c7d7c2 100644
--- a/js/src/vm/AsyncFunction.cpp
+++ b/js/src/vm/AsyncFunction.cpp
@@ -107,18 +107,15 @@ WrappedAsyncFunction(JSContext* cx, unsigned argc, Value* vp)
// the async function's body, replacing `await` with `yield`. `wrapped` is a
// function that is visible to the outside, and handles yielded values.
JSObject*
-js::WrapAsyncFunction(JSContext* cx, HandleFunction unwrapped)
+js::WrapAsyncFunctionWithProto(JSContext* cx, HandleFunction unwrapped, HandleObject proto)
{
MOZ_ASSERT(unwrapped->isStarGenerator());
+ MOZ_ASSERT(proto, "We need an explicit prototype to avoid the default"
+ "%FunctionPrototype% fallback in NewFunctionWithProto().");
// Create a new function with AsyncFunctionPrototype, reusing the name and
// the length of `unwrapped`.
- // Step 1.
- RootedObject proto(cx, GlobalObject::getOrCreateAsyncFunctionPrototype(cx, cx->global()));
- if (!proto)
- return nullptr;
-
RootedAtom funName(cx, unwrapped->name());
uint16_t length;
if (!unwrapped->getLength(cx, &length))
@@ -141,6 +138,16 @@ js::WrapAsyncFunction(JSContext* cx, HandleFunction unwrapped)
return wrapped;
}
+JSObject*
+js::WrapAsyncFunction(JSContext* cx, HandleFunction unwrapped)
+{
+ RootedObject proto(cx, GlobalObject::getOrCreateAsyncFunctionPrototype(cx, cx->global()));
+ if (!proto)
+ return nullptr;
+
+ return WrapAsyncFunctionWithProto(cx, unwrapped, proto);
+}
+
enum class ResumeKind {
Normal,
Throw