svnno****@sourc*****
svnno****@sourc*****
2009年 2月 3日 (火) 00:53:22 JST
Revision: 2606 http://svn.sourceforge.jp/view?root=jiemamy&view=rev&rev=2606 Author: ashigeru Date: 2009-02-03 00:53:22 +0900 (Tue, 03 Feb 2009) Log Message: ----------- ループの検出範囲を、厳密にループだけにしてみる Modified Paths: -------------- artemis/trunk/generic-tree/src/main/java/org/jiemamy/utils/gtree/converter/CachedObjectConverter.java -------------- next part -------------- Modified: artemis/trunk/generic-tree/src/main/java/org/jiemamy/utils/gtree/converter/CachedObjectConverter.java =================================================================== --- artemis/trunk/generic-tree/src/main/java/org/jiemamy/utils/gtree/converter/CachedObjectConverter.java 2009-02-02 14:36:23 UTC (rev 2605) +++ artemis/trunk/generic-tree/src/main/java/org/jiemamy/utils/gtree/converter/CachedObjectConverter.java 2009-02-02 15:53:22 UTC (rev 2606) @@ -34,22 +34,16 @@ private static class ObjectGraphCache { /** - * オブジェクトグラフを管理するマップ。 + * コールフレームを管理する。 */ - private Map<Object, Integer> map; + private Map<Object, Integer> frame; - /** - * 現在構築中のグラフの深さ。 - */ - private int graphDepth; - /** * インスタンスを生成する。 */ public ObjectGraphCache() { super(); - graphDepth = 0; } /** @@ -58,37 +52,38 @@ * @return 追加済みならそのオブジェクトの番号({@code >= 0})、そうでなければ {@code -1} */ public int enter(Object object) { - if (graphDepth == 0) { + if (frame == null) { reinitialize(); } int result; if (object != null) { - Integer cached = map.get(object); - if (cached != null) { - result = cached; + if (frame.containsKey(object)) { + result = frame.get(object); } else { result = -1; - map.put(object, map.size()); + frame.put(object, frame.size()); } } else { result = -1; } - graphDepth++; return result; } /** * 現在のオブジェクトに対する処理が終了したことを通知する。 + * @param object 抜けるオブジェクト */ - public void exit() { - --graphDepth; - if (graphDepth == 0) { - map = null; + public void exit(Object object) { + if (object != null) { + frame.remove(object); + if (frame.isEmpty()) { + frame = null; + } } } private void reinitialize() { - map = new IdentityHashMap<Object, Integer>(); + frame = new IdentityHashMap<Object, Integer>(); } } @@ -189,7 +184,7 @@ int number = graph.enter(object); try { if (number >= 0) { - return Terminal.of(String.format("#COPY-%d", number)); + return Terminal.of(String.format("#COPY-%d ()", number, object.getClass().getName())); } for (ConverterDriver drv : drivers) { Value result = drv.convert(object, this); @@ -198,7 +193,9 @@ } } } finally { - graph.exit(); + if (number < 0) { + graph.exit(object); + } } // 最後に汎用の変換機で変換