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. | |