aboutsummaryrefslogtreecommitdiffstats
path: root/src/main/javassist/compiler
diff options
context:
space:
mode:
authorchiba <chiba@30ef5769-5b8d-40dd-aea6-55b5d6557bb3>2003-10-10 06:15:50 +0000
committerchiba <chiba@30ef5769-5b8d-40dd-aea6-55b5d6557bb3>2003-10-10 06:15:50 +0000
commit2799b5c40f6b336ef8bc1b44295a4996dfb2e723 (patch)
tree134bac41e8509ba795c66494c38069785b73c87b /src/main/javassist/compiler
parentff4f2c43c1fbba039e4c905a56f5706ed7cc4724 (diff)
downloadjavassist-2799b5c40f6b336ef8bc1b44295a4996dfb2e723.tar.gz
javassist-2799b5c40f6b336ef8bc1b44295a4996dfb2e723.zip
made javassist.expr.MethodCall#replace correctly work
with super's method calls. git-svn-id: http://anonsvn.jboss.org/repos/javassist/trunk@53 30ef5769-5b8d-40dd-aea6-55b5d6557bb3
Diffstat (limited to 'src/main/javassist/compiler')
-rw-r--r--src/main/javassist/compiler/Javac.java33
-rw-r--r--src/main/javassist/compiler/JvstCodeGen.java22
-rw-r--r--src/main/javassist/compiler/MemberCodeGen.java7
3 files changed, 55 insertions, 7 deletions
diff --git a/src/main/javassist/compiler/Javac.java b/src/main/javassist/compiler/Javac.java
index e0bf3428..44c3ff11 100644
--- a/src/main/javassist/compiler/Javac.java
+++ b/src/main/javassist/compiler/Javac.java
@@ -384,6 +384,39 @@ public class Javac {
}
/**
+ * Prepares to use $proceed() representing a private/super's method.
+ * If the return type of $proceed() is void, null is pushed on the
+ * stack. This method is for methods invoked by INVOKESPECIAL.
+ *
+ * @param target an expression specifying the target object.
+ * if null, "this" is the target.
+ * @param classname the class name declaring the method.
+ * @param methodname the method name.
+ * @param descriptor the method descriptor.
+ */
+ public void recordSpecialProceed(String target, String classname,
+ String methodname, String descriptor)
+ throws CompileError
+ {
+ Parser p = new Parser(new Lex(target));
+ final ASTree texpr = p.parseExpression(stable);
+ final String cname = classname;
+ final String method = methodname;
+ final String desc = descriptor;
+
+ ProceedHandler h = new ProceedHandler() {
+ public void doit(JvstCodeGen gen, Bytecode b, ASTList args)
+ throws CompileError
+ {
+ gen.compileInvokeSpecial(texpr,
+ cname, method, desc, args);
+ }
+ };
+
+ gen.setProceedHandler(h, proceedName);
+ }
+
+ /**
* Prepares to use $proceed().
*/
public void recordProceed(ProceedHandler h) {
diff --git a/src/main/javassist/compiler/JvstCodeGen.java b/src/main/javassist/compiler/JvstCodeGen.java
index 40d39a11..5081ea1e 100644
--- a/src/main/javassist/compiler/JvstCodeGen.java
+++ b/src/main/javassist/compiler/JvstCodeGen.java
@@ -306,15 +306,15 @@ public class JvstCodeGen extends MemberCodeGen {
}
/*
- public int atMethodArgsLength(ASTList args) {
+ public int getMethodArgsLength(ASTList args) {
if (!isParamListName(args))
- return super.atMethodArgsLength(args);
+ return super.getMethodArgsLength(args);
return paramTypeList.length;
}
*/
- public int atMethodArgsLength(ASTList args) {
+ public int getMethodArgsLength(ASTList args) {
String pname = paramListName;
int n = 0;
while (args != null) {
@@ -391,6 +391,22 @@ public class JvstCodeGen extends MemberCodeGen {
}
*/
+ /* called by Javac#recordSpecialProceed().
+ */
+ void compileInvokeSpecial(ASTree target, String classname,
+ String methodname, String descriptor,
+ ASTList args)
+ throws CompileError
+ {
+ target.accept(this);
+ int nargs = getMethodArgsLength(args);
+ atMethodArgs(args, new int[nargs], new int[nargs],
+ new String[nargs]);
+ bytecode.addInvokespecial(classname, methodname, descriptor);
+ setReturnType(descriptor, false, false);
+ addNullIfVoid();
+ }
+
/*
* Makes it valid to write "return <expr>;" for a void method.
*/
diff --git a/src/main/javassist/compiler/MemberCodeGen.java b/src/main/javassist/compiler/MemberCodeGen.java
index c97855f3..92e299f0 100644
--- a/src/main/javassist/compiler/MemberCodeGen.java
+++ b/src/main/javassist/compiler/MemberCodeGen.java
@@ -315,7 +315,7 @@ public class MemberCodeGen extends CodeGen {
int aload0pos)
throws CompileError
{
- int nargs = atMethodArgsLength(args);
+ int nargs = getMethodArgsLength(args);
int[] types = new int[nargs];
int[] dims = new int[nargs];
String[] cnames = new String[nargs];
@@ -386,7 +386,7 @@ public class MemberCodeGen extends CodeGen {
setReturnType(desc, isStatic, popTarget);
}
- public int atMethodArgsLength(ASTList args) {
+ public int getMethodArgsLength(ASTList args) {
return ASTList.length(args);
}
@@ -404,8 +404,7 @@ public class MemberCodeGen extends CodeGen {
}
}
- private void setReturnType(String desc, boolean isStatic,
- boolean popTarget)
+ void setReturnType(String desc, boolean isStatic, boolean popTarget)
throws CompileError
{
int i = desc.indexOf(')');