Rewrote enum lowering to support usage from other modules.
- Split up enum lowering into two stages: descriptors creation and IR creation. - Added link stage test. - Enum.valueOf() uses binary search instead of linear.
This commit is contained in:
@@ -27,15 +27,26 @@ fun ThrowNoWhenBranchMatchedException(): Nothing {
|
||||
@ExportForCppRuntime
|
||||
internal fun TheEmptyString() = ""
|
||||
|
||||
fun <T: Enum<T>> valueOfForEnum(name: String, arr: Array<T>) : T
|
||||
fun <T: Enum<T>> valueOfForEnum(name: String, values: Array<T>) : T
|
||||
{
|
||||
for (x in arr)
|
||||
if (x.name == name)
|
||||
return x
|
||||
var left = 0
|
||||
var right = values.size - 1
|
||||
while (left <= right) {
|
||||
val middle = (left + right) / 2
|
||||
val x = values[middle].name.compareTo(name)
|
||||
when {
|
||||
x < 0 -> left = middle + 1
|
||||
x > 0 -> right = middle - 1
|
||||
else -> return values[middle]
|
||||
}
|
||||
}
|
||||
throw Exception("Invalid enum name: $name")
|
||||
}
|
||||
|
||||
fun <T: Enum<T>> valuesForEnum(values: Array<T>): Array<T>
|
||||
{
|
||||
return values.clone() as Array<T>
|
||||
val result = Array<T?>(values.size, { null })
|
||||
for (value in values)
|
||||
result[value.ordinal] = value
|
||||
return result as Array<T>
|
||||
}
|
||||
Reference in New Issue
Block a user