e.push(types[i].getClassName());
e.push(TypeUtils.emulateClassGetName(types[i]));
    private static void member_helper_type(final CodeEmitter e,                                           List members,                                           final ObjectSwitchCallback callback,                                           final ParameterTyper typer,                                           final Label def,                                           final Label end,                                           final BitSet checked) throws Exception {        if (members.size() == 1) {            MethodInfo member = (MethodInfo)members.get(0);            Type[] types = typer.getParameterTypes(member);            // need to check classes that have not already been checked via switches            for (int i = 0; i < types.length; i++) {                if (checked == null || !checked.get(i)) {                    e.dup();                    e.aaload(i);                    e.invoke_virtual(Constants.TYPE_CLASS, GET_NAME);                    e.push(types[i].getClassName());                    e.invoke_virtual(Constants.TYPE_OBJECT, EQUALS);                    e.if_jump(e.EQ, def);                }            }            e.pop();            callback.processCase(member, end);        } else {            // choose the index that has the best chance of uniquely identifying member            Type[] example = typer.getParameterTypes((MethodInfo)members.get(0));            Map buckets = null;            int index = -1;            for (int i = 0; i < example.length; i++) {                final int j = i;                Map test = CollectionUtils.bucket(members, new Transformer() {                    public Object transform(Object value) {                        return typer.getParameterTypes((MethodInfo)value)[j].getClassName();                    }                });                if (buckets == null || test.size() > buckets.size()) {                    buckets = test;                    index = i;                }            }            if (buckets == null) {                // TODO: switch by returnType                // must have two methods with same name, types, and different return types                e.goTo(def);            } else {                checked.set(index);                e.dup();                e.aaload(index);                e.invoke_virtual(Constants.TYPE_CLASS, GET_NAME);                final Map fbuckets = buckets;                String[] names = (String[])buckets.keySet().toArray(new String[buckets.size()]);                EmitUtils.string_switch(e, names, Constants.SWITCH_STYLE_HASH, new ObjectSwitchCallback() {                    public void processCase(Object key, Label dontUseEnd) throws Exception {                        member_helper_type(e, (List)fbuckets.get(key), callback, typer, def, end, checked);                    }                    public void processDefault() throws Exception {                        e.goTo(def);                    }                });            }        }    }