169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal/*
269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * Javassist, a Java-bytecode translator toolkit.
369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * Copyright (C) 1999-2007 Shigeru Chiba. All Rights Reserved.
469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal *
569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * The contents of this file are subject to the Mozilla Public License Version
669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * 1.1 (the "License"); you may not use this file except in compliance with
769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * the License.  Alternatively, the contents of this file may be used under
869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * the terms of the GNU Lesser General Public License Version 2.1 or later.
969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal *
1069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * Software distributed under the License is distributed on an "AS IS" basis,
1169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
1269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * for the specific language governing rights and limitations under the
1369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * License.
1469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal */
1569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
1669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalpackage javassist.compiler;
1769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
1869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalimport javassist.*;
1969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalimport javassist.compiler.ast.*;
2069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
2169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal/* Type checker accepting extended Java syntax for Javassist.
2269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal */
2369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
2469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalpublic class JvstTypeChecker extends TypeChecker {
2569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    private JvstCodeGen codeGen;
2669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
2769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public JvstTypeChecker(CtClass cc, ClassPool cp, JvstCodeGen gen) {
2869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        super(cc, cp);
2969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        codeGen = gen;
3069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
3169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
3269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /* If the type of the expression compiled last is void,
3369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * add ACONST_NULL and change exprType, arrayDim, className.
3469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
3569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public void addNullIfVoid() {
3669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        if (exprType == VOID) {
3769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            exprType = CLASS;
3869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            arrayDim = 0;
3969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            className = jvmJavaLangObject;
4069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        }
4169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
4269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
4369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /* To support $args, $sig, and $type.
4469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * $args is an array of parameter list.
4569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
4669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public void atMember(Member mem) throws CompileError {
4769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        String name = mem.get();
4869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        if (name.equals(codeGen.paramArrayName)) {
4969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            exprType = CLASS;
5069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            arrayDim = 1;
5169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            className = jvmJavaLangObject;
5269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        }
5369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        else if (name.equals(JvstCodeGen.sigName)) {
5469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            exprType = CLASS;
5569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            arrayDim = 1;
5669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            className = "java/lang/Class";
5769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        }
5869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        else if (name.equals(JvstCodeGen.dollarTypeName)
5969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                 || name.equals(JvstCodeGen.clazzName)) {
6069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            exprType = CLASS;
6169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            arrayDim = 0;
6269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            className = "java/lang/Class";
6369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        }
6469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        else
6569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            super.atMember(mem);
6669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
6769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
6869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    protected void atFieldAssign(Expr expr, int op, ASTree left, ASTree right)
6969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        throws CompileError
7069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    {
7169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        if (left instanceof Member
7269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            && ((Member)left).get().equals(codeGen.paramArrayName)) {
7369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            right.accept(this);
7469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            CtClass[] params = codeGen.paramTypeList;
7569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            if (params == null)
7669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                return;
7769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
7869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            int n = params.length;
7969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            for (int i = 0; i < n; ++i)
8069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                compileUnwrapValue(params[i]);
8169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        }
8269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        else
8369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            super.atFieldAssign(expr, op, left, right);
8469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
8569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
8669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public void atCastExpr(CastExpr expr) throws CompileError {
8769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        ASTList classname = expr.getClassName();
8869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        if (classname != null && expr.getArrayDim() == 0) {
8969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            ASTree p = classname.head();
9069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            if (p instanceof Symbol && classname.tail() == null) {
9169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                String typename = ((Symbol)p).get();
9269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                if (typename.equals(codeGen.returnCastName)) {
9369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                    atCastToRtype(expr);
9469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                    return;
9569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                }
9669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                else if (typename.equals(JvstCodeGen.wrapperCastName)) {
9769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                    atCastToWrapper(expr);
9869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                    return;
9969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                }
10069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            }
10169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        }
10269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
10369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        super.atCastExpr(expr);
10469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
10569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
10669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
10769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Inserts a cast operator to the return type.
10869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * If the return type is void, this does nothing.
10969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
11069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    protected void atCastToRtype(CastExpr expr) throws CompileError {
11169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        CtClass returnType = codeGen.returnType;
11269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        expr.getOprand().accept(this);
11369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        if (exprType == VOID || CodeGen.isRefType(exprType) || arrayDim > 0)
11469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            compileUnwrapValue(returnType);
11569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        else if (returnType instanceof CtPrimitiveType) {
11669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            CtPrimitiveType pt = (CtPrimitiveType)returnType;
11769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            int destType = MemberResolver.descToType(pt.getDescriptor());
11869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            exprType = destType;
11969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            arrayDim = 0;
12069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            className = null;
12169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        }
12269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
12369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
12469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    protected void atCastToWrapper(CastExpr expr) throws CompileError {
12569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        expr.getOprand().accept(this);
12669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        if (CodeGen.isRefType(exprType) || arrayDim > 0)
12769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            return;     // Object type.  do nothing.
12869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
12969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        CtClass clazz = resolver.lookupClass(exprType, arrayDim, className);
13069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        if (clazz instanceof CtPrimitiveType) {
13169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            exprType = CLASS;
13269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            arrayDim = 0;
13369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            className = jvmJavaLangObject;
13469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        }
13569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
13669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
13769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /* Delegates to a ProcHandler object if the method call is
13869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * $proceed().  It may process $cflow().
13969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
14069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public void atCallExpr(CallExpr expr) throws CompileError {
14169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        ASTree method = expr.oprand1();
14269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        if (method instanceof Member) {
14369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            String name = ((Member)method).get();
14469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            if (codeGen.procHandler != null
14569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                && name.equals(codeGen.proceedName)) {
14669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                codeGen.procHandler.setReturnType(this,
14769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                                                  (ASTList)expr.oprand2());
14869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                return;
14969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            }
15069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            else if (name.equals(JvstCodeGen.cflowName)) {
15169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                atCflow((ASTList)expr.oprand2());
15269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                return;
15369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            }
15469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        }
15569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
15669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        super.atCallExpr(expr);
15769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
15869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
15969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /* To support $cflow().
16069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
16169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    protected void atCflow(ASTList cname) throws CompileError {
16269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        exprType = INT;
16369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        arrayDim = 0;
16469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        className = null;
16569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
16669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
16769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /* To support $$.  ($$) is equivalent to ($1, ..., $n).
16869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * It can be used only as a parameter list of method call.
16969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
17069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public boolean isParamListName(ASTList args) {
17169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        if (codeGen.paramTypeList != null
17269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            && args != null && args.tail() == null) {
17369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            ASTree left = args.head();
17469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            return (left instanceof Member
17569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                    && ((Member)left).get().equals(codeGen.paramListName));
17669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        }
17769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        else
17869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            return false;
17969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
18069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
18169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public int getMethodArgsLength(ASTList args) {
18269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        String pname = codeGen.paramListName;
18369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        int n = 0;
18469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        while (args != null) {
18569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            ASTree a = args.head();
18669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            if (a instanceof Member && ((Member)a).get().equals(pname)) {
18769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                if (codeGen.paramTypeList != null)
18869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                    n += codeGen.paramTypeList.length;
18969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            }
19069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            else
19169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                ++n;
19269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
19369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            args = args.tail();
19469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        }
19569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
19669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        return n;
19769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
19869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
19969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public void atMethodArgs(ASTList args, int[] types, int[] dims,
20069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                                String[] cnames) throws CompileError {
20169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        CtClass[] params = codeGen.paramTypeList;
20269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        String pname = codeGen.paramListName;
20369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        int i = 0;
20469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        while (args != null) {
20569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            ASTree a = args.head();
20669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            if (a instanceof Member && ((Member)a).get().equals(pname)) {
20769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                if (params != null) {
20869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                    int n = params.length;
20969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                    for (int k = 0; k < n; ++k) {
21069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                        CtClass p = params[k];
21169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                        setType(p);
21269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                        types[i] = exprType;
21369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                        dims[i] = arrayDim;
21469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                        cnames[i] = className;
21569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                        ++i;
21669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                    }
21769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                }
21869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            }
21969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            else {
22069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                a.accept(this);
22169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                types[i] = exprType;
22269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                dims[i] = arrayDim;
22369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                cnames[i] = className;
22469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                ++i;
22569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            }
22669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
22769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            args = args.tail();
22869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        }
22969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
23069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
23169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /* called by Javac#recordSpecialProceed().
23269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
23369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    void compileInvokeSpecial(ASTree target, String classname,
23469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                              String methodname, String descriptor,
23569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                              ASTList args)
23669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        throws CompileError
23769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    {
23869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        target.accept(this);
23969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        int nargs = getMethodArgsLength(args);
24069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        atMethodArgs(args, new int[nargs], new int[nargs],
24169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                     new String[nargs]);
24269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        setReturnType(descriptor);
24369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        addNullIfVoid();
24469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
24569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
24669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    protected void compileUnwrapValue(CtClass type) throws CompileError
24769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    {
24869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        if (type == CtClass.voidType)
24969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            addNullIfVoid();
25069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        else
25169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            setType(type);
25269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
25369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
25469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /* Sets exprType, arrayDim, and className;
25569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * If type is void, then this method does nothing.
25669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
25769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public void setType(CtClass type) throws CompileError {
25869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        setType(type, 0);
25969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
26069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
26169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    private void setType(CtClass type, int dim) throws CompileError {
26269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        if (type.isPrimitive()) {
26369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            CtPrimitiveType pt = (CtPrimitiveType)type;
26469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            exprType = MemberResolver.descToType(pt.getDescriptor());
26569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            arrayDim = dim;
26669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            className = null;
26769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        }
26869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        else if (type.isArray())
26969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            try {
27069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                setType(type.getComponentType(), dim + 1);
27169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            }
27269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            catch (NotFoundException e) {
27369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                throw new CompileError("undefined type: " + type.getName());
27469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            }
27569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        else {
27669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            exprType = CLASS;
27769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            arrayDim = dim;
27869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            className = MemberResolver.javaToJvmName(type.getName());
27969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        }
28069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
28169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal}
282