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

  1. package espresso;
  2.  
  3. import java.util.Enumeration;
  4. import java.util.Hashtable;
  5.  
  6. class FunDef extends Def {
  7.    boolean isInitializer = false;
  8.    boolean isConstructor = false;
  9.    Block body;
  10.    AST[] thrown;
  11.    VarDef[] params;
  12.    AST dcltyp;
  13.  
  14.    void print(int var1) {
  15.       System.out.print(Obj.modNames(super.mods));
  16.       if (this.dcltyp != null) {
  17.          this.dcltyp.print();
  18.       }
  19.  
  20.       System.out.print(String.valueOf(String.valueOf(" ").concat(String.valueOf(super.name))).concat(String.valueOf("(")));
  21.       AST.printSeq(this.params);
  22.       System.out.print(") ");
  23.       AST.printSeq(this.thrown);
  24.       if (this.body != null) {
  25.          this.body.print();
  26.       } else {
  27.          System.out.print(";");
  28.       }
  29.  
  30.    }
  31.  
  32.    Item gen() {
  33.       FunObj var1 = (FunObj)super.obj;
  34.       FunTyp var2 = (FunTyp)var1.typ;
  35.       if (super.tag == 66) {
  36.          Try var3 = (Try)super.localEnv.next.parent;
  37.          Gen.registerCatch(var3.startPc, var3.endPc, Gen.curPc(), Gen.mkref(var2.argtyps[0]));
  38.          Gen.entryPoint(1, var3.uninits);
  39.          int var4 = Gen.nextLocal();
  40.          Gen.adrLocal((VarObj)this.params[0].obj, var3.excVar.disp);
  41.          var3.excVar.store(var2.argtyps[0]);
  42.          this.body.genDrop();
  43.          Gen.endScopes(var4);
  44.       } else if (this.body != null) {
  45.          this.genTry(false);
  46.       }
  47.  
  48.       return Item.voidItem;
  49.    }
  50.  
  51.    private void genTry(boolean var1) {
  52.       FunObj var2 = (FunObj)super.obj;
  53.       FunTyp var3 = (FunTyp)var2.typ;
  54.       var2.code = Gen.newCode(var2, false, var1);
  55.       if ((super.mods & 8) == 0) {
  56.          Gen.newLocal(var2.owner.typ);
  57.       }
  58.  
  59.       for(int var4 = 0; var4 < this.params.length; ++var4) {
  60.          Gen.adrLocal((VarObj)this.params[var4].obj, Gen.newLocal(this.params[var4].obj.typ));
  61.       }
  62.  
  63.       Gen.entryPoint(0, new Bits());
  64.       byte var5 = 0;
  65.       if (this.isInitializer) {
  66.          this.body.stats[0].genDrop();
  67.          ClassDef var6 = super.localEnv.enclClass;
  68.  
  69.          for(int var7 = 0; var7 < var6.initcode.cp; ++var7) {
  70.             Gen.emit1(var6.initcode.code[var7] & 255);
  71.          }
  72.  
  73.          if (var2.code.max_stack < var6.initcode.max_stack) {
  74.             var2.code.max_stack = var6.initcode.max_stack;
  75.          }
  76.  
  77.          var5 = 1;
  78.       }
  79.  
  80.       for(int var8 = var5; var8 < this.body.stats.length; ++var8) {
  81.          this.body.stats[var8].genDrop();
  82.       }
  83.  
  84.       Gen.endScopes(0);
  85.       if (Gen.alive) {
  86.          if (var3.restyp.tag != 12) {
  87.             Report.error(super.pos, "missing function return");
  88.             Gen.alive = false;
  89.          } else {
  90.             Gen.emitop(177);
  91.          }
  92.       }
  93.  
  94.       if (!var1 && var2.code.fatCode) {
  95.          boolean var9 = Report.silent;
  96.          Report.silent = true;
  97.          this.genTry(true);
  98.          Report.silent = var9;
  99.       }
  100.  
  101.    }
  102.  
  103.    AST simplify() {
  104.       FunTyp var1 = (FunTyp)((FunObj)super.obj).typ;
  105.       if (this.dcltyp != null) {
  106.          this.dcltyp = Simplify.annot(this.dcltyp.simplify(), var1.restyp);
  107.       }
  108.  
  109.       for(int var2 = 0; var2 < this.thrown.length; ++var2) {
  110.          this.thrown[var2] = this.thrown[var2].simplify();
  111.       }
  112.  
  113.       if (this.body != null) {
  114.          this.body = (Block)this.body.simplify();
  115.       }
  116.  
  117.       ASTS var3 = this.simplifyParams();
  118.       if (var3.length != 0) {
  119.          var3.append(new ASTS(this.body.stats));
  120.          this.body = new Block(0, var3);
  121.       }
  122.  
  123.       if (super.tag == 67) {
  124.          return this.makeClosure(var1.restyp);
  125.       } else {
  126.          super.obj = null;
  127.          return this;
  128.       }
  129.    }
  130.  
  131.    private AST makeClosure(Typ var1) {
  132.       ASTS var2 = new ASTS();
  133.       ASTS var3 = new ASTS();
  134.       Enumeration var4 = ((FunObj)super.obj).freevars.elements();
  135.  
  136.       while(var4.hasMoreElements()) {
  137.          VarObj var5 = (VarObj)var4.nextElement();
  138.          Object var6 = var5.typ;
  139.          if (var5.passByRef) {
  140.             var6 = new ArrayTyp((Typ)var6);
  141.          }
  142.  
  143.          var2.append(new VarDef(super.pos, var5.name, 0, Simplify.annot(Simplify.toAST(super.pos, (Typ)var6), (Typ)var6), (AST)null));
  144.          var3.append(Simplify.box(new Ident(super.pos, var5.name)));
  145.       }
  146.  
  147.       ClassObj var7 = (ClassObj)super.localEnv.enclClass.obj;
  148.       int var8 = super.localEnv.enclClass.closures.length + Simplify.totalClosures(var7.superclass);
  149.       super.name = Name.fromString(String.valueOf("$closure").concat(String.valueOf(var8)));
  150.       super.mods = super.localEnv.isStatic ? 8 : 0;
  151.       super.tag = 65;
  152.       this.dcltyp = Simplify.annot(Simplify.toAST(super.pos, var1), var1);
  153.       if (var2.length != 0) {
  154.          VarDef[] var9 = this.params;
  155.          this.params = new VarDef[var2.length + var9.length];
  156.  
  157.          for(int var10 = 0; var10 < var2.length; ++var10) {
  158.             this.params[var10] = (VarDef)var2.elems[var10];
  159.          }
  160.  
  161.          for(int var11 = 0; var11 < var9.length; ++var11) {
  162.             this.params[var2.length + var11] = var9[var11];
  163.          }
  164.       }
  165.  
  166.       super.localEnv.enclClass.closures.append(this);
  167.       Object var12 = super.localEnv.isStatic ? new Ident(super.pos, Simplify.nullS) : new Self(super.pos, 80);
  168.       return new New(super.pos, new Apply(super.pos, new Ident(super.pos, super.localEnv.enclClass.name.append(Simplify.closureS)), new ASTS(new Aggregate(super.pos, var3), (AST)var12, new Literal(super.pos, 90, new Integer(var8)))));
  169.    }
  170.  
  171.    private ASTS simplifyParams() {
  172.       ASTS var1 = new ASTS();
  173.  
  174.       for(int var2 = 0; var2 < this.params.length; ++var2) {
  175.          VarObj var3 = (VarObj)this.params[var2].obj;
  176.          this.params[var2] = (VarDef)this.params[var2].simplify();
  177.          VarDef var4 = this.params[var2];
  178.          if (var3.passByRef) {
  179.             var4.name = var4.name.append(Simplify.dollarS);
  180.             AST var5 = Simplify.annot(new Subscript(var4.dcltyp.pos, Simplify.strip(var4.dcltyp), (AST)null), new ArrayTyp(var3.typ));
  181.             var1.append(new VarDef(var4.pos, var3.name, 0, var5, new Ident(var4.pos, var4.name)));
  182.          }
  183.       }
  184.  
  185.       return var1;
  186.    }
  187.  
  188.    void markCaptured(Bits var1) {
  189.       switch (super.tag) {
  190.          case 65:
  191.             if (this.body != null) {
  192.                this.body.markCaptured(new Bits());
  193.             }
  194.             break;
  195.          case 66:
  196.             this.body.markCaptured(var1);
  197.             break;
  198.          case 67:
  199.             Enumeration var2 = ((FunObj)super.obj).freevars.elements();
  200.  
  201.             while(var2.hasMoreElements()) {
  202.                var1.incl(((VarObj)var2.nextElement()).vnum);
  203.             }
  204.  
  205.             this.body.markCaptured(var1);
  206.             break;
  207.          default:
  208.             throw new CompilerError("markcaptured");
  209.       }
  210.  
  211.    }
  212.  
  213.    Typ attr(Env var1, int var2, Typ var3) {
  214.       if (super.obj == null) {
  215.          this.enter(var1);
  216.       }
  217.  
  218.       for(int var4 = 0; var4 < this.thrown.length; ++var4) {
  219.          Attr.checkTyp(this.thrown[var4].pos, this.thrown[var4].typ, Predef.throwableTyp);
  220.       }
  221.  
  222.       if (super.name != null) {
  223.          this.checkOverridden(var1.scope);
  224.       }
  225.  
  226.       super.typ = var3;
  227.       if (this.body == null) {
  228.          if (!var1.isInterface() && (super.mods & 1280) == 0) {
  229.             Report.error(super.pos, "missing function body, or declare as abstract");
  230.          }
  231.       } else if (var1.isInterface()) {
  232.          Report.error(super.pos, "interface methods cannot have body");
  233.          this.body = null;
  234.       } else if ((super.mods & 1024) != 0) {
  235.          Report.error(super.pos, "abstract methods cannot have body");
  236.          this.body = null;
  237.       } else if ((super.mods & 256) != 0) {
  238.          Report.error(super.pos, "native methods cannot have body");
  239.          this.body = null;
  240.       } else {
  241.          super.localEnv.scope.restore();
  242.          switch (super.tag) {
  243.             case 65:
  244.                this.attrFun();
  245.                break;
  246.             case 66:
  247.                super.typ = this.body.attr(super.localEnv, 12, var3);
  248.                break;
  249.             case 67:
  250.                ((FunObj)super.obj).freevars = new Hashtable(10);
  251.                this.attrFun();
  252.                FunTyp var5 = (FunTyp)super.obj.typ;
  253.                var5.restyp = this.body.typ.tag == 16 ? Typ.voidTyp : this.body.typ;
  254.                super.typ = Attr.checkTyp(super.pos, var5, var3);
  255.                ++((ClassObj)super.localEnv.enclClass.obj).nclosures;
  256.          }
  257.  
  258.          super.localEnv.scope.leave();
  259.       }
  260.  
  261.       return super.typ;
  262.    }
  263.  
  264.    private void attrFun() {
  265.       byte var1 = 0;
  266.       if (this.isConstructor && !((ClassObj)super.localEnv.enclClass.obj).isRoot()) {
  267.          this.attrConstructorCall();
  268.          var1 = 1;
  269.       }
  270.  
  271.       FunTyp var2 = (FunTyp)super.obj.typ;
  272.       this.body.typ = var2.restyp;
  273.  
  274.       for(int var3 = var1; var3 < this.body.stats.length; ++var3) {
  275.          this.body.typ = Attr.join(this.body.stats[var3].pos, this.body.typ, this.body.stats[var3].attr(super.localEnv, 12, var2.restyp));
  276.       }
  277.  
  278.    }
  279.  
  280.    private void attrConstructorCall() {
  281.       if (this.body.stats.length <= 0 || !isSelfCall(this.body.stats[0])) {
  282.          this.body.pushStat(new Exec(super.pos, new Apply(super.pos, new Self(super.pos, 81), new ASTS())));
  283.       }
  284.  
  285.       this.isInitializer = ((Apply)((Exec)this.body.stats[0]).expr).fn.tag == 81;
  286.       this.body.stats[0].attr(super.localEnv, 32, Typ.voidTyp);
  287.    }
  288.  
  289.    private static boolean isSelfCall(AST var0) {
  290.       return var0.tag == 27 && ((Exec)var0).expr.tag == 5 && ((Apply)((Exec)var0).expr).fn instanceof Self;
  291.    }
  292.  
  293.    void enter(Env var1) {
  294.       this.isConstructor = super.name != null && super.name.equals(Predef.initS);
  295.       FunObj var2 = new FunObj();
  296.       super.obj = var2;
  297.       var2.name = super.name;
  298.       var2.modifiers = Attr.completeMods(super.pos, super.mods, var1, this.isConstructor ? 7 : 1343, 1025);
  299.       var2.owner = var1.scope.owner;
  300.       switch (super.tag) {
  301.          case 65:
  302.             super.localEnv = new Env(var1, this, var1.enclClass.funscope.duplicate());
  303.             super.localEnv.scope.owner = var2;
  304.             super.localEnv.enclMeth = this;
  305.             break;
  306.          case 66:
  307.             super.localEnv = new Env(var1, this, var1.scope.duplicate());
  308.             break;
  309.          case 67:
  310.             super.localEnv = new Env(var1, this, var1.scope.duplicate());
  311.             super.localEnv.scope.owner = var2;
  312.       }
  313.  
  314.       super.localEnv.enclFun = this;
  315.       super.localEnv.isStatic = var1.isStatic || (var2.modifiers & 8) != 0;
  316.       if (super.tag == 66) {
  317.          this.enterCatch(var2);
  318.       } else {
  319.          this.enterFun(var1, var2);
  320.       }
  321.  
  322.    }
  323.  
  324.    void enterFun(Env var1, FunObj var2) {
  325.       Typ[] var3 = new Typ[this.params.length];
  326.       Typ[] var4 = new Typ[this.params.length];
  327.       boolean var5 = false;
  328.  
  329.       for(int var6 = 0; var6 < this.params.length; ++var6) {
  330.          this.params[var6].attr(super.localEnv, 12, Typ.anyTyp);
  331.          var3[var6] = this.params[var6].dcltyp.typ;
  332.          var4[var6] = Simplify.trueType(this.params[var6].dcltyp);
  333.          var5 = var5 || var3[var6] != var4[var6];
  334.       }
  335.  
  336.       super.localEnv.scope.leave();
  337.       Typ var7;
  338.       Typ var8;
  339.       if (this.isConstructor) {
  340.          var7 = Typ.voidTyp;
  341.          var8 = var7;
  342.       } else if (this.dcltyp == null) {
  343.          var7 = Typ.anyTyp;
  344.          var8 = var7;
  345.       } else {
  346.          var7 = this.dcltyp.attr(var1, 2, Typ.anyTyp);
  347.          var8 = Simplify.trueType(this.dcltyp);
  348.          var5 = var5 || var7 != var8;
  349.       }
  350.  
  351.       FunTyp var9 = new FunTyp(var3, var7, (TypSet)null);
  352.  
  353.       for(int var10 = 0; var10 < this.thrown.length; ++var10) {
  354.          var9.thrown = TypSet.incl(var9.thrown, this.thrown[var10].attr(var1, 2, Typ.anyTyp));
  355.       }
  356.  
  357.       var2.typ = var9;
  358.       if (var5) {
  359.          var2.alttyp = new FunTyp(var4, var8, var9.thrown);
  360.       } else {
  361.          var2.alttyp = null;
  362.       }
  363.  
  364.       super.localEnv.reported = var9.thrown;
  365.       if (super.name != null && this.checkUnique(var1.scope)) {
  366.          var1.scope.enter(var2);
  367.       }
  368.  
  369.    }
  370.  
  371.    void enterCatch(FunObj var1) {
  372.       this.params[0].attr(super.localEnv, 12, Predef.throwableTyp);
  373.       Typ[] var2 = new Typ[]{this.params[0].obj.typ};
  374.       var1.typ = new FunTyp(var2, Typ.anyTyp, (TypSet)null);
  375.       super.localEnv.scope.leave();
  376.    }
  377.  
  378.    private void checkOverridden(Scope var1) {
  379.       for(ScopeEntry var2 = var1.lookup(super.name); var2.scope != null; var2 = var2.next()) {
  380.          if (((FunObj)super.obj).overrides(var2.obj)) {
  381.             Obj var3 = var2.obj;
  382.             if ((var3.modifiers & 24) != 0) {
  383.                Report.error(super.pos, String.valueOf(String.valueOf(String.valueOf(String.valueOf(Obj.modName(Obj.firstMod(var3.modifiers & 280))).concat(String.valueOf(" "))).concat(String.valueOf(var3))).concat(String.valueOf(Attr.location(var3)))).concat(String.valueOf(" cannot be overridden")));
  384.                return;
  385.             }
  386.  
  387.             if ((super.obj.modifiers & 8) != 0) {
  388.                Report.error(super.pos, String.valueOf(String.valueOf(String.valueOf("static ").concat(String.valueOf(super.obj))).concat(String.valueOf(Attr.location(super.obj)))).concat(String.valueOf(" cannot override")));
  389.                return;
  390.             }
  391.  
  392.             if (this.protection(super.obj.modifiers) > this.protection(var3.modifiers)) {
  393.                int var4 = var3.modifiers & 7;
  394.                Report.error(super.pos, String.valueOf(String.valueOf(String.valueOf(String.valueOf("cannot override ").concat(String.valueOf(var3))).concat(String.valueOf(Attr.location(var3)))).concat(String.valueOf(" with weaker access privileges, was "))).concat(String.valueOf(var4 == 0 ? "package" : Obj.modName(Obj.firstMod(var4)).toString())));
  395.                return;
  396.             }
  397.  
  398.             if (!((FunTyp)super.obj.typ).restyp.sametype(((FunTyp)var3.typ).restyp)) {
  399.                Report.error(super.pos, String.valueOf(String.valueOf(String.valueOf(String.valueOf("cannot override ").concat(String.valueOf(var3))).concat(String.valueOf(Attr.location(var3)))).concat(String.valueOf(" with different return type, was "))).concat(String.valueOf(((FunTyp)var3.typ).restyp)));
  400.                return;
  401.             }
  402.  
  403.             Typ var5 = Attr.unHandled(((FunTyp)super.obj.typ).thrown, ((FunTyp)var3.typ).thrown);
  404.             if (var5 != null) {
  405.                Report.error(super.pos, String.valueOf(String.valueOf(String.valueOf(String.valueOf("overridden method ").concat(String.valueOf(var3))).concat(String.valueOf(Attr.location(var3)))).concat(String.valueOf(" does not throw "))).concat(String.valueOf(var5)));
  406.                return;
  407.             }
  408.          }
  409.       }
  410.  
  411.    }
  412.  
  413.    private int protection(int var1) {
  414.       switch (var1 & 7) {
  415.          case 0:
  416.             return 2;
  417.          case 1:
  418.             return 0;
  419.          case 2:
  420.             return 4;
  421.          case 3:
  422.          case 5:
  423.          default:
  424.             throw new CompilerError("protection");
  425.          case 4:
  426.             return 1;
  427.          case 6:
  428.             return 3;
  429.       }
  430.    }
  431.  
  432.    private boolean checkUnique(Scope var1) {
  433.       ScopeEntry var2;
  434.       for(var2 = var1.lookup(super.obj.name); var2.scope == var1 && (var2.obj == super.obj || !(var2.obj instanceof VarObj) && (!(var2.obj instanceof FunObj) || !Typ.subtypes(((FunTyp)super.obj.typ).argtyps, ((FunTyp)var2.obj.typ).argtyps) || !Typ.subtypes(((FunTyp)var2.obj.typ).argtyps, ((FunTyp)super.obj.typ).argtyps))); var2 = var2.next()) {
  435.       }
  436.  
  437.       if (var2.scope == var1) {
  438.          Report.error(super.pos, String.valueOf(String.valueOf("duplicate definition of ").concat(String.valueOf(var2.obj instanceof VarObj ? super.name.toString() : super.obj.toString()))).concat(String.valueOf(Attr.location(var1))));
  439.          return false;
  440.       } else {
  441.          return true;
  442.       }
  443.    }
  444.  
  445.    FunDef(int var1, int var2, Name var3, int var4, AST var5, ASTS var6, ASTS var7, Block var8) {
  446.       super(var1, var2, var3, var4);
  447.       this.dcltyp = var5;
  448.       this.params = new VarDef[var6.length];
  449.  
  450.       for(int var9 = 0; var9 < var6.length; ++var9) {
  451.          this.params[var9] = (VarDef)var6.elems[var9];
  452.       }
  453.  
  454.       this.thrown = var7.shrink();
  455.       this.body = var8;
  456.    }
  457. }
  458.