Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/ikvm-fork.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'classpath/ikvm/internal/WeakIdentityMap.java')
-rw-r--r--classpath/ikvm/internal/WeakIdentityMap.java155
1 files changed, 0 insertions, 155 deletions
diff --git a/classpath/ikvm/internal/WeakIdentityMap.java b/classpath/ikvm/internal/WeakIdentityMap.java
deleted file mode 100644
index e73ae3d9..00000000
--- a/classpath/ikvm/internal/WeakIdentityMap.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- Copyright (C) 2006, 2007 Jeroen Frijters
-
- This software is provided 'as-is', without any express or implied
- warranty. In no event will the authors be held liable for any damages
- arising from the use of this software.
-
- Permission is granted to anyone to use this software for any purpose,
- including commercial applications, and to alter it and redistribute it
- freely, subject to the following restrictions:
-
- 1. The origin of this software must not be misrepresented; you must not
- claim that you wrote the original software. If you use this software
- in a product, an acknowledgment in the product documentation would be
- appreciated but is not required.
- 2. Altered source versions must be plainly marked as such, and must not be
- misrepresented as being the original software.
- 3. This notice may not be removed or altered from any source distribution.
-
- Jeroen Frijters
- jeroen@frijters.net
-
-*/
-package ikvm.internal;
-
-import cli.System.GC;
-import cli.System.WeakReference;
-
-@ikvm.lang.Internal
-public final class WeakIdentityMap
-{
- private WeakReference[] keys = new WeakReference[16];
- private Object[] values = new Object[keys.length];
-
- public WeakIdentityMap()
- {
- for (int i = 0; i < keys.length; i++)
- {
- keys[i] = new WeakReference(null, true);
- // NOTE we suppress finalization, to make sure the WeakReference continues to work
- // while the AppDomain is finalizing for unload (note that for this to work,
- // the code that instantiates us also has to call SuppressFinalize on us.)
- GC.SuppressFinalize(keys[i]);
- }
- }
-
- protected void finalize()
- {
- for (int i = 0; i < keys.length; i++)
- {
- if (keys[i] != null)
- {
- GC.ReRegisterForFinalize(keys[i]);
- }
- }
- }
-
- public synchronized Object remove(Object key)
- {
- for (int i = 0; i < keys.length; i++)
- {
- if (keys[i].get_Target() == key)
- {
- Object value = values[i];
- keys[i].set_Target(null);
- values[i] = null;
- return value;
- }
- }
- return null;
- }
-
- // Note that null values are supported, null keys are not
- public synchronized void put(Object key, Object value)
- {
- if (key == null)
- throw new NullPointerException();
- putImpl(key, value, true);
- }
-
- private void putImpl(Object key, Object value, boolean tryGC)
- {
- int emptySlot = -1;
- int keySlot = -1;
- for (int i = 0; i < keys.length; i++)
- {
- Object k = keys[i].get_Target();
- if (k == null)
- {
- emptySlot = i;
- values[i] = null;
- }
- else if (k == key)
- {
- keySlot = i;
- }
- }
- if (keySlot != -1)
- {
- values[keySlot] = value;
- }
- else if (emptySlot != -1)
- {
- keys[emptySlot].set_Target(key);
- values[emptySlot] = value;
- }
- else
- {
- if (tryGC)
- {
- GC.Collect(0);
- putImpl(key, value, false);
- return;
- }
- int len = keys.length;
- WeakReference[] newkeys = new WeakReference[len * 2];
- Object[] newvalues = new Object[newkeys.length];
- cli.System.Array.Copy((cli.System.Array)(Object)keys, (cli.System.Array)(Object)newkeys, len);
- cli.System.Array.Copy((cli.System.Array)(Object)values, (cli.System.Array)(Object)newvalues, len);
- keys = newkeys;
- values = newvalues;
- for (int i = len; i < keys.length; i++)
- {
- keys[i] = new WeakReference(null, true);
- GC.SuppressFinalize(keys[i]);
- }
- keys[len].set_Target(key);
- values[len] = value;
- }
- }
-
- public synchronized Object get(Object key)
- {
- for (int i = 0; i < keys.length; i++)
- {
- if (keys[i].get_Target() == key)
- {
- return values[i];
- }
- }
- return null;
- }
-
- public synchronized boolean containsKey(Object key)
- {
- for (int i = 0; i < keys.length; i++)
- {
- if (keys[i].get_Target() == key)
- {
- return true;
- }
- }
- return false;
- }
-}