Skip to content

Commit 6ec7ac7

Browse files
committed
Incorporate review comments
1 parent 6148616 commit 6ec7ac7

File tree

7 files changed

+48
-25
lines changed

7 files changed

+48
-25
lines changed

org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/test/stepping/StatementSteppingTests.java

Lines changed: 34 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import org.eclipse.core.runtime.ISafeRunnable;
1717
import org.eclipse.debug.core.DebugEvent;
1818
import org.eclipse.debug.core.model.ILineBreakpoint;
19+
import org.eclipse.jdt.debug.core.IJavaDebugTarget;
1920
import org.eclipse.jdt.debug.core.IJavaStackFrame;
2021
import org.eclipse.jdt.debug.core.IJavaThread;
2122
import org.eclipse.jdt.debug.testplugin.DebugElementKindEventWaiter;
@@ -57,88 +58,109 @@ public void testLotsOfMultilineArguments() throws Exception {
5758

5859
String typeName = "StatementStep";
5960
ILineBreakpoint bp = createLineBreakpoint(21, typeName);
61+
IJavaDebugTarget javaDebugTarget = null;
6062
IJavaThread t = null;
63+
boolean originalStepFilter = false;
6164
try {
6265
IJavaThread thread = launchToLineBreakpoint(typeName, bp, true);
6366
t = thread;
6467
IJavaStackFrame stackFrame = (IJavaStackFrame) thread.getTopStackFrame();
68+
javaDebugTarget = (IJavaDebugTarget) stackFrame.getDebugTarget();
69+
originalStepFilter = javaDebugTarget.isStepFiltersEnabled();
70+
71+
javaDebugTarget.setStepFiltersEnabled(true);
6572

6673
runAndWaitForSuspendEvent(() -> thread.stepOver());
67-
assertEquals("Should be at line 26", 26, stackFrame.getLineNumber());
74+
assertEquals("Suspended at wrong line", 26, stackFrame.getLineNumber());
6875

6976
runAndWaitForSuspendEvent(() -> thread.stepInto());
7077

7178
stackFrame = (IJavaStackFrame) thread.getTopStackFrame();
72-
assertEquals("Should be at line 36", 36, stackFrame.getLineNumber());
79+
assertEquals("Suspended at wrong line", 36, stackFrame.getLineNumber());
7380

7481
runAndWaitForSuspendEvent(() -> thread.stepReturn());
7582

7683
stackFrame = (IJavaStackFrame) thread.getTopStackFrame();
77-
assertEquals("Should be at line 22", 22, stackFrame.getLineNumber());
84+
assertEquals("Suspended at wrong line", 22, stackFrame.getLineNumber());
7885

7986
thread.stepOver();
8087
runAndWaitForSuspendEvent(() -> thread.stepOver());
8188

82-
assertEquals("Should be at line 28", 28, stackFrame.getLineNumber());
89+
assertEquals("Suspended at wrong line", 28, stackFrame.getLineNumber());
8390
} finally {
8491
terminateAndRemove(t);
8592
removeAllBreakpoints();
93+
javaDebugTarget.setStepFiltersEnabled(originalStepFilter);
8694
}
8795
}
8896

8997
public void testStepOverWithSingleMultilineArgument() throws Exception {
9098

9199
String typeName = "StatementStepArgument";
92100
ILineBreakpoint bp = createLineBreakpoint(28, typeName);
101+
IJavaDebugTarget javaDebugTarget = null;
93102
IJavaThread t = null;
103+
boolean originalStepFilter = false;
94104
try {
95105
IJavaThread thread = launchToLineBreakpoint(typeName, bp, true);
96106
t = thread;
97107
IJavaStackFrame stackFrame = (IJavaStackFrame) thread.getTopStackFrame();
108+
javaDebugTarget = (IJavaDebugTarget) stackFrame.getDebugTarget();
109+
originalStepFilter = javaDebugTarget.isStepFiltersEnabled();
110+
111+
javaDebugTarget.setStepFiltersEnabled(true);
98112
runAndWaitForSuspendEvent(() -> thread.stepOver());
99-
assertEquals("Should be at line 30", 30, stackFrame.getLineNumber());
113+
assertEquals("Suspended at wrong line", 30, stackFrame.getLineNumber());
100114

101115
runAndWaitForSuspendEvent(() -> thread.stepOver());
102-
assertEquals("Should be at line 34", 34, stackFrame.getLineNumber());
116+
assertEquals("Suspended at wrong line", 34, stackFrame.getLineNumber());
103117

104118
} finally {
105119
terminateAndRemove(t);
106120
removeAllBreakpoints();
121+
javaDebugTarget.setStepFiltersEnabled(originalStepFilter);
107122
}
108123
}
109124

110125
public void testStepOverWithNestedMultiLineArgs() throws Exception {
111126

112127
String typeName = "StatementStepNested";
113128
ILineBreakpoint bp = createLineBreakpoint(20, typeName);
129+
IJavaDebugTarget javaDebugTarget = null;
114130
IJavaThread t = null;
131+
boolean originalStepFilter = false;
115132
try {
116133
IJavaThread thread = launchToLineBreakpoint(typeName, bp, true);
117134
t = thread;
118135
IJavaStackFrame stackFrame = (IJavaStackFrame) thread.getTopStackFrame();
136+
javaDebugTarget = (IJavaDebugTarget) stackFrame.getDebugTarget();
137+
originalStepFilter = javaDebugTarget.isStepFiltersEnabled();
138+
139+
javaDebugTarget.setStepFiltersEnabled(true);
119140
runAndWaitForSuspendEvent(() -> thread.stepOver());
120-
assertEquals("Should be at line 27", 27, stackFrame.getLineNumber());
141+
assertEquals("Suspended at wrong line", 27, stackFrame.getLineNumber());
121142

122143
runAndWaitForSuspendEvent(() -> thread.stepInto());
123144
stackFrame = (IJavaStackFrame) thread.getTopStackFrame();
124-
assertEquals("Should be at line 38", 38, stackFrame.getLineNumber());
145+
assertEquals("Suspended at wrong line", 38, stackFrame.getLineNumber());
125146

126147
runAndWaitForSuspendEvent(() -> thread.stepReturn());
127148
stackFrame = (IJavaStackFrame) thread.getTopStackFrame();
128-
assertEquals("Should be at line 26", 26, stackFrame.getLineNumber());
149+
assertEquals("Suspended at wrong line", 26, stackFrame.getLineNumber());
129150

130151
runAndWaitForSuspendEvent(() -> thread.stepOver());
131-
assertEquals("Should be at line 24", 24, stackFrame.getLineNumber());
152+
assertEquals("Suspended at wrong line", 24, stackFrame.getLineNumber());
132153

133154
runAndWaitForSuspendEvent(() -> thread.stepOver());
134-
assertEquals("Should be at line 22", 22, stackFrame.getLineNumber());
155+
assertEquals("Suspended at wrong line", 22, stackFrame.getLineNumber());
135156

136157
runAndWaitForSuspendEvent(() -> thread.stepOver());
137-
assertEquals("Should be at line 34", 34, stackFrame.getLineNumber());
158+
assertEquals("Suspended at wrong line", 34, stackFrame.getLineNumber());
138159

139160
} finally {
140161
terminateAndRemove(t);
141162
removeAllBreakpoints();
163+
javaDebugTarget.setStepFiltersEnabled(originalStepFilter);
142164
}
143165
}
144166

org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/DebugUIMessages.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ JavaDebugPreferencePage_ShowStepResult_1=Show method result after a step operati
3737
JavaDebugPreferencePage_ShowStepResult_local=Enable for local launc&h types
3838
JavaDebugPreferencePage_ShowStepResult_remote=Enable for remote connections (may be e&ven slower)
3939
JavaDebugPreferencePage_ShowStepTimeout_ms_1=Don't show &if step operation takes longer than (ms):
40-
JavaDebugPreferencePage_StatementLevelStepping=Skip intermediate instructions while stepping
40+
JavaDebugPreferencePage_StatementLevelStepping=Filter intermediate instructions while stepping
4141
JavaDebugPreferencePage_Communication_1=Communication
4242
JavaDebugPreferencePage_Debugger__timeout__2=Debugger &timeout (ms):
4343
JavaDebugPreferencePage__Launch_timeout__ms___1=&Launch timeout (ms):

org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JDIDebugUIPreferenceInitializer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ public void initializeDefaultPreferences() {
3838
store.setDefault(IJDIPreferencesConstants.PREF_ALERT_UNABLE_TO_INSTALL_BREAKPOINT, true);
3939
store.setDefault(IJDIPreferencesConstants.PREF_PROMPT_BEFORE_MODIFYING_FINAL_FIELDS, true);
4040
store.setDefault(IJDIPreferencesConstants.PREF_PROMPT_DELETE_CONDITIONAL_BREAKPOINT, true);
41-
store.setDefault(IJDIPreferencesConstants.PREF_STATEMENT_LEVEL_STEPPING, false);
41+
store.setDefault(IJDIPreferencesConstants.PREF_STATEMENT_LEVEL_STEPPING, true);
4242

4343
store.setDefault(IJDIPreferencesConstants.PREF_SHOW_QUALIFIED_NAMES, false);
4444

org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaDebugPreferencePage.java

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*******************************************************************************
2-
* Copyright (c) 2000, 2026 IBM Corporation and others.
2+
* Copyright (c) 2000, 2018 IBM Corporation and others.
33
*
44
* This program and the accompanying materials
55
* are made available under the terms of the Eclipse Public License 2.0
@@ -102,7 +102,6 @@ protected void clearErrorMessage() {
102102
private Button fShowStepResultRemote;
103103
private Button fAdvancedSourcelookup;
104104
private Button fExceptionBreakpoint;
105-
private Button fStatementLevelStepping;
106105

107106
// Timeout preference widgets
108107
private JavaDebugIntegerFieldEditor fTimeoutText;
@@ -160,8 +159,6 @@ protected Control createContents(Composite parent) {
160159
fWatchpoint.setItems(new String[] {DebugUIMessages.JavaDebugPreferencePage_25, DebugUIMessages.JavaDebugPreferencePage_26, DebugUIMessages.JavaDebugPreferencePage_27});
161160
fWatchpoint.setFont(group.getFont());
162161

163-
fStatementLevelStepping = SWTFactory.createCheckButton(group, DebugUIMessages.JavaDebugPreferencePage_StatementLevelStepping, null, false, 2);
164-
165162
group = SWTFactory.createGroup(composite, DebugUIMessages.JavaDebugPreferencePage_Hot_Code_Replace_2, 1, 1, GridData.FILL_HORIZONTAL);
166163
fEnableHCRButton = SWTFactory.createCheckButton(group, DebugUIMessages.JavaDebugPreferencePage_Enable_hot_code_replace_1, null, true, 1);
167164
fAlertHCRButton = SWTFactory.createCheckButton(group, DebugUIMessages.JavaDebugPreferencePage_Alert_me_when_hot_code_replace_fails_1, null, false, 1);
@@ -232,12 +229,10 @@ public boolean performOk() {
232229
store.setValue(IJDIPreferencesConstants.PREF_ALERT_OBSOLETE_METHODS, fAlertObsoleteButton.getSelection());
233230
store.setValue(IJDIPreferencesConstants.PREF_SUSPEND_ON_UNCAUGHT_EXCEPTIONS, fSuspendButton.getSelection());
234231
store.setValue(IJDIPreferencesConstants.PREF_SUSPEND_ON_COMPILATION_ERRORS, fSuspendOnCompilationErrors.getSelection());
235-
store.setValue(IJDIPreferencesConstants.PREF_STATEMENT_LEVEL_STEPPING, fStatementLevelStepping.getSelection());
236232
store.setValue(IJDIPreferencesConstants.PREF_PROMPT_BEFORE_MODIFYING_FINAL_FIELDS, fPromptBeforeModifyingFinalFields.getSelection());
237233
store.setValue(IJDIPreferencesConstants.PREF_ALERT_UNABLE_TO_INSTALL_BREAKPOINT, fPromptUnableToInstallBreakpoint.getSelection());
238234
store.setValue(IJDIPreferencesConstants.PREF_PROMPT_DELETE_CONDITIONAL_BREAKPOINT, fPromptDeleteConditionalBreakpoint.getSelection());
239235
store.setValue(IJDIPreferencesConstants.PREF_OPEN_INSPECT_POPUP_ON_EXCEPTION, fOpenInspector.getSelection());
240-
241236
IEclipsePreferences prefs = InstanceScope.INSTANCE.getNode(JDIDebugPlugin.getUniqueIdentifier());
242237
if(prefs != null) {
243238
prefs.putBoolean(JDIDebugPlugin.PREF_ENABLE_HCR, fEnableHCRButton.getSelection());
@@ -285,7 +280,6 @@ protected void performDefaults() {
285280
IPreferenceStore store = getPreferenceStore();
286281
fSuspendButton.setSelection(store.getDefaultBoolean(IJDIPreferencesConstants.PREF_SUSPEND_ON_UNCAUGHT_EXCEPTIONS));
287282
fSuspendOnCompilationErrors.setSelection(store.getDefaultBoolean(IJDIPreferencesConstants.PREF_SUSPEND_ON_COMPILATION_ERRORS));
288-
fStatementLevelStepping.setSelection(store.getDefaultBoolean(IJDIPreferencesConstants.PREF_STATEMENT_LEVEL_STEPPING));
289283
fAlertHCRButton.setSelection(store.getDefaultBoolean(IJDIPreferencesConstants.PREF_ALERT_HCR_FAILED));
290284
fAlertHCRNotSupportedButton.setSelection(store.getDefaultBoolean(IJDIPreferencesConstants.PREF_ALERT_HCR_NOT_SUPPORTED));
291285
fAlertObsoleteButton.setSelection(store.getDefaultBoolean(IJDIPreferencesConstants.PREF_ALERT_OBSOLETE_METHODS));
@@ -335,7 +329,7 @@ private void setValues() {
335329
fPromptUnableToInstallBreakpoint.setSelection(store.getBoolean(IJDIPreferencesConstants.PREF_ALERT_UNABLE_TO_INSTALL_BREAKPOINT));
336330
fPromptDeleteConditionalBreakpoint.setSelection(store.getBoolean(IJDIPreferencesConstants.PREF_PROMPT_DELETE_CONDITIONAL_BREAKPOINT));
337331
fOpenInspector.setSelection(store.getBoolean(IJDIPreferencesConstants.PREF_OPEN_INSPECT_POPUP_ON_EXCEPTION));
338-
fStatementLevelStepping.setSelection(store.getBoolean(IJDIPreferencesConstants.PREF_STATEMENT_LEVEL_STEPPING));
332+
339333
IPreferencesService prefs = Platform.getPreferencesService();
340334

341335
String bundleId = JDIDebugPlugin.getUniqueIdentifier();

org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaStepFilterPreferencePage.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ public class JavaStepFilterPreferencePage extends PreferencePage implements IWor
5252
private Button fFilterSetterButton;
5353
private Button fFilterConstructorButton;
5454
private Button fStepThruButton;
55+
private Button statementLevelStepping;
5556

5657
/**
5758
* Constructor
@@ -134,13 +135,15 @@ protected void setPageEnablement(boolean enabled) {
134135
fFilterStaticButton.setEnabled(enabled);
135136
fFilterSyntheticButton.setEnabled(enabled);
136137
fStepFilterTable.setEnabled(enabled);
138+
statementLevelStepping.setEnabled(enabled);
137139
}
138140

139141
/**
140142
* create the checked preferences for the page
141143
* @param container the parent container
142144
*/
143145
private void createStepFilterCheckboxes(Composite container) {
146+
statementLevelStepping = SWTFactory.createCheckButton(container, DebugUIMessages.JavaDebugPreferencePage_StatementLevelStepping, null, getPreferenceStore().getBoolean(IJDIPreferencesConstants.PREF_STATEMENT_LEVEL_STEPPING), 2);
144147
fFilterSyntheticButton = SWTFactory.createCheckButton(container,
145148
DebugUIMessages.JavaStepFilterPreferencePage_Filter_s_ynthetic_methods__requires_VM_support__17,
146149
null, getPreferenceStore().getBoolean(IJDIPreferencesConstants.PREF_FILTER_SYNTHETICS), 2);
@@ -176,6 +179,7 @@ public boolean performOk() {
176179
store.setValue(IJDIPreferencesConstants.PREF_FILTER_SETTERS, fFilterSetterButton.getSelection());
177180
store.setValue(IJDIPreferencesConstants.PREF_FILTER_SYNTHETICS, fFilterSyntheticButton.getSelection());
178181
store.setValue(IJDIPreferencesConstants.PREF_STEP_THRU_FILTERS, fStepThruButton.getSelection());
182+
store.setValue(IJDIPreferencesConstants.PREF_STATEMENT_LEVEL_STEPPING, statementLevelStepping.getSelection());
179183
return super.performOk();
180184
}
181185

@@ -193,7 +197,7 @@ protected void performDefaults() {
193197
fFilterGetterButton.setSelection(getPreferenceStore().getDefaultBoolean(IJDIPreferencesConstants.PREF_FILTER_GETTERS));
194198
fFilterSetterButton.setSelection(getPreferenceStore().getDefaultBoolean(IJDIPreferencesConstants.PREF_FILTER_SETTERS));
195199
fStepThruButton.setSelection(getPreferenceStore().getDefaultBoolean(IJDIPreferencesConstants.PREF_STEP_THRU_FILTERS));
196-
200+
statementLevelStepping.setSelection(getPreferenceStore().getDefaultBoolean(IJDIPreferencesConstants.PREF_STATEMENT_LEVEL_STEPPING));
197201
fStepFilterTable.performDefaults();
198202
super.performDefaults();
199203
}

org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIDebugTarget.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3281,7 +3281,7 @@ public void setStatementOnlyStepping(boolean set) {
32813281

32823282
@Override
32833283
public boolean isStatementOnlyStepping() {
3284-
return fIsStatementOnlyStepping;
3284+
return fIsStatementOnlyStepping && isStepFiltersEnabled();
32853285
}
32863286

32873287
}

org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIThread.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -326,6 +326,9 @@ public class JDIThread extends JDIDebugElement implements IJavaThread {
326326

327327
/**
328328
* Range of simple load and constant push byte code instructions
329+
* <p>
330+
* See https://javaalmanac.io/bytecode/opcodes/ for the complete list of JVM opcodes
331+
* </p>
329332
*/
330333
private static final int INTERMEDIATE_OPCODE_START = 1;
331334
private static final int INTERMEDIATE_OPCODE_END = 53;
@@ -3144,7 +3147,7 @@ private boolean skipImmediateInstructionsOnStepping(Location toBeStepped) throws
31443147
return false;
31453148
}
31463149
int diff = nxtIndx - currIndx;
3147-
// TODO: explain condition below
3150+
// Bytecode distance to next location; small values (1–3) indicate, intermediate instructions within the same statement
31483151
if (diff >= 1 && diff <= 3) {
31493152
return true;
31503153
}

0 commit comments

Comments
 (0)