forked from LeenkxTeam/LNXSDK
		
	
		
			
	
	
		
			101 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
		
		
			
		
	
	
			101 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
| 
								 | 
							
								class MkOps
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								   public static function main()
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      var file = [];
							 | 
						||
| 
								 | 
							
								      file.push("enum E { EVal0; EVal1; }");
							 | 
						||
| 
								 | 
							
								      file.push("class Ops {");
							 | 
						||
| 
								 | 
							
								      file.push("  public static var data: { ?f:Float };");
							 | 
						||
| 
								 | 
							
								      file.push("  public static function check(b:Bool) { }");
							 | 
						||
| 
								 | 
							
								      file.push("  public static function main() {");
							 | 
						||
| 
								 | 
							
								      file.push("  var d:Dynamic = null;");
							 | 
						||
| 
								 | 
							
								      file.push("  var ai = [1]; var fi=[1.2];");
							 | 
						||
| 
								 | 
							
								      file.push("  var int:Int=0;");
							 | 
						||
| 
								 | 
							
								      file.push("  var anon={a:Int, b:[2], c:EVal0};");
							 | 
						||
| 
								 | 
							
								      file.push("  var anon2:Dynamic={a:1};");
							 | 
						||
| 
								 | 
							
								      file.push("  var dynArray:Array<Dynamic> = [1];");
							 | 
						||
| 
								 | 
							
								      file.push("  var uint8:cpp.UInt8 = 1;");
							 | 
						||
| 
								 | 
							
								      file.push("  var int8:cpp.Int8 = 1;");
							 | 
						||
| 
								 | 
							
								      file.push("  var uint16:cpp.UInt16 = 1;");
							 | 
						||
| 
								 | 
							
								      file.push("  var int16:cpp.Int16 = 1;");
							 | 
						||
| 
								 | 
							
								      file.push("  var uint64:cpp.UInt64 = 1;");
							 | 
						||
| 
								 | 
							
								      file.push("  var int64:cpp.Int64 = 1;");
							 | 
						||
| 
								 | 
							
								      file.push("  var string = 'S0';");
							 | 
						||
| 
								 | 
							
								      file.push("  var arrarr = [ [12] ];");
							 | 
						||
| 
								 | 
							
								      file.push("  var arrdyn = [ [d] ];");
							 | 
						||
| 
								 | 
							
								      file.push("  var arrdynarray = [ [dynArray] ];");
							 | 
						||
| 
								 | 
							
								      file.push("  var eval = EVal0;");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      var exprs = [ "d", "null", "int", "ai", "ai[0]", "fi", "fi[0]", "anon.a", "anon.b", "anon.c", "anon", "anon2.xyz", "dynArray", "dynArray[0]", "3.8", '"Hello"', "uint8", "int8", "uint16", "int16", "uint64", "int64", "string", "arrarr", "arrarr[0]", "arrarr[0][0]", "arrdyn", "arrdynarray", "EVal1", "eval", "data.f" ];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      var total = 0;
							 | 
						||
| 
								 | 
							
								      for(e1 in exprs)
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								         for(e2 in exprs)
							 | 
						||
| 
								 | 
							
								         {
							 | 
						||
| 
								 | 
							
								            file.push('check( $e1 != $e2 );');
							 | 
						||
| 
								 | 
							
								            file.push('check( $e1 == $e2 );');
							 | 
						||
| 
								 | 
							
								            file.push('check( $e1 > $e2 );');
							 | 
						||
| 
								 | 
							
								            file.push('$e1 = $e2;');
							 | 
						||
| 
								 | 
							
								            total += 4;
							 | 
						||
| 
								 | 
							
								            if (!skipPlus(e1) && !skipPlus(e2))
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								               file.push('$e1 += $e2;');
							 | 
						||
| 
								 | 
							
								               file.push('$e1 -= $e2;');
							 | 
						||
| 
								 | 
							
								               file.push('$e1 /= $e2;');
							 | 
						||
| 
								 | 
							
								               file.push('$e1 / $e2;');
							 | 
						||
| 
								 | 
							
								               file.push('$e1 *= $e2;');
							 | 
						||
| 
								 | 
							
								               total +=5;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								         }
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      file.push("}}");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      // Pass0 catches common stuff
							 | 
						||
| 
								 | 
							
								      // Pass1 checks for "null on static targets"
							 | 
						||
| 
								 | 
							
								      // Pass2 should work
							 | 
						||
| 
								 | 
							
								      var errors = 0;
							 | 
						||
| 
								 | 
							
								      for(pass in 0...3)
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								         sys.io.File.saveContent("Ops.hx", file.join("\n") );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								         var proc = new sys.io.Process("haxe", ["-cpp", "cpp", "-D", "no-compilation", "-main", "Ops"] );
							 | 
						||
| 
								 | 
							
								         try
							 | 
						||
| 
								 | 
							
								         {
							 | 
						||
| 
								 | 
							
								            var stderr = proc.stderr;
							 | 
						||
| 
								 | 
							
								            var errMatch = ~/^Ops.hx:(\d+):(.*)/;
							 | 
						||
| 
								 | 
							
								            while(true)
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								               var line = stderr.readLine();
							 | 
						||
| 
								 | 
							
								               if (errMatch.match(line))
							 | 
						||
| 
								 | 
							
								               {
							 | 
						||
| 
								 | 
							
								                  var errLine = Std.parseInt(errMatch.matched(1));
							 | 
						||
| 
								 | 
							
								                  file[errLine-1] = "// " + errMatch.matched(2) + " " + file[errLine-1];
							 | 
						||
| 
								 | 
							
								                  errors++;
							 | 
						||
| 
								 | 
							
								               }
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								         }
							 | 
						||
| 
								 | 
							
								         catch(e:Dynamic) { }
							 | 
						||
| 
								 | 
							
								         var code = proc.exitCode();
							 | 
						||
| 
								 | 
							
								         Sys.println(' pass error $code, total errors = $errors/$total');
							 | 
						||
| 
								 | 
							
								         if (pass==2 && code!=0)
							 | 
						||
| 
								 | 
							
								         {
							 | 
						||
| 
								 | 
							
								            Sys.println("Still errors after 3 passes - aborting");
							 | 
						||
| 
								 | 
							
								            Sys.exit(-1);
							 | 
						||
| 
								 | 
							
								         }
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      var code = Sys.command("haxe", ["-cpp", "cpp", "-main", "Ops"] );
							 | 
						||
| 
								 | 
							
								      Sys.println("Combos  : " + total);
							 | 
						||
| 
								 | 
							
								      Sys.println("Exit code : " + code);
							 | 
						||
| 
								 | 
							
								      Sys.exit(code);
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   // + and arrays do not mix...
							 | 
						||
| 
								 | 
							
								   static function skipPlus(e:String)
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      return e=="ai" || e=="arrarr" || e=="arrdyn" || e=="arrarr[0]" || e=="fi" ||
							 | 
						||
| 
								 | 
							
								         e=="arrdynarray" || e=="dynArray" || e=="eval" || e=="anon.b" || e== "EVal1";
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								}
							 |