From 77979cce1bc169833b0ca4d37db2244b28648a43 Mon Sep 17 00:00:00 2001 From: Mikhael Bogdanov Date: Thu, 30 Jan 2014 14:20:58 +0400 Subject: [PATCH] New generated lambda naming --- .../jet/codegen/ExpressionCodegen.java | 12 +++------- .../jetbrains/jet/codegen/MemberCodegen.java | 22 ++++++++++++------- .../jet/codegen/asm/InlineCodegenUtil.java | 17 +++++++------- .../jet/codegen/asm/NameGenerator.java | 12 +++++++++- 4 files changed, 36 insertions(+), 27 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index 0d7fef41b36..9c017c89f5d 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -103,8 +103,6 @@ public class ExpressionCodegen extends JetVisitor implem @Nullable private final MemberCodegen parentCodegen; - private NameGenerator inlineNameGenerator; - /* * 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 @@ -3930,12 +3928,8 @@ The "returned" value of try expression with no finally is either the last expres } public NameGenerator getInlineNameGenerator() { - if (inlineNameGenerator == null) { - CodegenContext context = getContext(); - String prefix = InlineCodegenUtil.getInlineName(context, typeMapper); - - inlineNameGenerator = new NameGenerator(prefix + "$$inline"); - } - return inlineNameGenerator; + NameGenerator nameGenerator = getParentCodegen().getInlineNameGenerator(); + Name name = context.getContextDescriptor().getName(); + return nameGenerator.subGenerator((name.isSpecial() ? "$special" : name.asString()) + "$$inlined" ); } } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/MemberCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/MemberCodegen.java index dc789df9628..4902e2c481f 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/MemberCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/MemberCodegen.java @@ -19,20 +19,18 @@ package org.jetbrains.jet.codegen; import com.intellij.openapi.progress.ProcessCanceledException; import org.jetbrains.annotations.NotNull; 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.CodegenContext; import org.jetbrains.jet.codegen.context.FieldOwnerContext; import org.jetbrains.jet.codegen.state.GenerationState; 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.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.name.SpecialNames; import org.jetbrains.jet.lang.types.ErrorUtils; -import java.util.HashMap; -import java.util.Map; - public class MemberCodegen extends ParentCodegenAwareImpl { @@ -40,14 +38,13 @@ public class MemberCodegen extends ParentCodegenAwareImpl { private final ClassBuilder builder; - @NotNull - private Map inlinedClosures = new HashMap(); + private NameGenerator inlineNameGenerator; public MemberCodegen( @NotNull GenerationState state, @Nullable MemberCodegen parentCodegen, - FieldOwnerContext context, - ClassBuilder builder + @NotNull FieldOwnerContext context, + @Nullable ClassBuilder builder ) { super(state, parentCodegen); this.context = context; @@ -138,4 +135,13 @@ public class MemberCodegen extends ParentCodegenAwareImpl { public ClassBuilder getBuilder() { return builder; } + + public NameGenerator getInlineNameGenerator() { + if (inlineNameGenerator == null) { + String prefix = InlineCodegenUtil.getInlineName(context, typeMapper); + + inlineNameGenerator = new NameGenerator(prefix); + } + return inlineNameGenerator; + } } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/asm/InlineCodegenUtil.java b/compiler/backend/src/org/jetbrains/jet/codegen/asm/InlineCodegenUtil.java index 409f8f1fd00..b1155193fe5 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/asm/InlineCodegenUtil.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/asm/InlineCodegenUtil.java @@ -139,24 +139,24 @@ public class InlineCodegenUtil { if (currentDescriptor instanceof PackageFragmentDescriptor) { file = getContainingFile(codegenContext, typeMapper); - Type packageFragmentType = null; + Type packagePartType; if (file == null) { //in case package fragment clinit - if (codegenContext.getParentContext() instanceof PackageContext) { - packageFragmentType = ((PackageContext) codegenContext.getParentContext()).getPackagePartType(); - } + assert codegenContext instanceof PackageContext : "Expected package context but " + codegenContext; + packagePartType = ((PackageContext) codegenContext).getPackagePartType(); } else { - packageFragmentType = + packagePartType = PackageCodegen.getPackagePartType(PackageClassUtils.getPackageClassFqName(getFqName(currentDescriptor).toSafe()), file.getVirtualFile()); } - if (packageFragmentType == null) { + if (packagePartType == null) { DeclarationDescriptor contextDescriptor = codegenContext.getContextDescriptor(); + //noinspection ConstantConditions 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) { 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(); + //noinspection ConstantConditions return getInlineName(codegenContext, currentDescriptor.getContainingDeclaration(), typeMapper) + "$" + suffix; } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/asm/NameGenerator.java b/compiler/backend/src/org/jetbrains/jet/codegen/asm/NameGenerator.java index 3067aa425de..c640a9ad8e2 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/asm/NameGenerator.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/asm/NameGenerator.java @@ -16,12 +16,17 @@ package org.jetbrains.jet.codegen.asm; +import java.util.HashMap; +import java.util.Map; + public class NameGenerator { private final String ownerMethod; private int nextIndex = 1; + private final Map subGenerators = new HashMap(); + public NameGenerator(String onwerMethod) { this.ownerMethod = onwerMethod; } @@ -31,6 +36,11 @@ public class NameGenerator { } 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; } }