private void jitMatches(SingleCondition singleCondition) { if (!(singleCondition.getRight() instanceof FixedExpression)) { jitBinary(singleCondition); return; } final String matchingString = ((FixedExpression) singleCondition.getRight()).getValue().toString(); final String patternVariableName = getUniqueName("pattern"); getClassGenerator() .addStaticField(ACC_PRIVATE | ACC_FINAL, patternVariableName, Pattern.class, null); getClassGenerator() .addStaticInitBlock( new ClassGenerator.MethodBody() { @Override public void body(MethodVisitor mv) { mv.visitLdcInsn(matchingString); invokeStatic(Pattern.class, "compile", Pattern.class, String.class); putStaticField(patternVariableName, Pattern.class); } }); jitExpression(singleCondition.getLeft(), String.class); store(LEFT_OPERAND, singleCondition.getLeft().getType()); Label notNullLabel = jitLeftIsNull( singleCondition.getLeft().getType() == String.class ? jitNullSafeOperationStart() : jitNullSafeCoercion(singleCondition.getLeft().getType(), String.class)); mv.visitInsn(ICONST_0); Label nullEvaluation = new Label(); mv.visitJumpInsn(GOTO, nullEvaluation); mv.visitLabel(notNullLabel); getStaticField(patternVariableName, Pattern.class); load(LEFT_OPERAND); invokeVirtual(Pattern.class, "matcher", Matcher.class, CharSequence.class); invokeVirtual(Matcher.class, "matches", boolean.class); mv.visitLabel(nullEvaluation); }
private void jitInstanceof(SingleCondition singleCondition) { Class<?> value = (Class<?>) ((FixedExpression) singleCondition.getRight()).getValue(); String internalClassName = internalName(value); Expression left = singleCondition.getLeft(); Class<?> leftType = isDeclarationExpression(left) ? convertFromPrimitiveType(left.getType()) : left.getType(); jitExpression(left, leftType); mv.visitTypeInsn(INSTANCEOF, internalClassName); }
private void jitBinary(SingleCondition singleCondition) { Expression left = singleCondition.getLeft(); Expression right = singleCondition.getRight(); Class<?> commonType = singleCondition.getOperation().needsSameType() ? findCommonClass( left.getType(), !left.canBeNull(), right.getType(), !right.canBeNull()) : null; if (commonType == Object.class && singleCondition.getOperation().isComparison()) { commonType = Comparable.class; } if (commonType != null && commonType.isPrimitive()) { jitPrimitiveBinary(singleCondition, left, right, commonType); } else { jitObjectBinary(singleCondition, left, right, commonType); } }
private void jitUnary(SingleCondition singleCondition) { jitExpression(singleCondition.getLeft()); }