private boolean update(ClassPool cp, String oldName, String typeName) throws BadBytecode {
            if (typeName == null)
                return false;
            else if (oldName == null)
                return true;
            else if (oldName.equals(typeName))
                return false;
            else if (typeName.charAt(0) == '['
                     && oldName.equals("[Ljava.lang.Object;")) {
                /* this rule is not correct but Tracer class sets the type
                   of the operand of arraylength to java.lang.Object[].
                   Thus, int[] etc. must be a subtype of java.lang.Object[].
                 */
                return true;
            }

            try {
                if (cache == null)
                    cache = cp.get(oldName);
    
                CtClass cache2 = cp.get(typeName);
                if (cache2.subtypeOf(cache)) {
                    cache = cache2;
                    return true;
                }
                else
                    return false;
            }
            catch (NotFoundException e) {
                throw new BadBytecode("cannot find " + e.getMessage());
            }
        }