Add method on Value::IsAsyncFunction to detect async functions
DevTools wants to be able to detect async functions in order to print
their synopsis better in stack traces and tooltips. This patch provides a
simple method to do the check.
BUG=v8:4483
Review-Url: https://codereview.chromium.org/2365833002
Cr-Commit-Position: refs/heads/master@{#39687}
diff --git a/include/v8.h b/include/v8.h
index 688f228..edba8ea 100644
--- a/include/v8.h
+++ b/include/v8.h
@@ -2014,6 +2014,11 @@
bool IsRegExp() const;
/**
+ * Returns true if this value is an async function.
+ */
+ bool IsAsyncFunction() const;
+
+ /**
* Returns true if this value is a Generator function.
* This is an experimental feature.
*/
diff --git a/src/api.cc b/src/api.cc
index e4ac2e7..1d3b061 100644
--- a/src/api.cc
+++ b/src/api.cc
@@ -3384,6 +3384,12 @@
return obj->IsJSRegExp();
}
+bool Value::IsAsyncFunction() const {
+ i::Handle<i::Object> obj = Utils::OpenHandle(this);
+ if (!obj->IsJSFunction()) return false;
+ i::Handle<i::JSFunction> func = i::Handle<i::JSFunction>::cast(obj);
+ return func->shared()->is_async();
+}
bool Value::IsGeneratorFunction() const {
i::Handle<i::Object> obj = Utils::OpenHandle(this);
diff --git a/test/cctest/test-api.cc b/test/cctest/test-api.cc
index 8e88e65..1575559 100644
--- a/test/cctest/test-api.cc
+++ b/test/cctest/test-api.cc
@@ -1581,6 +1581,26 @@
CHECK(!func->IsGeneratorObject());
}
+THREADED_TEST(IsAsyncFunction) {
+ i::FLAG_harmony_async_await = true;
+ LocalContext env;
+ v8::Isolate* isolate = env->GetIsolate();
+ v8::HandleScope scope(isolate);
+
+ CompileRun("async function foo() {}");
+ v8::Local<Value> foo = CompileRun("foo");
+
+ CHECK(foo->IsAsyncFunction());
+ CHECK(foo->IsFunction());
+ CHECK(!foo->IsGeneratorFunction());
+ CHECK(!foo->IsGeneratorObject());
+
+ CompileRun("function bar() {}");
+ v8::Local<Value> bar = CompileRun("bar");
+
+ CHECK(!bar->IsAsyncFunction());
+ CHECK(bar->IsFunction());
+}
THREADED_TEST(ArgumentsObject) {
LocalContext env;