1

在 davik vm/mterp/out/InterpC-portable.cpp 代码中,当解释invokeMethod时,我发现它只能处理count小于或等于5的情况:

        switch (count) {
        case 5:
            outs[4] = GET_REGISTER(vsrc1 & 0x0f);
        case 4:
            outs[3] = GET_REGISTER(vdst >> 12);
        case 3:
            outs[2] = GET_REGISTER((vdst & 0x0f00) >> 8);
        case 2:
            outs[1] = GET_REGISTER((vdst & 0x00f0) >> 4);
        case 1:
            outs[0] = GET_REGISTER(vdst & 0x0f);
        default:
            ;
        }

那么当参数大小大于 5 的情况下呢?

4

1 回答 1

1

对不起,我错过了一些东西,我提到的情景是非范围调用的情况,我错过了一个范围调用:

     */
    if (methodCallRange) {
        // could use memcpy or a "Duff's device"; most functions have
        // so few args it won't matter much
        assert(vsrc1 <= curMethod->outsSize);
        assert(vsrc1 == methodToCall->insSize);
        outs = OUTS_FROM_FP(fp, vsrc1);

        for (i = 0; i < vsrc1; i++)
            outs[i] = GET_REGISTER(vdst+i);

        ....

所以在这里处理!

于 2013-05-08T04:48:37.713 回答