throw new NonLinearException("push argument wasn't linear");
    public Object visitPushExpression(SIRPushExpression self, CType tapeType, JExpression arg) {	LinearPrinter.println("  visiting push expression: " +			   "argument: " + arg);	// try and resolve the argument to a LinearForm by munging the argument	LinearForm argLinearForm = (LinearForm)arg.accept(this);	// if we get null, it means we don't know that this push expression will	// yield a linear form, so therefore we can't characterize the filter as	// a whole as having linear form.	if (argLinearForm == null) {	    // set the flag that says this filter isn't linear	    this.nonLinearFlag = true;	    LinearPrinter.println("  push argument wasn't linear: " + arg);	} else {	    // (note that the first push ends up in the rightmost column)	    // so we calculate which column that this push statement corresponds to	    int pushColumn = this.pushSize - this.pushOffset -1;	    // we have a linear form, so we update the matrix representation	    argLinearForm.copyToColumn(this.representationMatrix, pushColumn);	    // update the constant vector with the offset from the linear form	    this.representationVector.setElement(pushColumn, argLinearForm.getOffset());	}	// increment the push offset (for the next push statement)	this.pushOffset++;	LinearPrinter.println("   (current push offset: " + this.pushOffset);	// make sure we didn't screw up anything.	checkRep();	// push expressions don't return values, so they also certainly don't return linear forms	return null;    }