#40 Fix AClass#asString and RContext#resolve

已關閉
ranides4 年之前創建 · 1 條評論
ranides commented 4 年之前

At this moment we have a problem: RContext#resolve can go into stackoverflow:

    at net.ranides.assira.reflection.impl.RContext.resolve0(RContext.java:74)
    at net.ranides.assira.reflection.impl.RContext.resolve(RContext.java:62)
    at net.ranides.assira.reflection.impl.RContext.resolve0(RContext.java:74)
    at net.ranides.assira.reflection.impl.RContext.resolve(RContext.java:62)
    at net.ranides.assira.reflection.impl.RContext.resolve0(RContext.java:74)
    at net.ranides.assira.reflection.impl.RContext.resolve(RContext.java:62)
    at net.ranides.assira.reflection.impl.RContext.resolve0(RContext.java:74)
At this moment we have a problem: RContext#resolve can go into stackoverflow: ``` at net.ranides.assira.reflection.impl.RContext.resolve0(RContext.java:74) at net.ranides.assira.reflection.impl.RContext.resolve(RContext.java:62) at net.ranides.assira.reflection.impl.RContext.resolve0(RContext.java:74) at net.ranides.assira.reflection.impl.RContext.resolve(RContext.java:62) at net.ranides.assira.reflection.impl.RContext.resolve0(RContext.java:74) at net.ranides.assira.reflection.impl.RContext.resolve(RContext.java:62) at net.ranides.assira.reflection.impl.RContext.resolve0(RContext.java:74) ```
ranides commented 4 年之前
所有者

It is hard to say, what is cause of the problem, but it can be reproduced in AClassTest#testRecursiveString

At this moment we inserted workaround inside AClass#toString, but it causes that nested types can't be converted to correct string.

If we declare parameterized type Something<T> and then declare nested type Something<Something<Something<T>>>, we have infinite recursion.

Somewhere under the hood, toString converts parameters to strings. To do so, it has to create parameters list first. Parameter list is created lazily, and every parameter creates result using context:typeinfo.

typeinfo calls resolveTV

IContext somewhere

It is hard to say, what is cause of the problem, but it can be reproduced in AClassTest#testRecursiveString At this moment we inserted workaround inside AClass#toString, but it causes that nested types can't be converted to correct string. If we declare parameterized type `Something<T>` and then declare nested type `Something<Something<Something<T>>>`, we have infinite recursion. Somewhere under the hood, toString converts parameters to strings. To do so, it has to create parameters list first. Parameter list is created lazily, and every parameter creates result using `context:typeinfo`. typeinfo calls resolveTV IContext somewhere
ranides4 年之前 關閉
ranides 在代碼提交 4 年之前 中引用了該問題
Sign in to join this conversation.
未選擇里程碑
未指派成員
1 參與者
正在加載...
取消
保存
尚未有任何內容