MCPcopy Index your code
hub / github.com/clojure/clojure / IfExpr

Class IfExpr

src/jvm/clojure/lang/Compiler.java:3224–3363  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

3222}
3223
3224public 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

Callers

nothing calls this directly

Calls

no outgoing calls

Tested by

no test coverage detected