| 
									
										
										
										
											2023-01-06 08:04:20 -08:00
										 |  |  | # Sorry for using pytest, these tests are mostly just for me. | 
					
						
							|  |  |  | # Use pytest -vv for best results. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import tempfile | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import generate_cases | 
					
						
							| 
									
										
										
										
											2023-01-17 15:59:19 -08:00
										 |  |  | from parser import StackEffect | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_effect_sizes(): | 
					
						
							|  |  |  |     input_effects = [ | 
					
						
							| 
									
										
										
										
											2023-01-29 17:28:39 -08:00
										 |  |  |         x := StackEffect("x", "", "", ""), | 
					
						
							|  |  |  |         y := StackEffect("y", "", "", "oparg"), | 
					
						
							|  |  |  |         z := StackEffect("z", "", "", "oparg*2"), | 
					
						
							| 
									
										
										
										
											2023-01-17 15:59:19 -08:00
										 |  |  |     ] | 
					
						
							|  |  |  |     output_effects = [ | 
					
						
							| 
									
										
										
										
											2023-01-29 17:28:39 -08:00
										 |  |  |         StackEffect("a", "", "", ""), | 
					
						
							|  |  |  |         StackEffect("b", "", "", "oparg*4"), | 
					
						
							|  |  |  |         StackEffect("c", "", "", ""), | 
					
						
							| 
									
										
										
										
											2023-01-17 15:59:19 -08:00
										 |  |  |     ] | 
					
						
							|  |  |  |     other_effects = [ | 
					
						
							| 
									
										
										
										
											2023-01-29 17:28:39 -08:00
										 |  |  |         StackEffect("p", "", "", "oparg<<1"), | 
					
						
							|  |  |  |         StackEffect("q", "", "", ""), | 
					
						
							|  |  |  |         StackEffect("r", "", "", ""), | 
					
						
							| 
									
										
										
										
											2023-01-17 15:59:19 -08:00
										 |  |  |     ] | 
					
						
							|  |  |  |     assert generate_cases.effect_size(x) == (1, "") | 
					
						
							|  |  |  |     assert generate_cases.effect_size(y) == (0, "oparg") | 
					
						
							|  |  |  |     assert generate_cases.effect_size(z) == (0, "oparg*2") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     assert generate_cases.list_effect_size(input_effects) == (1, "oparg + oparg*2") | 
					
						
							|  |  |  |     assert generate_cases.list_effect_size(output_effects) == (2, "oparg*4") | 
					
						
							|  |  |  |     assert generate_cases.list_effect_size(other_effects) == (2, "(oparg<<1)") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     assert generate_cases.string_effect_size(generate_cases.list_effect_size(input_effects)) == "1 + oparg + oparg*2" | 
					
						
							|  |  |  |     assert generate_cases.string_effect_size(generate_cases.list_effect_size(output_effects)) == "2 + oparg*4" | 
					
						
							|  |  |  |     assert generate_cases.string_effect_size(generate_cases.list_effect_size(other_effects)) == "2 + (oparg<<1)" | 
					
						
							| 
									
										
										
										
											2023-01-06 08:04:20 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def run_cases_test(input: str, expected: str): | 
					
						
							|  |  |  |     temp_input = tempfile.NamedTemporaryFile("w+") | 
					
						
							|  |  |  |     temp_input.write(generate_cases.BEGIN_MARKER) | 
					
						
							|  |  |  |     temp_input.write(input) | 
					
						
							|  |  |  |     temp_input.write(generate_cases.END_MARKER) | 
					
						
							|  |  |  |     temp_input.flush() | 
					
						
							|  |  |  |     temp_output = tempfile.NamedTemporaryFile("w+") | 
					
						
							| 
									
										
										
										
											2023-06-12 14:55:15 -07:00
										 |  |  |     temp_metadata = tempfile.NamedTemporaryFile("w+") | 
					
						
							|  |  |  |     a = generate_cases.Analyzer([temp_input.name], temp_output.name, temp_metadata.name) | 
					
						
							| 
									
										
										
										
											2023-01-06 08:04:20 -08:00
										 |  |  |     a.parse() | 
					
						
							|  |  |  |     a.analyze() | 
					
						
							|  |  |  |     if a.errors: | 
					
						
							|  |  |  |         raise RuntimeError(f"Found {a.errors} errors") | 
					
						
							|  |  |  |     a.write_instructions() | 
					
						
							|  |  |  |     temp_output.seek(0) | 
					
						
							|  |  |  |     lines = temp_output.readlines() | 
					
						
							|  |  |  |     while lines and lines[0].startswith("// "): | 
					
						
							|  |  |  |         lines.pop(0) | 
					
						
							|  |  |  |     actual = "".join(lines) | 
					
						
							| 
									
										
										
										
											2023-01-29 17:28:39 -08:00
										 |  |  |     # if actual.rstrip() != expected.rstrip(): | 
					
						
							|  |  |  |     #     print("Actual:") | 
					
						
							|  |  |  |     #     print(actual) | 
					
						
							|  |  |  |     #     print("Expected:") | 
					
						
							|  |  |  |     #     print(expected) | 
					
						
							|  |  |  |     #     print("End") | 
					
						
							| 
									
										
										
										
											2023-01-06 08:04:20 -08:00
										 |  |  |     assert actual.rstrip() == expected.rstrip() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_inst_no_args(): | 
					
						
							|  |  |  |     input = """
 | 
					
						
							|  |  |  |         inst(OP, (--)) { | 
					
						
							|  |  |  |             spam(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     output = """
 | 
					
						
							|  |  |  |         TARGET(OP) { | 
					
						
							|  |  |  |             spam(); | 
					
						
							|  |  |  |             DISPATCH(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     run_cases_test(input, output) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_inst_one_pop(): | 
					
						
							|  |  |  |     input = """
 | 
					
						
							|  |  |  |         inst(OP, (value --)) { | 
					
						
							|  |  |  |             spam(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     output = """
 | 
					
						
							|  |  |  |         TARGET(OP) { | 
					
						
							| 
									
										
										
										
											2023-06-12 14:55:15 -07:00
										 |  |  |             PyObject *value = stack_pointer[-1]; | 
					
						
							| 
									
										
										
										
											2023-01-06 08:04:20 -08:00
										 |  |  |             spam(); | 
					
						
							|  |  |  |             STACK_SHRINK(1); | 
					
						
							|  |  |  |             DISPATCH(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     run_cases_test(input, output) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_inst_one_push(): | 
					
						
							|  |  |  |     input = """
 | 
					
						
							|  |  |  |         inst(OP, (-- res)) { | 
					
						
							|  |  |  |             spam(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     output = """
 | 
					
						
							|  |  |  |         TARGET(OP) { | 
					
						
							|  |  |  |             PyObject *res; | 
					
						
							|  |  |  |             spam(); | 
					
						
							|  |  |  |             STACK_GROW(1); | 
					
						
							| 
									
										
										
										
											2023-06-12 14:55:15 -07:00
										 |  |  |             stack_pointer[-1] = res; | 
					
						
							| 
									
										
										
										
											2023-01-06 08:04:20 -08:00
										 |  |  |             DISPATCH(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     run_cases_test(input, output) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_inst_one_push_one_pop(): | 
					
						
							|  |  |  |     input = """
 | 
					
						
							|  |  |  |         inst(OP, (value -- res)) { | 
					
						
							|  |  |  |             spam(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     output = """
 | 
					
						
							|  |  |  |         TARGET(OP) { | 
					
						
							| 
									
										
										
										
											2023-06-12 14:55:15 -07:00
										 |  |  |             PyObject *value = stack_pointer[-1]; | 
					
						
							| 
									
										
										
										
											2023-01-06 08:04:20 -08:00
										 |  |  |             PyObject *res; | 
					
						
							|  |  |  |             spam(); | 
					
						
							| 
									
										
										
										
											2023-06-12 14:55:15 -07:00
										 |  |  |             stack_pointer[-1] = res; | 
					
						
							| 
									
										
										
										
											2023-01-06 08:04:20 -08:00
										 |  |  |             DISPATCH(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     run_cases_test(input, output) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_binary_op(): | 
					
						
							|  |  |  |     input = """
 | 
					
						
							|  |  |  |         inst(OP, (left, right -- res)) { | 
					
						
							|  |  |  |             spam(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     output = """
 | 
					
						
							|  |  |  |         TARGET(OP) { | 
					
						
							| 
									
										
										
										
											2023-06-12 14:55:15 -07:00
										 |  |  |             PyObject *right = stack_pointer[-1]; | 
					
						
							|  |  |  |             PyObject *left = stack_pointer[-2]; | 
					
						
							| 
									
										
										
										
											2023-01-06 08:04:20 -08:00
										 |  |  |             PyObject *res; | 
					
						
							|  |  |  |             spam(); | 
					
						
							|  |  |  |             STACK_SHRINK(1); | 
					
						
							| 
									
										
										
										
											2023-06-12 14:55:15 -07:00
										 |  |  |             stack_pointer[-1] = res; | 
					
						
							| 
									
										
										
										
											2023-01-06 08:04:20 -08:00
										 |  |  |             DISPATCH(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     run_cases_test(input, output) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-17 15:59:19 -08:00
										 |  |  | def test_overlap(): | 
					
						
							|  |  |  |     input = """
 | 
					
						
							|  |  |  |         inst(OP, (left, right -- left, result)) { | 
					
						
							|  |  |  |             spam(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     output = """
 | 
					
						
							|  |  |  |         TARGET(OP) { | 
					
						
							| 
									
										
										
										
											2023-06-12 14:55:15 -07:00
										 |  |  |             PyObject *right = stack_pointer[-1]; | 
					
						
							|  |  |  |             PyObject *left = stack_pointer[-2]; | 
					
						
							| 
									
										
										
										
											2023-01-17 15:59:19 -08:00
										 |  |  |             PyObject *result; | 
					
						
							|  |  |  |             spam(); | 
					
						
							| 
									
										
										
										
											2023-06-12 14:55:15 -07:00
										 |  |  |             stack_pointer[-1] = result; | 
					
						
							| 
									
										
										
										
											2023-01-17 15:59:19 -08:00
										 |  |  |             DISPATCH(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     run_cases_test(input, output) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-07 20:03:22 -08:00
										 |  |  | def test_predictions_and_eval_breaker(): | 
					
						
							| 
									
										
										
										
											2023-01-06 08:04:20 -08:00
										 |  |  |     input = """
 | 
					
						
							|  |  |  |         inst(OP1, (--)) { | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2023-02-07 20:03:22 -08:00
										 |  |  |         inst(OP3, (arg -- res)) { | 
					
						
							| 
									
										
										
										
											2023-01-06 08:04:20 -08:00
										 |  |  |             DEOPT_IF(xxx, OP1); | 
					
						
							| 
									
										
										
										
											2023-02-07 20:03:22 -08:00
										 |  |  |             CHECK_EVAL_BREAKER(); | 
					
						
							| 
									
										
										
										
											2023-01-06 08:04:20 -08:00
										 |  |  |         } | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     output = """
 | 
					
						
							|  |  |  |         TARGET(OP1) { | 
					
						
							|  |  |  |             PREDICTED(OP1); | 
					
						
							|  |  |  |             DISPATCH(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         TARGET(OP3) { | 
					
						
							| 
									
										
										
										
											2023-06-12 14:55:15 -07:00
										 |  |  |             PyObject *arg = stack_pointer[-1]; | 
					
						
							| 
									
										
										
										
											2023-02-07 20:03:22 -08:00
										 |  |  |             PyObject *res; | 
					
						
							| 
									
										
										
										
											2023-01-06 08:04:20 -08:00
										 |  |  |             DEOPT_IF(xxx, OP1); | 
					
						
							| 
									
										
										
										
											2023-06-12 14:55:15 -07:00
										 |  |  |             stack_pointer[-1] = res; | 
					
						
							| 
									
										
										
										
											2023-02-07 20:03:22 -08:00
										 |  |  |             CHECK_EVAL_BREAKER(); | 
					
						
							| 
									
										
										
										
											2023-01-06 08:04:20 -08:00
										 |  |  |             DISPATCH(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     run_cases_test(input, output) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_error_if_plain(): | 
					
						
							|  |  |  |     input = """
 | 
					
						
							|  |  |  |         inst(OP, (--)) { | 
					
						
							|  |  |  |             ERROR_IF(cond, label); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     output = """
 | 
					
						
							|  |  |  |         TARGET(OP) { | 
					
						
							|  |  |  |             if (cond) goto label; | 
					
						
							|  |  |  |             DISPATCH(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     run_cases_test(input, output) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-24 22:39:13 +00:00
										 |  |  | def test_error_if_plain_with_comment(): | 
					
						
							|  |  |  |     input = """
 | 
					
						
							|  |  |  |         inst(OP, (--)) { | 
					
						
							|  |  |  |             ERROR_IF(cond, label);  // Comment is ok | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     output = """
 | 
					
						
							|  |  |  |         TARGET(OP) { | 
					
						
							|  |  |  |             if (cond) goto label; | 
					
						
							|  |  |  |             DISPATCH(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     run_cases_test(input, output) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-06 08:04:20 -08:00
										 |  |  | def test_error_if_pop(): | 
					
						
							|  |  |  |     input = """
 | 
					
						
							|  |  |  |         inst(OP, (left, right -- res)) { | 
					
						
							|  |  |  |             ERROR_IF(cond, label); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     output = """
 | 
					
						
							|  |  |  |         TARGET(OP) { | 
					
						
							| 
									
										
										
										
											2023-06-12 14:55:15 -07:00
										 |  |  |             PyObject *right = stack_pointer[-1]; | 
					
						
							|  |  |  |             PyObject *left = stack_pointer[-2]; | 
					
						
							| 
									
										
										
										
											2023-01-06 08:04:20 -08:00
										 |  |  |             PyObject *res; | 
					
						
							|  |  |  |             if (cond) goto pop_2_label; | 
					
						
							|  |  |  |             STACK_SHRINK(1); | 
					
						
							| 
									
										
										
										
											2023-06-12 14:55:15 -07:00
										 |  |  |             stack_pointer[-1] = res; | 
					
						
							| 
									
										
										
										
											2023-01-06 08:04:20 -08:00
										 |  |  |             DISPATCH(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     run_cases_test(input, output) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_cache_effect(): | 
					
						
							|  |  |  |     input = """
 | 
					
						
							|  |  |  |         inst(OP, (counter/1, extra/2, value --)) { | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     output = """
 | 
					
						
							|  |  |  |         TARGET(OP) { | 
					
						
							| 
									
										
										
										
											2023-06-12 14:55:15 -07:00
										 |  |  |             PyObject *value = stack_pointer[-1]; | 
					
						
							| 
									
										
										
										
											2023-01-06 08:04:20 -08:00
										 |  |  |             uint16_t counter = read_u16(&next_instr[0].cache); | 
					
						
							|  |  |  |             uint32_t extra = read_u32(&next_instr[1].cache); | 
					
						
							|  |  |  |             STACK_SHRINK(1); | 
					
						
							| 
									
										
										
										
											2023-06-12 14:55:15 -07:00
										 |  |  |             next_instr += 3; | 
					
						
							| 
									
										
										
										
											2023-01-06 08:04:20 -08:00
										 |  |  |             DISPATCH(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     run_cases_test(input, output) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_suppress_dispatch(): | 
					
						
							|  |  |  |     input = """
 | 
					
						
							|  |  |  |         inst(OP, (--)) { | 
					
						
							|  |  |  |             goto somewhere; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     output = """
 | 
					
						
							|  |  |  |         TARGET(OP) { | 
					
						
							|  |  |  |             goto somewhere; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     run_cases_test(input, output) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_macro_instruction(): | 
					
						
							|  |  |  |     input = """
 | 
					
						
							| 
									
										
										
										
											2023-01-30 11:23:57 -08:00
										 |  |  |         inst(OP1, (counter/1, left, right -- left, right)) { | 
					
						
							|  |  |  |             op1(left, right); | 
					
						
							| 
									
										
										
										
											2023-01-06 08:04:20 -08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2023-01-30 11:23:57 -08:00
										 |  |  |         op(OP2, (extra/2, arg2, left, right -- res)) { | 
					
						
							|  |  |  |             res = op2(arg2, left, right); | 
					
						
							| 
									
										
										
										
											2023-01-06 08:04:20 -08:00
										 |  |  |         } | 
					
						
							|  |  |  |         macro(OP) = OP1 + cache/2 + OP2; | 
					
						
							| 
									
										
										
										
											2023-01-30 11:23:57 -08:00
										 |  |  |         inst(OP3, (unused/5, arg2, left, right -- res)) { | 
					
						
							|  |  |  |             res = op3(arg2, left, right); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         family(op, INLINE_CACHE_ENTRIES_OP) = { OP, OP3 }; | 
					
						
							| 
									
										
										
										
											2023-01-06 08:04:20 -08:00
										 |  |  |     """
 | 
					
						
							|  |  |  |     output = """
 | 
					
						
							|  |  |  |         TARGET(OP1) { | 
					
						
							| 
									
										
										
										
											2023-06-12 14:55:15 -07:00
										 |  |  |             PyObject *right = stack_pointer[-1]; | 
					
						
							|  |  |  |             PyObject *left = stack_pointer[-2]; | 
					
						
							| 
									
										
										
										
											2023-01-06 08:04:20 -08:00
										 |  |  |             uint16_t counter = read_u16(&next_instr[0].cache); | 
					
						
							| 
									
										
										
										
											2023-01-30 11:23:57 -08:00
										 |  |  |             op1(left, right); | 
					
						
							| 
									
										
										
										
											2023-06-12 14:55:15 -07:00
										 |  |  |             next_instr += 1; | 
					
						
							| 
									
										
										
										
											2023-01-06 08:04:20 -08:00
										 |  |  |             DISPATCH(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         TARGET(OP) { | 
					
						
							| 
									
										
										
										
											2023-06-12 14:55:15 -07:00
										 |  |  |             PyObject *_tmp_1 = stack_pointer[-1]; | 
					
						
							|  |  |  |             PyObject *_tmp_2 = stack_pointer[-2]; | 
					
						
							|  |  |  |             PyObject *_tmp_3 = stack_pointer[-3]; | 
					
						
							| 
									
										
										
										
											2023-01-06 08:04:20 -08:00
										 |  |  |             { | 
					
						
							| 
									
										
										
										
											2023-01-30 11:23:57 -08:00
										 |  |  |                 PyObject *right = _tmp_1; | 
					
						
							|  |  |  |                 PyObject *left = _tmp_2; | 
					
						
							| 
									
										
										
										
											2023-01-26 09:15:05 -08:00
										 |  |  |                 uint16_t counter = read_u16(&next_instr[0].cache); | 
					
						
							| 
									
										
										
										
											2023-01-30 11:23:57 -08:00
										 |  |  |                 op1(left, right); | 
					
						
							|  |  |  |                 _tmp_2 = left; | 
					
						
							|  |  |  |                 _tmp_1 = right; | 
					
						
							| 
									
										
										
										
											2023-01-06 08:04:20 -08:00
										 |  |  |             } | 
					
						
							|  |  |  |             { | 
					
						
							| 
									
										
										
										
											2023-01-30 11:23:57 -08:00
										 |  |  |                 PyObject *right = _tmp_1; | 
					
						
							|  |  |  |                 PyObject *left = _tmp_2; | 
					
						
							|  |  |  |                 PyObject *arg2 = _tmp_3; | 
					
						
							| 
									
										
										
										
											2023-01-25 08:55:46 -08:00
										 |  |  |                 PyObject *res; | 
					
						
							| 
									
										
										
										
											2023-01-06 08:04:20 -08:00
										 |  |  |                 uint32_t extra = read_u32(&next_instr[3].cache); | 
					
						
							| 
									
										
										
										
											2023-01-30 11:23:57 -08:00
										 |  |  |                 res = op2(arg2, left, right); | 
					
						
							|  |  |  |                 _tmp_3 = res; | 
					
						
							| 
									
										
										
										
											2023-01-06 08:04:20 -08:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2023-06-12 14:55:15 -07:00
										 |  |  |             next_instr += 5; | 
					
						
							| 
									
										
										
										
											2023-01-30 17:27:51 -08:00
										 |  |  |             static_assert(INLINE_CACHE_ENTRIES_OP == 5, "incorrect cache size"); | 
					
						
							| 
									
										
										
										
											2023-01-30 11:23:57 -08:00
										 |  |  |             STACK_SHRINK(2); | 
					
						
							| 
									
										
										
										
											2023-06-12 14:55:15 -07:00
										 |  |  |             stack_pointer[-1] = _tmp_3; | 
					
						
							| 
									
										
										
										
											2023-01-30 11:23:57 -08:00
										 |  |  |             DISPATCH(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         TARGET(OP3) { | 
					
						
							| 
									
										
										
										
											2023-06-12 14:55:15 -07:00
										 |  |  |             PyObject *right = stack_pointer[-1]; | 
					
						
							|  |  |  |             PyObject *left = stack_pointer[-2]; | 
					
						
							|  |  |  |             PyObject *arg2 = stack_pointer[-3]; | 
					
						
							| 
									
										
										
										
											2023-01-30 11:23:57 -08:00
										 |  |  |             PyObject *res; | 
					
						
							|  |  |  |             res = op3(arg2, left, right); | 
					
						
							|  |  |  |             STACK_SHRINK(2); | 
					
						
							| 
									
										
										
										
											2023-06-12 14:55:15 -07:00
										 |  |  |             stack_pointer[-1] = res; | 
					
						
							|  |  |  |             next_instr += 5; | 
					
						
							| 
									
										
										
										
											2023-01-06 08:04:20 -08:00
										 |  |  |             DISPATCH(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     run_cases_test(input, output) | 
					
						
							| 
									
										
										
										
											2023-01-17 15:59:19 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | def test_array_input(): | 
					
						
							|  |  |  |     input = """
 | 
					
						
							|  |  |  |         inst(OP, (below, values[oparg*2], above --)) { | 
					
						
							|  |  |  |             spam(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     output = """
 | 
					
						
							|  |  |  |         TARGET(OP) { | 
					
						
							| 
									
										
										
										
											2023-06-12 14:55:15 -07:00
										 |  |  |             PyObject *above = stack_pointer[-1]; | 
					
						
							|  |  |  |             PyObject **values = (stack_pointer - (1 + oparg*2)); | 
					
						
							|  |  |  |             PyObject *below = stack_pointer[-(2 + oparg*2)]; | 
					
						
							| 
									
										
										
										
											2023-01-17 15:59:19 -08:00
										 |  |  |             spam(); | 
					
						
							|  |  |  |             STACK_SHRINK(oparg*2); | 
					
						
							|  |  |  |             STACK_SHRINK(2); | 
					
						
							|  |  |  |             DISPATCH(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     run_cases_test(input, output) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_array_output(): | 
					
						
							|  |  |  |     input = """
 | 
					
						
							| 
									
										
										
										
											2023-02-07 15:44:37 -08:00
										 |  |  |         inst(OP, (unused, unused -- below, values[oparg*3], above)) { | 
					
						
							|  |  |  |             spam(values, oparg); | 
					
						
							| 
									
										
										
										
											2023-01-17 15:59:19 -08:00
										 |  |  |         } | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     output = """
 | 
					
						
							|  |  |  |         TARGET(OP) { | 
					
						
							|  |  |  |             PyObject *below; | 
					
						
							| 
									
										
										
										
											2023-02-07 15:44:37 -08:00
										 |  |  |             PyObject **values = stack_pointer - (2) + 1; | 
					
						
							| 
									
										
										
										
											2023-01-17 15:59:19 -08:00
										 |  |  |             PyObject *above; | 
					
						
							| 
									
										
										
										
											2023-02-07 15:44:37 -08:00
										 |  |  |             spam(values, oparg); | 
					
						
							| 
									
										
										
										
											2023-01-17 15:59:19 -08:00
										 |  |  |             STACK_GROW(oparg*3); | 
					
						
							| 
									
										
										
										
											2023-06-12 14:55:15 -07:00
										 |  |  |             stack_pointer[-1] = above; | 
					
						
							|  |  |  |             stack_pointer[-(2 + oparg*3)] = below; | 
					
						
							| 
									
										
										
										
											2023-01-17 15:59:19 -08:00
										 |  |  |             DISPATCH(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     run_cases_test(input, output) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_array_input_output(): | 
					
						
							|  |  |  |     input = """
 | 
					
						
							| 
									
										
										
										
											2023-02-07 15:44:37 -08:00
										 |  |  |         inst(OP, (values[oparg] -- values[oparg], above)) { | 
					
						
							|  |  |  |             spam(values, oparg); | 
					
						
							| 
									
										
										
										
											2023-01-17 15:59:19 -08:00
										 |  |  |         } | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     output = """
 | 
					
						
							|  |  |  |         TARGET(OP) { | 
					
						
							| 
									
										
										
										
											2023-06-12 14:55:15 -07:00
										 |  |  |             PyObject **values = (stack_pointer - oparg); | 
					
						
							| 
									
										
										
										
											2023-01-17 15:59:19 -08:00
										 |  |  |             PyObject *above; | 
					
						
							| 
									
										
										
										
											2023-02-07 15:44:37 -08:00
										 |  |  |             spam(values, oparg); | 
					
						
							|  |  |  |             STACK_GROW(1); | 
					
						
							| 
									
										
										
										
											2023-06-12 14:55:15 -07:00
										 |  |  |             stack_pointer[-1] = above; | 
					
						
							| 
									
										
										
										
											2023-01-17 15:59:19 -08:00
										 |  |  |             DISPATCH(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     run_cases_test(input, output) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_array_error_if(): | 
					
						
							|  |  |  |     input = """
 | 
					
						
							|  |  |  |         inst(OP, (extra, values[oparg] --)) { | 
					
						
							|  |  |  |             ERROR_IF(oparg == 0, somewhere); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     output = """
 | 
					
						
							|  |  |  |         TARGET(OP) { | 
					
						
							| 
									
										
										
										
											2023-06-12 14:55:15 -07:00
										 |  |  |             PyObject **values = (stack_pointer - oparg); | 
					
						
							|  |  |  |             PyObject *extra = stack_pointer[-(1 + oparg)]; | 
					
						
							| 
									
										
										
										
											2023-01-17 15:59:19 -08:00
										 |  |  |             if (oparg == 0) { STACK_SHRINK(oparg); goto pop_1_somewhere; } | 
					
						
							|  |  |  |             STACK_SHRINK(oparg); | 
					
						
							|  |  |  |             STACK_SHRINK(1); | 
					
						
							|  |  |  |             DISPATCH(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     run_cases_test(input, output) | 
					
						
							| 
									
										
										
										
											2023-01-25 08:55:46 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-29 17:28:39 -08:00
										 |  |  | def test_cond_effect(): | 
					
						
							|  |  |  |     input = """
 | 
					
						
							| 
									
										
										
										
											2023-02-07 17:35:55 -08:00
										 |  |  |         inst(OP, (aa, input if ((oparg & 1) == 1), cc -- xx, output if (oparg & 2), zz)) { | 
					
						
							| 
									
										
										
										
											2023-01-29 17:28:39 -08:00
										 |  |  |             output = spam(oparg, input); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     output = """
 | 
					
						
							|  |  |  |         TARGET(OP) { | 
					
						
							| 
									
										
										
										
											2023-06-12 14:55:15 -07:00
										 |  |  |             PyObject *cc = stack_pointer[-1]; | 
					
						
							|  |  |  |             PyObject *input = ((oparg & 1) == 1) ? stack_pointer[-(1 + (((oparg & 1) == 1) ? 1 : 0))] : NULL; | 
					
						
							|  |  |  |             PyObject *aa = stack_pointer[-(2 + (((oparg & 1) == 1) ? 1 : 0))]; | 
					
						
							| 
									
										
										
										
											2023-01-29 17:28:39 -08:00
										 |  |  |             PyObject *xx; | 
					
						
							|  |  |  |             PyObject *output = NULL; | 
					
						
							|  |  |  |             PyObject *zz; | 
					
						
							|  |  |  |             output = spam(oparg, input); | 
					
						
							| 
									
										
										
										
											2023-02-07 17:35:55 -08:00
										 |  |  |             STACK_SHRINK((((oparg & 1) == 1) ? 1 : 0)); | 
					
						
							| 
									
										
										
										
											2023-01-29 17:28:39 -08:00
										 |  |  |             STACK_GROW(((oparg & 2) ? 1 : 0)); | 
					
						
							| 
									
										
										
										
											2023-06-12 14:55:15 -07:00
										 |  |  |             stack_pointer[-1] = zz; | 
					
						
							|  |  |  |             if (oparg & 2) { stack_pointer[-(1 + ((oparg & 2) ? 1 : 0))] = output; } | 
					
						
							|  |  |  |             stack_pointer[-(2 + ((oparg & 2) ? 1 : 0))] = xx; | 
					
						
							| 
									
										
										
										
											2023-01-29 17:28:39 -08:00
										 |  |  |             DISPATCH(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     run_cases_test(input, output) | 
					
						
							| 
									
										
										
										
											2023-06-14 13:50:48 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | def test_macro_cond_effect(): | 
					
						
							|  |  |  |     input = """
 | 
					
						
							|  |  |  |         op(A, (left, middle, right --)) { | 
					
						
							|  |  |  |             # Body of A | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         op(B, (-- deep, extra if (oparg), res)) { | 
					
						
							|  |  |  |             # Body of B | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         macro(M) = A + B; | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     output = """
 | 
					
						
							|  |  |  |         TARGET(M) { | 
					
						
							|  |  |  |             PyObject *_tmp_1 = stack_pointer[-1]; | 
					
						
							|  |  |  |             PyObject *_tmp_2 = stack_pointer[-2]; | 
					
						
							|  |  |  |             PyObject *_tmp_3 = stack_pointer[-3]; | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 PyObject *right = _tmp_1; | 
					
						
							|  |  |  |                 PyObject *middle = _tmp_2; | 
					
						
							|  |  |  |                 PyObject *left = _tmp_3; | 
					
						
							|  |  |  |                 # Body of A | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 PyObject *deep; | 
					
						
							|  |  |  |                 PyObject *extra = NULL; | 
					
						
							|  |  |  |                 PyObject *res; | 
					
						
							|  |  |  |                 # Body of B | 
					
						
							|  |  |  |                 _tmp_3 = deep; | 
					
						
							|  |  |  |                 if (oparg) { _tmp_2 = extra; } | 
					
						
							|  |  |  |                 _tmp_1 = res; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             STACK_SHRINK(1); | 
					
						
							|  |  |  |             STACK_GROW((oparg ? 1 : 0)); | 
					
						
							|  |  |  |             stack_pointer[-1] = _tmp_1; | 
					
						
							|  |  |  |             if (oparg) { stack_pointer[-2] = _tmp_2; } | 
					
						
							|  |  |  |             stack_pointer[-3] = _tmp_3; | 
					
						
							|  |  |  |             DISPATCH(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     run_cases_test(input, output) |