} else { method.getDeclaringClass().initialize();
	public static Object invoke(VmMethod method, Object o, Object[] args) 	throws InvocationTargetException {		int argCount = method.getNoArguments();		int argsLength = (args == null) ? 0 : args.length;		if (argCount != argsLength) {			throw new IllegalArgumentException("Invalid number of arguments");		}				if (!method.isStatic()) {			Unsafe.pushObject(o);		}		for (int i = 0; i < argCount; i++) {			final VmType argType = method.getArgumentType(i);			final Object arg = args[i];			if (argType.isPrimitive()) {				int v = 0;				long lv = 0;				boolean wide = false;				if (arg == null) {					/* do nothing */				} else if (arg instanceof Boolean) {					v = ((Boolean)arg).booleanValue() ? 1 : 0;				} else if (arg instanceof Byte) {					v = ((Byte)arg).byteValue();				} else if (arg instanceof Character) {					v = ((Character)arg).charValue();				} else if (arg instanceof Short) {					v = ((Short)arg).shortValue();				} else if (arg instanceof Integer) {					v = ((Integer)arg).intValue();				} else if (arg instanceof Long) {					lv = ((Long)arg).longValue();					wide = true;				} else if (arg instanceof Float) {					v = Float.floatToRawIntBits(((Float)arg).floatValue());				} else if (arg instanceof Double) {					lv = Double.doubleToRawLongBits(((Double)arg).doubleValue());					wide = true;				}								final Class argClass = argType.asClass();				if ((argClass == Long.TYPE) || (argClass == Double.TYPE)) {					// Wide argument					if (wide) {						Unsafe.pushLong(lv);					} else {						Unsafe.pushLong(v);					}				} else {					// Normal argument					if (wide) {						Unsafe.pushInt((int)lv);					} else {						Unsafe.pushInt(v);					}									}			} else {				// Non-primitive argument				Unsafe.pushObject(arg);			}		}				try {			if (method.isReturnVoid()) {				Unsafe.invokeVoid(method);				return null;			} else if (method.isReturnObject()) {				return Unsafe.invokeObject(method);			} else if (method.isReturnWide()) {				long rc = Unsafe.invokeLong(method);				final Class retType = method.getReturnType().asClass();				if (Long.TYPE == retType) {					return new Long(rc);				} else {					return new Double(Double.longBitsToDouble(rc));				}			} else {				int rc = Unsafe.invokeInt(method);				final Class retType = method.getReturnType().asClass();				if (Byte.TYPE == retType) {					return new Byte((byte)rc);				} else if (Boolean.TYPE == retType) {					return Boolean.valueOf(rc != 0);				} else if (Character.TYPE == retType) {					return new Character((char)rc);				} else if (Short.TYPE == retType) {					return new Short((short)rc);				} else if (Float.TYPE == retType) {					return new Float(Float.intBitsToFloat(rc));				} else {					return new Integer(rc);				}			}		} catch (Throwable ex) {			throw new InvocationTargetException(ex);		}	}