use StackValue (and StackValue.expression() in particular) instead of Runnable as the expression in instanceof check
This commit is contained in:
@@ -1597,12 +1597,7 @@ public class ExpressionCodegen extends JetVisitor {
|
|||||||
throw new UnsupportedOperationException("don't know how to handle non-class types in as/as?");
|
throw new UnsupportedOperationException("don't know how to handle non-class types in as/as?");
|
||||||
}
|
}
|
||||||
Type type = typeMapper.mapType(jetType, OwnerKind.INTERFACE);
|
Type type = typeMapper.mapType(jetType, OwnerKind.INTERFACE);
|
||||||
generateInstanceOf(new Runnable() {
|
generateInstanceOf(StackValue.expression(OBJECT_TYPE, expression.getLeft(), this), jetType, true);
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
gen(expression.getLeft(), OBJECT_TYPE);
|
|
||||||
}
|
|
||||||
}, jetType, true);
|
|
||||||
Label isInstance = new Label();
|
Label isInstance = new Label();
|
||||||
v.ifne(isInstance);
|
v.ifne(isInstance);
|
||||||
v.pop();
|
v.pop();
|
||||||
@@ -1626,19 +1621,15 @@ public class ExpressionCodegen extends JetVisitor {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visitIsExpression(final JetIsExpression expression) {
|
public void visitIsExpression(final JetIsExpression expression) {
|
||||||
generatePatternMatch(expression.getPattern(), expression.isNegated(), new Runnable() {
|
generatePatternMatch(expression.getPattern(), expression.isNegated(),
|
||||||
@Override
|
StackValue.expression(OBJECT_TYPE, expression.getLeftHandSide(), this));
|
||||||
public void run() {
|
|
||||||
gen(expression.getLeftHandSide(), OBJECT_TYPE);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void generatePatternMatch(JetPattern pattern, boolean negated, Runnable expressionGen) {
|
private void generatePatternMatch(JetPattern pattern, boolean negated, StackValue expressionToMatch) {
|
||||||
if (pattern instanceof JetTypePattern) {
|
if (pattern instanceof JetTypePattern) {
|
||||||
JetTypeReference typeReference = ((JetTypePattern) pattern).getTypeReference();
|
JetTypeReference typeReference = ((JetTypePattern) pattern).getTypeReference();
|
||||||
JetType jetType = bindingContext.resolveTypeReference(typeReference);
|
JetType jetType = bindingContext.resolveTypeReference(typeReference);
|
||||||
generateInstanceOf(expressionGen, jetType, false);
|
generateInstanceOf(expressionToMatch, jetType, false);
|
||||||
StackValue value = StackValue.onStack(Type.BOOLEAN_TYPE);
|
StackValue value = StackValue.onStack(Type.BOOLEAN_TYPE);
|
||||||
myStack.push(negated ? StackValue.not(value) : value);
|
myStack.push(negated ? StackValue.not(value) : value);
|
||||||
}
|
}
|
||||||
@@ -1650,18 +1641,18 @@ public class ExpressionCodegen extends JetVisitor {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void generateInstanceOf(Runnable expressionGen, JetType jetType, boolean leaveExpressionOnStack) {
|
private void generateInstanceOf(StackValue expressionToGen, JetType jetType, boolean leaveExpressionOnStack) {
|
||||||
DeclarationDescriptor descriptor = jetType.getConstructor().getDeclarationDescriptor();
|
DeclarationDescriptor descriptor = jetType.getConstructor().getDeclarationDescriptor();
|
||||||
if (jetType.getArguments().size() > 0 || !(descriptor instanceof ClassDescriptor)) {
|
if (jetType.getArguments().size() > 0 || !(descriptor instanceof ClassDescriptor)) {
|
||||||
generateTypeInfo(jetType);
|
generateTypeInfo(jetType);
|
||||||
expressionGen.run();
|
expressionToGen.put(OBJECT_TYPE, v);
|
||||||
if (leaveExpressionOnStack) {
|
if (leaveExpressionOnStack) {
|
||||||
v.dupX1();
|
v.dupX1();
|
||||||
}
|
}
|
||||||
v.invokevirtual("jet/typeinfo/TypeInfo", "isInstance", "(Ljava/lang/Object;)Z");
|
v.invokevirtual("jet/typeinfo/TypeInfo", "isInstance", "(Ljava/lang/Object;)Z");
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
expressionGen.run();
|
expressionToGen.put(OBJECT_TYPE, v);
|
||||||
if (leaveExpressionOnStack) {
|
if (leaveExpressionOnStack) {
|
||||||
v.dup();
|
v.dup();
|
||||||
}
|
}
|
||||||
@@ -1757,12 +1748,7 @@ public class ExpressionCodegen extends JetVisitor {
|
|||||||
else if (condition instanceof JetWhenConditionIsPattern) {
|
else if (condition instanceof JetWhenConditionIsPattern) {
|
||||||
JetWhenConditionIsPattern patternCondition = (JetWhenConditionIsPattern) condition;
|
JetWhenConditionIsPattern patternCondition = (JetWhenConditionIsPattern) condition;
|
||||||
JetPattern pattern = patternCondition.getPattern();
|
JetPattern pattern = patternCondition.getPattern();
|
||||||
generatePatternMatch(pattern, patternCondition.isNegated(), new Runnable() {
|
generatePatternMatch(pattern, patternCondition.isNegated(), StackValue.local(subjectLocal, subjectType));
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
new StackValue.Local(subjectLocal, subjectType).put(OBJECT_TYPE, v);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
throw new UnsupportedOperationException("unsupported kind of when condition");
|
throw new UnsupportedOperationException("unsupported kind of when condition");
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package org.jetbrains.jet.codegen;
|
package org.jetbrains.jet.codegen;
|
||||||
|
|
||||||
import com.intellij.psi.tree.IElementType;
|
import com.intellij.psi.tree.IElementType;
|
||||||
|
import org.jetbrains.jet.lang.psi.JetExpression;
|
||||||
import org.jetbrains.jet.lexer.JetTokens;
|
import org.jetbrains.jet.lexer.JetTokens;
|
||||||
import org.objectweb.asm.Label;
|
import org.objectweb.asm.Label;
|
||||||
import org.objectweb.asm.Opcodes;
|
import org.objectweb.asm.Opcodes;
|
||||||
@@ -83,6 +84,10 @@ public abstract class StackValue {
|
|||||||
return new Property(name, owner, getter, setter, isStatic, isInterface, type);
|
return new Property(name, owner, getter, setter, isStatic, isInterface, type);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static StackValue expression(Type type, JetExpression expression, ExpressionCodegen generator) {
|
||||||
|
return new Expression(type, expression, generator);
|
||||||
|
}
|
||||||
|
|
||||||
private static void box(final Type type, final Type toType, InstructionAdapter v) {
|
private static void box(final Type type, final Type toType, InstructionAdapter v) {
|
||||||
// TODO handle toType correctly
|
// TODO handle toType correctly
|
||||||
if (type == Type.INT_TYPE || (JetTypeMapper.isIntPrimitive(type) && toType.getInternalName().equals("java/lang/Integer"))) {
|
if (type == Type.INT_TYPE || (JetTypeMapper.isIntPrimitive(type) && toType.getInternalName().equals("java/lang/Integer"))) {
|
||||||
@@ -538,4 +543,20 @@ public abstract class StackValue {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static class Expression extends StackValue {
|
||||||
|
private final JetExpression expression;
|
||||||
|
private final ExpressionCodegen generator;
|
||||||
|
|
||||||
|
public Expression(Type type, JetExpression expression, ExpressionCodegen generator) {
|
||||||
|
super(type);
|
||||||
|
this.expression = expression;
|
||||||
|
this.generator = generator;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void put(Type type, InstructionAdapter v) {
|
||||||
|
generator.gen(expression, type);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user