DEADSOFTWARE

Добавлены функции CHR ENTIER LEN ORD
[dsw-obn.git] / src / backends / jvm / generator-jvm.c
index c2fd9abd4662bef894b32ae159650e7cdcb4baa2..5b45cc166bca184d32d0640a24f9f90a016617ef 100644 (file)
@@ -1136,6 +1136,19 @@ jvm_generate_expr_new_pointer(gen_proc_t * p, oberon_type_t * type, int num, obe
        jvm_generate_new(p, type -> base, num);
 }
 
+static void
+jvm_generate_cast_prefix(gen_proc_t * p, char prefix, char postfix)
+{
+       if(prefix == postfix)
+       {
+               return;
+       }
+
+       int from_cell_size = jvm_cell_size_for_postfix(prefix);
+       int to_cell_size = jvm_cell_size_for_postfix(postfix);
+       jvm_generate(p, from_cell_size, to_cell_size, "%c2%c", prefix, postfix);
+}
+
 static void
 jvm_generate_cast_type(gen_proc_t * p, oberon_type_t * from, oberon_type_t * to)
 {
@@ -1151,17 +1164,7 @@ jvm_generate_cast_type(gen_proc_t * p, oberon_type_t * from, oberon_type_t * to)
        {
                char prefix = jvm_get_prefix(from);
                char postfix = jvm_get_postfix(to);
-               int from_cell_size = jvm_cell_size_for_type(from);
-               int to_cell_size = jvm_cell_size_for_type(to);
-
-               jvm_generate_comment(p, "cast type class from %i(%i) to %i(%i)", from -> class, from -> size, to -> class, to -> size);
-
-               if(prefix == postfix)
-               {
-                       return;
-               }
-
-               jvm_generate(p, from_cell_size, to_cell_size, "%c2%c", prefix, postfix);
+               jvm_generate_cast_prefix(p, prefix, postfix);
        }
 }
 
@@ -1217,6 +1220,11 @@ push_item(gen_proc_t * p, oberon_item_t * item)
                case MODE_STRING:
                        jvm_generate_push_string(p, item -> string, item -> result -> size);
                        break;
+               case MODE_LEN:
+                       push_item(p, item -> parent);
+                       jvm_generate_array_len(p, item -> integer);
+                       jvm_generate_cast_prefix(p, 'i', jvm_get_postfix(item -> result));
+                       break;
                default:
                        gen_error("push_item: unk mode %i", item -> mode);
                        break;
@@ -1555,6 +1563,18 @@ jvm_generate_ash(gen_proc_t * p, oberon_expr_t * a, oberon_expr_t * b)
        jvm_generate_label(p, label_end);
 }
 
+static void
+jvm_generate_entier(gen_proc_t * p, oberon_expr_t * x, oberon_type_t * res)
+{
+       char prefix = jvm_get_prefix(x -> result);
+       char postfix = jvm_get_postfix(res);
+
+       push_expr(p, x);
+       jvm_generate_cast_prefix(p, prefix, 'd');
+       jvm_generate(p, 2, 2, "invokestatic java/lang/Math/floor(D)D");
+       jvm_generate_cast_prefix(p, 'd', postfix);
+}
+
 static void
 push_operator(gen_proc_t * p, oberon_oper_t * oper)
 {
@@ -1574,6 +1594,9 @@ push_operator(gen_proc_t * p, oberon_oper_t * oper)
                        push_expr(p, oper -> left);
                        jvm_generate_operator(p, preq, op);
                        break;
+               case OP_ENTIER:
+                       jvm_generate_entier(p, oper -> left, oper -> result);
+                       break;
 
                case OP_ADD:
                case OP_SUB: