made state saver try to reuse previously defined fields

This commit is contained in:
Parker TenBroeck 2025-05-01 17:15:55 -04:00
parent 7fbe61a97c
commit 24ea55603e
3 changed files with 20 additions and 8 deletions

View file

@ -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')));

View file

@ -11,8 +11,8 @@ public class Main implements Runnable {
@Override
public void run() {
await();
// lexer();
// await();
lexer();
}

View file

@ -7,16 +7,29 @@ import java.util.ArrayList;
public class SavedStateTracker {
private final ArrayList<SavedState> 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);