- }
-
- if type(c_argument) in LITERAL_TYPE_MAPPING:
- return LITERAL_TYPE_MAPPING[type(c_argument)](c_argument)
-
- INFIX_TYPE_MAPPING = {
- transformation.CAdditionExpression: 'add',
- transformation.CSubtractionExpression: 'subtract',
- transformation.CMultiplicationExpression: 'multiply',
- transformation.CIntegerDivisionExpression: 'integerDivide',
- transformation.CModularDivisionExpression: 'modularDivide',
- }
-
- return 'builtin${}({}, {})'.format(
- INFIX_TYPE_MAPPING[type(c_argument)],
- generate_expression(c_argument.left),
- generate_expression(c_argument.right),
+ transformation.CStructureLiteralExpression: generate_structure_literal_expression,
+ transformation.CSymbolExpression: generate_symbol_expression,
+ transformation.CVariableExpression: generate_variable_expression,
+ }[type(expression)](expression)
+
+def generate_function_call(function_call):
+ # This gets called twice, so we want to be sure it is efficient and without side effects
+ assert isinstance(function_call.function_expression, transformation.CSymbolExpression)
+
+ # TODO Check the type of the things being called
+ function_expression = generate_expression(function_call.function_expression)
+ return '{}.instance.closure.call(environmentPool, {}.instance.closure.closed, {}, stack, {}, jump)'.format(
+ function_expression,
+ function_expression,
+ function_call.argument_count,
+ function_call.metadata.line,
+ )
+
+def generate_expression_statement(statement):
+ return 'Object_deinitialize(&({}));'.format(generate_expression(statement.expression))
+
+def generate_symbol_assignment_statement(statement):
+ return 'Environment_set(environment, SYMBOL_LIST[{}] /* symbol: {} */, {});'.format(
+ statement.target_symbol_list_index,
+ statement.target,
+ generate_expression(statement.expression),
+ )
+
+def generate_array_variable_initialization_statement(statement):
+ return 'Object {}[] = {{ {} }};'.format(
+ statement.variable,
+ ', '.join(generate_expression(i) for i in statement.items),
+ )
+
+def generate_symbol_array_variable_initialization_statement(statement):
+ return 'const char* {}[] = {{ {} }};'.format(
+ statement.variable,
+ ', '.join('SYMBOL_LIST[{}] /* symbol: "{}" */'.format(
+ statement.symbol_list_indices[i],
+ statement.symbol_list[i],
+ ) for i in range(len(statement.symbol_list))),
+ )
+
+def generate_variable_initialization_statement(statement):
+ return 'Object {} = {};'.format(
+ statement.variable,
+ generate_expression(statement.expression),
+ )
+
+def generate_variable_reassignment_statement(statement):
+ return '{} = {};'.format(
+ statement.variable,
+ generate_expression(statement.expression),
+ )
+
+
+def indent(s):
+ return '\n'.join(' ' * 2 + l for l in s.split('\n'))
+
+def generate_if_else_statement(statement):
+ # TODO Check that the argument is boolean
+ condition_expression = '{}.instance.boolean'.format(
+ generate_expression(statement.condition_expression),