瀏覽代碼

BYTE and INTEGER are not compatible as components of PRECEDURE type.

Vladislav Folts 11 年之前
父節點
當前提交
b4160a80c8
共有 2 個文件被更改,包括 20 次插入9 次删除
  1. 11 8
      src/cast.js
  2. 9 1
      test/test_unit.js

+ 11 - 8
src/cast.js

@@ -23,23 +23,26 @@ function matchesToNIL(t){
     return t instanceof PointerType || t instanceof ProcedureType;
 }
 
-function areTypesMatch(t1, t2){
+function areTypesExactlyMatch(t1, t2){
     if (t1 == t2)
         return true;
-    if (Type.isInt(t1) && Type.isInt(t2))
-        return true;
     if (t1 instanceof ArrayType && t2 instanceof ArrayType)
         return t1.length() === t2.length() && areTypesMatch(t1.elementsType(), t2.elementsType());
     if (t1 instanceof PointerType && t2 instanceof PointerType)
         return areTypesMatch(t1.baseType(), t2.baseType());
     if (t1 instanceof ProcedureType && t2 instanceof ProcedureType)
         return areProceduresMatch(t1, t2);
-    if (t1 == Type.nil && matchesToNIL(t2)
-        || t2 == Type.nil && matchesToNIL(t1))
-        return true;
     return false;
 }
 
+function areTypesMatch(t1, t2){
+    return areTypesExactlyMatch(t1, t2)
+        || (Type.isInt(t1) && Type.isInt(t2))
+        || (t1 == Type.nil && matchesToNIL(t2)
+            || t2 == Type.nil && matchesToNIL(t1))
+        ;
+}
+
 function areProceduresMatch(p1, p2){
     var args1 = p1.args();
     var args2 = p2.args();
@@ -52,7 +55,7 @@ function areProceduresMatch(p1, p2){
         if (a1.isVar != a2.isVar)
             return false;
         if (a1.type != p1 && a2.type != p2
-            &&!areTypesMatch(a1.type, a2.type))
+            &&!areTypesExactlyMatch(a1.type, a2.type))
             return false;
     }
 
@@ -60,7 +63,7 @@ function areProceduresMatch(p1, p2){
     var r2 = p2.result();
     if (r1 == p1 && r2 == p2)
         return true;
-    return areTypesMatch(r1, r2);
+    return areTypesExactlyMatch(r1, r2);
 }
 
 function implicitCast(from, to, ops){

+ 9 - 1
test/test_unit.js

@@ -1112,9 +1112,13 @@ var testSuite = {
                 + "v5: PROCEDURE(p: ProcType1); v6: PROCEDURE(p: ProcType2);"
                 + "v7: ProcType3; v8: ProcType4; v8VAR: ProcType4VAR; v9: ProcType5; v10: ProcType6; v11: ProcType7;"
                 + "vProcCharArray: PROCEDURE (a: ARRAY OF CHAR);"
+                + "vProcInt: PROCEDURE (i: INTEGER);"
+                + "vProcReturnInt: PROCEDURE(): INTEGER;"
             + "PROCEDURE p1(): ProcType1; RETURN p1 END p1;"
             + "PROCEDURE procCharArray(a: ARRAY OF CHAR); END procCharArray;"
             + "PROCEDURE procIntArray(a: ARRAY OF INTEGER); END procIntArray;"
+            + "PROCEDURE procByte(b: BYTE); END procByte;"
+            + "PROCEDURE procReturnByte(): BYTE; RETURN 0 END procReturnByte;"
             ),
     pass("v1 := v2",
          "v5 := v6",
@@ -1133,7 +1137,11 @@ var testSuite = {
          ["v10 := v11", "type mismatch: 'v10' is 'ProcType6' and cannot be assigned to 'ProcType7' expression" ],
          ["v8 := v8VAR", "type mismatch: 'v8' is 'ProcType4' and cannot be assigned to 'ProcType4VAR' expression" ],
          ["vProcCharArray := procIntArray",
-          "type mismatch: 'vProcCharArray' is 'PROCEDURE(ARRAY OF CHAR)' and cannot be assigned to 'PROCEDURE(ARRAY OF INTEGER)' expression"]
+          "type mismatch: 'vProcCharArray' is 'PROCEDURE(ARRAY OF CHAR)' and cannot be assigned to 'PROCEDURE(ARRAY OF INTEGER)' expression"],
+         ["vProcInt := procByte",
+          "type mismatch: 'vProcInt' is 'PROCEDURE(INTEGER)' and cannot be assigned to 'PROCEDURE(BYTE)' expression"],
+         ["vProcReturnInt := procReturnByte",
+          "type mismatch: 'vProcReturnInt' is 'PROCEDURE(): INTEGER' and cannot be assigned to 'PROCEDURE(): BYTE' expression"]
          )
     ),
 "string assignment": testWithContext(