Skip to content

Commit e49c156

Browse files
committed
[lldb] Dynamically generate enum names in lldbutil
Change the `<enum>_to_str` functions in lldbutil to be dynamic. Instead of a manually maintained if/elif switch, the functions now perform lookup in a dynamically generated dict. The names are determined by stripping the enum's prefix, and then lowercasing the remaining suffix, ex: eStateRunning -> "running" Differential Revision: https://reviews.llvm.org/D131138
1 parent fc40804 commit e49c156

File tree

1 file changed

+41
-130
lines changed

1 file changed

+41
-130
lines changed

lldb/packages/Python/lldbsuite/test/lldbutil.py

Lines changed: 41 additions & 130 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import re
1414
import sys
1515
import subprocess
16+
from typing import Dict
1617

1718
# Third-party modules
1819
from six import StringIO as SixStringIO
@@ -208,144 +209,54 @@ def get_description(obj, option=None):
208209
# Convert some enum value to its string counterpart
209210
# =================================================
210211

211-
def state_type_to_str(enum):
212+
def _enum_names(prefix: str) -> Dict[int, str]:
213+
"""Generate a mapping of enum value to name, for the enum prefix."""
214+
suffix_start = len(prefix)
215+
return {
216+
getattr(lldb, attr): attr[suffix_start:].lower()
217+
for attr in dir(lldb)
218+
if attr.startswith(prefix)
219+
}
220+
221+
222+
_STATE_NAMES = _enum_names(prefix="eState")
223+
224+
def state_type_to_str(enum: int) -> str:
212225
"""Returns the stateType string given an enum."""
213-
if enum == lldb.eStateInvalid:
214-
return "invalid"
215-
elif enum == lldb.eStateUnloaded:
216-
return "unloaded"
217-
elif enum == lldb.eStateConnected:
218-
return "connected"
219-
elif enum == lldb.eStateAttaching:
220-
return "attaching"
221-
elif enum == lldb.eStateLaunching:
222-
return "launching"
223-
elif enum == lldb.eStateStopped:
224-
return "stopped"
225-
elif enum == lldb.eStateRunning:
226-
return "running"
227-
elif enum == lldb.eStateStepping:
228-
return "stepping"
229-
elif enum == lldb.eStateCrashed:
230-
return "crashed"
231-
elif enum == lldb.eStateDetached:
232-
return "detached"
233-
elif enum == lldb.eStateExited:
234-
return "exited"
235-
elif enum == lldb.eStateSuspended:
236-
return "suspended"
237-
else:
238-
raise Exception("Unknown StateType enum: " + str(enum))
226+
name = _STATE_NAMES.get(enum)
227+
if name:
228+
return name
229+
raise Exception(f"Unknown StateType enum: {enum}")
230+
239231

232+
_STOP_REASON_NAMES = _enum_names(prefix="eStopReason")
240233

241-
def stop_reason_to_str(enum):
234+
def stop_reason_to_str(enum: int) -> str:
242235
"""Returns the stopReason string given an enum."""
243-
if enum == lldb.eStopReasonInvalid:
244-
return "invalid"
245-
elif enum == lldb.eStopReasonNone:
246-
return "none"
247-
elif enum == lldb.eStopReasonTrace:
248-
return "trace"
249-
elif enum == lldb.eStopReasonBreakpoint:
250-
return "breakpoint"
251-
elif enum == lldb.eStopReasonWatchpoint:
252-
return "watchpoint"
253-
elif enum == lldb.eStopReasonExec:
254-
return "exec"
255-
elif enum == lldb.eStopReasonFork:
256-
return "fork"
257-
elif enum == lldb.eStopReasonVFork:
258-
return "vfork"
259-
elif enum == lldb.eStopReasonVForkDone:
260-
return "vforkdone"
261-
elif enum == lldb.eStopReasonSignal:
262-
return "signal"
263-
elif enum == lldb.eStopReasonException:
264-
return "exception"
265-
elif enum == lldb.eStopReasonPlanComplete:
266-
return "plancomplete"
267-
elif enum == lldb.eStopReasonThreadExiting:
268-
return "threadexiting"
269-
elif enum == lldb.eStopReasonInstrumentation:
270-
return "instrumentation"
271-
elif enum == lldb.eStopReasonProcessorTrace:
272-
return "processortrace"
273-
else:
274-
raise Exception("Unknown StopReason enum")
236+
name = _STOP_REASON_NAMES.get(enum)
237+
if name:
238+
return name
239+
raise Exception(f"Unknown StopReason enum: {enum}")
275240

276241

277-
def symbol_type_to_str(enum):
242+
_SYMBOL_TYPE_NAMES = _enum_names(prefix="eSymbolType")
243+
244+
def symbol_type_to_str(enum: int) -> str:
278245
"""Returns the symbolType string given an enum."""
279-
if enum == lldb.eSymbolTypeInvalid:
280-
return "invalid"
281-
elif enum == lldb.eSymbolTypeAbsolute:
282-
return "absolute"
283-
elif enum == lldb.eSymbolTypeCode:
284-
return "code"
285-
elif enum == lldb.eSymbolTypeData:
286-
return "data"
287-
elif enum == lldb.eSymbolTypeTrampoline:
288-
return "trampoline"
289-
elif enum == lldb.eSymbolTypeRuntime:
290-
return "runtime"
291-
elif enum == lldb.eSymbolTypeException:
292-
return "exception"
293-
elif enum == lldb.eSymbolTypeSourceFile:
294-
return "sourcefile"
295-
elif enum == lldb.eSymbolTypeHeaderFile:
296-
return "headerfile"
297-
elif enum == lldb.eSymbolTypeObjectFile:
298-
return "objectfile"
299-
elif enum == lldb.eSymbolTypeCommonBlock:
300-
return "commonblock"
301-
elif enum == lldb.eSymbolTypeBlock:
302-
return "block"
303-
elif enum == lldb.eSymbolTypeLocal:
304-
return "local"
305-
elif enum == lldb.eSymbolTypeParam:
306-
return "param"
307-
elif enum == lldb.eSymbolTypeVariable:
308-
return "variable"
309-
elif enum == lldb.eSymbolTypeVariableType:
310-
return "variabletype"
311-
elif enum == lldb.eSymbolTypeLineEntry:
312-
return "lineentry"
313-
elif enum == lldb.eSymbolTypeLineHeader:
314-
return "lineheader"
315-
elif enum == lldb.eSymbolTypeScopeBegin:
316-
return "scopebegin"
317-
elif enum == lldb.eSymbolTypeScopeEnd:
318-
return "scopeend"
319-
elif enum == lldb.eSymbolTypeAdditional:
320-
return "additional"
321-
elif enum == lldb.eSymbolTypeCompiler:
322-
return "compiler"
323-
elif enum == lldb.eSymbolTypeInstrumentation:
324-
return "instrumentation"
325-
elif enum == lldb.eSymbolTypeUndefined:
326-
return "undefined"
327-
328-
329-
def value_type_to_str(enum):
246+
name = _SYMBOL_TYPE_NAMES.get(enum)
247+
if name:
248+
return name
249+
raise Exception(f"Unknown SymbolType enum: {enum}")
250+
251+
252+
_VALUE_TYPE_NAMES = _enum_names(prefix="eValueType")
253+
254+
def value_type_to_str(enum: int) -> str:
330255
"""Returns the valueType string given an enum."""
331-
if enum == lldb.eValueTypeInvalid:
332-
return "invalid"
333-
elif enum == lldb.eValueTypeVariableGlobal:
334-
return "global_variable"
335-
elif enum == lldb.eValueTypeVariableStatic:
336-
return "static_variable"
337-
elif enum == lldb.eValueTypeVariableArgument:
338-
return "argument_variable"
339-
elif enum == lldb.eValueTypeVariableLocal:
340-
return "local_variable"
341-
elif enum == lldb.eValueTypeRegister:
342-
return "register"
343-
elif enum == lldb.eValueTypeRegisterSet:
344-
return "register_set"
345-
elif enum == lldb.eValueTypeConstResult:
346-
return "constant_result"
347-
else:
348-
raise Exception("Unknown ValueType enum")
256+
name = _VALUE_TYPE_NAMES.get(enum)
257+
if name:
258+
return name
259+
raise Exception(f"Unknown ValueType enum: {enum}")
349260

350261

351262
# ==================================================

0 commit comments

Comments
 (0)