Przeglądaj źródła

fix abstract record import

Vladislav Folts 10 lat temu
rodzic
commit
9f788f5ada
5 zmienionych plików z 11 dodań i 98 usunięć
  1. BIN
      bin/compiled.zip
  2. 2 3
      src/eberon/EberonRecord.ob
  3. 0 92
      src/ob/JsMap.ob
  4. 1 1
      src/ob/Scope.ob
  5. 8 2
      test/test_unit_eberon.js

BIN
bin/compiled.zip


+ 2 - 3
src/eberon/EberonRecord.ob

@@ -511,9 +511,8 @@ BEGIN
 END;
 
 PROCEDURE RecordField.RecordField(identdef: Context.PIdentdefInfo; type: Types.PStorageType; record: PRecord)
-    | SUPER(identdef, type);
-BEGIN
-    SELF.record := record;
+    | SUPER(identdef, type),
+      record(record);
 END;
 
 END EberonRecord.

+ 0 - 92
src/ob/JsMap.ob

@@ -1,92 +0,0 @@
-MODULE JsMap;
-IMPORT JS, Object;
-TYPE
-    Type* = POINTER TO RECORD END;
-    Keys = ARRAY * OF STRING;
-    ForEachProc = PROCEDURE(key: STRING; value: Object.PType; VAR closure: Object.Type);
-    
-    Strings* = POINTER TO RECORD END;
-    ForEachStringProc = PROCEDURE(key: STRING; value: STRING; VAR closure: Object.Type);
-
-PROCEDURE make*(): Type;
-VAR
-    result: Type;
-BEGIN
-    JS.do("result = {}");
-    RETURN result    
-END make;
-
-PROCEDURE makeStrings*(): Strings;
-VAR
-    result: Strings;
-BEGIN
-    JS.do("result = {}");
-    RETURN result    
-END;
-
-PROCEDURE has*(m: Type; s: STRING): BOOLEAN;
-VAR
-    result: BOOLEAN;
-BEGIN
-    JS.do("result = m.hasOwnProperty(s)");
-    RETURN result
-END;
-
-PROCEDURE hasString*(m: Strings; s: STRING): BOOLEAN;
-VAR
-    result: BOOLEAN;
-BEGIN
-    JS.do("result = m.hasOwnProperty(s)");
-    RETURN result
-END;
-
-PROCEDURE find*(m: Type; s: STRING; VAR r: Object.PType): BOOLEAN;
-VAR
-    result: BOOLEAN;
-BEGIN
-    JS.do("if (m.hasOwnProperty(s)){result = true; r.set(m[s]);}");
-    RETURN result
-END find;
-
-PROCEDURE findString*(m: Strings; s: STRING; VAR r: STRING): BOOLEAN;
-VAR
-    result: BOOLEAN;
-BEGIN
-    JS.do("if (m.hasOwnProperty(s)){result = true; r.set(m[s]);}");
-    RETURN result
-END;
-
-PROCEDURE put*(m: Type; s: STRING; o: Object.PType);
-BEGIN
-    JS.do("m[s] = o");
-END put;
-
-PROCEDURE putString*(m: Strings; s: STRING; v: STRING);
-BEGIN
-    JS.do("m[s] = v");
-END;
-
-PROCEDURE erase*(m: Type; s: STRING);
-BEGIN
-    JS.do("delete m[s]");
-END erase;
-
-PROCEDURE keys*(m: Type): Keys;
-VAR
-    result: ARRAY * OF STRING;
-BEGIN
-    JS.do("result = JS.Object.keys(m);");
-    RETURN result;
-END;
-
-PROCEDURE forEach*(m: Type; p: ForEachProc; VAR closure: Object.Type);
-BEGIN
-    JS.do("for(var key in m){p(key, m[key], closure)}");
-END forEach;
-
-PROCEDURE forEachString*(m: Strings; p: ForEachStringProc; VAR closure: Object.Type);
-BEGIN
-    JS.do("for(var key in m){p(key, m[key], closure)}");
-END forEachString;
-
-END JsMap.

+ 1 - 1
src/ob/Scope.ob

@@ -125,7 +125,7 @@ END;
 
 PROCEDURE Type.close();
 BEGIN
-    FOR i <- LEN(SELF.finalizers) - 1 TO 0 BY -1 DO
+    FOR i <- 0 TO LEN(SELF.finalizers) - 1 DO
         finalizer <- SELF.finalizers[i];
         finalizer.proc(finalizer.closure);
     END;

+ 8 - 2
test/test_unit_eberon.js

@@ -316,11 +316,17 @@ exports.suite = {
 "import abstract record": testWithModule(
       "MODULE test;"
     + "TYPE T* = RECORD PROCEDURE m*(); END;"
+    +      "Derived* = RECORD(T) END;"
     + "END test.",
     pass("MODULE m; IMPORT test; TYPE T = RECORD f: POINTER TO test.T; END; END m."
         ),
-    fail(["MODULE m; IMPORT test; TYPE T = RECORD f: test.T; END; END m",
-          "cannot instantiate 'T' because it has abstract method(s): m"])
+    fail(["MODULE m; IMPORT test; TYPE T = RECORD f: test.T; END; END m.",
+          "cannot instantiate 'T' because it has abstract method(s): m"],
+         ["MODULE m; IMPORT test; TYPE T = RECORD(test.T) END; VAR r: T; END m.",
+          "cannot instantiate 'T' because it has abstract method(s): m"],
+         ["MODULE m; IMPORT test; TYPE T = RECORD(test.Derived) END; VAR r: T; END m.",
+          "cannot instantiate 'T' because it has abstract method(s): m"]
+        )
     ),
 "non-scalar variables can be exported": testWithContext(
     context(grammar.declarationSequence,