compile time initialize

main
Clyne 3 weeks ago
parent cb04555442
commit 860cdb7b38
Signed by: clyne
GPG Key ID: 3267C8EBF3F9AFC7

@ -23,7 +23,12 @@
#include <string> #include <string>
static std::array<sforth::cell, 1024> dict; 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); 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); std::span args (argv + 1, argc - 1);
sforth::initialize<&fth>(dict.end());
fth->add(".", [](auto) { fth->add(".", [](auto) {
char buf[32] = {}; char buf[32] = {};
std::to_chars(buf, buf + sizeof(buf), fth->pop(), fth->base); std::to_chars(buf, buf + sizeof(buf), fth->pop(), fth->base);

@ -195,10 +195,14 @@ struct forth : public word_list
}; };
template<forth** fthp> template<forth** fthp>
void prologue(const void *bodyf) void initialize(cell *end_value)
{ {
assert<error::init_error>(*fthp);
static auto& fth = **fthp; static auto& fth = **fthp;
static auto _d = std::bit_cast<cell>(*fthp);
constexpr static auto prologue = +[](const void *bodyf) {
auto body = (func *)bodyf; auto body = (func *)bodyf;
fth.rpush(fth.ip); fth.rpush(fth.ip);
@ -206,15 +210,7 @@ void prologue(const void *bodyf)
fth.execute(std::bit_cast<func *>(*fth.ip)); fth.execute(std::bit_cast<func *>(*fth.ip));
fth.ip = fth.rpop(); fth.ip = fth.rpop();
} };
template<forth** fthp>
void initialize(cell *end_value)
{
assert<error::init_error>(*fthp);
static auto& fth = **fthp;
static auto _d = std::bit_cast<cell>(*fthp);
constexpr static func lit_impl = [](auto) { constexpr static func lit_impl = [](auto) {
auto ptr = std::bit_cast<cell *>(++fth.ip); auto ptr = std::bit_cast<cell *>(++fth.ip);
@ -264,7 +260,7 @@ void initialize(cell *end_value)
, S{":" }, [](auto) { , S{":" }, [](auto) {
auto w = fth.parse(); auto w = fth.parse();
fth.add(w); fth.add(w);
*fth.here++ = std::bit_cast<cell>(&prologue<fthp>); *fth.here++ = std::bit_cast<cell>(prologue);
fth.compiling = true; }, 0 fth.compiling = true; }, 0
, S{";" }, [](auto) { *fth.here++ = 0; fth.compiling = false; }, word_base::immediate , S{";" }, [](auto) { *fth.here++ = 0; fth.compiling = false; }, word_base::immediate
, S{"\\" }, [](auto) { fth.sourcei = forth::npos; }, 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()); assert<error::word_not_found>(g.has_value());
*fth.here++ = std::bit_cast<cell>((*g)->body()); }, word_base::immediate *fth.here++ = std::bit_cast<cell>((*g)->body()); }, word_base::immediate
>::word; >::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{"align" }, S{"here dup aligned swap - allot"}, 0
, S{"aligned"}, S{"cell 1- + cell 1- invert and"}, 0 , S{"aligned"}, S{"cell 1- + cell 1- invert and"}, 0
, S{"decimal"}, S{"10 base !"}, 0 , S{"decimal"}, S{"10 base !"}, 0

Loading…
Cancel
Save