JS backend: don't search function intrinsic twice.
Use thashmap instead of hasmap -- less memory usage. (cherry picked from commit e617f8f)
This commit is contained in:
+5
-4
@@ -17,7 +17,7 @@
|
|||||||
package org.jetbrains.k2js.translate.intrinsic.functions;
|
package org.jetbrains.k2js.translate.intrinsic.functions;
|
||||||
|
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
import com.google.common.collect.Maps;
|
import gnu.trove.THashMap;
|
||||||
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;
|
||||||
@@ -30,7 +30,7 @@ import java.util.Map;
|
|||||||
public final class FunctionIntrinsics {
|
public final class FunctionIntrinsics {
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
private final Map<FunctionDescriptor, FunctionIntrinsic> intrinsicCache = Maps.newHashMap();
|
private final Map<FunctionDescriptor, FunctionIntrinsic> intrinsicCache = new THashMap<FunctionDescriptor, FunctionIntrinsic>();
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
private final List<FunctionIntrinsicFactory> factories = Lists.newArrayList();
|
private final List<FunctionIntrinsicFactory> factories = Lists.newArrayList();
|
||||||
@@ -77,8 +77,9 @@ public final class FunctionIntrinsics {
|
|||||||
@NotNull
|
@NotNull
|
||||||
private FunctionIntrinsic computeIntrinsic(@NotNull FunctionDescriptor descriptor) {
|
private FunctionIntrinsic computeIntrinsic(@NotNull FunctionDescriptor descriptor) {
|
||||||
for (FunctionIntrinsicFactory factory : factories) {
|
for (FunctionIntrinsicFactory factory : factories) {
|
||||||
if (factory.getPredicate().apply(descriptor)) {
|
FunctionIntrinsic intrinsic = factory.getIntrinsic(descriptor);
|
||||||
return factory.getIntrinsic(descriptor);
|
if (intrinsic != null) {
|
||||||
|
return intrinsic;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return FunctionIntrinsic.NO_INTRINSIC;
|
return FunctionIntrinsic.NO_INTRINSIC;
|
||||||
|
|||||||
+2
-21
@@ -27,7 +27,6 @@ import org.jetbrains.jet.lang.descriptors.FunctionDescriptor;
|
|||||||
import org.jetbrains.k2js.translate.context.TranslationContext;
|
import org.jetbrains.k2js.translate.context.TranslationContext;
|
||||||
import org.jetbrains.k2js.translate.intrinsic.functions.basic.BuiltInPropertyIntrinsic;
|
import org.jetbrains.k2js.translate.intrinsic.functions.basic.BuiltInPropertyIntrinsic;
|
||||||
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.utils.JsAstUtils;
|
import org.jetbrains.k2js.translate.utils.JsAstUtils;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -52,19 +51,9 @@ public abstract class CompositeFIF implements FunctionIntrinsicFactory {
|
|||||||
protected CompositeFIF() {
|
protected CompositeFIF() {
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
|
||||||
@Override
|
|
||||||
public DescriptorPredicate getPredicate() {
|
|
||||||
return new DescriptorPredicate() {
|
|
||||||
@Override
|
|
||||||
public boolean apply(@NotNull FunctionDescriptor descriptor) {
|
|
||||||
return findIntrinsic(descriptor) != null;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
public FunctionIntrinsic findIntrinsic(@NotNull FunctionDescriptor descriptor) {
|
@Override
|
||||||
|
public FunctionIntrinsic getIntrinsic(@NotNull FunctionDescriptor descriptor) {
|
||||||
for (Pair<Predicate<FunctionDescriptor>, FunctionIntrinsic> entry : patternsAndIntrinsics) {
|
for (Pair<Predicate<FunctionDescriptor>, FunctionIntrinsic> entry : patternsAndIntrinsics) {
|
||||||
if (entry.first.apply(descriptor)) {
|
if (entry.first.apply(descriptor)) {
|
||||||
return entry.second;
|
return entry.second;
|
||||||
@@ -73,14 +62,6 @@ public abstract class CompositeFIF implements FunctionIntrinsicFactory {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
|
||||||
@Override
|
|
||||||
public FunctionIntrinsic getIntrinsic(@NotNull FunctionDescriptor descriptor) {
|
|
||||||
FunctionIntrinsic intrinsic = findIntrinsic(descriptor);
|
|
||||||
assert intrinsic != null;
|
|
||||||
return intrinsic;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void add(@NotNull Predicate<FunctionDescriptor> pattern, @NotNull FunctionIntrinsic intrinsic) {
|
protected void add(@NotNull Predicate<FunctionDescriptor> pattern, @NotNull FunctionIntrinsic intrinsic) {
|
||||||
patternsAndIntrinsics.add(Pair.create(pattern, intrinsic));
|
patternsAndIntrinsics.add(Pair.create(pattern, intrinsic));
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-6
@@ -16,16 +16,12 @@
|
|||||||
|
|
||||||
package org.jetbrains.k2js.translate.intrinsic.functions.factories;
|
package org.jetbrains.k2js.translate.intrinsic.functions.factories;
|
||||||
|
|
||||||
import com.google.common.base.Predicate;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
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;
|
||||||
|
|
||||||
public interface FunctionIntrinsicFactory {
|
public interface FunctionIntrinsicFactory {
|
||||||
|
@Nullable
|
||||||
@NotNull
|
|
||||||
Predicate<FunctionDescriptor> getPredicate();
|
|
||||||
|
|
||||||
@NotNull
|
|
||||||
FunctionIntrinsic getIntrinsic(@NotNull FunctionDescriptor descriptor);
|
FunctionIntrinsic getIntrinsic(@NotNull FunctionDescriptor descriptor);
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-4
@@ -24,7 +24,6 @@ import com.google.dart.compiler.backend.js.ast.JsNameRef;
|
|||||||
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.resolve.name.Name;
|
import org.jetbrains.jet.lang.resolve.name.Name;
|
||||||
import org.jetbrains.jet.lang.types.expressions.OperatorConventions;
|
|
||||||
import org.jetbrains.k2js.translate.context.TranslationContext;
|
import org.jetbrains.k2js.translate.context.TranslationContext;
|
||||||
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.NamePredicate;
|
import org.jetbrains.k2js.translate.intrinsic.functions.patterns.NamePredicate;
|
||||||
@@ -50,11 +49,10 @@ public final class NumberConversionFIF extends CompositeFIF {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
private static final NamePredicate FLOATING_POINT_CONVERSIONS = new NamePredicate(OperatorConventions.FLOAT, OperatorConventions.DOUBLE);
|
private static final NamePredicate FLOATING_POINT_CONVERSIONS = new NamePredicate(FLOAT, DOUBLE);
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
private static final NamePredicate INTEGER_CONVERSIONS = new NamePredicate(OperatorConventions.INT, OperatorConventions.SHORT,
|
private static final NamePredicate INTEGER_CONVERSIONS = new NamePredicate(INT, SHORT, BYTE);
|
||||||
OperatorConventions.BYTE);
|
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
private static final FunctionIntrinsic RETURN_RECEIVER = new FunctionIntrinsic() {
|
private static final FunctionIntrinsic RETURN_RECEIVER = new FunctionIntrinsic() {
|
||||||
|
|||||||
+11
-11
@@ -56,7 +56,7 @@ public enum PrimitiveBinaryOperationFIF implements FunctionIntrinsicFactory {
|
|||||||
HasArguments numberRangeConstructorInvocation = context.isEcma5() ? new JsInvocation(expr) : new JsNew(expr);
|
HasArguments numberRangeConstructorInvocation = context.isEcma5() ? new JsInvocation(expr) : new JsNew(expr);
|
||||||
//TODO: add tests and correct expression for reversed ranges.
|
//TODO: add tests and correct expression for reversed ranges.
|
||||||
setArguments(numberRangeConstructorInvocation, rangeStart, rangeEnd);
|
setArguments(numberRangeConstructorInvocation, rangeStart, rangeEnd);
|
||||||
return (JsExpression) numberRangeConstructorInvocation;
|
return numberRangeConstructorInvocation;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -77,7 +77,10 @@ public enum PrimitiveBinaryOperationFIF implements FunctionIntrinsicFactory {
|
|||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
private static final NamePredicate BINARY_OPERATIONS = new NamePredicate(OperatorConventions.BINARY_OPERATION_NAMES.values());
|
private static final NamePredicate BINARY_OPERATIONS = new NamePredicate(OperatorConventions.BINARY_OPERATION_NAMES.values());
|
||||||
|
private static final DescriptorPredicate PRIMITIVE_NUMBERS_BINARY_OPERATIONS = pattern(NamePredicate.PRIMITIVE_NUMBERS, BINARY_OPERATIONS);
|
||||||
private static final DescriptorPredicate INT_WITH_BIT_OPERATIONS = pattern("Int.or|and|xor|shl|shr|ushr");
|
private static final DescriptorPredicate INT_WITH_BIT_OPERATIONS = pattern("Int.or|and|xor|shl|shr|ushr");
|
||||||
|
private static final DescriptorPredicate BOOLEAN_OPERATIONS = pattern("Boolean.or|and|xor");
|
||||||
|
private static final DescriptorPredicate STRING_PLUS = pattern("String.plus");
|
||||||
|
|
||||||
private static final ImmutableMap<String, JsBinaryOperator> BINARY_BITWISE_OPERATIONS = ImmutableMap.<String, JsBinaryOperator>builder()
|
private static final ImmutableMap<String, JsBinaryOperator> BINARY_BITWISE_OPERATIONS = ImmutableMap.<String, JsBinaryOperator>builder()
|
||||||
.put("or", JsBinaryOperator.BIT_OR)
|
.put("or", JsBinaryOperator.BIT_OR)
|
||||||
@@ -88,19 +91,16 @@ public enum PrimitiveBinaryOperationFIF implements FunctionIntrinsicFactory {
|
|||||||
.put("ushr", JsBinaryOperator.SHRU)
|
.put("ushr", JsBinaryOperator.SHRU)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
@NotNull
|
private static final Predicate<FunctionDescriptor> PREDICATE = Predicates.or(PRIMITIVE_NUMBERS_BINARY_OPERATIONS, BOOLEAN_OPERATIONS,
|
||||||
@Override
|
STRING_PLUS, INT_WITH_BIT_OPERATIONS);
|
||||||
public Predicate<FunctionDescriptor> getPredicate() {
|
|
||||||
//TODO: check that it is binary operation
|
|
||||||
return Predicates.or(INT_WITH_BIT_OPERATIONS,
|
|
||||||
pattern(NamePredicate.PRIMITIVE_NUMBERS, BINARY_OPERATIONS),
|
|
||||||
pattern("Boolean.or|and|xor"),
|
|
||||||
pattern("String.plus"));
|
|
||||||
}
|
|
||||||
|
|
||||||
@NotNull
|
@Nullable
|
||||||
@Override
|
@Override
|
||||||
public FunctionIntrinsic getIntrinsic(@NotNull FunctionDescriptor descriptor) {
|
public FunctionIntrinsic getIntrinsic(@NotNull FunctionDescriptor descriptor) {
|
||||||
|
if (!PREDICATE.apply(descriptor)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
if (pattern(INTEGER_NUMBER_TYPES + ".div").apply(descriptor)) {
|
if (pattern(INTEGER_NUMBER_TYPES + ".div").apply(descriptor)) {
|
||||||
return INTEGER_DIVISION_INTRINSIC;
|
return INTEGER_DIVISION_INTRINSIC;
|
||||||
}
|
}
|
||||||
|
|||||||
+5
-7
@@ -60,15 +60,13 @@ public enum PrimitiveUnaryOperationFIF implements FunctionIntrinsicFactory {
|
|||||||
@NotNull
|
@NotNull
|
||||||
private static final Predicate<FunctionDescriptor> PATTERN = Predicates.and(PRIMITIVE_UNARY_OPERATION_NAMES, NO_PARAMETERS);
|
private static final Predicate<FunctionDescriptor> PATTERN = Predicates.and(PRIMITIVE_UNARY_OPERATION_NAMES, NO_PARAMETERS);
|
||||||
|
|
||||||
@NotNull
|
@Nullable
|
||||||
@Override
|
|
||||||
public Predicate<FunctionDescriptor> getPredicate() {
|
|
||||||
return PATTERN;
|
|
||||||
}
|
|
||||||
|
|
||||||
@NotNull
|
|
||||||
@Override
|
@Override
|
||||||
public FunctionIntrinsic getIntrinsic(@NotNull FunctionDescriptor descriptor) {
|
public FunctionIntrinsic getIntrinsic(@NotNull FunctionDescriptor descriptor) {
|
||||||
|
if (!PATTERN.apply(descriptor)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
Name name = descriptor.getName();
|
Name name = descriptor.getName();
|
||||||
|
|
||||||
JsUnaryOperator jsOperator;
|
JsUnaryOperator jsOperator;
|
||||||
|
|||||||
Reference in New Issue
Block a user