| 3222 | } |
| 3223 | |
| 3224 | public static class IfExpr implements Expr, MaybePrimitiveExpr{ |
| 3225 | public final Expr testExpr; |
| 3226 | public final Expr thenExpr; |
| 3227 | public final Expr elseExpr; |
| 3228 | public final int line; |
| 3229 | public final int column; |
| 3230 | |
| 3231 | |
| 3232 | public IfExpr(int line, int column, Expr testExpr, Expr thenExpr, Expr elseExpr){ |
| 3233 | this.testExpr = testExpr; |
| 3234 | this.thenExpr = thenExpr; |
| 3235 | this.elseExpr = elseExpr; |
| 3236 | this.line = line; |
| 3237 | this.column = column; |
| 3238 | } |
| 3239 | |
| 3240 | public Object eval() { |
| 3241 | Object t = testExpr.eval(); |
| 3242 | if(t != null && t != Boolean.FALSE) |
| 3243 | return thenExpr.eval(); |
| 3244 | return elseExpr.eval(); |
| 3245 | } |
| 3246 | |
| 3247 | public void emit(C context, ObjExpr objx, GeneratorAdapter gen){ |
| 3248 | doEmit(context, objx, gen,false); |
| 3249 | } |
| 3250 | |
| 3251 | public void emitUnboxed(C context, ObjExpr objx, GeneratorAdapter gen){ |
| 3252 | doEmit(context, objx, gen, true); |
| 3253 | } |
| 3254 | |
| 3255 | public void doEmit(C context, ObjExpr objx, GeneratorAdapter gen, boolean emitUnboxed){ |
| 3256 | Label nullLabel = gen.newLabel(); |
| 3257 | Label falseLabel = gen.newLabel(); |
| 3258 | Label endLabel = gen.newLabel(); |
| 3259 | |
| 3260 | gen.visitLineNumber(line, gen.mark()); |
| 3261 | |
| 3262 | if(testExpr instanceof StaticMethodExpr && ((StaticMethodExpr)testExpr).canEmitIntrinsicPredicate()) |
| 3263 | { |
| 3264 | ((StaticMethodExpr) testExpr).emitIntrinsicPredicate(C.EXPRESSION, objx, gen, falseLabel); |
| 3265 | } |
| 3266 | else if(maybePrimitiveType(testExpr) == boolean.class) |
| 3267 | { |
| 3268 | ((MaybePrimitiveExpr) testExpr).emitUnboxed(C.EXPRESSION, objx, gen); |
| 3269 | gen.ifZCmp(gen.EQ, falseLabel); |
| 3270 | } |
| 3271 | else |
| 3272 | { |
| 3273 | testExpr.emit(C.EXPRESSION, objx, gen); |
| 3274 | gen.dup(); |
| 3275 | gen.ifNull(nullLabel); |
| 3276 | gen.getStatic(BOOLEAN_OBJECT_TYPE, "FALSE", BOOLEAN_OBJECT_TYPE); |
| 3277 | gen.visitJumpInsn(IF_ACMPEQ, falseLabel); |
| 3278 | } |
| 3279 | if(emitUnboxed) |
| 3280 | ((MaybePrimitiveExpr)thenExpr).emitUnboxed(context, objx, gen); |
| 3281 | else |
nothing calls this directly
no outgoing calls
no test coverage detected