BytecodeDL/ByteCodeDL

utils.dl中的Dispatch是否存在遗漏

riijj opened this issue · 3 comments

riijj commented

代码如下:

Dispatch(simplename, descriptor, class, method) :-
    !MethodInfo(_, simplename, _, class, _, descriptor, _),
    DirectSuperclass(class, superclass),
    Dispatch(simplename, descriptor, superclass, method),
    !MethodModifier("abstract", method).

根据描述,如果rclass没有对应的方法实现,则需要去父类中寻找相同函数签名的方法,这里的父类是否应当包含非直接父类呢。这里的DirectSuperclass如果我没有理解错的话应该是指的是直接父类吧。
例如 a extend b , b extend c , c存在该方法。

那么改成如下的代码是否会好一些呢。

Dispatch(simplename, descriptor, class, method) :-
    !MethodInfo(_, simplename, _, class, _, descriptor, _),
    SubClass(class, superclass),
    Dispatch(simplename, descriptor, superclass, method),
    !MethodModifier("abstract", method).
ceclin commented

简单说可以理解成递归,一层一层地推导。我觉得原代码没有问题。

riijj commented

简单说可以理解成递归,一层一层地推导。我觉得原代码没有问题。

我的理解是DirectSuperclass和Dispatch是且的关系,也就是如果不满足DirectSuperclass那么就不会继续判断Dispatch了,应该就不存在递归的情况了

a extend b , b extend c 为例Dispatch(func, _, a, method) 会递归到Dispatch(func, _, b, method) 然后会递归到Dispatch(func, _, c, method) a和b 以及b和c 都是满足DirectSuperclass关系的.

结论是没有遗漏, 你可以构造你上面的那个例子, 然后输出Dispath的结果进行验证