OLD | NEW |
1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/builtins/builtins-promise.h" | 5 #include "src/builtins/builtins-promise.h" |
6 #include "src/builtins/builtins-constructor.h" | 6 #include "src/builtins/builtins-constructor.h" |
7 #include "src/builtins/builtins-utils.h" | 7 #include "src/builtins/builtins-utils.h" |
8 #include "src/builtins/builtins.h" | 8 #include "src/builtins/builtins.h" |
9 #include "src/code-factory.h" | 9 #include "src/code-factory.h" |
10 #include "src/code-stub-assembler.h" | 10 #include "src/code-stub-assembler.h" |
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
171 | 171 |
172 Bind(&if_notcallable); | 172 Bind(&if_notcallable); |
173 Node* message = SmiConstant(MessageTemplate::kPromiseNonCallable); | 173 Node* message = SmiConstant(MessageTemplate::kPromiseNonCallable); |
174 StoreObjectField(capability, JSPromiseCapability::kPromiseOffset, | 174 StoreObjectField(capability, JSPromiseCapability::kPromiseOffset, |
175 UndefinedConstant()); | 175 UndefinedConstant()); |
176 StoreObjectField(capability, JSPromiseCapability::kResolveOffset, | 176 StoreObjectField(capability, JSPromiseCapability::kResolveOffset, |
177 UndefinedConstant()); | 177 UndefinedConstant()); |
178 StoreObjectField(capability, JSPromiseCapability::kRejectOffset, | 178 StoreObjectField(capability, JSPromiseCapability::kRejectOffset, |
179 UndefinedConstant()); | 179 UndefinedConstant()); |
180 CallRuntime(Runtime::kThrowTypeError, context, message); | 180 CallRuntime(Runtime::kThrowTypeError, context, message); |
181 var_result.Bind(UndefinedConstant()); | 181 Unreachable(); |
182 Goto(&out); | |
183 } | 182 } |
184 | 183 |
185 Bind(&out); | 184 Bind(&out); |
186 return var_result.value(); | 185 return var_result.value(); |
187 } | 186 } |
188 | 187 |
189 Node* PromiseBuiltinsAssembler::CreatePromiseContext(Node* native_context, | 188 Node* PromiseBuiltinsAssembler::CreatePromiseContext(Node* native_context, |
190 int slots) { | 189 int slots) { |
191 DCHECK_GE(slots, Context::MIN_CONTEXT_SLOTS); | 190 DCHECK_GE(slots, Context::MIN_CONTEXT_SLOTS); |
192 | 191 |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
244 // The {value} is not a compatible receiver for this method. | 243 // The {value} is not a compatible receiver for this method. |
245 Bind(&throw_exception); | 244 Bind(&throw_exception); |
246 { | 245 { |
247 Node* const method = | 246 Node* const method = |
248 method_name == nullptr | 247 method_name == nullptr |
249 ? UndefinedConstant() | 248 ? UndefinedConstant() |
250 : HeapConstant( | 249 : HeapConstant( |
251 isolate()->factory()->NewStringFromAsciiChecked(method_name)); | 250 isolate()->factory()->NewStringFromAsciiChecked(method_name)); |
252 Node* const message_id = SmiConstant(msg_template); | 251 Node* const message_id = SmiConstant(msg_template); |
253 CallRuntime(Runtime::kThrowTypeError, context, message_id, method); | 252 CallRuntime(Runtime::kThrowTypeError, context, message_id, method); |
254 var_value_map.Bind(UndefinedConstant()); | 253 Unreachable(); |
255 Goto(&out); // Never reached. | |
256 } | 254 } |
257 | 255 |
258 Bind(&out); | 256 Bind(&out); |
259 return var_value_map.value(); | 257 return var_value_map.value(); |
260 } | 258 } |
261 | 259 |
262 Node* PromiseBuiltinsAssembler::PromiseHasHandler(Node* promise) { | 260 Node* PromiseBuiltinsAssembler::PromiseHasHandler(Node* promise) { |
263 Node* const flags = LoadObjectField(promise, JSPromise::kFlagsOffset); | 261 Node* const flags = LoadObjectField(promise, JSPromise::kFlagsOffset); |
264 return IsSetWord(SmiUntag(flags), 1 << JSPromise::kHasHandlerBit); | 262 return IsSetWord(SmiUntag(flags), 1 << JSPromise::kHasHandlerBit); |
265 } | 263 } |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
318 &throw_error); | 316 &throw_error); |
319 var_result.Bind(species); | 317 var_result.Bind(species); |
320 Goto(&out); | 318 Goto(&out); |
321 | 319 |
322 // 8. Throw a TypeError exception. | 320 // 8. Throw a TypeError exception. |
323 Bind(&throw_error); | 321 Bind(&throw_error); |
324 { | 322 { |
325 Node* const message_id = | 323 Node* const message_id = |
326 SmiConstant(MessageTemplate::kSpeciesNotConstructor); | 324 SmiConstant(MessageTemplate::kSpeciesNotConstructor); |
327 CallRuntime(Runtime::kThrowTypeError, context, message_id); | 325 CallRuntime(Runtime::kThrowTypeError, context, message_id); |
328 Goto(&out); | 326 Unreachable(); |
329 } | 327 } |
330 | 328 |
331 Bind(&out); | 329 Bind(&out); |
332 return var_result.value(); | 330 return var_result.value(); |
333 } | 331 } |
334 | 332 |
335 void PromiseBuiltinsAssembler::AppendPromiseCallback(int offset, Node* promise, | 333 void PromiseBuiltinsAssembler::AppendPromiseCallback(int offset, Node* promise, |
336 Node* value) { | 334 Node* value) { |
337 Node* elements = LoadObjectField(promise, offset); | 335 Node* elements = LoadObjectField(promise, offset); |
338 Node* length = LoadFixedArrayBaseLength(elements); | 336 Node* length = LoadFixedArrayBaseLength(elements); |
(...skipping 769 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1108 } | 1106 } |
1109 Bind(&out); | 1107 Bind(&out); |
1110 Return(var_result.value()); | 1108 Return(var_result.value()); |
1111 } | 1109 } |
1112 | 1110 |
1113 // 1. If NewTarget is undefined, throw a TypeError exception. | 1111 // 1. If NewTarget is undefined, throw a TypeError exception. |
1114 Bind(&if_targetisundefined); | 1112 Bind(&if_targetisundefined); |
1115 { | 1113 { |
1116 Node* const message_id = SmiConstant(MessageTemplate::kNotAPromise); | 1114 Node* const message_id = SmiConstant(MessageTemplate::kNotAPromise); |
1117 CallRuntime(Runtime::kThrowTypeError, context, message_id, new_target); | 1115 CallRuntime(Runtime::kThrowTypeError, context, message_id, new_target); |
1118 Return(UndefinedConstant()); // Never reached. | 1116 Unreachable(); |
1119 } | 1117 } |
1120 | 1118 |
1121 // 2. If IsCallable(executor) is false, throw a TypeError exception. | 1119 // 2. If IsCallable(executor) is false, throw a TypeError exception. |
1122 Bind(&if_notcallable); | 1120 Bind(&if_notcallable); |
1123 { | 1121 { |
1124 Node* const message_id = | 1122 Node* const message_id = |
1125 SmiConstant(MessageTemplate::kResolverNotAFunction); | 1123 SmiConstant(MessageTemplate::kResolverNotAFunction); |
1126 CallRuntime(Runtime::kThrowTypeError, context, message_id, executor); | 1124 CallRuntime(Runtime::kThrowTypeError, context, message_id, executor); |
1127 Return(UndefinedConstant()); // Never reached. | 1125 Unreachable(); |
1128 } | 1126 } |
1129 | 1127 |
1130 // Silently fail if the stack looks fishy. | 1128 // Silently fail if the stack looks fishy. |
1131 Bind(&if_noaccess); | 1129 Bind(&if_noaccess); |
1132 { | 1130 { |
1133 Node* const counter_id = | 1131 Node* const counter_id = |
1134 SmiConstant(v8::Isolate::kPromiseConstructorReturnedUndefined); | 1132 SmiConstant(v8::Isolate::kPromiseConstructorReturnedUndefined); |
1135 CallRuntime(Runtime::kIncrementUseCounter, context, counter_id); | 1133 CallRuntime(Runtime::kIncrementUseCounter, context, counter_id); |
1136 Return(UndefinedConstant()); | 1134 Return(UndefinedConstant()); |
1137 } | 1135 } |
(...skipping 350 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1488 UndefinedConstant()), | 1486 UndefinedConstant()), |
1489 &if_alreadyinvoked); | 1487 &if_alreadyinvoked); |
1490 | 1488 |
1491 StoreObjectField(capability, JSPromiseCapability::kResolveOffset, resolve); | 1489 StoreObjectField(capability, JSPromiseCapability::kResolveOffset, resolve); |
1492 StoreObjectField(capability, JSPromiseCapability::kRejectOffset, reject); | 1490 StoreObjectField(capability, JSPromiseCapability::kRejectOffset, reject); |
1493 | 1491 |
1494 Return(UndefinedConstant()); | 1492 Return(UndefinedConstant()); |
1495 | 1493 |
1496 Bind(&if_alreadyinvoked); | 1494 Bind(&if_alreadyinvoked); |
1497 Node* message = SmiConstant(MessageTemplate::kPromiseExecutorAlreadyInvoked); | 1495 Node* message = SmiConstant(MessageTemplate::kPromiseExecutorAlreadyInvoked); |
1498 Return(CallRuntime(Runtime::kThrowTypeError, context, message)); | 1496 CallRuntime(Runtime::kThrowTypeError, context, message); |
| 1497 Unreachable(); |
1499 } | 1498 } |
1500 | 1499 |
1501 TF_BUILTIN(NewPromiseCapability, PromiseBuiltinsAssembler) { | 1500 TF_BUILTIN(NewPromiseCapability, PromiseBuiltinsAssembler) { |
1502 Node* constructor = Parameter(1); | 1501 Node* constructor = Parameter(1); |
1503 Node* debug_event = Parameter(2); | 1502 Node* debug_event = Parameter(2); |
1504 Node* context = Parameter(5); | 1503 Node* context = Parameter(5); |
1505 | 1504 |
1506 CSA_ASSERT_JS_ARGC_EQ(this, 2); | 1505 CSA_ASSERT_JS_ARGC_EQ(this, 2); |
1507 | 1506 |
1508 Return(NewPromiseCapability(context, constructor, debug_event)); | 1507 Return(NewPromiseCapability(context, constructor, debug_event)); |
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1645 promise_capability, UndefinedConstant(), | 1644 promise_capability, UndefinedConstant(), |
1646 UndefinedConstant()); | 1645 UndefinedConstant()); |
1647 Return(promise_capability); | 1646 Return(promise_capability); |
1648 } | 1647 } |
1649 | 1648 |
1650 TF_BUILTIN(PromiseThrowerFinally, PromiseBuiltinsAssembler) { | 1649 TF_BUILTIN(PromiseThrowerFinally, PromiseBuiltinsAssembler) { |
1651 Node* const context = Parameter(3); | 1650 Node* const context = Parameter(3); |
1652 | 1651 |
1653 Node* const reason = LoadContextElement(context, kOnFinallySlot); | 1652 Node* const reason = LoadContextElement(context, kOnFinallySlot); |
1654 CallRuntime(Runtime::kThrow, context, reason); | 1653 CallRuntime(Runtime::kThrow, context, reason); |
1655 Return(UndefinedConstant()); | 1654 Unreachable(); |
1656 } | 1655 } |
1657 | 1656 |
1658 Node* PromiseBuiltinsAssembler::CreateThrowerFunctionContext( | 1657 Node* PromiseBuiltinsAssembler::CreateThrowerFunctionContext( |
1659 Node* reason, Node* native_context) { | 1658 Node* reason, Node* native_context) { |
1660 Node* const context = | 1659 Node* const context = |
1661 CreatePromiseContext(native_context, kOnFinallyContextLength); | 1660 CreatePromiseContext(native_context, kOnFinallyContextLength); |
1662 StoreContextElementNoWriteBarrier(context, kOnFinallySlot, reason); | 1661 StoreContextElementNoWriteBarrier(context, kOnFinallySlot, reason); |
1663 return context; | 1662 return context; |
1664 } | 1663 } |
1665 | 1664 |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1773 // 5. Return ? Invoke(promise, "then", « thenFinally, catchFinally »). | 1772 // 5. Return ? Invoke(promise, "then", « thenFinally, catchFinally »). |
1774 Node* const result = | 1773 Node* const result = |
1775 CallJS(call_callable, context, then, promise, var_then_finally.value(), | 1774 CallJS(call_callable, context, then, promise, var_then_finally.value(), |
1776 var_catch_finally.value()); | 1775 var_catch_finally.value()); |
1777 Return(result); | 1776 Return(result); |
1778 } | 1777 } |
1779 } | 1778 } |
1780 | 1779 |
1781 } // namespace internal | 1780 } // namespace internal |
1782 } // namespace v8 | 1781 } // namespace v8 |
OLD | NEW |