Merge pull request #56 from JetBrains/add-fun-signatures

Add function signatures to symbol names and RTTI
This commit is contained in:
SvyatoslavScherbina
2016-11-14 14:13:12 +07:00
committed by GitHub
23 changed files with 61 additions and 42 deletions
@@ -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:"
@@ -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;
+1 -1
View File
@@ -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);