Modified: trunk/Source/_javascript_Core/ChangeLog (221478 => 221479)
--- trunk/Source/_javascript_Core/ChangeLog 2017-09-01 15:08:01 UTC (rev 221478)
+++ trunk/Source/_javascript_Core/ChangeLog 2017-09-01 16:05:42 UTC (rev 221479)
@@ -1,3 +1,17 @@
+2017-09-01 Yusuke Suzuki <utatane....@gmail.com>
+
+ [FTL] FTL allocation for async Function is incorrect
+ https://bugs.webkit.org/show_bug.cgi?id=176214
+
+ Reviewed by Saam Barati.
+
+ In FTL, allocating async function / async generator function was incorrectly using
+ JSFunction logic. While it is not observable right now since sizeof(JSFunction) == sizeof(JSAsyncFunction),
+ but it is a bug.
+
+ * ftl/FTLLowerDFGToB3.cpp:
+ (JSC::FTL::DFG::LowerDFGToB3::compileNewFunction):
+
2017-08-31 Yusuke Suzuki <utatane....@gmail.com>
[JSC] Fix "name" and "length" of Proxy revoke function
Modified: trunk/Source/_javascript_Core/ftl/FTLLowerDFGToB3.cpp (221478 => 221479)
--- trunk/Source/_javascript_Core/ftl/FTLLowerDFGToB3.cpp 2017-09-01 15:08:01 UTC (rev 221478)
+++ trunk/Source/_javascript_Core/ftl/FTLLowerDFGToB3.cpp 2017-09-01 16:05:42 UTC (rev 221479)
@@ -70,6 +70,8 @@
#include "JITMulGenerator.h"
#include "JITRightShiftGenerator.h"
#include "JITSubGenerator.h"
+#include "JSAsyncFunction.h"
+#include "JSAsyncGeneratorFunction.h"
#include "JSCInlines.h"
#include "JSGeneratorFunction.h"
#include "JSLexicalEnvironment.h"
@@ -4356,7 +4358,7 @@
ASSERT(m_node->op() == NewFunction || m_node->op() == NewGeneratorFunction || m_node->op() == NewAsyncGeneratorFunction || m_node->op() == NewAsyncFunction);
bool isGeneratorFunction = m_node->op() == NewGeneratorFunction;
bool isAsyncFunction = m_node->op() == NewAsyncFunction;
- bool isAsynGeneratorFunction = m_node->op() == NewAsyncGeneratorFunction;
+ bool isAsyncGeneratorFunction = m_node->op() == NewAsyncGeneratorFunction;
LValue scope = lowCell(m_node->child1());
@@ -4365,7 +4367,7 @@
LValue callResult =
isGeneratorFunction ? vmCall(Int64, m_out.operation(operationNewGeneratorFunction), m_callFrame, scope, weakPointer(executable)) :
isAsyncFunction ? vmCall(Int64, m_out.operation(operationNewAsyncFunction), m_callFrame, scope, weakPointer(executable)) :
- isAsynGeneratorFunction ? vmCall(Int64, m_out.operation(operationNewAsyncGeneratorFunction), m_callFrame, scope, weakPointer(executable)) :
+ isAsyncGeneratorFunction ? vmCall(Int64, m_out.operation(operationNewAsyncGeneratorFunction), m_callFrame, scope, weakPointer(executable)) :
vmCall(Int64, m_out.operation(operationNewFunction), m_callFrame, scope, weakPointer(executable));
setJSValue(callResult);
return;
@@ -4374,7 +4376,7 @@
RegisteredStructure structure = m_graph.registerStructure(
isGeneratorFunction ? m_graph.globalObjectFor(m_node->origin.semantic)->generatorFunctionStructure() :
isAsyncFunction ? m_graph.globalObjectFor(m_node->origin.semantic)->asyncFunctionStructure() :
- isAsynGeneratorFunction ? m_graph.globalObjectFor(m_node->origin.semantic)->asyncGeneratorFunctionStructure() :
+ isAsyncGeneratorFunction ? m_graph.globalObjectFor(m_node->origin.semantic)->asyncGeneratorFunctionStructure() :
m_graph.globalObjectFor(m_node->origin.semantic)->functionStructure());
LBasicBlock slowPath = m_out.newBlock();
@@ -4384,6 +4386,8 @@
LValue fastObject =
isGeneratorFunction ? allocateObject<JSGeneratorFunction>(structure, m_out.intPtrZero, slowPath) :
+ isAsyncFunction ? allocateObject<JSAsyncFunction>(structure, m_out.intPtrZero, slowPath) :
+ isAsyncGeneratorFunction ? allocateObject<JSAsyncGeneratorFunction>(structure, m_out.intPtrZero, slowPath) :
allocateObject<JSFunction>(structure, m_out.intPtrZero, slowPath);
@@ -4405,20 +4409,15 @@
VM& vm = this->vm();
LValue callResult = lazySlowPath(
[=, &vm] (const Vector<Location>& locations) -> RefPtr<LazySlowPath::Generator> {
- if (isGeneratorFunction) {
- return createLazyCallGenerator(vm,
- operationNewGeneratorFunctionWithInvalidatedReallocationWatchpoint,
- locations[0].directGPR(), locations[1].directGPR(),
- CCallHelpers::TrustedImmPtr(executable));
- }
- if (isAsyncFunction) {
- return createLazyCallGenerator(vm,
- operationNewAsyncFunctionWithInvalidatedReallocationWatchpoint,
- locations[0].directGPR(), locations[1].directGPR(),
- CCallHelpers::TrustedImmPtr(executable));
- }
- return createLazyCallGenerator(vm,
- operationNewFunctionWithInvalidatedReallocationWatchpoint,
+ auto* operation = operationNewFunctionWithInvalidatedReallocationWatchpoint;
+ if (isGeneratorFunction)
+ operation = operationNewGeneratorFunctionWithInvalidatedReallocationWatchpoint;
+ else if (isAsyncFunction)
+ operation = operationNewAsyncFunctionWithInvalidatedReallocationWatchpoint;
+ else if (isAsyncGeneratorFunction)
+ operation = operationNewAsyncGeneratorFunctionWithInvalidatedReallocationWatchpoint;
+
+ return createLazyCallGenerator(vm, operation,
locations[0].directGPR(), locations[1].directGPR(),
CCallHelpers::TrustedImmPtr(executable));
},