mirror of
https://github.com/ParkerTenBroeck/coroutines.git
synced 2026-06-07 05:08:51 -04:00
meow
This commit is contained in:
parent
7970df5ee3
commit
61b1ca1c12
6 changed files with 94 additions and 47 deletions
|
|
@ -1,5 +1,8 @@
|
|||
import generator.future.Future;
|
||||
import generator.gen.Gen;
|
||||
import generator.future.Waker;
|
||||
|
||||
import java.util.Timer;
|
||||
import java.util.TimerTask;
|
||||
|
||||
public class Examples {
|
||||
// public static Gen<String, Void> parse(String str){
|
||||
|
|
@ -66,22 +69,35 @@ public class Examples {
|
|||
// return Gen.ret();
|
||||
// }
|
||||
|
||||
// public static Future<String> awaitTest2(int number){
|
||||
// for(int i = 0; i < number; i ++)Future.yield();
|
||||
// return Future.ret(number+"");
|
||||
// }
|
||||
public static class Delay implements Future<String>{
|
||||
|
||||
public static Future<String> awaitTest(int number){
|
||||
int i = 0;
|
||||
// Future.yield();
|
||||
// i = 1;
|
||||
// Future.yield();
|
||||
// i += i*12;
|
||||
// Future.yield();
|
||||
// return Future.ret(awaitTest2(number).await());
|
||||
for(; i < number; i++)
|
||||
Future.yield();
|
||||
return Future.ret("meow"+i);
|
||||
private final int delay;
|
||||
private boolean ready;
|
||||
public Delay(int ms){
|
||||
delay = ms;
|
||||
}
|
||||
@Override
|
||||
public Object poll(Waker waker) {
|
||||
new Timer().schedule(new TimerTask() {
|
||||
@Override
|
||||
public void run() {
|
||||
ready = true;
|
||||
waker.wake();
|
||||
}
|
||||
}, delay);
|
||||
if(ready)return null;
|
||||
return Pending.INSTANCE;
|
||||
}
|
||||
}
|
||||
|
||||
public static Future<String> awaitTest2(int number){
|
||||
((Future<?>)new Delay(number)).await();
|
||||
return Future.ret(number+"ms");
|
||||
}
|
||||
|
||||
public Future<String> awaitTest(int number){
|
||||
var result = awaitTest2(number).await();
|
||||
return Future.ret("Result: " + result);
|
||||
}
|
||||
|
||||
// public static Gen<Double, Void> test(double[] nyas){
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
import generator.RT;
|
||||
import generator.future.Future;
|
||||
import generator.future.Waker;
|
||||
import generator.gen.Gen;
|
||||
|
||||
import java.util.function.Supplier;
|
||||
|
|
@ -32,24 +33,40 @@ public class Main implements Runnable {
|
|||
// }
|
||||
// }
|
||||
|
||||
void await(){
|
||||
var gen = Examples.awaitTest(10);
|
||||
Object simple_async_rt(Future<?> fut){
|
||||
final var waker = new Waker(){
|
||||
@Override
|
||||
public void wake() {
|
||||
synchronized (this){
|
||||
this.notifyAll();
|
||||
}
|
||||
}
|
||||
};
|
||||
while(true) {
|
||||
var next = (Object)gen.poll(() -> {});
|
||||
var next = fut.poll(waker);
|
||||
if(!(next instanceof Future.Pending)){
|
||||
System.out.println(next);
|
||||
break;
|
||||
return next;
|
||||
}
|
||||
System.out.println("Pending");
|
||||
synchronized (waker){
|
||||
try {
|
||||
waker.wait();
|
||||
} catch (InterruptedException ignore) {}
|
||||
}
|
||||
System.out.println("Woke");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// 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);
|
||||
// }
|
||||
// }
|
||||
void await(){
|
||||
System.out.println(simple_async_rt(new Examples().awaitTest(2000)));
|
||||
}
|
||||
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -2,9 +2,8 @@ package generator.future;
|
|||
|
||||
public interface Future<R> {
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
default R poll(Waker waker){
|
||||
return (R)Pending.INSTANCE;
|
||||
default Object poll(Waker waker){
|
||||
return Pending.INSTANCE;
|
||||
}
|
||||
|
||||
default R await(){
|
||||
|
|
|
|||
|
|
@ -102,7 +102,13 @@ public class GeneratorClassLoader extends ClassLoader {
|
|||
private StateMachineBuilder futureMethod(ClassBuilder cb, MethodModel src_mem, ClassModel src_clm) {
|
||||
var com = src_mem.code().get();
|
||||
var smb = new FutureSMBuilder(src_clm, src_mem, com);
|
||||
try{
|
||||
add(smb.CD_this.displayName(), smb.buildStateMachine());
|
||||
}catch (Exception ignore){
|
||||
cb.withMethod(src_mem.methodName(), src_mem.methodType(), src_mem.flags().flagsMask(), mb -> {
|
||||
mb.with(com);
|
||||
});
|
||||
}
|
||||
cb.withMethod(src_mem.methodName(), src_mem.methodType(), src_mem.flags().flagsMask(), mb -> {
|
||||
mb.withCode(smb::buildSourceMethodShim);
|
||||
});
|
||||
|
|
|
|||
|
|
@ -19,10 +19,13 @@ public class LocalTracker {
|
|||
HashMap<Label, StackMapFrameInfo> stackMapFrames = new HashMap<>();
|
||||
StackMapFrameInfo currentFrame;
|
||||
ArrayList<LocalStore> localStore = new ArrayList<>();
|
||||
final int local_param_off;
|
||||
|
||||
|
||||
LocalTracker(StateMachineBuilder smb, CodeModel com) {
|
||||
LocalTracker(StateMachineBuilder smb, CodeModel com, int local_param_off) {
|
||||
this.local_param_off = local_param_off;
|
||||
int offset = 0;
|
||||
|
||||
for (var param : smb.params) {
|
||||
parameter_map.put(offset, param);
|
||||
offset += TypeKind.from(param).slotSize();
|
||||
|
|
@ -32,8 +35,9 @@ public class LocalTracker {
|
|||
var entries = new ArrayList<StackMapFrameInfo>();
|
||||
for (var smfi : attr.entries()) {
|
||||
var locals = new ArrayList<>(smfi.locals());
|
||||
for (int i = 0; i < smb.params.length; i++) locals.removeFirst();
|
||||
locals.addFirst(StackMapFrameInfo.ObjectVerificationTypeInfo.of(smb.CD_this));
|
||||
for (int i = 0; i < smb.params.length; i++)
|
||||
locals.removeFirst();
|
||||
// locals.addFirst(StackMapFrameInfo.ObjectVerificationTypeInfo.of(smb.CD_this));
|
||||
entries.add(StackMapFrameInfo.of(smfi.target(), locals, smfi.stack()));
|
||||
stackMapFrames.put(smfi.target(), entries.getLast());
|
||||
}
|
||||
|
|
@ -60,8 +64,8 @@ public class LocalTracker {
|
|||
name = StateMachineBuilder.LOCAL_PREFIX + localStore.size();
|
||||
localStore.add(new LocalStore(name, desc));
|
||||
}
|
||||
saved.add(new Saved(slot+1, name, desc));
|
||||
cob.aload(0).loadLocal(tk, slot+1).putfield(cd, name, desc);
|
||||
saved.add(new Saved(slot, name, desc));
|
||||
cob.aload(0).loadLocal(tk, slot).putfield(cd, name, desc);
|
||||
});
|
||||
run.run();
|
||||
|
||||
|
|
@ -97,8 +101,8 @@ public class LocalTracker {
|
|||
}
|
||||
|
||||
public void currentLocals(LocalConsumer consumer) {
|
||||
var slot = 0;
|
||||
if (currentFrame != null && false)
|
||||
var slot = local_param_off;
|
||||
if (currentFrame != null) {
|
||||
for (var kind : currentFrame.locals()) {
|
||||
switch (kind) {
|
||||
case StackMapFrameInfo.ObjectVerificationTypeInfo o -> {
|
||||
|
|
@ -129,10 +133,13 @@ public class LocalTracker {
|
|||
case StackMapFrameInfo.UninitializedVerificationTypeInfo _ -> throw new IllegalStateException();
|
||||
}
|
||||
}
|
||||
// for (var entry : localVarTypes.entrySet()) {
|
||||
// if (entry.getKey() < slot) continue;
|
||||
// ClassDesc cd = entry.getValue().upperBound();
|
||||
// consumer.consume(entry.getKey(), TypeKind.from(cd), cd);
|
||||
// }
|
||||
}else{
|
||||
for (var entry : localVarTypes.entrySet()) {
|
||||
if (entry.getKey() < slot) continue;
|
||||
ClassDesc cd = entry.getValue().upperBound();
|
||||
consumer.consume(entry.getKey(), TypeKind.from(cd), cd);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@ public abstract class StateMachineBuilder {
|
|||
public final MethodModel src_mem;
|
||||
public final CodeModel src_com;
|
||||
|
||||
public final LocalTracker lt;
|
||||
public LocalTracker lt;
|
||||
|
||||
protected HashMap<SpecialMethod, BiFunction<StateMachineBuilder, CodeBuilder, SpecialMethodHandler>> smmap = new HashMap<>();
|
||||
|
||||
|
|
@ -64,8 +64,6 @@ public abstract class StateMachineBuilder {
|
|||
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();
|
||||
|
||||
this.lt = new LocalTracker(this, src_com);
|
||||
}
|
||||
|
||||
public int add_state(Label label) {
|
||||
|
|
@ -135,6 +133,8 @@ public abstract class StateMachineBuilder {
|
|||
public void buildStateMachineCode(ClassBuilder clb, CodeBuilder cob, int loc_param_off) {
|
||||
boolean ignore_next_pop = false;
|
||||
|
||||
this.lt = new LocalTracker(this, src_com, loc_param_off);
|
||||
|
||||
var invalidState = cob.newLabel();
|
||||
var start_label = cob.newLabel();
|
||||
add_state(start_label);
|
||||
|
|
@ -147,6 +147,8 @@ public abstract class StateMachineBuilder {
|
|||
handlers.add(handler.apply(this, cob));
|
||||
}
|
||||
}
|
||||
// if(handlers.isEmpty() && stateSwitchCases.isEmpty())
|
||||
// throw new RuntimeException("Not a state machine");
|
||||
cob.aload(0).getfield(CD_this, STATE_NAME, TypeKind.INT.upperBound()).lookupswitch(invalidState, stateSwitchCases);
|
||||
var start = cob.startLabel();
|
||||
var end = cob.newLabel();
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue