Forráskód Böngészése

non-VAR record parameters are read-only

Vladislav Folts 11 éve
szülő
commit
48189af6ca
2 módosított fájl, 22 hozzáadás és 1 törlés
  1. 2 1
      src/context.js
  2. 20 0
      test/test_unit.js

+ 2 - 1
src/context.js

@@ -584,7 +584,8 @@ exports.ProcDecl = ChainedContext.extend({
     __addArgument: function(name, arg){
         if (name == this.__id.id())
             throw new Errors.Error("argument '" + name + "' has the same name as procedure");
-        var readOnly = !arg.isVar && (arg.type instanceof Type.Array);
+        var readOnly = !arg.isVar 
+                    && (arg.type instanceof Type.Array || arg.type instanceof Type.Record);
         var v = arg.isVar ? Type.makeVariableRef(arg.type)
                           : Type.makeVariable(arg.type, readOnly);
         var s = Symbol.makeSymbol(name, v);

+ 20 - 0
test/test_unit.js

@@ -1249,6 +1249,26 @@ return {
          ["PROCEDURE p(a: ARRAY OF T); BEGIN varInteger(a[0].i) END p",
           "read-only variable cannot be used as VAR parameter"])
     ),
+"RECORD parameter": testWithContext(
+    context(grammar.procedureDeclaration,
+            "TYPE T = RECORD i: INTEGER; p: POINTER TO T END;"
+            + "PROCEDURE intValue(i: INTEGER); END intValue;"
+            + "PROCEDURE intVar(VAR i: INTEGER); END intVar;"
+            + "PROCEDURE recordValue(r: T); END recordValue;"
+            + "PROCEDURE recordVar(VAR r: T); END recordVar;"
+            ),
+    pass("PROCEDURE p(VAR r: T); BEGIN r.i := 0; intVar(r.i); END p",
+         "PROCEDURE p(VAR r: T); BEGIN recordValue(r); recordVar(r); END p",
+         "PROCEDURE p(r: T); BEGIN intValue(r.i); recordValue(r); END p"
+        ),
+    fail(["PROCEDURE p(r: T); BEGIN r.i := 0 END p",
+          "cannot assign to read-only variable"],
+         ["PROCEDURE p(r: T); BEGIN intVar(r.i); END p",
+          "read-only variable cannot be used as VAR parameter"],
+         ["PROCEDURE p(r: T); BEGIN recordVar(r); END p",
+          "read-only variable cannot be used as VAR parameter"]
+        )
+    ),
 "local procedure": testWithContext(
     context(grammar.procedureDeclaration,
             "TYPE ProcType = PROCEDURE;" +