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;
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.common.collect.Maps;
import com.intellij.openapi.util.Pair;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor;
import org.jetbrains.k2js.translate.intrinsic.functions.basic.FunctionIntrinsic;
import org.jetbrains.k2js.translate.intrinsic.functions.patterns.DescriptorPredicate;
import java.util.Collection;
import java.util.Map;
import java.util.ArrayList;
import java.util.List;
public abstract class CompositeFIF implements FunctionIntrinsicFactory {
@NotNull final Map<DescriptorPredicate, FunctionIntrinsic> patternToIntrinsic = Maps.newHashMap();
@NotNull
private final List<Pair<DescriptorPredicate, FunctionIntrinsic>> patternsAndIntrinsics = new ArrayList<Pair<DescriptorPredicate, FunctionIntrinsic>>();
protected CompositeFIF() {
}
@@ -38,28 +37,33 @@ public abstract class CompositeFIF implements FunctionIntrinsicFactory {
@NotNull
@Override
public Predicate<FunctionDescriptor> getPredicate() {
Collection<DescriptorPredicate> patterns = patternToIntrinsic.keySet();
final DescriptorPredicate[] patterns1 = patterns.toArray(new DescriptorPredicate[patterns.size()]);
return new DescriptorPredicate() {
@Override
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
@Override
public FunctionIntrinsic getIntrinsic(@NotNull FunctionDescriptor descriptor) {
for (DescriptorPredicate pattern : patternToIntrinsic.keySet()) {
if (pattern.apply(descriptor)) {
return patternToIntrinsic.get(pattern);
}
}
throw new IllegalStateException("Must have intrinsic for pattern.");
FunctionIntrinsic intrinsic = findIntrinsic(descriptor);
assert intrinsic != null;
return intrinsic;
}
protected void add(@NotNull DescriptorPredicate pattern, @NotNull FunctionIntrinsic intrinsic) {
patternToIntrinsic.put(pattern, intrinsic);
patternsAndIntrinsics.add(Pair.create(pattern, intrinsic));
}
}