diff --git a/src/Main.java b/src/Main.java index 38dfd8f..2ca6011 100644 --- a/src/Main.java +++ b/src/Main.java @@ -11,50 +11,10 @@ public class Main implements Runnable { @Override public void run() { - await(); -// lexer(); -// lambda(); +// await(); + lexer(); } -// void lambda(){ -// var gen = ((Supplier>)() -> { -// Gen.yield(12); -// return Gen.ret("hello"); -// }).get(); -// -// while(true) { -// var next = gen.next(); -// if(next instanceof Gen.Yield(var e)) System.out.println(e); -// else if(next instanceof Gen.Ret(var ret)){ -// System.out.println(ret); -// break; -// } -// } -// } - - Object simple_async_rt(Future fut){ - final var waker = new Waker(){ - @Override - public void wake() { - synchronized (this){ - this.notifyAll(); - } - } - }; - while(true) { - var next = fut.poll(waker); - if(!(next instanceof Future.Pending)){ - return next; - } - System.out.println("Pending"); - synchronized (waker){ - try { - waker.wait(); - } catch (InterruptedException ignore) {} - } - System.out.println("Woke"); - } - } void await(){ new Jokio().blocking(AsyncExamples.test()); @@ -63,7 +23,6 @@ public class Main implements Runnable { void lexer(){ var gen = Lexer.parse("f7(x,y,z,w, u,v, othersIg) = v-(x*y+y+ln(z)^2*sin(z*pi/2))/(w*u)+sqrt(othersIg*120e-1)"); -// var gen = Examples.test(new double[]{1,2,3,4}); while(gen.next() instanceof Gen.Yield(var tok)) { System.out.println(tok); } diff --git a/src/generators/loadtime/Frame.java b/src/generators/loadtime/Frame.java index 78a19e9..73e7f29 100644 --- a/src/generators/loadtime/Frame.java +++ b/src/generators/loadtime/Frame.java @@ -16,6 +16,7 @@ public record Frame(FrameTracker.Type[] locals, FrameTracker.Type[] stack) { slot++; if (slot <= smb.paramSlotOff) continue; + if(entry.tag() == FrameTracker.Type.TOP_TYPE.tag())continue; if (entry.isCategory2_2nd()) continue; sst.save_local(smb, cob, entry.toCD(), slot - smb.paramSlotOff + loc_off - 1); diff --git a/src/generators/loadtime/future/FutureSMBuilder.java b/src/generators/loadtime/future/FutureSMBuilder.java index 5f91876..2ae9685 100644 --- a/src/generators/loadtime/future/FutureSMBuilder.java +++ b/src/generators/loadtime/future/FutureSMBuilder.java @@ -41,9 +41,9 @@ public class FutureSMBuilder extends StateMachineBuilder { cob.labelBinding(save_label); var sst = new SavedStateTracker(); frame.save_locals(smb, cob, sst,2); - cob.storeLocal(TypeKind.REFERENCE, frame.locals().length+2); + cob.storeLocal(TypeKind.REFERENCE, 2); frame.save_stack(smb, cob, sst,1); - cob.loadLocal(TypeKind.REFERENCE, frame.locals().length+2); + cob.loadLocal(TypeKind.REFERENCE, 2); cob.areturn(); awaiting.bind(cob); sst.restore_all(smb, cob); diff --git a/src/generators/loadtime/gen/GenSMBuilder.java b/src/generators/loadtime/gen/GenSMBuilder.java index bb4516c..64fa17c 100644 --- a/src/generators/loadtime/gen/GenSMBuilder.java +++ b/src/generators/loadtime/gen/GenSMBuilder.java @@ -20,64 +20,86 @@ public class GenSMBuilder extends StateMachineBuilder { public final static MethodTypeDesc MTD_Gen = MethodTypeDesc.of(CD_Gen); public final static MethodTypeDesc MTD_Obj = MethodTypeDesc.of(ConstantDescs.CD_Object); -// static class YieldHandler extends SpecialMethodHandler { -// final int resume_state; -// final Label resume_label; -// final boolean is_void; -// -// public YieldHandler(StateMachineBuilder smb, CodeBuilder cob, boolean is_void) { -// super(smb, cob); -// resume_state = smb.add_state(resume_label = cob.newLabel()); -// this.is_void = is_void; -// } -// -// public ReplacementKind replacementKind(){return ReplacementKind.ImmediateReplacingPop;} -// -// @Override -// public void build_prelude(StateMachineBuilder smb, CodeBuilder cob, Frame frame) { -// if(is_void)cob.aconst_null(); -// -//// smb.lt.savingLocals(smb.CD_this, cob, () -> { -//// cob.aload(0).loadConstant(resume_state).putfield(smb.CD_this, STATE_NAME, TypeKind.INT.upperBound()) -//// .new_(CD_Yield) -//// .dup_x1() -//// .swap() -//// .invokespecial(CD_Yield, ConstantDescs.INIT_NAME, MethodTypeDesc.of(ConstantDescs.CD_void, ConstantDescs.CD_Object)) -//// .areturn(); -//// cob.labelBinding(resume_label); -//// }); -// } -// } -// -// static class RetHandler extends SpecialMethodHandler { -// final boolean is_void; -// -// public RetHandler(StateMachineBuilder smb, CodeBuilder cob, boolean is_void) { -// super(smb, cob); -// this.is_void = is_void; -// } -// -// public ReplacementKind replacementKind(){return ReplacementKind.ReplacingNextReturn;} -// -// @Override -// public void build_prelude(StateMachineBuilder smb, CodeBuilder cob, Frame frame) { -// if(is_void)cob.aconst_null(); -// -// cob.aload(0).loadConstant(-1).putfield(smb.CD_this, STATE_NAME, TypeKind.INT.upperBound()) -// .new_(CD_Ret) -// .dup_x1() -// .swap() -// .invokespecial(CD_Ret, ConstantDescs.INIT_NAME, MethodTypeDesc.of(ConstantDescs.CD_void, ConstantDescs.CD_Object)) -// .areturn(); -// } -// } + static class YieldHandler implements SpecialMethodHandler { + final StateBuilder.State yielded; + final Label save; + final Label resume; + final boolean is_void; + + public YieldHandler(StateMachineBuilder smb, CodeBuilder cob, StateBuilder sb, boolean is_void) { + yielded = sb.create(cob); + save = cob.newLabel(); + resume = cob.newLabel(); + this.is_void = is_void; + } + + public ReplacementKind replacementKind(){return ReplacementKind.ImmediateReplacingPop;} + + @Override + public void build_prelude(StateMachineBuilder smb, CodeBuilder cob, Frame frame) { + + + cob.labelBinding(save); + var sst = new SavedStateTracker(); + frame.save_locals(smb, cob, sst,1); + cob.storeLocal(TypeKind.REFERENCE, 1); + frame.save_stack(smb, cob, sst,1); + cob.loadLocal(TypeKind.REFERENCE, 1); + + cob.areturn(); + + yielded.bind(cob); + sst.restore_all(smb, cob); + cob.goto_(resume); + } + + @Override + public void build_inline(StateMachineBuilder smb, CodeBuilder cob, Frame frame) { + if(is_void)cob.aconst_null(); + + yielded.setState(smb, cob); + + cob.new_(CD_Yield) + .dup_x1() + .swap() + .invokespecial(CD_Yield, ConstantDescs.INIT_NAME, MethodTypeDesc.of(ConstantDescs.CD_void, ConstantDescs.CD_Object)) + .goto_(save); + + cob.labelBinding(resume); + } + } + + static class RetHandler implements SpecialMethodHandler { + final boolean is_void; + + public RetHandler(StateMachineBuilder smb, CodeBuilder cob, StateBuilder sb, boolean is_void) { + this.is_void = is_void; + } + + public ReplacementKind replacementKind(){return ReplacementKind.ReplacingNextReturn;} + + @Override + public void build_prelude(StateMachineBuilder smb, CodeBuilder cob, Frame frame) {} + + @Override + public void build_inline(StateMachineBuilder smb, CodeBuilder cob, Frame frame) { + if(is_void)cob.aconst_null(); + + cob.aload(0).loadConstant(-1).putfield(smb.CD_this, STATE_NAME, TypeKind.INT.upperBound()) + .new_(CD_Ret) + .dup_x1() + .swap() + .invokespecial(CD_Ret, ConstantDescs.INIT_NAME, MethodTypeDesc.of(ConstantDescs.CD_void, ConstantDescs.CD_Object)) + .areturn(); + } + } public GenSMBuilder(ClassModel src_clm, MethodModel src_mem, CodeModel src_com) { super(src_clm, src_mem, src_com); -// smmap.put(new SpecialMethod(CD_Gen, "yield", MTD_Gen_Obj),(smb, cob) -> new YieldHandler(smb, cob, false)); -// smmap.put(new SpecialMethod(CD_Gen, "yield", MTD_Gen),(smb, cob) -> new YieldHandler(smb, cob, true)); -// smmap.put(new SpecialMethod(CD_Gen, "ret", MTD_Gen_Obj),(smb, cob) -> new RetHandler(smb, cob, false)); -// smmap.put(new SpecialMethod(CD_Gen, "ret", MTD_Gen),(smb, cob) -> new RetHandler(smb, cob, true)); + smmap.put(new SpecialMethod(CD_Gen, "yield", MTD_Gen_Obj),(smb, cob, sb) -> new YieldHandler(smb, cob, sb, false)); + smmap.put(new SpecialMethod(CD_Gen, "yield", MTD_Gen),(smb, cob, sb) -> new YieldHandler(smb, cob, sb,true)); + smmap.put(new SpecialMethod(CD_Gen, "ret", MTD_Gen_Obj),(smb, cob, sb) -> new RetHandler(smb, cob, sb,false)); + smmap.put(new SpecialMethod(CD_Gen, "ret", MTD_Gen),(smb, cob, sb) -> new RetHandler(smb, cob, sb, true)); } @Override