translator: fix indexes(extension functions)

This commit is contained in:
e5l
2016-08-08 12:34:52 +03:00
parent d598eb48bb
commit d004673f80
2 changed files with 11 additions and 12 deletions
@@ -33,17 +33,20 @@ class FunctionCodegen(override val state: TranslationState,
LLVMInstanceOfStandardType(it.name.toString(), it.type)
})
returnType = LLVMInstanceOfStandardType("instance", descriptor.returnType!!)
external = isExternal()
name = "${function.fqName}${if (args.size > 0 && !external) "_${args.joinToString(separator = "_", transform = { it.type.mangle() })}" else ""}"
if (isExtensionDeclaration) {
val receiverType = descriptor.extensionReceiverParameter!!.type
val translatorType = LLVMMapStandardType(receiverType)
functionNamePrefix += translatorType.toString() + "."
val extensionFunctionsOfThisType = state.extensionFunctions.getOrDefault(translatorType.toString(), HashMap())
extensionFunctionsOfThisType.put(name, this)
state.extensionFunctions.put(translatorType.toString(), extensionFunctionsOfThisType)
}
returnType = LLVMInstanceOfStandardType("instance", descriptor.returnType!!)
external = isExternal()
name = "${function.fqName}${if (args.size > 0 && !external) "_${args.joinToString(separator = "_", transform = { it.type.mangle() })}" else ""}"
val retType = returnType!!.type
when (retType) {
is LLVMReferenceType -> {
@@ -98,10 +101,6 @@ class FunctionCodegen(override val state: TranslationState,
val receiverType = receiverParameter.type
val translatorType = LLVMMapStandardType(receiverType)
val extensionFunctionsOfThisType = state.extensionFunctions.getOrDefault(translatorType.toString(), HashMap())
extensionFunctionsOfThisType.put(name, this)
state.extensionFunctions.put(translatorType.toString(), extensionFunctionsOfThisType)
val classVal = LLVMVariable("classvariable.this", translatorType, pointer = 0)
variableManager.addVariable("this", classVal, 0)
actualArgs.add(classVal)
@@ -41,12 +41,12 @@ class ProjectTranslator(val files: List<KtFile>, val state: TranslationState) {
private fun generateProjectBody() {
with(state) {
externalFunctions.values.map { it.generate() }
functions.values.filter { it.isExtensionDeclaration }.map { it.generate() }
functions.values.filter { !it.isExtensionDeclaration }.map { it.generate() }
properties.values.map { it.generate() }
objects.values.map { it.generate() }
classes.values.map { it.generate() }
externalFunctions.values.map { it.generate() }
functions.values.filter { it.isExtensionDeclaration }.map { it.generate() }
functions.values.filter { !it.isExtensionDeclaration }.map { it.generate() }
}
}