diff options
Diffstat (limited to 'examples/selfpatch.zc')
| -rw-r--r-- | examples/selfpatch.zc | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/examples/selfpatch.zc b/examples/selfpatch.zc new file mode 100644 index 0000000..e3f821d --- /dev/null +++ b/examples/selfpatch.zc @@ -0,0 +1,16 @@ +// code is data: find the literal 'A' inside f's compiled words and rewrite it. +// on the jit the store lands on translated code, which gets dropped and +// retranslated on the next call. +fn f() { put_c('A'); return 0; } +fn litw(v) { return v + v + 1; } // how the vm encodes a literal push +fn main() { + let p = f; + f(); + while (*p != litw('A')) p++; + *p = litw('B'); + f(); + *p = litw('C'); + f(); + put_c(10); + return 0; +} |
