New generated lambda naming

This commit is contained in:
Mikhael Bogdanov
2014-01-30 14:20:58 +04:00
parent 0ac53da2ed
commit 77979cce1b
4 changed files with 36 additions and 27 deletions
@@ -103,8 +103,6 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
@Nullable @Nullable
private final MemberCodegen parentCodegen; private final MemberCodegen parentCodegen;
private NameGenerator inlineNameGenerator;
/* /*
* When we create a temporary variable to hold some value not to compute it many times * When we create a temporary variable to hold some value not to compute it many times
* we put it into this map to emit access to that variable instead of evaluating the whole expression * we put it into this map to emit access to that variable instead of evaluating the whole expression
@@ -3930,12 +3928,8 @@ The "returned" value of try expression with no finally is either the last expres
} }
public NameGenerator getInlineNameGenerator() { public NameGenerator getInlineNameGenerator() {
if (inlineNameGenerator == null) { NameGenerator nameGenerator = getParentCodegen().getInlineNameGenerator();
CodegenContext context = getContext(); Name name = context.getContextDescriptor().getName();
String prefix = InlineCodegenUtil.getInlineName(context, typeMapper); return nameGenerator.subGenerator((name.isSpecial() ? "$special" : name.asString()) + "$$inlined" );
inlineNameGenerator = new NameGenerator(prefix + "$$inline");
}
return inlineNameGenerator;
} }
} }
@@ -19,20 +19,18 @@ package org.jetbrains.jet.codegen;
import com.intellij.openapi.progress.ProcessCanceledException; import com.intellij.openapi.progress.ProcessCanceledException;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.codegen.asm.InlineCodegenUtil;
import org.jetbrains.jet.codegen.asm.NameGenerator;
import org.jetbrains.jet.codegen.context.ClassContext; import org.jetbrains.jet.codegen.context.ClassContext;
import org.jetbrains.jet.codegen.context.CodegenContext; import org.jetbrains.jet.codegen.context.CodegenContext;
import org.jetbrains.jet.codegen.context.FieldOwnerContext; import org.jetbrains.jet.codegen.context.FieldOwnerContext;
import org.jetbrains.jet.codegen.state.GenerationState; import org.jetbrains.jet.codegen.state.GenerationState;
import org.jetbrains.jet.lang.descriptors.ClassDescriptor; import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor;
import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.name.SpecialNames; import org.jetbrains.jet.lang.resolve.name.SpecialNames;
import org.jetbrains.jet.lang.types.ErrorUtils; import org.jetbrains.jet.lang.types.ErrorUtils;
import java.util.HashMap;
import java.util.Map;
public class MemberCodegen extends ParentCodegenAwareImpl { public class MemberCodegen extends ParentCodegenAwareImpl {
@@ -40,14 +38,13 @@ public class MemberCodegen extends ParentCodegenAwareImpl {
private final ClassBuilder builder; private final ClassBuilder builder;
@NotNull private NameGenerator inlineNameGenerator;
private Map<FunctionDescriptor, ClosureCodegen> inlinedClosures = new HashMap<FunctionDescriptor, ClosureCodegen>();
public MemberCodegen( public MemberCodegen(
@NotNull GenerationState state, @NotNull GenerationState state,
@Nullable MemberCodegen parentCodegen, @Nullable MemberCodegen parentCodegen,
FieldOwnerContext context, @NotNull FieldOwnerContext context,
ClassBuilder builder @Nullable ClassBuilder builder
) { ) {
super(state, parentCodegen); super(state, parentCodegen);
this.context = context; this.context = context;
@@ -138,4 +135,13 @@ public class MemberCodegen extends ParentCodegenAwareImpl {
public ClassBuilder getBuilder() { public ClassBuilder getBuilder() {
return builder; return builder;
} }
public NameGenerator getInlineNameGenerator() {
if (inlineNameGenerator == null) {
String prefix = InlineCodegenUtil.getInlineName(context, typeMapper);
inlineNameGenerator = new NameGenerator(prefix);
}
return inlineNameGenerator;
}
} }
@@ -139,24 +139,24 @@ public class InlineCodegenUtil {
if (currentDescriptor instanceof PackageFragmentDescriptor) { if (currentDescriptor instanceof PackageFragmentDescriptor) {
file = getContainingFile(codegenContext, typeMapper); file = getContainingFile(codegenContext, typeMapper);
Type packageFragmentType = null; Type packagePartType;
if (file == null) { if (file == null) {
//in case package fragment clinit //in case package fragment clinit
if (codegenContext.getParentContext() instanceof PackageContext) { assert codegenContext instanceof PackageContext : "Expected package context but " + codegenContext;
packageFragmentType = ((PackageContext) codegenContext.getParentContext()).getPackagePartType(); packagePartType = ((PackageContext) codegenContext).getPackagePartType();
}
} else { } else {
packageFragmentType = packagePartType =
PackageCodegen.getPackagePartType(PackageClassUtils.getPackageClassFqName(getFqName(currentDescriptor).toSafe()), PackageCodegen.getPackagePartType(PackageClassUtils.getPackageClassFqName(getFqName(currentDescriptor).toSafe()),
file.getVirtualFile()); file.getVirtualFile());
} }
if (packageFragmentType == null) { if (packagePartType == null) {
DeclarationDescriptor contextDescriptor = codegenContext.getContextDescriptor(); DeclarationDescriptor contextDescriptor = codegenContext.getContextDescriptor();
//noinspection ConstantConditions
throw new RuntimeException("Couldn't find declaration for " + contextDescriptor.getContainingDeclaration().getName() + "." + contextDescriptor.getName() ); throw new RuntimeException("Couldn't find declaration for " + contextDescriptor.getContainingDeclaration().getName() + "." + contextDescriptor.getName() );
} }
return packageFragmentType.getInternalName().replace('.', '/'); return packagePartType.getInternalName().replace('.', '/');
} }
else if (currentDescriptor instanceof ClassifierDescriptor) { else if (currentDescriptor instanceof ClassifierDescriptor) {
Type type = typeMapper.mapType((ClassifierDescriptor) currentDescriptor); Type type = typeMapper.mapType((ClassifierDescriptor) currentDescriptor);
@@ -170,10 +170,9 @@ public class InlineCodegenUtil {
} }
} }
assert currentDescriptor != null : "Wrong descriptor hierarchy " + currentDescriptor;
String suffix = currentDescriptor.getName().isSpecial() ? "" : currentDescriptor.getName().asString(); String suffix = currentDescriptor.getName().isSpecial() ? "" : currentDescriptor.getName().asString();
//noinspection ConstantConditions
return getInlineName(codegenContext, currentDescriptor.getContainingDeclaration(), typeMapper) + "$" + suffix; return getInlineName(codegenContext, currentDescriptor.getContainingDeclaration(), typeMapper) + "$" + suffix;
} }
@@ -16,12 +16,17 @@
package org.jetbrains.jet.codegen.asm; package org.jetbrains.jet.codegen.asm;
import java.util.HashMap;
import java.util.Map;
public class NameGenerator { public class NameGenerator {
private final String ownerMethod; private final String ownerMethod;
private int nextIndex = 1; private int nextIndex = 1;
private final Map<String, NameGenerator> subGenerators = new HashMap<String, NameGenerator>();
public NameGenerator(String onwerMethod) { public NameGenerator(String onwerMethod) {
this.ownerMethod = onwerMethod; this.ownerMethod = onwerMethod;
} }
@@ -31,6 +36,11 @@ public class NameGenerator {
} }
public NameGenerator subGenerator(String inliningMethod) { public NameGenerator subGenerator(String inliningMethod) {
return new NameGenerator(ownerMethod+ "$" + inliningMethod + nextIndex++); NameGenerator generator = subGenerators.get(inliningMethod);
if (generator == null) {
generator = new NameGenerator(ownerMethod+ "$" + inliningMethod);
subGenerators.put(inliningMethod, generator);
}
return generator;
} }
} }