mirror of
https://github.com/ParkerTenBroeck/coroutines.git
synced 2026-06-06 21:00:35 -04:00
cleaned up code, made generated classes inner by default, improved names
This commit is contained in:
parent
3a6ed0f81c
commit
7fbe61a97c
5 changed files with 21 additions and 44 deletions
|
|
@ -12,8 +12,8 @@ import java.nio.charset.StandardCharsets;
|
|||
|
||||
public class AsyncExamples {
|
||||
|
||||
static long sent = 0;
|
||||
static long received = 0;
|
||||
private static long sent = 0;
|
||||
private static long received = 0;
|
||||
public static Future<Void, RuntimeException> test(){
|
||||
Jokio.runtime().await().spawn(server());
|
||||
|
||||
|
|
|
|||
|
|
@ -11,8 +11,8 @@ public class Main implements Runnable {
|
|||
|
||||
@Override
|
||||
public void run() {
|
||||
// await();
|
||||
lexer();
|
||||
await();
|
||||
// lexer();
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -10,15 +10,15 @@ import java.lang.constant.ConstantDescs;
|
|||
import java.lang.constant.MethodTypeDesc;
|
||||
import java.lang.reflect.AccessFlag;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public abstract class StateMachineBuilder {
|
||||
public final static String PARAM_PREFIX = "param_";
|
||||
public final static String LOCAL_PREFIX = "local_";
|
||||
public final static String STATE_NAME = "state";
|
||||
|
||||
private static int sequence;
|
||||
|
||||
public final ClassDesc CD_this;
|
||||
public final String innerClassName;
|
||||
public final ClassDesc[] params;
|
||||
public final MethodTypeDesc MTD_init;
|
||||
public final int paramSlotOff;
|
||||
|
|
@ -30,7 +30,8 @@ public abstract class StateMachineBuilder {
|
|||
ArrayList<LState> lstate = new ArrayList<>();
|
||||
|
||||
private final ArrayList<Frame> frames = new ArrayList<>();
|
||||
private final ArrayList<SpecialMethodHandler> handlers = new ArrayList<>();
|
||||
|
||||
protected final HashMap<SpecialMethod, SpecialMethodBuilder> smmap = new HashMap<>();
|
||||
|
||||
record LState(String name, ClassDesc cd) {
|
||||
}
|
||||
|
|
@ -39,14 +40,6 @@ public abstract class StateMachineBuilder {
|
|||
SpecialMethodHandler build(StateMachineBuilder smb, CodeBuilder cob, StateBuilder sb);
|
||||
}
|
||||
|
||||
protected HashMap<SpecialMethod, SpecialMethodBuilder> smmap = new HashMap<>();
|
||||
|
||||
// private final ArrayList<SwitchCase> stateSwitchCases = new ArrayList<>();
|
||||
|
||||
protected String uniqueName(){
|
||||
return sequence+++"";
|
||||
}
|
||||
|
||||
public void params(int slot_start, ParamConsumer consumer){
|
||||
int offset = 0;
|
||||
for (var param : params) {
|
||||
|
|
@ -55,7 +48,7 @@ public abstract class StateMachineBuilder {
|
|||
}
|
||||
}
|
||||
|
||||
public StateMachineBuilder(ClassModel src_clm, MethodModel src_mem, CodeModel src_com){
|
||||
public StateMachineBuilder(ClassModel src_clm, MethodModel src_mem, CodeModel src_com, String namePostfix){
|
||||
this.src_clm = src_clm;
|
||||
this.src_mem = src_mem;
|
||||
this.src_com = src_com;
|
||||
|
|
@ -65,25 +58,22 @@ public abstract class StateMachineBuilder {
|
|||
if (!src_mem.flags().has(AccessFlag.STATIC)) {
|
||||
mts = mts.insertParameterTypes(0, src_clm.thisClass().asSymbol());
|
||||
}
|
||||
var name = src_clm.thisClass().asSymbol().displayName() + "$" + src_mem.methodName().stringValue() + "$" + uniqueName();
|
||||
var cdn = src_clm.thisClass().asSymbol().displayName();
|
||||
var method_name = src_mem.methodName().stringValue();
|
||||
var param_cnd = src_mem.methodTypeSymbol().parameterList().stream().map(desc -> desc.descriptorString().replace("/", "__").replace(";", "__")).collect(Collectors.joining("$"));
|
||||
innerClassName = method_name + "$$" + param_cnd + "$$";
|
||||
var name = cdn + "$" +innerClassName;
|
||||
|
||||
this.CD_this = ClassDesc.of(src_clm.thisClass().asSymbol().packageName(), name);
|
||||
this.params = mts.parameterArray();
|
||||
this.MTD_init = MethodTypeDesc.of(ConstantDescs.CD_void, params);
|
||||
this.paramSlotOff = Arrays.stream(params).mapToInt(p -> TypeKind.from(p).slotSize()).sum();
|
||||
|
||||
|
||||
System.out.println("FRAME");
|
||||
var lt = new FrameTracker(this, src_com);
|
||||
int bco = 0;
|
||||
for(var coe : src_com){
|
||||
if(coe instanceof Instruction i) {
|
||||
if(coe instanceof Instruction)
|
||||
frames.add(new Frame(lt.locals(), lt.stack()));
|
||||
System.out.println(bco + " " + frames.getLast() + " " + coe);
|
||||
bco += i.sizeInBytes();
|
||||
}
|
||||
lt.encounter(coe);
|
||||
|
||||
}
|
||||
frames.add(new Frame(lt.locals(), lt.stack()));
|
||||
}
|
||||
|
|
@ -111,11 +101,6 @@ public abstract class StateMachineBuilder {
|
|||
};
|
||||
}
|
||||
|
||||
// public int add_state(Label label) {
|
||||
// stateSwitchCases.add(SwitchCase.of(stateSwitchCases.size(), label));
|
||||
// return stateSwitchCases.size() - 1;
|
||||
// }
|
||||
|
||||
public void buildSourceMethodShim(CodeBuilder cob){
|
||||
cob.new_(CD_this).dup();
|
||||
params(0, (_, slot, type) -> {
|
||||
|
|
@ -125,7 +110,7 @@ public abstract class StateMachineBuilder {
|
|||
}
|
||||
|
||||
public boolean shouldBeInnerClass(){
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
public byte[] buildStateMachine(){
|
||||
|
|
@ -133,7 +118,7 @@ public abstract class StateMachineBuilder {
|
|||
|
||||
if(shouldBeInnerClass()){
|
||||
src_clm.findAttributes(Attributes.sourceFile()).forEach(clb::with);
|
||||
clb.with(InnerClassesAttribute.of(InnerClassInfo.of(CD_this, Optional.of(src_clm.thisClass().asSymbol()), Optional.of(CD_this.displayName().split("\\$")[1]), AccessFlag.PUBLIC, AccessFlag.FINAL, AccessFlag.STATIC)));
|
||||
clb.with(InnerClassesAttribute.of(InnerClassInfo.of(CD_this, Optional.of(src_clm.thisClass().asSymbol()), Optional.of(innerClassName), AccessFlag.PUBLIC, AccessFlag.FINAL, AccessFlag.STATIC)));
|
||||
clb.with(NestHostAttribute.of(src_clm.thisClass()));
|
||||
}
|
||||
|
||||
|
|
@ -183,6 +168,8 @@ public abstract class StateMachineBuilder {
|
|||
|
||||
public void buildStateMachineCode(ClassBuilder clb, CodeBuilder cob, int loc_param_off) {
|
||||
var stateBuilder = new StateBuilder();
|
||||
var handlers = new ArrayList<SpecialMethodHandler>();
|
||||
|
||||
boolean ignore_next_pop = false;
|
||||
|
||||
var invalid_state = cob.newLabel();
|
||||
|
|
|
|||
|
|
@ -154,11 +154,6 @@ public class FutureSMBuilder extends StateMachineBuilder {
|
|||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String uniqueName() {
|
||||
return "Fut";
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void buildStateMachineMethod(ClassBuilder clb){
|
||||
clb.withInterfaces(List.of(clb.constantPool().classEntry(CD_Future)));
|
||||
|
|
@ -177,7 +172,7 @@ public class FutureSMBuilder extends StateMachineBuilder {
|
|||
}
|
||||
|
||||
public FutureSMBuilder(ClassModel src_clm, MethodModel src_mem, CodeModel src_com) {
|
||||
super(src_clm, src_mem, src_com);
|
||||
super(src_clm, src_mem, src_com, "Fut");
|
||||
smmap.put(new SpecialMethod(CD_Future, "await", MTD_Obj), AwaitHandler::new);
|
||||
smmap.put(new SpecialMethod(CD_Future, "ret", MTD_Future_Obj), RetHandler::new);
|
||||
smmap.put(new SpecialMethod(CD_Future, "ret", MTD_Future), RetVoidHandler::new);
|
||||
|
|
|
|||
|
|
@ -95,18 +95,13 @@ public class GenSMBuilder extends StateMachineBuilder {
|
|||
}
|
||||
|
||||
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, "Gen");
|
||||
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
|
||||
protected String uniqueName() {
|
||||
return "Gen"+super.uniqueName();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void buildStateMachineMethod(ClassBuilder clb){
|
||||
clb.withInterfaces(List.of(clb.constantPool().classEntry(CD_Gen)));
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue