aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorClyne Sullivan <clyne@bitgloo.com>2024-11-30 10:21:59 -0500
committerClyne Sullivan <clyne@bitgloo.com>2024-11-30 10:21:59 -0500
commit860cdb7b387723eddea9bd110c85ebeaaa6c5b70 (patch)
treef7b79d337421815b6c8c864e7a49ee9fed43a394
parentcb04555442286affb56a95a54c428f8f643b3503 (diff)
compile time initialize
-rw-r--r--main.cpp8
-rw-r--r--sforth/forth.hpp28
2 files changed, 18 insertions, 18 deletions
diff --git a/main.cpp b/main.cpp
index 99f5ecc..60653dc 100644
--- a/main.cpp
+++ b/main.cpp
@@ -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