DEADSOFTWARE

Добавлены строки в отладочную информацию класса (быстрохак) master
authorDeaDDooMER <deaddoomer@deadsoftware.ru>
Sun, 8 Oct 2017 15:25:39 +0000 (18:25 +0300)
committerDeaDDooMER <deaddoomer@deadsoftware.ru>
Sun, 8 Oct 2017 15:25:39 +0000 (18:25 +0300)
Test.obn
notes
src/backends/jvm/generator-jvm.c
src/backends/jvm/generator-jvm.h
src/generator.h
src/oberon.c

index 22a2a55a2296d4cb933c58e7bf882acf1207e69e..ea2d143a6b9a4cd952a1d30505f5ff09d90616ea 100644 (file)
--- a/Test.obn
+++ b/Test.obn
@@ -1,15 +1,17 @@
 MODULE Test;
 
-PROCEDURE A(a : INTEGER);
   VAR
     x : INTEGER;
-END A;
+    p : PROCEDURE;
 
-PROCEDURE B(b : SHORTINT);
-  PROCEDURE A(c : LONGINT);
-    VAR
-      y : ARRAY 3 OF INTEGER;
-  END A;
-END B;
+  PROCEDURE X;
+  BEGIN
+    x := 1;
+    x := 2;
+    x := 3;
+    p
+  END X;
 
+BEGIN
+  X;
 END Test.
diff --git a/notes b/notes
index 0aa5f4efc0cfacc852f08c3e7a337ebbba2b959b..9ff5af38d1d1334d8adee189a0d370664dca1269 100644 (file)
--- a/notes
+++ b/notes
@@ -1,7 +1,6 @@
 - Jasmin создаёт ошибку в float константах, надо как-то порешать.
 - Нужно делать проверку границ при касте индекса массива с типом HUGEINT
 
-- Нужно передавать информацию о файле и строках в кодогенератор.
 - Нет процедур привязанных к типм (10.2)
 - Не полная реализация модуля Files 
     * Нет процедур ReadNum WriteNum
index 9cade33f431a92b3db20095545b259c69f93c588..f26c9513e000ca18cc3203fc0e67155b3111398c 100644 (file)
@@ -1988,3 +1988,21 @@ oberon_set_typecheck(oberon_object_t * var, bool enable)
        var -> gen_var -> forcetype = (enable) ? (var -> type -> gen_type) : (NULL);
 }
 
+void oberon_set_line(oberon_context_t * ctx, int line)
+{
+       gen_module_t * m;
+       gen_proc_t * p;
+
+        m = ctx -> mod -> gen_mod;
+       if(m != NULL)
+       {
+               p = m -> class -> p;
+
+               if(p != NULL)
+               {
+                       jvm_generate(p, 0, 0, ".line %i", line);
+               }
+
+               m -> line = line;
+       }
+}
index 44f89324f4c4495a063db9119e0bd1e73e6e1e07..52d59fa0e76eda02d804dffbcf797746dc492239 100644 (file)
@@ -104,6 +104,7 @@ struct gen_module_t
 {
        struct gen_class * class;
        int rec_id;
+       int line;
 };
 
 struct gen_label_t
index 2618ec77e09b856c78a33a094effdc8306c7dd01..03e410ed384f35b620046cde9c969ea17bada88d 100644 (file)
@@ -48,3 +48,5 @@ void oberon_generate_halt(oberon_context_t * ctx, int64_t n);
 void oberon_generate_return(oberon_context_t * ctx, oberon_expr_t * expr);
 
 void oberon_set_out_directory(oberon_context_t * ctx, const char * path);
+
+void oberon_set_line(oberon_context_t * ctx, int line);
index 82566471b9a11b929d832f2d51ef355aa4d23dfc..931a30724697a03476cff779779b3385bad5f2b4 100644 (file)
@@ -390,6 +390,7 @@ oberon_init_scaner(oberon_context_t * ctx, oberon_scanner_t * s)
        ctx -> xloc.col = 1;
        ctx -> loc = ctx -> xloc;
        ctx -> c = ctx -> code[ctx -> code_index];
+       oberon_set_line(ctx, 1);
 }
 
 static void
@@ -721,12 +722,14 @@ oberon_get_lined_char(oberon_context_t * ctx)
                        }
                        ctx -> xloc.line += 1;
                        ctx -> xloc.col = 1;
+                       oberon_set_line(ctx, ctx -> xloc.line);
                }
                else if(ctx -> c == 0xA)
                {
                        oberon_get_char(ctx);
                        ctx -> xloc.line += 1;
                        ctx -> xloc.col = 1;
+                       oberon_set_line(ctx, ctx -> xloc.line);
                }
                else
                {