From 24ea55603ef15f65ac5ad251cd9851bdd73f2bb2 Mon Sep 17 00:00:00 2001 From: Parker TenBroeck <51721964+ParkerTenBroeck@users.noreply.github.com> Date: Thu, 1 May 2025 17:15:55 -0400 Subject: [PATCH] made state saver try to reuse previously defined fields --- src/AsyncExamples.java | 2 +- src/Main.java | 4 ++-- .../loadtime/SavedStateTracker.java | 22 ++++++++++++++----- 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/AsyncExamples.java b/src/AsyncExamples.java index 592c19c..193a2cf 100644 --- a/src/AsyncExamples.java +++ b/src/AsyncExamples.java @@ -18,7 +18,7 @@ public class AsyncExamples { Jokio.runtime().await().spawn(server()); - for(int i = 0; i < 200; i ++){ + for(int i = 0; i < 50; i ++){ var builder = new StringBuilder(); for(int c = 0; c < 4096*16*3; c ++) builder.append((char)((Math.random()*('z'-'a')+'a'))); diff --git a/src/Main.java b/src/Main.java index 2f6d060..2ca6011 100644 --- a/src/Main.java +++ b/src/Main.java @@ -11,8 +11,8 @@ public class Main implements Runnable { @Override public void run() { - await(); -// lexer(); +// await(); + lexer(); } diff --git a/src/generators/loadtime/SavedStateTracker.java b/src/generators/loadtime/SavedStateTracker.java index 927a7bf..5c39db7 100644 --- a/src/generators/loadtime/SavedStateTracker.java +++ b/src/generators/loadtime/SavedStateTracker.java @@ -7,16 +7,29 @@ import java.util.ArrayList; public class SavedStateTracker { private final ArrayList saved = new ArrayList<>(); - public sealed interface SavedState{} + public sealed interface SavedState{ + String name(); + } public record StackState(String name, ClassDesc desc) implements SavedState{ } public record LocalState(String name, ClassDesc desc, int slot) implements SavedState{ } - public SavedState save_stack(StateMachineBuilder smb, CodeBuilder cob, ClassDesc desc){ - var name = "LSTATE_"+smb.lstate.size(); + + private String get_name(StateMachineBuilder smb, ClassDesc desc){ + var value = smb.lstate.stream() // find unused state + .filter(v -> saved.stream().noneMatch(s -> s.name().equals(v.name()))) + .filter(v -> v.cd().equals(desc)).findFirst(); + if(value.isPresent()) + return value.get().name(); + var name = StateMachineBuilder.LOCAL_PREFIX+smb.lstate.size(); smb.lstate.add(new StateMachineBuilder.LState(name, desc)); + return name; + } + + public SavedState save_stack(StateMachineBuilder smb, CodeBuilder cob, ClassDesc desc){ + var name = get_name(smb, desc); if(TypeKind.from(desc).slotSize()==2){ cob.aload(0).dup_x2().pop().putfield(smb.CD_this, name, desc); @@ -30,8 +43,7 @@ public class SavedStateTracker { } public SavedState save_local(StateMachineBuilder smb, CodeBuilder cob, ClassDesc desc, int slot){ - var name = "LSTATE_"+smb.lstate.size(); - smb.lstate.add(new StateMachineBuilder.LState(name, desc)); + var name = get_name(smb, desc); cob.aload(0).loadLocal(TypeKind.from(desc), slot).putfield(smb.CD_this, name, desc);