poke-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[COMMITTED] pkl: gen: move compiler built-ins to a RAS file


From: Jose E. Marchesi
Subject: [COMMITTED] pkl: gen: move compiler built-ins to a RAS file
Date: Fri, 24 Dec 2021 13:54:06 +0100
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/28.0.50 (gnu/linux)


2021-12-24  Jose E. Marchesi  <jemarch@gnu.org>

        * libpoke/pkl-gen-builtins.pks: New file.
        * libpoke/Makefile.am (libpoke_la_SOURCES): Add
        pkl-gen-builtins.pks and pkl-gen-builtins.pkc.
        (MOSTLYCLEANFILES): Add pkl-gen-builtins.pkc.tmp.
        (BUILT_SOURCES): Add pkl-gen-builtins.pkc.
        * libpoke/pkl-gen.c (pkl_gen_ps_comp_stmt): Use the RAS
        implementations of the compiler built-ins.
---
 ChangeLog                    |  10 +
 libpoke/Makefile.am          |  10 +-
 libpoke/pkl-gen-builtins.pks | 485 +++++++++++++++++++++++++++++++++++++++++++
 libpoke/pkl-gen.c            | 207 ++++--------------
 4 files changed, 541 insertions(+), 171 deletions(-)
 create mode 100644 libpoke/pkl-gen-builtins.pks

diff --git a/ChangeLog b/ChangeLog
index 7054c953..ad1af792 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2021-12-24  Jose E. Marchesi  <jemarch@gnu.org>
+
+       * libpoke/pkl-gen-builtins.pks: New file.
+       * libpoke/Makefile.am (libpoke_la_SOURCES): Add
+       pkl-gen-builtins.pks and pkl-gen-builtins.pkc.
+       (MOSTLYCLEANFILES): Add pkl-gen-builtins.pkc.tmp.
+       (BUILT_SOURCES): Add pkl-gen-builtins.pkc.
+       * libpoke/pkl-gen.c (pkl_gen_ps_comp_stmt): Use the RAS
+       implementations of the compiler built-ins.
+
 2021-12-23  Jose E. Marchesi  <jemarch@gnu.org>
 
        * pickles/asn1-ber.pk (BER_Identifier): Add integrity checks for
diff --git a/libpoke/Makefile.am b/libpoke/Makefile.am
index 428cd827..e7849396 100644
--- a/libpoke/Makefile.am
+++ b/libpoke/Makefile.am
@@ -47,8 +47,8 @@ libpoke_la_SOURCES = libpoke.h libpoke.c \
                      pkl-asm.h pkl-asm.c \
                      pkl-diag.h pkl-diag.c \
                      pkl-parser.h pkl-parser.c \
-                     pkl-gen.pks pkl-asm.pks \
-                     pkl-gen.pkc pkl-asm.pkc \
+                     pkl-gen.pks pkl-asm.pks pkl-gen-builtins.pks \
+                     pkl-gen.pkc pkl-asm.pkc pkl-gen-builtins.pkc \
                      pkl-insn.def pkl-ops.def pkl-attrs.def \
                      pvm.h pvm.c \
                      pvm-val.c pvm-val.h \
@@ -85,12 +85,12 @@ endif HAVE_PROC
        srcdir=$(srcdir) $(RAS_AWK) -f $(srcdir)/ras $< > $$outfile.tmp \
        && mv $$outfile.tmp $(srcdir)/$$outfile
 
-pkl-gen.pkc pkl-asm.pkc: $(srcdir)/ras $(srcdir)/pkl-insn.def
-MOSTLYCLEANFILES += pkl-gen.pkc.tmp pkl-asm.pkc.tmp
+pkl-gen.pkc pkl-gen-builtins.pkc pkl-asm.pkc: $(srcdir)/ras 
$(srcdir)/pkl-insn.def
+MOSTLYCLEANFILES += pkl-gen.pkc.tmp pkl-gen-builtins.pkc.tmp pkl-asm.pkc.tmp
 
 EXTRA_DIST = ras
 
-BUILT_SOURCES = pkl-gen.pkc pkl-asm.pkc
+BUILT_SOURCES = pkl-gen.pkc pkl-gen-builtins.pkc pkl-asm.pkc
 
 AM_LFLAGS = -d
 # The Automake generated .l.c rule is broken: When executed in a VPATH build,
diff --git a/libpoke/pkl-gen-builtins.pks b/libpoke/pkl-gen-builtins.pks
new file mode 100644
index 00000000..615d7780
--- /dev/null
+++ b/libpoke/pkl-gen-builtins.pks
@@ -0,0 +1,485 @@
+;;; -*- mode: poke-ras -*-
+;;; pkl-gen-builtins.pks - Built-in bodies
+
+;;; Copyright (C) 2021 Jose E. Marchesi
+
+;;; This program is free software: you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation, either version 3 of the License, or
+;;; (at your option) any later version.
+;;;
+;;; This program is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY ; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with this program.  If not, see <http: //www.gnu.org/licenses/>.
+
+;;; This file contains the bodies of the several compiler built-ins.
+;;; Note that each macro should expand to the body of a function,
+;;; and handle its arguments and return value whenever necessary.
+
+;;; RAS_MACRO_BUILTIN_RAND
+;;;
+;;; Body of the `rand' compiler built-in with prototype
+;;; (uint<32> seed = 0) int<32>
+
+        .macro builtin_rand
+        pushvar 0, 0
+        rand
+        return
+        .end
+
+;;; RAS_MACRO_BUILTIN_GET_ENDIAN
+;;;
+;;; Body of the `get_endian' compiler built-in with protype
+;;; () int<32>
+
+        .macro builtin_get_endian
+        pushend
+        return
+        .end
+
+;;; RAS_MACRO_BUILTIN_SET_ENDIAN
+;;;
+;;; Body of the `set_endian' compiler built-in with prototype
+;;; (int<32> endian) int<32>
+
+        .macro builtin_set_endian
+        pushvar 0, 0
+        popend
+        ;; Always return `true' to facilitate using this function
+        ;; in struct constraint expressions.
+        push int<32>1
+        return
+        .end
+
+;;; RAS_MACRO_BUILTIN_GET_IOS
+;;;
+;;; Body of the `get_ios' compiler built-in with prototype
+;;; () int<32>
+
+        .macro builtin_get_ios
+        pushios
+        return
+        .end
+
+;;; RAS_MACRO_BUILTIN_SET_IOS
+;;;
+;;; Body of the `set_ios' compiler built-in with prototype
+;;; (int<32> ios) int<32>
+
+        .macro builtin_set_ios
+        pushvar 0, 0
+        popios
+        ;; Always return `true' to facilitate using this function
+        ;; in struct constraint expressions.
+        push int<32>1
+        return
+        .end
+
+;;; RAS_MACRO_BUILTIN_OPEN
+;;;
+;;; Body of the `open' compiler built-in with prototype
+;;; (string handler, uint<64> flags = 0) int<32>
+
+        .macro builtin_open
+        pushvar 0, 0
+        pushvar 0, 1
+        open
+        return
+        .end
+
+;;; RAS_MACRO_BUILTIN_CLOSE
+;;;
+;;; Body of the `close' compiler built-in with prototype
+;;; (int<32> ios) void
+
+        .macro builtin_close
+        pushvar 0, 0
+        close
+        .end
+
+;;; RAS_MACRO_BUILTIN_IOSIZE
+;;;
+;;; Body of the `iosize' compiler built-in with prototype
+;;; (int<32> ios = get_ios) offset<uint<64>,8>
+
+        .macro builtin_iosize
+        pushvar 0, 0
+        iosize
+        nip
+        return
+        .end
+
+;;; RAS_MACRO_BUILTIN_IOFLAGS
+;;;
+;;; Body of the `iosize' compiler built-in with prototype
+;;; (int<32> ios = get_ios) uint<64>
+
+        .macro builtin_ioflags
+        pushvar 0, 0
+        ioflags
+        nip
+        return
+        .end
+
+;;; RAS_MACRO_BUILTIN_IOBIAS
+;;;
+;;; Body of the `iobias' compiler built-in with prototype
+;;; (int<32> ios = get_ios) offset<uint<64>,1>
+
+        .macro builtin_iobias
+        pushvar 0, 0
+        iogetb
+        nip
+        return
+        .end
+
+;;; RAS_MACRO_BUILTIN_IOSETBIAS
+;;;
+;;; Body of the `iosetbias' compiler built-in with prototype
+;;; (offset<uint<64>,1> bias = 0#1, int<32>
+
+        .macro builtin_iosetbias
+        pushvar 0, 0
+        pushvar 0, 1
+        iosetb
+        nip
+        .end
+
+;;; RAS_MACRO_BUILTIN_FLUSH
+;;;
+;;; Body of the `flush' compiler built-in with prototype
+;;; (int<32> ios, offset<uint<64>,1> offset) void:
+
+        .macro builtin_flush
+        pushvar 0, 0
+        pushvar 0, 1
+        ogetm
+        nip
+        flush
+        .end
+
+;;; RAS_MACRO_BUILTIN_GET_TIME
+;;;
+;;; Body of the `get_time' compiler built-in with prototype
+;;; () int<64>[2]
+
+        .macro builtin_get_time
+        time
+        return
+        .end
+
+;;; RAS_MACRO_BUILTIN_SLEEP
+;;;
+;;; Body of the `sleep' compiler built-in with prototype
+;;; (int<64> sec, int<64> nsec = 0) void
+
+        .macro builtin_sleep
+        pushvar 0, 0
+        pushvar 0, 1
+        sleep
+        drop
+        drop
+        .end
+
+;;; RAS_MACRO_BUILTIN_STRACE
+;;;
+;;; Body of the `strace' compiler built-in with prototype
+;;; () void
+
+        .macro builtin_strace
+        strace 0
+        .end
+
+;;; RAS_MACRO_BUILTIN_GETENV
+;;;
+;;; Body of the `getenv' compiler built-in with prototype
+;;; (string name) string
+
+        .macro builtin_getenv
+        pushvar 0, 0
+        getenv
+        nip
+        bnn .env_var_found
+        push PVM_E_INVAL
+        raise
+.env_var_found:
+        return
+        .end
+
+;;; RAS_MACRO_BUILTIN_GET_COLOR_BGCOLOR
+;;;
+;;; Body of the `term_get_color' and `term_get_bgcolor' compiler
+;;; built-in with prototypes
+;;; () int<32>[3]
+;;;
+;;; This macro requires the C variable `comp_stmt_builtin' defined to
+;;; either PKL_AST_BUILTIN_TERM_GET_COLOR or
+;;; PKL_AST_BUILTIN_TERM_GET_BGCOLOR.
+
+        .macro builtin_get_color_bgcolor
+        .let #itype = pvm_make_integral_type (pvm_make_ulong (32, 64), 
pvm_make_int (1, 32))
+        push #itype
+        push null
+        mktya
+        push ulong<64>3
+        mka                     ; ARR
+        tor                     ; _
+   .c if (comp_stmt_builtin == PKL_AST_BUILTIN_TERM_GET_COLOR)
+   .c {
+        pushoc                  ; R G B
+   .c }
+   .c else
+   .c {
+        pushobc                 ; R G B
+   .c }
+        swap
+        rot                     ; B G R
+        fromr                   ; B G R ARR
+        push ulong<64>0
+        rot
+        ains                    ; B G ARR
+        push ulong<64>1
+        rot
+        ains                    ; B ARR
+        push ulong<64>2
+        rot
+        ains                    ; ARR
+        return
+        .end
+
+;;; RAS_MACRO_BUILTIN_SET_COLOR_BGCOLOR
+;;;
+;;; Body of the `term_set_color' and `term_set_bgcolor' compiler
+;;; built-in with prototypes
+;;; (int<32>[3] color) void
+;;;
+;;; This macro requires the C variable `comp_stmt_builtin' defined to
+;;; either PKL_AST_BUILTIN_TERM_SET_COLOR or
+;;; PKL_AST_BUILTIN_TERM_SET_BGCOLOR.
+
+        .macro builtin_set_color_bgcolor
+        pushvar 0, 0
+        push ulong<64>0
+        aref
+        tor
+        drop
+        push ulong<64>1
+        aref
+        tor
+        drop
+        push ulong<64>2
+        aref
+        tor
+        drop
+        drop
+        fromr
+        fromr
+        fromr
+        swap
+        rot
+   .c if (comp_stmt_builtin == PKL_AST_BUILTIN_TERM_SET_COLOR)
+   .c {
+        popoc
+   .c }
+   .c else
+   .c {
+        popobc
+   .c }
+        .end
+
+;;; RAS_MACRO_BUILTIN_TERM_BEGIN_CLASS
+;;;
+;;; Body of the `term_begin_class' compiler built-in with prototype
+;;; (string class) void
+
+        .macro builtin_term_begin_class
+        pushvar 0, 0
+        begsc
+        .end
+
+;;; RAS_MACRO_BUILTIN_TERM_END_CLASS
+;;;
+;;; Body of the `term_end_class' compiler built-in with prototype
+;;; (string class) void
+
+        .macro builtin_term_end_class
+        pushvar 0, 0
+        endsc
+        .end
+
+;;; RAS_MACRO_BUILTIN_TERM_BEGIN_HYPERLINK
+;;;
+;;; Body of the `term_begin_hyperlink' compiler built-in with prototype
+;;; (string url, string id = "") void
+
+        .macro builtin_term_begin_hyperlink
+        pushvar 0, 0
+        pushvar 0, 1
+        beghl
+        .end
+
+;;; RAS_MACRO_BUILTIN_TERM_END_HYPERLINK
+;;;
+;;; Body of the `term_end_hyperlink' compiler built-in with prototype
+;;; () void
+
+        .macro builtin_term_end_hyperlink
+        endhl
+        .end
+
+;;; RAS_MACRO_BUILTIN_VM_OBASE
+;;;
+;;; Body of the `vm_obase' compiler built-in with prototype
+;;; () int<32>
+
+        .macro builtin_vm_obase
+        pushob
+        return
+        .end
+
+;;; RAS_MACRO_BUILTIN_VM_SET_OBASE
+;;;
+;;; Body of the `vm_set_obase' compiler built-in with prototype
+;;; () int<32>
+
+        .macro builtin_vm_set_obase
+        pushvar 0, 0
+        popob
+        .end
+
+;;; RAS_MACRO_BUILTIN_VM_OPPRINT
+;;;
+;;; Body of the `vm_opprint' compiler built-in with prototype
+;;; () int<32>
+
+        .macro builtin_vm_opprint
+        pushopp
+        return
+        .end
+
+;;; RAS_MACRO_BUILTIN_VM_SET_OPPRINT
+;;;
+;;; Body of the `vm_set_opprint' compiler built-in with prototype
+;;; (int<32> pprint_p) void
+
+        .macro builtin_vm_set_opprint
+        pushvar 0, 0
+        popopp
+        .end
+
+;;; RAS_MACRO_BUILTIN_VM_OACUTOFF
+;;;
+;;; Body of the `vm_oacutoff' compiler built-in with prototype
+;;; () int<32>
+
+        .macro builtin_vm_oacutoff
+        pushoac
+        return
+        .end
+
+;;; RAS_MACRO_BUILTIN_VM_SET_OACUTOFF
+;;;
+;;; Body of the `vm_set_oacutoff' compiler built-in with prototype
+;;; (int<32> oacutoff) void
+
+        .macro builtin_vm_set_oacutoff
+        pushvar 0, 0
+        popoac
+        .end
+
+;;; RAS_MACRO_BUILTIN_VM_ODEPTH
+;;;
+;;; Body of the `vm_odepth' compiler built-in with prototype
+;;; () int<32>
+
+        .macro builtin_vm_odepth
+        pushod
+        return
+        .end
+
+;;; RAS_MACRO_BUILTIN_VM_SET_ODEPTH
+;;;
+;;; Body of the `vm_set_odepth' compiler built-in with prototype
+;;; (int<32> odepth) void
+
+        .macro builtin_vm_set_odepth
+        pushvar 0, 0
+        popod
+        .end
+
+;;; RAS_MACRO_BUILTIN_VM_OINDENT
+;;;
+;;; Body of the `vm_oindent' compiler built-in with prototype
+;;; () int<32>
+
+        .macro builtin_vm_oindent
+        pushoi
+        return
+        .end
+
+;;; RAS_MACRO_BUILTIN_VM_SET_OINDENT
+;;;
+;;; Body of the `vm_set_oindent' compiler built-in with prototype
+;;; (int<32> oindent) void
+
+        .macro builtin_vm_set_oindent
+        pushvar 0, 0
+        popoi
+        .end
+
+;;; RAS_MACRO_BUILTIN_VM_OMAPS
+;;;
+;;; Body of the `vm_omaps' compiler built-in with prototype
+;;; () int<32>
+
+        .macro builtin_vm_omaps
+        pushoo
+        return
+        .end
+
+;;; RAS_MACRO_BUILTIN_VM_SET_OMAPS
+;;;
+;;; Body of the `vm_set_omaps' compiler built-in with prototype
+;;; (int<32> omaps) void
+
+        .macro builtin_vm_set_omaps
+        pushvar 0, 0
+        popoo
+        .end
+
+;;; RAS_MACRO_BUILTIN_VM_OMODE
+;;;
+;;; Body of the `vm_omode' compiler built-in with prototype
+;;; () int<32>
+
+        .macro builtin_vm_omode
+        pushom
+        return
+        .end
+
+;;; RAS_MACRO_BUILTIN_VM_SET_OMODE
+;;;
+;;; Body of the `vm_set_omode' compiler built-in with prototype
+;;; (int<32> omode) void
+
+        .macro builtin_vm_set_omode
+        pushvar 0, 0
+        popom
+        .end
+
+;;; RAS_MACRO_BUILTIN_UNSAFE_STRING_SET
+;;;
+;;; Body of the `__pkl_unsafe_string_set' compiler built-in with prototype
+;;; (string dst, uint<64> index, string str) void
+
+        .macro builtin_unsafe_string_set
+        pushvar 0, 0
+        pushvar 0, 1
+        pushvar 0, 2
+        strset
+        drop
+        .end
diff --git a/libpoke/pkl-gen.c b/libpoke/pkl-gen.c
index 8b6278c1..bd5c1cf5 100644
--- a/libpoke/pkl-gen.c
+++ b/libpoke/pkl-gen.c
@@ -112,6 +112,7 @@
 #define RAS_PUSH_ASM PKL_GEN_PUSH_ASM
 #define RAS_POP_ASM PKL_GEN_POP_ASM
 #include "pkl-gen.pkc"
+#include "pkl-gen-builtins.pkc"
 
 /*
  * SRC
@@ -618,243 +619,117 @@ PKL_PHASE_BEGIN_HANDLER (pkl_gen_ps_comp_stmt)
       switch (comp_stmt_builtin)
         {
         case PKL_AST_BUILTIN_RAND:
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_PUSHVAR, 0, 0);
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_RAND);
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_RETURN);
+          RAS_MACRO_BUILTIN_RAND;
           break;
         case PKL_AST_BUILTIN_GET_ENDIAN:
-          /* Fallthrough.  */
+          RAS_MACRO_BUILTIN_GET_ENDIAN;
+          break;
         case PKL_AST_BUILTIN_GET_IOS:
-          if (comp_stmt_builtin == PKL_AST_BUILTIN_GET_ENDIAN)
-            pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_PUSHEND);
-          else
-            pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_PUSHIOS);
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_RETURN);
+          RAS_MACRO_BUILTIN_GET_IOS;
           break;
         case PKL_AST_BUILTIN_SET_ENDIAN:
-          /* Fallthrough.  */
+          RAS_MACRO_BUILTIN_SET_ENDIAN;
+          break;
         case PKL_AST_BUILTIN_SET_IOS:
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_PUSHVAR, 0, 0);
-          if (comp_stmt_builtin == PKL_AST_BUILTIN_SET_ENDIAN)
-            pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_POPEND);
-          else
-            pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_POPIOS);
-          /* Always return `true' to facilitate using set_endian in
-             struct constraint expressions.  */
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_PUSH, pvm_make_int (1, 32));
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_RETURN);
+          RAS_MACRO_BUILTIN_SET_IOS;
           break;
         case PKL_AST_BUILTIN_OPEN:
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_PUSHVAR, 0, 0);
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_PUSHVAR, 0, 1);
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_OPEN);
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_RETURN);
+          RAS_MACRO_BUILTIN_OPEN;
           break;
         case PKL_AST_BUILTIN_CLOSE:
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_PUSHVAR, 0, 0);
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_CLOSE);
+          RAS_MACRO_BUILTIN_CLOSE;
           break;
         case PKL_AST_BUILTIN_IOSIZE:
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_PUSHVAR, 0, 0);
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_IOSIZE);
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_NIP);
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_RETURN);
+          RAS_MACRO_BUILTIN_IOSIZE;
           break;
         case PKL_AST_BUILTIN_IOFLAGS:
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_PUSHVAR, 0, 0);
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_IOFLAGS);
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_NIP);
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_RETURN);
+          RAS_MACRO_BUILTIN_IOFLAGS;
           break;
         case PKL_AST_BUILTIN_IOGETB:
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_PUSHVAR, 0, 0);
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_IOGETB);
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_NIP);
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_RETURN);
+          RAS_MACRO_BUILTIN_IOBIAS;
           break;
         case PKL_AST_BUILTIN_IOSETB:
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_PUSHVAR, 0, 0);
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_PUSHVAR, 0, 1);
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_IOSETB);
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_NIP);
+          RAS_MACRO_BUILTIN_IOSETBIAS;
           break;
         case PKL_AST_BUILTIN_FORGET:
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_PUSHVAR, 0, 0);
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_PUSHVAR, 0, 1);
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_OGETM);
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_NIP);
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_FLUSH);
+          RAS_MACRO_BUILTIN_FLUSH;
           break;
         case PKL_AST_BUILTIN_GET_TIME:
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_TIME);
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_RETURN);
+          RAS_MACRO_BUILTIN_GET_TIME;
           break;
         case PKL_AST_BUILTIN_SLEEP:
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_PUSHVAR, 0, 0);
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_PUSHVAR, 0, 1);
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_SLEEP);
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_DROP);
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_DROP);
+          RAS_MACRO_BUILTIN_SLEEP;
           break;
         case PKL_AST_BUILTIN_STRACE:
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_STRACE, 0);
+          RAS_MACRO_BUILTIN_STRACE;
           break;
         case PKL_AST_BUILTIN_GETENV:
-          {
-            pvm_program_label label = pkl_asm_fresh_label (PKL_GEN_ASM);
-
-            pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_PUSHVAR, 0, 0);
-            pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_GETENV);
-            pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_NIP);
-            pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_BNN, label);
-            pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_PUSH,
-                          pvm_make_exception (PVM_E_INVAL, PVM_E_INVAL_NAME,
-                                              PVM_E_INVAL_ESTATUS, NULL, 
NULL));
-            pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_RAISE);
-            pkl_asm_label (PKL_GEN_ASM, label);
-            pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_RETURN);
-
-            break;
-          }
+          RAS_MACRO_BUILTIN_GETENV;
+          break;
         case PKL_AST_BUILTIN_TERM_GET_COLOR:
         case PKL_AST_BUILTIN_TERM_GET_BGCOLOR:
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_PUSH,
-                        pvm_make_integral_type (pvm_make_ulong (32, 64),
-                                                pvm_make_int (1, 32)));
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_PUSH, PVM_NULL);
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_MKTYA);
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_PUSH,
-                        pvm_make_ulong (3, 64));
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_MKA); /* ARR */
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_TOR); /* _ */
-          if (comp_stmt_builtin == PKL_AST_BUILTIN_TERM_GET_COLOR)
-            pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_PUSHOC); /* R G B */
-          else
-            pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_PUSHOBC); /* R G B */
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_SWAP);
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_ROT);   /* B G R */
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_FROMR); /* B G R ARR */
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_PUSH,
-                        pvm_make_ulong (0, 64));
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_ROT);
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_AINS);  /* B G ARR */
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_PUSH,
-                        pvm_make_ulong (1, 64));
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_ROT);
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_AINS);  /* B ARR */
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_PUSH,
-                        pvm_make_ulong (2, 64));
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_ROT);
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_AINS);  /* ARR */
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_RETURN);
+          RAS_MACRO_BUILTIN_GET_COLOR_BGCOLOR;
           break;
         case PKL_AST_BUILTIN_TERM_SET_COLOR:
         case PKL_AST_BUILTIN_TERM_SET_BGCOLOR:
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_PUSHVAR, 0, 0);
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_PUSH,
-                        pvm_make_ulong (0, 64));
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_AREF);
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_TOR);
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_DROP);
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_PUSH,
-                        pvm_make_ulong (1, 64));
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_AREF);
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_TOR);
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_DROP);
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_PUSH,
-                        pvm_make_ulong (2, 64));
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_AREF);
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_TOR);
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_DROP);
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_DROP);
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_FROMR);
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_FROMR);
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_FROMR);
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_SWAP);
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_ROT);
-          if (comp_stmt_builtin == PKL_AST_BUILTIN_TERM_SET_COLOR)
-            pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_POPOC);
-          else
-            pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_POPOBC);
+          RAS_MACRO_BUILTIN_SET_COLOR_BGCOLOR;
           break;
         case PKL_AST_BUILTIN_TERM_BEGIN_CLASS:
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_PUSHVAR, 0, 0);
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_BEGINSC);
+          RAS_MACRO_BUILTIN_TERM_BEGIN_CLASS;
           break;
         case PKL_AST_BUILTIN_TERM_END_CLASS:
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_PUSHVAR, 0, 0);
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_ENDSC);
+          RAS_MACRO_BUILTIN_TERM_END_CLASS;
           break;
         case PKL_AST_BUILTIN_TERM_BEGIN_HYPERLINK:
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_PUSHVAR, 0, 0);
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_PUSHVAR, 0, 1);
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_BEGINHL);
+          RAS_MACRO_BUILTIN_TERM_BEGIN_HYPERLINK;
           break;
         case PKL_AST_BUILTIN_TERM_END_HYPERLINK:
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_ENDHL);
+          RAS_MACRO_BUILTIN_TERM_END_HYPERLINK;
           break;
         case PKL_AST_BUILTIN_VM_OBASE:
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_PUSHOB);
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_RETURN);
+          RAS_MACRO_BUILTIN_VM_OBASE;
           break;
         case PKL_AST_BUILTIN_VM_SET_OBASE:
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_PUSHVAR, 0, 0);
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_POPOB);
+          RAS_MACRO_BUILTIN_VM_SET_OBASE;
           break;
         case PKL_AST_BUILTIN_VM_OPPRINT:
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_PUSHOPP);
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_RETURN);
+          RAS_MACRO_BUILTIN_VM_OPPRINT;
           break;
         case PKL_AST_BUILTIN_VM_SET_OPPRINT:
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_PUSHVAR, 0, 0);
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_POPOPP);
+          RAS_MACRO_BUILTIN_VM_SET_OPPRINT;
           break;
         case PKL_AST_BUILTIN_VM_OACUTOFF:
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_PUSHOAC);
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_RETURN);
+          RAS_MACRO_BUILTIN_VM_OACUTOFF;
           break;
         case PKL_AST_BUILTIN_VM_SET_OACUTOFF:
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_PUSHVAR, 0, 0);
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_POPOAC);
+          RAS_MACRO_BUILTIN_VM_SET_OACUTOFF;
           break;
         case PKL_AST_BUILTIN_VM_ODEPTH:
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_PUSHOD);
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_RETURN);
+          RAS_MACRO_BUILTIN_VM_ODEPTH;
           break;
         case PKL_AST_BUILTIN_VM_SET_ODEPTH:
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_PUSHVAR, 0, 0);
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_POPOD);
+          RAS_MACRO_BUILTIN_VM_SET_ODEPTH;
           break;
         case PKL_AST_BUILTIN_VM_OINDENT:
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_PUSHOI);
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_RETURN);
+          RAS_MACRO_BUILTIN_VM_OINDENT;
           break;
         case PKL_AST_BUILTIN_VM_SET_OINDENT:
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_PUSHVAR, 0, 0);
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_POPOI);
+          RAS_MACRO_BUILTIN_VM_SET_OINDENT;
           break;
         case PKL_AST_BUILTIN_VM_OMAPS:
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_PUSHOO);
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_RETURN);
+          RAS_MACRO_BUILTIN_VM_OMAPS;
           break;
         case PKL_AST_BUILTIN_VM_SET_OMAPS:
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_PUSHVAR, 0, 0);
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_POPOO);
+          RAS_MACRO_BUILTIN_VM_SET_OMAPS;
           break;
         case PKL_AST_BUILTIN_VM_OMODE:
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_PUSHOM);
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_RETURN);
+          RAS_MACRO_BUILTIN_VM_OMODE;
           break;
         case PKL_AST_BUILTIN_VM_SET_OMODE:
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_PUSHVAR, 0, 0);
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_POPOM);
+          RAS_MACRO_BUILTIN_VM_SET_OMODE;
           break;
         case PKL_AST_BUILTIN_UNSAFE_STRING_SET:
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_PUSHVAR, 0, 0);
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_PUSHVAR, 0, 1);
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_PUSHVAR, 0, 2);
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_STRSET);
-          pkl_asm_insn (PKL_GEN_ASM, PKL_INSN_DROP);
+          RAS_MACRO_BUILTIN_UNSAFE_STRING_SET;
           break;
         default:
           assert (0);
-- 
2.11.0




reply via email to

[Prev in Thread] Current Thread [Next in Thread]