Index: test/cctest/interpreter/test-bytecode-generator.cc |
diff --git a/test/cctest/interpreter/test-bytecode-generator.cc b/test/cctest/interpreter/test-bytecode-generator.cc |
index f2763558afa054f2fd384d24e6a8a4a8c1e1b8c9..f9664df628bcb587e7715fe9fffc5376778cd6f2 100644 |
--- a/test/cctest/interpreter/test-bytecode-generator.cc |
+++ b/test/cctest/interpreter/test-bytecode-generator.cc |
@@ -109,8 +109,12 @@ class BytecodeGeneratorHelper { |
#error Unknown byte ordering |
#endif |
+#define XSTR(A) #A |
+#define STR(A) XSTR(A) |
+ |
#define COMMA() , |
#define SPACE() |
+#define UNIQUE_VAR() "var a" STR(__COUNTER__) " = 0;\n" |
#define REPEAT_2(SEP, ...) \ |
__VA_ARGS__ SEP() __VA_ARGS__ |
@@ -135,6 +139,16 @@ class BytecodeGeneratorHelper { |
REPEAT_4(SEP, __VA_ARGS__) SEP() REPEAT_2(SEP, __VA_ARGS__) SEP() \ |
__VA_ARGS__ |
+#define REPEAT_249(SEP, ...) \ |
+ REPEAT_127(SEP, __VA_ARGS__) SEP() REPEAT_64(SEP, __VA_ARGS__) SEP() \ |
+ REPEAT_32(SEP, __VA_ARGS__) SEP() REPEAT_16(SEP, __VA_ARGS__) SEP() \ |
+ REPEAT_8(SEP, __VA_ARGS__) SEP() REPEAT_2(SEP, __VA_ARGS__) |
+ |
+#define REPEAT_249_UNIQUE_VARS() \ |
+UNIQUE_VAR() REPEAT_127(UNIQUE_VAR) UNIQUE_VAR() REPEAT_64(UNIQUE_VAR) \ |
+UNIQUE_VAR() REPEAT_32(UNIQUE_VAR) UNIQUE_VAR() REPEAT_16(UNIQUE_VAR) \ |
+UNIQUE_VAR() REPEAT_8(UNIQUE_VAR) UNIQUE_VAR() REPEAT_2(UNIQUE_VAR) |
+ |
// Structure for containing expected bytecode snippets. |
template<typename T, int C = 6> |
struct ExpectedSnippet { |
@@ -4016,7 +4030,15 @@ TEST(ContextVariables) { |
i::NewTypeFeedbackVector(helper.isolate(), &feedback_spec); |
int closure = Register::function_closure().index(); |
+ int new_target = Register::new_target().index(); |
int first_context_slot = Context::MIN_CONTEXT_SLOTS; |
+ |
+ // The wide check below relies on MIN_CONTEXT_SLOTS + 3 + 249 == 256, if this |
+ // ever changes, the REPEAT_XXX should be changed to output the correct number |
+ // of unique variables to trigger the wide slot load / store. |
+ STATIC_ASSERT(Context::MIN_CONTEXT_SLOTS + 3 + 249 == 256); |
+ int wide_slot = first_context_slot + 3; |
+ |
ExpectedSnippet<InstanceType> snippets[] = { |
{"var a; return function() { a = 1; };", |
1 * kPointerSize, |
@@ -4109,6 +4131,39 @@ TEST(ContextVariables) { |
2, |
{InstanceType::FIXED_ARRAY_TYPE, |
InstanceType::SHARED_FUNCTION_INFO_TYPE}}, |
+ {"'use strict';\n" |
+ REPEAT_249_UNIQUE_VARS() |
+ "eval();" |
+ "var b = 100;" |
+ "return b", |
+ 3 * kPointerSize, |
+ 1, |
+ 1041, |
+ { |
+ B(CallRuntime), U16(Runtime::kNewFunctionContext), R(closure), // |
+ U8(1), // |
+ B(PushContext), R(0), // |
+ B(Ldar), THIS(1), // |
+ B(StaContextSlot), R(0), U8(first_context_slot), // |
+ B(CreateUnmappedArguments), // |
+ B(StaContextSlot), R(0), U8(first_context_slot + 1), // |
+ B(Ldar), R(new_target), // |
+ B(StaContextSlot), R(0), U8(first_context_slot + 2), // |
+ REPEAT_249(COMMA, // |
+ B(LdaZero), // |
+ B(StaContextSlot), R(0), U8(wide_slot++)), // |
+ B(LdaUndefined), // |
+ B(Star), R(2), // |
+ B(LdaGlobalStrict), U8(0), U8(1), // |
+ B(Star), R(1), // |
+ B(Call), R(1), R(2), U8(0), U8(0), // |
+ B(LdaSmi8), U8(100), // |
+ B(StaContextSlotWide), R(0), U16(256), // |
+ B(LdaContextSlotWide), R(0), U16(256), // |
+ B(Return), // |
+ }, |
+ 1, |
+ {InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE}}, |
}; |
for (size_t i = 0; i < arraysize(snippets); i++) { |