Interop, backend: refactor and reorder interop lowering
* Do not break type compatibility when lowering interop intrinsics. * Place interop lowering before callable reference lowering. * Add other improvements to interop implementation.
This commit is contained in:
committed by
SvyatoslavScherbina
parent
6c627a0b55
commit
3411ce2e8c
@@ -5,7 +5,7 @@ import kotlinx.cinterop.*
|
|||||||
fun asctime(arg0: CPointer<tm>?): CPointer<CInt8Var>? {
|
fun asctime(arg0: CPointer<tm>?): CPointer<CInt8Var>? {
|
||||||
val _arg0 = arg0.rawValue
|
val _arg0 = arg0.rawValue
|
||||||
val res = externals.asctime(_arg0)
|
val res = externals.asctime(_arg0)
|
||||||
return CPointer.createNullable<CInt8Var>(res)
|
return interpretCPointer<CInt8Var>(res)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun clock(): clock_t {
|
fun clock(): clock_t {
|
||||||
@@ -16,7 +16,7 @@ fun clock(): clock_t {
|
|||||||
fun ctime(arg0: CPointer<time_tVar>?): CPointer<CInt8Var>? {
|
fun ctime(arg0: CPointer<time_tVar>?): CPointer<CInt8Var>? {
|
||||||
val _arg0 = arg0.rawValue
|
val _arg0 = arg0.rawValue
|
||||||
val res = externals.ctime(_arg0)
|
val res = externals.ctime(_arg0)
|
||||||
return CPointer.createNullable<CInt8Var>(res)
|
return interpretCPointer<CInt8Var>(res)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun difftime(arg0: time_t, arg1: time_t): Double {
|
fun difftime(arg0: time_t, arg1: time_t): Double {
|
||||||
@@ -30,20 +30,20 @@ fun getdate(arg0: String?): CPointer<tm>? {
|
|||||||
return memScoped {
|
return memScoped {
|
||||||
val _arg0 = arg0?.toCString(memScope).rawPtr
|
val _arg0 = arg0?.toCString(memScope).rawPtr
|
||||||
val res = externals.getdate(_arg0)
|
val res = externals.getdate(_arg0)
|
||||||
CPointer.createNullable<tm>(res)
|
interpretCPointer<tm>(res)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun gmtime(arg0: CPointer<time_tVar>?): CPointer<tm>? {
|
fun gmtime(arg0: CPointer<time_tVar>?): CPointer<tm>? {
|
||||||
val _arg0 = arg0.rawValue
|
val _arg0 = arg0.rawValue
|
||||||
val res = externals.gmtime(_arg0)
|
val res = externals.gmtime(_arg0)
|
||||||
return CPointer.createNullable<tm>(res)
|
return interpretCPointer<tm>(res)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun localtime(arg0: CPointer<time_tVar>?): CPointer<tm>? {
|
fun localtime(arg0: CPointer<time_tVar>?): CPointer<tm>? {
|
||||||
val _arg0 = arg0.rawValue
|
val _arg0 = arg0.rawValue
|
||||||
val res = externals.localtime(_arg0)
|
val res = externals.localtime(_arg0)
|
||||||
return CPointer.createNullable<tm>(res)
|
return interpretCPointer<tm>(res)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun mktime(arg0: CPointer<tm>?): time_t {
|
fun mktime(arg0: CPointer<tm>?): time_t {
|
||||||
@@ -69,7 +69,7 @@ fun strptime(arg0: String?, arg1: String?, arg2: CPointer<tm>?): CPointer<CInt8V
|
|||||||
val _arg1 = arg1?.toCString(memScope).rawPtr
|
val _arg1 = arg1?.toCString(memScope).rawPtr
|
||||||
val _arg2 = arg2.rawValue
|
val _arg2 = arg2.rawValue
|
||||||
val res = externals.strptime(_arg0, _arg1, _arg2)
|
val res = externals.strptime(_arg0, _arg1, _arg2)
|
||||||
CPointer.createNullable<CInt8Var>(res)
|
interpretCPointer<CInt8Var>(res)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -89,7 +89,7 @@ fun asctime_r(arg0: CPointer<tm>?, arg1: String?): CPointer<CInt8Var>? {
|
|||||||
val _arg0 = arg0.rawValue
|
val _arg0 = arg0.rawValue
|
||||||
val _arg1 = arg1?.toCString(memScope).rawPtr
|
val _arg1 = arg1?.toCString(memScope).rawPtr
|
||||||
val res = externals.asctime_r(_arg0, _arg1)
|
val res = externals.asctime_r(_arg0, _arg1)
|
||||||
CPointer.createNullable<CInt8Var>(res)
|
interpretCPointer<CInt8Var>(res)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -98,7 +98,7 @@ fun ctime_r(arg0: CPointer<time_tVar>?, arg1: String?): CPointer<CInt8Var>? {
|
|||||||
val _arg0 = arg0.rawValue
|
val _arg0 = arg0.rawValue
|
||||||
val _arg1 = arg1?.toCString(memScope).rawPtr
|
val _arg1 = arg1?.toCString(memScope).rawPtr
|
||||||
val res = externals.ctime_r(_arg0, _arg1)
|
val res = externals.ctime_r(_arg0, _arg1)
|
||||||
CPointer.createNullable<CInt8Var>(res)
|
interpretCPointer<CInt8Var>(res)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -106,14 +106,14 @@ fun gmtime_r(arg0: CPointer<time_tVar>?, arg1: CPointer<tm>?): CPointer<tm>? {
|
|||||||
val _arg0 = arg0.rawValue
|
val _arg0 = arg0.rawValue
|
||||||
val _arg1 = arg1.rawValue
|
val _arg1 = arg1.rawValue
|
||||||
val res = externals.gmtime_r(_arg0, _arg1)
|
val res = externals.gmtime_r(_arg0, _arg1)
|
||||||
return CPointer.createNullable<tm>(res)
|
return interpretCPointer<tm>(res)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun localtime_r(arg0: CPointer<time_tVar>?, arg1: CPointer<tm>?): CPointer<tm>? {
|
fun localtime_r(arg0: CPointer<time_tVar>?, arg1: CPointer<tm>?): CPointer<tm>? {
|
||||||
val _arg0 = arg0.rawValue
|
val _arg0 = arg0.rawValue
|
||||||
val _arg1 = arg1.rawValue
|
val _arg1 = arg1.rawValue
|
||||||
val res = externals.localtime_r(_arg0, _arg1)
|
val res = externals.localtime_r(_arg0, _arg1)
|
||||||
return CPointer.createNullable<tm>(res)
|
return interpretCPointer<tm>(res)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun posix2time(arg0: time_t): time_t {
|
fun posix2time(arg0: time_t): time_t {
|
||||||
@@ -182,7 +182,7 @@ fun clock_settime(__clock_id: clockid_t, __tp: CPointer<timespec>?): Int {
|
|||||||
fun clang_getCString(string: CXString): CPointer<CInt8Var>? {
|
fun clang_getCString(string: CXString): CPointer<CInt8Var>? {
|
||||||
val _string = string.rawPtr
|
val _string = string.rawPtr
|
||||||
val res = externals.clang_getCString(_string)
|
val res = externals.clang_getCString(_string)
|
||||||
return CPointer.createNullable<CInt8Var>(res)
|
return interpretCPointer<CInt8Var>(res)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun clang_disposeString(string: CXString): Unit {
|
fun clang_disposeString(string: CXString): Unit {
|
||||||
@@ -205,7 +205,7 @@ fun clang_getBuildSessionTimestamp(): Long {
|
|||||||
fun clang_VirtualFileOverlay_create(options: Int): CXVirtualFileOverlay? {
|
fun clang_VirtualFileOverlay_create(options: Int): CXVirtualFileOverlay? {
|
||||||
val _options = options
|
val _options = options
|
||||||
val res = externals.clang_VirtualFileOverlay_create(_options)
|
val res = externals.clang_VirtualFileOverlay_create(_options)
|
||||||
return CPointer.createNullable<CXVirtualFileOverlayImpl>(res)
|
return interpretCPointer<CXVirtualFileOverlayImpl>(res)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun clang_VirtualFileOverlay_addFileMapping(arg0: CXVirtualFileOverlay?, virtualPath: String?, realPath: String?): CXErrorCode {
|
fun clang_VirtualFileOverlay_addFileMapping(arg0: CXVirtualFileOverlay?, virtualPath: String?, realPath: String?): CXErrorCode {
|
||||||
@@ -249,7 +249,7 @@ fun clang_VirtualFileOverlay_dispose(arg0: CXVirtualFileOverlay?): Unit {
|
|||||||
fun clang_ModuleMapDescriptor_create(options: Int): CXModuleMapDescriptor? {
|
fun clang_ModuleMapDescriptor_create(options: Int): CXModuleMapDescriptor? {
|
||||||
val _options = options
|
val _options = options
|
||||||
val res = externals.clang_ModuleMapDescriptor_create(_options)
|
val res = externals.clang_ModuleMapDescriptor_create(_options)
|
||||||
return CPointer.createNullable<CXModuleMapDescriptorImpl>(res)
|
return interpretCPointer<CXModuleMapDescriptorImpl>(res)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun clang_ModuleMapDescriptor_setFrameworkModuleName(arg0: CXModuleMapDescriptor?, name: String?): CXErrorCode {
|
fun clang_ModuleMapDescriptor_setFrameworkModuleName(arg0: CXModuleMapDescriptor?, name: String?): CXErrorCode {
|
||||||
@@ -289,7 +289,7 @@ fun clang_createIndex(excludeDeclarationsFromPCH: Int, displayDiagnostics: Int):
|
|||||||
val _excludeDeclarationsFromPCH = excludeDeclarationsFromPCH
|
val _excludeDeclarationsFromPCH = excludeDeclarationsFromPCH
|
||||||
val _displayDiagnostics = displayDiagnostics
|
val _displayDiagnostics = displayDiagnostics
|
||||||
val res = externals.clang_createIndex(_excludeDeclarationsFromPCH, _displayDiagnostics)
|
val res = externals.clang_createIndex(_excludeDeclarationsFromPCH, _displayDiagnostics)
|
||||||
return CPointer.createNullable<COpaque>(res)
|
return interpretCPointer<COpaque>(res)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun clang_disposeIndex(index: CXIndex?): Unit {
|
fun clang_disposeIndex(index: CXIndex?): Unit {
|
||||||
@@ -343,7 +343,7 @@ fun clang_getFile(tu: CXTranslationUnit?, file_name: String?): CXFile? {
|
|||||||
val _tu = tu.rawValue
|
val _tu = tu.rawValue
|
||||||
val _file_name = file_name?.toCString(memScope).rawPtr
|
val _file_name = file_name?.toCString(memScope).rawPtr
|
||||||
val res = externals.clang_getFile(_tu, _file_name)
|
val res = externals.clang_getFile(_tu, _file_name)
|
||||||
CPointer.createNullable<COpaque>(res)
|
interpretCPointer<COpaque>(res)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -492,7 +492,7 @@ fun clang_getSkippedRanges(tu: CXTranslationUnit?, file: CXFile?): CPointer<CXSo
|
|||||||
val _tu = tu.rawValue
|
val _tu = tu.rawValue
|
||||||
val _file = file.rawValue
|
val _file = file.rawValue
|
||||||
val res = externals.clang_getSkippedRanges(_tu, _file)
|
val res = externals.clang_getSkippedRanges(_tu, _file)
|
||||||
return CPointer.createNullable<CXSourceRangeList>(res)
|
return interpretCPointer<CXSourceRangeList>(res)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun clang_disposeSourceRangeList(ranges: CPointer<CXSourceRangeList>?): Unit {
|
fun clang_disposeSourceRangeList(ranges: CPointer<CXSourceRangeList>?): Unit {
|
||||||
@@ -511,7 +511,7 @@ fun clang_getDiagnosticInSet(Diags: CXDiagnosticSet?, Index: Int): CXDiagnostic?
|
|||||||
val _Diags = Diags.rawValue
|
val _Diags = Diags.rawValue
|
||||||
val _Index = Index
|
val _Index = Index
|
||||||
val res = externals.clang_getDiagnosticInSet(_Diags, _Index)
|
val res = externals.clang_getDiagnosticInSet(_Diags, _Index)
|
||||||
return CPointer.createNullable<COpaque>(res)
|
return interpretCPointer<COpaque>(res)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun clang_loadDiagnostics(file: String?, error: CPointer<CXLoadDiag_Error.Var>?, errorString: CPointer<CXString>?): CXDiagnosticSet? {
|
fun clang_loadDiagnostics(file: String?, error: CPointer<CXLoadDiag_Error.Var>?, errorString: CPointer<CXString>?): CXDiagnosticSet? {
|
||||||
@@ -520,7 +520,7 @@ fun clang_loadDiagnostics(file: String?, error: CPointer<CXLoadDiag_Error.Var>?,
|
|||||||
val _error = error.rawValue
|
val _error = error.rawValue
|
||||||
val _errorString = errorString.rawValue
|
val _errorString = errorString.rawValue
|
||||||
val res = externals.clang_loadDiagnostics(_file, _error, _errorString)
|
val res = externals.clang_loadDiagnostics(_file, _error, _errorString)
|
||||||
CPointer.createNullable<COpaque>(res)
|
interpretCPointer<COpaque>(res)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -533,7 +533,7 @@ fun clang_disposeDiagnosticSet(Diags: CXDiagnosticSet?): Unit {
|
|||||||
fun clang_getChildDiagnostics(D: CXDiagnostic?): CXDiagnosticSet? {
|
fun clang_getChildDiagnostics(D: CXDiagnostic?): CXDiagnosticSet? {
|
||||||
val _D = D.rawValue
|
val _D = D.rawValue
|
||||||
val res = externals.clang_getChildDiagnostics(_D)
|
val res = externals.clang_getChildDiagnostics(_D)
|
||||||
return CPointer.createNullable<COpaque>(res)
|
return interpretCPointer<COpaque>(res)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun clang_getNumDiagnostics(Unit: CXTranslationUnit?): Int {
|
fun clang_getNumDiagnostics(Unit: CXTranslationUnit?): Int {
|
||||||
@@ -546,13 +546,13 @@ fun clang_getDiagnostic(Unit: CXTranslationUnit?, Index: Int): CXDiagnostic? {
|
|||||||
val _Unit = Unit.rawValue
|
val _Unit = Unit.rawValue
|
||||||
val _Index = Index
|
val _Index = Index
|
||||||
val res = externals.clang_getDiagnostic(_Unit, _Index)
|
val res = externals.clang_getDiagnostic(_Unit, _Index)
|
||||||
return CPointer.createNullable<COpaque>(res)
|
return interpretCPointer<COpaque>(res)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun clang_getDiagnosticSetFromTU(Unit: CXTranslationUnit?): CXDiagnosticSet? {
|
fun clang_getDiagnosticSetFromTU(Unit: CXTranslationUnit?): CXDiagnosticSet? {
|
||||||
val _Unit = Unit.rawValue
|
val _Unit = Unit.rawValue
|
||||||
val res = externals.clang_getDiagnosticSetFromTU(_Unit)
|
val res = externals.clang_getDiagnosticSetFromTU(_Unit)
|
||||||
return CPointer.createNullable<COpaque>(res)
|
return interpretCPointer<COpaque>(res)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun clang_disposeDiagnostic(Diagnostic: CXDiagnostic?): Unit {
|
fun clang_disposeDiagnostic(Diagnostic: CXDiagnostic?): Unit {
|
||||||
@@ -667,7 +667,7 @@ fun clang_createTranslationUnitFromSourceFile(CIdx: CXIndex?, source_filename: S
|
|||||||
val _num_unsaved_files = num_unsaved_files
|
val _num_unsaved_files = num_unsaved_files
|
||||||
val _unsaved_files = unsaved_files.rawValue
|
val _unsaved_files = unsaved_files.rawValue
|
||||||
val res = externals.clang_createTranslationUnitFromSourceFile(_CIdx, _source_filename, _num_clang_command_line_args, _clang_command_line_args, _num_unsaved_files, _unsaved_files)
|
val res = externals.clang_createTranslationUnitFromSourceFile(_CIdx, _source_filename, _num_clang_command_line_args, _clang_command_line_args, _num_unsaved_files, _unsaved_files)
|
||||||
CPointer.createNullable<CXTranslationUnitImpl>(res)
|
interpretCPointer<CXTranslationUnitImpl>(res)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -676,7 +676,7 @@ fun clang_createTranslationUnit(CIdx: CXIndex?, ast_filename: String?): CXTransl
|
|||||||
val _CIdx = CIdx.rawValue
|
val _CIdx = CIdx.rawValue
|
||||||
val _ast_filename = ast_filename?.toCString(memScope).rawPtr
|
val _ast_filename = ast_filename?.toCString(memScope).rawPtr
|
||||||
val res = externals.clang_createTranslationUnit(_CIdx, _ast_filename)
|
val res = externals.clang_createTranslationUnit(_CIdx, _ast_filename)
|
||||||
CPointer.createNullable<CXTranslationUnitImpl>(res)
|
interpretCPointer<CXTranslationUnitImpl>(res)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -705,7 +705,7 @@ fun clang_parseTranslationUnit(CIdx: CXIndex?, source_filename: String?, command
|
|||||||
val _num_unsaved_files = num_unsaved_files
|
val _num_unsaved_files = num_unsaved_files
|
||||||
val _options = options
|
val _options = options
|
||||||
val res = externals.clang_parseTranslationUnit(_CIdx, _source_filename, _command_line_args, _num_command_line_args, _unsaved_files, _num_unsaved_files, _options)
|
val res = externals.clang_parseTranslationUnit(_CIdx, _source_filename, _command_line_args, _num_command_line_args, _unsaved_files, _num_unsaved_files, _options)
|
||||||
CPointer.createNullable<CXTranslationUnitImpl>(res)
|
interpretCPointer<CXTranslationUnitImpl>(res)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -779,7 +779,7 @@ fun clang_reparseTranslationUnit(TU: CXTranslationUnit?, num_unsaved_files: Int,
|
|||||||
fun clang_getTUResourceUsageName(kind: CXTUResourceUsageKind): CPointer<CInt8Var>? {
|
fun clang_getTUResourceUsageName(kind: CXTUResourceUsageKind): CPointer<CInt8Var>? {
|
||||||
val _kind = kind.value
|
val _kind = kind.value
|
||||||
val res = externals.clang_getTUResourceUsageName(_kind)
|
val res = externals.clang_getTUResourceUsageName(_kind)
|
||||||
return CPointer.createNullable<CInt8Var>(res)
|
return interpretCPointer<CInt8Var>(res)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun clang_getCXTUResourceUsage(TU: CXTranslationUnit?, retValPlacement: NativePlacement): CXTUResourceUsage {
|
fun clang_getCXTUResourceUsage(TU: CXTranslationUnit?, retValPlacement: NativePlacement): CXTUResourceUsage {
|
||||||
@@ -938,12 +938,12 @@ fun clang_getCursorLanguage(cursor: CXCursor): CXLanguageKind {
|
|||||||
fun clang_Cursor_getTranslationUnit(arg0: CXCursor): CXTranslationUnit? {
|
fun clang_Cursor_getTranslationUnit(arg0: CXCursor): CXTranslationUnit? {
|
||||||
val _arg0 = arg0.rawPtr
|
val _arg0 = arg0.rawPtr
|
||||||
val res = externals.clang_Cursor_getTranslationUnit(_arg0)
|
val res = externals.clang_Cursor_getTranslationUnit(_arg0)
|
||||||
return CPointer.createNullable<CXTranslationUnitImpl>(res)
|
return interpretCPointer<CXTranslationUnitImpl>(res)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun clang_createCXCursorSet(): CXCursorSet? {
|
fun clang_createCXCursorSet(): CXCursorSet? {
|
||||||
val res = externals.clang_createCXCursorSet()
|
val res = externals.clang_createCXCursorSet()
|
||||||
return CPointer.createNullable<CXCursorSetImpl>(res)
|
return interpretCPointer<CXCursorSetImpl>(res)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun clang_disposeCXCursorSet(cset: CXCursorSet?): Unit {
|
fun clang_disposeCXCursorSet(cset: CXCursorSet?): Unit {
|
||||||
@@ -997,7 +997,7 @@ fun clang_disposeOverriddenCursors(overridden: CPointer<CXCursor>?): Unit {
|
|||||||
fun clang_getIncludedFile(cursor: CXCursor): CXFile? {
|
fun clang_getIncludedFile(cursor: CXCursor): CXFile? {
|
||||||
val _cursor = cursor.rawPtr
|
val _cursor = cursor.rawPtr
|
||||||
val res = externals.clang_getIncludedFile(_cursor)
|
val res = externals.clang_getIncludedFile(_cursor)
|
||||||
return CPointer.createNullable<COpaque>(res)
|
return interpretCPointer<COpaque>(res)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun clang_getCursor(arg0: CXTranslationUnit?, arg1: CXSourceLocation, retValPlacement: NativePlacement): CXCursor {
|
fun clang_getCursor(arg0: CXTranslationUnit?, arg1: CXSourceLocation, retValPlacement: NativePlacement): CXCursor {
|
||||||
@@ -1585,32 +1585,32 @@ fun clang_Cursor_getMangling(arg0: CXCursor, retValPlacement: NativePlacement):
|
|||||||
fun clang_Cursor_getCXXManglings(arg0: CXCursor): CPointer<CXStringSet>? {
|
fun clang_Cursor_getCXXManglings(arg0: CXCursor): CPointer<CXStringSet>? {
|
||||||
val _arg0 = arg0.rawPtr
|
val _arg0 = arg0.rawPtr
|
||||||
val res = externals.clang_Cursor_getCXXManglings(_arg0)
|
val res = externals.clang_Cursor_getCXXManglings(_arg0)
|
||||||
return CPointer.createNullable<CXStringSet>(res)
|
return interpretCPointer<CXStringSet>(res)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun clang_Cursor_getModule(C: CXCursor): CXModule? {
|
fun clang_Cursor_getModule(C: CXCursor): CXModule? {
|
||||||
val _C = C.rawPtr
|
val _C = C.rawPtr
|
||||||
val res = externals.clang_Cursor_getModule(_C)
|
val res = externals.clang_Cursor_getModule(_C)
|
||||||
return CPointer.createNullable<COpaque>(res)
|
return interpretCPointer<COpaque>(res)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun clang_getModuleForFile(arg0: CXTranslationUnit?, arg1: CXFile?): CXModule? {
|
fun clang_getModuleForFile(arg0: CXTranslationUnit?, arg1: CXFile?): CXModule? {
|
||||||
val _arg0 = arg0.rawValue
|
val _arg0 = arg0.rawValue
|
||||||
val _arg1 = arg1.rawValue
|
val _arg1 = arg1.rawValue
|
||||||
val res = externals.clang_getModuleForFile(_arg0, _arg1)
|
val res = externals.clang_getModuleForFile(_arg0, _arg1)
|
||||||
return CPointer.createNullable<COpaque>(res)
|
return interpretCPointer<COpaque>(res)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun clang_Module_getASTFile(Module: CXModule?): CXFile? {
|
fun clang_Module_getASTFile(Module: CXModule?): CXFile? {
|
||||||
val _Module = Module.rawValue
|
val _Module = Module.rawValue
|
||||||
val res = externals.clang_Module_getASTFile(_Module)
|
val res = externals.clang_Module_getASTFile(_Module)
|
||||||
return CPointer.createNullable<COpaque>(res)
|
return interpretCPointer<COpaque>(res)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun clang_Module_getParent(Module: CXModule?): CXModule? {
|
fun clang_Module_getParent(Module: CXModule?): CXModule? {
|
||||||
val _Module = Module.rawValue
|
val _Module = Module.rawValue
|
||||||
val res = externals.clang_Module_getParent(_Module)
|
val res = externals.clang_Module_getParent(_Module)
|
||||||
return CPointer.createNullable<COpaque>(res)
|
return interpretCPointer<COpaque>(res)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun clang_Module_getName(Module: CXModule?, retValPlacement: NativePlacement): CXString {
|
fun clang_Module_getName(Module: CXModule?, retValPlacement: NativePlacement): CXString {
|
||||||
@@ -1645,7 +1645,7 @@ fun clang_Module_getTopLevelHeader(arg0: CXTranslationUnit?, Module: CXModule?,
|
|||||||
val _Module = Module.rawValue
|
val _Module = Module.rawValue
|
||||||
val _Index = Index
|
val _Index = Index
|
||||||
val res = externals.clang_Module_getTopLevelHeader(_arg0, _Module, _Index)
|
val res = externals.clang_Module_getTopLevelHeader(_arg0, _Module, _Index)
|
||||||
return CPointer.createNullable<COpaque>(res)
|
return interpretCPointer<COpaque>(res)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun clang_CXXConstructor_isConvertingConstructor(C: CXCursor): Int {
|
fun clang_CXXConstructor_isConvertingConstructor(C: CXCursor): Int {
|
||||||
@@ -1837,7 +1837,7 @@ fun clang_getCompletionChunkCompletionString(completion_string: CXCompletionStri
|
|||||||
val _completion_string = completion_string.rawValue
|
val _completion_string = completion_string.rawValue
|
||||||
val _chunk_number = chunk_number
|
val _chunk_number = chunk_number
|
||||||
val res = externals.clang_getCompletionChunkCompletionString(_completion_string, _chunk_number)
|
val res = externals.clang_getCompletionChunkCompletionString(_completion_string, _chunk_number)
|
||||||
return CPointer.createNullable<COpaque>(res)
|
return interpretCPointer<COpaque>(res)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun clang_getNumCompletionChunks(completion_string: CXCompletionString?): Int {
|
fun clang_getNumCompletionChunks(completion_string: CXCompletionString?): Int {
|
||||||
@@ -1890,7 +1890,7 @@ fun clang_getCompletionBriefComment(completion_string: CXCompletionString?, retV
|
|||||||
fun clang_getCursorCompletionString(cursor: CXCursor): CXCompletionString? {
|
fun clang_getCursorCompletionString(cursor: CXCursor): CXCompletionString? {
|
||||||
val _cursor = cursor.rawPtr
|
val _cursor = cursor.rawPtr
|
||||||
val res = externals.clang_getCursorCompletionString(_cursor)
|
val res = externals.clang_getCursorCompletionString(_cursor)
|
||||||
return CPointer.createNullable<COpaque>(res)
|
return interpretCPointer<COpaque>(res)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun clang_defaultCodeCompleteOptions(): Int {
|
fun clang_defaultCodeCompleteOptions(): Int {
|
||||||
@@ -1908,7 +1908,7 @@ fun clang_codeCompleteAt(TU: CXTranslationUnit?, complete_filename: String?, com
|
|||||||
val _num_unsaved_files = num_unsaved_files
|
val _num_unsaved_files = num_unsaved_files
|
||||||
val _options = options
|
val _options = options
|
||||||
val res = externals.clang_codeCompleteAt(_TU, _complete_filename, _complete_line, _complete_column, _unsaved_files, _num_unsaved_files, _options)
|
val res = externals.clang_codeCompleteAt(_TU, _complete_filename, _complete_line, _complete_column, _unsaved_files, _num_unsaved_files, _options)
|
||||||
CPointer.createNullable<CXCodeCompleteResults>(res)
|
interpretCPointer<CXCodeCompleteResults>(res)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1935,7 +1935,7 @@ fun clang_codeCompleteGetDiagnostic(Results: CPointer<CXCodeCompleteResults>?, I
|
|||||||
val _Results = Results.rawValue
|
val _Results = Results.rawValue
|
||||||
val _Index = Index
|
val _Index = Index
|
||||||
val res = externals.clang_codeCompleteGetDiagnostic(_Results, _Index)
|
val res = externals.clang_codeCompleteGetDiagnostic(_Results, _Index)
|
||||||
return CPointer.createNullable<COpaque>(res)
|
return interpretCPointer<COpaque>(res)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun clang_codeCompleteGetContexts(Results: CPointer<CXCodeCompleteResults>?): Long {
|
fun clang_codeCompleteGetContexts(Results: CPointer<CXCodeCompleteResults>?): Long {
|
||||||
@@ -1988,7 +1988,7 @@ fun clang_getInclusions(tu: CXTranslationUnit?, visitor: CXInclusionVisitor?, cl
|
|||||||
fun clang_Cursor_Evaluate(C: CXCursor): CXEvalResult? {
|
fun clang_Cursor_Evaluate(C: CXCursor): CXEvalResult? {
|
||||||
val _C = C.rawPtr
|
val _C = C.rawPtr
|
||||||
val res = externals.clang_Cursor_Evaluate(_C)
|
val res = externals.clang_Cursor_Evaluate(_C)
|
||||||
return CPointer.createNullable<COpaque>(res)
|
return interpretCPointer<COpaque>(res)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun clang_EvalResult_getKind(E: CXEvalResult?): CXEvalResultKind {
|
fun clang_EvalResult_getKind(E: CXEvalResult?): CXEvalResultKind {
|
||||||
@@ -2012,7 +2012,7 @@ fun clang_EvalResult_getAsDouble(E: CXEvalResult?): Double {
|
|||||||
fun clang_EvalResult_getAsStr(E: CXEvalResult?): CPointer<CInt8Var>? {
|
fun clang_EvalResult_getAsStr(E: CXEvalResult?): CPointer<CInt8Var>? {
|
||||||
val _E = E.rawValue
|
val _E = E.rawValue
|
||||||
val res = externals.clang_EvalResult_getAsStr(_E)
|
val res = externals.clang_EvalResult_getAsStr(_E)
|
||||||
return CPointer.createNullable<CInt8Var>(res)
|
return interpretCPointer<CInt8Var>(res)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun clang_EvalResult_dispose(E: CXEvalResult?): Unit {
|
fun clang_EvalResult_dispose(E: CXEvalResult?): Unit {
|
||||||
@@ -2025,7 +2025,7 @@ fun clang_getRemappings(path: String?): CXRemapping? {
|
|||||||
return memScoped {
|
return memScoped {
|
||||||
val _path = path?.toCString(memScope).rawPtr
|
val _path = path?.toCString(memScope).rawPtr
|
||||||
val res = externals.clang_getRemappings(_path)
|
val res = externals.clang_getRemappings(_path)
|
||||||
CPointer.createNullable<COpaque>(res)
|
interpretCPointer<COpaque>(res)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2033,7 +2033,7 @@ fun clang_getRemappingsFromFileList(filePaths: CPointer<CPointerVar<CInt8Var>>?,
|
|||||||
val _filePaths = filePaths.rawValue
|
val _filePaths = filePaths.rawValue
|
||||||
val _numFiles = numFiles
|
val _numFiles = numFiles
|
||||||
val res = externals.clang_getRemappingsFromFileList(_filePaths, _numFiles)
|
val res = externals.clang_getRemappingsFromFileList(_filePaths, _numFiles)
|
||||||
return CPointer.createNullable<COpaque>(res)
|
return interpretCPointer<COpaque>(res)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun clang_remap_getNumFiles(arg0: CXRemapping?): Int {
|
fun clang_remap_getNumFiles(arg0: CXRemapping?): Int {
|
||||||
@@ -2082,49 +2082,49 @@ fun clang_index_isEntityObjCContainerKind(arg0: CXIdxEntityKind): Int {
|
|||||||
fun clang_index_getObjCContainerDeclInfo(arg0: CPointer<CXIdxDeclInfo>?): CPointer<CXIdxObjCContainerDeclInfo>? {
|
fun clang_index_getObjCContainerDeclInfo(arg0: CPointer<CXIdxDeclInfo>?): CPointer<CXIdxObjCContainerDeclInfo>? {
|
||||||
val _arg0 = arg0.rawValue
|
val _arg0 = arg0.rawValue
|
||||||
val res = externals.clang_index_getObjCContainerDeclInfo(_arg0)
|
val res = externals.clang_index_getObjCContainerDeclInfo(_arg0)
|
||||||
return CPointer.createNullable<CXIdxObjCContainerDeclInfo>(res)
|
return interpretCPointer<CXIdxObjCContainerDeclInfo>(res)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun clang_index_getObjCInterfaceDeclInfo(arg0: CPointer<CXIdxDeclInfo>?): CPointer<CXIdxObjCInterfaceDeclInfo>? {
|
fun clang_index_getObjCInterfaceDeclInfo(arg0: CPointer<CXIdxDeclInfo>?): CPointer<CXIdxObjCInterfaceDeclInfo>? {
|
||||||
val _arg0 = arg0.rawValue
|
val _arg0 = arg0.rawValue
|
||||||
val res = externals.clang_index_getObjCInterfaceDeclInfo(_arg0)
|
val res = externals.clang_index_getObjCInterfaceDeclInfo(_arg0)
|
||||||
return CPointer.createNullable<CXIdxObjCInterfaceDeclInfo>(res)
|
return interpretCPointer<CXIdxObjCInterfaceDeclInfo>(res)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun clang_index_getObjCCategoryDeclInfo(arg0: CPointer<CXIdxDeclInfo>?): CPointer<CXIdxObjCCategoryDeclInfo>? {
|
fun clang_index_getObjCCategoryDeclInfo(arg0: CPointer<CXIdxDeclInfo>?): CPointer<CXIdxObjCCategoryDeclInfo>? {
|
||||||
val _arg0 = arg0.rawValue
|
val _arg0 = arg0.rawValue
|
||||||
val res = externals.clang_index_getObjCCategoryDeclInfo(_arg0)
|
val res = externals.clang_index_getObjCCategoryDeclInfo(_arg0)
|
||||||
return CPointer.createNullable<CXIdxObjCCategoryDeclInfo>(res)
|
return interpretCPointer<CXIdxObjCCategoryDeclInfo>(res)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun clang_index_getObjCProtocolRefListInfo(arg0: CPointer<CXIdxDeclInfo>?): CPointer<CXIdxObjCProtocolRefListInfo>? {
|
fun clang_index_getObjCProtocolRefListInfo(arg0: CPointer<CXIdxDeclInfo>?): CPointer<CXIdxObjCProtocolRefListInfo>? {
|
||||||
val _arg0 = arg0.rawValue
|
val _arg0 = arg0.rawValue
|
||||||
val res = externals.clang_index_getObjCProtocolRefListInfo(_arg0)
|
val res = externals.clang_index_getObjCProtocolRefListInfo(_arg0)
|
||||||
return CPointer.createNullable<CXIdxObjCProtocolRefListInfo>(res)
|
return interpretCPointer<CXIdxObjCProtocolRefListInfo>(res)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun clang_index_getObjCPropertyDeclInfo(arg0: CPointer<CXIdxDeclInfo>?): CPointer<CXIdxObjCPropertyDeclInfo>? {
|
fun clang_index_getObjCPropertyDeclInfo(arg0: CPointer<CXIdxDeclInfo>?): CPointer<CXIdxObjCPropertyDeclInfo>? {
|
||||||
val _arg0 = arg0.rawValue
|
val _arg0 = arg0.rawValue
|
||||||
val res = externals.clang_index_getObjCPropertyDeclInfo(_arg0)
|
val res = externals.clang_index_getObjCPropertyDeclInfo(_arg0)
|
||||||
return CPointer.createNullable<CXIdxObjCPropertyDeclInfo>(res)
|
return interpretCPointer<CXIdxObjCPropertyDeclInfo>(res)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun clang_index_getIBOutletCollectionAttrInfo(arg0: CPointer<CXIdxAttrInfo>?): CPointer<CXIdxIBOutletCollectionAttrInfo>? {
|
fun clang_index_getIBOutletCollectionAttrInfo(arg0: CPointer<CXIdxAttrInfo>?): CPointer<CXIdxIBOutletCollectionAttrInfo>? {
|
||||||
val _arg0 = arg0.rawValue
|
val _arg0 = arg0.rawValue
|
||||||
val res = externals.clang_index_getIBOutletCollectionAttrInfo(_arg0)
|
val res = externals.clang_index_getIBOutletCollectionAttrInfo(_arg0)
|
||||||
return CPointer.createNullable<CXIdxIBOutletCollectionAttrInfo>(res)
|
return interpretCPointer<CXIdxIBOutletCollectionAttrInfo>(res)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun clang_index_getCXXClassDeclInfo(arg0: CPointer<CXIdxDeclInfo>?): CPointer<CXIdxCXXClassDeclInfo>? {
|
fun clang_index_getCXXClassDeclInfo(arg0: CPointer<CXIdxDeclInfo>?): CPointer<CXIdxCXXClassDeclInfo>? {
|
||||||
val _arg0 = arg0.rawValue
|
val _arg0 = arg0.rawValue
|
||||||
val res = externals.clang_index_getCXXClassDeclInfo(_arg0)
|
val res = externals.clang_index_getCXXClassDeclInfo(_arg0)
|
||||||
return CPointer.createNullable<CXIdxCXXClassDeclInfo>(res)
|
return interpretCPointer<CXIdxCXXClassDeclInfo>(res)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun clang_index_getClientContainer(arg0: CPointer<CXIdxContainerInfo>?): CXIdxClientContainer? {
|
fun clang_index_getClientContainer(arg0: CPointer<CXIdxContainerInfo>?): CXIdxClientContainer? {
|
||||||
val _arg0 = arg0.rawValue
|
val _arg0 = arg0.rawValue
|
||||||
val res = externals.clang_index_getClientContainer(_arg0)
|
val res = externals.clang_index_getClientContainer(_arg0)
|
||||||
return CPointer.createNullable<COpaque>(res)
|
return interpretCPointer<COpaque>(res)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun clang_index_setClientContainer(arg0: CPointer<CXIdxContainerInfo>?, arg1: CXIdxClientContainer?): Unit {
|
fun clang_index_setClientContainer(arg0: CPointer<CXIdxContainerInfo>?, arg1: CXIdxClientContainer?): Unit {
|
||||||
@@ -2137,7 +2137,7 @@ fun clang_index_setClientContainer(arg0: CPointer<CXIdxContainerInfo>?, arg1: CX
|
|||||||
fun clang_index_getClientEntity(arg0: CPointer<CXIdxEntityInfo>?): CXIdxClientEntity? {
|
fun clang_index_getClientEntity(arg0: CPointer<CXIdxEntityInfo>?): CXIdxClientEntity? {
|
||||||
val _arg0 = arg0.rawValue
|
val _arg0 = arg0.rawValue
|
||||||
val res = externals.clang_index_getClientEntity(_arg0)
|
val res = externals.clang_index_getClientEntity(_arg0)
|
||||||
return CPointer.createNullable<COpaque>(res)
|
return interpretCPointer<COpaque>(res)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun clang_index_setClientEntity(arg0: CPointer<CXIdxEntityInfo>?, arg1: CXIdxClientEntity?): Unit {
|
fun clang_index_setClientEntity(arg0: CPointer<CXIdxEntityInfo>?, arg1: CXIdxClientEntity?): Unit {
|
||||||
@@ -2150,7 +2150,7 @@ fun clang_index_setClientEntity(arg0: CPointer<CXIdxEntityInfo>?, arg1: CXIdxCli
|
|||||||
fun clang_IndexAction_create(CIdx: CXIndex?): CXIndexAction? {
|
fun clang_IndexAction_create(CIdx: CXIndex?): CXIndexAction? {
|
||||||
val _CIdx = CIdx.rawValue
|
val _CIdx = CIdx.rawValue
|
||||||
val res = externals.clang_IndexAction_create(_CIdx)
|
val res = externals.clang_IndexAction_create(_CIdx)
|
||||||
return CPointer.createNullable<COpaque>(res)
|
return interpretCPointer<COpaque>(res)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun clang_IndexAction_dispose(arg0: CXIndexAction?): Unit {
|
fun clang_IndexAction_dispose(arg0: CXIndexAction?): Unit {
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ data class StableObjPtr private constructor(val value: COpaquePointer) {
|
|||||||
*/
|
*/
|
||||||
fun create(any: Any) = fromValue(newGlobalRef(any))
|
fun create(any: Any) = fromValue(newGlobalRef(any))
|
||||||
|
|
||||||
private fun fromValue(value: NativePtr) = fromValue(CPointer.create(value))
|
private fun fromValue(value: NativePtr) = fromValue(interpretCPointer(value)!!)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates [StableObjPtr] from given raw value.
|
* Creates [StableObjPtr] from given raw value.
|
||||||
@@ -219,7 +219,7 @@ private fun ffiCreateCif(returnType: ffi_type, paramTypes: List<ffi_type>): ffi_
|
|||||||
|
|
||||||
private fun ffiFunImpl0(ffiCif: Long, ret: Long, args: Long, userData: Any) {
|
private fun ffiFunImpl0(ffiCif: Long, ret: Long, args: Long, userData: Any) {
|
||||||
ffiFunImpl(interpretPointed(ffiCif),
|
ffiFunImpl(interpretPointed(ffiCif),
|
||||||
CPointer.create(ret),
|
interpretCPointer(ret)!!,
|
||||||
interpretPointed(args),
|
interpretPointed(args),
|
||||||
userData as UserData)
|
userData as UserData)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,21 +11,30 @@ val nativeNullPtr: NativePtr = 0L
|
|||||||
inline fun <reified T : CVariable> typeOf() = T::class.companionObjectInstance as CVariable.Type
|
inline fun <reified T : CVariable> typeOf() = T::class.companionObjectInstance as CVariable.Type
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns interpretation of entity with given pointer.
|
* Returns interpretation of entity with given pointer, or `null` if it is null.
|
||||||
*
|
*
|
||||||
* @param T must not be abstract
|
* @param T must not be abstract
|
||||||
*/
|
*/
|
||||||
inline fun <reified T : NativePointed> interpretPointed(ptr: NativePtr): T {
|
inline fun <reified T : NativePointed> interpretNullablePointed(ptr: NativePtr): T? {
|
||||||
return ensuringNotNull(ptr) {
|
if (ptr == nativeNullPtr) {
|
||||||
|
return null
|
||||||
|
} else {
|
||||||
val kClass = T::class
|
val kClass = T::class
|
||||||
val primaryConstructor = kClass.primaryConstructor
|
val primaryConstructor = kClass.primaryConstructor
|
||||||
if (primaryConstructor == null) {
|
if (primaryConstructor == null) {
|
||||||
throw IllegalArgumentException("${kClass.simpleName} doesn't have a constructor")
|
throw IllegalArgumentException("${kClass.simpleName} doesn't have a constructor")
|
||||||
}
|
}
|
||||||
(primaryConstructor as (NativePtr) -> T)(ptr)
|
return (primaryConstructor as (NativePtr) -> T)(ptr)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun <T : CPointed> interpretCPointer(rawValue: NativePtr) =
|
||||||
|
if (rawValue == nativeNullPtr) {
|
||||||
|
null
|
||||||
|
} else {
|
||||||
|
CPointer<T>(rawValue)
|
||||||
|
}
|
||||||
|
|
||||||
inline fun <reified T : CAdaptedFunctionType<*>> CAdaptedFunctionType.Companion.getInstanceOf(): T =
|
inline fun <reified T : CAdaptedFunctionType<*>> CAdaptedFunctionType.Companion.getInstanceOf(): T =
|
||||||
T::class.objectInstance!!
|
T::class.objectInstance!!
|
||||||
|
|
||||||
|
|||||||
@@ -12,40 +12,14 @@ interface NativePointed {
|
|||||||
|
|
||||||
// `null` value of `NativePointed?` is mapped to `nativeNullPtr`.
|
// `null` value of `NativePointed?` is mapped to `nativeNullPtr`.
|
||||||
val NativePointed?.rawPtr: NativePtr
|
val NativePointed?.rawPtr: NativePtr
|
||||||
get() = this?.rawPtr ?: nativeNullPtr
|
get() = if (this != null) this.rawPtr else nativeNullPtr
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns interpretation of entity with given pointer, or `null` if it is null.
|
* Returns interpretation of entity with given pointer.
|
||||||
*
|
*
|
||||||
* @param T must not be abstract
|
* @param T must not be abstract
|
||||||
*/
|
*/
|
||||||
inline fun <reified T : NativePointed> interpretNullablePointed(ptr: NativePtr): T? {
|
inline fun <reified T : NativePointed> interpretPointed(ptr: NativePtr): T = interpretNullablePointed<T>(ptr)!!
|
||||||
return ifNotNull(ptr) {
|
|
||||||
interpretPointed<T>(it)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Applies the function to the pointer if it is not null, otherwise returns `null`.
|
|
||||||
*/
|
|
||||||
inline fun <T> ifNotNull(ptr: NativePtr, function: (NativePtr)->T): T? {
|
|
||||||
return if (ptr == nativeNullPtr) {
|
|
||||||
null
|
|
||||||
} else {
|
|
||||||
function(ptr)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Applies the function to the pointer ensuring that it is not null.
|
|
||||||
*/
|
|
||||||
inline fun <T> ensuringNotNull(ptr: NativePtr, function: (NativePtr)->T): T {
|
|
||||||
if (ptr == nativeNullPtr) {
|
|
||||||
throw IllegalArgumentException()
|
|
||||||
} else {
|
|
||||||
return function(ptr)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Changes the interpretation of the pointed data or code.
|
* Changes the interpretation of the pointed data or code.
|
||||||
@@ -60,16 +34,7 @@ interface CPointed : NativePointed
|
|||||||
/**
|
/**
|
||||||
* C pointer.
|
* C pointer.
|
||||||
*/
|
*/
|
||||||
class CPointer<T : CPointed> private constructor(val rawValue: NativePtr) {
|
class CPointer<T : CPointed> internal constructor(val rawValue: NativePtr) {
|
||||||
companion object {
|
|
||||||
fun <T : CPointed> create(rawValue: NativePtr) = ensuringNotNull(rawValue) {
|
|
||||||
CPointer<T>(rawValue)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun <T : CPointed> createNullable(rawValue: NativePtr) = ifNotNull(rawValue) {
|
|
||||||
CPointer<T>(it)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun equals(other: Any?): Boolean {
|
override fun equals(other: Any?): Boolean {
|
||||||
if (this === other) {
|
if (this === other) {
|
||||||
@@ -90,7 +55,7 @@ class CPointer<T : CPointed> private constructor(val rawValue: NativePtr) {
|
|||||||
* Returns the pointer to this data or code.
|
* Returns the pointer to this data or code.
|
||||||
*/
|
*/
|
||||||
val <T : CPointed> T.ptr: CPointer<T>
|
val <T : CPointed> T.ptr: CPointer<T>
|
||||||
get() = CPointer.create(this.rawPtr)
|
get() = interpretCPointer(this.rawPtr)!!
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the corresponding [CPointed].
|
* Returns the corresponding [CPointed].
|
||||||
@@ -104,7 +69,7 @@ inline val <reified T : CPointed> CPointer<T>.pointed: T
|
|||||||
val CPointer<*>?.rawValue: NativePtr
|
val CPointer<*>?.rawValue: NativePtr
|
||||||
get() = this?.rawValue ?: nativeNullPtr
|
get() = this?.rawValue ?: nativeNullPtr
|
||||||
|
|
||||||
fun <T : CPointed> CPointer<*>.reinterpret(): CPointer<T> = CPointer.create(this.rawValue)
|
fun <T : CPointed> CPointer<*>.reinterpret(): CPointer<T> = interpretCPointer(this.rawValue)!!
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The [CPointed] without any specified interpretation.
|
* The [CPointed] without any specified interpretation.
|
||||||
@@ -251,7 +216,7 @@ typealias CPointerVar<T> = CPointerVarWithValueMappedTo<CPointer<T>>
|
|||||||
* The value of this variable.
|
* The value of this variable.
|
||||||
*/
|
*/
|
||||||
inline var <reified P : CPointer<*>> CPointerVarWithValueMappedTo<P>.value: P?
|
inline var <reified P : CPointer<*>> CPointerVarWithValueMappedTo<P>.value: P?
|
||||||
get() = CPointer.createNullable<CPointed>(nativeMemUtils.getNativePtr(this)) as P?
|
get() = interpretCPointer<CPointed>(nativeMemUtils.getNativePtr(this)) as P?
|
||||||
set(value) = nativeMemUtils.putNativePtr(this, value.rawValue)
|
set(value) = nativeMemUtils.putNativePtr(this, value.rawValue)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -151,10 +151,10 @@ fun <T : CPointed> NativePlacement.allocPointerTo() = alloc<CPointerVar<T>>()
|
|||||||
/**
|
/**
|
||||||
* The zero-terminated string.
|
* The zero-terminated string.
|
||||||
*/
|
*/
|
||||||
class CString private constructor(override val rawPtr: NativePtr) : CPointed {
|
class CString(override val rawPtr: NativePtr) : CPointed {
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
fun fromArray(array: CArray<CInt8Var>) = CString(array.rawPtr)
|
fun fromArray(array: CArray<CInt8Var>) = array.reinterpret<CString>()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun length(): Int {
|
fun length(): Int {
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ object nativeMemUtils {
|
|||||||
if (ptr == nativeNullPtr) {
|
if (ptr == nativeNullPtr) {
|
||||||
throw OutOfMemoryError("unable to allocate native memory")
|
throw OutOfMemoryError("unable to allocate native memory")
|
||||||
}
|
}
|
||||||
return NativeAllocated(ptr)
|
return interpretPointed<NativeAllocated>(ptr)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun free(mem: NativePointed) {
|
fun free(mem: NativePointed) {
|
||||||
|
|||||||
@@ -14,11 +14,17 @@ inline val nativeNullPtr: NativePtr
|
|||||||
fun <T : CVariable> typeOf(): CVariable.Type = throw Error("typeOf() is called with erased argument")
|
fun <T : CVariable> typeOf(): CVariable.Type = throw Error("typeOf() is called with erased argument")
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns interpretation of entity with given pointer.
|
* Returns interpretation of entity with given pointer, or `null` if it is null.
|
||||||
*
|
*
|
||||||
* @param T must not be abstract
|
* @param T must not be abstract
|
||||||
*/
|
*/
|
||||||
@Intrinsic external fun <T : NativePointed> interpretPointed(ptr: NativePtr): T
|
@Intrinsic external fun <T : NativePointed> interpretNullablePointed(ptr: NativePtr): T?
|
||||||
|
|
||||||
|
@Intrinsic external fun <T : CPointed> interpretCPointer(rawValue: NativePtr): CPointer<T>?
|
||||||
|
|
||||||
|
@Intrinsic external fun NativePointed.getRawPointer(): NativePtr
|
||||||
|
|
||||||
|
@Intrinsic external fun CPointer<*>.getRawValue(): NativePtr
|
||||||
|
|
||||||
inline fun <reified T : CAdaptedFunctionType<*>> CAdaptedFunctionType.Companion.getInstanceOf(): T =
|
inline fun <reified T : CAdaptedFunctionType<*>> CAdaptedFunctionType.Companion.getInstanceOf(): T =
|
||||||
TODO("CAdaptedFunctionType.getInstanceOf")
|
TODO("CAdaptedFunctionType.getInstanceOf")
|
||||||
|
|||||||
+1
-1
@@ -276,7 +276,7 @@ class StubGenerator(
|
|||||||
class Pointer(val pointee: String) : TypeInfo() {
|
class Pointer(val pointee: String) : TypeInfo() {
|
||||||
override fun argToJni(name: String) = "$name.rawValue"
|
override fun argToJni(name: String) = "$name.rawValue"
|
||||||
|
|
||||||
override fun argFromJni(name: String) = "CPointer.createNullable<$pointee>($name)"
|
override fun argFromJni(name: String) = "interpretCPointer<$pointee>($name)"
|
||||||
|
|
||||||
override val jniType: String
|
override val jniType: String
|
||||||
get() = "NativePtr"
|
get() = "NativePtr"
|
||||||
|
|||||||
+16
-1
@@ -6,6 +6,7 @@ import org.jetbrains.kotlin.incremental.components.NoLookupLocation
|
|||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
import org.jetbrains.kotlin.resolve.scopes.MemberScope
|
import org.jetbrains.kotlin.resolve.scopes.MemberScope
|
||||||
|
import org.jetbrains.kotlin.types.TypeUtils
|
||||||
|
|
||||||
private val cPointerName = "CPointer"
|
private val cPointerName = "CPointer"
|
||||||
private val nativePointedName = "NativePointed"
|
private val nativePointedName = "NativePointed"
|
||||||
@@ -37,12 +38,26 @@ internal class InteropBuiltIns(builtIns: KonanBuiltIns) {
|
|||||||
|
|
||||||
val cPointerRawValue = cPointer.unsubstitutedMemberScope.getContributedVariables("rawValue").single()
|
val cPointerRawValue = cPointer.unsubstitutedMemberScope.getContributedVariables("rawValue").single()
|
||||||
|
|
||||||
|
val cPointerGetRawValue = packageScope.getContributedFunctions("getRawValue").single {
|
||||||
|
val extensionReceiverParameter = it.extensionReceiverParameter
|
||||||
|
extensionReceiverParameter != null &&
|
||||||
|
TypeUtils.getClassDescriptor(extensionReceiverParameter.type) == cPointer
|
||||||
|
}
|
||||||
|
|
||||||
val nativePointedRawPtrGetter =
|
val nativePointedRawPtrGetter =
|
||||||
nativePointed.unsubstitutedMemberScope.getContributedVariables("rawPtr").single().getter!!
|
nativePointed.unsubstitutedMemberScope.getContributedVariables("rawPtr").single().getter!!
|
||||||
|
|
||||||
|
val nativePointedGetRawPointer = packageScope.getContributedFunctions("getRawPointer").single {
|
||||||
|
val extensionReceiverParameter = it.extensionReceiverParameter
|
||||||
|
extensionReceiverParameter != null &&
|
||||||
|
TypeUtils.getClassDescriptor(extensionReceiverParameter.type) == nativePointed
|
||||||
|
}
|
||||||
|
|
||||||
val memberAt = packageScope.getContributedFunctions("memberAt").single()
|
val memberAt = packageScope.getContributedFunctions("memberAt").single()
|
||||||
|
|
||||||
val interpretPointed = packageScope.getContributedFunctions("interpretPointed").single()
|
val interpretNullablePointed = packageScope.getContributedFunctions("interpretNullablePointed").single()
|
||||||
|
|
||||||
|
val interpretCPointer = packageScope.getContributedFunctions("interpretCPointer").single()
|
||||||
|
|
||||||
val arrayGetByIntIndex = packageScope.getContributedFunctions("get").single {
|
val arrayGetByIntIndex = packageScope.getContributedFunctions("get").single {
|
||||||
KotlinBuiltIns.isInt(it.valueParameters.single().type)
|
KotlinBuiltIns.isInt(it.valueParameters.single().type)
|
||||||
|
|||||||
+3
-3
@@ -48,6 +48,9 @@ internal class KonanLower(val context: Context) {
|
|||||||
phaser.phase(KonanPhase.LOWER_INNER_CLASSES) {
|
phaser.phase(KonanPhase.LOWER_INNER_CLASSES) {
|
||||||
InnerClassLowering(context).runOnFilePostfix(irFile)
|
InnerClassLowering(context).runOnFilePostfix(irFile)
|
||||||
}
|
}
|
||||||
|
phaser.phase(KonanPhase.LOWER_INTEROP) {
|
||||||
|
InteropLowering(context).lower(irFile)
|
||||||
|
}
|
||||||
phaser.phase(KonanPhase.LOWER_CALLABLES) {
|
phaser.phase(KonanPhase.LOWER_CALLABLES) {
|
||||||
CallableReferenceLowering(context).runOnFilePostfix(irFile)
|
CallableReferenceLowering(context).runOnFilePostfix(irFile)
|
||||||
}
|
}
|
||||||
@@ -62,8 +65,5 @@ internal class KonanLower(val context: Context) {
|
|||||||
phaser.phase(KonanPhase.AUTOBOX) {
|
phaser.phase(KonanPhase.AUTOBOX) {
|
||||||
Autoboxing(context).lower(irFile)
|
Autoboxing(context).lower(irFile)
|
||||||
}
|
}
|
||||||
phaser.phase(KonanPhase.LOWER_INTEROP) {
|
|
||||||
InteropLowering(context).lower(irFile)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+3
@@ -1661,6 +1661,9 @@ internal class CodeGeneratorVisitor(val context: Context) : IrElementVisitorVoid
|
|||||||
val interop = context.interopBuiltIns
|
val interop = context.interopBuiltIns
|
||||||
|
|
||||||
return when (descriptor) {
|
return when (descriptor) {
|
||||||
|
interop.interpretNullablePointed, interop.interpretCPointer,
|
||||||
|
interop.nativePointedGetRawPointer, interop.cPointerGetRawValue -> args.single()
|
||||||
|
|
||||||
in interop.readPrimitive -> {
|
in interop.readPrimitive -> {
|
||||||
val pointerType = pointerType(codegen.getLLVMType(descriptor.returnType!!))
|
val pointerType = pointerType(codegen.getLLVMType(descriptor.returnType!!))
|
||||||
val rawPointer = args.last()
|
val rawPointer = args.last()
|
||||||
|
|||||||
+10
-5
@@ -148,20 +148,25 @@ private class InteropTransformer(val context: Context) : IrBuildingTransformer(c
|
|||||||
if (descriptor is ClassConstructorDescriptor) {
|
if (descriptor is ClassConstructorDescriptor) {
|
||||||
val type = descriptor.constructedClass.defaultType
|
val type = descriptor.constructedClass.defaultType
|
||||||
if (type.isRepresentedAs(ValueType.C_POINTER) || type.isRepresentedAs(ValueType.NATIVE_POINTED)) {
|
if (type.isRepresentedAs(ValueType.C_POINTER) || type.isRepresentedAs(ValueType.NATIVE_POINTED)) {
|
||||||
return expression.getValueArgument(0)!!
|
throw Error("Native interop types constructors must not be called directly")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (descriptor == interop.nativePointedRawPtrGetter ||
|
if (descriptor == interop.nativePointedRawPtrGetter ||
|
||||||
OverridingUtil.overrides(descriptor, interop.nativePointedRawPtrGetter)) {
|
OverridingUtil.overrides(descriptor, interop.nativePointedRawPtrGetter)) {
|
||||||
|
|
||||||
return expression.dispatchReceiver!!
|
// Replace by the intrinsic call to be handled by code generator:
|
||||||
|
return builder.irCall(interop.nativePointedGetRawPointer).apply {
|
||||||
|
extensionReceiver = expression.dispatchReceiver
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return when (descriptor) {
|
return when (descriptor) {
|
||||||
interop.cPointerRawValue.getter -> expression.dispatchReceiver!!
|
interop.cPointerRawValue.getter ->
|
||||||
|
// Replace by the intrinsic call to be handled by code generator:
|
||||||
interop.interpretPointed -> expression.getValueArgument(0)!!
|
builder.irCall(interop.cPointerGetRawValue).apply {
|
||||||
|
extensionReceiver = expression.dispatchReceiver
|
||||||
|
}
|
||||||
|
|
||||||
interop.arrayGetByIntIndex, interop.arrayGetByLongIndex -> {
|
interop.arrayGetByIntIndex, interop.arrayGetByLongIndex -> {
|
||||||
val array = expression.extensionReceiver!!
|
val array = expression.extensionReceiver!!
|
||||||
|
|||||||
Reference in New Issue
Block a user