DEADSOFTWARE

Добавлен модуль SYSTEM и тип SYSTEM.TYPE
[dsw-obn.git] / src / oberon.c
index 365f47d6a107ac047dbe13e5f3293a5ea138123d..0bbeec188b3d5b4e7fafe506285a9d096cb809b7 100644 (file)
@@ -261,7 +261,6 @@ oberon_find_object_in_list(oberon_object_t * list, char * name)
        oberon_object_t * x = list;
        while(x -> next && strcmp(x -> next -> name, name) != 0)
        {
-               printf("inlist: '%s' != '%s'\n", x -> next -> name, name);
                x = x -> next;
        }
        return x -> next;
@@ -290,7 +289,6 @@ oberon_find_object(oberon_scope_t * scope, char * name, bool check_it)
 static oberon_object_t *
 oberon_create_object(oberon_scope_t * scope, char * name, int class, bool export, bool read_only)
 {
-       printf("oberon_create_object: '%s'\n", name);
        oberon_object_t * newvar = GC_MALLOC(sizeof *newvar);
        memset(newvar, 0, sizeof *newvar);
        newvar -> name = name;
@@ -318,7 +316,6 @@ oberon_define_object(oberon_scope_t * scope, char * name, int class, bool export
        oberon_object_t * x = scope -> list;
        while(x -> next && strcmp(x -> next -> name, name) != 0)
        {
-               printf("inlist: '%s' != '%s'\n", x -> next -> name, name);
                x = x -> next;
        }
 
@@ -334,16 +331,6 @@ oberon_define_object(oberon_scope_t * scope, char * name, int class, bool export
        return newvar;
 }
 
-static oberon_object_t *
-oberon_define_type(oberon_scope_t * scope, char * name, oberon_type_t * type, int export)
-{
-       oberon_object_t * id;
-       id = oberon_define_object(scope, name, OBERON_CLASS_TYPE, export, false, false);
-       id -> type = type;
-       oberon_generator_init_type(scope -> ctx, type);
-       return id;
-}
-
 // =======================================================================
 //   SCANER
 // ======================================================================= 
@@ -1137,7 +1124,8 @@ oberon_autocast_call(oberon_context_t * ctx, oberon_item_t * desig)
                        {
                                oberon_check_compatible_var_param(ctx, param -> type, arg -> result);
                        }
-                       casted[i] = oberon_cast_expr(ctx, arg, param -> type);
+                       casted[i] = arg;
+                       //casted[i] = oberon_cast_expr(ctx, arg, param -> type);
                }
                else
                {
@@ -4476,34 +4464,36 @@ register_default_types(oberon_context_t * ctx)
        oberon_generator_init_type(ctx, ctx -> string_type);
 
        ctx -> bool_type = oberon_new_type_boolean();
-       oberon_define_type(ctx -> world_scope, "BOOLEAN", ctx -> bool_type, 1);
+       oberon_generator_init_type(ctx, ctx -> bool_type);
 
        ctx -> char_type = oberon_new_type_char(1);
-       oberon_define_type(ctx -> world_scope, "CHAR", ctx -> char_type, 1);
+       oberon_generator_init_type(ctx, ctx -> char_type);
 
        ctx -> byte_type = oberon_new_type_integer(1);
-       oberon_define_type(ctx -> world_scope, "SHORTINT", ctx -> byte_type, 1);
+       oberon_generator_init_type(ctx, ctx -> byte_type);
 
        ctx -> shortint_type = oberon_new_type_integer(2);
-       oberon_define_type(ctx -> world_scope, "INTEGER", ctx -> shortint_type, 1);
+       oberon_generator_init_type(ctx, ctx -> shortint_type);
 
        ctx -> int_type = oberon_new_type_integer(4);
-       oberon_define_type(ctx -> world_scope, "LONGINT", ctx -> int_type, 1);
+       oberon_generator_init_type(ctx, ctx -> int_type);
 
        ctx -> longint_type = oberon_new_type_integer(8);
-       oberon_define_type(ctx -> world_scope, "HUGEINT", ctx -> longint_type, 1);
+       oberon_generator_init_type(ctx, ctx -> longint_type);
 
        ctx -> real_type = oberon_new_type_real(4);
-       oberon_define_type(ctx -> world_scope, "REAL", ctx -> real_type, 1);
+       oberon_generator_init_type(ctx, ctx -> real_type);
 
        ctx -> longreal_type = oberon_new_type_real(8);
-       oberon_define_type(ctx -> world_scope, "LONGREAL", ctx -> longreal_type, 1);
+       oberon_generator_init_type(ctx, ctx -> longreal_type);
 
        ctx -> set_type = oberon_new_type_set(4);
-       oberon_define_type(ctx -> world_scope, "SET", ctx -> set_type, 1);
-
+       oberon_generator_init_type(ctx, ctx -> set_type);
 
+       ctx -> system_byte_type = oberon_new_type_ptr(OBERON_TYPE_SYSTEM_BYTE);
+       oberon_generator_init_type(ctx, ctx -> system_byte_type);
 
+       /* LONG / SHORT support */
        ctx -> byte_type -> shorter = NULL;
        ctx -> byte_type -> longer = ctx -> shortint_type;
 
@@ -4534,6 +4524,41 @@ oberon_new_intrinsic(oberon_context_t * ctx, char * name, GenerateFuncCallback f
        proc -> type -> genproc = p;
 }
 
+static void oberon_new_intrinsic_type(oberon_context_t * ctx, char * name, oberon_type_t * type)
+{
+       oberon_object_t * id;
+       id = oberon_define_object(ctx -> decl, name, OBERON_CLASS_TYPE, true, false, false);
+       id -> type = type;
+}
+
+static void
+oberon_begin_intrinsic_module(oberon_context_t * ctx, char * name, oberon_module_t ** m)
+{
+       oberon_scope_t * module_scope;
+       module_scope = oberon_open_scope(ctx);
+
+       oberon_module_t * module;
+       module = GC_MALLOC(sizeof *module);
+       memset(module, 0, sizeof *module);
+       module -> name = name;
+       module -> intrinsic = true;
+       module -> decl = module_scope;
+       module -> next = ctx -> module_list;
+
+       ctx -> mod = module;
+       ctx -> module_list = module;
+
+       *m = module;
+}
+
+static void
+oberon_end_intrinsic_module(oberon_context_t * ctx, oberon_module_t * m)
+{
+       oberon_close_scope(m -> decl);
+       m -> ready = true;
+       ctx -> mod = NULL;
+}
+
 oberon_context_t *
 oberon_create_context(ModuleImportCallback import_module)
 {
@@ -4548,12 +4573,24 @@ oberon_create_context(ModuleImportCallback import_module)
 
        oberon_generator_init_context(ctx);
 
+       /* Types */
        register_default_types(ctx);
 
        /* Constants */
        oberon_new_const(ctx, "TRUE", oberon_make_boolean(ctx, true));
        oberon_new_const(ctx, "FALSE", oberon_make_boolean(ctx, false));
 
+       /* Types */
+       oberon_new_intrinsic_type(ctx, "BOOLEAN", ctx -> bool_type);
+       oberon_new_intrinsic_type(ctx, "CHAR", ctx -> char_type);
+       oberon_new_intrinsic_type(ctx, "SHORTINT", ctx -> byte_type);
+       oberon_new_intrinsic_type(ctx, "INTEGER", ctx -> shortint_type);
+       oberon_new_intrinsic_type(ctx, "LONGINT", ctx -> int_type);
+       oberon_new_intrinsic_type(ctx, "HUGEINT", ctx -> longint_type);
+       oberon_new_intrinsic_type(ctx, "REAL", ctx -> real_type);
+       oberon_new_intrinsic_type(ctx, "LONGREAL", ctx -> longreal_type);
+       oberon_new_intrinsic_type(ctx, "SET", ctx -> set_type);
+
        /* Functions */
        oberon_new_intrinsic(ctx, "ABS", oberon_make_abs_call, NULL);
        oberon_new_intrinsic(ctx, "ASH", oberon_make_ash_call, NULL);
@@ -4579,6 +4616,14 @@ oberon_create_context(ModuleImportCallback import_module)
        oberon_new_intrinsic(ctx, "INCL", NULL, oberon_make_incl_call);
        oberon_new_intrinsic(ctx, "NEW", NULL, oberon_make_new_call);
 
+       /* MODULE SYSTEM */
+       oberon_begin_intrinsic_module(ctx, "SYSTEM", &ctx -> system_module);
+
+               /* Types */
+               oberon_new_intrinsic_type(ctx, "BYTE", ctx -> system_byte_type);
+
+       oberon_end_intrinsic_module(ctx, ctx -> system_module);
+
        return ctx;
 }