DEADSOFTWARE

Добавлена загрузка исходника из файла
authorDeaDDooMER <deaddoomer@deadsoftware.ru>
Wed, 9 Aug 2017 14:05:35 +0000 (17:05 +0300)
committerDeaDDooMER <deaddoomer@deadsoftware.ru>
Wed, 9 Aug 2017 14:05:35 +0000 (17:05 +0300)
Out.obn [new file with mode: 0644]
Test.obn [new file with mode: 0644]
jvm_test.sh
notes
run.sh
src/backends/jvm/generator-jvm-abi.c
src/test.c

diff --git a/Out.obn b/Out.obn
new file mode 100644 (file)
index 0000000..dce767c
--- /dev/null
+++ b/Out.obn
@@ -0,0 +1,24 @@
+MODULE Out;
+
+PROCEDURE Open*;
+END Open;
+
+PROCEDURE Char*(ch : CHAR);
+END Char;
+
+PROCEDURE String*(str : ARRAY OF CHAR);
+END String;
+
+PROCEDURE Int*(i, n : LONGINT);
+END Int;
+
+PROCEDURE Real*(x : REAL; n : INTEGER);
+END Real;
+
+PROCEDURE LongReal*(x : LONGREAL; n : INTEGER);
+END LongReal;
+
+PROCEDURE Ln*;
+END Ln;
+
+END Out.
diff --git a/Test.obn b/Test.obn
new file mode 100644 (file)
index 0000000..8249fb7
--- /dev/null
+++ b/Test.obn
@@ -0,0 +1,8 @@
+MODULE Test;
+
+IMPORT Out;
+
+BEGIN
+  Out.Open;
+  Out.String("Hello World!"); Out.Ln;
+END Test.
index 6519656ef1f13317b42551fb8e3b63bf9a35f1cc..4944b91404c0099a0e36e1aede03e4fc679630dd 100755 (executable)
@@ -8,7 +8,7 @@ rm -rf classes
 rm -f *.j *.jad
 mkdir -p classes
 
-./run.sh
+./run.sh $*
 
 javac -d classes Launcher.java
 jasmin -d classes *.j
diff --git a/notes b/notes
index b6f9cdd9019b12eaca3a4b8183b84af4e8ffebef..1e0a9e58c2a1176e3c9b99fc2bc23b97da5523a2 100644 (file)
--- a/notes
+++ b/notes
@@ -5,10 +5,10 @@
 - Не реализована свёртка констант
 - Нужно пробежаться по стандарту и всё перепроверить.
 
-- JVM: Не реализованы VAR-параметры.
-- JVM: Не реализованы локальные процедуры.
 - JVM: Не реализовано полное сранение массивов.
 - JVM: Не реализовано полное сранение записей.
+- JVM: Не достаточно средств для реализации рефлексии на уровне локальных процедур.
+    (Как минимум нужно каждой функции добавлять фрейм к параметрам)
 
 - Нужны средства создания биндингов. На данный момент реализуемо как заглушки для модулей.
 - Любая ошибка фатальна
diff --git a/run.sh b/run.sh
index 58023d2a432f2c23471c6d78395f8c59eb797f14..f53eb55a689bfb7b09f28ec9bbf35f4365323a94 100755 (executable)
--- a/run.sh
+++ b/run.sh
@@ -5,4 +5,4 @@ set -e
 export PATH="/usr/lib/gcc/x86_64-pc-linux-gnu/7.1.1:${PATH}"
 export LIBRARY_PATH="/usr/lib/gcc/x86_64-pc-linux-gnu/7.1.1:${LIBRARY_PATH}"
 
-exec ./a.out
+exec ./a.out $*
index a750b927fb170a568a27f0f5bc29fe1ab6bdf038..ddaf45f77cfe6e9e66b535adef6e1413ee5144fa 100644 (file)
 #include "generator-jvm-asm.h"
 #include "generator-jvm-basic.h"
 
-/*
- *   --- Каждый модуль является объектом.
- *       Импортируемые модули представляются полями.
- *       Каждая глобальная переменная представляется не статическим полем.
- *       Каждая процедура представляется не статическим метеодом.
- *       Процедура инициализации модуля имеет название BEGIN.
- *       Процедура финализации модуля имеет название END.
- *         Это позволит сделать динамическую загрузку и выгрузку.
- *   +++ всем переменным и полям в дескриптор добавляется "["
- *         Это позволит делать ссылки на переменные в VAR-параметрах.
- *   --- Каждая процедура снабжается параметром-фреймом.
- *         Это позволит реализовать локальные процедуры и средства рефлекции над стеком.
- */ 
-
 void
 jvm_generate_ldst_prepare(gen_proc_t * p, gen_var_t * v)
 {
index ad95a34cf1f36fc78a7ed440cff0f1cbfccdd7ea..8029be718d08bc4823e6723657a66441b68fe651 100644 (file)
 #include <stdio.h>
+#include <stdlib.h>
 #include <string.h>
 #include <assert.h>
 
 #include "../include/oberon.h"
 
-static char source_test[] =
-       "(* Main module *)"
-       "MODULE Test;"
-       "IMPORT Out;"
-       ""
-       "VAR i : INTEGER;"
-       ""
-       "PROCEDURE X(VAR x : INTEGER; y : INTEGER);"
-       "  VAR"
-       "    q, w, r : INTEGER;"
-       "  PROCEDURE Y;"
-       "    VAR levY : INTEGER;"
-       "  BEGIN"
-       "    x := 3345;"
-       "    q := 666;"
-       "  END Y;"
-       "BEGIN"
-       "  x := 54646;"
-       "  q := 1;"
-       "  Y;"
-       "  Out.String('Pos Y: q = '); Out.Int(q, 0); Out.Ln;"
-       "END X;"
-       ""
-       "BEGIN;"
-       "  i := 1;"
-       "  X(i, i);"
-       "  Out.Int(i, 0); Out.Ln;"
-       "END Test."
-;
-
-static char source_out[] =
-       "MODULE Out;"
-       "  PROCEDURE Open*;"
-       "  END Open;"
-       ""
-       "  PROCEDURE Char* (ch : CHAR);"
-       "  END Char;"
-       ""
-       "  PROCEDURE String* (str : ARRAY OF CHAR);"
-       "  END String;"
-       ""
-       "  PROCEDURE Int*(i, n : LONGINT);"
-       "  END Int;"
-       ""
-       "  PROCEDURE Real*(x : REAL; n : INTEGER);"
-       "  END Real;"
-       ""
-       "  PROCEDURE LongReal*(x : LONGREAL; n : INTEGER);"
-       "  END LongReal;"
-       ""
-       "  PROCEDURE Ln*;"
-       "  END Ln;"
-       ""
-       "END Out."
-;
-
 static oberon_context_t * ctx;
 static oberon_module_t * mod;
 
 static const char *
 import_module(const char * name)
 {
-       if(strcmp(name, "Test") == 0)
-       {
-               return source_test;
-       }
-       else if(strcmp(name, "Out") == 0)
-       {
-               return source_out;
-       }
-       else
-       {
-               return NULL;
-       }
-}
-
-typedef void (*TOutOpen)();
-static TOutOpen * OutOpenPtr;
-void ImplOutOpen()
-{
-}
+       assert(name);
 
-typedef void (*TOutInt)(int, int);
-static TOutInt * OutIntPtr;
-void ImplOutInt(int i, int n)
-{
-       char number[22];
-       snprintf(number, 22, "%d", i);
-       int len = strlen(number);
-       for(int i = 0; i < n - len; i++)
+       FILE * fp;
+       char fname[256];
+       snprintf(fname, 256, "%s.obn", name);
+       fp = fopen(fname, "r");
+       if(fp == NULL)
        {
-               putchar(' ');
+               printf("can't open file %s\n", fname);
+               exit(1);
+               return NULL;
        }
-       printf("%s", number);
-}
 
-typedef void (*TOutReal)(float, int);
-static TOutReal * OutRealPtr;
-void ImplOutReal(float i, int n)
-{
-       char number[32];
-       snprintf(number, 32, "%F", i);
-       int len = strlen(number);
-       for(int i = 0; i < n - len; i++)
-       {
-               putchar(' ');
-       }
-       printf("%s", number);
-}
+       char * source;
+       size_t len;
 
-typedef void (*TOutLn)();
-static TOutLn * OutLnPtr;
-void ImplOutLn()
-{
-       putchar('\n');
-}
+       fseek(fp, 0, SEEK_END);
+       len = ftell(fp);
+       fseek(fp, 0, SEEK_SET);
 
-void init_system_modules()
-{
-       OutOpenPtr = oberon_generator_get_var(ctx, "Out_Open");
-       *OutOpenPtr = ImplOutOpen;
-       OutIntPtr = oberon_generator_get_var(ctx, "Out_Int");
-       *OutIntPtr = ImplOutInt;
-       OutRealPtr = oberon_generator_get_var(ctx, "Out_Real");
-       *OutRealPtr = ImplOutReal;
-       OutLnPtr = oberon_generator_get_var(ctx, "Out_Ln");
-       *OutLnPtr = ImplOutLn;
-}
+       source = calloc(1, len + 1);
+       fread(source, len, 1, fp);
 
-void start_module()
-{
-       void (*begin)() = oberon_generator_get_procedure(ctx, "Test_BEGIN");
-       begin();
+       return source;
 }
 
 int
 main(int argc, char ** argv)
 {
-       ctx = oberon_create_context(import_module);
-       mod = oberon_compile_module(ctx, source_test);
-
-       oberon_generate_code(ctx);
+       const char * code;
 
-//     init_system_modules();
+       if(argc != 2)
+       {
+               printf("use: %s <source>\n", argv[0]);
+               return 1;
+       }
 
-//     oberon_generator_dump(ctx, "dump.txt");
+       code = import_module(argv[1]);
 
-//     start_module();
+       ctx = oberon_create_context(import_module);
+       mod = oberon_compile_module(ctx, code);
 
+       oberon_generate_code(ctx);
        oberon_destroy_context(ctx);
        return 0;
 }