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