diff --git a/generator.c b/generator.c
index a802a96f4e071c64496e5df09f6d28cbfad24a58..24529e0e26add6f595560626773029ce65f903e6 100644 (file)
--- a/generator.c
+++ b/generator.c
}
else if(type -> class == OBERON_TYPE_ARRAY)
{
}
else if(type -> class == OBERON_TYPE_ARRAY)
{
- if(type -> dim != 1)
- {
- oberon_error(ctx, "multidimension and open arrays not supported");
- }
-
gen_type_t * gen_base = type -> base -> gen_type;
gcc_jit_type * gcc_base = gen_base -> gcc_type;
gen_type_t * gen_base = type -> base -> gen_type;
gcc_jit_type * gcc_base = gen_base -> gcc_type;
-
gcc_type = gcc_jit_context_new_array_type(gcc_context, NULL, gcc_base, type -> size);
}
else if(type -> class == OBERON_TYPE_RECORD)
gcc_type = gcc_jit_context_new_array_type(gcc_context, NULL, gcc_base, type -> size);
}
else if(type -> class == OBERON_TYPE_RECORD)
}
else if(item -> mode == MODE_FIELD)
{
}
else if(item -> mode == MODE_FIELD)
{
+ printf("lvalue_from_item: %s\n", item -> var -> name);
gen_var_t * gen_var = item -> var -> gen_var;
gcc_jit_field * gcc_field = gen_var -> gcc_field;
gcc_jit_lvalue * parent = lvalue_from_item(ctx, item -> parent);
left = gcc_jit_lvalue_access_field(parent, NULL, gcc_field);
}
gen_var_t * gen_var = item -> var -> gen_var;
gcc_jit_field * gcc_field = gen_var -> gcc_field;
gcc_jit_lvalue * parent = lvalue_from_item(ctx, item -> parent);
left = gcc_jit_lvalue_access_field(parent, NULL, gcc_field);
}
+ else if(item -> mode == MODE_DEREF)
+ {
+ gcc_jit_rvalue * parent = rvalue_from_item(ctx, item -> parent);
+ left = gcc_jit_rvalue_dereference(parent, NULL);
+ }
else
{
oberon_error(ctx, "invalid lvalue expression");
else
{
oberon_error(ctx, "invalid lvalue expression");
gcc_jit_rvalue * parent = rvalue_from_item(ctx, item -> parent);
right = gcc_jit_rvalue_access_field(parent, NULL, gcc_field);
}
gcc_jit_rvalue * parent = rvalue_from_item(ctx, item -> parent);
right = gcc_jit_rvalue_access_field(parent, NULL, gcc_field);
}
+ else if(item -> mode == MODE_DEREF)
+ {
+ gcc_jit_lvalue * left = lvalue_from_item(ctx, item);
+ right = gcc_jit_lvalue_as_rvalue(left);
+ }
+ else if(item -> mode == MODE_NIL)
+ {
+ gcc_jit_type * type = gcc_jit_context_get_type(gcc_context, GCC_JIT_TYPE_VOID_PTR);
+ right = gcc_jit_context_null(gcc_context, type);
+ }
else
{
oberon_error(ctx, "rvalue_from_item: invalid mode %i", item -> mode);
else
{
oberon_error(ctx, "rvalue_from_item: invalid mode %i", item -> mode);
@@ -542,6 +552,18 @@ oberon_generate_assign(oberon_context_t * ctx, oberon_expr_t * src, oberon_expr_
gcc_jit_rvalue * right;
right = rvalue_from_expr(ctx, src);
gcc_jit_rvalue * right;
right = rvalue_from_expr(ctx, src);
+ if(src -> is_item)
+ {
+ if(src -> item.mode == MODE_NIL)
+ {
+ gen_context_t * gen_context = ctx -> gen_context;
+ gcc_jit_context * gcc_context = gen_context -> gcc_context;
+ gen_type_t * gen_type = dst -> result -> gen_type;
+ gcc_jit_type * cast_to_type = gen_type -> gcc_type;
+ right = gcc_jit_context_new_cast(gcc_context, NULL, right, cast_to_type);
+ }
+ }
+
gen_context_t * gen_context = ctx -> gen_context;
gcc_jit_block * gcc_block = gen_context -> gcc_block;
gcc_jit_block_add_assignment(gcc_block, NULL, left, right);
gen_context_t * gen_context = ctx -> gen_context;
gcc_jit_block * gcc_block = gen_context -> gcc_block;
gcc_jit_block_add_assignment(gcc_block, NULL, left, right);