[scripting] Move earlierScripts to the frontend descriptor
^KT-20488 fixed
This commit is contained in:
@@ -79,10 +79,7 @@ class ScriptCodegen private constructor(
|
||||
classBuilder: ClassBuilder,
|
||||
methodContext: MethodContext
|
||||
) {
|
||||
val jvmSignature = typeMapper.mapScriptSignature(
|
||||
scriptDescriptor,
|
||||
scriptContext.earlierScripts
|
||||
)
|
||||
val jvmSignature = typeMapper.mapScriptSignature(scriptDescriptor)
|
||||
val asmMethod = jvmSignature.asmMethod
|
||||
|
||||
scriptContext.resultFieldInfo?.let { resultFieldInfo ->
|
||||
@@ -129,7 +126,7 @@ class ScriptCodegen private constructor(
|
||||
field.store(value, iv)
|
||||
}
|
||||
|
||||
if (!scriptContext.earlierScripts.isEmpty()) {
|
||||
if (scriptContext.scriptDescriptor.isReplScript) {
|
||||
val scriptsParamIndex = frameMap.enterTemp(AsmUtil.getArrayType(OBJECT_TYPE))
|
||||
|
||||
scriptContext.earlierScripts.forEachIndexed { earlierScriptIndex, earlierScript ->
|
||||
|
||||
@@ -67,8 +67,10 @@ class ScriptContext(
|
||||
}
|
||||
}
|
||||
|
||||
private val ctorExplicitParametersStart = if (scriptDescriptor.earlierScriptsConstructorParameter == null) 0 else 1
|
||||
|
||||
private val ctorImplicitReceiversParametersStart =
|
||||
(scriptDescriptor.getSuperClassNotAny()?.unsubstitutedPrimaryConstructor?.valueParameters?.size ?: 0)
|
||||
ctorExplicitParametersStart + (scriptDescriptor.getSuperClassNotAny()?.unsubstitutedPrimaryConstructor?.valueParameters?.size ?: 0)
|
||||
|
||||
private val ctorProvidedPropertiesParametersStart =
|
||||
ctorImplicitReceiversParametersStart + scriptDescriptor.implicitReceivers.size
|
||||
|
||||
@@ -1204,15 +1204,11 @@ class KotlinTypeMapper @JvmOverloads constructor(
|
||||
return Method(name, desc)
|
||||
}
|
||||
|
||||
fun mapScriptSignature(script: ScriptDescriptor, importedScripts: List<ScriptDescriptor>): JvmMethodSignature {
|
||||
fun mapScriptSignature(script: ScriptDescriptor): JvmMethodSignature {
|
||||
val sw = BothSignatureWriter(BothSignatureWriter.Mode.METHOD)
|
||||
|
||||
sw.writeParametersStart()
|
||||
|
||||
if (importedScripts.isNotEmpty()) {
|
||||
writeParameter(sw, script.module.builtIns.array.defaultType, null)
|
||||
}
|
||||
|
||||
for (valueParameter in script.unsubstitutedPrimaryConstructor.valueParameters) {
|
||||
writeParameter(sw, valueParameter.type, null)/* callableDescriptor = */
|
||||
}
|
||||
|
||||
+7
-7
@@ -75,14 +75,14 @@ open class GenericReplEvaluator(
|
||||
val useScriptArgs = currentScriptArgs?.scriptArgs
|
||||
val useScriptArgsTypes = currentScriptArgs?.scriptArgsTypes?.map { it.java }
|
||||
|
||||
val hasHistory = historyActor.effectiveHistory.isNotEmpty()
|
||||
val constructorParams: Array<Class<*>> =
|
||||
arrayOf<Class<*>>(Array<Any>::class.java) +
|
||||
(useScriptArgs?.mapIndexed { i, it -> useScriptArgsTypes?.getOrNull(i) ?: it?.javaClass ?: Any::class.java } ?: emptyList())
|
||||
|
||||
val constructorParams: Array<Class<*>> = (if (hasHistory) arrayOf<Class<*>>(Array<Any>::class.java) else emptyArray<Class<*>>()) +
|
||||
(useScriptArgs?.mapIndexed { i, it -> useScriptArgsTypes?.getOrNull(i) ?: it?.javaClass ?: Any::class.java } ?: emptyList())
|
||||
|
||||
val constructorArgs: Array<out Any?> = if (hasHistory) arrayOf(historyActor.effectiveHistory.map { it.instance }.takeIf { it.isNotEmpty() }?.toTypedArray(),
|
||||
*(useScriptArgs.orEmpty()))
|
||||
else useScriptArgs.orEmpty()
|
||||
val constructorArgs: Array<out Any?> = arrayOf(
|
||||
historyActor.effectiveHistory.map { it.instance }.takeIf { it.isNotEmpty() }?.toTypedArray(),
|
||||
*(useScriptArgs.orEmpty())
|
||||
)
|
||||
|
||||
// TODO: try/catch ?
|
||||
val scriptInstanceConstructor = scriptClass.getConstructor(*constructorParams)
|
||||
|
||||
+7
-12
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.psi2ir.generators
|
||||
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
|
||||
import org.jetbrains.kotlin.descriptors.ParameterDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.ScriptDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor
|
||||
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
|
||||
import org.jetbrains.kotlin.ir.assertCast
|
||||
import org.jetbrains.kotlin.ir.builders.declarations.IrFunctionBuilder
|
||||
@@ -86,19 +87,9 @@ class ScriptGenerator(declarationGenerator: DeclarationGenerator) : DeclarationG
|
||||
irScript.earlierScripts?.forEach {
|
||||
context.symbolTable.introduceValueParameter(it.owner.thisReceiver)
|
||||
}
|
||||
irScript.earlierScriptsParameter = irScript.earlierScripts?.takeIf { it.isNotEmpty() }?.let {
|
||||
val baseType = context.irBuiltIns.anyType
|
||||
val arrayType = baseType.toArrayOrPrimitiveArrayType(context.irBuiltIns)
|
||||
context.irFactory.createValueParameter(
|
||||
UNDEFINED_OFFSET, UNDEFINED_OFFSET, IrDeclarationOrigin.SCRIPT_EARLIER_SCRIPTS, IrValueParameterSymbolImpl(),
|
||||
Name.special("<earlierScripts>"), parametersIndex++,
|
||||
arrayType, null,
|
||||
false, false, false, false
|
||||
).also { it.parent = irScript }
|
||||
}
|
||||
|
||||
irScript.explicitCallParameters = descriptor.explicitConstructorParameters.map { valueParameterDescriptor ->
|
||||
context.irFactory.createValueParameter(
|
||||
fun createValueParameter(valueParameterDescriptor: ValueParameterDescriptor): IrValueParameter {
|
||||
return context.irFactory.createValueParameter(
|
||||
UNDEFINED_OFFSET, UNDEFINED_OFFSET,
|
||||
IrDeclarationOrigin.SCRIPT_CALL_PARAMETER, IrValueParameterSymbolImpl(),
|
||||
valueParameterDescriptor.name, parametersIndex++,
|
||||
@@ -108,6 +99,10 @@ class ScriptGenerator(declarationGenerator: DeclarationGenerator) : DeclarationG
|
||||
).also { it.parent = irScript }
|
||||
}
|
||||
|
||||
irScript.earlierScriptsParameter = descriptor.earlierScriptsConstructorParameter?.let(::createValueParameter)
|
||||
|
||||
irScript.explicitCallParameters = descriptor.explicitConstructorParameters.map(::createValueParameter)
|
||||
|
||||
irScript.implicitReceiversParameters = descriptor.implicitReceivers.map {
|
||||
makeParameter(it.thisAsReceiverParameter, IrDeclarationOrigin.SCRIPT_IMPLICIT_RECEIVER, parametersIndex++)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user