[ignition] Use an intrinsic for GeneratorClose.
GeneratorClose is pretty simple, we can handle it in the interpreter.
BUG=v8:6351
Review-Url: https://codereview.chromium.org/2891353002
Cr-Commit-Position: refs/heads/master@{#45434}
diff --git a/src/interpreter/interpreter-intrinsics-generator.cc b/src/interpreter/interpreter-intrinsics-generator.cc
index 6f320c0..e8572ba 100644
--- a/src/interpreter/interpreter-intrinsics-generator.cc
+++ b/src/interpreter/interpreter-intrinsics-generator.cc
@@ -434,6 +434,18 @@
return value;
}
+Node* IntrinsicsGenerator::GeneratorClose(Node* args_reg, Node* arg_count,
+ Node* context) {
+ Node* generator = __ LoadRegister(args_reg);
+ Node* const value =
+ __ LoadObjectField(generator, JSGeneratorObject::kResumeModeOffset);
+ __ StoreObjectFieldNoWriteBarrier(
+ generator, JSGeneratorObject::kContinuationOffset,
+ __ SmiConstant(JSGeneratorObject::kGeneratorClosed));
+
+ return value;
+}
+
Node* IntrinsicsGenerator::AsyncGeneratorReject(Node* input, Node* arg_count,
Node* context) {
return IntrinsicAsBuiltinCall(input, context,
diff --git a/src/interpreter/interpreter-intrinsics.h b/src/interpreter/interpreter-intrinsics.h
index 1bc6a83..3a69069 100644
--- a/src/interpreter/interpreter-intrinsics.h
+++ b/src/interpreter/interpreter-intrinsics.h
@@ -22,6 +22,7 @@
V(GeneratorGetContext, generator_get_context, 1) \
V(GeneratorGetResumeMode, generator_get_resume_mode, 1) \
V(GeneratorGetInputOrDebugPos, generator_get_input_or_debug_pos, 1) \
+ V(GeneratorClose, generator_close, 1) \
V(Call, call, -1) \
V(ClassOf, class_of, 1) \
V(CreateIterResultObject, create_iter_result_object, 2) \
diff --git a/test/cctest/interpreter/bytecode_expectations/ForOfLoop.golden b/test/cctest/interpreter/bytecode_expectations/ForOfLoop.golden
index 80696ec..b476d7e 100644
--- a/test/cctest/interpreter/bytecode_expectations/ForOfLoop.golden
+++ b/test/cctest/interpreter/bytecode_expectations/ForOfLoop.golden
@@ -644,7 +644,7 @@
"
frame size: 15
parameter count: 2
-bytecode array length: 590
+bytecode array length: 589
bytecodes: [
B(Ldar), R(new_target),
B(JumpIfUndefined), U8(25),
@@ -877,7 +877,7 @@
B(Star), R(8),
B(LdaImmutableCurrentContextSlot), U8(5),
B(Star), R(9),
- B(CallRuntime), U16(Runtime::k_GeneratorClose), R(9), U8(1),
+ B(InvokeIntrinsic), U8(Runtime::k_GeneratorClose), R(9), U8(1),
B(Ldar), R(8),
B(SetPendingMessage),
B(Ldar), R(6),
@@ -924,7 +924,7 @@
"
frame size: 17
parameter count: 2
-bytecode array length: 696
+bytecode array length: 695
bytecodes: [
B(Ldar), R(new_target),
B(JumpIfUndefined), U8(25),
@@ -1203,7 +1203,7 @@
B(Star), R(7),
B(LdaImmutableCurrentContextSlot), U8(5),
B(Star), R(8),
- B(CallRuntime), U16(Runtime::k_GeneratorClose), R(8), U8(1),
+ B(InvokeIntrinsic), U8(Runtime::k_GeneratorClose), R(8), U8(1),
B(Ldar), R(7),
B(SetPendingMessage),
B(Ldar), R(5),
diff --git a/test/cctest/interpreter/bytecode_expectations/Generators.golden b/test/cctest/interpreter/bytecode_expectations/Generators.golden
index 4c2e2e6..04d40b6 100644
--- a/test/cctest/interpreter/bytecode_expectations/Generators.golden
+++ b/test/cctest/interpreter/bytecode_expectations/Generators.golden
@@ -13,7 +13,7 @@
"
frame size: 11
parameter count: 1
-bytecode array length: 174
+bytecode array length: 173
bytecodes: [
B(Ldar), R(new_target),
B(JumpIfUndefined), U8(25),
@@ -85,7 +85,7 @@
B(Star), R(5),
B(LdaImmutableCurrentContextSlot), U8(4),
B(Star), R(6),
- B(CallRuntime), U16(Runtime::k_GeneratorClose), R(6), U8(1),
+ B(InvokeIntrinsic), U8(Runtime::k_GeneratorClose), R(6), U8(1),
B(Ldar), R(5),
B(SetPendingMessage),
B(Ldar), R(3),
@@ -114,7 +114,7 @@
"
frame size: 11
parameter count: 1
-bytecode array length: 246
+bytecode array length: 245
bytecodes: [
B(Ldar), R(new_target),
B(JumpIfUndefined), U8(25),
@@ -220,7 +220,7 @@
B(Star), R(5),
B(LdaImmutableCurrentContextSlot), U8(4),
B(Star), R(6),
- B(CallRuntime), U16(Runtime::k_GeneratorClose), R(6), U8(1),
+ B(InvokeIntrinsic), U8(Runtime::k_GeneratorClose), R(6), U8(1),
B(Ldar), R(5),
B(SetPendingMessage),
B(Ldar), R(3),
@@ -250,7 +250,7 @@
"
frame size: 17
parameter count: 1
-bytecode array length: 692
+bytecode array length: 691
bytecodes: [
B(Ldar), R(new_target),
B(JumpIfUndefined), U8(25),
@@ -527,7 +527,7 @@
B(Star), R(7),
B(LdaImmutableCurrentContextSlot), U8(4),
B(Star), R(8),
- B(CallRuntime), U16(Runtime::k_GeneratorClose), R(8), U8(1),
+ B(InvokeIntrinsic), U8(Runtime::k_GeneratorClose), R(8), U8(1),
B(Ldar), R(7),
B(SetPendingMessage),
B(Ldar), R(5),
diff --git a/test/cctest/interpreter/bytecode_expectations/StandardForLoop.golden b/test/cctest/interpreter/bytecode_expectations/StandardForLoop.golden
index 482b0c5..8eec066 100644
--- a/test/cctest/interpreter/bytecode_expectations/StandardForLoop.golden
+++ b/test/cctest/interpreter/bytecode_expectations/StandardForLoop.golden
@@ -273,7 +273,7 @@
"
frame size: 14
parameter count: 1
-bytecode array length: 332
+bytecode array length: 331
bytecodes: [
B(Ldar), R(new_target),
B(JumpIfUndefined), U8(25),
@@ -414,7 +414,7 @@
B(Star), R(8),
B(LdaImmutableCurrentContextSlot), U8(4),
B(Star), R(9),
- B(CallRuntime), U16(Runtime::k_GeneratorClose), R(9), U8(1),
+ B(InvokeIntrinsic), U8(Runtime::k_GeneratorClose), R(9), U8(1),
B(Ldar), R(8),
B(SetPendingMessage),
B(Ldar), R(6),
@@ -448,7 +448,7 @@
"
frame size: 13
parameter count: 1
-bytecode array length: 439
+bytecode array length: 438
bytecodes: [
B(Ldar), R(new_target),
B(JumpIfUndefined), U8(25),
@@ -635,7 +635,7 @@
B(Star), R(7),
B(LdaImmutableCurrentContextSlot), U8(4),
B(Star), R(8),
- B(CallRuntime), U16(Runtime::k_GeneratorClose), R(8), U8(1),
+ B(InvokeIntrinsic), U8(Runtime::k_GeneratorClose), R(8), U8(1),
B(Ldar), R(7),
B(SetPendingMessage),
B(Ldar), R(5),