]> code.bitgloo.com Git - clyne/sforth.git/commitdiff
compile time initialize
authorClyne Sullivan <clyne@bitgloo.com>
Sat, 30 Nov 2024 15:21:59 +0000 (10:21 -0500)
committerClyne Sullivan <clyne@bitgloo.com>
Sat, 30 Nov 2024 15:21:59 +0000 (10:21 -0500)
main.cpp
sforth/forth.hpp

index 99f5ecced3d6f94e46efb92f1e254bed8762cca3..60653dcc37c37994accc43d944e1e9f3547e3c79 100644 (file)
--- a/main.cpp
+++ b/main.cpp
 #include <string>
 
 static std::array<sforth::cell, 1024> dict;
-static auto fth = new (dict.data()) sforth::forth;
+static sforth::forth *fth =
+    [] constexpr {
+        fth = new (dict.data()) sforth::forth;
+        sforth::initialize<&fth>(dict.end());
+        return fth;
+    }();
 
 static bool parse_stream(sforth::forth *, std::istream&, bool say_okay = false);
 
@@ -31,7 +36,6 @@ int main(int argc, const char *argv[])
 {
     std::span args (argv + 1, argc - 1);
 
-    sforth::initialize<&fth>(dict.end());
     fth->add(".", [](auto) {
         char buf[32] = {};
         std::to_chars(buf, buf + sizeof(buf), fth->pop(), fth->base);
index 91c580caa409d1df71d080ba59a45b38f832749e..32f5d5368cbd44e59786d898234ce7e408a9a504 100644 (file)
@@ -194,20 +194,6 @@ struct forth : public word_list
     std::array<func *, return_size> rstack;
 };
 
-template<forth **fthp>
-void prologue(const void *bodyf)
-{
-    static auto& fth = **fthp;
-
-    auto body = (func *)bodyf;
-    fth.rpush(fth.ip);
-
-    for (fth.ip = body + 1; *fth.ip; fth.ip++)
-        fth.execute(std::bit_cast<func *>(*fth.ip));
-
-    fth.ip = fth.rpop();
-}
-
 template<forth** fthp>
 void initialize(cell *end_value)
 {
@@ -216,6 +202,16 @@ void initialize(cell *end_value)
     static auto& fth = **fthp;
     static auto _d = std::bit_cast<cell>(*fthp);
 
+    constexpr static auto prologue = +[](const void *bodyf) {
+        auto body = (func *)bodyf;
+        fth.rpush(fth.ip);
+    
+        for (fth.ip = body + 1; *fth.ip; fth.ip++)
+            fth.execute(std::bit_cast<func *>(*fth.ip));
+    
+        fth.ip = fth.rpop();
+    };
+
     constexpr static func lit_impl = [](auto) {
         auto ptr = std::bit_cast<cell *>(++fth.ip);
         fth.push(*ptr);
@@ -264,7 +260,7 @@ void initialize(cell *end_value)
         , S{":"    }, [](auto) {
             auto w = fth.parse();
             fth.add(w);
-            *fth.here++ = std::bit_cast<cell>(&prologue<fthp>);
+            *fth.here++ = std::bit_cast<cell>(prologue);
             fth.compiling = true; }, 0
         , S{";"    }, [](auto) { *fth.here++ = 0; fth.compiling = false; }, word_base::immediate
         , S{"\\"   }, [](auto) { fth.sourcei = forth::npos; }, word_base::immediate
@@ -284,7 +280,7 @@ void initialize(cell *end_value)
             assert<error::word_not_found>(g.has_value());
             *fth.here++ = std::bit_cast<cell>((*g)->body()); }, word_base::immediate
     >::word;
-    constexpr static auto& dict2 = comp_dict<prologue<fthp>, &dict1
+    constexpr static auto& dict2 = comp_dict<prologue, &dict1
         , S{"align"  }, S{"here dup aligned swap - allot"}, 0
         , S{"aligned"}, S{"cell 1- + cell 1- invert and"}, 0
         , S{"decimal"}, S{"10 base !"}, 0