Skip to content

Commit 8809bf2

Browse files
committed
Improve disassemble range parsing/handling
1 parent ad2ddaa commit 8809bf2

File tree

4 files changed

+39
-27
lines changed

4 files changed

+39
-27
lines changed

trepan/lib/disassemble.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -94,11 +94,11 @@ def dis(
9494
mess = ""
9595
if start_line > 1:
9696
mess += "from line %d " % start_line
97-
elif start_offset > 1:
97+
if start_offset >= 0:
9898
mess = "from offset %d " % start_offset
99-
if end_line:
99+
if end_line > 0:
100100
mess += "to line %d" % end_line
101-
elif end_offset:
101+
if end_offset:
102102
mess += "to offset %d" % end_offset
103103

104104
sectioned = False
@@ -406,10 +406,10 @@ def disassemble_bytes(
406406
orig_msg: Callable,
407407
orig_msg_nocr: Callable,
408408
code: types.CodeType,
409-
lasti=-1,
410-
cur_line=0,
411-
start_line=-1,
412-
end_line=None,
409+
lasti: int =-1,
410+
cur_line: int =0,
411+
start_line: int =-1,
412+
end_line: int = -1,
413413
relative_pos=False,
414414
line_starts={},
415415
style="none",
@@ -425,7 +425,7 @@ def null_print(_):
425425
return None
426426

427427
instructions = []
428-
if end_line is None:
428+
if end_line < 0:
429429
end_line = 10000
430430
elif relative_pos:
431431
end_line += start_line - 1

trepan/processor/command/disassemble.py

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@ def run(self, args):
154154
eval_args = args[1]
155155
try:
156156
obj = self.proc.eval(eval_args, show_error=False)
157+
157158
except Exception:
158159
obj = None
159160
else:
@@ -187,6 +188,7 @@ def run(self, args):
187188

188189
if is_offset:
189190
opts["start_offset"] = start
191+
opts["start_line"] = -1
190192
else:
191193
opts["start_line"] = start
192194
if last is None:
@@ -203,6 +205,7 @@ def run(self, args):
203205

204206
if last_is_offset:
205207
opts["end_offset"] = last
208+
opts["end_line"] = -1
206209
else:
207210
opts["end_line"] = last
208211
opts["end_offset"] = None
@@ -240,7 +243,6 @@ def run(self, args):
240243
return
241244

242245
# We now have all information. Do the listing.
243-
breakpoint()
244246
(obj, proc.list_offset) = dis(
245247
self.msg, self.msg_nocr, self.section, self.errmsg, obj, **opts
246248
)
@@ -269,25 +271,22 @@ def doit(cmd, args):
269271
command = DisassembleCommand(cp)
270272
prefix = "-" * 20 + " disassemble "
271273

272-
doit(command, ["disassemble", f"{doit_return_line}, {doit_return_line+2}"])
274+
print(prefix + 'doit')
275+
doit(command, ['disassemble', 'doit()'])
273276

274-
print(prefix + "os.path")
275-
doit(command, ["disassemble", "cp.errmsg()"])
277+
print(prefix + "*0, *10")
278+
doit(command, ["disassemble", "*0, *10"])
276279

277-
print(prefix + "cp.errmsg()")
278-
doit(command, ["disassemble", "cp.errmsg()"])
280+
doit(command, ["disassemble", f"{doit_return_line}, {doit_return_line+2}"])
281+
282+
# FIXME
283+
# print(prefix + "os.path")
284+
# doit(command, ["disassemble", "os.path"])
279285

280286
print(prefix + "cp.errmsg()")
281287
doit(command, ["disassemble", "cp.errmsg()"])
282288

283-
# print(prefix)
284-
# doit(command, ['disassemble']) # no good
285-
286-
# print(prefix + 'me')
287-
# doit(command, ['disassemble', 'me()']) # reports invalid function correctly
288-
289-
# print(prefix + "*0 +248")
290-
# doit(command, ["disassemble", "*0,", "+248"])
289+
# -----------------------
291290

292291
# print(prefix + '+ 2-1')
293292
# doit(command, ['disassemble', '+', '2-1']) # not valid?

trepan/processor/location.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -279,15 +279,18 @@ def resolve_address_location(proc, location) -> Optional[Location]:
279279
elif location.line_number is not None:
280280
filename = frame2file(proc.core, curframe, canonic=False)
281281
offset = location.line_number
282-
is_address = location.is_address
282+
mod_or_func_or_code = proc.list_object
283+
elif location.offset is not None:
284+
filename = frame2file(proc.core, curframe, canonic=False)
285+
offset = location.offset
283286
mod_or_func_or_code = proc.list_object
284287
else:
285288
proc.errmsg(
286289
f"Location {location} doesn't have enough information for a location."
287290
)
288291
return INVALID_LOCATION
289292

290-
return Location(filename, offset, is_address, mod_or_func_or_code, offset)
293+
return Location(filename, offset, location.is_address, mod_or_func_or_code, offset)
291294

292295

293296
# Demo it

trepan/processor/parse/semantics.py

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -76,21 +76,31 @@ def n_location(self, node):
7676
# If there is a line number, it is the last token of a location
7777
if len(node) > 1 and node[-1] == "NUMBER":
7878
line_number = node[-1].value
79+
is_address = False
80+
else:
81+
offset = 0
82+
is_address = True
7983
elif node[0] == "FUNCNAME":
8084
method = node[0].value[:-2]
8185
offset = 0
86+
is_address = True
8287
elif node[0] == "NUMBER":
88+
is_address = False
8389
line_number = node[0].value
90+
elif node[0] == "ADDRESS":
91+
is_address = True
92+
offset = int(node[0].value[1:])
8493
else:
8594
assert True, "n_location: Something's is wrong; node[0] is %s" % node[0]
86-
self.result = Location(path, line_number, False, method, offset=offset)
87-
node.location = Location(path, line_number, False, method, offset=offset)
95+
self.result = Location(path, line_number, is_address, method, offset=offset)
96+
node.location = Location(path, line_number, is_address, method, offset=offset)
8897
self.prune()
8998

9099
def n_NUMBER(self, node):
91100
self.result = Location(None, node.value, False, None, offset=None)
92101

93102
def n_ADDRESS(self, node):
103+
breakpoint()
94104
self.result = Location(None, None, True, None, offset=int(node.value[1:]))
95105

96106
def n_FUNCNAME(self, node):
@@ -383,7 +393,7 @@ def doit(fn, line):
383393
# )
384394
# lines = (
385395
# "*10",
386-
# "@10",
396+
# "*10",
387397
# "/tmp/foo.py:1, *5",
388398
# "../foo.py:0, +5",
389399
# "../foo.py:5, *30",

0 commit comments

Comments
 (0)