Skip to content
This repository has been archived by the owner on Aug 10, 2021. It is now read-only.

Commit

Permalink
Faster stack slot management in runtime.
Browse files Browse the repository at this point in the history
  • Loading branch information
olonho committed Mar 27, 2019
1 parent aa81017 commit b076507
Show file tree
Hide file tree
Showing 8 changed files with 424 additions and 214 deletions.
5 changes: 4 additions & 1 deletion backend.native/tests/runtime/memory/weak0.kt
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ data class Data(val s: String)
fun localWeak(): WeakReference<Data> {
val x = Data("Hello")
val weak = WeakReference(x)

println(weak.get())
return weak
}
Expand All @@ -29,10 +28,14 @@ fun multiWeak(): Array<WeakReference<Data>> {

@Test fun runTest() {
val weak = localWeak()
kotlin.native.internal.GC.collect()
val value = weak.get()
println(value?.toString())

val weaks = multiWeak()

kotlin.native.internal.GC.collect()

weaks.forEach {
it -> if (it.get()?.s != null) throw Error("not null")
}
Expand Down
2 changes: 1 addition & 1 deletion runtime/src/launcher/cpp/launcher.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ OBJ_GETTER(setupArgs, int argc, const char** argv) {
ArrayHeader* array = result->array();
for (int index = 1; index < argc; index++) {
CreateStringFromCString(
argv[index], ArrayAddressOfElementAt(array, index - 1));
argv[index], HEAP_RETURN_SLOT(ArrayAddressOfElementAt(array, index - 1)));
}
return result;
}
Expand Down
2 changes: 1 addition & 1 deletion runtime/src/main/cpp/Atomic.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -208,7 +208,7 @@ OBJ_GETTER(Kotlin_AtomicReference_get, KRef thiz) {
// rescheduled unluckily, between the moment value is read from the field and RC is incremented,
// object may go away.
AtomicReferenceLayout* ref = asAtomicReference(thiz);
RETURN_RESULT_OF(ReadRefLocked, &ref->value_, &ref->lock_);
RETURN_RESULT_OF(ReadHeapRefLocked, &ref->value_, &ref->lock_);
}

} // extern "C"
6 changes: 3 additions & 3 deletions runtime/src/main/cpp/Exceptions.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,7 @@ OBJ_GETTER0(GetCurrentStackTrace) {
OBJ_GETTER(GetStackTraceStrings, KConstRef stackTrace) {
#if OMIT_BACKTRACE
ObjHeader* result = AllocArrayInstance(theArrayTypeInfo, 1, OBJ_RESULT);
CreateStringFromCString("<UNIMPLEMENTED>", ArrayAddressOfElementAt(result->array(), 0));
CreateStringFromCString("<UNIMPLEMENTED>", HEAP_RETURN_SLOT(ArrayAddressOfElementAt(result->array(), 0)));
return result;
#else
uint32_t size = stackTrace->array()->count_;
Expand All @@ -172,7 +172,7 @@ OBJ_GETTER(GetStackTraceStrings, KConstRef stackTrace) {
}
char line[512];
konan::snprintf(line, sizeof(line) - 1, "%s (%p)", symbol, (void*)(intptr_t)address);
CreateStringFromCString(line, ArrayAddressOfElementAt(strings->array(), index));
CreateStringFromCString(line, HEAP_RETURN_SLOT(ArrayAddressOfElementAt(strings->array(), index)));
}
#else
if (size > 0) {
Expand All @@ -195,7 +195,7 @@ OBJ_GETTER(GetStackTraceStrings, KConstRef stackTrace) {
} else {
result = symbol;
}
CreateStringFromCString(result, ArrayAddressOfElementAt(strings->array(), index));
CreateStringFromCString(result, HEAP_RETURN_SLOT(ArrayAddressOfElementAt(strings->array(), index)));
}
}
#endif
Expand Down
13 changes: 6 additions & 7 deletions runtime/src/main/cpp/KString.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1176,23 +1176,22 @@ OBJ_GETTER(Kotlin_String_subSequence, KString thiz, KInt startIndex, KInt endInd
RETURN_RESULT_OF0(TheEmptyString);
}
KInt length = endIndex - startIndex;
ArrayHeader* result = AllocArrayInstance(
theStringTypeInfo, length, OBJ_RESULT)->array();
ArrayHeader* result = AllocArrayInstance(theStringTypeInfo, length, OBJ_RESULT)->array();
memcpy(CharArrayAddressOfElementAt(result, 0),
CharArrayAddressOfElementAt(thiz, startIndex),
length * sizeof(KChar));
RETURN_OBJ(result->obj());
}

const KChar* Kotlin_String_utf16pointer(KString message) {
RuntimeAssert(message->type_info() == theStringTypeInfo, "Must use a string");
const KChar* utf16 = CharArrayAddressOfElementAt(message, 0);
return utf16;
RuntimeAssert(message->type_info() == theStringTypeInfo, "Must use a string");
const KChar* utf16 = CharArrayAddressOfElementAt(message, 0);
return utf16;
}

KInt Kotlin_String_utf16length(KString message) {
RuntimeAssert(message->type_info() == theStringTypeInfo, "Must use a string");
return message->count_ * sizeof(KChar);
RuntimeAssert(message->type_info() == theStringTypeInfo, "Must use a string");
return message->count_ * sizeof(KChar);
}


Expand Down
Loading

0 comments on commit b076507

Please sign in to comment.