Skip to content

Commit 8636ea5

Browse files
committed
improve testing for partial compiler
1 parent 8dd6297 commit 8636ea5

File tree

3 files changed

+100
-84
lines changed

3 files changed

+100
-84
lines changed

compiler.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,15 @@ class Compiler:
1717

1818
def rco_exp(self, e: expr, need_atomic: bool) -> Tuple[expr, Temporaries]:
1919
# YOUR CODE HERE
20-
pass
20+
raise Exception('rco_exp not implemented')
2121

2222
def rco_stmt(self, s: stmt) -> List[stmt]:
2323
# YOUR CODE HERE
24-
pass
25-
24+
raise Exception('rco_stmt not implemented')
2625

27-
def remove_complex_operands(self, p: Module) -> Module:
28-
# YOUR CODE HERE
29-
pass
26+
# def remove_complex_operands(self, p: Module) -> Module:
27+
# # YOUR CODE HERE
28+
# raise Exception('remove_complex_operands not implemented')
3029

3130

3231
############################################################################

run-tests.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,17 @@
11
import os
2+
import sys
3+
4+
sys.path.append('../python-student-support-code')
5+
sys.path.append('../python-student-support-code/interp_x86')
6+
27
import compiler
38
import interp_Lvar
49
import type_check_Lvar
5-
from utils import run_tests, run_one_test
10+
from utils import run_tests, run_one_test, enable_tracing
611
from interp_x86.eval_x86 import interp_x86
712

13+
enable_tracing()
14+
815
compiler = compiler.Compiler()
916

1017
typecheck_Lvar = type_check_Lvar.TypeCheckLvar().type_check

utils.py

Lines changed: 87 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -1161,19 +1161,22 @@ def test_pass(passname, interp_dict, program_root, ast,
11611161
sys.stdin = open(input_file, 'r')
11621162
sys.stdout = open(output_file, 'w')
11631163
interp_dict[passname](ast)
1164+
print() # print a newline to make diff happy
11641165
sys.stdin = stdin
11651166
sys.stdout = stdout
1166-
result = os.system('diff' + ' -b ' + output_file + ' ' + program_root + '.golden')
1167+
result = os.system('diff' + ' -b ' + output_file \
1168+
+ ' ' + program_root + '.golden')
11671169
if result == 0:
11681170
trace('compiler ' + compiler_name + ' success on pass ' + passname \
11691171
+ ' on test\n' + program_root + '\n')
11701172
return 1
11711173
else:
11721174
print('compiler ' + compiler_name + ' failed pass ' + passname \
1173-
+ ' on test\n' + program_root + '\n')
1175+
+ ' on test:\n' + program_root + '\n')
11741176
return 0
11751177
else:
1176-
trace('compiler ' + compiler_name + ' skip test on pass ' + passname + ' on test\n' + program_root + '\n')
1178+
trace('compiler ' + compiler_name + ' skip test on pass ' + passname \
1179+
+ ' on test\n' + program_root + '\n')
11771180
return 0 # ??
11781181

11791182

@@ -1182,6 +1185,7 @@ def compile_and_test(compiler, compiler_name,
11821185
program_filename):
11831186
total_passes = 0
11841187
successful_passes = 0
1188+
successful_test = 0
11851189
from eval_x86 import interp_x86
11861190

11871191
program_root = os.path.splitext(program_filename)[0]
@@ -1206,9 +1210,8 @@ def compile_and_test(compiler, compiler_name,
12061210
type_check_dict[passname](program)
12071211
total_passes += 1
12081212
successful_passes += \
1209-
test_pass(passname, interp_dict, program_root, program, compiler_name)
1210-
else:
1211-
trace("\n# no shrink pass!")
1213+
test_pass(passname, interp_dict, program_root, program,
1214+
compiler_name)
12121215

12131216
passname = 'uniquify'
12141217
if hasattr(compiler, passname):
@@ -1219,7 +1222,8 @@ def compile_and_test(compiler, compiler_name,
12191222
type_check_dict[passname](program)
12201223
total_passes += 1
12211224
successful_passes += \
1222-
test_pass(passname, interp_dict, program_root, program, compiler_name)
1225+
test_pass(passname, interp_dict, program_root, program,
1226+
compiler_name)
12231227

12241228
passname = 'reveal_functions'
12251229
if hasattr(compiler, passname):
@@ -1243,7 +1247,8 @@ def compile_and_test(compiler, compiler_name,
12431247
type_check_dict[passname](program)
12441248
total_passes += 1
12451249
successful_passes += \
1246-
test_pass(passname, interp_dict, program_root, program, compiler_name)
1250+
test_pass(passname, interp_dict, program_root, program,
1251+
compiler_name)
12471252

12481253
passname = 'erase_types'
12491254
if hasattr(compiler, passname):
@@ -1255,7 +1260,8 @@ def compile_and_test(compiler, compiler_name,
12551260
type_check_dict[passname](program)
12561261
total_passes += 1
12571262
successful_passes += \
1258-
test_pass(passname, interp_dict, program_root, program, compiler_name)
1263+
test_pass(passname, interp_dict, program_root, program,
1264+
compiler_name)
12591265

12601266
passname = 'cast_insert'
12611267
if hasattr(compiler, passname):
@@ -1356,15 +1362,16 @@ def compile_and_test(compiler, compiler_name,
13561362
compiler_name)
13571363

13581364
passname = 'remove_complex_operands'
1359-
trace('\n# ' + passname + '\n')
1360-
program = compiler.remove_complex_operands(program)
1361-
trace(program)
1362-
if passname in type_check_dict.keys():
1363-
type_check_dict[passname](program)
1364-
total_passes += 1
1365-
successful_passes += \
1366-
test_pass(passname, interp_dict, program_root, program,
1367-
compiler_name)
1365+
if hasattr(compiler, passname):
1366+
trace('\n# ' + passname + '\n')
1367+
program = compiler.remove_complex_operands(program)
1368+
trace(program)
1369+
if passname in type_check_dict.keys():
1370+
type_check_dict[passname](program)
1371+
total_passes += 1
1372+
successful_passes += \
1373+
test_pass(passname, interp_dict, program_root, program,
1374+
compiler_name)
13681375

13691376
passname = 'explicate_control'
13701377
if hasattr(compiler, passname):
@@ -1382,71 +1389,76 @@ def compile_and_test(compiler, compiler_name,
13821389
compiler_name)
13831390

13841391
passname = 'select_instructions'
1385-
trace('\n# ' + passname + '\n')
1386-
program = compiler.select_instructions(program)
1387-
trace(program)
1388-
total_passes += 1
1389-
successful_passes += \
1390-
test_pass(passname, interp_dict, program_root, program,
1391-
compiler_name)
1392+
if hasattr(compiler, passname):
1393+
trace('\n# ' + passname + '\n')
1394+
program = compiler.select_instructions(program)
1395+
trace(program)
1396+
total_passes += 1
1397+
successful_passes += \
1398+
test_pass(passname, interp_dict, program_root, program,
1399+
compiler_name)
13921400

13931401
passname = 'assign_homes'
1394-
trace('\n# ' + passname + '\n')
1395-
program = compiler.assign_homes(program)
1396-
trace(program)
1397-
total_passes += 1
1398-
successful_passes += \
1399-
test_pass(passname, interp_dict, program_root, program,
1400-
compiler_name)
1402+
if hasattr(compiler, passname):
1403+
trace('\n# ' + passname + '\n')
1404+
program = compiler.assign_homes(program)
1405+
trace(program)
1406+
total_passes += 1
1407+
successful_passes += \
1408+
test_pass(passname, interp_dict, program_root, program,
1409+
compiler_name)
14011410

14021411
passname = 'patch_instructions'
1403-
trace('\n# ' + passname + '\n')
1404-
program = compiler.patch_instructions(program)
1405-
trace(program)
1406-
total_passes += 1
1407-
successful_passes += \
1408-
test_pass(passname, interp_dict, program_root, program,
1409-
compiler_name)
1412+
if hasattr(compiler, passname):
1413+
trace('\n# ' + passname + '\n')
1414+
program = compiler.patch_instructions(program)
1415+
trace(program)
1416+
total_passes += 1
1417+
successful_passes += \
1418+
test_pass(passname, interp_dict, program_root, program,
1419+
compiler_name)
14101420

1411-
trace('\n# prelude and conclusion\n')
1412-
program = compiler.prelude_and_conclusion(program)
1413-
trace(program)
1414-
trace("")
1421+
passname = 'prelude_and_conclusion'
1422+
if hasattr(compiler, passname):
1423+
trace('\n# ' + passname + '\n')
1424+
program = compiler.prelude_and_conclusion(program)
1425+
trace(program)
1426+
trace("")
14151427

1416-
x86_filename = program_root + ".s"
1417-
with open(x86_filename, "w") as dest:
1418-
dest.write(str(program))
1428+
x86_filename = program_root + ".s"
1429+
with open(x86_filename, "w") as dest:
1430+
dest.write(str(program))
14191431

1420-
total_passes += 1
1432+
total_passes += 1
14211433

1422-
# Run the final x86 program
1423-
emulate_x86 = False
1424-
if emulate_x86:
1425-
stdin = sys.stdin
1426-
stdout = sys.stdout
1427-
sys.stdin = open(program_root + '.in', 'r')
1428-
sys.stdout = open(program_root + '.out', 'w')
1429-
interp_x86(program)
1430-
sys.stdin = stdin
1431-
sys.stdout = stdout
1432-
else:
1433-
if platform == 'darwin':
1434-
os.system('gcc -arch x86_64 runtime.o ' + x86_filename)
1434+
# Run the final x86 program
1435+
emulate_x86 = False
1436+
if emulate_x86:
1437+
stdin = sys.stdin
1438+
stdout = sys.stdout
1439+
sys.stdin = open(program_root + '.in', 'r')
1440+
sys.stdout = open(program_root + '.out', 'w')
1441+
interp_x86(program)
1442+
sys.stdin = stdin
1443+
sys.stdout = stdout
14351444
else:
1436-
os.system('gcc runtime.o ' + x86_filename)
1437-
input_file = program_root + '.in'
1438-
output_file = program_root + '.out'
1439-
os.system('./a.out < ' + input_file + ' > ' + output_file)
1440-
1441-
result = os.system('diff' + ' -b ' + program_root + '.out ' \
1442-
+ program_root + '.golden')
1443-
if result == 0:
1444-
successful_passes += 1
1445-
return (successful_passes, total_passes, 1)
1446-
else:
1447-
print('compiler ' + compiler_name + ', executable failed' \
1448-
+ ' on test ' + program_root)
1449-
return (successful_passes, total_passes, 0)
1445+
if platform == 'darwin':
1446+
os.system('gcc -arch x86_64 runtime.o ' + x86_filename)
1447+
else:
1448+
os.system('gcc runtime.o ' + x86_filename)
1449+
input_file = program_root + '.in'
1450+
output_file = program_root + '.out'
1451+
os.system('./a.out < ' + input_file + ' > ' + output_file)
1452+
1453+
result = os.system('diff' + ' -b ' + program_root + '.out ' \
1454+
+ program_root + '.golden')
1455+
if result == 0:
1456+
successful_passes += 1
1457+
successful_test = 1
1458+
else:
1459+
print('compiler ' + compiler_name + ', executable failed' \
1460+
+ ' on test ' + program_root)
1461+
return (successful_passes, total_passes, successful_test)
14501462

14511463

14521464
def trace_ast_and_concrete(ast):
@@ -1541,9 +1553,7 @@ def compile(compiler, compiler_name, type_check_L, type_check_C,
15411553
with open(x86_filename, "w") as dest:
15421554
dest.write(str(x86))
15431555

1544-
# Given a test file name, the name of a language, a compiler, a type
1545-
1546-
1556+
# Given a test file name, the name of a language, a compiler, a type
15471557
# checker and interpreter for the language, and an interpeter for the
15481558
# C intermediate language, run all the passes in the compiler,
15491559
# checking that the resulting programs produce output that matches the

0 commit comments

Comments
 (0)