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 bff48bcce1a3447d7d1ab9d1fe18df29e985d832..0c089e121131d369d5ba76895eb007483826d94d 100644 |
--- a/test/cctest/interpreter/test-bytecode-generator.cc |
+++ b/test/cctest/interpreter/test-bytecode-generator.cc |
@@ -64,7 +64,7 @@ struct ExpectedSnippet { |
int frame_size; |
int parameter_count; |
int bytecode_length; |
- const uint8_t bytecode[32]; |
+ const uint8_t bytecode[512]; |
int constant_count; |
T constants[16]; |
}; |
@@ -185,149 +185,178 @@ TEST(Parameters) { |
} |
-TEST(Constants) { |
+TEST(IntegerConstants) { |
InitializedHandleScope handle_scope; |
BytecodeGeneratorHelper helper; |
- // Check large SMIs. |
- { |
- ExpectedSnippet<int> snippets[] = { |
- {"return 12345678;", 0, 1, 3, |
- { |
- B(LdaConstant), U8(0), |
- B(Return) |
- }, 1, { 12345678 } |
- }, |
- {"var a = 1234; return 5678;", 1 * kPointerSize, 1, 7, |
- { |
- B(LdaConstant), U8(0), |
- B(Star), R(0), |
- B(LdaConstant), U8(1), |
- B(Return) |
- }, 2, { 1234, 5678 } |
- }, |
- {"var a = 1234; return 1234;", |
- 1 * kPointerSize, 1, 7, |
- { |
- B(LdaConstant), U8(0), |
- B(Star), R(0), |
- B(LdaConstant), U8(0), |
- B(Return) |
- }, 1, { 1234 } |
- } |
- }; |
- |
- size_t num_snippets = sizeof(snippets) / sizeof(snippets[0]); |
- for (size_t i = 0; i < num_snippets; i++) { |
- Handle<BytecodeArray> ba = |
- helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); |
- CHECK_EQ(ba->frame_size(), snippets[i].frame_size); |
- CHECK_EQ(ba->parameter_count(), snippets[i].parameter_count); |
- CHECK_EQ(ba->length(), snippets[i].bytecode_length); |
- CHECK(!memcmp(ba->GetFirstBytecodeAddress(), snippets[i].bytecode, |
- ba->length())); |
- CHECK_EQ(ba->constant_pool()->length(), snippets[i].constant_count); |
- for (int j = 0; j < snippets[i].constant_count; j++) { |
- CHECK_EQ(Smi::cast(ba->constant_pool()->get(j))->value(), |
- snippets[i].constants[j]); |
- } |
+ ExpectedSnippet<int> snippets[] = {{"return 12345678;", |
+ 0, |
+ 1, |
+ 3, |
+ { |
+ B(LdaConstant), U8(0), // |
+ B(Return) // |
+ }, |
+ 1, |
+ {12345678}}, |
+ {"var a = 1234; return 5678;", |
+ 1 * kPointerSize, |
+ 1, |
+ 7, |
+ { |
+ B(LdaConstant), U8(0), // |
+ B(Star), R(0), // |
+ B(LdaConstant), U8(1), // |
+ B(Return) // |
+ }, |
+ 2, |
+ {1234, 5678}}, |
+ {"var a = 1234; return 1234;", |
+ 1 * kPointerSize, |
+ 1, |
+ 7, |
+ { |
+ B(LdaConstant), U8(0), // |
+ B(Star), R(0), // |
+ B(LdaConstant), U8(0), // |
+ B(Return) // |
+ }, |
+ 1, |
+ {1234}}}; |
rmcilroy
2015/09/24 11:44:36
was this reformat intended?
|
+ |
+ size_t num_snippets = sizeof(snippets) / sizeof(snippets[0]); |
+ for (size_t i = 0; i < num_snippets; i++) { |
+ Handle<BytecodeArray> ba = |
+ helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); |
+ CHECK_EQ(ba->frame_size(), snippets[i].frame_size); |
+ CHECK_EQ(ba->parameter_count(), snippets[i].parameter_count); |
+ CHECK_EQ(ba->length(), snippets[i].bytecode_length); |
+ CHECK(!memcmp(ba->GetFirstBytecodeAddress(), snippets[i].bytecode, |
+ ba->length())); |
+ CHECK_EQ(ba->constant_pool()->length(), snippets[i].constant_count); |
+ for (int j = 0; j < snippets[i].constant_count; j++) { |
+ CHECK_EQ(Smi::cast(ba->constant_pool()->get(j))->value(), |
+ snippets[i].constants[j]); |
} |
} |
+} |
+ |
+ |
+TEST(HeapNumberConstants) { |
+ InitializedHandleScope handle_scope; |
+ BytecodeGeneratorHelper helper; |
- // Check heap number double constants |
- { |
- ExpectedSnippet<double> snippets[] = { |
- {"return 1.2;", |
- 0, 1, 3, |
- { |
- B(LdaConstant), U8(0), |
- B(Return) |
- }, 1, { 1.2 } |
- }, |
- {"var a = 1.2; return 2.6;", 1 * kPointerSize, 1, 7, |
- { |
- B(LdaConstant), U8(0), |
- B(Star), R(0), |
- B(LdaConstant), U8(1), |
- B(Return) |
- }, 2, { 1.2, 2.6 } |
- }, |
- {"var a = 3.14; return 3.14;", 1 * kPointerSize, 1, 7, |
- { |
- B(LdaConstant), U8(0), |
- B(Star), R(0), |
- B(LdaConstant), U8(1), |
- B(Return) |
- }, 2, |
- // TODO(rmcilroy): Currently multiple identical double literals end up |
- // being allocated as new HeapNumbers and so require multiple constant |
- // pool entries. De-dup identical values. |
- { 3.14, 3.14 } |
- } |
- }; |
- |
- size_t num_snippets = sizeof(snippets) / sizeof(snippets[0]); |
- for (size_t i = 0; i < num_snippets; i++) { |
- Handle<BytecodeArray> ba = |
- helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); |
- CHECK_EQ(ba->frame_size(), snippets[i].frame_size); |
- CHECK_EQ(ba->parameter_count(), snippets[i].parameter_count); |
- CHECK_EQ(ba->length(), snippets[i].bytecode_length); |
- CHECK(!memcmp(ba->GetFirstBytecodeAddress(), snippets[i].bytecode, |
- ba->length())); |
- CHECK_EQ(ba->constant_pool()->length(), snippets[i].constant_count); |
- for (int j = 0; j < snippets[i].constant_count; j++) { |
- CHECK_EQ(HeapNumber::cast(ba->constant_pool()->get(j))->value(), |
- snippets[i].constants[j]); |
- } |
+ ExpectedSnippet<double> snippets[] = { |
+ {"return 1.2;", |
+ 0, |
+ 1, |
+ 3, |
+ { |
+ B(LdaConstant), U8(0), // |
+ B(Return) // |
+ }, |
+ 1, |
+ {1.2}}, |
+ {"var a = 1.2; return 2.6;", |
+ 1 * kPointerSize, |
+ 1, |
+ 7, |
+ { |
+ B(LdaConstant), U8(0), // |
+ B(Star), R(0), // |
+ B(LdaConstant), U8(1), // |
+ B(Return) // |
+ }, |
+ 2, |
+ {1.2, 2.6}}, |
+ {"var a = 3.14; return 3.14;", |
+ 1 * kPointerSize, |
+ 1, |
+ 7, |
+ { |
+ B(LdaConstant), U8(0), // |
+ B(Star), R(0), // |
+ B(LdaConstant), U8(1), // |
+ B(Return) // |
+ }, |
+ 2, |
+ // TODO(rmcilroy): Currently multiple identical double literals end up |
+ // being allocated as new HeapNumbers and so require multiple constant |
+ // pool entries. De-dup identical values. |
+ {3.14, 3.14}}}; |
+ |
+ size_t num_snippets = sizeof(snippets) / sizeof(snippets[0]); |
+ for (size_t i = 0; i < num_snippets; i++) { |
+ Handle<BytecodeArray> ba = |
+ helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); |
+ CHECK_EQ(ba->frame_size(), snippets[i].frame_size); |
+ CHECK_EQ(ba->parameter_count(), snippets[i].parameter_count); |
+ CHECK_EQ(ba->length(), snippets[i].bytecode_length); |
+ CHECK(!memcmp(ba->GetFirstBytecodeAddress(), snippets[i].bytecode, |
+ ba->length())); |
+ CHECK_EQ(ba->constant_pool()->length(), snippets[i].constant_count); |
+ for (int j = 0; j < snippets[i].constant_count; j++) { |
+ CHECK_EQ(HeapNumber::cast(ba->constant_pool()->get(j))->value(), |
+ snippets[i].constants[j]); |
} |
} |
+} |
+ |
+ |
+TEST(StringConstants) { |
+ InitializedHandleScope handle_scope; |
+ BytecodeGeneratorHelper helper; |
+ |
+ ExpectedSnippet<const char*> snippets[] = { |
+ {"return \"This is a string\";", |
+ 0, |
+ 1, |
+ 3, |
+ { |
+ B(LdaConstant), U8(0), // |
+ B(Return) // |
+ }, |
+ 1, |
+ {"This is a string"}}, |
+ {"var a = \"First string\"; return \"Second string\";", |
+ 1 * kPointerSize, |
+ 1, |
+ 7, |
+ { |
+ B(LdaConstant), U8(0), // |
+ B(Star), R(0), // |
+ B(LdaConstant), U8(1), // |
+ B(Return) // |
+ }, |
+ 2, |
+ {"First string", "Second string"}}, |
+ {"var a = \"Same string\"; return \"Same string\";", |
+ 1 * kPointerSize, |
+ 1, |
+ 7, |
+ { |
+ B(LdaConstant), U8(0), // |
+ B(Star), R(0), // |
+ B(LdaConstant), U8(0), // |
+ B(Return) // |
+ }, |
+ 1, |
+ {"Same string"}}}; |
- // Check string literals |
- { |
- ExpectedSnippet<const char*> snippets[] = { |
- {"return \"This is a string\";", 0, 1, 3, |
- { |
- B(LdaConstant), U8(0), |
- B(Return) |
- }, 1, |
- { "This is a string" } |
- }, |
- {"var a = \"First string\"; return \"Second string\";", |
- 1 * kPointerSize, 1, 7, |
- { |
- B(LdaConstant), U8(0), |
- B(Star), R(0), |
- B(LdaConstant), U8(1), |
- B(Return) |
- }, 2, { "First string", "Second string"} |
- }, |
- {"var a = \"Same string\"; return \"Same string\";", |
- 1 * kPointerSize, 1, 7, |
- { |
- B(LdaConstant), U8(0), |
- B(Star), R(0), |
- B(LdaConstant), U8(0), |
- B(Return) |
- }, 1, { "Same string" } |
- } |
- }; |
- |
- size_t num_snippets = sizeof(snippets) / sizeof(snippets[0]); |
- for (size_t i = 0; i < num_snippets; i++) { |
- Handle<BytecodeArray> ba = |
- helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); |
- CHECK_EQ(ba->frame_size(), snippets[i].frame_size); |
- CHECK_EQ(ba->parameter_count(), snippets[i].parameter_count); |
- CHECK_EQ(ba->length(), snippets[i].bytecode_length); |
- CHECK(!memcmp(ba->GetFirstBytecodeAddress(), snippets[i].bytecode, |
- ba->length())); |
- CHECK_EQ(ba->constant_pool()->length(), snippets[i].constant_count); |
- for (int j = 0; j < snippets[i].constant_count; j++) { |
- Handle<String> expected = helper.factory()->NewStringFromAsciiChecked( |
- snippets[i].constants[j]); |
- CHECK(String::cast(ba->constant_pool()->get(j))->Equals(*expected)); |
- } |
+ size_t num_snippets = sizeof(snippets) / sizeof(snippets[0]); |
+ for (size_t i = 0; i < num_snippets; i++) { |
+ Handle<BytecodeArray> ba = |
+ helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); |
+ CHECK_EQ(ba->frame_size(), snippets[i].frame_size); |
+ CHECK_EQ(ba->parameter_count(), snippets[i].parameter_count); |
+ CHECK_EQ(ba->length(), snippets[i].bytecode_length); |
+ CHECK(!memcmp(ba->GetFirstBytecodeAddress(), snippets[i].bytecode, |
+ ba->length())); |
+ CHECK_EQ(ba->constant_pool()->length(), snippets[i].constant_count); |
+ for (int j = 0; j < snippets[i].constant_count; j++) { |
+ Handle<String> expected = |
+ helper.factory()->NewStringFromAsciiChecked(snippets[i].constants[j]); |
+ CHECK(String::cast(ba->constant_pool()->get(j))->Equals(*expected)); |
} |
} |
} |
@@ -344,65 +373,74 @@ TEST(PropertyLoads) { |
ExpectedSnippet<const char*> snippets[] = { |
{"function f(a) { return a.name; }\nf({name : \"test\"})", |
- 1 * kPointerSize, 2, 10, |
+ 1 * kPointerSize, |
+ 2, |
+ 10, |
{ |
- B(Ldar), R(helper.kLastParamIndex), |
- B(Star), R(0), |
- B(LdaConstant), U8(0), |
- B(LoadIC), R(0), U8(vector->first_ic_slot_index()), |
- B(Return) |
+ B(Ldar), R(helper.kLastParamIndex), // |
+ B(Star), R(0), // |
+ B(LdaConstant), U8(0), // |
+ B(LoadIC), R(0), U8(vector->first_ic_slot_index()), // |
+ B(Return) // |
}, |
- 1, { "name" } |
- }, |
+ 1, |
+ {"name"}}, |
{"function f(a) { return a[\"key\"]; }\nf({key : \"test\"})", |
- 1 * kPointerSize, 2, 10, |
+ 1 * kPointerSize, |
+ 2, |
+ 10, |
{ |
- B(Ldar), R(helper.kLastParamIndex), |
- B(Star), R(0), |
- B(LdaConstant), U8(0), |
- B(LoadIC), R(0), U8(vector->first_ic_slot_index()), |
- B(Return) |
+ B(Ldar), R(helper.kLastParamIndex), // |
+ B(Star), R(0), // |
+ B(LdaConstant), U8(0), // |
+ B(LoadIC), R(0), U8(vector->first_ic_slot_index()), // |
+ B(Return) // |
}, |
- 1, { "key" } |
- }, |
+ 1, |
+ {"key"}}, |
{"function f(a) { return a[100]; }\nf({100 : \"test\"})", |
- 1 * kPointerSize, 2, 10, |
+ 1 * kPointerSize, |
+ 2, |
+ 10, |
{ |
- B(Ldar), R(helper.kLastParamIndex), |
- B(Star), R(0), |
- B(LdaSmi8), U8(100), |
- B(KeyedLoadIC), R(0), U8(vector->first_ic_slot_index()), |
- B(Return) |
- }, 0 |
- }, |
+ B(Ldar), R(helper.kLastParamIndex), // |
+ B(Star), R(0), // |
+ B(LdaSmi8), U8(100), // |
+ B(KeyedLoadIC), R(0), U8(vector->first_ic_slot_index()), // |
+ B(Return) // |
+ }, |
+ 0}, |
{"function f(a, b) { return a[b]; }\nf({arg : \"test\"}, \"arg\")", |
- 1 * kPointerSize, 3, 10, |
+ 1 * kPointerSize, |
+ 3, |
+ 10, |
{ |
- B(Ldar), R(helper.kLastParamIndex - 1), |
- B(Star), R(0), |
- B(Ldar), R(helper.kLastParamIndex), |
- B(KeyedLoadIC), R(0), U8(vector->first_ic_slot_index()), |
- B(Return) |
- }, 0 |
- }, |
+ B(Ldar), R(helper.kLastParamIndex - 1), // |
+ B(Star), R(0), // |
+ B(Ldar), R(helper.kLastParamIndex), // |
+ B(KeyedLoadIC), R(0), U8(vector->first_ic_slot_index()), // |
+ B(Return) // |
+ }, |
+ 0}, |
{"function f(a) { var b = a.name; return a[-124]; }\n" |
"f({\"-124\" : \"test\", name : 123 })", |
- 2 * kPointerSize, 2, 21, |
+ 2 * kPointerSize, |
+ 2, |
+ 21, |
{ |
- B(Ldar), R(helper.kLastParamIndex), |
- B(Star), R(1), |
- B(LdaConstant), U8(0), |
- B(LoadIC), R(1), U8(vector->first_ic_slot_index()), |
- B(Star), R(0), |
- B(Ldar), R(helper.kLastParamIndex), |
- B(Star), R(1), |
- B(LdaSmi8), U8(-124), |
- B(KeyedLoadIC), R(1), U8(vector->first_ic_slot_index() + 2), |
- B(Return) |
+ B(Ldar), R(helper.kLastParamIndex), // |
+ B(Star), R(1), // |
+ B(LdaConstant), U8(0), // |
+ B(LoadIC), R(1), U8(vector->first_ic_slot_index()), // |
+ B(Star), R(0), // |
+ B(Ldar), R(helper.kLastParamIndex), // |
+ B(Star), R(1), // |
+ B(LdaSmi8), U8(-124), // |
+ B(KeyedLoadIC), R(1), U8(vector->first_ic_slot_index() + 2), // |
+ B(Return) // |
}, |
- 1, { "name" } |
- } |
- }; |
+ 1, |
+ {"name"}}}; |
size_t num_snippets = sizeof(snippets) / sizeof(snippets[0]); |
for (size_t i = 0; i < num_snippets; i++) { |
Handle<BytecodeArray> ba = |
@@ -433,80 +471,89 @@ TEST(PropertyStores) { |
ExpectedSnippet<const char*> snippets[] = { |
{"function f(a) { a.name = \"val\"; }\nf({name : \"test\"})", |
- 2 * kPointerSize, 2, 16, |
+ 2 * kPointerSize, |
+ 2, |
+ 16, |
{ |
- B(Ldar), R(helper.kLastParamIndex), |
- B(Star), R(0), |
- B(LdaConstant), U8(0), |
- B(Star), R(1), |
- B(LdaConstant), U8(1), |
- B(StoreIC), R(0), R(1), U8(vector->first_ic_slot_index()), |
- B(LdaUndefined), |
- B(Return) |
+ B(Ldar), R(helper.kLastParamIndex), // |
+ B(Star), R(0), // |
+ B(LdaConstant), U8(0), // |
+ B(Star), R(1), // |
+ B(LdaConstant), U8(1), // |
+ B(StoreIC), R(0), R(1), U8(vector->first_ic_slot_index()), // |
+ B(LdaUndefined), // |
+ B(Return) // |
}, |
- 2, { "name", "val" } |
- }, |
+ 2, |
+ {"name", "val"}}, |
{"function f(a) { a[\"key\"] = \"val\"; }\nf({key : \"test\"})", |
- 2 * kPointerSize, 2, 16, |
+ 2 * kPointerSize, |
+ 2, |
+ 16, |
{ |
- B(Ldar), R(helper.kLastParamIndex), |
- B(Star), R(0), |
- B(LdaConstant), U8(0), |
- B(Star), R(1), |
- B(LdaConstant), U8(1), |
- B(StoreIC), R(0), R(1), U8(vector->first_ic_slot_index()), |
- B(LdaUndefined), |
- B(Return) |
+ B(Ldar), R(helper.kLastParamIndex), // |
+ B(Star), R(0), // |
+ B(LdaConstant), U8(0), // |
+ B(Star), R(1), // |
+ B(LdaConstant), U8(1), // |
+ B(StoreIC), R(0), R(1), U8(vector->first_ic_slot_index()), // |
+ B(LdaUndefined), // |
+ B(Return) // |
}, |
- 2, { "key", "val" } |
- }, |
+ 2, |
+ {"key", "val"}}, |
{"function f(a) { a[100] = \"val\"; }\nf({100 : \"test\"})", |
- 2 * kPointerSize, 2, 16, |
+ 2 * kPointerSize, |
+ 2, |
+ 16, |
{ |
- B(Ldar), R(helper.kLastParamIndex), |
- B(Star), R(0), |
- B(LdaSmi8), U8(100), |
- B(Star), R(1), |
- B(LdaConstant), U8(0), |
- B(KeyedStoreIC), R(0), R(1), U8(vector->first_ic_slot_index()), |
- B(LdaUndefined), |
- B(Return) |
+ B(Ldar), R(helper.kLastParamIndex), // |
+ B(Star), R(0), // |
+ B(LdaSmi8), U8(100), // |
+ B(Star), R(1), // |
+ B(LdaConstant), U8(0), // |
+ B(KeyedStoreIC), R(0), R(1), U8(vector->first_ic_slot_index()), // |
+ B(LdaUndefined), // |
+ B(Return) // |
}, |
- 1, { "val" } |
- }, |
+ 1, |
+ {"val"}}, |
{"function f(a, b) { a[b] = \"val\"; }\nf({arg : \"test\"}, \"arg\")", |
- 2 * kPointerSize, 3, 16, |
+ 2 * kPointerSize, |
+ 3, |
+ 16, |
{ |
- B(Ldar), R(helper.kLastParamIndex - 1), |
- B(Star), R(0), |
- B(Ldar), R(helper.kLastParamIndex), |
- B(Star), R(1), |
- B(LdaConstant), U8(0), |
- B(KeyedStoreIC), R(0), R(1), U8(vector->first_ic_slot_index()), |
- B(LdaUndefined), |
- B(Return) |
+ B(Ldar), R(helper.kLastParamIndex - 1), // |
+ B(Star), R(0), // |
+ B(Ldar), R(helper.kLastParamIndex), // |
+ B(Star), R(1), // |
+ B(LdaConstant), U8(0), // |
+ B(KeyedStoreIC), R(0), R(1), U8(vector->first_ic_slot_index()), // |
+ B(LdaUndefined), // |
+ B(Return) // |
}, |
- 1, { "val" } |
- }, |
+ 1, |
+ {"val"}}, |
{"function f(a) { a.name = a[-124]; }\n" |
"f({\"-124\" : \"test\", name : 123 })", |
- 3 * kPointerSize, 2, 23, |
+ 3 * kPointerSize, |
+ 2, |
+ 23, |
{ |
- B(Ldar), R(helper.kLastParamIndex), |
- B(Star), R(0), |
- B(LdaConstant), U8(0), |
- B(Star), R(1), |
- B(Ldar), R(helper.kLastParamIndex), |
- B(Star), R(2), |
- B(LdaSmi8), U8(-124), |
- B(KeyedLoadIC), R(2), U8(vector->first_ic_slot_index()), |
- B(StoreIC), R(0), R(1), U8(vector->first_ic_slot_index() + 2), |
- B(LdaUndefined), |
- B(Return) |
+ B(Ldar), R(helper.kLastParamIndex), // |
+ B(Star), R(0), // |
+ B(LdaConstant), U8(0), // |
+ B(Star), R(1), // |
+ B(Ldar), R(helper.kLastParamIndex), // |
+ B(Star), R(2), // |
+ B(LdaSmi8), U8(-124), // |
+ B(KeyedLoadIC), R(2), U8(vector->first_ic_slot_index()), // |
+ B(StoreIC), R(0), R(1), U8(vector->first_ic_slot_index() + 2), // |
+ B(LdaUndefined), // |
+ B(Return) // |
}, |
- 1, { "name" } |
- } |
- }; |
+ 1, |
+ {"name"}}}; |
size_t num_snippets = sizeof(snippets) / sizeof(snippets[0]); |
for (size_t i = 0; i < num_snippets; i++) { |
Handle<BytecodeArray> ba = |
@@ -531,7 +578,7 @@ TEST(PropertyStores) { |
TEST(PropertyCall) { |
InitializedHandleScope handle_scope; |
- BytecodeGeneratorHelper helper; |
+ BytecodeGeneratorHelper helper; // |
Code::Kind ic_kinds[] = { i::Code::LOAD_IC, i::Code::LOAD_IC }; |
FeedbackVectorSpec feedback_spec(0, 2, ic_kinds); |
@@ -540,56 +587,61 @@ TEST(PropertyCall) { |
ExpectedSnippet<const char*> snippets[] = { |
{"function f(a) { return a.func(); }\nf(" FUNC_ARG ")", |
- 2 * kPointerSize, 2, 16, |
+ 2 * kPointerSize, |
+ 2, |
+ 16, |
{ |
- B(Ldar), R(helper.kLastParamIndex), |
- B(Star), R(1), |
- B(LdaConstant), U8(0), |
- B(LoadIC), R(1), U8(vector->first_ic_slot_index() + 2), |
- B(Star), R(0), |
- B(Call), R(0), R(1), U8(0), |
- B(Return) |
+ B(Ldar), R(helper.kLastParamIndex), // |
+ B(Star), R(1), // |
+ B(LdaConstant), U8(0), // |
+ B(LoadIC), R(1), U8(vector->first_ic_slot_index() + 2), // |
+ B(Star), R(0), // |
+ B(Call), R(0), R(1), U8(0), // |
+ B(Return) // |
}, |
- 1, { "func" } |
- }, |
+ 1, |
+ {"func"}}, |
{"function f(a, b, c) { return a.func(b, c); }\nf(" FUNC_ARG ", 1, 2)", |
- 4 * kPointerSize, 4, 24, |
+ 4 * kPointerSize, |
+ 4, |
+ 24, |
{ |
- B(Ldar), R(helper.kLastParamIndex - 2), |
- B(Star), R(1), |
- B(LdaConstant), U8(0), |
- B(LoadIC), R(1), U8(vector->first_ic_slot_index() + 2), |
- B(Star), R(0), |
- B(Ldar), R(helper.kLastParamIndex - 1), |
- B(Star), R(2), |
- B(Ldar), R(helper.kLastParamIndex), |
- B(Star), R(3), |
- B(Call), R(0), R(1), U8(2), |
- B(Return) |
+ B(Ldar), R(helper.kLastParamIndex - 2), // |
+ B(Star), R(1), // |
+ B(LdaConstant), U8(0), // |
+ B(LoadIC), R(1), U8(vector->first_ic_slot_index() + 2), // |
+ B(Star), R(0), // |
+ B(Ldar), R(helper.kLastParamIndex - 1), // |
+ B(Star), R(2), // |
+ B(Ldar), R(helper.kLastParamIndex), // |
+ B(Star), R(3), // |
+ B(Call), R(0), R(1), U8(2), // |
+ B(Return) // |
}, |
- 1, { "func" } |
- }, |
- {"function f(a, b) { return a.func(b + b, b); }\nf(" FUNC_ARG ", 1)", |
- 4 * kPointerSize, 3, 30, |
- { |
- B(Ldar), R(helper.kLastParamIndex - 1), |
- B(Star), R(1), |
- B(LdaConstant), U8(0), |
- B(LoadIC), R(1), U8(vector->first_ic_slot_index() + 2), |
- B(Star), R(0), |
- B(Ldar), R(helper.kLastParamIndex), |
- B(Star), R(2), |
- B(Ldar), R(helper.kLastParamIndex), |
- B(Add), R(2), |
- B(Star), R(2), |
- B(Ldar), R(helper.kLastParamIndex), |
- B(Star), R(3), |
- B(Call), R(0), R(1), U8(2), |
- B(Return) |
+ 1, |
+ {"func"}}, |
+ {"function f(a, b) { return a.func(b + b, b); }\nf(" FUNC_ARG ", 1)", |
+ 4 * kPointerSize, |
+ 3, |
+ 30, |
+ { |
+ B(Ldar), R(helper.kLastParamIndex - 1), // |
+ B(Star), R(1), // |
+ B(LdaConstant), U8(0), // |
+ B(LoadIC), R(1), U8(vector->first_ic_slot_index() + 2), // |
+ B(Star), R(0), // |
+ B(Ldar), R(helper.kLastParamIndex), // |
+ B(Star), R(2), // |
+ B(Ldar), R(helper.kLastParamIndex), // |
+ B(Add), R(2), // |
+ B(Star), R(2), // |
+ B(Ldar), R(helper.kLastParamIndex), // |
+ B(Star), R(3), // |
+ B(Call), R(0), R(1), U8(2), // |
+ B(Return) // |
rmcilroy
2015/09/24 11:44:36
Thanks for fixing all these other tests!
|
}, |
- 1, { "func" } |
- } |
- }; |
+ 1, |
+ {"func"}}}; |
size_t num_snippets = sizeof(snippets) / sizeof(snippets[0]); |
for (size_t i = 0; i < num_snippets; i++) { |
Handle<BytecodeArray> ba = |
@@ -608,6 +660,148 @@ TEST(PropertyCall) { |
} |
} |
+ |
+TEST(IfConditions) { |
+ InitializedHandleScope handle_scope; |
+ BytecodeGeneratorHelper helper; |
+ |
+ ExpectedSnippet<void*> snippets[] = { |
+ {"function f() { if (0) { return 1; } else { return -1; } }", |
+ 0, |
+ 1, |
+ 14, |
+ {B(LdaZero), // |
+ B(ToBoolean), // |
+ B(JumpIfFalse), U8(7), // |
+ B(LdaSmi8), U8(1), // |
+ B(Return), // |
+ B(Jump), U8(5), // TODO(oth): Unreachable jump after return |
+ B(LdaSmi8), U8(-1), // |
+ B(Return), // |
+ B(LdaUndefined), // |
+ B(Return)}, // |
+ 0}, |
+ {"function f() { if ('lucky') { return 1; } else { return -1; } }", |
+ 0, |
+ 1, |
+ 15, |
+ {B(LdaConstant), U8(0), // |
+ B(ToBoolean), // |
+ B(JumpIfFalse), U8(7), // |
+ B(LdaSmi8), U8(1), // |
+ B(Return), // |
+ B(Jump), U8(5), // TODO(oth): Unreachable jump after return |
+ B(LdaSmi8), U8(-1), // |
+ B(Return), // |
+ B(LdaUndefined), // |
+ B(Return)}, // |
+ 1}, |
+ {"function f() { if (false) { return 1; } else { return -1; } }", |
+ 0, |
+ 1, |
+ 13, |
+ {B(LdaFalse), // |
+ B(JumpIfFalse), U8(7), // |
+ B(LdaSmi8), U8(1), // |
+ B(Return), // |
+ B(Jump), U8(5), // TODO(oth): Unreachable jump after return |
+ B(LdaSmi8), U8(-1), // |
+ B(Return), // |
+ B(LdaUndefined), // |
+ B(Return)}, // |
+ 0}, |
+ {"function f(a) { if (a <= 0) { return 200; } else { return -200; } }", |
+ kPointerSize, |
+ 2, |
+ 19, |
+ {B(Ldar), R(-5), // |
+ B(Star), R(0), // |
+ B(LdaZero), // |
+ B(TestLessThanEqual), R(0), // |
+ B(JumpIfFalse), U8(7), // |
+ B(LdaConstant), U8(0), // |
+ B(Return), // |
+ B(Jump), U8(5), // TODO(oth): Unreachable jump after return |
+ B(LdaConstant), U8(1), // |
+ B(Return), // |
+ B(LdaUndefined), // |
+ B(Return)}, // |
+ 2}, |
+ {"function f(a, b) { if (a in b) { return 200; } }", |
+ kPointerSize, |
+ 3, |
+ 17, |
+ {B(Ldar), R(-6), // |
+ B(Star), R(0), // |
+ B(Ldar), R(-5), // |
+ B(TestIn), R(0), // |
+ B(JumpIfFalse), U8(7), // |
+ B(LdaConstant), U8(0), // |
+ B(Return), // |
+ B(Jump), U8(2), // TODO(oth): Unreachable jump after return |
+ B(LdaUndefined), // |
+ B(Return)}, // |
+ 1}, |
+ {"function f(a, b) { if (a instanceof b) { return 200; } }", |
+ kPointerSize, |
+ 3, |
+ 17, |
+ {B(Ldar), R(-6), // |
+ B(Star), R(0), // |
+ B(Ldar), R(-5), // |
+ B(TestInstanceOf), R(0), // |
+ B(JumpIfFalse), U8(7), // |
+ B(LdaConstant), U8(0), // |
+ B(Return), // |
+ B(Jump), U8(2), // TODO(oth): Unreachable jump after return |
+ B(LdaUndefined), // |
+ B(Return)}, // |
+ 1}, |
+ {"function f(z) { var a = 0; var b = 0; if (a === 0.01) { " |
+#define X "b = a; a = b; " |
+ X X X X X X X X X X X X X X X X X X X X X X X X |
+#undef X |
+ " return 200; } else { return -200; } }", |
+ 3 * kPointerSize, |
+ 2, |
+ 218, |
+ {B(LdaZero), // |
+ B(Star), R(0), // |
+ B(LdaZero), // |
+ B(Star), R(1), // |
+ B(Ldar), R(0), // |
+ B(Star), R(2), // |
+ B(LdaConstant), U8(0), // |
+ B(TestEqualStrict), R(2), // |
+ B(JumpIfFalseConstant), U8(2), // |
+#define X B(Ldar), R(0), B(Star), R(1), B(Ldar), R(1), B(Star), R(0), |
+ X X X X X X X X X X X X X X X X X X X X X X X X |
+#undef X |
+ B(LdaConstant), |
+ U8(1), // |
+ B(Return), // |
+ B(Jump), U8(5), // TODO(oth): Unreachable jump after return |
+ B(LdaConstant), U8(3), // |
+ B(Return), // |
+ B(LdaUndefined), // |
+ B(Return)}, // |
+ 4}, // |
+ }; |
+ |
+ size_t num_snippets = sizeof(snippets) / sizeof(snippets[0]); |
+ for (size_t i = 0; i < num_snippets; i++) { |
+ Handle<BytecodeArray> ba = |
+ helper.MakeBytecodeForFunction(snippets[i].code_snippet); |
+ CHECK_EQ(ba->frame_size(), snippets[i].frame_size); |
+ CHECK_EQ(ba->parameter_count(), snippets[i].parameter_count); |
+ CHECK_EQ(ba->length(), snippets[i].bytecode_length); |
+ CHECK(!memcmp(ba->GetFirstBytecodeAddress(), snippets[i].bytecode, |
+ ba->length())); |
+ CHECK_EQ(ba->constant_pool()->length(), snippets[i].constant_count); |
+ } |
+} |
+ |
+ |
} // namespace interpreter |
} // namespace internal |
} // namespance v8 |