From 29d1231b97c624078ae96c1eee6fc116df0ccdbf Mon Sep 17 00:00:00 2001 From: Michael Bogdanov Date: Mon, 3 Oct 2016 17:16:44 +0300 Subject: [PATCH] Empty vararg support and SyntheticJavaPropertyDescriptor properties --- .../backend/jvm/codegen/ExpressionCodegen.kt | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt index d5517496af3..3faaee5be00 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt @@ -32,9 +32,11 @@ import org.jetbrains.kotlin.ir.declarations.IrVariable import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.util.render import org.jetbrains.kotlin.ir.visitors.IrElementVisitor +import org.jetbrains.kotlin.resolve.descriptorUtil.hasDefaultValue import org.jetbrains.kotlin.resolve.jvm.AsmTypes import org.jetbrains.kotlin.resolve.jvm.AsmTypes.JAVA_THROWABLE_TYPE import org.jetbrains.kotlin.resolve.jvm.AsmTypes.OBJECT_TYPE +import org.jetbrains.kotlin.synthetic.SyntheticJavaPropertyDescriptor import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.org.objectweb.asm.Label import org.jetbrains.org.objectweb.asm.Type @@ -169,7 +171,8 @@ class ExpressionCodegen( } val args = expression.descriptor.valueParameters.mapIndexed { i, valueParameterDescriptor -> - expression.getValueArgument(i) ?: DefaultArg(i) + expression.getValueArgument(i) ?: + if (valueParameterDescriptor.hasDefaultValue()) DefaultArg(i) else Vararg(i) } val defaultMask = DefaultCallArgs(callable.valueParameterTypes.size) @@ -182,6 +185,10 @@ class ExpressionCodegen( pushDefaultValueOnStack(callable.valueParameterTypes[i], mv) defaultMask.mark(expression.index) } + is Vararg -> { + mv.aconst(null) + //empty vararg + } else -> TODO() } } @@ -486,6 +493,15 @@ class ExpressionCodegen( //TODO where is best to unwrap? descriptor = descriptor.underlyingConstructorDescriptor } + if (descriptor is CallableMemberDescriptor && JvmCodegenUtil.getDirectMember(descriptor) is SyntheticJavaPropertyDescriptor) { + val propertyDescriptor = JvmCodegenUtil.getDirectMember(descriptor) as SyntheticJavaPropertyDescriptor + if (descriptor is PropertyGetterDescriptor) { + descriptor = propertyDescriptor.getMethod + } + else { + descriptor = propertyDescriptor.setMethod!! + } + } return typeMapper.mapToCallableMethod(descriptor as FunctionDescriptor, isSuper) } @@ -497,3 +513,5 @@ class ExpressionCodegen( } private class DefaultArg(val index: Int) + +private class Vararg(val index: Int)