generalization

This commit is contained in:
ParkerTenBroeck 2025-04-26 10:07:57 -04:00
parent 9b0a9b7ad2
commit 95e7f6a59e
8 changed files with 174 additions and 104 deletions

View file

@ -1,6 +1,8 @@
package generator.runtime;
import generator.future.Future;
import generator.gen.Gen;
import generator.runtime.future.FutureSMBuilder;
import generator.runtime.gen.GenSMBuilder;
import java.io.IOException;
@ -8,6 +10,7 @@ import java.lang.classfile.*;
import java.lang.classfile.attribute.*;
import java.lang.classfile.constantpool.ClassEntry;
import java.lang.constant.ClassDesc;
import java.lang.reflect.AccessFlag;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.*;
@ -39,16 +42,17 @@ public class GeneratorClassLoader extends ClassLoader {
var p = "/" + name.replace('.', '/') + ".class";
try (var stream = GeneratorClassLoader.class.getResourceAsStream(p)) {
var bytes = Objects.requireNonNull(stream).readAllBytes();
add(name, searchForGenerators(bytes));
add(name, searchReplaceMethods(bytes));
return customClazzMap.get(name);
} catch (IOException e) {
throw new ClassNotFoundException(name, e);
}
}
public byte[] searchForGenerators(byte[] in) {
public byte[] searchReplaceMethods(byte[] in) {
var clm = ClassFile.of(ClassFile.AttributesProcessingOption.PASS_ALL_ATTRIBUTES).parse(in);
var isGen = clm.thisClass().asSymbol().descriptorString().equals(Gen.class.descriptorString());
var isFuture = clm.thisClass().asSymbol().descriptorString().equals(Future.class.descriptorString());
var nestMem = new ArrayList<ClassDesc>();
@ -58,14 +62,18 @@ public class GeneratorClassLoader extends ClassLoader {
return ClassFile.of(ClassFile.AttributesProcessingOption.PASS_ALL_ATTRIBUTES).build(clm.thisClass().asSymbol(), cb -> {
for (var ce : clm) {
if (ce instanceof MethodModel mem && !isGen) {
var methodRetGen = mem.methodTypeSymbol().returnType().descriptorString().equals(Gen.class.descriptorString());
if (!methodRetGen) {
if (ce instanceof MethodModel mem && !isGen && !isFuture) {
StateMachineBuilder builder = null;
if(mem.methodTypeSymbol().returnType().descriptorString().equals(Gen.class.descriptorString())){
builder = generatorMethod(cb, mem, clm);
}else if(mem.methodTypeSymbol().returnType().descriptorString().equals(Future.class.descriptorString())){
builder = futureMethod(cb, mem, clm);
}else{
cb.with(mem);
} else{
var gcd = generatorMethod(cb, mem, clm);
// innerCl.add(InnerClassInfo.of(gcd, Optional.of(clm.thisClass().asSymbol()), Optional.of(gcd.displayName()), AccessFlag.PUBLIC, AccessFlag.FINAL, AccessFlag.STATIC));
// nestMem.add(ClassDesc.of(gcd.displayName()));
}
if(builder != null && builder.shouldBeInnerClass()){
innerCl.add(InnerClassInfo.of(builder.CD_this, Optional.of(clm.thisClass().asSymbol()), Optional.of(builder.CD_this.displayName()), AccessFlag.PUBLIC, AccessFlag.FINAL, AccessFlag.STATIC));
nestMem.add(ClassDesc.of(builder.CD_this.displayName()));
}
}
else if (ce instanceof Attribute<?> e){
@ -81,13 +89,23 @@ public class GeneratorClassLoader extends ClassLoader {
});
}
private ClassDesc generatorMethod(ClassBuilder cb, MethodModel src_mem, ClassModel src_clm) {
private StateMachineBuilder generatorMethod(ClassBuilder cb, MethodModel src_mem, ClassModel src_clm) {
var com = src_mem.code().get();
var gb = new GenSMBuilder(src_clm, src_mem, com);
add(gb.CD_this.displayName(), gb.buildStateMachine());
var smb = new GenSMBuilder(src_clm, src_mem, com);
add(smb.CD_this.displayName(), smb.buildStateMachine());
cb.withMethod(src_mem.methodName(), src_mem.methodType(), src_mem.flags().flagsMask(), mb -> {
mb.withCode(gb::buildSourceMethodShim);
mb.withCode(smb::buildSourceMethodShim);
});
return gb.CD_this;
return smb;
}
private StateMachineBuilder futureMethod(ClassBuilder cb, MethodModel src_mem, ClassModel src_clm) {
var com = src_mem.code().get();
var smb = new FutureSMBuilder(src_clm, src_mem, com);
add(smb.CD_this.displayName(), smb.buildStateMachine());
cb.withMethod(src_mem.methodName(), src_mem.methodType(), src_mem.flags().flagsMask(), mb -> {
mb.withCode(smb::buildSourceMethodShim);
});
return smb;
}
}