index 99a4673199d8e432ddb0c98c4e0f397426625cff..84ebe512efcdb595a9c079f1bbc3d02b68cd0f26 100644 (file)
static void
jvm_generate_new_static(gen_proc_t * p, oberon_type_t * type)
{
+ int dim;
char * cname;
+ char * desc;
switch(type -> class)
{
case OBERON_TYPE_PROCEDURE:
case OBERON_TYPE_REAL:
case OBERON_TYPE_POINTER:
- /* ничего не надо делать при статической инициализации */
+ gen_error("jvm_generate_new_static: static alocation not allowed");
break;
case OBERON_TYPE_RECORD:
cname = jvm_get_class_full_name(type);
jvm_generate(p, 1, 0, "invokespecial %s/<init>()V", cname);
break;
case OBERON_TYPE_ARRAY:
- gen_error("jvm_generate_new_static: TODO array");
+ dim = 0;
+ desc = jvm_get_descriptor(type);
+ while(type -> class == OBERON_TYPE_ARRAY)
+ {
+ dim += 1;
+ jvm_generate_push_int(p, type -> size);
+ type = type -> base;
+ }
+ jvm_generate(p, dim, 1, "multianewarray %s %i", desc, dim);
break;
default:
gen_error("jvm_generate_new_static: unk type class %i", type -> class);
jvm_generate_call_proc(p, (oberon_expr_t *) item);
break;
case MODE_INDEX:
- gen_error("push_item: TODO index");
+ ;
+ char postfix = jvm_get_postfix(item -> result);
+ int cell_size = jvm_cell_size_for_postfix(postfix);
+ push_item(p, item -> parent);
+ push_expr(p, item -> args);
+ jvm_generate(p, 1 + 1, cell_size, "%caload", postfix);
break;
case MODE_FIELD:
push_item(p, item -> parent);
jvm_generate_abs(gen_proc_t * p, char prefix)
{
char t = jvm_get_type_of_prefix(prefix);
- int cell_size = jvm_cell_size_for_prefix(prefix);
+ int cell_size = jvm_cell_size_for_postfix(prefix);
jvm_generate(p, cell_size, cell_size, "invokestatic java/lang/Math/abs(%c)%c", t, t);
}
int label_done = jvm_new_label_id(p);
char * label_name_true = jvm_get_label_name(label_true);
char * label_name_done = jvm_get_label_name(label_done);
- int cell_size = 2 * jvm_cell_size_for_prefix(prefix);
+ int cell_size = 2 * jvm_cell_size_for_postfix(prefix);
assert(prefix == 'i' || prefix == 'a');
static void
jvm_generate_operator(gen_proc_t * p, char prefix, int op)
{
- int cell_size = jvm_cell_size_for_prefix(prefix);
+ int cell_size = jvm_cell_size_for_postfix(prefix);
switch(op)
{
case OP_UNARY_MINUS:
jvm_generate_store(p, src -> result, item -> var -> gen_var);
break;
case MODE_INDEX:
- gen_error("store_expr: TODO index");
+ ;
+ char postfix = jvm_get_postfix(src -> result);
+ int cell_size = jvm_cell_size_for_postfix(postfix);
+ push_item(p, item -> parent);
+ push_expr(p, item -> args);
+ push_expr(p, src);
+ jvm_generate(p, 1 + 1 + cell_size, 0, "%castore", postfix);
break;
case MODE_FIELD:
push_item(p, item -> parent);
}
}
-/*
-static void
-store_expr(gen_proc_t * p, oberon_expr_t * dst, oberon_expr_t * src)
-{
- assert(dst -> is_item);
- oberon_item_t * item = (oberon_item_t *) dst;
-
- int cell_size = jvm_cell_size_for_type(src -> result);
-
- char prefix;
- switch(item -> mode)
- {
- case MODE_VAR:
- push_expr(p, src);
- if(item -> var -> local)
- {
- int reg = item -> var -> gen_var -> reg;
- prefix = jvm_get_prefix(item -> result);
- jvm_generate(p, cell_size, 0, "%cstore %i", prefix, reg);
- }
- else
- {
- char * fullname = jvm_get_field_full_name(item -> var);
- char * desc = jvm_get_descriptor(item -> result);
- jvm_generate(p, cell_size, 0, "putstatic %s %s", fullname, desc);
- }
- break;
- case MODE_INDEX:
- gen_error("store_expr: TODO index");
- break;
- case MODE_FIELD:
- {
- char * fullname = jvm_get_field_full_name(item -> var);
- char * desc = jvm_get_descriptor(item -> result);
- push_item(p, item -> parent);
- push_expr(p, src);
- jvm_generate(p, 1 + cell_size, 0, "putfield %s %s", fullname, desc);
- }
- break;
- default:
- gen_error("store_expr: unk mode %i", item -> mode);
- break;
- }
-}
-*/
-
void
oberon_generate_assign(oberon_context_t * ctx, oberon_expr_t * src, oberon_expr_t * dst)
{