Implement inlining of Array constructor in JS BE

See KT-15456
This commit is contained in:
Alexey Andreev
2017-04-28 16:24:31 +03:00
parent 6523f237a6
commit 1900b20e6e
16 changed files with 156 additions and 71 deletions
@@ -28,7 +28,6 @@ import org.jetbrains.kotlin.js.inline.util.IdentitySet
import org.jetbrains.kotlin.js.inline.util.isCallInvocation
import org.jetbrains.kotlin.js.parser.parseFunction
import org.jetbrains.kotlin.js.translate.context.Namer
import org.jetbrains.kotlin.js.translate.reference.CallExpressionTranslator
import org.jetbrains.kotlin.js.translate.utils.JsDescriptorUtils.getModuleName
import org.jetbrains.kotlin.resolve.descriptorUtil.isExtension
import org.jetbrains.kotlin.resolve.inline.InlineStrategy
@@ -143,7 +142,7 @@ class FunctionReader(private val config: JsConfig, private val currentModuleName
private fun readFunctionFromSource(descriptor: CallableDescriptor, info: ModuleInfo): JsFunction? {
val source = info.fileContent
val tag = Namer.getFunctionTag(descriptor)
val tag = Namer.getFunctionTag(descriptor, config)
val index = source.indexOf(tag)
if (index < 0) return null
@@ -174,8 +173,6 @@ private fun JsFunction.markInlineArguments(descriptor: CallableDescriptor) {
val offset = if (descriptor.isExtension) 1 else 0
for ((i, param) in params.withIndex()) {
if (!CallExpressionTranslator.shouldBeInlined(descriptor)) continue
val type = param.type
if (!type.isFunctionTypeOrSubtype) continue
@@ -47,6 +47,7 @@ import static org.jetbrains.kotlin.js.translate.utils.JsAstUtils.flattenStatemen
public class JsInliner extends JsVisitorWithContextImpl {
private final JsConfig config;
private final Map<JsName, JsFunction> functions;
private final Map<String, JsFunction> accessors;
private final Stack<JsInliningContext> inliningContexts = new Stack<>();
@@ -76,7 +77,7 @@ public class JsInliner extends JsVisitorWithContextImpl {
accessorInvocationTransformer.accept(fragment.getInitializerBlock());
}
FunctionReader functionReader = new FunctionReader(config, currentModuleName, fragments);
JsInliner inliner = new JsInliner(functions, accessors, functionReader, trace);
JsInliner inliner = new JsInliner(config, functions, accessors, functionReader, trace);
for (JsProgramFragment fragment : fragmentsToProcess) {
inliner.inliningContexts.push(inliner.new JsInliningContext());
inliner.accept(fragment.getDeclarationBlock());
@@ -92,11 +93,13 @@ public class JsInliner extends JsVisitorWithContextImpl {
}
private JsInliner(
@NotNull JsConfig config,
@NotNull Map<JsName, JsFunction> functions,
@NotNull Map<String, JsFunction> accessors,
@NotNull FunctionReader functionReader,
@NotNull DiagnosticSink trace
) {
this.config = config;
this.functions = functions;
this.accessors = accessors;
this.functionReader = functionReader;
@@ -285,7 +288,7 @@ public class JsInliner extends JsVisitorWithContextImpl {
private final FunctionContext functionContext;
JsInliningContext() {
functionContext = new FunctionContext(functionReader) {
functionContext = new FunctionContext(functionReader, config) {
@Nullable
@Override
protected JsFunction lookUpStaticFunction(@Nullable JsName functionName) {
@@ -19,11 +19,12 @@ package org.jetbrains.kotlin.js.inline.context
import org.jetbrains.kotlin.js.backend.ast.*
import org.jetbrains.kotlin.js.backend.ast.metadata.isCallableReference
import org.jetbrains.kotlin.js.backend.ast.metadata.descriptor
import org.jetbrains.kotlin.js.config.JsConfig
import org.jetbrains.kotlin.js.inline.FunctionReader
import org.jetbrains.kotlin.js.inline.util.*
import org.jetbrains.kotlin.js.translate.context.Namer
abstract class FunctionContext(private val functionReader: FunctionReader) {
abstract class FunctionContext(private val functionReader: FunctionReader, private val config: JsConfig) {
protected abstract fun lookUpStaticFunction(functionName: JsName?): JsFunction?
protected abstract fun lookUpStaticFunctionByTag(functionTag: String): JsFunction?
@@ -70,7 +71,7 @@ abstract class FunctionContext(private val functionReader: FunctionReader) {
val descriptor = call.descriptor
if (descriptor != null) {
if (descriptor in functionReader) return functionReader[descriptor]
lookUpStaticFunctionByTag(Namer.getFunctionTag(descriptor))?.let { return it }
lookUpStaticFunctionByTag(Namer.getFunctionTag(descriptor, config))?.let { return it }
}
/** remove ending `()` */