diff --git a/meliae/_loader.pyx b/meliae/_loader.pyx index 25405e4..9d376b3 100644 --- a/meliae/_loader.pyx +++ b/meliae/_loader.pyx @@ -581,6 +581,8 @@ cdef class _MemObjectProxy: else: # TODO: This isn't perfect, as it doesn't do proper json # escaping + if '"' in self.value: + raise AssertionError(self.value) value = '"value": "%s", ' % self.value else: value = '' diff --git a/meliae/loader.py b/meliae/loader.py index 94b5ad4..cd4c85f 100644 --- a/meliae/loader.py +++ b/meliae/loader.py @@ -50,7 +50,7 @@ r', "size": (?P\d+)' r'(, "name": "(?P.*)")?' r'(, "len": (?P\d+))?' - r'(, "value": "?(?P.*)"?)?' + r'(, "value": (?P"?)(?P.*)(?P=valuequote))?' r', "refs": \[(?P[^]]*)\]' r'\}') diff --git a/meliae/tests/test_loader.py b/meliae/tests/test_loader.py index 7ecd1da..f67e9fb 100644 --- a/meliae/tests/test_loader.py +++ b/meliae/tests/test_loader.py @@ -133,7 +133,7 @@ def test_load_without_simplejson(self): '{"address": 2345, "type": "module", "size": 60, "name": "mymod"' ', "refs": [1234]}', '{"address": 4567, "type": "str", "size": 150, "len": 126' - ', "value": "Test \\\'whoami\\\'\\u000a\\"Your name\\"' + ', "value": "Test \\\'whoami\\\'\\u000a\\"Your name\\""' ', "refs": []}' ], using_json=False, show_prog=False).objs keys = sorted(objs.keys()) @@ -148,10 +148,7 @@ def test_load_without_simplejson(self): self.assertEqual("module", obj.type_str) self.assertEqual("mymod", obj.value) obj = objs[4567] - # Known failure? We don't unescape properly, also, I'm surprised this - # works. " should exit the " string, but \" seems to leave it. But the - # '\' is also left verbatim because it is a raw string... - self.assertEqual(r"Test \'whoami\'\u000a\"Your name\"", obj.value) + self.assertEqual("Test \\'whoami\\'\\u000a\\\"Your name\\\"", obj.value) def test_load_example(self): objs = loader.load(_example_dump, show_prog=False)