Labels as values and threaded-code interpretation
Timon Gehr
timon.gehr at gmx.ch
Sat Jun 1 09:13:16 PDT 2013
On 06/01/2013 07:29 AM, Alex Rønne Petersen wrote:
> Hi,
>
> I'm sure this has been brought up before, but I feel I need to bring it
> up again (because I'm going to be writing a threaded-code interpreter):
> http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html
>
> This is an incredibly important extension. The final switch statement is
> not a replacement because it doesn't allow the programmer to store a
> label address directly into a code stream, which is what's essential to
> write a threaded-code interpreter.
>
I'd also like to see this.
> The Erlang folks went through hell just to use this feature; see the 5th
> Q at:
> http://www.erlang.org/doc/installation_guide/INSTALL-WIN32.html#Frequently-Asked-Questions
>
>
> The idea is to be able to write code like this:
>
> ----
>
> import std.algorithm;
>
> enum Op : ubyte
> {
> imm,
> add,
> sub,
> // ...
> ret,
> }
>
> final class Insn
> {
> Op op;
> size_t[] args;
> void* lbl;
> Insn next;
> }
>
> final class State
> {
> Insn pc;
> size_t[64] regs;
> }
>
> size_t interp(Insn[] code)
> {
> // Set up the instruction stream with label addresses
> // the first time that it is executed. Label addresses
> // are stable, so we only do this once.
>
> foreach (insn; code.filter!(x => !x.lbl)())
> {
> void* lbl;
>
> with (Op)
> {
> final switch (insn.op)
> {
> case imm: lbl = &&handle_imm; break;
> case add: lbl = &&handle_add; break;
> case sub: lbl = &&handle_sub; break;
> // ...
> case ret: lbl = &&handle_ret; break;
> }
> }
>
> insn.lbl = lbl;
> }
> ...
(This must be supported at compile time!)
More information about the Digitalmars-d
mailing list