diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/ContextUtils.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/ContextUtils.kt index a06582f1ddb..9fd1b3650e7 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/ContextUtils.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/ContextUtils.kt @@ -116,14 +116,7 @@ internal interface ContextUtils { */ val String.globalHashBase64: String get() { - val bytes = this.toByteArray(Charsets.UTF_8) - val hashBytes = this.globalHashBytes - - val base64Bytes = java.util.Base64.getEncoder().encode(globalHashBytes) - // TODO: do not use JRE for base64 - // (it is impossible right now due to native interop limitations) - - return String(base64Bytes, Charsets.US_ASCII) + return base64Encode(globalHashBytes) } /** diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/HashUtils.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/HashUtils.kt index f446edf9284..72a83d26c32 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/HashUtils.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/HashUtils.kt @@ -21,4 +21,15 @@ internal fun globalHash(data: ByteArray, retValPlacement: Placement): GlobalHash return res } +internal fun base64Encode(data: ByteArray): String { + memScoped { + val resultSize = 4 * data.size / 3 + 3 + 1 + val result = alloc(NativeArray of Int8Box length resultSize) + val bytes = allocNativeArrayOf(data) + Base64Encode(bytes.ptr, data.size, result.ptr, resultSize) + // TODO: any better way to do that without two copies? + return CString.fromArray(result).toString() + } +} + internal class LocalHash(val value: Long) : ConstValue by Int64(value) diff --git a/common/src/hash/cpp/Base64.cpp b/common/src/hash/cpp/Base64.cpp index f08be5710cb..e99dda97d49 100644 --- a/common/src/hash/cpp/Base64.cpp +++ b/common/src/hash/cpp/Base64.cpp @@ -36,7 +36,8 @@ extern "C" { #endif int Base64Encode( - const void* dataBuf, uint32_t dataLength, char* result, uint32_t resultSize) { + const void* dataBuf, uint32_t dataLength, void* resultBuf, uint32_t resultSize) { + char *result = reinterpret_cast(resultBuf); const uint8_t *data = reinterpret_cast(dataBuf); size_t resultIndex = 0; size_t x; diff --git a/common/src/hash/headers/Base64.h b/common/src/hash/headers/Base64.h index 64ba4419a71..70d5df36691 100644 --- a/common/src/hash/headers/Base64.h +++ b/common/src/hash/headers/Base64.h @@ -8,7 +8,7 @@ extern "C" { #endif int Base64Encode( - const void* input, uint32_t inputLen, char* output, uint32_t outputLen); + const void* input, uint32_t inputLen, void* output, uint32_t outputLen); int Base64Decode( const char* input, uint32_t inputLen, void* output, uint32_t* outputLen);