gen.setProceedHandler(h, proceedName);
}
+ /**
+ * Prepares to use $proceed() representing a static method.
+ * If the return type of $proceed() is void, null is pushed on the
+ * stack.
+ *
+ * @param targetClass the fully-qualified dot-separated name
+ * of the class declaring the method.
+ * @param method the method name.
+ */
+ public void recordStaticProceed(String targetClass, String method)
+ throws CompileError
+ {
+ final String c = targetClass;
+ final String m = method;
+
+ ProceedHandler h = new ProceedHandler() {
+ public void doit(JvstCodeGen gen, Bytecode b, ASTList args)
+ throws CompileError
+ {
+ Expr expr = Expr.make(TokenId.MEMBER,
+ new Symbol(c), new Member(m));
+ expr = Expr.make(TokenId.CALL, expr, args);
+ expr.accept(gen);
+ gen.addNullIfVoid();
+ }
+ };
+
+ gen.setProceedHandler(h, proceedName);
+ }
+
/**
* Prepares to use $proceed().
*/
decl.setLocalVar(var);
- CtClass type = lookupClass(decl.getClassName());
+ CtClass type = lookupJvmClass(decl.getClassName());
decl.setClassName(javaToJvmName(type.getName()));
bytecode.addExceptionHandler(start, end, bytecode.currentPc(),
type);
mname = ((Symbol)e.oprand2()).get();
int op = e.getOperator();
if (op == MEMBER) { // static method
- targetClass = lookupClass((ASTList)e.oprand1());
+ targetClass = lookupJavaClass(((Symbol)e.oprand1()).get());
isStatic = true;
}
else if (op == '.') {
}
if (arrayDim > 0)
- targetClass = lookupClass2(javaLangObject);
+ targetClass = lookupJavaClass(javaLangObject);
else if (exprType == CLASS /* && arrayDim == 0 */)
- targetClass = lookupClass(className);
+ targetClass = lookupJvmClass(className);
else
badMethod();
}
String cname = desc.substring(i, j);
if (!cname.equals(argClassNames[n])) {
- CtClass clazz = lookupClass(argClassNames[n]);
+ CtClass clazz = lookupJvmClass(argClassNames[n]);
try {
- if (clazz.subtypeOf(lookupClass(cname)))
+ if (clazz.subtypeOf(lookupJvmClass(cname)))
result = MAYBE;
else
return NO;
Expr e = (Expr)expr;
int op = e.getOperator();
if (op == MEMBER) {
- f = lookupField((ASTList)e.oprand1(), (Symbol)e.oprand2());
+ f = lookupJavaField(((Symbol)e.oprand1()).get(),
+ (Symbol)e.oprand2());
is_static = true;
}
else if (op == '.') {
try {
e.oprand1().accept(this);
if (exprType == CLASS && arrayDim == 0)
- f = lookupField(className, (Symbol)e.oprand2());
+ f = lookupJvmField(className, (Symbol)e.oprand2());
else
badLvalue();
Symbol fname = (Symbol)e.oprand2();
// it should be a static field.
try {
- f = lookupField(nfe.getField(), fname);
+ f = lookupJvmField(nfe.getField(), fname);
is_static = true;
}
catch (CompileError ce) {
if (jvmName == null)
return null;
else
- return javaToJvmName(lookupClass(jvmName).getName());
+ return javaToJvmName(lookupJvmClass(jvmName).getName());
}
protected CtClass lookupClass(Declarator decl) throws CompileError {
CtClass clazz;
switch (type) {
case CLASS :
- clazz = lookupClass(classname);
+ clazz = lookupJvmClass(classname);
if (dim > 0)
cname = clazz.getName();
else
while (dim-- > 0)
cname += "[]";
- return lookupClass2(cname);
+ return lookupJavaClass(cname);
}
protected CtClass lookupClass(ASTList name) throws CompileError {
- return lookupClass2(Declarator.astToClassName(name, '.'));
+ return lookupJavaClass(Declarator.astToClassName(name, '.'));
}
- protected CtClass lookupClass(String jvmName) throws CompileError {
- return lookupClass2(jvmToJavaName(jvmName));
+ protected CtClass lookupJvmClass(String jvmName) throws CompileError {
+ return lookupJavaClass(jvmToJavaName(jvmName));
}
/**
* @param name a qualified class name. e.g. java.lang.String
*/
- private CtClass lookupClass2(String name) throws CompileError {
+ private CtClass lookupJavaClass(String name) throws CompileError {
try {
return classPool.get(name);
}
public CtField lookupField(ASTList className, Symbol fieldName)
throws CompileError
{
- return lookupField2(Declarator.astToClassName(className, '.'),
+ return lookupJavaField(Declarator.astToClassName(className, '.'),
fieldName);
}
- public CtField lookupField(String className, Symbol fieldName)
+ public CtField lookupJvmField(String className, Symbol fieldName)
throws CompileError
{
- return lookupField2(jvmToJavaName(className), fieldName);
+ return lookupJavaField(jvmToJavaName(className), fieldName);
}
/**
* @param name a qualified class name. e.g. java.lang.String
*/
- private CtField lookupField2(String className, Symbol fieldName)
+ private CtField lookupJavaField(String className, Symbol fieldName)
throws CompileError
{
- CtClass cc = lookupClass(className);
+ CtClass cc = lookupJavaClass(className);
try {
return cc.getField(fieldName.get());
}
else
throw new CompileError("missing static member name", lex);
- expr = Expr.make(MEMBER, toClassName(expr, null),
+ expr = Expr.make(MEMBER, new Symbol(toClassName(expr)),
new Member(str));
break;
default :
return Expr.make(CALL, expr, parseArgumentList(tbl));
}
+ private String toClassName(ASTree name)
+ throws CompileError
+ {
+ StringBuffer sbuf = new StringBuffer();
+ toClassName(name, sbuf);
+ return sbuf.toString();
+ }
- private ASTList toClassName(ASTree name, ASTList tail)
+ private void toClassName(ASTree name, StringBuffer sbuf)
throws CompileError
{
- if (name instanceof Symbol)
- return new ASTList(name, tail);
+ if (name instanceof Symbol) {
+ sbuf.append(((Symbol)name).get());
+ return;
+ }
else if (name instanceof Expr) {
Expr expr = (Expr)name;
- if (expr.getOperator() == '.')
- return toClassName(expr.oprand1(),
- new ASTList(expr.oprand2(), tail));
+ if (expr.getOperator() == '.') {
+ toClassName(expr.oprand1(), sbuf);
+ sbuf.append('.');
+ toClassName(expr.oprand2(), sbuf);
+ return;
+ }
}
throw new CompileError("bad static member access", lex);