Index: src/builtins/builtins-definitions.h |
diff --git a/src/builtins/builtins-definitions.h b/src/builtins/builtins-definitions.h |
index 18d1ac11cb8c5df6540e00101d4eb1bb3510c3ac..f4cb7eb77b8f08b38ee13b749cae755cc01bf882 100644 |
--- a/src/builtins/builtins-definitions.h |
+++ b/src/builtins/builtins-definitions.h |
@@ -162,6 +162,30 @@ namespace internal { |
ASM(NotifyLazyDeoptimized) \ |
ASM(NotifyStubFailure) \ |
ASM(NotifyStubFailureSaveDoubles) \ |
+ ASM(NotifyBuiltinContinuation) \ |
+ \ |
+ /* Trampolines called when returning from a deoptimization that expects */ \ |
+ /* to continue in a JavaScript builtin to finish the functionality of a */ \ |
+ /* an TF-inlined version of builtin that has side-effects. */ \ |
+ /* Each restores input register values that the builtin expects from a */ \ |
+ /* BuiltinContinuationFrame, tear down that frame, and then jump to the */ \ |
+ /* stashed-away builtin's address. After the trampoline completes, */ \ |
+ /* it appears to the called JavaScript builtin that it had been directly */ \ |
+ /* invoked by the frame above it. When the builtin returns, execution */ \ |
+ /* resumes normally in the calling frame, processing any return result */ \ |
+ /* from the JavaScript builtin, again as if it had called the builtin */ \ |
+ /* directly. */ \ |
+ /* There are two variants of the stub that differ in their handling of a */ \ |
+ /* value returned by the next frame deeper on the stack. For LAZY deopts, */ \ |
+ /* the return value (e.g. rax on x64) is explicitly passed as an extra */ \ |
+ /* stack parameter to the JavaScript builtin by the "WithResult" */ \ |
+ /* trampoline variant. The plain variant is used in EAGER deopt contexts */ \ |
+ /* and has no such special handling. */ \ |
+ ASM(ContinueToCodeStubBuiltin) \ |
+ ASM(ContinueToCodeStubBuiltinWithResult) \ |
+ ASM(ContinueToJavaScriptBuiltin) \ |
+ ASM(ContinueToJavaScriptBuiltinWithResult) \ |
+ \ |
ASM(OnStackReplacement) \ |
\ |
/* API callback handling */ \ |
@@ -203,6 +227,9 @@ namespace internal { |
TFC(Typeof, Typeof, 1) \ |
TFC(GetSuperConstructor, Typeof, 1) \ |
\ |
+ /* Type conversions continuations */ \ |
+ TFC(ToBooleanLazyDeoptContinuation, TypeConversionStackParameter, 1) \ |
+ \ |
/* Handlers */ \ |
TFH(LoadICProtoArray, BUILTIN, kNoExtraICState, LoadICProtoArray) \ |
TFH(LoadICProtoArrayThrowIfNonexistent, BUILTIN, kNoExtraICState, \ |
@@ -271,6 +298,10 @@ namespace internal { |
/* ES6 #sec-array.prototype.foreach */ \ |
TFS(ArrayForEachLoopContinuation, kReceiver, kCallbackFn, kThisArg, kArray, \ |
kObject, kInitialK, kLength, kTo) \ |
+ TFJ(ArrayForEachLoopEagerDeoptContinuation, 4, kCallbackFn, kThisArg, \ |
+ kInitialK, kLength) \ |
+ TFJ(ArrayForEachLoopLazyDeoptContinuation, 5, kCallbackFn, kThisArg, \ |
+ kInitialK, kLength, kResult) \ |
TFJ(ArrayForEach, SharedFunctionInfo::kDontAdaptArgumentsSentinel) \ |
/* ES6 #sec-array.prototype.every */ \ |
TFS(ArrayEveryLoopContinuation, kReceiver, kCallbackFn, kThisArg, kArray, \ |
@@ -1056,6 +1087,14 @@ namespace internal { |
BUILTIN_LIST(IGNORE_BUILTIN, IGNORE_BUILTIN, IGNORE_BUILTIN, IGNORE_BUILTIN, \ |
V, IGNORE_BUILTIN, IGNORE_BUILTIN, IGNORE_BUILTIN) |
+#define BUILTIN_LIST_TFJ(V) \ |
+ BUILTIN_LIST(IGNORE_BUILTIN, IGNORE_BUILTIN, V, IGNORE_BUILTIN, \ |
+ IGNORE_BUILTIN, IGNORE_BUILTIN, IGNORE_BUILTIN, IGNORE_BUILTIN) |
+ |
+#define BUILTIN_LIST_TFC(V) \ |
+ BUILTIN_LIST(IGNORE_BUILTIN, IGNORE_BUILTIN, IGNORE_BUILTIN, V, \ |
+ IGNORE_BUILTIN, IGNORE_BUILTIN, IGNORE_BUILTIN, IGNORE_BUILTIN) |
+ |
#define BUILTINS_WITH_UNTAGGED_PARAMS(V) V(WasmCompileLazy) |
} // namespace internal |