DEADSOFTWARE

Исправен конфликт имён локальных и глобальных процедур
[dsw-obn.git] / src / oberon.c
index 04eaf8c8fd29e32e6b5318db2981e64d2a02b2cd..82566471b9a11b929d832f2d51ef355aa4d23dfc 100644 (file)
@@ -305,6 +305,21 @@ oberon_find_object(oberon_scope_t * scope, char * name, bool check_it)
        return result;
 }
 
+static oberon_object_t *
+oberon_find_object_in_scope(oberon_scope_t * scope, char * name, bool check_it)
+{
+       oberon_object_t * result = NULL;
+
+       result = oberon_find_object_in_list(scope -> list, name);
+
+       if(check_it && result == NULL)
+       {
+               oberon_error(scope -> ctx, "undefined ident %s", name);
+       }
+
+       return result;
+}
+
 static oberon_object_t *
 oberon_create_object(oberon_scope_t * scope, char * name, int class, bool export, bool read_only)
 {
@@ -2447,6 +2462,12 @@ oberon_proc_decl(oberon_context_t * ctx)
        char * name;
        int export;
        int read_only;
+
+       if(ctx -> token == STAR)
+       {
+               oberon_assert_token(ctx, STAR);
+       }
+
        name = oberon_assert_ident(ctx);
        oberon_def(ctx, &export, &read_only);
 
@@ -2463,7 +2484,7 @@ oberon_proc_decl(oberon_context_t * ctx)
        oberon_close_scope(ctx -> decl);
 
        oberon_object_t * proc;
-       proc = oberon_find_object(ctx -> decl, name, 0);
+       proc = oberon_find_object_in_scope(ctx -> decl, name, 0);
        if(proc == NULL)
        {
                proc = oberon_define_object(ctx -> decl, name, OBERON_CLASS_PROC, export, read_only, false);
@@ -3141,33 +3162,34 @@ oberon_prevent_undeclarated_procedures(oberon_context_t * ctx)
 static void
 oberon_decl_seq(oberon_context_t * ctx)
 {
-       if(ctx -> token == CONST)
+       while(ctx -> token >= CONST && ctx -> token <= VAR)
        {
-               oberon_assert_token(ctx, CONST);
-               while(ctx -> token == IDENT)
+               if(ctx -> token == CONST)
                {
-                       oberon_const_decl(ctx);
-                       oberon_assert_token(ctx, SEMICOLON);
+                       oberon_assert_token(ctx, CONST);
+                       while(ctx -> token == IDENT)
+                       {
+                               oberon_const_decl(ctx);
+                               oberon_assert_token(ctx, SEMICOLON);
+                       }
                }
-       }
-
-       if(ctx -> token == TYPE)
-       {
-               oberon_assert_token(ctx, TYPE);
-               while(ctx -> token == IDENT)
+               else if(ctx -> token == TYPE)
                {
-                       oberon_type_decl(ctx);
-                       oberon_assert_token(ctx, SEMICOLON);
+                       oberon_assert_token(ctx, TYPE);
+                       while(ctx -> token == IDENT)
+                       {
+                               oberon_type_decl(ctx);
+                               oberon_assert_token(ctx, SEMICOLON);
+                       }
                }
-       }
-
-       if(ctx -> token == VAR)
-       {
-               oberon_assert_token(ctx, VAR);
-               while(ctx -> token == IDENT)
+               else if(ctx -> token == VAR)
                {
-                       oberon_var_decl(ctx);
-                       oberon_assert_token(ctx, SEMICOLON);
+                       oberon_assert_token(ctx, VAR);
+                       while(ctx -> token == IDENT)
+                       {
+                               oberon_var_decl(ctx);
+                               oberon_assert_token(ctx, SEMICOLON);
+                       }
                }
        }
 
@@ -4957,7 +4979,10 @@ oberon_create_context(ModuleImportCallback import_module)
                /* Types */
                oberon_new_intrinsic_type(ctx, "BYTE", ctx -> system_byte_type);
                oberon_new_intrinsic_type(ctx, "PTR", ctx -> system_ptr_type);
+               oberon_new_intrinsic_type(ctx, "INT8", ctx -> byte_type);
+               oberon_new_intrinsic_type(ctx, "INT16", ctx -> shortint_type);
                oberon_new_intrinsic_type(ctx, "INT32", ctx -> int_type);
+               oberon_new_intrinsic_type(ctx, "INT64", ctx -> longint_type);
                oberon_new_intrinsic_type(ctx, "SET32", ctx -> set_type);
 
                /* Functions */