mirror of
https://github.com/ParkerTenBroeck/coroutines.git
synced 2026-06-06 21:00:35 -04:00
fixed a number of bugs related to stack frame interpretation
This commit is contained in:
parent
0ad439c4d6
commit
d4771ef4e0
9 changed files with 52 additions and 52 deletions
|
|
@ -1,4 +1,4 @@
|
||||||
import async_example.Delay;
|
import async_example.Jokio;
|
||||||
import async_example.Socket;
|
import async_example.Socket;
|
||||||
import generator.future.Future;
|
import generator.future.Future;
|
||||||
import generator.future.Waker;
|
import generator.future.Waker;
|
||||||
|
|
@ -84,39 +84,30 @@ public class Examples {
|
||||||
// return Future.ret(value);
|
// return Future.ret(value);
|
||||||
// }
|
// }
|
||||||
|
|
||||||
// public static Future<Void> send(ByteBuffer buffer, Socket socket){
|
|
||||||
// String message = "hello world!\n";
|
|
||||||
// buffer.limit(message.length()).put(message.getBytes(StandardCharsets.UTF_8)).position(0);
|
|
||||||
// var wrote = socket.write_all(buffer).await();
|
|
||||||
// buffer.clear().limit(wrote);
|
|
||||||
// var read = socket.read_all(buffer).await();
|
|
||||||
// System.out.println(new String(buffer.array(), 0, read));
|
|
||||||
//
|
|
||||||
// return Future.ret(null);
|
|
||||||
// }
|
|
||||||
|
|
||||||
public static Future<Void> forever(Socket socket){
|
public static Future<Void> test(){
|
||||||
|
for(int i = 0; i < 1000; i ++){
|
||||||
|
Jokio.runtime(Waker.waker()).spawn(echoForever("Message " + i + "\n"));
|
||||||
|
}
|
||||||
|
return Future.ret(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Future<Void> echoForever(String message){
|
||||||
|
try(var socket = Socket.connect(new InetSocketAddress("45.79.112.203", 4242)).await()){
|
||||||
var buffer = ByteBuffer.allocate(500);
|
var buffer = ByteBuffer.allocate(500);
|
||||||
while(true){
|
while(true){
|
||||||
// send(buffer, socket).await();
|
buffer.limit(message.length()).put(message.getBytes(StandardCharsets.UTF_8)).position(0);
|
||||||
((Future<?>)new Delay(1000 + buffer.get())).await();
|
var wrote = socket.write_all(buffer).await();
|
||||||
System.out.println(socket);
|
buffer.clear().limit(wrote);
|
||||||
|
var read = socket.read_all(buffer).await();
|
||||||
|
System.out.print(new String(buffer.array(), 0, read));
|
||||||
|
buffer.clear();
|
||||||
}
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return Future.ret(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
// public Future<String> awaitTest(int number){
|
|
||||||
//// var result = number(10).await()+number(20).await();
|
|
||||||
//// Jokio.runtime().await().spawn(awaitTest2(5000));
|
|
||||||
//
|
|
||||||
// try(var socket = Socket.connect(new InetSocketAddress("45.79.112.203", 4242)).await()){
|
|
||||||
// forever(socket).await();
|
|
||||||
// } catch (Exception e) {
|
|
||||||
// e.printStackTrace();
|
|
||||||
//// throw new RuntimeException(e);
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// return Future.ret("");
|
|
||||||
// }
|
|
||||||
|
|
||||||
// public Future<String> closing(int number){
|
// public Future<String> closing(int number){
|
||||||
// try(var m = new Meow()){
|
// try(var m = new Meow()){
|
||||||
|
|
|
||||||
|
|
@ -57,7 +57,7 @@ public class Main implements Runnable {
|
||||||
}
|
}
|
||||||
|
|
||||||
void await(){
|
void await(){
|
||||||
new Jokio().blocking(Examples.forever(null));
|
new Jokio().blocking(Examples.test());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -38,6 +38,10 @@ public class Jokio implements Runnable{
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Jokio runtime(Waker waker){
|
||||||
|
return ((Task<?>)waker).runtime();
|
||||||
|
}
|
||||||
|
|
||||||
private final HashSet<Task<?>> current = new HashSet<>();
|
private final HashSet<Task<?>> current = new HashSet<>();
|
||||||
private final Queue<Task<?>> woke = new ArrayDeque<>();
|
private final Queue<Task<?>> woke = new ArrayDeque<>();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -42,7 +42,6 @@ public class Socket implements AutoCloseable{
|
||||||
var c = (SocketChannel)key.channel();
|
var c = (SocketChannel)key.channel();
|
||||||
var w = (Waker)key.attachment();
|
var w = (Waker)key.attachment();
|
||||||
|
|
||||||
System.out.println(key);
|
|
||||||
if (!key.isValid()) {
|
if (!key.isValid()) {
|
||||||
}
|
}
|
||||||
if(key.isAcceptable()){
|
if(key.isAcceptable()){
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,10 @@ public interface Future<R> {
|
||||||
throw new RuntimeException("NO!");
|
throw new RuntimeException("NO!");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static Future<Void> ret(){
|
||||||
|
throw new RuntimeException();
|
||||||
|
}
|
||||||
|
|
||||||
static void yield() {
|
static void yield() {
|
||||||
throw new RuntimeException("NO!");
|
throw new RuntimeException("NO!");
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@ public record Frame(FrameTracker.Type[] locals, FrameTracker.Type[] stack) {
|
||||||
int slot = 0;
|
int slot = 0;
|
||||||
for (var entry : locals) {
|
for (var entry : locals) {
|
||||||
slot++;
|
slot++;
|
||||||
if (slot <= loc_off) continue;
|
if (slot <= smb.paramSlotOff) continue;
|
||||||
|
|
||||||
if (entry.isCategory2_2nd()) continue;
|
if (entry.isCategory2_2nd()) continue;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -234,13 +234,8 @@ public class FrameTracker {
|
||||||
}
|
}
|
||||||
|
|
||||||
for (var attr : com.findAttributes(Attributes.stackMapTable())) {
|
for (var attr : com.findAttributes(Attributes.stackMapTable())) {
|
||||||
var entries = new ArrayList<StackMapFrameInfo>();
|
|
||||||
for (var smfi : attr.entries()) {
|
for (var smfi : attr.entries()) {
|
||||||
var locals = new ArrayList<>(smfi.locals());
|
stackMapFrames.put(smfi.target(), smfi);
|
||||||
for (int i = 0; i < smb.params.length; i++)
|
|
||||||
locals.removeFirst();
|
|
||||||
entries.add(StackMapFrameInfo.of(smfi.target(), locals, smfi.stack()));
|
|
||||||
stackMapFrames.put(smfi.target(), entries.getLast());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -471,7 +466,6 @@ public class FrameTracker {
|
||||||
public void encounterLabel(Label l) {
|
public void encounterLabel(Label l) {
|
||||||
var tmp = stackMapFrames.get(l);
|
var tmp = stackMapFrames.get(l);
|
||||||
if (tmp != null) {
|
if (tmp != null) {
|
||||||
// if(tmp.frameType()==252)
|
|
||||||
stack.clear();
|
stack.clear();
|
||||||
locals.clear();
|
locals.clear();
|
||||||
for( var sl : tmp.stack())
|
for( var sl : tmp.stack())
|
||||||
|
|
@ -479,13 +473,6 @@ public class FrameTracker {
|
||||||
|
|
||||||
for( var sl : tmp.locals())
|
for( var sl : tmp.locals())
|
||||||
locals.add(Type.verificationType(sl));
|
locals.add(Type.verificationType(sl));
|
||||||
|
|
||||||
// while(locals.size()>tmp.locals().size())locals.removeLast();
|
|
||||||
// while(locals.size()<tmp.locals().size())locals.add(null);
|
|
||||||
// int slot = 0;
|
|
||||||
// for( var local : tmp.locals()){
|
|
||||||
// locals.set(slot, Type.verificationType(local));
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -25,7 +25,7 @@ public class SavedStateTracker {
|
||||||
}
|
}
|
||||||
|
|
||||||
var s = new StackState(name, desc);
|
var s = new StackState(name, desc);
|
||||||
saved.addFirst(s);
|
saved.add(s);
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -51,8 +51,22 @@ public class SavedStateTracker {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void restore_stack(StateMachineBuilder smb, CodeBuilder cob){
|
||||||
|
for(int i = saved.size()-1; i >= 0; i --){
|
||||||
|
if(saved.get(i) instanceof StackState)
|
||||||
|
restore(smb, cob, saved.get(i));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void restore_locals(StateMachineBuilder smb, CodeBuilder cob){
|
||||||
|
for(int i = saved.size()-1; i >= 0; i --){
|
||||||
|
if(saved.get(i) instanceof StackState)
|
||||||
|
restore(smb, cob, saved.get(i));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void restore_all(StateMachineBuilder smb, CodeBuilder cob) {
|
public void restore_all(StateMachineBuilder smb, CodeBuilder cob) {
|
||||||
while(!saved.isEmpty())
|
while(!saved.isEmpty())
|
||||||
restore(smb, cob, saved.getFirst());
|
restore(smb, cob, saved.getLast());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -45,11 +45,12 @@ public class FutureSMBuilder extends StateMachineBuilder {
|
||||||
cob.ifThenElse(bcb -> {
|
cob.ifThenElse(bcb -> {
|
||||||
bcb.swap().aload(0).swap().putfield(smb.CD_this, AWAITING_FIELD_NAME, CD_Future);
|
bcb.swap().aload(0).swap().putfield(smb.CD_this, AWAITING_FIELD_NAME, CD_Future);
|
||||||
|
|
||||||
|
|
||||||
var sst = new SavedStateTracker();
|
var sst = new SavedStateTracker();
|
||||||
|
bcb.storeLocal(TypeKind.REFERENCE, frame.locals().length+2);
|
||||||
frame.save_locals(smb, cob, sst,2);
|
frame.save_locals(smb, cob, sst,2);
|
||||||
bcb.storeLocal(TypeKind.REFERENCE, 2);
|
|
||||||
frame.save_stack(smb, cob, sst,1);
|
frame.save_stack(smb, cob, sst,1);
|
||||||
bcb.loadLocal(TypeKind.REFERENCE, 2);
|
bcb.loadLocal(TypeKind.REFERENCE, frame.locals().length+2);
|
||||||
bcb.areturn().labelBinding(restore_label);
|
bcb.areturn().labelBinding(restore_label);
|
||||||
sst.restore_all(smb, cob);
|
sst.restore_all(smb, cob);
|
||||||
|
|
||||||
|
|
@ -118,7 +119,7 @@ public class FutureSMBuilder extends StateMachineBuilder {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected String uniqueName() {
|
protected String uniqueName() {
|
||||||
return "Fut"+super.uniqueName();
|
return "Fut";
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue