summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2016-04-15 11:56:10 +0100
committerDamien George <damien.p.george@gmail.com>2016-04-15 11:56:10 +0100
commitc3beb16db33e941021ff839a2fa9c806c134aa48 (patch)
tree93be8a9536e54db08660a2e6abeb4e0ad295e291
parent091dcaea2f4576c8cdbb1df68497e5b9e08b490d (diff)
downloadmicropython-c3beb16db33e941021ff839a2fa9c806c134aa48.tar.gz
micropython-c3beb16db33e941021ff839a2fa9c806c134aa48.zip
tools/mpy-tool.py: Add support for Python 2.7.
-rwxr-xr-xtools/mpy-tool.py43
1 files changed, 30 insertions, 13 deletions
diff --git a/tools/mpy-tool.py b/tools/mpy-tool.py
index fd79b56f6c..ec302534a7 100755
--- a/tools/mpy-tool.py
+++ b/tools/mpy-tool.py
@@ -24,6 +24,23 @@
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
+# Python 2/3 compatibility code
+from __future__ import print_function
+import platform
+if platform.python_version_tuple()[0] == '2':
+ str_cons = lambda val, enc=None: val
+ bytes_cons = lambda val, enc=None: bytearray(val)
+ is_str_type = lambda o: type(o) is str
+ is_bytes_type = lambda o: type(o) is bytearray
+ is_int_type = lambda o: type(o) is int or type(o) is long
+else:
+ str_cons = str
+ bytes_cons = bytes
+ is_str_type = lambda o: type(o) is str
+ is_bytes_type = lambda o: type(o) is bytes
+ is_int_type = lambda o: type(o) is int
+# end compatibility code
+
import sys
from collections import namedtuple
@@ -67,7 +84,7 @@ def make_opcode_format():
Q = 1
V = 2
O = 3
- return bytes((
+ return bytes_cons((
# this table is taken verbatim from py/bc.c
OC4(U, U, U, U), # 0x00-0x03
OC4(U, U, U, U), # 0x04-0x07
@@ -255,16 +272,16 @@ class RawCode:
# generate constant objects
for i, obj in enumerate(self.objs):
obj_name = 'const_obj_%s_%u' % (self.escaped_name, i)
- if type(obj) is str:
- obj = bytes(obj, 'utf8')
+ if is_str_type(obj):
+ obj = bytes_cons(obj, 'utf8')
print('STATIC const mp_obj_str_t %s = '
'{{&mp_type_str}, 0, %u, (const byte*)"%s"};'
% (obj_name, len(obj), ''.join(('\\x%02x' % b) for b in obj)))
- elif type(obj) is bytes:
+ elif is_bytes_type(obj):
print('STATIC const mp_obj_str_t %s = '
'{{&mp_type_bytes}, 0, %u, (const byte*)"%s"};'
% (obj_name, len(obj), ''.join(('\\x%02x' % b) for b in obj)))
- elif type(obj) is int:
+ elif is_int_type(obj):
if config.MICROPY_LONGINT_IMPL == config.MICROPY_LONGINT_IMPL_NONE:
# TODO check if we can actually fit this long-int into a small-int
raise FreezeError(self, 'target does not support long int')
@@ -327,7 +344,7 @@ class RawCode:
def read_uint(f):
i = 0
while True:
- b = f.read(1)[0]
+ b = bytes_cons(f.read(1))[0]
i = (i << 7) | (b & 0x7f)
if b & 0x80 == 0:
break
@@ -337,7 +354,7 @@ global_qstrs = []
qstr_type = namedtuple('qstr', ('str', 'qstr_esc', 'qstr_id'))
def read_qstr(f):
ln = read_uint(f)
- data = str(f.read(ln), 'utf8')
+ data = str_cons(f.read(ln), 'utf8')
qstr_esc = qstrutil.qstr_escape(data)
global_qstrs.append(qstr_type(data, qstr_esc, 'MP_QSTR_' + qstr_esc))
return len(global_qstrs) - 1
@@ -349,15 +366,15 @@ def read_obj(f):
else:
buf = f.read(read_uint(f))
if obj_type == b's':
- return str(buf, 'utf8')
+ return str_cons(buf, 'utf8')
elif obj_type == b'b':
- return buf
+ return bytes_cons(buf)
elif obj_type == b'i':
- return int(str(buf, 'ascii'), 10)
+ return int(str_cons(buf, 'ascii'), 10)
elif obj_type == b'f':
- return float(str(buf, 'ascii'))
+ return float(str_cons(buf, 'ascii'))
elif obj_type == b'c':
- return complex(str(buf, 'ascii'))
+ return complex(str_cons(buf, 'ascii'))
else:
assert 0
@@ -389,7 +406,7 @@ def read_raw_code(f):
def read_mpy(filename):
with open(filename, 'rb') as f:
- header = f.read(4)
+ header = bytes_cons(f.read(4))
if header[0] != ord('M'):
raise Exception('not a valid .mpy file')
if header[1] != 0: