forked from JavaTX/JavaCompilerCore
Faculty funktioniert rihtig
This commit is contained in:
parent
2ef7bae78a
commit
d4b6073760
@ -110,7 +110,7 @@ public class BytecodeGenMethod implements StatementVisitor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public BytecodeGenMethod(LambdaExpression lambdaExpression, ResultSet resultSet, MethodVisitor mv,
|
public BytecodeGenMethod(LambdaExpression lambdaExpression, ResultSet resultSet, MethodVisitor mv,
|
||||||
int indexOfFirstParamLam, boolean isInterface, HashMap<String, byte[]> classFiles, String path, int lamCounter) {
|
int indexOfFirstParamLam, boolean isInterface, HashMap<String, byte[]> classFiles, String path, int lamCounter, SourceFile sf) {
|
||||||
|
|
||||||
this.resultSet = resultSet;
|
this.resultSet = resultSet;
|
||||||
this.mv = mv;
|
this.mv = mv;
|
||||||
@ -118,6 +118,7 @@ public class BytecodeGenMethod implements StatementVisitor {
|
|||||||
this.classFiles = classFiles;
|
this.classFiles = classFiles;
|
||||||
this.path = path;
|
this.path = path;
|
||||||
this.lamCounter = lamCounter;
|
this.lamCounter = lamCounter;
|
||||||
|
this.sf = sf;
|
||||||
Iterator<FormalParameter> itr = lambdaExpression.params.iterator();
|
Iterator<FormalParameter> itr = lambdaExpression.params.iterator();
|
||||||
int i = indexOfFirstParamLam;
|
int i = indexOfFirstParamLam;
|
||||||
while (itr.hasNext()) {
|
while (itr.hasNext()) {
|
||||||
@ -378,6 +379,12 @@ public class BytecodeGenMethod implements StatementVisitor {
|
|||||||
case BIGGEREQUAL:
|
case BIGGEREQUAL:
|
||||||
mv.visitJumpInsn(Opcodes.IF_ICMPLT, branchLabel);
|
mv.visitJumpInsn(Opcodes.IF_ICMPLT, branchLabel);
|
||||||
break;
|
break;
|
||||||
|
case EQUAL:
|
||||||
|
mv.visitJumpInsn(Opcodes.IF_ICMPNE, branchLabel);
|
||||||
|
break;
|
||||||
|
case NOTEQUAL:
|
||||||
|
mv.visitJumpInsn(Opcodes.IFEQ, branchLabel);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -403,6 +410,12 @@ public class BytecodeGenMethod implements StatementVisitor {
|
|||||||
case BIGGEREQUAL:
|
case BIGGEREQUAL:
|
||||||
mv.visitJumpInsn(Opcodes.IFLT, branchLabel);
|
mv.visitJumpInsn(Opcodes.IFLT, branchLabel);
|
||||||
break;
|
break;
|
||||||
|
case EQUAL:
|
||||||
|
mv.visitJumpInsn(Opcodes.IFNE, branchLabel);
|
||||||
|
break;
|
||||||
|
case NOTEQUAL:
|
||||||
|
mv.visitJumpInsn(Opcodes.IFEQ, branchLabel);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -567,7 +580,7 @@ public class BytecodeGenMethod implements StatementVisitor {
|
|||||||
methodName, arg3.toString(), null, null);
|
methodName, arg3.toString(), null, null);
|
||||||
|
|
||||||
new BytecodeGenMethod(lambdaExpression, this.resultSet, mvLambdaBody, indexOfFirstParamLam, isInterface,
|
new BytecodeGenMethod(lambdaExpression, this.resultSet, mvLambdaBody, indexOfFirstParamLam, isInterface,
|
||||||
classFiles,this.path, lamCounter);
|
classFiles,this.path, lamCounter, sf);
|
||||||
|
|
||||||
mvLambdaBody.visitMaxs(0, 0);
|
mvLambdaBody.visitMaxs(0, 0);
|
||||||
mvLambdaBody.visitEnd();
|
mvLambdaBody.visitEnd();
|
||||||
@ -850,11 +863,13 @@ public class BytecodeGenMethod implements StatementVisitor {
|
|||||||
// methCallType = "L"+methCallType+";";
|
// methCallType = "L"+methCallType+";";
|
||||||
// }
|
// }
|
||||||
for(java.lang.reflect.Method m : methods) {
|
for(java.lang.reflect.Method m : methods) {
|
||||||
if(name.equals(m.getName()) && i == m.getParameterCount() && methCallType.equals(m.getReturnType().getName().replace(".", "/"))) {
|
if(name.equals(m.getName()) && i == m.getParameterCount() &&
|
||||||
|
(methCallType.equals(m.getReturnType().getName().replace(".", "/")) ||
|
||||||
|
m.getReturnType().getName().replace(".", "/").equals(Type.getInternalName(Object.class)))) {
|
||||||
boolean typesEqual = true;
|
boolean typesEqual = true;
|
||||||
Class<?>[] pTypes = m.getParameterTypes();
|
Class<?>[] pTypes = m.getParameterTypes();
|
||||||
for(int j = 0; j<typesOfParams.length; ++j) {
|
for(int j = 0; j<typesOfParams.length; ++j) {
|
||||||
if(!typesOfParams[j].equals(pTypes[j])) {
|
if(!typesOfParams[j].equals(pTypes[j].getName().replaceAll(".", "/")) && !pTypes[j].getName().replace(".", "/").equals(Type.getInternalName(Object.class))) {
|
||||||
typesEqual = false;
|
typesEqual = false;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -41,10 +41,12 @@ public class FacultyTest {
|
|||||||
//
|
//
|
||||||
// // Damit man auf die Methode zugreifen kann
|
// // Damit man auf die Methode zugreifen kann
|
||||||
apply.setAccessible(true);
|
apply.setAccessible(true);
|
||||||
|
// Field value
|
||||||
|
Object fieldVal = fact.get(instanceOfClass);
|
||||||
Integer i = 3;
|
Integer i = 3;
|
||||||
|
Method applyFromField = fieldVal.getClass().getDeclaredMethod("apply", Object.class);
|
||||||
Integer result = (Integer) apply.invoke(instanceOfClass, i);
|
applyFromField.setAccessible(true);
|
||||||
|
Integer result = (Integer) applyFromField.invoke(instanceOfClass, i);
|
||||||
// Integer result = (Integer) m.invoke(instanceOfClass,i);
|
// Integer result = (Integer) m.invoke(instanceOfClass,i);
|
||||||
|
|
||||||
assertEquals(6, result);
|
assertEquals(6, result);
|
||||||
|
@ -4,15 +4,13 @@ public class Faculty {
|
|||||||
public fact;
|
public fact;
|
||||||
Faculty() {
|
Faculty() {
|
||||||
fact = (x) -> {
|
fact = (x) -> {
|
||||||
if(x<0) {
|
if (x == 1) {
|
||||||
return 0;
|
return 1;
|
||||||
}else if (x < 1) {
|
}
|
||||||
return x;
|
else {
|
||||||
}
|
return x * (fact.apply(x-1));
|
||||||
else {
|
}
|
||||||
return x * (fact.apply(x-1));
|
};
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// m (x) {
|
// m (x) {
|
||||||
|
Loading…
Reference in New Issue
Block a user