mirror of
https://github.com/ParkerTenBroeck/coroutines.git
synced 2026-06-07 05:08:51 -04:00
generalization
This commit is contained in:
parent
9b0a9b7ad2
commit
95e7f6a59e
8 changed files with 174 additions and 104 deletions
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue