translator: fix indexes(extension functions)
This commit is contained in:
@@ -33,17 +33,20 @@ class FunctionCodegen(override val state: TranslationState,
|
|||||||
LLVMInstanceOfStandardType(it.name.toString(), it.type)
|
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) {
|
if (isExtensionDeclaration) {
|
||||||
val receiverType = descriptor.extensionReceiverParameter!!.type
|
val receiverType = descriptor.extensionReceiverParameter!!.type
|
||||||
val translatorType = LLVMMapStandardType(receiverType)
|
val translatorType = LLVMMapStandardType(receiverType)
|
||||||
functionNamePrefix += translatorType.toString() + "."
|
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
|
val retType = returnType!!.type
|
||||||
when (retType) {
|
when (retType) {
|
||||||
is LLVMReferenceType -> {
|
is LLVMReferenceType -> {
|
||||||
@@ -98,10 +101,6 @@ class FunctionCodegen(override val state: TranslationState,
|
|||||||
val receiverType = receiverParameter.type
|
val receiverType = receiverParameter.type
|
||||||
val translatorType = LLVMMapStandardType(receiverType)
|
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)
|
val classVal = LLVMVariable("classvariable.this", translatorType, pointer = 0)
|
||||||
variableManager.addVariable("this", classVal, 0)
|
variableManager.addVariable("this", classVal, 0)
|
||||||
actualArgs.add(classVal)
|
actualArgs.add(classVal)
|
||||||
|
|||||||
@@ -41,12 +41,12 @@ class ProjectTranslator(val files: List<KtFile>, val state: TranslationState) {
|
|||||||
|
|
||||||
private fun generateProjectBody() {
|
private fun generateProjectBody() {
|
||||||
with(state) {
|
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() }
|
properties.values.map { it.generate() }
|
||||||
objects.values.map { it.generate() }
|
objects.values.map { it.generate() }
|
||||||
classes.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() }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user