Merge pull request #56 from JetBrains/add-fun-signatures
Add function signatures to symbol names and RTTI
This commit is contained in:
+23
-4
@@ -9,6 +9,25 @@ import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe
|
||||
|
||||
private val symbolNameAnnotation = FqName("kotlin.SymbolName")
|
||||
|
||||
private val FunctionDescriptor.signature: String
|
||||
get() {
|
||||
// TODO: KotlinType.toString seems to use unqualified names
|
||||
|
||||
val extensionReceiverPart = this.extensionReceiverParameter?.let { "${it.type}." } ?: ""
|
||||
|
||||
val argsPart = this.valueParameters.map { it.type }.joinToString(";")
|
||||
|
||||
// TODO: add return type
|
||||
// (it is not simple because return type can be changed when overriding)
|
||||
return "$extensionReceiverPart($argsPart)"
|
||||
}
|
||||
|
||||
// TODO: rename to indicate that it has signature included
|
||||
internal val FunctionDescriptor.functionName: String
|
||||
get() = with(this.original) { // basic support for generics
|
||||
"$name$signature"
|
||||
}
|
||||
|
||||
internal val FunctionDescriptor.symbolName: String
|
||||
get() {
|
||||
this.annotations.findAnnotation(symbolNameAnnotation)?.let {
|
||||
@@ -19,12 +38,12 @@ internal val FunctionDescriptor.symbolName: String
|
||||
// ignore; TODO: report compile error
|
||||
}
|
||||
}
|
||||
return "kfun:" + this.fqNameSafe.toString() // FIXME: add signature
|
||||
val containingDeclarationPart = containingDeclaration.fqNameSafe.let {
|
||||
if (it.isRoot) "" else "$it."
|
||||
}
|
||||
return "kfun:$containingDeclarationPart$functionName"
|
||||
}
|
||||
|
||||
internal val FunctionDescriptor.functionName: String
|
||||
get() = this.name.asString() // FIXME: add signature
|
||||
|
||||
internal val ClassDescriptor.symbolName: String
|
||||
get() = when (this.kind) {
|
||||
CLASS -> "kclass:"
|
||||
|
||||
+1
-1
@@ -202,7 +202,7 @@ internal class RTTIGenerator(override val context: Context) : ContextUtils {
|
||||
val vtablePtr = staticData.placeGlobalConstArray("kvtable:$className", pointerType(int8Type), vtable)
|
||||
|
||||
val methods = getMethodTableEntries(classDesc).map {
|
||||
val nameSignature = it.functionName.localHash // FIXME: add signature
|
||||
val nameSignature = it.functionName.localHash
|
||||
// TODO: compile-time resolution limits binary compatibility
|
||||
val methodEntryPoint = it.implementation.entryPointAddress
|
||||
MethodTableRecord(nameSignature, methodEntryPoint)
|
||||
|
||||
@@ -2,7 +2,7 @@ extern void *resolve_symbol(const char*);
|
||||
|
||||
int
|
||||
run_test() {
|
||||
int (*local_variable)(int) = resolve_symbol("kfun:local_variable");
|
||||
int (*local_variable)(int) = resolve_symbol("kfun:local_variable(Int)");
|
||||
|
||||
if (local_variable(3) != 14) return 1;
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@ extern void *resolve_symbol(const char*);
|
||||
|
||||
int
|
||||
run_test() {
|
||||
int (*advanced_when2)(int) = resolve_symbol("kfun:advanced_when2");
|
||||
int (*advanced_when2)(int) = resolve_symbol("kfun:advanced_when2(Int)");
|
||||
|
||||
if (advanced_when2(2) != 3) return 1;
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@ extern void *resolve_symbol(const char*);
|
||||
|
||||
int
|
||||
run_test() {
|
||||
int (*advanced_when5)(int) = resolve_symbol("kfun:advanced_when5");
|
||||
int (*advanced_when5)(int) = resolve_symbol("kfun:advanced_when5(Int)");
|
||||
|
||||
if (advanced_when5(2) != 3) return 1;
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@ extern void *resolve_symbol(const char*);
|
||||
|
||||
int
|
||||
run_test() {
|
||||
int (*if_else)(int) = resolve_symbol("kfun:if_else");
|
||||
int (*if_else)(int) = resolve_symbol("kfun:if_else(Boolean)");
|
||||
|
||||
if (if_else(0) != 24) return 1;
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@ extern void *resolve_symbol(const char*);
|
||||
|
||||
int
|
||||
run_test() {
|
||||
int (*when2)(int) = resolve_symbol("kfun:when2");
|
||||
int (*when2)(int) = resolve_symbol("kfun:when2(Int)");
|
||||
|
||||
if (when2(0) != 42) return 1;
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@ extern void *resolve_symbol(const char*);
|
||||
|
||||
int
|
||||
run_test() {
|
||||
int (*when5)(int) = resolve_symbol("kfun:when5");
|
||||
int (*when5)(int) = resolve_symbol("kfun:when5(Int)");
|
||||
|
||||
if (when5(2) != 3) return 1;
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@ extern void *resolve_symbol(const char*);
|
||||
|
||||
int
|
||||
run_test() {
|
||||
int (*when_through)(int) = resolve_symbol("kfun:when_through");
|
||||
int (*when_through)(int) = resolve_symbol("kfun:when_through(Int)");
|
||||
|
||||
if (when_through(2) != 3) return 1;
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@ extern void *resolve_symbol(const char*);
|
||||
|
||||
int
|
||||
run_test() {
|
||||
int (*cycle)(int) = resolve_symbol("kfun:cycle");
|
||||
int (*cycle)(int) = resolve_symbol("kfun:cycle(Int)");
|
||||
|
||||
if (cycle(1) != 2) return 1;
|
||||
if (cycle(0) != 1) return 1;
|
||||
|
||||
@@ -2,7 +2,7 @@ extern void *resolve_symbol(const char*);
|
||||
|
||||
int
|
||||
run_test() {
|
||||
int (*cycle_do)(int) = resolve_symbol("kfun:cycle_do");
|
||||
int (*cycle_do)(int) = resolve_symbol("kfun:cycle_do(Int)");
|
||||
|
||||
if (cycle_do(3) != 5) return 1;
|
||||
if (cycle_do(0) != 3) return 1;
|
||||
|
||||
@@ -2,11 +2,11 @@ extern void *resolve_symbol(const char*);
|
||||
|
||||
int
|
||||
run_test() {
|
||||
int (*square)(int) = resolve_symbol("kfun:square");
|
||||
int (*sum_of_squares)(int, int) = resolve_symbol("kfun:sumOfSquares");
|
||||
int (*diff_of_squares)(int, int) = resolve_symbol("kfun:diffOfSquares");
|
||||
int (*mod)(int, int) = resolve_symbol("kfun:mod");
|
||||
int (*div)(int, int) = resolve_symbol("kfun:remainder");
|
||||
int (*square)(int) = resolve_symbol("kfun:square(Int)");
|
||||
int (*sum_of_squares)(int, int) = resolve_symbol("kfun:sumOfSquares(Int;Int)");
|
||||
int (*diff_of_squares)(int, int) = resolve_symbol("kfun:diffOfSquares(Int;Int)");
|
||||
int (*mod)(int, int) = resolve_symbol("kfun:mod(Int;Int)");
|
||||
int (*div)(int, int) = resolve_symbol("kfun:remainder(Int;Int)");
|
||||
|
||||
if (square(2) != 4) return 1;
|
||||
if (sum_of_squares(2, 4) != 20) return 1;
|
||||
|
||||
@@ -2,7 +2,7 @@ extern void *resolve_symbol(const char*);
|
||||
|
||||
int
|
||||
run_test() {
|
||||
int (*bool_yes)() = resolve_symbol("kfun:bool_yes");
|
||||
int (*bool_yes)() = resolve_symbol("kfun:bool_yes()");
|
||||
|
||||
if (!bool_yes()) return 1;
|
||||
|
||||
|
||||
@@ -3,12 +3,12 @@ extern void *resolve_symbol(const char*);
|
||||
|
||||
int
|
||||
run_test() {
|
||||
int (*eqeqB)(uint8_t, uint8_t) = resolve_symbol("kfun:eqeqB");
|
||||
int (*eqeqS)(int16_t, int16_t) = resolve_symbol("kfun:eqeqS");
|
||||
int (*eqeqI)(int , int ) = resolve_symbol("kfun:eqeqI");
|
||||
int (*eqeqL)(int64_t, int64_t) = resolve_symbol("kfun:eqeqL");
|
||||
int (*eqeqF)(float , float ) = resolve_symbol("kfun:eqeqF");
|
||||
int (*eqeqD)(double , double ) = resolve_symbol("kfun:eqeqD");
|
||||
int (*eqeqB)(uint8_t, uint8_t) = resolve_symbol("kfun:eqeqB(Byte;Byte)");
|
||||
int (*eqeqS)(int16_t, int16_t) = resolve_symbol("kfun:eqeqS(Short;Short)");
|
||||
int (*eqeqI)(int , int ) = resolve_symbol("kfun:eqeqI(Int;Int)");
|
||||
int (*eqeqL)(int64_t, int64_t) = resolve_symbol("kfun:eqeqL(Long;Long)");
|
||||
int (*eqeqF)(float , float ) = resolve_symbol("kfun:eqeqF(Float;Float)");
|
||||
int (*eqeqD)(double , double ) = resolve_symbol("kfun:eqeqD(Double;Double)");
|
||||
if (!eqeqB(3 , 3 )) return 1;
|
||||
if (!eqeqS(3 , 3 )) return 1;
|
||||
if (!eqeqI(3 , 3 )) return 1;
|
||||
|
||||
@@ -2,9 +2,9 @@ extern void *resolve_symbol(const char*);
|
||||
|
||||
int
|
||||
run_test() {
|
||||
int (*plus_eq)(int) = resolve_symbol("kfun:minus_eq");
|
||||
int (*plus_eq)(int) = resolve_symbol("kfun:minus_eq(Int)");
|
||||
|
||||
if (plus_eq(23) != 12) return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@ extern void *resolve_symbol(const char*);
|
||||
|
||||
int
|
||||
run_test() {
|
||||
int (*plus_eq)(int) = resolve_symbol("kfun:plus_eq");
|
||||
int (*plus_eq)(int) = resolve_symbol("kfun:plus_eq(Int)");
|
||||
|
||||
if (plus_eq(3) != 14) return 1;
|
||||
|
||||
|
||||
@@ -3,13 +3,13 @@ extern void *resolve_symbol(const char*);
|
||||
|
||||
int
|
||||
run_test() {
|
||||
int (*sumIB)(int, uint8_t) = resolve_symbol("kfun:sumIB");
|
||||
int (*sumIS)(int, int16_t) = resolve_symbol("kfun:sumIS");
|
||||
int (*sumII)(int, int ) = resolve_symbol("kfun:sumII");
|
||||
int64_t (*sumIL)(int, int64_t) = resolve_symbol("kfun:sumIL");
|
||||
float (*sumIF)(int, float ) = resolve_symbol("kfun:sumIF");
|
||||
double (*sumID)(int, double ) = resolve_symbol("kfun:sumID");
|
||||
double (*modID)(int, double ) = resolve_symbol("kfun:modID");
|
||||
int (*sumIB)(int, uint8_t) = resolve_symbol("kfun:sumIB(Int;Byte)");
|
||||
int (*sumIS)(int, int16_t) = resolve_symbol("kfun:sumIS(Int;Short)");
|
||||
int (*sumII)(int, int ) = resolve_symbol("kfun:sumII(Int;Int)");
|
||||
int64_t (*sumIL)(int, int64_t) = resolve_symbol("kfun:sumIL(Int;Long)");
|
||||
float (*sumIF)(int, float ) = resolve_symbol("kfun:sumIF(Int;Float)");
|
||||
double (*sumID)(int, double ) = resolve_symbol("kfun:sumID(Int;Double)");
|
||||
double (*modID)(int, double ) = resolve_symbol("kfun:modID(Int;Double)");
|
||||
if (sumIB(2, 3) != 5) return 1;
|
||||
if (sumIS(2, 3) != 5) return 1;
|
||||
if (sumII(2, 3) != 5) return 1;
|
||||
|
||||
@@ -2,7 +2,7 @@ extern void *resolve_symbol(const char*);
|
||||
|
||||
int
|
||||
run_test() {
|
||||
int (*sum3)() = resolve_symbol("kfun:sum3");
|
||||
int (*sum3)() = resolve_symbol("kfun:sum3()");
|
||||
|
||||
if (sum3() != 36) return 1;
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@ extern void *resolve_symbol(const char*);
|
||||
|
||||
int
|
||||
run_test() {
|
||||
int (*sum)(int, int) = resolve_symbol("kfun:sumFooBar");
|
||||
int (*sum)(int, int) = resolve_symbol("kfun:sumFooBar(Int;Int)");
|
||||
|
||||
if (sum(2, 3) != 5) return 1;
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@ extern void *resolve_symbol(const char*);
|
||||
|
||||
int
|
||||
run_test() {
|
||||
int (*sum)(int) = resolve_symbol("kfun:sum");
|
||||
int (*sum)(int) = resolve_symbol("kfun:sum(Int)");
|
||||
|
||||
if (sum(2) != 35) return 1;
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@ extern void *resolve_symbol(const char*);
|
||||
|
||||
int
|
||||
run_test() {
|
||||
int (*foo)(int, int) = resolve_symbol("kfun:foo");
|
||||
int (*foo)(int, int) = resolve_symbol("kfun:foo(Int;Int)");
|
||||
|
||||
if (foo(2, 3) != 2) return 1;
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@ void * resolve_symbol(char *name) {
|
||||
int
|
||||
kotlinNativeMain() {
|
||||
#ifdef RUN_TEST
|
||||
void (*main)(void *) = resolve_symbol("kfun:main");
|
||||
void (*main)(void *) = resolve_symbol("kfun:main(Array<String>)");
|
||||
main((void *)0);
|
||||
return 0;
|
||||
#else
|
||||
|
||||
@@ -2,7 +2,7 @@ extern void *resolve_symbol(const char*);
|
||||
|
||||
int
|
||||
run_test() {
|
||||
void (*main)(void*) = resolve_symbol("kfun:main");
|
||||
void (*main)(void*) = resolve_symbol("kfun:main(Array<String>)");
|
||||
|
||||
main((void*)0);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user