Skip to content

Commit 8216dd2

Browse files
author
jbachorik
committed
Allowing special parameters (@self, @return etc.) for @OnProbe handlers
1 parent 3ad6455 commit 8216dd2

10 files changed

Lines changed: 264 additions & 182 deletions

File tree

‎make/build.xml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<property name="maven-staging-repository-id" value="sonatype-nexus-staging" />
77
<property name="maven-staging-repository-url" value="https://oss.sonatype.org/service/local/staging/deploy/maven2" />
88

9-
<property name="agent.excludes" value="**/dtrace/* **/btrace/*.class **/asm/signature/** **/asm/tree/** **/asm/util/** **/asm/xml/** **/aggregation/* **/annotations/* **/compiler/* **/client/* **/comm/* com/sun/btrace/api/**/* com/sun/btrace/spi/**/* **/instr/** **/META-INF/*"/>
9+
<property name="agent.excludes" value="**/dtrace/* **/btrace/*.class **/asm/signature/** **/asm/tree/** **/asm/util/** **/asm/xml/** **/aggregation/* **/compiler/* **/client/* **/comm/* com/sun/btrace/api/**/* com/sun/btrace/spi/**/* **/instr/** **/META-INF/*"/>
1010
<property name="boot.excludes" value="**/dtrace/* **/agent/* **/compiler/* **/client/* **/resources/* **/runtime/* **/util/**/* **/asm/** com/sun/btrace/api/**/* com/sun/btrace/spi/**/*"/>
1111
<property name="client.excludes" value="**/runtime/* **/agent/* **/util/TimeStamp* **/util/MethodId **/util/SamplingSupport **/util/templates/**/* **/instr/** **/META-INF/*"/>
1212

‎src/share/classes/com/sun/btrace/agent/Client.java‎

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@
3939
import com.sun.btrace.comm.OkayCommand;
4040
import com.sun.btrace.comm.RenameCommand;
4141
import com.sun.btrace.PerfReader;
42+
import com.sun.btrace.annotations.Kind;
43+
import com.sun.btrace.annotations.Where;
4244
import com.sun.btrace.comm.RetransformClassNotification;
4345
import com.sun.btrace.comm.RetransformationStartNotification;
4446
import com.sun.btrace.org.objectweb.asm.Opcodes;
@@ -47,6 +49,7 @@
4749
import com.sun.btrace.runtime.ClinitInjector;
4850
import com.sun.btrace.runtime.Instrumentor;
4951
import com.sun.btrace.runtime.InstrumentUtils;
52+
import com.sun.btrace.runtime.Location;
5053
import com.sun.btrace.runtime.MethodRemover;
5154
import com.sun.btrace.runtime.NullPerfReaderImpl;
5255
import com.sun.btrace.runtime.Preprocessor;
@@ -413,13 +416,50 @@ private void verify(byte[] buf) {
413416
onMethods.addAll(Main.mapOnProbes(onProbes));
414417
}
415418
for(OnMethod om : onMethods) {
419+
verifySpecialParameters(om);
416420
if (om.getClazz().startsWith("+")) {
417421
hasSubclassChecks = true;
418422
break;
419423
}
420424
}
421425
}
422426

427+
private void verifySpecialParameters(OnMethod om) {
428+
Location loc = om.getLocation();
429+
if (om.getReturnParameter() != -1) {
430+
if (!(loc.getValue() == Kind.RETURN ||
431+
(loc.getValue() == Kind.CALL && loc.getWhere() == Where.AFTER) ||
432+
(loc.getValue() == Kind.ARRAY_GET && loc.getWhere() == Where.AFTER) ||
433+
(loc.getValue() == Kind.FIELD_GET && loc.getWhere() == Where.AFTER) ||
434+
(loc.getValue() == Kind.NEW && loc.getWhere() == Where.AFTER) ||
435+
(loc.getValue() == Kind.NEWARRAY && loc.getWhere() == Where.AFTER))) {
436+
Verifier.reportError("return.desc.invalid", om.getTargetName() + om.getTargetDescriptor() + "(" + om.getReturnParameter() + ")");;
437+
}
438+
}
439+
if (om.getTargetMethodOrFieldParameter() != -1) {
440+
if (!(loc.getValue() == Kind.CALL ||
441+
loc.getValue() == Kind.FIELD_GET ||
442+
loc.getValue() == Kind.FIELD_SET)) {
443+
Verifier.reportError("called-method.desc.invalid", om.getTargetName() + om.getTargetDescriptor() + "(" + om.getTargetMethodOrFieldParameter() + ")");
444+
}
445+
}
446+
if (om.getTargetInstanceParameter() != -1) {
447+
if (!(loc.getValue() == Kind.CALL ||
448+
loc.getValue() == Kind.FIELD_GET ||
449+
loc.getValue() == Kind.FIELD_SET)) {
450+
Verifier.reportError("called-instance.desc.invalid", om.getTargetName() + om.getTargetDescriptor() + "(" + om.getTargetInstanceParameter() + ")");
451+
}
452+
}
453+
if (om.getDurationParameter() != -1) {
454+
if (!(loc.getValue() == Kind.RETURN ||
455+
loc.getValue() == Kind.ERROR) ||
456+
(loc.getValue() == Kind.CALL &&
457+
loc.getWhere() == Where.AFTER)) {
458+
Verifier.reportError("duration.desc.invalid", om.getTargetName() + om.getTargetDescriptor() + "(" + om.getDurationParameter() + ")");
459+
}
460+
}
461+
}
462+
423463
private static byte[] removeMethods(byte[] buf) {
424464
ClassWriter writer = InstrumentUtils.newClassWriter(buf);
425465
ClassReader reader = new ClassReader(buf);

‎src/share/classes/com/sun/btrace/agent/Main.java‎

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -534,6 +534,15 @@ static List<OnMethod> mapOnProbes(List<OnProbe> onProbes) {
534534
omn.copyFrom(om);
535535
omn.setTargetName(op.getTargetName());
536536
omn.setTargetDescriptor(op.getTargetDescriptor());
537+
omn.setClassNameParameter(op.getClassNameParameter());
538+
omn.setMethodParameter(op.getMethodParameter());
539+
omn.setDurationParameter(op.getDurationParameter());
540+
om.setMethodFqn(op.isMethodFqn());
541+
om.setReturnParameter(op.getReturnParameter());
542+
om.setSelfParameter(op.getSelfParameter());
543+
om.setTargetInstanceParameter(op.getTargetInstanceParameter());
544+
om.setTargetMethodOrFieldFqn(op.isTargetMethodOrFieldFqn());
545+
om.setTargetMethodOrFieldParameter(op.getTargetMethodOrFieldParameter());
537546
res.add(omn);
538547
}
539548
}

‎src/share/classes/com/sun/btrace/agent/ProbeDescriptorLoader.java‎

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ static void init(String probeDescPath) {
5959
probeDescMap = Collections.synchronizedMap(
6060
new HashMap<String, ProbeDescriptor>());
6161
}
62-
62+
6363
static synchronized ProbeDescriptor load(String namespace) {
6464
// check in the cache
6565
ProbeDescriptor res = probeDescMap.get(namespace);
@@ -79,7 +79,7 @@ static synchronized ProbeDescriptor load(String namespace) {
7979
}
8080
return pd;
8181
}
82-
}
82+
}
8383

8484
// unmarshell BTrace probe descriptor from XML
8585
private static ProbeDescriptor load(File file) {
@@ -88,7 +88,9 @@ private static ProbeDescriptor load(File file) {
8888
if (Main.isDebug()) Main.debugPrint("reading " + file);
8989
Unmarshaller u = jc.createUnmarshaller();
9090
u.setEventHandler(new DefaultValidationEventHandler());
91-
return (ProbeDescriptor)u.unmarshal(file);
91+
ProbeDescriptor pd = (ProbeDescriptor)u.unmarshal(file);
92+
pd.setProbes(pd.getProbes());
93+
return pd;
9294
} catch (JAXBException exp) {
9395
if (Main.isDebug()) Main.debugPrint(exp);
9496
return null;

‎src/share/classes/com/sun/btrace/runtime/BTraceConfigurator.java‎

Lines changed: 42 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
*/
4848
final public class BTraceConfigurator extends MethodVisitor {
4949
private OnMethod om = null;
50+
private OnProbe op = null;
5051

5152
private boolean sampled = false;
5253

@@ -162,7 +163,7 @@ public void visitEnd() {
162163
}
163164
};
164165
} else if (desc.equals(ONPROBE_DESC)) {
165-
final OnProbe op = new OnProbe();
166+
op = new OnProbe();
166167
onProbes.add(op);
167168
op.setTargetName(methodName);
168169
op.setTargetDescriptor(methodDesc);
@@ -234,64 +235,52 @@ public AnnotationVisitor visitParameterAnnotation(int parameter, final String de
234235
AnnotationVisitor av = super.visitParameterAnnotation(parameter, desc, visible);
235236

236237
if (om != null) {
237-
if (desc.equals(BTRACE_SELF_DESC)) {
238-
om.setSelfParameter(parameter);
239-
} else if (desc.equals(Verifier.BTRACE_PROBECLASSNAME_DESC)) {
240-
om.setClassNameParameter(parameter);
241-
} else if (desc.equals(Verifier.BTRACE_PROBEMETHODNAME_DESC)) {
242-
om.setMethodParameter(parameter);
243-
av = new AnnotationVisitor(Opcodes.ASM5, av) {
244-
@Override
245-
public void visit(String name, Object val) {
246-
if (name.equals("fqn")) {
247-
om.setMethodFqn((Boolean)val);
248-
}
249-
super.visit(name, val);
250-
}
238+
av = setSpecialParameters(om, desc, parameter, av);
239+
} else if (op != null) {
240+
av = setSpecialParameters(op, desc, parameter, av);
241+
}
251242

252-
};
253-
} else if (desc.equals(BTRACE_RETURN_DESC)) {
254-
if (loc.getValue() == Kind.RETURN ||
255-
(loc.getValue() == Kind.CALL && loc.getWhere() == Where.AFTER) ||
256-
(loc.getValue() == Kind.ARRAY_GET && loc.getWhere() == Where.AFTER) ||
257-
(loc.getValue() == Kind.FIELD_GET && loc.getWhere() == Where.AFTER) ||
258-
(loc.getValue() == Kind.NEW && loc.getWhere() == Where.AFTER) ||
259-
(loc.getValue() == Kind.NEWARRAY && loc.getWhere() == Where.AFTER)) {
260-
om.setReturnParameter(parameter);
243+
return av;
244+
}
245+
246+
private AnnotationVisitor setSpecialParameters(final SpecialParameterHolder ph, final String desc, int parameter, AnnotationVisitor av) {
247+
// for OnProbe the 'loc' variable will be null; we will need to verfiy the placement later on
248+
if (desc.equals(BTRACE_SELF_DESC)) {
249+
ph.setSelfParameter(parameter);
250+
} else if (desc.equals(Verifier.BTRACE_PROBECLASSNAME_DESC)) {
251+
ph.setClassNameParameter(parameter);
252+
} else if (desc.equals(Verifier.BTRACE_PROBEMETHODNAME_DESC)) {
253+
ph.setMethodParameter(parameter);
254+
av = new AnnotationVisitor(Opcodes.ASM5, av) {
255+
@Override
256+
public void visit(String name, Object val) {
257+
if (name.equals("fqn")) {
258+
ph.setMethodFqn((Boolean)val);
259+
}
260+
super.visit(name, val);
261261
}
262-
} else if (desc.equals(BTRACE_TARGETMETHOD_DESC)) {
263-
if (loc.getValue() == Kind.CALL ||
264-
loc.getValue() == Kind.FIELD_GET ||
265-
loc.getValue() == Kind.FIELD_SET) {
266-
om.setTargetMethodOrFieldParameter(parameter);
267262

268-
av = new AnnotationVisitor(Opcodes.ASM5, av) {
269-
@Override
270-
public void visit(String name, Object val) {
271-
if (name.equals("fqn")) {
272-
om.setTargetMethodOrFieldFqn((Boolean)val);
273-
}
274-
super.visit(name, val);
275-
}
263+
};
264+
} else if (desc.equals(BTRACE_RETURN_DESC)) {
265+
ph.setReturnParameter(parameter);
266+
} else if (desc.equals(BTRACE_TARGETMETHOD_DESC)) {
267+
ph.setTargetMethodOrFieldParameter(parameter);
276268

277-
};
278-
}
279-
} else if (desc.equals(BTRACE_TARGETINSTANCE_DESC)) {
280-
if (loc.getValue() == Kind.CALL ||
281-
loc.getValue() == Kind.FIELD_GET ||
282-
loc.getValue() == Kind.FIELD_SET) {
283-
om.setTargetInstanceParameter(parameter);
284-
}
285-
} else if (desc.equals(BTRACE_DURATION_DESC)) {
286-
if ((loc.getValue() == Kind.RETURN ||
287-
loc.getValue() == Kind.ERROR) ||
288-
(loc.getValue() == Kind.CALL &&
289-
loc.getWhere() == Where.AFTER)) {
290-
om.setDurationParameter(parameter);
269+
av = new AnnotationVisitor(Opcodes.ASM5, av) {
270+
@Override
271+
public void visit(String name, Object val) {
272+
if (name.equals("fqn")) {
273+
ph.setTargetMethodOrFieldFqn((Boolean)val);
274+
}
275+
super.visit(name, val);
291276
}
292-
}
293-
}
294277

278+
};
279+
} else if (desc.equals(BTRACE_TARGETINSTANCE_DESC)) {
280+
ph.setTargetInstanceParameter(parameter);
281+
} else if (desc.equals(BTRACE_DURATION_DESC)) {
282+
ph.setDurationParameter(parameter);
283+
}
295284
return av;
296285
}
297286

‎src/share/classes/com/sun/btrace/runtime/MethodVerifier.java‎

Lines changed: 1 addition & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -113,28 +113,6 @@ public AnnotationVisitor visitAnnotation(String desc,
113113
return av;
114114
}
115115

116-
@Override
117-
public AnnotationVisitor visitParameterAnnotation(int parameter, final String desc, boolean visible) {
118-
AnnotationVisitor av = super.visitParameterAnnotation(parameter, desc, visible);
119-
120-
if (cfg.getOnMethod() != null) {
121-
if (desc.equals(BTRACE_RETURN_DESC) && cfg.getOnMethod().getReturnParameter() == -1) {
122-
reportError("return.desc.invalid", methodName + methodDesc + "(" + parameter + ")");
123-
}
124-
if (desc.equals(BTRACE_TARGETMETHOD_DESC) && cfg.getOnMethod().getTargetMethodOrFieldParameter() == -1) {
125-
reportError("called-method.desc.invalid", methodName + methodDesc + "(" + parameter + ")");
126-
}
127-
if (desc.equals(BTRACE_TARGETINSTANCE_DESC) && cfg.getOnMethod().getTargetInstanceParameter() == -1) {
128-
reportError("called-instance.desc.invalid", methodName + methodDesc + "(" + parameter + ")");
129-
}
130-
if (desc.equals(BTRACE_DURATION_DESC) && cfg.getOnMethod().getDurationParameter() == -1) {
131-
reportError("duration.desc.invalid", methodName + methodDesc + "(" + parameter + ")");
132-
}
133-
}
134-
135-
return av;
136-
}
137-
138116
@Override
139117
public void visitEnd() {
140118
if (asBTrace) { // only btrace handlers are enforced to be public
@@ -313,7 +291,7 @@ private void reportError(String err) {
313291
}
314292

315293
private void reportError(String err, String msg) {
316-
verifier.reportError(err, msg);
294+
verifier.reportSafetyError(err, msg);
317295
}
318296

319297
private static boolean isPrimitiveWrapper(String type) {

‎src/share/classes/com/sun/btrace/runtime/OnMethod.java‎

Lines changed: 2 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
*
3939
* @author A. Sundararajan
4040
*/
41-
public class OnMethod {
41+
public class OnMethod extends SpecialParameterHolder {
4242
private String clazz;
4343
private String method = "";
4444
private String type = "";
@@ -48,22 +48,14 @@ public class OnMethod {
4848
// target method descriptor on which this annotation is specified
4949
private String targetDescriptor;
5050

51-
private int selfParameter = -1;
52-
private int methodParameter = -1;
53-
private int classNameParameter = -1;
54-
private int returnParameter = -1;
55-
private int targetMethodOrFieldParameter = -1;
56-
private int targetInstanceParameter = -1;
57-
private int durationParameter = -1;
5851
private int samplerMean = 0;
5952
private Sampled.Sampler samplerKind = Sampled.Sampler.None;
60-
private boolean methodFqn = false;
61-
private boolean targetMethodFqn = false;
6253

6354
public OnMethod() {
6455
}
6556

6657
public void copyFrom(OnMethod other) {
58+
super.copyFrom(other);
6759
setClazz(other.getClazz());
6860
setMethod(other.getMethod());
6961
setType(other.getType());
@@ -118,78 +110,6 @@ public void setTargetDescriptor(String desc) {
118110
this.targetDescriptor = desc;
119111
}
120112

121-
public int getSelfParameter() {
122-
return selfParameter;
123-
}
124-
125-
public void setSelfParameter(int selfParameter) {
126-
this.selfParameter = selfParameter;
127-
}
128-
129-
public int getClassNameParameter() {
130-
return classNameParameter;
131-
}
132-
133-
public void setClassNameParameter(int classNameParameter) {
134-
this.classNameParameter = classNameParameter;
135-
}
136-
137-
public int getMethodParameter() {
138-
return methodParameter;
139-
}
140-
141-
public void setMethodParameter(int methodParameter) {
142-
this.methodParameter = methodParameter;
143-
}
144-
145-
public boolean isMethodFqn() {
146-
return methodFqn;
147-
}
148-
149-
public void setMethodFqn(boolean val) {
150-
methodFqn = val;
151-
}
152-
153-
public boolean isTargetMethodOrFieldFqn() {
154-
return targetMethodFqn;
155-
}
156-
157-
public void setTargetMethodOrFieldFqn(boolean val) {
158-
targetMethodFqn = val;
159-
}
160-
161-
public int getReturnParameter() {
162-
return returnParameter;
163-
}
164-
165-
public void setReturnParameter(int returnParameter) {
166-
this.returnParameter = returnParameter;
167-
}
168-
169-
public int getTargetMethodOrFieldParameter() {
170-
return targetMethodOrFieldParameter;
171-
}
172-
173-
public void setTargetMethodOrFieldParameter(int calledMethodParameter) {
174-
this.targetMethodOrFieldParameter = calledMethodParameter;
175-
}
176-
177-
public int getTargetInstanceParameter() {
178-
return targetInstanceParameter;
179-
}
180-
181-
public void setTargetInstanceParameter(int calledInstanceParameter) {
182-
this.targetInstanceParameter = calledInstanceParameter;
183-
}
184-
185-
public int getDurationParameter() {
186-
return durationParameter;
187-
}
188-
189-
public void setDurationParameter(int durationParameter) {
190-
this.durationParameter = durationParameter;
191-
}
192-
193113
public void setSamplerKind(Sampled.Sampler kind) {
194114
this.samplerKind = kind;
195115
}

0 commit comments

Comments
 (0)