Skip to content

Commit cc38ee4

Browse files
remove locks in JIT code
1 parent 53c5e1d commit cc38ee4

File tree

4 files changed

+71
-45
lines changed

4 files changed

+71
-45
lines changed

Python/executor_cases.c.h

Lines changed: 19 additions & 19 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Tools/cases_generator/generators_common.py

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,30 @@ def __init__(self, out: CWriter, labels: dict[str, Label], cannot_escape: bool =
135135
self.cannot_escape = cannot_escape
136136
self.jump_prefix = jump_prefix
137137

138+
def emit_to_with_replacement(
139+
self,
140+
out: CWriter,
141+
tkn_iter: TokenIterator,
142+
end: str,
143+
uop: CodeSection,
144+
storage: Storage,
145+
inst: Instruction | None
146+
) -> Token:
147+
parens = 0
148+
for tkn in tkn_iter:
149+
if tkn.kind == end and parens == 0:
150+
return tkn
151+
if tkn.kind == "LPAREN":
152+
parens += 1
153+
if tkn.kind == "RPAREN":
154+
parens -= 1
155+
if tkn.text in self._replacers:
156+
self._replacers[tkn.text](tkn, tkn_iter, uop, storage, inst)
157+
else:
158+
out.emit(tkn)
159+
raise analysis_error(f"Expecting {end}. Reached end of file", tkn)
160+
161+
138162
def dispatch(
139163
self,
140164
tkn: Token,
@@ -162,7 +186,7 @@ def deopt_if(
162186
lparen = next(tkn_iter)
163187
assert lparen.kind == "LPAREN"
164188
first_tkn = tkn_iter.peek()
165-
emit_to(self.out, tkn_iter, "RPAREN")
189+
self.emit_to_with_replacement(self.out, tkn_iter, "RPAREN", uop, storage, inst)
166190
self.emit(") {\n")
167191
next(tkn_iter) # Semi colon
168192
assert inst is not None

Tools/cases_generator/optimizer_generator.py

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -271,29 +271,6 @@ def __init__(self, out: CWriter, labels: dict[str, Label], original_uop: Uop, st
271271
self._replacers = {**self._replacers, **overrides}
272272
self.cannot_escape = True
273273

274-
def emit_to_with_replacement(
275-
self,
276-
out: CWriter,
277-
tkn_iter: TokenIterator,
278-
end: str,
279-
uop: CodeSection,
280-
storage: Storage,
281-
inst: Instruction | None
282-
) -> Token:
283-
parens = 0
284-
for tkn in tkn_iter:
285-
if tkn.kind == end and parens == 0:
286-
return tkn
287-
if tkn.kind == "LPAREN":
288-
parens += 1
289-
if tkn.kind == "RPAREN":
290-
parens -= 1
291-
if tkn.text in self._replacers:
292-
self._replacers[tkn.text](tkn, tkn_iter, uop, storage, inst)
293-
else:
294-
out.emit(tkn)
295-
raise analysis_error(f"Expecting {end}. Reached end of file", tkn)
296-
297274
def emit_stackref_override(
298275
self,
299276
tkn: Token,

Tools/cases_generator/tier2_generator.py

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,8 @@ def __init__(self, out: CWriter, labels: dict[str, Label]):
6464
super().__init__(out, labels)
6565
self._replacers["oparg"] = self.oparg
6666
self._replacers["IP_OFFSET_OF"] = self.ip_offset_of
67+
self._replacers["LOCK_OBJECT"] = self.lock_object
68+
self._replacers["UNLOCK_OBJECT"] = self.unlock_object
6769

6870
def goto_error(self, offset: int, storage: Storage) -> str:
6971
# To do: Add jump targets for popping values.
@@ -84,7 +86,7 @@ def deopt_if(
8486
self.emit(lparen)
8587
assert lparen.kind == "LPAREN"
8688
first_tkn = tkn_iter.peek()
87-
emit_to(self.out, tkn_iter, "RPAREN")
89+
self.emit_to_with_replacement(self.out, tkn_iter, "RPAREN", uop, storage, inst)
8890
next(tkn_iter) # Semi colon
8991
self.emit(") {\n")
9092
self.emit("UOP_STAT_INC(uopcode, miss);\n")
@@ -104,7 +106,7 @@ def exit_if(
104106
lparen = next(tkn_iter)
105107
self.emit(lparen)
106108
first_tkn = tkn_iter.peek()
107-
emit_to(self.out, tkn_iter, "RPAREN")
109+
self.emit_to_with_replacement(self.out, tkn_iter, "RPAREN", uop, storage, inst)
108110
next(tkn_iter) # Semi colon
109111
self.emit(") {\n")
110112
self.emit("UOP_STAT_INC(uopcode, miss);\n")
@@ -154,6 +156,29 @@ def ip_offset_of(
154156
next(tkn_iter)
155157
return True
156158

159+
def lock_object(
160+
self,
161+
tkn: Token,
162+
tkn_iter: TokenIterator,
163+
uop: CodeSection,
164+
storage: Storage,
165+
inst: Instruction | None,
166+
) -> bool:
167+
self.emit("1 && ")
168+
return True
169+
170+
def unlock_object(
171+
self,
172+
tkn: Token,
173+
tkn_iter: TokenIterator,
174+
uop: CodeSection,
175+
storage: Storage,
176+
inst: Instruction | None,
177+
) -> bool:
178+
self.out.start_line()
179+
self.emit("(void)")
180+
return True
181+
157182
def write_uop(uop: Uop, emitter: Emitter, stack: Stack, offset_strs: dict[str, tuple[str, str]]) -> Stack:
158183
locals: dict[str, Local] = {}
159184
try:

0 commit comments

Comments
 (0)