Start work on structs. Can declare structs and access members. Copying structs and passing them as parameters or returning them doesn't work yet

This commit is contained in:
Nathan Braswell
2018-03-15 00:29:21 -04:00
parent 8de92e1c3b
commit 5ebb6d5482

View File

@@ -485,11 +485,11 @@ obj bytecode_generator (Object) {
}
fun generate_identifier(node: *ast_node, lvalue: bool): int {
// STRUCT HERE
if (lvalue) {
var ident_type = get_ast_type(node)
if (lvalue || (ident_type->is_object() && ident_type->indirection == 0))
return emit_addi(1, functions.last().var_to_frame_offset[node])
} else {
return emit_ldr(1, functions.last().var_to_frame_offset[node], size_to_operand_size(type_size(get_ast_type(node))))
}
else
return emit_ldr(1, functions.last().var_to_frame_offset[node], size_to_operand_size(type_size(ident_type)))
}
fun generate_return_statement(node: *ast_node): int {
// STRUCT HERE
@@ -552,6 +552,19 @@ obj bytecode_generator (Object) {
return value_reg
}
// STRUCT HERE
if (name == "." || name == "->") {
var base = generate(parameter_nodes[0])
if (!is_identifier(parameter_nodes[1]))
error("trying to access not an identifier")
var val_type = get_ast_type(parameter_nodes[1])
var offset = offset_into_struct(get_ast_type(parameter_nodes[0]), parameter_nodes[1])
var member_ptr = emit_addi(base, offset)
if (lvalue || (val_type->is_object() && val_type->indirection == 0))
return member_ptr
return emit_ldr(member_ptr, 0, size_to_operand_size(type_size(get_ast_type(parameter_nodes[1]))))
}
var params = parameter_nodes.map(fun(n: *ast_node): int return generate(n);)
if (name == "+") {
if (params.size == 1)
@@ -565,19 +578,13 @@ obj bytecode_generator (Object) {
return emit_add(params[0], emit_addi(emit_not(params[1]), 1))
} else if (name == "!") {
return emit_ez(params[0])
} else if (name == "[]" || name == "." || name == "->" || (name == "*" && params.size == 1)) {
} else if (name == "[]" || (name == "*" && params.size == 1)) {
if (name == "[]") {
if (lvalue)
return emit_add(params[0], params[1])
else
return emit_ldr(emit_add(params[0], params[1]), 0, size_to_operand_size(type_size(get_ast_type(parameter_nodes[0])->clone_with_decreased_indirection())))
}
// STRUCT HERE
if (name == "." || name == "->") {
error("no structs")
}
/*if (name == "." || name == "->") if (lvalue) return emit_add(params[0], params[1])*/
/*else return emit_ldr(emit_add(params[0], params[1]), 0, size_to_operand_size(type_size(get_ast_type(parameter_nodes[1]))))*/
if (name == "*") {
if (lvalue)
return params[0]
@@ -879,7 +886,7 @@ obj bytecode_generator (Object) {
}
// Stack ABI
// it's system v x64, but all params passed on stack
// it's system v x64ish, but all params passed on stack
fun evaluate(): int {
println("evaling main")
println(bytecode_to_string(functions, instructions))