From 55a448a3b56d2df89f25bf6c5bc0bd3b9c9b8e64 Mon Sep 17 00:00:00 2001 From: Nathan Braswell Date: Thu, 8 Mar 2018 23:25:48 -0500 Subject: [PATCH] Small work towards operators. + workes now --- stdlib/bytecode_generator.krak | 54 ++++++++++++++++++++++++++-------- 1 file changed, 42 insertions(+), 12 deletions(-) diff --git a/stdlib/bytecode_generator.krak b/stdlib/bytecode_generator.krak index e290e78..117fdda 100644 --- a/stdlib/bytecode_generator.krak +++ b/stdlib/bytecode_generator.krak @@ -432,18 +432,48 @@ obj bytecode_generator (Object) { return emit_imm(-2) } fun generate_function_call(node: *ast_node, lvalue: bool): int { - var stack_offset = 0 - // reverse order - node->function_call.parameters.reverse().for_each(fun(child: *ast_node) { - // push param onto stack - var param_size = type_size(get_ast_type(child)) - emit_add(0, 0, emit_imm(-param_size)) - stack_offset += param_size - emit_str(0, 0, generate(child), size_to_operand_size(param_size)) - }) - var return_reg = emit_call(generate_function(node->function_call.func)) - emit_add(0, 0, emit_imm(stack_offset)) - return return_reg + var func = node->function_call.func + if (is_function(func) && func->function.body_statement == null()) { + var name = func->function.name + var params = node->function_call.parameters.map(fun(n: *ast_node): int return generate(n);) + if (name == "+") { + if (params.size == 1) + error("positivate not supported") + else + return emit_add(params[0], params[1]) + } else if (name == "-") { + error("subtract/negate not supported") + } else if (name == "!") { + error("not not supported") + } else if (name == "--" || name == "++" || name == "--p" || name == "++p") { + error("increment / decrement not supported") + } else if (name == "[]" || name == "." || name == "->" || (name == "*" && params.size == 1) || (name == "&" && params.size == 1)) { + error("access operators are not supported") + } else if (name == "==" || name == "<=" || name == ">=" || name == "!=" || name == "<" || name == ">") { + error("comparator operators are not supported") + } else if (name == "|" || (name == "&" && params.size == 2) || name == "^" || name == "~") { + error("bitwise operators are not supported") + } else if (name == ">>" || name == "<<") { + error("shift operators are not supported") + } else if (name == "/" || name == "%" || (name == "*" && params.size == 2)) { + error("mult div mod operators are not supported") + } else { + error("unknown operator " + name) + } + } else { + var stack_offset = 0 + // reverse order + node->function_call.parameters.reverse().for_each(fun(child: *ast_node) { + // push param onto stack + var param_size = type_size(get_ast_type(child)) + emit_add(0, 0, emit_imm(-param_size)) + stack_offset += param_size + emit_str(0, 0, generate(child), size_to_operand_size(param_size)) + }) + var return_reg = emit_call(generate_function(node->function_call.func)) + emit_add(0, 0, emit_imm(stack_offset)) + return return_reg + } } fun generate_compiler_intrinsic(node: *ast_node): int {