'Return self * other.
(+-) INF * 0 (or its reverse) raise InvalidOperation.'

def __mul__(self, other, context=None):

    other = _convert_other(other)
    if (context is None):
        context = getcontext()
    resultsign = (self._sign ^ other._sign)
    if (self._is_special or other._is_special):
        ans = self._check_nans(other, context)
        if ans:
            return ans
        if self._isinfinity():
            if (not other):
                return context._raise_error(InvalidOperation, '(+-)INF    *    0')
            return Infsign[resultsign]
        if other._isinfinity():
            if (not self):
                return context._raise_error(InvalidOperation, '0    *    (+-)INF')
            return Infsign[resultsign]
    resultexp = (self._exp + other._exp)
    shouldround = (context._rounding_decision == ALWAYS_ROUND)
    if ((not self) or (not other)):
        ans = Decimal((resultsign, (0,), resultexp))
        if shouldround:
            ans = ans._fix(context)
        return ans
    if (self._int == (1,)):
        ans = Decimal((resultsign, other._int, resultexp))
        if shouldround:
            ans = ans._fix(context)
        return ans
    if (other._int == (1,)):
        ans = Decimal((resultsign, self._int, resultexp))
        if shouldround:
            ans = ans._fix(context)
        return ans
    op1 = _WorkRep(self)
    op2 = _WorkRep(other)
    ans = Decimal((resultsign, map(int, str((op1.int * op2.int))), resultexp))
    if shouldround:
        ans = ans._fix(context)
    return ans
