Showing the changes to docs (1 of 4 files). Show all
Unified · Split
| @@ -0,0 +1,43 @@ | |||
| 1 | Function signatures will be output by the Limbo compiler if you pass it the | ||
| 2 | "-D S" debug option. | ||
| 3 | |||
| 4 | For example, the Sys->print function has this summary output for it: | ||
| 5 | |||
| 6 | signed Sys->print type fn(s: string, *): int len 6 sig 0xac849033 | ||
| 7 | |||
| 8 | The type "fn(s: string, *): int" is how the function is declared in the | ||
| 9 | module/sys.m file. | ||
| 10 | |||
| 11 | Function signatures are generated by the sign function in the limbo/types.c | ||
| 12 | file. We add the debug code after the md5 function call: | ||
| 13 | |||
| 14 | md5(sig, sigend, md5sig, nil); | ||
| 15 | if(debug['S']) { | ||
| 16 | print("sign %D len %d\n", d, sigend); | ||
| 17 | print("%s\n", (char*)sig); | ||
| 18 | } | ||
| 19 | |||
| 20 | This results in the following additional two debug lines: | ||
| 21 | |||
| 22 | sign Sys->print len 6 | ||
| 23 | f*(s)i | ||
| 24 | |||
| 25 | The "f*(s)i" string is the function signature that needs to be hashed using the | ||
| 26 | MD5 algorithm. Additionally, the following code is used to reduce the hash | ||
| 27 | value to four bytes: | ||
| 28 | |||
| 29 | for(i = 0; i < MD5dlen; i += 4) | ||
| 30 | t->sig ^= md5sig[i+0] | (md5sig[i+1]<<8) | (md5sig[i+2]<<16) | (md5sig[i+3]<<24); | ||
| 31 | |||
| 32 | We can reproduce this in Python using the md5 module, obtaining the hash value | ||
| 33 | then combining each eight digit segment of it using XOR, before reversing the | ||
| 34 | endianness of the resulting value: | ||
| 35 | |||
| 36 | import md5 | ||
| 37 | h = md5.md5("f*(s)i").hexdigest() | ||
| 38 | l = map(lambda x: int(h[x:x+2], 16), range(0, 32, 2)) | ||
| 39 | hd = sum(map(lambda x: reduce(lambda y, z: y ^ z, l[x::4]) << (x * 8), range(4))) | ||
| 40 | |||
| 41 | The rtsign and idsign functions in the limbo/types.c file are responsible for | ||
| 42 | creating a signature for a function. The sigkind array contains the characters | ||
| 43 | used for each type of object that will be serialised. | ||