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