class ClassName extends TypeData {
        private String name;    	// dot separated.

        public ClassName(String n) {
            name = n;
        }

        @Override
        public String getName() {
            return name;
        }

        @Override
        public BasicType isBasicType() { return null; }

        @Override
        public boolean is2WordType() { return false; }

        @Override
        public int getTypeTag() { return StackMapTable.OBJECT; }

        @Override
        public int getTypeData(ConstPool cp) {
            return cp.addClassInfo(getName());
        }

        @Override
        public boolean eq(TypeData d) { return name.equals(d.getName()); }

        @Override
        public void setType(String typeName, ClassPool cp) throws BadBytecode {}

        @Override
        public TypeData getArrayType(int dim) throws NotFoundException {<FILL_FUNCTION_BODY>}

        @Override
        String toString2(Set<TypeData> set) {
            return name;
        }
    }

            if (dim == 0)
                return this;
            else if (dim > 0) {
                char[] dimType = new char[dim];
                for (int i = 0; i < dim; i++)
                    dimType[i] = '[';

                String elementType = getName();
                if (elementType.charAt(0) != '[')
                    elementType = "L" + elementType.replace('.', '/') + ";";

                return new ClassName(new String(dimType) + elementType);
            }
            else {
                for (int i = 0; i < -dim; i++)
                    if (name.charAt(i) != '[')
                        throw new NotFoundException("no " + dim + " dimensional array type: " + getName());

                char type = name.charAt(-dim);
                if (type == '[')
                    return new ClassName(name.substring(-dim));
                else if (type == 'L')
                    return new ClassName(name.substring(-dim + 1, name.length() - 1).replace('/', '.'));
                else if (type == TypeTag.DOUBLE.decodedName)
                    return TypeTag.DOUBLE;
                else if (type == TypeTag.FLOAT.decodedName)
                    return TypeTag.FLOAT;
                else if (type == TypeTag.LONG.decodedName)
                    return TypeTag.LONG;
                else
                    return TypeTag.INTEGER;
            }
        
<no_super_class>