Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

DialogFragment重写getContext方法出现栈溢出 #647

Closed
dazhong159 opened this issue Oct 21, 2021 · 0 comments · Fixed by #648
Closed

DialogFragment重写getContext方法出现栈溢出 #647

dazhong159 opened this issue Oct 21, 2021 · 0 comments · Fixed by #648
Labels
bug Something isn't working

Comments

@dazhong159
Copy link

image
麻烦看下

@shifujun shifujun added the bug Something isn't working label Oct 21, 2021
shifujun added a commit to shifujun/Shadow that referenced this issue Oct 21, 2021
原本希望简化Fragment的支持,不修改Fragment的父类了。
但是这里Fragment的子类如果override getContext方法,
在原本采用静态方法fragmentGetContext的方式支持会造成
super.getContext调用循环调用调用自身。

考虑到Fragment的子类的子类也都有override getContext方法的可能,
最简单的支持方法还是将Fragment的直接子类的父类都改为ShadowFragment,
然后ShadowFragment通过override getContext方法来支持将
宿主Activity还原为插件Activity的能力。

不一样的是getHost方法由于是final的,所以不用这样支持。

fix Tencent#647
shifujun added a commit to shifujun/Shadow that referenced this issue Oct 21, 2021
原本希望简化Fragment的支持,不修改Fragment的父类了。
但是这里Fragment的子类如果override getContext方法,
在原本采用静态方法fragmentGetContext的方式支持会造成
super.getContext调用循环调用调用自身。

考虑到Fragment的子类的子类也都有override getContext方法的可能,
最简单的支持方法还是将Fragment的直接子类的父类都改为ShadowFragment,
然后ShadowFragment通过override getContext方法来支持将
宿主Activity还原为插件Activity的能力。

不一样的是getHost方法由于是final的,所以不用这样支持。

fix Tencent#647
shifujun added a commit to shifujun/Shadow that referenced this issue Oct 22, 2021
redirectMethodCallToStatic方法复用了TransformCall的匹配逻辑,
即`if (c == INVOKEINTERFACE || c == INVOKESPECIAL || c == INVOKESTATIC || c == INVOKEVIRTUAL)`
其中INVOKESPECIAL即包含super调用。而我们在替换fragmentGetContext方法时,并不需要对super调用进行转换。
如果转换会导致fragmentGetContext静态方法中对fragment的getContext调用循环回自身。

因此对这种情况忽略INVOKESPECIAL调用,添加新方法redirectMethodCallExceptSuperCallToStatic。

fix Tencent#647
shifujun added a commit that referenced this issue Oct 22, 2021
redirectMethodCallToStatic方法复用了TransformCall的匹配逻辑,
即`if (c == INVOKEINTERFACE || c == INVOKESPECIAL || c == INVOKESTATIC || c == INVOKEVIRTUAL)`
其中INVOKESPECIAL即包含super调用。而我们在替换fragmentGetContext方法时,并不需要对super调用进行转换。
如果转换会导致fragmentGetContext静态方法中对fragment的getContext调用循环回自身。

因此对这种情况忽略INVOKESPECIAL调用,添加新方法redirectMethodCallExceptSuperCallToStatic。

fix #647
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants