Kaynağa Gözat

Release candidate for version 1.3.17
Correct type encoding typeArr for arrays of SHORTCHAR in ClassUtil.cp
Fix check for assigning unit-length litStr to a SHORTCHAR destination in ExprDesc.convert()
Include unchecked range limitation for conversions from CHAR to SHORTCHAR in ConvertDn()

k_john_gough_cp 12 yıl önce
ebeveyn
işleme
882371f34a
5 değiştirilmiş dosya ile 30 ekleme ve 15 silme
  1. 1 1
      gpcp/ClassUtil.cp
  2. 11 2
      gpcp/ExprDesc.cp
  3. 2 1
      gpcp/GPCPcopyright.cp
  4. 1 1
      gpcp/JavaMaker.cp
  5. 15 10
      gpcp/JavaUtil.cp

+ 1 - 1
gpcp/ClassUtil.cp

@@ -2323,7 +2323,7 @@ BEGIN
                                "(Ljava/lang/String;)Ljava/lang/Class;");
 
   typeArr[ Ty.boolN] := 4;
-  typeArr[ Ty.sChrN] := 8;
+  typeArr[ Ty.sChrN] := 5;
   typeArr[ Ty.charN] := 5;
   typeArr[ Ty.byteN] := 8;
   typeArr[ Ty.uBytN] := 8;

+ 11 - 2
gpcp/ExprDesc.cp

@@ -2688,15 +2688,24 @@ MODULE ExprDesc;
   (* Make permitted base-type coercions explicit in the AST *)
     VAR rslt : D.Expr;
         expT : D.Type;
+		valu : INTEGER;
   BEGIN
     expT := expr.type;
     IF  (expT = dstT) OR
         (dstT.kind # T.basTp) OR
         (dstT = Builtin.anyPtr) THEN
       RETURN expr;
-    ELSIF (dstT = Builtin.charTp) & (expT = Builtin.strTp) THEN
+    ELSIF (dstT = Builtin.charTp) & (expT = Builtin.strTp) THEN	  
       expr.type := dstT;
-      RETURN expr;
+	  RETURN expr;
+    ELSIF (dstT = Builtin.sChrTp) & (expT = Builtin.strTp) THEN
+      valu := ORD(expr(LeafX).value.chr0());
+	  IF (valu < 255) THEN  
+        expr.type := dstT;
+		RETURN expr;
+      ELSE
+        expr.type := Builtin.charTp;
+      END;
     END;
     IF dstT.includes(expr.type) THEN
       rslt := newIdentX(cvrtUp, dstT.idnt, expr);

+ 2 - 1
gpcp/GPCPcopyright.cp

@@ -47,7 +47,8 @@ MODULE GPCPcopyright;
      (* VERSION    = "1.3.13 of 24 July 2012"; *)
      (* VERSION    = "1.3.14 of 05 September 2012"; *)
      (* VERSION    = "1.3.15 of 04 October 2012"; *)
-        VERSION    = "1.3.16 of 01 January 2013"; 
+     (* VERSION    = "1.3.16 of 01 January 2013"; *)
+        VERSION    = "1.3.17 of 01 June 2013"; 
 	verStr*    = " version " + VERSION;
 
   CONST	prefix     = "#gpcp: ";

+ 1 - 1
gpcp/JavaMaker.cp

@@ -1920,7 +1920,7 @@ MODULE JavaMaker;
               out.PushSReal(exp.value.real());
             END;
         | Xp.strLt  :
-            IF typ = Bi.charTp THEN
+            IF (typ = Bi.charTp) OR (typ = Bi.sChrTp) THEN
               out.PushInt(ORD(exp.value.chr0()));
             ELSE
               out.PushStr(exp.value.chOpen());

+ 15 - 10
gpcp/JavaUtil.cp

@@ -1613,24 +1613,29 @@ MODULE JavaUtil;
 	ELSE  RETURN;				(* PREMATURE RETURN! *)
         END;
     | Ty.sIntN :
-	jf.ConvertDn(inT, Blt.intTp);
-	(* jf.RangeCheck(...); STILL TO DO *)
-	code := Jvm.opc_i2s;
+        jf.ConvertDn(inT, Blt.intTp);
+        (* jf.RangeCheck(...); STILL TO DO *)
+        code := Jvm.opc_i2s;
     | Ty.uBytN :
-	jf.ConvertDn(inT, Blt.intTp);
-	(* jf.RangeCheck(...); STILL TO DO *)
+         jf.ConvertDn(inT, Blt.intTp);
+        (* jf.RangeCheck(...); STILL TO DO *)
         jf.PushInt(255);
-	code := Jvm.opc_iand;
+        code := Jvm.opc_iand;
     | Ty.byteN :
 	jf.ConvertDn(inT, Blt.intTp);
 	(* jf.RangeCheck(...); STILL TO DO *)
 	code := Jvm.opc_i2b;
     | Ty.setN  : 
 	jf.ConvertDn(inT, Blt.intTp); RETURN;	(* PREMATURE RETURN! *)
-    | Ty.charN, Ty.sChrN  : 
-	jf.ConvertDn(inT, Blt.intTp);
-	(* jf.RangeCheck(...); STILL TO DO *)
-	code := Jvm.opc_i2c;
+    | Ty.charN  : 
+        jf.ConvertDn(inT, Blt.intTp);
+        (* jf.RangeCheck(...); STILL TO DO *)
+        code := Jvm.opc_i2c;
+    | Ty.sChrN  : 
+        jf.ConvertDn(inT, Blt.intTp);
+        (* jf.RangeCheck(...); STILL TO DO *)
+        jf.PushInt(255);
+        code := Jvm.opc_iand;
     END;
     jf.Code(code);
   END ConvertDn;