JS backend: performance optimization for CompositeFIF -- we don't need hash map.
(cherry picked from commit 7b29a01)
This commit is contained in:
+20
-16
@@ -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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user