Skip to content

Commit f7a8d19

Browse files
committed
feat: enhance PyExpr initialization with optional parameters and improve GenericUnpickler logic
1 parent cb9b591 commit f7a8d19

3 files changed

Lines changed: 16 additions & 10 deletions

File tree

src/renpy/ast.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -206,17 +206,21 @@ class PyExpr(str):
206206
"filename",
207207
"linenumber",
208208
"py",
209+
"hashcode",
210+
"column",
209211
]
210212

211-
def __new__(cls, s, filename, linenumber, py=3):
213+
def __new__(cls, s, filename=None, linenumber=0, py=3, hashcode=None, column=0):
212214
self = str.__new__(cls, s)
213215
self.filename = filename # type: ignore
214216
self.linenumber = linenumber # type: ignore
215217
self.py = py # type: ignore
218+
self.hashcode = hashcode # type: ignore
219+
self.column = column # type: ignore
216220
return self
217221

218222
def __getnewargs__(self):
219-
return (str(self), self.filename, self.linenumber, self.py)
223+
return (str(self), self.filename, self.linenumber, self.py, self.hashcode, self.column)
220224

221225
def get_code(self, **kwargs) -> str:
222226
return str(self)

src/renpy/astsupport.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@ class PyExpr(str):
1010
def __new__(
1111
cls,
1212
expr: str,
13-
filename: str,
14-
linenumber: int,
15-
py: int,
16-
hashcode: str,
13+
filename: str = '',
14+
linenumber: int = 0,
15+
py: int = 3,
16+
hashcode: str = '',
1717
column: int = 0,
1818
):
1919
self = super().__new__(cls, expr)

src/rpycdec/stmts.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ def __setstate__(self, state):
4949

5050
class GenericUnpickler(pickle.Unpickler):
5151
def find_class(self, module, name):
52-
if module.startswith("store") or module.startswith("renpy"):
52+
if module.startswith("store"):
5353
return type(name, (DummyClass,), {"__module__": module})
5454
return super().find_class(module, name)
5555

@@ -95,10 +95,12 @@ def load(data: io.BufferedReader, slots: list[int] = [1, 2], **kwargs) -> Node |
9595
logger.info("Disassembling rpyc file...")
9696
pickletools.dis(bindata)
9797

98-
data, stmts = pickle.loads(
99-
bindata, encoding="utf-8", errors="surrogateescape"
98+
unpickler = GenericUnpickler(
99+
io.BytesIO(bindata), encoding="utf-8", errors="surrogateescape"
100100
)
101-
key = data.get("key", "unlocked")
101+
data, stmts = unpickler.load()
102+
103+
key = data.get("key", "unlocked") # type: ignore
102104
return stmts
103105
raise Exception("Unsupported file format or invalid file")
104106

0 commit comments

Comments
 (0)