[Jiemamy-notify:1348] commit [2606] ループの検出範囲を、厳密にループだけにしてみる

アーカイブの一覧に戻る

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);
+			}
 		}
 		
 		// 最後に汎用の変換機で変換



Jiemamy-notify メーリングリストの案内
アーカイブの一覧に戻る