浏览代码

Clean up cross-compilation infrastructure

k-john-gough 8 年之前
父节点
当前提交
c062fc9c2f
共有 9 个文件被更改,包括 129 次插入22 次删除
  1. 12 7
      gpcp/CompState.cp
  2. 1 1
      gpcp/GPCPcopyright.cp
  3. 9 11
      gpcp/JavaMaker.cp
  4. 37 0
      gpcp/JavaTarget.cp
  5. 32 0
      gpcp/JavaTargetForCLR.cp
  6. 35 0
      gpcp/JavaTargetForJVM.cp
  7. 1 1
      gpcp/StatDesc.cp
  8. 1 1
      gpcp/Target.cp
  9. 1 1
      libs/csharp/RTS.cs

+ 12 - 7
gpcp/CompState.cp

@@ -418,16 +418,10 @@ PrintLn("       -DCPSYM=$CPSYM    pass value of CPSYM environment variable to JR
                ( asmVer[0] < '5') OR (asmVer[0] > '8') THEN 
               Unknown(opt);
             ELSE
-            (*
-              IF ~quiet THEN
-                Message( "ASM emitter, using jvm classfile version V1_" + asmVer$);
-              END;
-             *)
               doCode     := TRUE;
               doAsm5     := TRUE;
               expectedJvm := TRUE;
             END;
-           
           ELSE 
             Unknown(opt);
           END;
@@ -657,6 +651,17 @@ PrintLn("       -DCPSYM=$CPSYM    pass value of CPSYM environment variable to JR
           expectedNet := FALSE;
         END;
       END;
+     (*
+      *  If gpcp is running on the CLR, then (currently) 
+      *  the asm5 emitter is not supported.
+      *)
+      IF (RTS.defaultTarget = "net") & doAsm5  THEN
+        Message
+          ("WARNING - gpcp-CLR does not support ASM5, using -legacy emitter"); 
+        doDWC      := TRUE;
+        doCode     := TRUE;
+        doAsm5     := FALSE;
+      END;
      (* 
       *  If debug is set, for this version, ILASM is used unless /perwapi is explicit
       *  If debug is clar, for this versin, PERWAPI is used unless /ilasm is explicit
@@ -744,7 +749,7 @@ PrintLn("       -DCPSYM=$CPSYM    pass value of CPSYM environment variable to JR
     forcePerwapi := FALSE;
     doCode      := TRUE;
     doAsm       := TRUE;
-    doAsm5      := TRUE;
+    doAsm5      := (RTS.defaultTarget = "jvm");
     doDWC       := FALSE;
     special     := FALSE;
     strict      := FALSE;

+ 1 - 1
gpcp/GPCPcopyright.cp

@@ -53,7 +53,7 @@ MODULE GPCPcopyright;
      (* VERSION    = "1.4.00 of 17 August 2016"; *)
      (* VERSION    = "1.4.01 of 21 October 2016"; *)
      (* VERSION    = "1.4.02 of 14 November 2016"; *)
-        VERSION    = "1.4.03 of 26 May 2017"; 
+        VERSION    = "1.4.03 of 13 June 2017"; 
 	verStr*    = " version " + VERSION;
 
   CONST	prefix     = "#gpcp: ";

+ 9 - 11
gpcp/JavaMaker.cp

@@ -16,14 +16,13 @@ MODULE JavaMaker;
         CPascalS,
         FileNames,
         ClassMaker,
-        JavaUtil,
+        JavaTarget,
+        Ju := JavaUtil,
         JavaBase,
         ClassUtil,
-        AsmUtil,
         JsmnUtil,
         CSt := CompState,
         Jvm := JVMcodes,
-        Ju  := JavaUtil,
         Bi := Builtin,
         Sy := Symbols,
         Id := IdDesc,
@@ -630,7 +629,7 @@ MODULE JavaMaker;
   PROCEDURE (this : JavaEmitter)Emit*();
   (** Create the assembler for a class file for this module. *)
   VAR fileName  : FileNames.NameString;
-      cf : JavaUtil.JavaFile;
+      cf : Ju.JavaFile;
       jf : JsmnUtil.JsmnFile;
   BEGIN
    (*
@@ -650,13 +649,12 @@ MODULE JavaMaker;
           L.ToStr(this.prcT.xName, fileName);
       END;
       fileName := fileName + ".class";
-      IF CSt.doAsm5 THEN
-        cf := AsmUtil.newAsmEmitter(fileName);
-      ELSIF CSt.doDWC THEN
-        cf := ClassUtil.newClassFile(fileName);
-      ELSE
-        THROW( "no jvm emitter chosen" );
-      END;
+     (* 
+      *  Target will select a Java emitter
+      *  that depends on the gpcp options and
+      *  the platform on which gpcp is running.
+      *)
+      cf := JavaTarget.NewJavaEmitter(fileName);
       this.outF := cf;
     ELSE
       WITH this : JavaModEmitter DO

+ 37 - 0
gpcp/JavaTarget.cp

@@ -0,0 +1,37 @@
+(* ============================================================ *)
+(*  Target is the module which selects the target ClassMaker.	*)
+(*  Copyright (c) John Gough 1999, 2017.			*)
+(* ============================================================ *)
+
+MODULE JavaTarget; (* JavaTargetForJVM.cp *)
+
+  IMPORT 
+        RTS,
+	GPCPcopyright,
+	CompState,
+        AsmUtil,
+        JavaUtil,
+        ClassUtil;
+
+(* ============================================================ *)
+
+  PROCEDURE NewJavaEmitter*(IN fileName : ARRAY OF CHAR) : JavaUtil.JavaFile;
+  BEGIN
+    IF CompState.doAsm5 THEN 
+      IF CompState.verbose THEN CompState.Message("Using ASM emitter") END;
+      RETURN AsmUtil.newAsmEmitter(fileName);
+    ELSIF CompState.doDWC THEN 
+      IF CompState.verbose THEN CompState.Message("Using DWC emitter") END;
+      RETURN ClassUtil.newClassFile(fileName);
+    ELSE 
+      THROW( "no jvm emitter chosen" );
+    END; 
+  END NewJavaEmitter;
+
+(* ============================================================ *)
+BEGIN
+  IF RTS.defaultTarget # "jvm" THEN
+    CompState.Abort("Wrong JavaTarget implementation: Use JavaTargetForCLR.cp");
+  END;
+END JavaTarget.
+(* ============================================================ *)

+ 32 - 0
gpcp/JavaTargetForCLR.cp

@@ -0,0 +1,32 @@
+(* ============================================================ *)
+(*  Target is the module which selects the target ClassMaker.	*)
+(*  Copyright (c) John Gough 1999, 2017.			*)
+(* ============================================================ *)
+
+MODULE JavaTarget; (* JavaTargetForCLR.cp *)
+
+  IMPORT 
+        RTS,
+	GPCPcopyright,
+	CompState,
+        JavaUtil,
+        ClassUtil;
+
+(* ============================================================ *)
+
+  PROCEDURE NewJavaEmitter*(IN fileName : ARRAY OF CHAR) : JavaUtil.JavaFile;
+  BEGIN
+    IF CompState.doDWC THEN 
+      RETURN ClassUtil.newClassFile(fileName);
+    ELSE 
+      THROW( "no jvm emitter chosen" );
+    END; 
+  END NewJavaEmitter;
+
+(* ============================================================ *)
+BEGIN
+  IF RTS.defaultTarget = "jvm" THEN
+    CompState.Abort("Wrong JavaTarget implementation: Use JavaTargetForJVM.cp");
+  END;
+END JavaTarget.
+(* ============================================================ *)

+ 35 - 0
gpcp/JavaTargetForJVM.cp

@@ -0,0 +1,35 @@
+(* ============================================================ *)
+(*  Target is the module which selects the target ClassMaker.	*)
+(*  Copyright (c) John Gough 1999, 2017.			*)
+(* ============================================================ *)
+
+MODULE JavaTarget; (* JavaTargetForJVM.cp *)
+
+  IMPORT 
+        RTS,
+	GPCPcopyright,
+	CompState,
+        AsmUtil,
+        JavaUtil,
+        ClassUtil;
+
+(* ============================================================ *)
+
+  PROCEDURE NewJavaEmitter*(IN fileName : ARRAY OF CHAR) : JavaUtil.JavaFile;
+  BEGIN
+    IF CompState.doAsm5 THEN 
+      RETURN AsmUtil.newAsmEmitter(fileName);
+    ELSIF CompState.doDWC THEN 
+      RETURN ClassUtil.newClassFile(fileName);
+    ELSE 
+      THROW( "no jvm emitter chosen" );
+    END; 
+  END NewJavaEmitter;
+
+(* ============================================================ *)
+BEGIN
+  IF RTS.defaultTarget # "jvm" THEN
+    CompState.Abort("Wrong JavaTarget implementation: Use JavaTargetForCLR.cp");
+  END;
+END JavaTarget.
+(* ============================================================ *)

+ 1 - 1
gpcp/StatDesc.cp

@@ -525,7 +525,7 @@ MODULE StatDesc;
        (*
         * Third check: does the expression need type coercion.
         *)
-        IF (rTp # lTp) & (rTp IS T.Base) THEN
+        IF (s.rhsX.kind # E.nilLt) & (rTp # lTp) & (rTp IS T.Base) THEN
           s.rhsX := E.coerceUp(s.rhsX, lTp);
           rTp := lTp;
         END;

+ 1 - 1
gpcp/Target.cp

@@ -3,7 +3,7 @@
 (*  Copyright (c) John Gough 1999, 2000.			*)
 (* ============================================================ *)
 
-MODULE Target;
+MODULE Target; 
 
   IMPORT 
 	GPCPcopyright,

+ 1 - 1
libs/csharp/RTS.cs

@@ -894,7 +894,7 @@ public class CP_rts
         int len = src.Length;
         for (int ix = 0; ix < len; ix++)
             if (src[ix] == '\0')
-                return ix - 1;
+                return ix;
         return len;
 	}