]> code.bitgloo.com Git - bitgloo/alee-forth.git/commitdiff
remove addNativeWord native
authorClyne Sullivan <clyne@bitgloo.com>
Mon, 1 Jan 2024 16:45:50 +0000 (11:45 -0500)
committerClyne Sullivan <clyne@bitgloo.com>
Mon, 1 Jan 2024 16:45:50 +0000 (11:45 -0500)
alee-standalone.cpp
alee.cpp
libalee/corewords.cpp
libalee/corewords.hpp
libalee/dictionary.cpp
libalee/dictionary.hpp
libalee/state.cpp
libalee/state.hpp

index 95c72e5e94d9e8a9116a3ef48c802334c10469c0..e5c85fe1d4b2033c4c446aec27682e93fc62e020 100644 (file)
@@ -40,8 +40,7 @@ int main(int argc, char *argv[])
     SplitMemDict<sizeof(alee_dat)> dict (alee_dat);
     State state (dict, readchar);
 
-    dict.initialize();
-    CoreWords::initialize(state);
+    //dict.initialize();
 
     std::vector args (argv + 1, argv + argc);
     for (const auto& a : args) {
index e8194c6e42a0ebb4c4966955d7a7665e1b2cf1a7..cc9abde85b8e34a7d4f641cf951e6cf72f828524 100644 (file)
--- a/alee.cpp
+++ b/alee.cpp
@@ -46,7 +46,6 @@ int main(int argc, char *argv[])
 #endif // ALEE_MSP430
 
     dict.initialize();
-    CoreWords::initialize(state);
 
     {
         std::vector args (argv + 1, argv + argc);
index c564cdbd214a99d66e45930f43edf4d5f18ae2cd..b66570f3194e6e38d3846431f2f108c3177f8ae8 100644 (file)
@@ -24,77 +24,18 @@ static void find(State&, Word);
 static DoubleCell popd(State&);
 static void pushd(State&, DoubleCell);
 
-LIBALEE_SECTION
-void CoreWords::initialize(State& state)
-{
-    auto& d = state.dict;
-    //d.addNativeWord("_lit", word_lit);
-    d.addNativeWord("drop", word_drop);
-    d.addNativeWord("dup", word_dup);
-    d.addNativeWord("swap", word_swap);
-    d.addNativeWord("pick", word_pick);
-    d.addNativeWord("sys", word_sys);
-    d.addNativeWord("+", word_add);
-    d.addNativeWord("-", word_sub);
-    d.addNativeWord("m*", word_mul);
-    d.addNativeWord("_/", word_div);
-    d.addNativeWord("_%", word_mod);
-    d.addNativeWord("_@", word_peek);
-    d.addNativeWord("_!", word_poke);
-    d.addNativeWord(">r", word_rpush);
-    d.addNativeWord("r>", word_rpop);
-    d.addNativeWord("=", word_eq);
-    d.addNativeWord("<", word_lt);
-    d.addNativeWord("&", word_and);
-    d.addNativeWord("|", word_or);
-    d.addNativeWord("^", word_xor);
-    d.addNativeWord("<<", word_shl);
-    d.addNativeWord(">>", word_shr);
-    d.addNativeWord(":", word_colon);
-    d.addNativeWord("_'", word_tick);
-    //d.addNativeWord("exit", word_exit);
-    //d.addNativeWord(";", word_semic);
-    d.addNativeWord("_jmp0", word_jmp0);
-    d.addNativeWord("_jmp", word_jmp);
-    d.addNativeWord("depth", word_depth);
-    d.addNativeWord("_rdepth", word_rdepth);
-    d.addNativeWord("_in", word_in);
-    d.addNativeWord("_ev", word_ev);
-    d.addNativeWord("find", word_find);
-    d.addNativeWord("_uma", word_uma);
-    d.addNativeWord("u<", word_ult);
-    d.addNativeWord("um/mod", word_ummod);
-}
-
 LIBALEE_SECTION
 void CoreWords::run(Cell ins, State& state)
 {
     Addr index = ins;
-    auto& ip = state.ip();
 
-execute:
     if (index >= Dictionary::Begin) {
-        // must be calling a defined subroutine
+        auto& ip = state.ip();
         state.pushr(ip);
-        ip = index;
-        return;
-    } else switch (index) {
-    case token("_lit"): word_lit(state); break;// Execution semantics of `literal`.
-    case token("execute"):
-        // TODO reimplement
-        index = state.pop();
-        goto execute;
-    case token("exit"): word_exit(state); break;
-    case token(";"): word_semic(state); break; // Concludes word definition.
-    case token("_nx"):
-        { auto f = state.beyondip();
-          state.ip() = state.popr();
-          ((void (*)(State&))f)(state);
-          state.verify(state.ip() != 0, Error::exit); }
-        break;
+        ip = static_cast<Addr>(index - sizeof(Cell));
+    } else {
+        wordstbl[index](state);
     }
-
-    ip += sizeof(Cell);
 }
 
 LIBALEE_SECTION
@@ -236,8 +177,7 @@ void CoreWords::word_tick(State& state) { // Collects input word and finds execu
     find(state, state.dict.input());
 }
 void CoreWords::word_execute(State& state) {
-    /*index =*/ state.pop();
-    /* TODO goto execute; */
+    run(state.pop(), state);
 }
 void CoreWords::word_exit(State& state) {
     state.ip() = state.popr();
index 5d2e5cadb4fdec3c5bddcadb1f831819726b34c5..f301dd40ed2fe6ebec033e6ea76842a471fddc8b 100644 (file)
@@ -43,8 +43,6 @@ void user_sys(State& state);
 class CoreWords
 {
 public:
-    static void initialize(State& state);
-
     /**
      * Searches for the token/index of the given word if it is part of the
      * fundamental word-set.
@@ -154,6 +152,46 @@ public:
     static void word_uma(State&);
     static void word_ult(State&);
     static void word_ummod(State&);
+
+    constexpr static void (*wordstbl[])(State&) = {
+        word_lit,
+        word_drop,
+        word_dup,
+        word_swap,
+        word_pick,
+        word_sys,
+        word_add,
+        word_sub,
+        word_mul,
+        word_div,
+        word_mod,
+        word_peek,
+        word_poke,
+        word_rpush,
+        word_rpop,
+        word_eq,
+        word_lt,
+        word_and,
+        word_or,
+        word_xor,
+        word_shl,
+        word_shr,
+        word_colon,
+        word_tick,
+        word_execute,
+        word_exit,
+        word_semic,
+        word_jmp0,
+        word_jmp,
+        word_depth,
+        word_rdepth,
+        word_in,
+        word_ev,
+        word_find,
+        word_uma,
+        word_ult,
+        word_ummod
+    };
 };
 
 #endif // ALEEFORTH_COREWORDS_HPP
index e946c59c4eae56ec2ea733418d1be9c3cea57aa8..e4f6761082cf79d549bc554690515f488f98d344 100644 (file)
@@ -28,22 +28,6 @@ void Dictionary::initialize()
     write(Source, Input + sizeof(Cell));
 }
 
-LIBALEE_SECTION
-void Dictionary::addNativeWord(const char *s, void (*func)(State&))
-{
-    const Addr h = read(Here);
-    Addr n = h + sizeof(Cell);
-    for (; *s; ++s, ++n)
-        writebyte(n, *s);
-    addDefinition(Word(h + sizeof(Cell), n));
-    add(CoreWords::token("_nx"));
-    add((Cell)func);
-
-    const auto dcell = h - latest();
-    write(h, (read(h) & 0x1F) | Native | static_cast<Cell>(dcell << DistancePos));
-    latest(h);
-}
-
 LIBALEE_SECTION
 Addr Dictionary::allot(Cell amount) noexcept
 {
index d465e6012c23182b85d16aa1ee4a43868d75cfbf..23e4079b8bbc809034e9af226b98d7f67b5bb389 100644 (file)
@@ -158,8 +158,6 @@ public:
      */
     void addDefinition(Word word) noexcept;
 
-    void addNativeWord(const char *s, void (*func)(State&));
-
     /**
      * Searches the dictionary for an entry for the given word.
      * @param word The dictionary-stored word to search for.
index ed1562f7847f2ccf48f2ceb1016edf41e70d900c..cb3a2d3ad7e04f44765d36ede4c06eee431e00aa 100644 (file)
@@ -54,8 +54,10 @@ Error State::execute(Addr addr)
 
         if (context.ip >= Dictionary::Begin) {
             // longjmp will exit this loop.
-            for (;;)
+            for (;;) {
+                context.ip += sizeof(Cell);
                 CoreWords::run(dict.read(context.ip), *this);
+            }
         } else {
             // addr was a CoreWord, all done now.
             context.ip = 0;
index a5e49b535044155ef9bddff9b3af47cbc2c15b89..0a61a20b21744bf4761a93d959615e0e454cbe68 100644 (file)
@@ -28,6 +28,8 @@
 #include <csetjmp>
 #include <cstddef>
 
+//#define verify(C, E)
+
 /**
  * Size of the primary data stack, number of cells.
  */
@@ -179,6 +181,8 @@ public:
         return dict.read(context.ip);
     }
 
+//#undef verify
+
     /**
      * Asserts the given condition is true, longjmp-ing if false.
      * Used as an exception handler and the method of exiting execution.