X-Git-Url: https://code.kerkeslager.com/?a=blobdiff_plain;f=crossplatform_ir_generation.py;h=fad62225667612884085be3b6ae4b094f4fdae05;hb=f378cbf85e3dbd26d5a97b6ac9b1aeb0811ecf74;hp=332a74ff76e15037feb81c8b8920236f2e460d12;hpb=ecbec68813b8dbd559354d9f0fe023a01d351fe9;p=fur diff --git a/crossplatform_ir_generation.py b/crossplatform_ir_generation.py index 332a74f..fad6222 100644 --- a/crossplatform_ir_generation.py +++ b/crossplatform_ir_generation.py @@ -68,9 +68,6 @@ def generate_lambda_expression(counters, expression): counters[expression.name] = name_counter + 1 label = '{}${}'.format(expression.name, name_counter) - for argument_name in expression.argument_name_list: - import ipdb; ipdb.set_trace() - referenced_entry_list_list = [] instruction_list_list = [] @@ -79,9 +76,16 @@ def generate_lambda_expression(counters, expression): referenced_entry_list_list.append(referenced_entry_list) instruction_list_list.append(instruction_list) + # Pop from the stack in reversed order, because arguments were pushed onto + # the stack in order + argument_bindings = tuple( + CIRInstruction(instruction='pop', argument='sym({})'.format(arg)) + for arg in reversed(expression.argument_name_list) + ) + lambda_body = flatten(instruction_list_list) assert lambda_body[-1].instruction == 'drop' - lambda_body = lambda_body[:-1] + (CIRInstruction(instruction='return', argument=None),) + lambda_body = argument_bindings + lambda_body[:-1] + (CIRInstruction(instruction='return', argument=None),) referenced_entry_list_list.append( (CIRLabel(label=label),) + lambda_body, @@ -93,6 +97,14 @@ def generate_lambda_expression(counters, expression): return flatten(referenced_entry_list_list), instruction_list +def generate_list_construct_expression(counters, expression): + referenced_entry_list = () + instruction_list = (CIRInstruction( + instruction='list', + argument=2, + ),) + return referenced_entry_list, instruction_list + def generate_string_literal_expression(counters, expression): referenced_entry_list = () instruction_list = (CIRInstruction( @@ -102,6 +114,15 @@ def generate_string_literal_expression(counters, expression): return referenced_entry_list, instruction_list +def generate_structure_literal_expression(counters, expression): + referenced_entry_list = () + instruction_list = (CIRInstruction( + instruction='structure', + argument=expression.field_count, + ),) + + return referenced_entry_list, instruction_list + def generate_symbol_expression(counters, expression): referenced_entry_list = () instruction_list = (CIRInstruction( @@ -111,6 +132,15 @@ def generate_symbol_expression(counters, expression): return referenced_entry_list, instruction_list +def generate_symbol_literal_expression(counters, expression): + referenced_entry_list = () + instruction_list = (CIRInstruction( + instruction='push_value', + argument=generate_symbol_literal(expression.symbol), + ),) + + return referenced_entry_list, instruction_list + def generate_variable_expression(counters, expression): referenced_entry_list = () instruction_list = (CIRInstruction( @@ -126,8 +156,11 @@ def generate_expression(counters, expression): conversion.CPSIfElseExpression: generate_if_else_expression, conversion.CPSIntegerLiteralExpression: generate_integer_literal_expression, conversion.CPSLambdaExpression: generate_lambda_expression, + conversion.CPSListConstructExpression: generate_list_construct_expression, conversion.CPSStringLiteralExpression: generate_string_literal_expression, + conversion.CPSStructureLiteralExpression: generate_structure_literal_expression, conversion.CPSSymbolExpression: generate_symbol_expression, + conversion.CPSSymbolLiteralExpression: generate_symbol_literal_expression, conversion.CPSVariableExpression: generate_variable_expression, }[type(expression)](counters, expression)