From d4771ef4e0a9273963a28704e8eff7bb0918ae29 Mon Sep 17 00:00:00 2001 From: ParkerTenBroeck <51721964+ParkerTenBroeck@users.noreply.github.com> Date: Wed, 30 Apr 2025 10:36:47 -0400 Subject: [PATCH] fixed a number of bugs related to stack frame interpretation --- src/Examples.java | 51 ++++++++----------- src/Main.java | 2 +- src/async_example/Jokio.java | 4 ++ src/async_example/Socket.java | 1 - src/generator/future/Future.java | 4 ++ src/generator/runtime/Frame.java | 2 +- src/generator/runtime/FrameTracker.java | 15 +----- src/generator/runtime/SavedStateTracker.java | 18 ++++++- .../runtime/future/FutureSMBuilder.java | 7 +-- 9 files changed, 52 insertions(+), 52 deletions(-) diff --git a/src/Examples.java b/src/Examples.java index 0355961..a206c6a 100644 --- a/src/Examples.java +++ b/src/Examples.java @@ -1,4 +1,4 @@ -import async_example.Delay; +import async_example.Jokio; import async_example.Socket; import generator.future.Future; import generator.future.Waker; @@ -84,39 +84,30 @@ public class Examples { // return Future.ret(value); // } -// public static Future 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 forever(Socket socket){ - var buffer = ByteBuffer.allocate(500); - while(true){ -// send(buffer, socket).await(); - ((Future)new Delay(1000 + buffer.get())).await(); - System.out.println(socket); + public static Future test(){ + for(int i = 0; i < 1000; i ++){ + Jokio.runtime(Waker.waker()).spawn(echoForever("Message " + i + "\n")); } + return Future.ret(null); } -// public Future 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 static Future echoForever(String message){ + try(var socket = Socket.connect(new InetSocketAddress("45.79.112.203", 4242)).await()){ + var buffer = ByteBuffer.allocate(500); + while(true){ + 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.print(new String(buffer.array(), 0, read)); + buffer.clear(); + } + } catch (Exception e) { + e.printStackTrace(); + } + return Future.ret(null); + } // public Future closing(int number){ // try(var m = new Meow()){ diff --git a/src/Main.java b/src/Main.java index 77889e8..defda30 100644 --- a/src/Main.java +++ b/src/Main.java @@ -57,7 +57,7 @@ public class Main implements Runnable { } void await(){ - new Jokio().blocking(Examples.forever(null)); + new Jokio().blocking(Examples.test()); } diff --git a/src/async_example/Jokio.java b/src/async_example/Jokio.java index 4546137..341f3f7 100644 --- a/src/async_example/Jokio.java +++ b/src/async_example/Jokio.java @@ -38,6 +38,10 @@ public class Jokio implements Runnable{ }; } + public static Jokio runtime(Waker waker){ + return ((Task)waker).runtime(); + } + private final HashSet> current = new HashSet<>(); private final Queue> woke = new ArrayDeque<>(); diff --git a/src/async_example/Socket.java b/src/async_example/Socket.java index 3b0d553..8dc447e 100644 --- a/src/async_example/Socket.java +++ b/src/async_example/Socket.java @@ -42,7 +42,6 @@ public class Socket implements AutoCloseable{ var c = (SocketChannel)key.channel(); var w = (Waker)key.attachment(); - System.out.println(key); if (!key.isValid()) { } if(key.isAcceptable()){ diff --git a/src/generator/future/Future.java b/src/generator/future/Future.java index 030f13b..d404ef3 100644 --- a/src/generator/future/Future.java +++ b/src/generator/future/Future.java @@ -16,6 +16,10 @@ public interface Future { throw new RuntimeException("NO!"); } + static Future ret(){ + throw new RuntimeException(); + } + static void yield() { throw new RuntimeException("NO!"); } diff --git a/src/generator/runtime/Frame.java b/src/generator/runtime/Frame.java index 104ebee..4afae8e 100644 --- a/src/generator/runtime/Frame.java +++ b/src/generator/runtime/Frame.java @@ -16,7 +16,7 @@ public record Frame(FrameTracker.Type[] locals, FrameTracker.Type[] stack) { int slot = 0; for (var entry : locals) { slot++; - if (slot <= loc_off) continue; + if (slot <= smb.paramSlotOff) continue; if (entry.isCategory2_2nd()) continue; diff --git a/src/generator/runtime/FrameTracker.java b/src/generator/runtime/FrameTracker.java index 67d7fd8..a437f00 100644 --- a/src/generator/runtime/FrameTracker.java +++ b/src/generator/runtime/FrameTracker.java @@ -234,13 +234,8 @@ public class FrameTracker { } for (var attr : com.findAttributes(Attributes.stackMapTable())) { - var entries = new ArrayList(); for (var smfi : attr.entries()) { - var locals = new ArrayList<>(smfi.locals()); - 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()); + stackMapFrames.put(smfi.target(), smfi); } } } @@ -471,7 +466,6 @@ public class FrameTracker { public void encounterLabel(Label l) { var tmp = stackMapFrames.get(l); if (tmp != null) { -// if(tmp.frameType()==252) stack.clear(); locals.clear(); for( var sl : tmp.stack()) @@ -479,13 +473,6 @@ public class FrameTracker { for( var sl : tmp.locals()) locals.add(Type.verificationType(sl)); - -// while(locals.size()>tmp.locals().size())locals.removeLast(); -// while(locals.size()= 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) { while(!saved.isEmpty()) - restore(smb, cob, saved.getFirst()); + restore(smb, cob, saved.getLast()); } } diff --git a/src/generator/runtime/future/FutureSMBuilder.java b/src/generator/runtime/future/FutureSMBuilder.java index 9c2b230..fe42041 100644 --- a/src/generator/runtime/future/FutureSMBuilder.java +++ b/src/generator/runtime/future/FutureSMBuilder.java @@ -45,11 +45,12 @@ public class FutureSMBuilder extends StateMachineBuilder { cob.ifThenElse(bcb -> { bcb.swap().aload(0).swap().putfield(smb.CD_this, AWAITING_FIELD_NAME, CD_Future); + var sst = new SavedStateTracker(); + bcb.storeLocal(TypeKind.REFERENCE, frame.locals().length+2); frame.save_locals(smb, cob, sst,2); - bcb.storeLocal(TypeKind.REFERENCE, 2); 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); sst.restore_all(smb, cob); @@ -118,7 +119,7 @@ public class FutureSMBuilder extends StateMachineBuilder { @Override protected String uniqueName() { - return "Fut"+super.uniqueName(); + return "Fut"; } @Override