index af45a637eaca1fbbf4655e659cd3ec68f9eaaf18..cbc834e58d5cf919926aae41423023dc4e259013 100644 (file)
}
static void
-jvm_generate_new_static(gen_proc_t * p, oberon_type_t * type);
+jvm_generate_new(gen_proc_t * p, oberon_type_t * type, int num);
/*
* Функция jvm_generate_static_array_initialization генерирует код для
{
jvm_generate(p, 0, 1, "aload %i", reg_a);
jvm_generate(p, 0, 1, "iload %i", reg_i);
- jvm_generate_new_static(p, type -> base);
+ jvm_generate_new(p, type -> base, 0);
jvm_generate(p, 3, 0, "aastore");
}
else
}
static void
-jvm_generate_new_static(gen_proc_t * p, oberon_type_t * type)
+jvm_generate_new(gen_proc_t * p, oberon_type_t * type, int num)
{
int dim;
char * cname;
desc = jvm_get_descriptor(type);
while(base -> class == OBERON_TYPE_ARRAY)
{
+ if(num > 0)
+ {
+ assert(base -> size == 0);
+ num -= 1;
+ }
+ else
+ {
+ assert(base -> size > 0);
+ jvm_generate_push_int(p, base -> size);
+ }
dim += 1;
- jvm_generate_push_int(p, base -> size);
base = base -> base;
}
+
+ assert(num == 0);
jvm_generate(p, dim, 1, "multianewarray %s %i", desc, dim);
if(base -> class == OBERON_TYPE_RECORD)
|| field -> type -> class == OBERON_TYPE_ARRAY)
{
jvm_generate(p, 0, 1, "aload_0");
- jvm_generate_new_static(p, field -> type);
+ jvm_generate_new(p, field -> type, 0);
jvm_generate_store(p, field -> type, field -> gen_var);
}
field = field -> next;
jvm_alloc_register_untyped(p -> rf, false);
jvm_generate(p, 0, 1, "aload_0");
jvm_generate(p, 1, 0, "invokespecial java/lang/Object/<init>()V");
+
+ /* Инициализация переменных объявленных в модуле */
+ oberon_object_t * x = ctx -> mod -> decl -> list -> next;
+ while(x != NULL)
+ {
+ if(x -> class == OBERON_CLASS_VAR)
+ {
+ if(x -> type -> class == OBERON_TYPE_ARRAY
+ || x -> type -> class == OBERON_TYPE_RECORD)
+ {
+ jvm_generate_new(p, x -> type, 0);
+ jvm_generate_store(p, x -> type, x -> gen_var);
+ }
+ }
+ x = x -> next;
+ }
}
void
}
}
-static void
-jvm_generate_expr_new_static(gen_proc_t * p, oberon_type_t * type, int num, oberon_expr_t * arg)
-{
- assert(num == 0);
- jvm_generate_new_static(p, type);
-}
-
static void
jvm_generate_expr_new_pointer(gen_proc_t * p, oberon_type_t * type, int num, oberon_expr_t * arg)
{
assert(type -> class == OBERON_TYPE_POINTER);
- jvm_generate_expr_new_static(p, type -> base, num, arg);
+
+ for(int i = 0; i < num; i++)
+ {
+ push_expr(p, arg);
+ arg = arg -> next;
+ }
+
+ jvm_generate_new(p, type -> base, num);
}
static void