From 492404bf044c615c5a6783b86bff9fe55b22d86f Mon Sep 17 00:00:00 2001 From: Zalim Bashorov Date: Thu, 14 May 2015 16:36:52 +0300 Subject: [PATCH] Introduce KeyWithSlice and use it as Key for UserDataHolder in SlicedMap instead of cashing mapping from key to slice(see SlicedMapImpl#keyIdToSlice) --- .../util/slicedMap/AbstractWritableSlice.kt | 24 +++++++++++++++++++ .../util/slicedMap/BasicWritableSlice.java | 9 +------ .../util/slicedMap/DelegatingSlice.java | 3 +-- .../kotlin/util/slicedMap/KeyWithSlice.kt | 23 ++++++++++++++++++ .../kotlin/util/slicedMap/ReadOnlySlice.java | 3 +-- .../kotlin/util/slicedMap/SlicedMapImpl.java | 11 +-------- .../util/slicedMap/TrackingSlicedMap.java | 9 +------ .../kotlin/util/slicedMap/WritableSlice.java | 6 +++++ 8 files changed, 58 insertions(+), 30 deletions(-) create mode 100644 compiler/frontend/src/org/jetbrains/kotlin/util/slicedMap/AbstractWritableSlice.kt create mode 100644 compiler/frontend/src/org/jetbrains/kotlin/util/slicedMap/KeyWithSlice.kt diff --git a/compiler/frontend/src/org/jetbrains/kotlin/util/slicedMap/AbstractWritableSlice.kt b/compiler/frontend/src/org/jetbrains/kotlin/util/slicedMap/AbstractWritableSlice.kt new file mode 100644 index 00000000000..2169d168552 --- /dev/null +++ b/compiler/frontend/src/org/jetbrains/kotlin/util/slicedMap/AbstractWritableSlice.kt @@ -0,0 +1,24 @@ +/* + * Copyright 2010-2015 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.kotlin.util.slicedMap + +abstract class AbstractWritableSlice(debugName: String) : KeyWithSlice>(debugName), WritableSlice { + override val slice: WritableSlice + get() = this + + override fun getKey(): AbstractWritableSlice = this +} diff --git a/compiler/frontend/src/org/jetbrains/kotlin/util/slicedMap/BasicWritableSlice.java b/compiler/frontend/src/org/jetbrains/kotlin/util/slicedMap/BasicWritableSlice.java index e08ec29385d..610a7d87a46 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/util/slicedMap/BasicWritableSlice.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/util/slicedMap/BasicWritableSlice.java @@ -16,13 +16,12 @@ package org.jetbrains.kotlin.util.slicedMap; -import com.intellij.openapi.util.Key; import org.jetbrains.annotations.NotNull; import java.lang.reflect.Field; import java.lang.reflect.Modifier; -public class BasicWritableSlice extends Key implements WritableSlice { +public class BasicWritableSlice extends AbstractWritableSlice { public static Void initSliceDebugNames(Class declarationOwner) { for (Field field : declarationOwner.getFields()) { @@ -55,12 +54,6 @@ public class BasicWritableSlice extends Key implements WritableSlice getKey() { - return this; - } - // True to put, false to skip @Override public boolean check(K key, V value) { diff --git a/compiler/frontend/src/org/jetbrains/kotlin/util/slicedMap/DelegatingSlice.java b/compiler/frontend/src/org/jetbrains/kotlin/util/slicedMap/DelegatingSlice.java index 6a58a3b0103..424c3963195 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/util/slicedMap/DelegatingSlice.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/util/slicedMap/DelegatingSlice.java @@ -16,7 +16,6 @@ package org.jetbrains.kotlin.util.slicedMap; -import com.intellij.openapi.util.Key; import org.jetbrains.annotations.NotNull; /** @@ -51,7 +50,7 @@ public class DelegatingSlice implements WritableSlice { @Override @NotNull - public Key getKey() { + public KeyWithSlice> getKey() { return delegate.getKey(); } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/util/slicedMap/KeyWithSlice.kt b/compiler/frontend/src/org/jetbrains/kotlin/util/slicedMap/KeyWithSlice.kt new file mode 100644 index 00000000000..151fd871bf2 --- /dev/null +++ b/compiler/frontend/src/org/jetbrains/kotlin/util/slicedMap/KeyWithSlice.kt @@ -0,0 +1,23 @@ +/* + * Copyright 2010-2015 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.kotlin.util.slicedMap + +import com.intellij.openapi.util.Key + +abstract class KeyWithSlice>(debugName: String) : Key(debugName) { + abstract val slice: Slice +} diff --git a/compiler/frontend/src/org/jetbrains/kotlin/util/slicedMap/ReadOnlySlice.java b/compiler/frontend/src/org/jetbrains/kotlin/util/slicedMap/ReadOnlySlice.java index 2157f21a880..1305fb7d611 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/util/slicedMap/ReadOnlySlice.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/util/slicedMap/ReadOnlySlice.java @@ -16,12 +16,11 @@ package org.jetbrains.kotlin.util.slicedMap; -import com.intellij.openapi.util.Key; import org.jetbrains.annotations.NotNull; public interface ReadOnlySlice { @NotNull - Key getKey(); + KeyWithSlice> getKey(); V computeValue(SlicedMap map, K key, V value, boolean valueNotFound); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/util/slicedMap/SlicedMapImpl.java b/compiler/frontend/src/org/jetbrains/kotlin/util/slicedMap/SlicedMapImpl.java index fc23f100d01..7b519ab6d13 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/util/slicedMap/SlicedMapImpl.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/util/slicedMap/SlicedMapImpl.java @@ -22,7 +22,6 @@ import com.google.common.collect.Multimap; import com.intellij.openapi.util.Key; import com.intellij.openapi.util.UserDataHolder; import gnu.trove.THashMap; -import gnu.trove.TIntObjectHashMap; import kotlin.Function3; import org.jetbrains.annotations.NotNull; @@ -31,8 +30,6 @@ import java.util.Map; public class SlicedMapImpl implements MutableSlicedMap { - private static final TIntObjectHashMap keyIdToSlice = new TIntObjectHashMap(); - public static SlicedMapImpl create() { return new SlicedMapImpl(); } @@ -69,11 +66,6 @@ public class SlicedMapImpl implements MutableSlicedMap { collectiveSliceKeys.put(slice, key); } - int sliceKeyId = sliceKey.hashCode(); - if (!keyIdToSlice.contains(sliceKeyId)) { - keyIdToSlice.put(sliceKeyId, slice); - } - holder.putUserData(sliceKey, value); slice.afterPut(this, key, value); } @@ -126,10 +118,9 @@ public class SlicedMapImpl implements MutableSlicedMap { if (holder == null) continue; for (Key sliceKey : holder.getKeys()) { - WritableSlice slice = keyIdToSlice.get(sliceKey.hashCode()); Object value = holder.getUserData(sliceKey); - f.invoke(slice, key, value); + f.invoke(((AbstractWritableSlice) sliceKey).getSlice(), key, value); } } } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/util/slicedMap/TrackingSlicedMap.java b/compiler/frontend/src/org/jetbrains/kotlin/util/slicedMap/TrackingSlicedMap.java index 935608f8130..5da6902e2c0 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/util/slicedMap/TrackingSlicedMap.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/util/slicedMap/TrackingSlicedMap.java @@ -18,7 +18,6 @@ package org.jetbrains.kotlin.util.slicedMap; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Maps; -import com.intellij.openapi.util.Key; import kotlin.Function3; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.TestOnly; @@ -137,7 +136,7 @@ public class TrackingSlicedMap extends SlicedMapImpl { } } - private class SliceWithStackTrace extends Key> implements RemovableSlice> { + private class SliceWithStackTrace extends AbstractWritableSlice> implements RemovableSlice> { private final ReadOnlySlice delegate; @@ -148,12 +147,6 @@ public class TrackingSlicedMap extends SlicedMapImpl { // Methods of ReadOnlySlice - @Override - @NotNull - public Key> getKey() { - return this; - } - @Override public TrackableValue computeValue(SlicedMap map, K key, TrackableValue value, boolean valueNotFound) { return new TrackableValue(delegate.computeValue(map, key, value == null ? null : value.value, valueNotFound), trackWithStackTraces); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/util/slicedMap/WritableSlice.java b/compiler/frontend/src/org/jetbrains/kotlin/util/slicedMap/WritableSlice.java index 70469089a25..e7faf216c75 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/util/slicedMap/WritableSlice.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/util/slicedMap/WritableSlice.java @@ -16,7 +16,13 @@ package org.jetbrains.kotlin.util.slicedMap; +import org.jetbrains.annotations.NotNull; + public interface WritableSlice extends ReadOnlySlice { + @NotNull + @Override + KeyWithSlice> getKey(); + // True to put, false to skip boolean check(K key, V value);