From a7750cd170f195f066fee500d76f8812c57d5a2f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Piotr=20Ma=C5=9Blanka?= <piotr.maslanka@henrietta.com.pl>
Date: Fri, 6 Aug 2021 18:41:02 +0200
Subject: [PATCH] fix ARM bug, add ppc64le

---
 .travis.yml            | 12 ++++++++++++
 docs/changelog.md      |  1 +
 minijson.pyx           | 33 ++++++++++++---------------------
 setup.cfg              |  2 +-
 tests/test_minijson.py |  7 +++++++
 5 files changed, 33 insertions(+), 22 deletions(-)

diff --git a/.travis.yml b/.travis.yml
index 960f183..b4c7519 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -38,6 +38,18 @@ jobs:
       script:
         - DEBUG=1 python setup.py install
         - pytest --cov=./ --cov-report=xml
+    - stage: test
+      python: "3.8"
+      arch: "ppc64le"
+      before_script:
+        - pip install -r requirements.txt
+        - pip install pytest coverage pytest-cov
+      after_script:
+        - coverage xml
+        - coverage report
+      script:
+        - DEBUG=1 python setup.py install
+        - pytest --cov=./ --cov-report=xml
     - stage: test
       python: "3.8"
       script:
diff --git a/docs/changelog.md b/docs/changelog.md
index 0abd45e..2c6eb0d 100644
--- a/docs/changelog.md
+++ b/docs/changelog.md
@@ -5,6 +5,7 @@ v2.9
 ----
 
 * minor refactor: code deduplication
+* fixed some bugs on ARM
 
 v2.8
 ----
diff --git a/minijson.pyx b/minijson.pyx
index 05bcd27..b7e9869 100644
--- a/minijson.pyx
+++ b/minijson.pyx
@@ -176,27 +176,18 @@ cdef tuple parse_bytes(bytes data, int starting_position):
                 return offset+1, b_field_name.decode('utf-8')
             except UnicodeDecodeError as e:
                 raise DecodingError('Invalid UTF-8') from e
-        elif value_type in (1, 4):
-            uint32 = (data[starting_position+1] << 24) | (data[starting_position+2] << 16) | (data[starting_position+3] << 8) | data[starting_position+4]
-            if value_type == 4:
-                return 5, uint32
-            else:
-                sint32 = uint32
-                return 5, sint32
-        elif value_type in (2, 5):
-            uint16 = (data[starting_position+1] << 8) | data[starting_position+2]
-            if value_type == 5:
-                return 3, uint16
-            else:
-                sint16 = uint16
-                return 3, sint16
-        elif value_type in (3, 6):
-            uint8 = data[starting_position+1]
-            if value_type == 6:
-                return 2, uint8
-            else:
-                sint8 = uint8
-                return 2, sint8
+        elif value_type == 1:
+            return 5, *STRUCT_l.unpack(data[starting_position+1:starting_position+5])
+        elif value_type == 4:
+            return 5, *STRUCT_L.unpack(data[starting_position+1:starting_position+5])
+        elif value_type == 2:
+            return 3, *STRUCT_h.unpack(data[starting_position+1:starting_position+3])
+        elif value_type == 5:
+            return 3, *STRUCT_H.unpack(data[starting_position+1:starting_position+3])
+        elif value_type == 3:
+            return 2, *STRUCT_b.unpack(data[starting_position+1:starting_position+2])
+        elif value_type == 6:
+            return 2, data[starting_position+1]
         elif value_type == 7:
             elements = data[starting_position+1]
             offset, e_list = parse_list(data, elements, starting_position+2)
diff --git a/setup.cfg b/setup.cfg
index a33a1d4..02c1353 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -1,6 +1,6 @@
 # coding: utf-8
 [metadata]
-version = 2.9a1
+version = 2.9a2
 name = minijson
 long_description = file: README.md
 long_description_content_type = text/markdown; charset=UTF-8
diff --git a/tests/test_minijson.py b/tests/test_minijson.py
index 31f686b..bb9cb93 100644
--- a/tests/test_minijson.py
+++ b/tests/test_minijson.py
@@ -11,6 +11,13 @@ class TestMiniJSON(unittest.TestCase):
         enc.encode({"test": "2", "value": 2})
         enc.encode({b"test": "2", b"value": 2})
 
+    def test_are_we_sane(self):
+        self.assertTrue(-128 <= -1 <= 127)
+
+    def test_arm_bug(self):
+        b = dumps(-1)
+        self.assertEqual(b, b'\x03\xFF')
+
     def test_encoder_overrided_default(self):
         class Encoder(MiniJSONEncoder):
             def default(self, v):
-- 
GitLab