Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -229,6 +229,10 @@ public LocalVariableNode initInvokeReturnVariableNode(String name, Type type) {
return variableNode;
}

public LocalVariableNode initLineStackVariableNode(String name, Type type) {
return this.addInterceptorLocalVariable(this.innerVariablePrefix + name, type.getDescriptor());
}

public TryCatchBlock initTryCatchBlock() {
return initTryCatchBlock(THROWABLE_TYPE.getInternalName());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,14 @@
import java.util.List;

import com.alibaba.bytekit.utils.MatchUtils;
import com.alibaba.deps.org.objectweb.asm.tree.analysis.BasicValue;
import com.alibaba.deps.org.objectweb.asm.tree.analysis.Frame;
import com.alibaba.deps.org.objectweb.asm.Type;
import com.alibaba.deps.org.objectweb.asm.tree.AbstractInsnNode;
import com.alibaba.deps.org.objectweb.asm.tree.InsnList;
import com.alibaba.deps.org.objectweb.asm.tree.LocalVariableNode;
import com.alibaba.bytekit.utils.AsmOpUtils;
import com.alibaba.bytekit.asm.location.Location.LineLocation;

public class LocalVarNamesBinding extends Binding {

Expand All @@ -31,7 +34,9 @@ public LocalVarNamesBinding() {
public void pushOntoStack(InsnList instructions, BindingContext bindingContext) {
AbstractInsnNode currentInsnNode = bindingContext.getLocation().getInsnNode();

List<LocalVariableNode> localVariables = new LinkedList<LocalVariableNode>(bindingContext.getMethodProcessor().getMethodNode().localVariables);
List<LocalVariableNode> rawLocalVariables = bindingContext.getMethodProcessor().getMethodNode().localVariables;
List<LocalVariableNode> localVariables = rawLocalVariables == null ? new LinkedList<LocalVariableNode>()
: new LinkedList<LocalVariableNode>(rawLocalVariables);
if (excludePattern != null && !excludePattern.isEmpty()){
Iterator<LocalVariableNode> it = localVariables.iterator();
while(it.hasNext()){
Expand All @@ -45,7 +50,8 @@ public void pushOntoStack(InsnList instructions, BindingContext bindingContext)
}
}

List<LocalVariableNode> results = AsmOpUtils.validVariables(localVariables, currentInsnNode);
List<LocalVariableNode> results = AsmOpUtils.validVariables(localVariables, currentInsnNode,
currentFrame(bindingContext));

AsmOpUtils.push(instructions, results.size());
AsmOpUtils.newArray(instructions, AsmOpUtils.STRING_TYPE);
Expand All @@ -72,4 +78,11 @@ public String getExcludePattern() {
public void setExcludePattern(String excludePattern) {
this.excludePattern = excludePattern;
}

private Frame<BasicValue> currentFrame(BindingContext bindingContext) {
if (bindingContext.getLocation() instanceof LineLocation) {
return ((LineLocation) bindingContext.getLocation()).getFrame();
}
return null;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,14 @@
import java.util.List;

import com.alibaba.bytekit.utils.MatchUtils;
import com.alibaba.deps.org.objectweb.asm.tree.analysis.BasicValue;
import com.alibaba.deps.org.objectweb.asm.tree.analysis.Frame;
import com.alibaba.deps.org.objectweb.asm.Type;
import com.alibaba.deps.org.objectweb.asm.tree.AbstractInsnNode;
import com.alibaba.deps.org.objectweb.asm.tree.InsnList;
import com.alibaba.deps.org.objectweb.asm.tree.LocalVariableNode;
import com.alibaba.bytekit.utils.AsmOpUtils;
import com.alibaba.bytekit.asm.location.Location.LineLocation;

/**
* TODO 增加一个配置,是否包含 method args
Expand All @@ -34,7 +37,9 @@ public void pushOntoStack(InsnList instructions, BindingContext bindingContext)

AbstractInsnNode currentInsnNode = bindingContext.getLocation().getInsnNode();

List<LocalVariableNode> localVariables = new LinkedList<LocalVariableNode>(bindingContext.getMethodProcessor().getMethodNode().localVariables);
List<LocalVariableNode> rawLocalVariables = bindingContext.getMethodProcessor().getMethodNode().localVariables;
List<LocalVariableNode> localVariables = rawLocalVariables == null ? new LinkedList<LocalVariableNode>()
: new LinkedList<LocalVariableNode>(rawLocalVariables);
if (excludePattern != null && !excludePattern.isEmpty()){
Iterator<LocalVariableNode> it = localVariables.iterator();
while(it.hasNext()){
Expand All @@ -48,7 +53,8 @@ public void pushOntoStack(InsnList instructions, BindingContext bindingContext)
}
}

List<LocalVariableNode> results = AsmOpUtils.validVariables(localVariables, currentInsnNode);
List<LocalVariableNode> results = AsmOpUtils.validVariables(localVariables, currentInsnNode,
currentFrame(bindingContext));

AsmOpUtils.push(instructions, results.size());
AsmOpUtils.newArray(instructions, AsmOpUtils.OBJECT_TYPE);
Expand Down Expand Up @@ -79,4 +85,11 @@ public String getExcludePattern() {
public void setExcludePattern(String excludePattern) {
this.excludePattern = excludePattern;
}

private Frame<BasicValue> currentFrame(BindingContext bindingContext) {
if (bindingContext.getLocation() instanceof LineLocation) {
return ((LineLocation) bindingContext.getLocation()).getFrame();
}
return null;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,9 @@
import com.alibaba.bytekit.asm.interceptor.InterceptorProcessor;
import com.alibaba.bytekit.asm.interceptor.annotation.AtLine.LineInterceptorProcessorParser;
import com.alibaba.bytekit.asm.interceptor.parser.InterceptorProcessorParser;
import com.alibaba.bytekit.asm.location.LineDuplicatePolicy;
import com.alibaba.bytekit.asm.location.LineLocationMatcher;
import com.alibaba.bytekit.asm.location.LineMode;
import com.alibaba.bytekit.asm.location.LocationMatcher;

@Documented
Expand All @@ -26,14 +28,19 @@

int[] lines();

LineMode mode() default LineMode.FRAME_AWARE;

LineDuplicatePolicy duplicatePolicy() default LineDuplicatePolicy.DEFAULT;
Comment on lines +31 to +33

class LineInterceptorProcessorParser implements InterceptorProcessorParser {

@Override
public InterceptorProcessor parse(Method method, Annotation annotationOnMethod) {

AtLine atLine = (AtLine) annotationOnMethod;

LocationMatcher locationMatcher = new LineLocationMatcher(atLine.lines());
LocationMatcher locationMatcher = new LineLocationMatcher(atLine.mode(), atLine.duplicatePolicy(),
atLine.lines());

return InterceptorParserUtils.createInterceptorProcessor(method,
locationMatcher,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.alibaba.bytekit.asm.location;

public enum LineDuplicatePolicy {
DEFAULT,
FIRST,
ALL,
REJECT_AFTER_CONTROL_FLOW,
FIRST_PER_LINE_BLOCK
}
Loading
Loading