AST[] var2 = new AST[]{new VarDef(var1, Simplify.fvarsS, 2, Simplify.objectArray(var1), (AST)null), new VarDef(var1, Simplify.receiverS, 2, new Ident(var1, super.name), (AST)null), new VarDef(var1, Simplify.tagS, 2, Simplify.toAST(var1, Typ.intTyp), (AST)null), this.makeClosureConstructor(), this.makeClosureApply()};
return new ClassDef(var1, super.name.append(Simplify.closureS), 0, Simplify.toAST(var1, Simplify.ClosureS), new ASTS(), new Block(var1, new ASTS(var2)));
}
private AST makeClosureConstructor() {
int var1 = this.body.pos;
return new FunDef(var1, 65, Predef.initS, 0, (AST)null, new ASTS(new VarDef(var1, Simplify.fvarsS, 0, Simplify.objectArray(var1), (AST)null), new VarDef(var1, Simplify.receiverS, 0, new Ident(var1, super.name), (AST)null), new VarDef(var1, Simplify.tagS, 0, Simplify.toAST(var1, Typ.intTyp), (AST)null)), new ASTS(), new Block(var1, new ASTS(new Exec(var1, new Assignop(var1, 49, Simplify.selectThis(var1, Simplify.fvarsS), new Ident(var1, Simplify.fvarsS))), new Exec(var1, new Assignop(var1, 49, Simplify.selectThis(var1, Simplify.receiverS), new Ident(var1, Simplify.receiverS))), new Exec(var1, new Assignop(var1, 49, Simplify.selectThis(var1, Simplify.tagS), new Ident(var1, Simplify.tagS))))));
}
private AST makeClosureApply() {
int var1 = this.body.pos;
ASTS var2 = new ASTS();
ClassObj var3 = (ClassObj)super.obj;
int var4 = Simplify.totalClosures(var3.superclass);
AST[] var6 = new AST[]{new VarDef(var1, Simplify.allargsS, 0, Simplify.objectArray(var1), new Apply(var1, new Select(var1, Simplify.toAST(var1, Simplify.ClosureS), Simplify.combineS), new ASTS(new Ident(var1, Simplify.fvarsS), new Ident(var1, Simplify.argsS)))), new Switch(var1, new Ident(var1, Simplify.tagS), var2), new Throw(var1, new New(var1, new Apply(var1, Simplify.toAST(var1, Simplify.MessageNotUnderstoodS), new ASTS(new Ident(var1, Simplify.tagS)))))};
return new FunDef(var1, 65, Simplify.applyS, 1, Simplify.objectTyp(var1), new ASTS(new VarDef(var1, Simplify.argsS, 0, Simplify.objectArray(var1), (AST)null)), new ASTS(), new Block(var1, new ASTS(var6)));
}
private AST makeClosureCall(FunDef var1, int var2) {
Apply var13 = new Apply(var3, Simplify.toAST(var3, var12.append(periodS).append(var1.name)), var5);
ASTS var14 = var4.restyp.tag == 12 ? new ASTS(new Exec(var3, var13), new Return(var3, new Ident(var3, Simplify.nullS))) : new ASTS(new Return(var3, Simplify.box(var13)));
return new Case(var3, new Literal(var3, 90, new Integer(var2)), var14);
}
Typ attr(Env var1, int var2, Typ var3) {
ClassObj var4 = (ClassObj)super.obj;
if (!this.fatallyFlawed(var4)) {
Attr.fixupScope(super.pos, var4);
this.funscope.baseOn(var4.scope);
this.clinit = new FunObj(8, Predef.clinitS, new FunTyp(new Typ[0], Typ.voidTyp, (TypSet)null));
this.clinitEnv = new Env(super.localEnv, this, new Scope(super.localEnv.scope, this.clinit));
this.clinitEnv.isStatic = true;
if ((var4.modifiers & 1536) == 0) {
var4.modifiers ^= 1024;
Obj var5 = firstUndef(var4, var4);
if (var5 != null) {
Report.error(super.pos, String.valueOf(String.valueOf(String.valueOf(String.valueOf(var4).concat(String.valueOf(" should be declared abstract; "))).concat(String.valueOf("it does not define "))).concat(String.valueOf(var5))).concat(String.valueOf(Attr.location(var5))));