public EvalNode visitArithmeticEval(EvalCodeGenContext context, BinaryEval evalNode, Stack<EvalNode> stack) { stack.push(evalNode); visit(context, evalNode.getLeftExpr(), stack); // < left_child, push nullflag int LHS_NULLFLAG = context.istore(); int LHS = context.store(evalNode.getLeftExpr().getValueType()); visit(context, evalNode.getRightExpr(), stack); // < left_child, right_child, nullflag int RHS_NULLFLAG = context.istore(); int RHS = context.store(evalNode.getRightExpr().getValueType()); stack.pop(); Label ifNull = new Label(); Label afterEnd = new Label(); context.emitNullityCheck(ifNull, LHS_NULLFLAG, RHS_NULLFLAG); context.load(evalNode.getLeftExpr().getValueType(), LHS); context.load(evalNode.getRightExpr().getValueType(), RHS); int opCode = TajoGeneratorAdapter.getOpCode(evalNode.getType(), evalNode.getValueType()); context.methodvisitor.visitInsn(opCode); context.pushNullFlag(true); emitGotoLabel(context, afterEnd); emitLabel(context, ifNull); context.pushDummyValue(evalNode.getValueType()); context.pushNullFlag(false); emitLabel(context, afterEnd); return evalNode; }
public EvalNode visitArithmeticEval(EvalCodeGenContext context, BinaryEval evalNode, Stack<EvalNode> stack) { stack.push(evalNode); visit(context, evalNode.getLeftExpr(), stack); // < left_child, push nullflag int LHS_NULLFLAG = context.istore(); int LHS = context.store(evalNode.getLeftExpr().getValueType()); visit(context, evalNode.getRightExpr(), stack); // < left_child, right_child, nullflag int RHS_NULLFLAG = context.istore(); int RHS = context.store(evalNode.getRightExpr().getValueType()); stack.pop(); Label ifNull = new Label(); Label afterEnd = new Label(); context.emitNullityCheck(ifNull, LHS_NULLFLAG, RHS_NULLFLAG); context.load(evalNode.getLeftExpr().getValueType(), LHS); context.load(evalNode.getRightExpr().getValueType(), RHS); int opCode = TajoGeneratorAdapter.getOpCode(evalNode.getType(), evalNode.getValueType()); context.methodvisitor.visitInsn(opCode); context.pushNullFlag(true); emitGotoLabel(context, afterEnd); emitLabel(context, ifNull); context.pushDummyValue(evalNode.getValueType()); context.pushNullFlag(false); emitLabel(context, afterEnd); return evalNode; }
@Test public final void testGetReturnType() { ConstEval e1; ConstEval e2; // PLUS e1 = new ConstEval(DatumFactory.createInt4(9)); e2 = new ConstEval(DatumFactory.createInt4(34)); BinaryEval expr = new BinaryEval(EvalType.PLUS, e1, e2); assertEquals(Type.Int4, expr.getValueType()); expr = new BinaryEval(EvalType.LTH, e1, e2); assertTrue(expr.bind(null, null).eval(null).asBool()); assertEquals(Type.Bool, expr.getValueType()); e1 = new ConstEval(DatumFactory.createFloat8(9.3)); e2 = new ConstEval(DatumFactory.createFloat8(34.2)); expr = new BinaryEval(EvalType.PLUS, e1, e2); assertEquals(Type.Float8, expr.getValueType()); }
public EvalNode visitStringConcat(EvalCodeGenContext context, BinaryEval evalNode, Stack<EvalNode> stack) throws CompilationError { stack.push(evalNode); visit(context, evalNode.getLeftExpr(), stack); // < lhs, l_null final int LHS_NULLFLAG = context.istore(); // < lhs final int LHS = context.store(evalNode.getLeftExpr().getValueType()); visit(context, evalNode.getRightExpr(), stack); // < rhs, r_nullflag int RHS_NULLFLAG = context.istore(); int RHS = context.store(evalNode.getRightExpr().getValueType()); // < stack.pop(); Label ifNull = new Label(); Label afterEnd = new Label(); context.emitNullityCheck(ifNull, LHS_NULLFLAG, RHS_NULLFLAG); context.load(evalNode.getLeftExpr().getValueType(), LHS); // < lhs context.load(evalNode.getRightExpr().getValueType(), RHS); // < lhs, rhs context.invokeVirtual(String.class, "concat", String.class, new Class[] {String.class}); context.pushNullFlag(true); context.methodvisitor.visitJumpInsn(Opcodes.GOTO, afterEnd); context.methodvisitor.visitLabel(ifNull); context.pushDummyValue(evalNode.getValueType()); context.pushNullFlag(false); context.methodvisitor.visitLabel(afterEnd); return evalNode; }
public EvalNode visitStringConcat(EvalCodeGenContext context, BinaryEval evalNode, Stack<EvalNode> stack) throws CompilationError { stack.push(evalNode); visit(context, evalNode.getLeftExpr(), stack); // < lhs, l_null final int LHS_NULLFLAG = context.istore(); // < lhs final int LHS = context.store(evalNode.getLeftExpr().getValueType()); visit(context, evalNode.getRightExpr(), stack); // < rhs, r_nullflag int RHS_NULLFLAG = context.istore(); int RHS = context.store(evalNode.getRightExpr().getValueType()); // < stack.pop(); Label ifNull = new Label(); Label afterEnd = new Label(); context.emitNullityCheck(ifNull, LHS_NULLFLAG, RHS_NULLFLAG); context.load(evalNode.getLeftExpr().getValueType(), LHS); // < lhs context.load(evalNode.getRightExpr().getValueType(), RHS); // < lhs, rhs context.invokeVirtual(String.class, "concat", String.class, new Class[] {String.class}); context.pushNullFlag(true); context.methodvisitor.visitJumpInsn(Opcodes.GOTO, afterEnd); context.methodvisitor.visitLabel(ifNull); context.pushDummyValue(evalNode.getValueType()); context.pushNullFlag(false); context.methodvisitor.visitLabel(afterEnd); return evalNode; }