cb424d7448
verify-patch-sanity.py validates every active recipe .patch has internally- consistent hunk line counts — catching the 'malformed patch at line N' failure at commit/CI/preflight time instead of hours into a cook. This cycle hit that class three times (qtwaylandscanner, sddm, xwayland), each only discovered when cookbook tried to apply the patch. Running it across the repo found 29 latent malformed patches (validated against GNU patch: e.g. relibc/P3-sysv-ipc reproduces 'malformed patch at line 22'). They were harmless only because they sit in vendored recipes (baked, not re- applied) — but would fail on any version-bump re-derivation. --fix recounts the hunk headers (body untouched) and repaired all 29. Wired into build-preflight.sh (Phase 1.0D) and redbear-ci.yml, with a unit test (test-patch-sanity.sh). Skips archived/legacy trees and unvalidatable formats (empty placeholders, bare-@@ git hunks).
103 lines
4.1 KiB
OpenEdge ABL
103 lines
4.1 KiB
OpenEdge ABL
%feature("docstring",
|
|
"Represents a logical breakpoint and its associated settings.
|
|
|
|
For example (from test/functionalities/breakpoint/breakpoint_ignore_count/
|
|
TestBreakpointIgnoreCount.py),::
|
|
|
|
def breakpoint_ignore_count_python(self):
|
|
'''Use Python APIs to set breakpoint ignore count.'''
|
|
exe = os.path.join(os.getcwd(), 'a.out')
|
|
|
|
# Create a target by the debugger.
|
|
target = self.dbg.CreateTarget(exe)
|
|
self.assertTrue(target, VALID_TARGET)
|
|
|
|
# Now create a breakpoint on main.c by name 'c'.
|
|
breakpoint = target.BreakpointCreateByName('c', 'a.out')
|
|
self.assertTrue(breakpoint and
|
|
breakpoint.GetNumLocations() == 1,
|
|
VALID_BREAKPOINT)
|
|
|
|
# Get the breakpoint location from breakpoint after we verified that,
|
|
# indeed, it has one location.
|
|
location = breakpoint.GetLocationAtIndex(0)
|
|
self.assertTrue(location and
|
|
location.IsEnabled(),
|
|
VALID_BREAKPOINT_LOCATION)
|
|
|
|
# Set the ignore count on the breakpoint location.
|
|
location.SetIgnoreCount(2)
|
|
self.assertTrue(location.GetIgnoreCount() == 2,
|
|
'SetIgnoreCount() works correctly')
|
|
|
|
# Now launch the process, and do not stop at entry point.
|
|
process = target.LaunchSimple(None, None, os.getcwd())
|
|
self.assertTrue(process, PROCESS_IS_VALID)
|
|
|
|
# Frame#0 should be on main.c:37, frame#1 should be on main.c:25, and
|
|
# frame#2 should be on main.c:48.
|
|
#lldbutil.print_stacktraces(process)
|
|
from lldbutil import get_stopped_thread
|
|
thread = get_stopped_thread(process, lldb.eStopReasonBreakpoint)
|
|
self.assertTrue(thread is not None, 'There should be a thread stopped due to breakpoint')
|
|
frame0 = thread.GetFrameAtIndex(0)
|
|
frame1 = thread.GetFrameAtIndex(1)
|
|
frame2 = thread.GetFrameAtIndex(2)
|
|
self.assertTrue(frame0.GetLineEntry().GetLine() == self.line1 and
|
|
frame1.GetLineEntry().GetLine() == self.line3 and
|
|
frame2.GetLineEntry().GetLine() == self.line4,
|
|
STOPPED_DUE_TO_BREAKPOINT_IGNORE_COUNT)
|
|
|
|
# The hit count for the breakpoint should be 3.
|
|
self.assertTrue(breakpoint.GetHitCount() == 3)
|
|
|
|
process.Continue()
|
|
|
|
SBBreakpoint supports breakpoint location iteration, for example,::
|
|
|
|
for bl in breakpoint:
|
|
print('breakpoint location load addr: %s' % hex(bl.GetLoadAddress()))
|
|
print('breakpoint location condition: %s' % hex(bl.GetCondition()))
|
|
|
|
and rich comparison methods which allow the API program to use,::
|
|
|
|
if aBreakpoint == bBreakpoint:
|
|
...
|
|
|
|
to compare two breakpoints for equality."
|
|
) lldb::SBBreakpoint;
|
|
|
|
%feature("docstring", "
|
|
The breakpoint stops only if the condition expression evaluates to true."
|
|
) lldb::SBBreakpoint::SetCondition;
|
|
|
|
%feature("docstring", "
|
|
Get the condition expression for the breakpoint."
|
|
) lldb::SBBreakpoint::GetCondition;
|
|
|
|
%feature("docstring", "
|
|
Set the name of the script function to be called when the breakpoint is hit."
|
|
) lldb::SBBreakpoint::SetScriptCallbackFunction;
|
|
|
|
%feature("docstring", "
|
|
Set the name of the script function to be called when the breakpoint is hit.
|
|
To use this variant, the function should take (frame, bp_loc, extra_args, internal_dict) and
|
|
when the breakpoint is hit the extra_args will be passed to the callback function."
|
|
) lldb::SBBreakpoint::SetScriptCallbackFunction;
|
|
|
|
%feature("docstring", "
|
|
Provide the body for the script function to be called when the breakpoint is hit.
|
|
The body will be wrapped in a function, which be passed two arguments:
|
|
'frame' - which holds the bottom-most SBFrame of the thread that hit the breakpoint
|
|
'bpno' - which is the SBBreakpointLocation to which the callback was attached.
|
|
|
|
The error parameter is currently ignored, but will at some point hold the Python
|
|
compilation diagnostics.
|
|
Returns true if the body compiles successfully, false if not."
|
|
) lldb::SBBreakpoint::SetScriptCallbackBody;
|
|
|
|
|
|
%feature("docstring",
|
|
"Represents a list of :py:class:`SBBreakpoint`."
|
|
) lldb::SBBreakpointList;
|