mirror of
https://github.com/ParkerTenBroeck/coroutines.git
synced 2026-06-06 21:00:35 -04:00
fixed generator code after changes to state machine builder
This commit is contained in:
parent
190c9814cf
commit
3a6ed0f81c
4 changed files with 82 additions and 100 deletions
|
|
@ -11,50 +11,10 @@ public class Main implements Runnable {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
await();
|
// await();
|
||||||
// lexer();
|
lexer();
|
||||||
// lambda();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// void lambda(){
|
|
||||||
// var gen = ((Supplier<Gen<Integer, String>>)() -> {
|
|
||||||
// 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<?, RuntimeException> 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(){
|
void await(){
|
||||||
new Jokio().blocking(AsyncExamples.test());
|
new Jokio().blocking(AsyncExamples.test());
|
||||||
|
|
@ -63,7 +23,6 @@ public class Main implements Runnable {
|
||||||
|
|
||||||
void lexer(){
|
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 = 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)) {
|
while(gen.next() instanceof Gen.Yield(var tok)) {
|
||||||
System.out.println(tok);
|
System.out.println(tok);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,7 @@ public record Frame(FrameTracker.Type[] locals, FrameTracker.Type[] stack) {
|
||||||
slot++;
|
slot++;
|
||||||
if (slot <= smb.paramSlotOff) continue;
|
if (slot <= smb.paramSlotOff) continue;
|
||||||
|
|
||||||
|
if(entry.tag() == FrameTracker.Type.TOP_TYPE.tag())continue;
|
||||||
if (entry.isCategory2_2nd()) continue;
|
if (entry.isCategory2_2nd()) continue;
|
||||||
|
|
||||||
sst.save_local(smb, cob, entry.toCD(), slot - smb.paramSlotOff + loc_off - 1);
|
sst.save_local(smb, cob, entry.toCD(), slot - smb.paramSlotOff + loc_off - 1);
|
||||||
|
|
|
||||||
|
|
@ -41,9 +41,9 @@ public class FutureSMBuilder extends StateMachineBuilder {
|
||||||
cob.labelBinding(save_label);
|
cob.labelBinding(save_label);
|
||||||
var sst = new SavedStateTracker();
|
var sst = new SavedStateTracker();
|
||||||
frame.save_locals(smb, cob, sst,2);
|
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);
|
frame.save_stack(smb, cob, sst,1);
|
||||||
cob.loadLocal(TypeKind.REFERENCE, frame.locals().length+2);
|
cob.loadLocal(TypeKind.REFERENCE, 2);
|
||||||
cob.areturn();
|
cob.areturn();
|
||||||
awaiting.bind(cob);
|
awaiting.bind(cob);
|
||||||
sst.restore_all(smb, cob);
|
sst.restore_all(smb, cob);
|
||||||
|
|
|
||||||
|
|
@ -20,64 +20,86 @@ public class GenSMBuilder extends StateMachineBuilder {
|
||||||
public final static MethodTypeDesc MTD_Gen = MethodTypeDesc.of(CD_Gen);
|
public final static MethodTypeDesc MTD_Gen = MethodTypeDesc.of(CD_Gen);
|
||||||
public final static MethodTypeDesc MTD_Obj = MethodTypeDesc.of(ConstantDescs.CD_Object);
|
public final static MethodTypeDesc MTD_Obj = MethodTypeDesc.of(ConstantDescs.CD_Object);
|
||||||
|
|
||||||
// static class YieldHandler extends SpecialMethodHandler {
|
static class YieldHandler implements SpecialMethodHandler {
|
||||||
// final int resume_state;
|
final StateBuilder.State yielded;
|
||||||
// final Label resume_label;
|
final Label save;
|
||||||
// final boolean is_void;
|
final Label resume;
|
||||||
//
|
final boolean is_void;
|
||||||
// public YieldHandler(StateMachineBuilder smb, CodeBuilder cob, boolean is_void) {
|
|
||||||
// super(smb, cob);
|
public YieldHandler(StateMachineBuilder smb, CodeBuilder cob, StateBuilder sb, boolean is_void) {
|
||||||
// resume_state = smb.add_state(resume_label = cob.newLabel());
|
yielded = sb.create(cob);
|
||||||
// this.is_void = is_void;
|
save = cob.newLabel();
|
||||||
// }
|
resume = cob.newLabel();
|
||||||
//
|
this.is_void = is_void;
|
||||||
// public ReplacementKind replacementKind(){return ReplacementKind.ImmediateReplacingPop;}
|
}
|
||||||
//
|
|
||||||
// @Override
|
public ReplacementKind replacementKind(){return ReplacementKind.ImmediateReplacingPop;}
|
||||||
// public void build_prelude(StateMachineBuilder smb, CodeBuilder cob, Frame frame) {
|
|
||||||
// if(is_void)cob.aconst_null();
|
@Override
|
||||||
//
|
public void build_prelude(StateMachineBuilder smb, CodeBuilder cob, Frame frame) {
|
||||||
//// 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)
|
cob.labelBinding(save);
|
||||||
//// .dup_x1()
|
var sst = new SavedStateTracker();
|
||||||
//// .swap()
|
frame.save_locals(smb, cob, sst,1);
|
||||||
//// .invokespecial(CD_Yield, ConstantDescs.INIT_NAME, MethodTypeDesc.of(ConstantDescs.CD_void, ConstantDescs.CD_Object))
|
cob.storeLocal(TypeKind.REFERENCE, 1);
|
||||||
//// .areturn();
|
frame.save_stack(smb, cob, sst,1);
|
||||||
//// cob.labelBinding(resume_label);
|
cob.loadLocal(TypeKind.REFERENCE, 1);
|
||||||
//// });
|
|
||||||
// }
|
cob.areturn();
|
||||||
// }
|
|
||||||
//
|
yielded.bind(cob);
|
||||||
// static class RetHandler extends SpecialMethodHandler {
|
sst.restore_all(smb, cob);
|
||||||
// final boolean is_void;
|
cob.goto_(resume);
|
||||||
//
|
}
|
||||||
// public RetHandler(StateMachineBuilder smb, CodeBuilder cob, boolean is_void) {
|
|
||||||
// super(smb, cob);
|
@Override
|
||||||
// this.is_void = is_void;
|
public void build_inline(StateMachineBuilder smb, CodeBuilder cob, Frame frame) {
|
||||||
// }
|
if(is_void)cob.aconst_null();
|
||||||
//
|
|
||||||
// public ReplacementKind replacementKind(){return ReplacementKind.ReplacingNextReturn;}
|
yielded.setState(smb, cob);
|
||||||
//
|
|
||||||
// @Override
|
cob.new_(CD_Yield)
|
||||||
// public void build_prelude(StateMachineBuilder smb, CodeBuilder cob, Frame frame) {
|
.dup_x1()
|
||||||
// if(is_void)cob.aconst_null();
|
.swap()
|
||||||
//
|
.invokespecial(CD_Yield, ConstantDescs.INIT_NAME, MethodTypeDesc.of(ConstantDescs.CD_void, ConstantDescs.CD_Object))
|
||||||
// cob.aload(0).loadConstant(-1).putfield(smb.CD_this, STATE_NAME, TypeKind.INT.upperBound())
|
.goto_(save);
|
||||||
// .new_(CD_Ret)
|
|
||||||
// .dup_x1()
|
cob.labelBinding(resume);
|
||||||
// .swap()
|
}
|
||||||
// .invokespecial(CD_Ret, ConstantDescs.INIT_NAME, MethodTypeDesc.of(ConstantDescs.CD_void, ConstantDescs.CD_Object))
|
}
|
||||||
// .areturn();
|
|
||||||
// }
|
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) {
|
public GenSMBuilder(ClassModel src_clm, MethodModel src_mem, CodeModel src_com) {
|
||||||
super(src_clm, src_mem, 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_Obj),(smb, cob, sb) -> new YieldHandler(smb, cob, sb, false));
|
||||||
// smmap.put(new SpecialMethod(CD_Gen, "yield", MTD_Gen),(smb, cob) -> new YieldHandler(smb, cob, true));
|
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) -> new RetHandler(smb, cob, false));
|
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) -> new RetHandler(smb, cob, true));
|
smmap.put(new SpecialMethod(CD_Gen, "ret", MTD_Gen),(smb, cob, sb) -> new RetHandler(smb, cob, sb, true));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue