this repo has no description

Shorten binary serialization for true and false (#256)

Fixes #225

authored by

Sodgerel Mandakhnaran and committed by
GitHub
acffc29a dbd60599

+29 -1
+13 -1
scrapscript.py
··· 984 984 TYPE_ACCESS := b"@", 985 985 TYPE_SPREAD := b"S", 986 986 TYPE_NAMED_SPREAD := b"R", 987 + TYPE_TRUE := b"T", 988 + TYPE_FALSE := b"F", 987 989 ] 988 990 FLAG_REF = 0x80 989 991 ··· 1091 1093 self.serialize(item) 1092 1094 return 1093 1095 if isinstance(obj, Variant): 1096 + if obj.tag == "true" and isinstance(obj.value, Hole): 1097 + return self.emit(TYPE_TRUE) 1098 + if obj.tag == "false" and isinstance(obj.value, Hole): 1099 + return self.emit(TYPE_FALSE) 1094 1100 # TODO(max): Determine if this should be a ref 1095 1101 self.emit(TYPE_VARIANT) 1096 1102 # TODO(max): String pool (via refs) for strings longer than some length? ··· 1329 1335 return Spread() 1330 1336 if ty == TYPE_NAMED_SPREAD: 1331 1337 return Spread(self._string()) 1338 + if ty == TYPE_TRUE: 1339 + assert not is_ref 1340 + return Variant("true", Hole()) 1341 + if ty == TYPE_FALSE: 1342 + assert not is_ref 1343 + return Variant("false", Hole()) 1332 1344 raise NotImplementedError(bytes(ty)) 1333 1345 1334 1346 ··· 2531 2543 if scrap is not None: 2532 2544 self.send_response(200) 2533 2545 self.send_header("Content-Type", "application/scrap; charset=binary") 2534 - self.send_header("Content-Disposition", f'attachment; filename={json.dumps(f"{path}.scrap")}') 2546 + self.send_header("Content-Disposition", f"attachment; filename={json.dumps(f'{path}.scrap')}") 2535 2547 self.send_header("Content-Length", str(len(scrap))) 2536 2548 self.end_headers() 2537 2549 self.wfile.write(scrap)
+16
scrapscript_tests.py
··· 3778 3778 def test_spread(self) -> None: 3779 3779 self.assertEqual(self._serialize(Spread()), TYPE_SPREAD) 3780 3780 self.assertEqual(self._serialize(Spread("rest")), TYPE_NAMED_SPREAD + b"\x08rest") 3781 + 3782 + def test_true_variant(self) -> None: 3783 + obj = Variant("true", Hole()) 3784 + self.assertEqual(self._serialize(obj), TYPE_TRUE) 3785 + 3786 + def test_false_variant(self) -> None: 3787 + obj = Variant("false", Hole()) 3788 + self.assertEqual(self._serialize(obj), TYPE_FALSE) 3789 + 3790 + def test_true_variant_with_non_hole_uses_regular_variant(self) -> None: 3791 + obj = Variant("true", Int(123)) 3792 + self.assertEqual(self._serialize(obj), TYPE_VARIANT + b"\x08truei\xf6\x01") 3793 + 3794 + def test_false_variant_with_non_hole_uses_regular_variant(self) -> None: 3795 + obj = Variant("false", Int(123)) 3796 + self.assertEqual(self._serialize(obj), TYPE_VARIANT + b"\x0afalsei\xf6\x01") 3781 3797 3782 3798 3783 3799 class RoundTripSerializationTests(unittest.TestCase):