JS backend: performance optimization for CompositeFIF -- we don't need hash map.

(cherry picked from commit 7b29a01)
This commit is contained in:
develar
2013-07-24 13:15:16 +04:00
committed by Zalim Bashorov
parent 8302879991
commit 63a72b1095
@@ -17,20 +17,19 @@
package org.jetbrains.k2js.translate.intrinsic.functions.factories; package org.jetbrains.k2js.translate.intrinsic.functions.factories;
import com.google.common.base.Predicate; import com.google.common.base.Predicate;
import com.google.common.base.Predicates; import com.intellij.openapi.util.Pair;
import com.google.common.collect.Maps;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor; import org.jetbrains.jet.lang.descriptors.FunctionDescriptor;
import org.jetbrains.k2js.translate.intrinsic.functions.basic.FunctionIntrinsic; import org.jetbrains.k2js.translate.intrinsic.functions.basic.FunctionIntrinsic;
import org.jetbrains.k2js.translate.intrinsic.functions.patterns.DescriptorPredicate; import org.jetbrains.k2js.translate.intrinsic.functions.patterns.DescriptorPredicate;
import java.util.Collection; import java.util.ArrayList;
import java.util.Map; import java.util.List;
public abstract class CompositeFIF implements FunctionIntrinsicFactory { public abstract class CompositeFIF implements FunctionIntrinsicFactory {
@NotNull
@NotNull final Map<DescriptorPredicate, FunctionIntrinsic> patternToIntrinsic = Maps.newHashMap(); private final List<Pair<DescriptorPredicate, FunctionIntrinsic>> patternsAndIntrinsics = new ArrayList<Pair<DescriptorPredicate, FunctionIntrinsic>>();
protected CompositeFIF() { protected CompositeFIF() {
} }
@@ -38,28 +37,33 @@ public abstract class CompositeFIF implements FunctionIntrinsicFactory {
@NotNull @NotNull
@Override @Override
public Predicate<FunctionDescriptor> getPredicate() { public Predicate<FunctionDescriptor> getPredicate() {
Collection<DescriptorPredicate> patterns = patternToIntrinsic.keySet();
final DescriptorPredicate[] patterns1 = patterns.toArray(new DescriptorPredicate[patterns.size()]);
return new DescriptorPredicate() { return new DescriptorPredicate() {
@Override @Override
public boolean apply(@Nullable FunctionDescriptor descriptor) { public boolean apply(@Nullable FunctionDescriptor descriptor) {
return Predicates.or(patterns1).apply(descriptor); return descriptor != null && findIntrinsic(descriptor) != null;
} }
}; };
} }
@Nullable
public FunctionIntrinsic findIntrinsic(@NotNull FunctionDescriptor descriptor) {
for (Pair<DescriptorPredicate, FunctionIntrinsic> entry : patternsAndIntrinsics) {
if (entry.first.apply(descriptor)) {
return entry.second;
}
}
return null;
}
@NotNull @NotNull
@Override @Override
public FunctionIntrinsic getIntrinsic(@NotNull FunctionDescriptor descriptor) { public FunctionIntrinsic getIntrinsic(@NotNull FunctionDescriptor descriptor) {
for (DescriptorPredicate pattern : patternToIntrinsic.keySet()) { FunctionIntrinsic intrinsic = findIntrinsic(descriptor);
if (pattern.apply(descriptor)) { assert intrinsic != null;
return patternToIntrinsic.get(pattern); return intrinsic;
}
}
throw new IllegalStateException("Must have intrinsic for pattern.");
} }
protected void add(@NotNull DescriptorPredicate pattern, @NotNull FunctionIntrinsic intrinsic) { protected void add(@NotNull DescriptorPredicate pattern, @NotNull FunctionIntrinsic intrinsic) {
patternToIntrinsic.put(pattern, intrinsic); patternsAndIntrinsics.add(Pair.create(pattern, intrinsic));
} }
} }