minor reshuffling
This commit is contained in:
parent
8eda63261b
commit
d17883701d
4 changed files with 58 additions and 59 deletions
|
|
@ -28,14 +28,14 @@ public class CompiledClass {
|
|||
return thisClass.getIndex();
|
||||
}
|
||||
|
||||
public ClassEntry superClass() {
|
||||
public ClassEntry addSuperClass() {
|
||||
if (superClass == null) {
|
||||
superClass = createClassEntry(beeClass.getSuperClass().getName());
|
||||
}
|
||||
return superClass;
|
||||
}
|
||||
|
||||
public ClassEntry thisClass() {
|
||||
public ClassEntry addThisClass() {
|
||||
if (thisClass == null) {
|
||||
thisClass = createClassEntry(internalName(beeClass.getName()));
|
||||
}
|
||||
|
|
@ -58,11 +58,7 @@ public class CompiledClass {
|
|||
constantTree.add(interfaceEntry);
|
||||
}
|
||||
|
||||
public void setThisClass() {
|
||||
constantTree.add(thisClass());
|
||||
}
|
||||
|
||||
public void setInterfaces() {
|
||||
public void addInterfaces() {
|
||||
beeClass.getInterfaces().forEach(interfase -> {
|
||||
ClassEntry interfaceEntry = new ClassEntry(new Utf8Entry(internalName(interfase.getName())));
|
||||
addInterface(interfaceEntry);
|
||||
|
|
@ -70,6 +66,12 @@ public class CompiledClass {
|
|||
});
|
||||
}
|
||||
|
||||
public void addFields() {
|
||||
beeClass.getFields().forEach(field -> {
|
||||
// TODO
|
||||
});
|
||||
}
|
||||
|
||||
private ClassEntry createClassEntry(String name) {
|
||||
return new ClassEntry(new Utf8Entry(internalName(name)));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -27,11 +27,12 @@ public class Compiler {
|
|||
public CompiledClass compile(BeeClass beeClass) {
|
||||
compiledClass = new CompiledClass(beeClass);
|
||||
beeClass.getConstructors().forEach(this::updateConstantPool);
|
||||
// TODO update constantTree for fields ?
|
||||
// TODO update constantTree for methods
|
||||
// TODO update constant pool for fields ?
|
||||
// TODO update constant pool for methods
|
||||
|
||||
compiledClass.setThisClass();
|
||||
compiledClass.setInterfaces();
|
||||
compiledClass.addThisClass();
|
||||
compiledClass.addInterfaces();
|
||||
compiledClass.addFields();
|
||||
|
||||
return compiledClass;
|
||||
}
|
||||
|
|
@ -46,19 +47,19 @@ public class Compiler {
|
|||
*/
|
||||
private void updateConstantPool(CodeLine codeline) {
|
||||
if (codeline.hasMethod()) {
|
||||
addMethod(codeline);
|
||||
addMethodToConstantPool(codeline);
|
||||
}
|
||||
|
||||
if (codeline.hasField()) {
|
||||
addField(codeline);
|
||||
addFieldToConstantPool(codeline);
|
||||
}
|
||||
}
|
||||
|
||||
private void addMethod(CodeLine codeline) {
|
||||
private void addMethodToConstantPool(CodeLine codeline) {
|
||||
compiledClass.addConstantPoolEntry(new MethodRefEntry(getOrCreateClassEntry(codeline), createMethodNameAndType(codeline)));
|
||||
}
|
||||
|
||||
private void addField(CodeLine codeline) {
|
||||
private void addFieldToConstantPool(CodeLine codeline) {
|
||||
compiledClass.addConstantPoolEntry(new FieldRefEntry(getOrCreateClassEntry(codeline), createFieldNameAndType(codeline)));
|
||||
}
|
||||
|
||||
|
|
@ -72,9 +73,10 @@ public class Compiler {
|
|||
|
||||
private ClassEntry getOrCreateClassEntry(CodeLine codeline) {
|
||||
if (codeline.getRef() == Ref.SUPER) {
|
||||
return compiledClass.superClass();
|
||||
return compiledClass.addSuperClass();
|
||||
|
||||
} else if (codeline.getRef() == Ref.THIS) {
|
||||
return compiledClass.thisClass();
|
||||
return compiledClass.addThisClass();
|
||||
}
|
||||
//TODO other cases
|
||||
throw new RuntimeException("shouldn't be here");
|
||||
|
|
|
|||
|
|
@ -62,38 +62,4 @@ public class CompilerTests {
|
|||
Utf8Entry type = (Utf8Entry) child5;
|
||||
assertEquals("()V", type.getUtf8());
|
||||
}
|
||||
|
||||
private BeeClass createClassWithIntField() {
|
||||
BeeField intField = BeeField.builder()
|
||||
.withAccessFlags(FieldAccessFlag.PRIVATE)
|
||||
.withType(int.class)
|
||||
.withName("intField")
|
||||
.build();
|
||||
|
||||
BeeParameter intValueParameter = BeeParameter.create(int.class, "intValue");
|
||||
|
||||
BeeConstructor constructor = BeeConstructor.builder()
|
||||
.withAccessFlags(MethodAccessFlag.PUBLIC)
|
||||
.withFormalParameters(intValueParameter)
|
||||
.withCode(
|
||||
line(0, LOAD, Ref.THIS),
|
||||
line(1, INVOKE, Ref.SUPER, "<init>", "()"),
|
||||
line(2, LOAD, Ref.THIS),
|
||||
line(3, LOAD, intValueParameter),
|
||||
line(4, PUT, intField),
|
||||
line(5, RETURN))
|
||||
.build();
|
||||
|
||||
return BeeClass.builder()
|
||||
.withClassFileVersion(Version.V14)
|
||||
.withPackage("nl.sander.beejava.test")
|
||||
.withAccessFlags(PUBLIC)
|
||||
.withSimpleName("IntBean")
|
||||
.withSuperClass(Object.class)
|
||||
.withFields(intField)
|
||||
.withConstructors(constructor)
|
||||
.build();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,9 +1,7 @@
|
|||
package nl.sander.beejava;
|
||||
|
||||
import nl.sander.beejava.api.BeeClass;
|
||||
import nl.sander.beejava.api.BeeConstructor;
|
||||
import nl.sander.beejava.api.Ref;
|
||||
import nl.sander.beejava.api.Version;
|
||||
import nl.sander.beejava.api.*;
|
||||
import nl.sander.beejava.flags.FieldAccessFlag;
|
||||
import nl.sander.beejava.flags.MethodAccessFlag;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
|
@ -20,7 +18,7 @@ public class TestData {
|
|||
.withAccessFlags(PUBLIC)
|
||||
.withSimpleName("EmptyBean")
|
||||
.withSuperClass(Object.class) // Not mandatory, like in java sourcecode
|
||||
.withConstructors(getBeeConstructor()) // There's no default constructor in beejava. The user must always add them
|
||||
.withConstructors(createConstructor()) // There's no default constructor in beejava. The user must always add them
|
||||
.build();
|
||||
}
|
||||
|
||||
|
|
@ -32,18 +30,49 @@ public class TestData {
|
|||
.withSimpleName("EmptyBean")
|
||||
.withSuperClass(Object.class) // Not mandatory, like in java sourcecode
|
||||
.withInterfaces(Serializable.class)
|
||||
.withConstructors(getBeeConstructor()) // There's no default constructor in beejava. The user must always add them
|
||||
.withConstructors(createConstructor()) // There's no default constructor in beejava. The user must always add them
|
||||
.build();
|
||||
}
|
||||
|
||||
private static BeeConstructor getBeeConstructor() {
|
||||
public static BeeClass createClassWithIntField() {
|
||||
BeeField intField = BeeField.builder()
|
||||
.withAccessFlags(FieldAccessFlag.PRIVATE)
|
||||
.withType(int.class)
|
||||
.withName("intField")
|
||||
.build();
|
||||
|
||||
BeeParameter intValueParameter = BeeParameter.create(int.class, "intValue");
|
||||
|
||||
BeeConstructor constructor = BeeConstructor.builder()
|
||||
.withAccessFlags(MethodAccessFlag.PUBLIC)
|
||||
.withFormalParameters(intValueParameter)
|
||||
.withCode(
|
||||
line(0, LOAD, Ref.THIS),
|
||||
line(1, INVOKE, Ref.SUPER, "<init>", "()"),
|
||||
line(2, LOAD, Ref.THIS),
|
||||
line(3, LOAD, intValueParameter),
|
||||
line(4, PUT, intField),
|
||||
line(5, RETURN))
|
||||
.build();
|
||||
|
||||
return BeeClass.builder()
|
||||
.withClassFileVersion(Version.V14)
|
||||
.withPackage("nl.sander.beejava.test")
|
||||
.withAccessFlags(PUBLIC)
|
||||
.withSimpleName("IntBean")
|
||||
.withSuperClass(Object.class)
|
||||
.withFields(intField)
|
||||
.withConstructors(constructor)
|
||||
.build();
|
||||
}
|
||||
|
||||
private static BeeConstructor createConstructor() {
|
||||
return BeeConstructor.builder()
|
||||
.withAccessFlags(MethodAccessFlag.PUBLIC)
|
||||
.withCode(
|
||||
line(0, LOAD, Ref.THIS),
|
||||
line(1, INVOKE, Ref.SUPER, "<init>", "()"),
|
||||
line(5, RETURN))
|
||||
.build();
|
||||
return constructor;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue