diff options
author | Clyne Sullivan <clyne@bitgloo.com> | 2024-11-30 10:21:59 -0500 |
---|---|---|
committer | Clyne Sullivan <clyne@bitgloo.com> | 2024-11-30 10:21:59 -0500 |
commit | 860cdb7b387723eddea9bd110c85ebeaaa6c5b70 (patch) | |
tree | f7b79d337421815b6c8c864e7a49ee9fed43a394 | |
parent | cb04555442286affb56a95a54c428f8f643b3503 (diff) |
compile time initialize
-rw-r--r-- | main.cpp | 8 | ||||
-rw-r--r-- | sforth/forth.hpp | 28 |
2 files changed, 18 insertions, 18 deletions
@@ -23,7 +23,12 @@ #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); diff --git a/sforth/forth.hpp b/sforth/forth.hpp index 91c580c..32f5d53 100644 --- a/sforth/forth.hpp +++ b/sforth/forth.hpp @@ -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 |