Fix Long Numeric Integer representation for Python 3
Before Python 3, long integers were input with an L suffix. Since Python 3, all integers are 64-bit and do not need the L suffix.
This commit is contained in:
@@ -230,7 +230,7 @@ void print_const(std::ostream& pyc_output, PycRef<PycObject> obj, PycModule* mod
|
||||
formatted_print(pyc_output, "%d", obj.cast<PycInt>()->value());
|
||||
break;
|
||||
case PycObject::TYPE_LONG:
|
||||
formatted_print(pyc_output, "%s", obj.cast<PycLong>()->repr().c_str());
|
||||
formatted_print(pyc_output, "%s", obj.cast<PycLong>()->repr(mod).c_str());
|
||||
break;
|
||||
case PycObject::TYPE_FLOAT:
|
||||
formatted_print(pyc_output, "%s", obj.cast<PycFloat>()->value());
|
||||
|
@@ -53,13 +53,13 @@ bool PycLong::isEqual(PycRef<PycObject> obj) const
|
||||
return true;
|
||||
}
|
||||
|
||||
std::string PycLong::repr() const
|
||||
std::string PycLong::repr(PycModule* mod) const
|
||||
{
|
||||
// Longs are printed as hex, since it's easier (and faster) to convert
|
||||
// arbitrary-length integers to a power of two than an arbitrary base
|
||||
|
||||
if (m_size == 0)
|
||||
return "0x0L";
|
||||
return (mod->verCompare(3, 0) >= 0) ? "0x0" : "0x0L";
|
||||
|
||||
// Realign to 32 bits, since Python uses only 15
|
||||
std::vector<unsigned> bits;
|
||||
@@ -90,6 +90,7 @@ std::string PycLong::repr() const
|
||||
aptr += snprintf(aptr, 9, "%X", *iter++);
|
||||
while (iter != bits.rend())
|
||||
aptr += snprintf(aptr, 9, "%08X", *iter++);
|
||||
if (mod->verCompare(3, 0) < 0)
|
||||
*aptr++ = 'L';
|
||||
*aptr = 0;
|
||||
return accum;
|
||||
|
@@ -37,7 +37,7 @@ public:
|
||||
int size() const { return m_size; }
|
||||
const std::vector<int>& value() const { return m_value; }
|
||||
|
||||
std::string repr() const;
|
||||
std::string repr(PycModule* mod) const;
|
||||
|
||||
private:
|
||||
int m_size;
|
||||
|
@@ -223,7 +223,7 @@ void output_object(PycRef<PycObject> obj, PycModule* mod, int indent,
|
||||
iprintf(pyc_output, indent, "%d\n", obj.cast<PycInt>()->value());
|
||||
break;
|
||||
case PycObject::TYPE_LONG:
|
||||
iprintf(pyc_output, indent, "%s\n", obj.cast<PycLong>()->repr().c_str());
|
||||
iprintf(pyc_output, indent, "%s\n", obj.cast<PycLong>()->repr(mod).c_str());
|
||||
break;
|
||||
case PycObject::TYPE_FLOAT:
|
||||
iprintf(pyc_output, indent, "%s\n", obj.cast<PycFloat>()->value());
|
||||
|
Reference in New Issue
Block a user