mirror of
https://github.com/ParkerTenBroeck/coroutines.git
synced 2026-06-06 21:00:35 -04:00
48 lines
1.8 KiB
Java
48 lines
1.8 KiB
Java
package generators.loadtime;
|
|
|
|
import java.lang.classfile.CodeBuilder;
|
|
import java.lang.classfile.instruction.LineNumber;
|
|
import java.util.Arrays;
|
|
|
|
public record Frame(FrameTracker.Type[] locals, FrameTracker.Type[] stack, int bci, LineNumber line, FrameTracker.LocalVariableAnnotation[] local_annotations) {
|
|
|
|
@Override
|
|
public String toString() {
|
|
return "Frame[l=" + Arrays.toString(locals)
|
|
+ ", s=" + Arrays.toString(stack)
|
|
+ ", bci=" + bci
|
|
+ ", line="+line
|
|
+ ", local_annotations=" + Arrays.toString(local_annotations)
|
|
+ "]";
|
|
}
|
|
|
|
public void save_locals(StateMachineBuilder smb, CodeBuilder cob, SavedStateTracker sst, int loc_off){
|
|
int slot = 0;
|
|
for (var entry : locals) {
|
|
slot++;
|
|
if (slot <= smb.paramSlotOff) continue;
|
|
|
|
if(entry.tag() == FrameTracker.Type.TOP_TYPE.tag())continue;
|
|
if (entry.isCategory2_2nd()) continue;
|
|
|
|
sst.save_local(smb, cob, entry.toCD(), slot - smb.paramSlotOff + loc_off - 1);
|
|
}
|
|
}
|
|
public void save_stack(StateMachineBuilder smb, CodeBuilder cob, SavedStateTracker sst, int stack_off) {
|
|
for(int i = stack.length-1-stack_off; i >= 0; i --){
|
|
if(stack[i].isCategory2_2nd())continue;
|
|
sst.save_stack(smb, cob, stack[i].toCD());
|
|
}
|
|
}
|
|
|
|
public SavedStateTracker save(StateMachineBuilder smb, CodeBuilder cob, SavedStateTracker sst, int loc_off, int stack_off) {
|
|
save_locals(smb, cob, sst, loc_off);
|
|
save_stack(smb, cob, sst, stack_off);
|
|
return sst;
|
|
}
|
|
|
|
public SavedStateTracker save(StateMachineBuilder smb, CodeBuilder cob, int loc_off, int stack_off) {
|
|
var sst = new SavedStateTracker();
|
|
return save(smb, cob, sst, loc_off, stack_off);
|
|
}
|
|
}
|