DEADSOFTWARE

Исправлено обращение к полям при использовании каста. Процедуры INC/DEC больше не...
[dsw-obn.git] / src / backends / jvm / generator-jvm.c
index 4f49cfb86ca94df0b220be27f0d5fad68ac99a3b..48db18000ba1a65e2c651d59f7f0f0afe0482f53 100644 (file)
@@ -103,6 +103,14 @@ jvm_generate_hard_cast_type(gen_proc_t * p, oberon_type_t * from, oberon_type_t
        }
 }
 
+static void
+check_index(gen_proc_t * p, oberon_type_t * index_type)
+{
+       // TODO проверка валидности границ
+       char prefix = jvm_get_prefix(index_type);
+       jvm_generate_cast_prefix(p, prefix, 'i');
+}
+
 /*
  * Генерирует код для инициализации массива со статическим базовым типом
  * ( aref -- )
@@ -1146,14 +1154,6 @@ oberon_generate_branch(oberon_context_t * ctx, oberon_expr_t * cond, bool gotoif
        }
 }
 
-static void
-check_index(gen_proc_t * p, oberon_type_t * index_type)
-{
-       // TODO проверка валидности границ
-       char prefix = jvm_get_prefix(index_type);
-       jvm_generate_cast_prefix(p, prefix, 'i');
-}
-
 static void
 push_varptr(gen_proc_t * p, oberon_expr_t * expr)
 {
@@ -1286,6 +1286,7 @@ jvm_generate_expr_new_pointer(gen_proc_t * p, oberon_type_t * type, int num, obe
        for(int i = 0; i < num; i++)
        {
                push_expr(p, arg);
+               check_index(p, arg -> result);
                arg = arg -> next;
        }
 
@@ -1350,6 +1351,10 @@ push_item(gen_proc_t * p, oberon_item_t * item)
                        jvm_generate_array_len(p, item -> integer);
                        jvm_generate_cast_prefix(p, 'i', jvm_get_postfix(item -> result));
                        break;
+               case MODE_AS:
+                       push_item(p, item -> parent);
+                       jvm_generate_cast_type(p, item -> parent -> result, item -> result);
+                       break;
                default:
                        gen_error("push_item: unk mode %i", item -> mode);
                        break;