Index: src/builtins/builtins-promise.cc |
diff --git a/src/builtins/builtins-promise.cc b/src/builtins/builtins-promise.cc |
index 8acd509ccbf9a2f1c6c2662065439a04e69615b2..9a2fe2c298bd026f2ce3695bff6e8416216dfc60 100644 |
--- a/src/builtins/builtins-promise.cc |
+++ b/src/builtins/builtins-promise.cc |
@@ -38,23 +38,35 @@ BUILTIN(PromiseRejectClosure) { |
// ES#sec-createresolvingfunctions |
// CreateResolvingFunctions ( promise ) |
-BUILTIN(CreateResolvingFunctions) { |
- HandleScope scope(isolate); |
- DCHECK_EQ(3, args.length()); |
+void Builtins::Generate_CreateResolvingFunctions( |
+ compiler::CodeAssemblerState* state) { |
+ CodeStubAssembler a(state); |
+ typedef compiler::Node Node; |
+ |
+ Node* const promise = a.Parameter(1); |
+ Node* const debug_event = a.Parameter(2); |
+ Node* const context = a.Parameter(5); |
+ Node* const native_context = a.LoadNativeContext(context); |
+ |
+ Node* resolve = nullptr; |
+ Node* reject = nullptr; |
- Handle<JSObject> promise = args.at<JSObject>(1); |
- Handle<Object> debug_event = args.at<Object>(2); |
- Handle<JSFunction> resolve, reject; |
+ std::tie(resolve, reject) = |
+ a.CreatePromiseResolvingFunctions(promise, debug_event, native_context); |
- PromiseUtils::CreateResolvingFunctions(isolate, promise, debug_event, |
- &resolve, &reject); |
+ Node* const kSize = a.Int32Constant(2); |
+ Node* const arr = a.AllocateFixedArray(FAST_ELEMENTS, kSize); |
+ a.StoreFixedArrayElement(arr, 0, resolve); |
jgruber
2016/12/13 10:44:04
We can skip write barriers when arr is guaranteed
gsathya
2016/12/13 13:01:46
Done.
|
+ a.StoreFixedArrayElement(arr, 1, reject); |
- Handle<FixedArray> result = isolate->factory()->NewFixedArray(2); |
- result->set(0, *resolve); |
- result->set(1, *reject); |
+ const ElementsKind kind = FAST_ELEMENTS; |
jgruber
2016/12/13 10:44:04
If you pull this up you could use it in AllocateFi
gsathya
2016/12/13 13:01:46
Done.
|
+ Node* const array_map = a.LoadJSArrayElementsMap(kind, native_context); |
+ Node* const length = a.SmiTag(kSize); |
+ Node* const result = a.AllocateUninitializedJSArrayWithoutElements( |
+ kind, array_map, length, nullptr); |
- return *isolate->factory()->NewJSArrayWithElements(result, FAST_ELEMENTS, 2, |
- NOT_TENURED); |
+ a.StoreObjectField(result, JSObject::kElementsOffset, arr); |
+ a.Return(result); |
} |
void Builtins::Generate_PromiseConstructor( |
@@ -127,13 +139,12 @@ void Builtins::Generate_PromiseConstructor( |
{ |
Label out(&a), if_rejectpromise(&a), debug_pop(&a, Label::kDeferred); |
- // TODO(gsathya): Move this to TF. |
- Node* const resolving_functions = a.CallRuntime( |
- Runtime::kCreateResolvingFunctions, context, var_result.value()); |
- Node* const resolve = |
- a.LoadFixedArrayElement(resolving_functions, a.IntPtrConstant(0)); |
- Node* const reject = |
- a.LoadFixedArrayElement(resolving_functions, a.IntPtrConstant(1)); |
+ Node* resolve = nullptr; |
+ Node* reject = nullptr; |
+ |
+ std::tie(resolve, reject) = a.CreatePromiseResolvingFunctions( |
+ var_result.value(), a.BooleanConstant(true), native_context); |
jgruber
2016/12/13 10:44:04
a.TrueConstant()
gsathya
2016/12/13 13:01:46
Done.
|
+ |
Callable call_callable = CodeFactory::Call(isolate); |
Node* const maybe_exception = |