home *** CD-ROM | disk | FTP | other *** search
/ Tutto per Internet / Internet.iso / soft95 / Java / espints / espinst.exe / classes / espresso / Attr.class (.txt) < prev    next >
Encoding:
Java Class File  |  1996-02-28  |  11.3 KB  |  516 lines

  1. package espresso;
  2.  
  3. import java.io.IOException;
  4.  
  5. class Attr implements Constants {
  6.    static final int SELFQUALIFIED = 2;
  7.    static final int QUALIFIED = 1;
  8.    static final int UNQUALIFIED = 0;
  9.  
  10.    static Obj loadClass(int var0, Env var1, int var2, Name var3) {
  11.       ScopeEntry var4 = var1.importScope.lookup(var3);
  12.       if (var4.scope != null) {
  13.          if (var4.next().scope != null) {
  14.             Report.error(var0, String.valueOf(String.valueOf(String.valueOf("ambiguous class reference: ").concat(String.valueOf(var4.obj))).concat(String.valueOf(", "))).concat(String.valueOf(var4.next().obj)));
  15.             return Typ.errObj;
  16.          }
  17.  
  18.          var3 = ((ClassObj)var4.obj).fullname;
  19.       }
  20.  
  21.       Object var5 = null;
  22.       if ((var2 & 2) != 0) {
  23.          try {
  24.             ClassObj var6 = ClassFile.load(var1.packageName, var3);
  25.             var1.globalScope.enter(var6);
  26.             return var6;
  27.          } catch (LoadError var10) {
  28.             var5 = var10;
  29.          }
  30.       }
  31.  
  32.       if ((var2 & 1) != 0) {
  33.          try {
  34.             return ClassFile.loadDir(var3);
  35.          } catch (IOException var9) {
  36.             var5 = var9;
  37.          }
  38.       }
  39.  
  40.       if ((var2 & -4) != 0) {
  41.          Report.error(var0, String.valueOf(String.valueOf("identifier ").concat(String.valueOf(var3))).concat(String.valueOf(" not found")));
  42.       } else {
  43.          Report.error(var0, String.valueOf(String.valueOf(String.valueOf(String.valueOf(String.valueOf("error loading ").concat(String.valueOf(kindNames(var2)))).concat(String.valueOf(" "))).concat(String.valueOf(var3))).concat(String.valueOf("; "))).concat(String.valueOf(((Throwable)var5).getMessage())));
  44.       }
  45.  
  46.       return Typ.errObj;
  47.    }
  48.  
  49.    static boolean fixupScope(int var0, ClassObj var1) {
  50.       boolean var2 = true;
  51.       if (var1.scope.next == null) {
  52.          var1.scope.next = var1.scope;
  53.          Scope var3 = null;
  54.          if (var1.superclass != null) {
  55.             var2 = fixupScope(var0, var1.superclass);
  56.             if (var2) {
  57.                var3 = var1.superclass.scope;
  58.             }
  59.          }
  60.  
  61.          if (var1.interfaces.length > 0) {
  62.             var3 = new Scope(var3, var1);
  63.  
  64.             for(int var4 = 0; var4 < var1.interfaces.length; ++var4) {
  65.                var2 = var2 && fixupScope(var0, var1.interfaces[var4]);
  66.                if (var2) {
  67.                   var3.include(var1.interfaces[var4].scope);
  68.                }
  69.             }
  70.          }
  71.  
  72.          var1.scope.baseOn(var3);
  73.       } else if (var1.scope.next == var1.scope) {
  74.          Report.error(var0, String.valueOf("cyclic inheritance involving ").concat(String.valueOf(var1)));
  75.          var1.scope.next = Predef.objectClass.scope;
  76.          var2 = false;
  77.       }
  78.  
  79.       return var2;
  80.    }
  81.  
  82.    static int completeMods(int var0, int var1, Env var2, int var3, int var4) {
  83.       if (var2.isInterface()) {
  84.          checkMods(var0, var1, var4);
  85.          return var4 & -2 | var2.enclClass.mods & 1;
  86.       } else {
  87.          return checkMods(var0, var1, var3);
  88.       }
  89.    }
  90.  
  91.    static int checkMods(int var0, int var1, int var2) {
  92.       if ((var1 & '\uffff' & ~var2) != 0) {
  93.          Report.error(var0, String.valueOf(String.valueOf("modifier ").concat(String.valueOf(Obj.modName(Obj.firstMod(var1 & '\uffff' & ~var2))))).concat(String.valueOf(" not allowed here.")));
  94.       } else if (checkDisjoint(var0, var1, 1536, 26) && checkDisjoint(var0, var1, 1, 6) && checkDisjoint(var0, var1, 128, 24)) {
  95.       }
  96.  
  97.       return var1 & var2;
  98.    }
  99.  
  100.    static boolean checkDisjoint(int var0, int var1, int var2, int var3) {
  101.       if ((var1 & var2) != 0 && (var1 & var3) != 0) {
  102.          Report.error(var0, String.valueOf(String.valueOf(String.valueOf("illegal combination of modifiers: ").concat(String.valueOf(Obj.modName(Obj.firstMod(var1 & var2))))).concat(String.valueOf(" and "))).concat(String.valueOf(Obj.modName(Obj.firstMod(var1 & var3)))));
  103.          return false;
  104.       } else {
  105.          return true;
  106.       }
  107.    }
  108.  
  109.    static Obj checkKind(int var0, Obj var1, int var2) {
  110.       if ((objKind(var1) & var2) == 0) {
  111.          Report.error(var0, String.valueOf(String.valueOf(String.valueOf(kindName(var2)).concat(String.valueOf(" required, but "))).concat(String.valueOf(idName(objKind(var1))))).concat(String.valueOf(" found")));
  112.          return Typ.errObj;
  113.       } else {
  114.          return var1;
  115.       }
  116.    }
  117.  
  118.    static boolean checkKind(int var0, int var1, int var2) {
  119.       if ((var1 & ~var2) != 0) {
  120.          Report.error(var0, String.valueOf(String.valueOf(String.valueOf(kindName(var2)).concat(String.valueOf(" required, but "))).concat(String.valueOf(kindName(var1)))).concat(String.valueOf(" found")));
  121.          return false;
  122.       } else {
  123.          return true;
  124.       }
  125.    }
  126.  
  127.    static void checkHandled(int var0, Typ var1, TypSet var2) {
  128.       if (var1.tag == 14) {
  129.          Typ var3 = unHandled(((FunTyp)var1).thrown, var2);
  130.          if (var3 != null) {
  131.             Report.error(var0, String.valueOf(String.valueOf("unreported exception: ").concat(String.valueOf(var3))).concat(String.valueOf("; must be caught or declared to be thrown")));
  132.          }
  133.       }
  134.  
  135.    }
  136.  
  137.    static Typ unHandled(TypSet var0, TypSet var1) {
  138.       if (var0 == null) {
  139.          return null;
  140.       } else {
  141.          return !var0.typ.subtype(Predef.errorTyp) && !var0.typ.subtype(Predef.runtimeExceptionTyp) && !TypSet.elem(var1, var0.typ) ? var0.typ : unHandled(var0.next, var1);
  142.       }
  143.    }
  144.  
  145.    static Typ checkObjectTyp(int var0, Typ var1) {
  146.       if (var1.tag != 11 && var1.tag != 13 && var1.tag != 15 && var1.tag != 0) {
  147.          Report.error(var0, String.valueOf(String.valueOf("object type required, but ").concat(String.valueOf(var1))).concat(String.valueOf(" found")));
  148.          return Typ.errTyp;
  149.       } else {
  150.          return var1;
  151.       }
  152.    }
  153.  
  154.    static Typ checkNonVoid(int var0, Typ var1) {
  155.       if (var1.tag != 12) {
  156.          return var1;
  157.       } else {
  158.          Report.error(var0, "'void' type not allowed here");
  159.          return Typ.errTyp;
  160.       }
  161.    }
  162.  
  163.    static Typ join(int var0, Typ var1, Typ var2) {
  164.       if (var1.tag == 16) {
  165.          return var2;
  166.       } else if (var2.tag == 16) {
  167.          return var1;
  168.       } else if (var1.tag <= 9 && var2.tag <= 9) {
  169.          int var3;
  170.          for(var3 = var1.tag < var2.tag ? var2.tag : var1.tag; !var1.subtype(Typ.typOfTag[var3]) || !var2.subtype(Typ.typOfTag[var3]); ++var3) {
  171.          }
  172.  
  173.          return Typ.typOfTag[var3];
  174.       } else {
  175.          return var1.subtype(var2) ? var2 : join(var0, checkTyp(var0, var2, var1), var1);
  176.       }
  177.    }
  178.  
  179.    static Typ checkTyp(int var0, Typ var1, Typ var2) {
  180.       if (var2.tag == 0) {
  181.          return var2;
  182.       } else if (var1.subtype(var2)) {
  183.          return var1;
  184.       } else {
  185.          String var3 = "incompatible types";
  186.          String var4 = var1.toString();
  187.          String var5 = var2.toString();
  188.          if (var1.tag <= 9 && var2.tag <= 9) {
  189.             var3 = "possible loss of precision";
  190.          } else if (var2.tag == 14) {
  191.             if (var1.tag == 14) {
  192.                FunTyp var6 = (FunTyp)var1;
  193.                FunTyp var7 = (FunTyp)var2;
  194.                if (Typ.subtypes(var7.argtyps, var6.argtyps)) {
  195.                   if (!var6.restyp.subtype(var7.restyp)) {
  196.                      var3 = "incompatible return type";
  197.                      var4 = var6.restyp.toString();
  198.                      var5 = var7.restyp.toString();
  199.                   } else {
  200.                      var3 = "incompatible throws list";
  201.                      var4 = Basic.toString(TypSet.elems(var6.thrown));
  202.                      var5 = Basic.toString(TypSet.elems(var7.thrown));
  203.                   }
  204.                }
  205.             } else {
  206.                var5 = "function";
  207.             }
  208.          }
  209.  
  210.          Report.error(var0, String.valueOf(String.valueOf(String.valueOf(String.valueOf(var3).concat(String.valueOf("; found: "))).concat(String.valueOf(var4))).concat(String.valueOf(", required: "))).concat(String.valueOf(var5)));
  211.          return Typ.errTyp;
  212.       }
  213.    }
  214.  
  215.    static Obj checkNonAbstract(int var0, Obj var1) {
  216.       if ((var1.modifiers & 1024) != 0) {
  217.          Report.error(var0, String.valueOf(String.valueOf("abstract ").concat(String.valueOf(var1))).concat(String.valueOf(" cannot be accessed directly")));
  218.          return Typ.errObj;
  219.       } else {
  220.          return var1;
  221.       }
  222.    }
  223.  
  224.    static Obj checkStaticOrFinal(int var0, Obj var1) {
  225.       if (var1.owner instanceof ClassObj && (var1.modifiers & 24) == 0) {
  226.          Report.error(var0, String.valueOf(String.valueOf("cannot access ").concat(String.valueOf(var1))).concat(String.valueOf(" before superclass constructor is called")));
  227.          return Typ.errObj;
  228.       } else {
  229.          return var1;
  230.       }
  231.    }
  232.  
  233.    static Obj checkStatic(int var0, Obj var1) {
  234.       if (var1.owner instanceof ClassObj && (var1.modifiers & 8) == 0) {
  235.          Report.error(var0, String.valueOf(String.valueOf("non-static ").concat(String.valueOf(var1))).concat(String.valueOf(" cannot be referenced from a static context")));
  236.          return Typ.errObj;
  237.       } else {
  238.          return var1;
  239.       }
  240.    }
  241.  
  242.    static Obj resolveConstructor(int var0, Env var1, ClassObj var2, Typ var3, int var4) {
  243.       Obj var5 = resolve(var0, var1, var2.scope, 16, var3, Predef.initS, var4);
  244.       if (var5.typ.tag == 14 && var5.owner != var2) {
  245.          Report.error(var0, String.valueOf(String.valueOf(String.valueOf("no constructor matching ").concat(String.valueOf(((FunTyp)var3).argsToString()))).concat(String.valueOf(" found in "))).concat(String.valueOf(var2)));
  246.       }
  247.  
  248.       return var5;
  249.    }
  250.  
  251.    static Obj resolve(int var0, Env var1, Scope var2, int var3, Typ var4, Name var5, int var6) {
  252.       ScopeEntry var8;
  253.       for(var8 = var2.lookup(var5); var8.scope != null && !matches(var8.obj, var3, var4); var8 = var8.next()) {
  254.       }
  255.  
  256.       if (var8.scope == null && var6 == 0) {
  257.          for(var8 = var1.globalScope.lookup(var5); var8.scope != null && !matches(var8.obj, var3, var4); var8 = var8.next()) {
  258.          }
  259.       }
  260.  
  261.       Obj var7;
  262.       if (var8.scope == null) {
  263.          if ((var3 & 3) != 0 && var6 == 0) {
  264.             var7 = loadClass(var0, var1, var3, var5);
  265.          } else {
  266.             var7 = notFound(var0, var2, var3, var4, var5, var6);
  267.          }
  268.       } else {
  269.          var7 = var8.obj;
  270.  
  271.          for(ScopeEntry var9 = var8.next(); var9.scope == var8.scope; var9 = var9.next()) {
  272.             if (matches(var9.obj, var3, var4) && better(var9.obj, var7)) {
  273.                var7 = var9.obj;
  274.             }
  275.          }
  276.  
  277.          Obj var10 = null;
  278.  
  279.          for(ScopeEntry var12 = var8; var12.scope == var8.scope && var10 == null; var12 = var12.next()) {
  280.             if (var12.obj != var7 && matches(var12.obj, var3, var4) && !better(var7, var12.obj)) {
  281.                var10 = var12.obj;
  282.             }
  283.          }
  284.  
  285.          if (var10 != null) {
  286.             if (!isError(var4)) {
  287.                Report.error(var0, String.valueOf(String.valueOf(String.valueOf(String.valueOf(String.valueOf(String.valueOf(String.valueOf(String.valueOf("reference to ").concat(String.valueOf(var5))).concat(String.valueOf(" is ambiguous, both "))).concat(String.valueOf(var7))).concat(String.valueOf(location(var7)))).concat(String.valueOf(" and "))).concat(String.valueOf(var10))).concat(String.valueOf(location(var10)))).concat(String.valueOf(" match")));
  288.             }
  289.  
  290.             var7 = Typ.errObj;
  291.          }
  292.       }
  293.  
  294.       if (Switches.extended && var3 == 16 && var7 instanceof VarObj) {
  295.          if (var7.typ.tag != 14 || !Typ.subtypes(((FunTyp)var4).argtyps, ((FunTyp)var7.typ).argtyps)) {
  296.             Report.error(var0, String.valueOf(String.valueOf(String.valueOf(String.valueOf(var7).concat(String.valueOf(" of type "))).concat(String.valueOf(var7.typ))).concat(String.valueOf(" cannot be applied to "))).concat(String.valueOf(((FunTyp)var4).argsToString())));
  297.             var7 = Typ.errObj;
  298.          }
  299.       } else if ((objKind(var7) & var3) == 0) {
  300.          var7 = checkKind(var0, var7, var3);
  301.       } else if (var3 == 4 && (var7.modifiers & 16) != 0) {
  302.          Report.error(var0, String.valueOf(var7).concat(String.valueOf(" is declared final; cannot be assigned")));
  303.       } else if ((var7.modifiers & 4) != 0) {
  304.          if (!var1.enclClass.obj.typ.subtype(var7.owner.typ) || var6 == 1 && var2.owner.typ.tag == 11 && !var2.owner.typ.subtype(var1.enclClass.obj.typ)) {
  305.             if ((var7.modifiers & 2) != 0) {
  306.                Report.error(var0, String.valueOf(String.valueOf(var7).concat(String.valueOf(" has private protected access"))).concat(String.valueOf(location(var7))));
  307.             } else if (var7.owner instanceof ClassObj && var1.packageName.index != ((ClassObj)var7.owner).packagename.index) {
  308.                Report.error(var0, String.valueOf(String.valueOf(var7).concat(String.valueOf(" has protected access"))).concat(String.valueOf(location(var7))));
  309.             }
  310.          }
  311.       } else if ((var7.modifiers & 2) != 0 && var1.enclClass.obj != var7.owner) {
  312.          Report.error(var0, String.valueOf(String.valueOf(var7).concat(String.valueOf(" has private access"))).concat(String.valueOf(location(var7))));
  313.       } else if ((var7.modifiers & 1) == 0) {
  314.          Obj var11 = var7;
  315.          if (!(var7 instanceof ClassObj)) {
  316.             var11 = var7.owner;
  317.          }
  318.  
  319.          if (var11 instanceof ClassObj && var11.typ.tag == 11 && var1.packageName.index != ((ClassObj)var11).packagename.index) {
  320.             Report.error(var0, String.valueOf(String.valueOf(var7).concat(String.valueOf(" is not public; "))).concat(String.valueOf("cannot be accessed from outside package")));
  321.          }
  322.       }
  323.  
  324.       return var7;
  325.    }
  326.  
  327.    static int objKind(Obj var0) {
  328.       if (var0 instanceof ClassObj) {
  329.          return var0.typ.tag == 17 ? 1 : 2;
  330.       } else if (var0 instanceof FunObj) {
  331.          return 16;
  332.       } else {
  333.          return var0 instanceof VarObj ? 4 : 31;
  334.       }
  335.    }
  336.  
  337.    static ClassObj currentClass(Env var0) {
  338.       return (ClassObj)var0.enclClass.obj;
  339.    }
  340.  
  341.    static boolean isError(Typ var0) {
  342.       if (var0 == null) {
  343.          return false;
  344.       } else {
  345.          switch (var0.tag) {
  346.             case 0:
  347.                return true;
  348.             case 13:
  349.                return isError(((ArrayTyp)var0).elemtyp);
  350.             case 14:
  351.                FunTyp var1 = (FunTyp)var0;
  352.  
  353.                for(int var2 = 0; var2 < var1.argtyps.length; ++var2) {
  354.                   if (isError(var1.argtyps[var2])) {
  355.                      return true;
  356.                   }
  357.                }
  358.  
  359.                return isError(var1.restyp);
  360.             default:
  361.                return false;
  362.          }
  363.       }
  364.    }
  365.  
  366.    static boolean better(Obj var0, Obj var1) {
  367.       boolean var2 = false;
  368.       if (var0 instanceof FunObj && var1 instanceof FunObj) {
  369.          Typ[] var3 = ((FunTyp)var0.typ).argtyps;
  370.          Typ[] var4 = ((FunTyp)var1.typ).argtyps;
  371.          if (var3.length == var4.length) {
  372.             for(int var5 = 0; var5 < var3.length && var3[var5].subtype(var4[var5]); ++var5) {
  373.                if (!var4[var5].subtype(var3[var5])) {
  374.                   var2 = true;
  375.                }
  376.             }
  377.          }
  378.       }
  379.  
  380.       return var2;
  381.    }
  382.  
  383.    static boolean matches(Obj var0, int var1, Typ var2) {
  384.       return var1 != 16 || !(var0 instanceof FunObj) || Typ.subtypes(((FunTyp)var2).argtyps, ((FunTyp)var0.typ).argtyps);
  385.    }
  386.  
  387.    static boolean canCast(Typ var0, Typ var1) {
  388.       if (var1.tag == 0) {
  389.          return true;
  390.       } else {
  391.          switch (var0.tag) {
  392.             case 0:
  393.                return true;
  394.             case 1:
  395.             case 3:
  396.             case 12:
  397.             default:
  398.                return false;
  399.             case 2:
  400.             case 4:
  401.             case 5:
  402.             case 6:
  403.             case 7:
  404.             case 8:
  405.             case 9:
  406.                return var1.tag <= 9;
  407.             case 10:
  408.                return var1.tag == 10;
  409.             case 11:
  410.             case 13:
  411.             case 14:
  412.             case 15:
  413.                return (var1.tag == 11 || var1.tag == 13 || var1.tag == 14) && (var0.subtype(var1) || var1.subtype(var0) || (var0.obj.modifiers & 512) != 0 && (var1.obj.modifiers & 16) == 0 || (var1.obj.modifiers & 512) != 0 && (var0.obj.modifiers & 16) == 0);
  414.          }
  415.       }
  416.    }
  417.  
  418.    static void printscopes(Scope var0) {
  419.       while(var0 != null) {
  420.          if (var0.owner != null) {
  421.             System.out.print(String.valueOf(var0.owner).concat(String.valueOf(": ")));
  422.          }
  423.  
  424.          for(ScopeEntry var1 = var0.elements(); var1 != null; var1 = var1.sibling) {
  425.             System.out.print(String.valueOf(var1.obj).concat(String.valueOf(", ")));
  426.          }
  427.  
  428.          System.out.println();
  429.          var0 = var0.next;
  430.       }
  431.  
  432.    }
  433.  
  434.    static String location(Obj var0) {
  435.       return var0.owner != null ? String.valueOf(" in ").concat(String.valueOf(var0.owner)) : "";
  436.    }
  437.  
  438.    static String location(Scope var0) {
  439.       return var0 != null && var0.owner != null ? String.valueOf(" in ").concat(String.valueOf(var0.owner)) : "";
  440.    }
  441.  
  442.    static Obj notFound(int var0, Scope var1, int var2, Typ var3, Name var4, int var5) {
  443.       String var6 = String.valueOf(var4.equals(Predef.initS) ? "constructor " : String.valueOf(idName(var2)).concat(String.valueOf(" "))).concat(String.valueOf(var2 == 16 ? String.valueOf(String.valueOf(String.valueOf(var4.equals(Predef.initS) && var1 != null && var1.owner != null ? var1.owner.name : var4).concat(String.valueOf("("))).concat(String.valueOf(Basic.toString(((FunTyp)var3).argtyps)))).concat(String.valueOf(")")) : var4.toString()));
  444.       Report.error(var0, String.valueOf(String.valueOf(var6).concat(String.valueOf(" not found"))).concat(String.valueOf(var5 != 0 ? location(var1) : "")));
  445.       return Typ.errObj;
  446.    }
  447.  
  448.    static String fullName(Scope var0, Name var1, int var2, Typ var3) {
  449.       return var2 != 16 ? var1.toString() : String.valueOf(String.valueOf(String.valueOf(String.valueOf(String.valueOf(idName(var2)).concat(String.valueOf(" "))).concat(String.valueOf(var1.equals(Predef.initS) && var0 != null && var0.owner != null ? var0.owner.name : var1))).concat(String.valueOf("("))).concat(String.valueOf(Basic.toString(((FunTyp)var3).argtyps)))).concat(String.valueOf(")"));
  450.    }
  451.  
  452.    static String kindNames(int var0) {
  453.       String[] var1 = new String[4];
  454.       int var2 = 0;
  455.       if ((var0 & 4) != 0) {
  456.          var1[var2++] = "variable";
  457.       }
  458.  
  459.       if ((var0 & 16) != 0) {
  460.          var1[var2++] = "function";
  461.       }
  462.  
  463.       if ((var0 & 2) != 0) {
  464.          var1[var2++] = "class";
  465.       }
  466.  
  467.       if ((var0 & 1) != 0) {
  468.          var1[var2++] = "package";
  469.       }
  470.  
  471.       String var3 = "";
  472.  
  473.       for(int var4 = 0; var4 < var2 - 2; ++var4) {
  474.          var3 = String.valueOf(String.valueOf(var3).concat(String.valueOf(var1[var2]))).concat(String.valueOf(", "));
  475.       }
  476.  
  477.       if (var2 >= 2) {
  478.          var3 = String.valueOf(String.valueOf(var3).concat(String.valueOf(var1[var2 - 2]))).concat(String.valueOf(" or "));
  479.       }
  480.  
  481.       if (var2 >= 1) {
  482.          var3 = String.valueOf(var3).concat(String.valueOf(var1[var2 - 1]));
  483.       } else {
  484.          var3 = "identifier";
  485.       }
  486.  
  487.       return var3;
  488.    }
  489.  
  490.    static String idName(int var0) {
  491.       return kindName(var0 == 12 ? 4 : var0);
  492.    }
  493.  
  494.    static String kindName(int var0) {
  495.       switch (var0) {
  496.          case 1:
  497.             return "package";
  498.          case 2:
  499.             return "class";
  500.          case 4:
  501.             return "variable";
  502.          case 12:
  503.             return "value";
  504.          case 16:
  505.             return "function";
  506.          case 32:
  507.             return "constructor";
  508.          default:
  509.             return "identifier";
  510.       }
  511.    }
  512.  
  513.    public Attr() {
  514.    }
  515. }
  516.