From c5b146b65e3f5d9298648c264919fe69be486e55 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Thu, 23 Jun 2005 01:09:56 +0000 Subject: [PATCH] Catch extra errors, clone visited ObjectInfos used as map keys. git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@3617 542714f4-19e9-0310-aa3c-eee0fc999fb1 --- src/java/com/threerings/stage/data/StageCodes.java | 4 +++- .../threerings/stage/util/PlacementConstraints.java | 13 ++++++++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/java/com/threerings/stage/data/StageCodes.java b/src/java/com/threerings/stage/data/StageCodes.java index 065b87812..cb1320fbc 100644 --- a/src/java/com/threerings/stage/data/StageCodes.java +++ b/src/java/com/threerings/stage/data/StageCodes.java @@ -23,12 +23,14 @@ package com.threerings.stage.data; import com.threerings.util.MessageBundle; +import com.threerings.presents.data.InvocationCodes; + import com.threerings.crowd.data.BodyObject; /** * Codes and constants relating to the Stage system. */ -public interface StageCodes +public interface StageCodes extends InvocationCodes { /** The i18n bundle identifier for the Stage system. */ public static final String STAGE_MESSAGE_BUNDLE = "stage.general"; diff --git a/src/java/com/threerings/stage/util/PlacementConstraints.java b/src/java/com/threerings/stage/util/PlacementConstraints.java index 4127f2c82..e60c4e818 100644 --- a/src/java/com/threerings/stage/util/PlacementConstraints.java +++ b/src/java/com/threerings/stage/util/PlacementConstraints.java @@ -52,7 +52,10 @@ public class PlacementConstraints public void visit (ObjectInfo info) { ObjectData data = createObjectData(info); if (data != null) { - _objectData.put(info, data); + // clone the map key, as the visit method reuses a + // single ObjectInfo instance for uninteresting objects + // in a section + _objectData.put((ObjectInfo)info.clone(), data); } } }; @@ -122,11 +125,19 @@ public class PlacementConstraints ObjectData[] addedData = new ObjectData[added.length]; for (int i = 0; i < added.length; i++) { addedData[i] = createObjectData(added[i]); + if (addedData[i] == null) { + return INTERNAL_ERROR; + } } ObjectData[] removedData = new ObjectData[removed.length]; for (int i = 0; i < removed.length; i++) { removedData[i] = (ObjectData)_objectData.get(removed[i]); + if (removedData[i] == null) { + Log.warning("Couldn't match object info up to data [info=" + + removed[i] + "]."); + return INTERNAL_ERROR; + } } return allowModifyObjects(addedData, removedData);