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:
@@ -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))
|
||||
|
||||
Reference in New Issue
Block a user