src/org/nutz/repo/org/objectweb/asm/Frame.java
final boolean merge(final ClassWriter cw, final Frame frame, final int edge) {
        boolean changed = false;
        int i, s, dim, kind, t;

        int nLocal = inputLocals.length;
        int nStack = inputStack.length;
        if (frame.inputLocals == null) {
            frame.inputLocals = new int[nLocal];
            changed = true;
        }

        for (i = 0; i < nLocal; ++i) {
            if (outputLocals != null && i < outputLocals.length) {
                s = outputLocals[i];
                if (s == 0) {
                    t = inputLocals[i];
                } else {
                    dim = s & DIM;
                    kind = s & KIND;
                    if (kind == BASE) {
                        t = s;
                    } else {
                        if (kind == LOCAL) {
                            t = dim + inputLocals[s & VALUE];
                        } else {
                            t = dim + inputStack[nStack - (s & VALUE)];
                        }
                        if ((s & TOP_IF_LONG_OR_DOUBLE) != 0
                                && (t == LONG || t == DOUBLE)) {
                            t = TOP;
                        }
                    }
                }
            } else {
                t = inputLocals[i];
            }
            if (initializations != null) {
                t = init(cw, t);
            }
            changed |= merge(cw, t, frame.inputLocals, i);
        }

        if (edge > 0) {
            for (i = 0; i < nLocal; ++i) {
                t = inputLocals[i];
                changed |= merge(cw, t, frame.inputLocals, i);
            }
            if (frame.inputStack == null) {
                frame.inputStack = new int[1];
                changed = true;
            }
            changed |= merge(cw, edge, frame.inputStack, 0);
            return changed;
        }

        int nInputStack = inputStack.length + owner.inputStackTop;
        if (frame.inputStack == null) {
            frame.inputStack = new int[nInputStack + outputStackTop];
            changed = true;
        }

        for (i = 0; i < nInputStack; ++i) {
            t = inputStack[i];
            if (initializations != null) {
                t = init(cw, t);
            }
            changed |= merge(cw, t, frame.inputStack, i);
        }
        for (i = 0; i < outputStackTop; ++i) {
            s = outputStack[i];
            dim = s & DIM;
            kind = s & KIND;
            if (kind == BASE) {
                t = s;
            } else {
                if (kind == LOCAL) {
                    t = dim + inputLocals[s & VALUE];
                } else {
                    t = dim + inputStack[nStack - (s & VALUE)];
                }
                if ((s & TOP_IF_LONG_OR_DOUBLE) != 0
                        && (t == LONG || t == DOUBLE)) {
                    t = TOP;
                }
            }
            if (initializations != null) {
                t = init(cw, t);
            }
            changed |= merge(cw, t, frame.inputStack, nInputStack + i);
        }
        return changed;
    }
final boolean merge(final ClassWriter cw, final Frame frame, final int edge) {
        boolean changed = false;
        int i, s, dim, kind, t;

        int nLocal = inputLocals.length;
        int nStack = inputStack.length;
        if (frame.inputLocals == null) {
            frame.inputLocals = new int[nLocal];
            changed = true;
        }

        for (i = 0; i < nLocal; ++i) {
            if (outputLocals != null && i < outputLocals.length) {
                s = outputLocals[i];
                if (s == 0) {
                    t = inputLocals[i];
                } else {
                    dim = s & DIM;
                    kind = s & KIND;
                    if (kind == BASE) {
                        t = s;
                    } else {
                        if (kind == LOCAL) {
                            t = dim + inputLocals[s & VALUE];
                        } else {
                            t = dim + inputStack[nStack - (s & VALUE)];
                        }
                        if ((s & TOP_IF_LONG_OR_DOUBLE) != 0
                                && (t == LONG || t == DOUBLE)) {
                            t = TOP;
                        }
                    }
                }
            } else {
                t = inputLocals[i];
            }
            if (initializations != null) {
                t = init(cw, t);
            }
            changed |= merge(cw, t, frame.inputLocals, i);
        }

        if (edge > 0) {
            for (i = 0; i < nLocal; ++i) {
                t = inputLocals[i];
                changed |= merge(cw, t, frame.inputLocals, i);
            }
            if (frame.inputStack == null) {
                frame.inputStack = new int[1];
                changed = true;
            }
            changed |= merge(cw, edge, frame.inputStack, 0);
            return changed;
        }

        int nInputStack = inputStack.length + owner.inputStackTop;
        if (frame.inputStack == null) {
            frame.inputStack = new int[nInputStack + outputStackTop];
            changed = true;
        }

        for (i = 0; i < nInputStack; ++i) {
            t = inputStack[i];
            if (initializations != null) {
                t = init(cw, t);
            }
            changed |= merge(cw, t, frame.inputStack, i);
        }
        for (i = 0; i < outputStackTop; ++i) {
            s = outputStack[i];
            dim = s & DIM;
            kind = s & KIND;
            if (kind == BASE) {
                t = s;
            } else {
                if (kind == LOCAL) {
                    t = dim + inputLocals[s & VALUE];
                } else {
                    t = dim + inputStack[nStack - (s & VALUE)];
                }
                if ((s & TOP_IF_LONG_OR_DOUBLE) != 0
                        && (t == LONG || t == DOUBLE)) {
                    t = TOP;
                }
            }
            if (initializations != null) {
                t = init(cw, t);
            }
            changed |= merge(cw, t, frame.inputStack, nInputStack + i);
        }
        return changed;
    }
final boolean merge ( final ClassWriter cw , final Frame frame , final int edge ) { boolean changed = false ; int i , s , dim , kind , t ; int nLocal = inputLocals . length ; int nStack = inputStack . length ; if ( frame . inputLocals == null ) { frame . inputLocals = new int [ nLocal ] ; changed = true ; } for ( i = 0 ; i < nLocal ; ++ i ) { if ( outputLocals != null && i < outputLocals . length ) { s = outputLocals [ i ] ; if ( s == 0 ) { t = inputLocals [ i ] ; } else { dim = s & DIM ; kind = s & KIND ; if ( kind == BASE ) { t = s ; } else { if ( kind == LOCAL ) { t = dim + inputLocals [ s & VALUE ] ; } else { t = dim + inputStack [ nStack - ( s & VALUE ) ] ; } if ( ( s & TOP_IF_LONG_OR_DOUBLE ) != 0 && ( t == LONG || t == DOUBLE ) ) { t = TOP ; } } } } else { t = inputLocals [ i ] ; } if ( initializations != null ) { t = init ( cw , t ) ; } changed |= merge ( cw , t , frame . inputLocals , i ) ; } if ( edge > 0 ) { for ( i = 0 ; i < nLocal ; ++ i ) { t = inputLocals [ i ] ; changed |= merge ( cw , t , frame . inputLocals , i ) ; } if ( frame . inputStack == null ) { frame . inputStack = new int [ 1 ] ; changed = true ; } changed |= merge ( cw , edge , frame . inputStack , 0 ) ; return changed ; } int nInputStack = inputStack . length + owner . inputStackTop ; if ( frame . inputStack == null ) { frame . inputStack = new int [ nInputStack + outputStackTop ] ; changed = true ; } for ( i = 0 ; i < nInputStack ; ++ i ) { t = inputStack [ i ] ; if ( initializations != null ) { t = init ( cw , t ) ; } changed |= merge ( cw , t , frame . inputStack , i ) ; } for ( i = 0 ; i < outputStackTop ; ++ i ) { s = outputStack [ i ] ; dim = s & DIM ; kind = s & KIND ; if ( kind == BASE ) { t = s ; } else { if ( kind == LOCAL ) { t = dim + inputLocals [ s & VALUE ] ; } else { t = dim + inputStack [ nStack - ( s & VALUE ) ] ; } if ( ( s & TOP_IF_LONG_OR_DOUBLE ) != 0 && ( t == LONG || t == DOUBLE ) ) { t = TOP ; } } if ( initializations != null ) { t = init ( cw , t ) ; } changed |= merge ( cw , t , frame . inputStack , nInputStack + i ) ; } return changed ; }
Merges the input frame of the given basic block with the input and output
frames of this basic block. Returns <tt>true</tt> if the input frame of
the given label has been changed by this operation.

@param cw
the ClassWriter to which this label belongs.
@param frame
the basic block whose input frame must be updated.
@param edge
the kind of the {@link Edge} between this label and 'label'.
See {@link Edge#info}.
@return <tt>true</tt> if the input frame of the given label has been
changed by this operation.
Merges the input frame of the given basic block with the input and output frames of this basic block . Returns <tt > true< / tt > if the input frame of the given label has been changed by this operation .