@Override
	public void visitAssert(XTreeAssert _assert) {
		XCodeGen code = getCode(_assert);
		XCompiledPart part = visit(_assert.condition);
		if (part.isConstValue()) {
			if (part.isFalse() && !options.removeAsserts) {
				code.addInstruction(_assert, XOpcode.LOADN);
				code.addInstruction(_assert, XOpcode.IMPORT, "sys");
				code.addInstruction(_assert, XOpcode.GET_ATTR, "AssertionError");
				if (_assert.message == null) {
					code.addInstruction(new XInstCall(_assert.position.position.line, null, -1, -1, 0));
				} else {
					visit(_assert.message).setupAndGet(this, code);
					code.addInstruction(new XInstCall(_assert.position.position.line, null, -1, -1, 1));
				}
				treePart.setDead(true);
			}
		} else if (options.removeAsserts) {
			part.asStatement(this, code);
		} else {
			part.setupAndGet(this, code);
			XJumpTarget end = new XJumpTarget();
			code.addInstruction(_assert, XOpcode.JUMP_IF_NON_ZERO, end);
			code.addInstruction(_assert, XOpcode.LOADN);
			code.addInstruction(_assert, XOpcode.IMPORT, "sys");
			code.addInstruction(_assert, XOpcode.GET_ATTR, "AssertionError");
			if (_assert.message == null) {
				code.addInstruction(new XInstCall(_assert.position.position.line, null, -1, -1, 0));
			} else {
				visit(_assert.message).setupAndGet(this, code);
				code.addInstruction(new XInstCall(_assert.position.position.line, null, -1, -1, 1));
			}
			code.addInstruction(_assert, XOpcode.THROW);
			code.addInstruction(_assert, end);
		}
	}