remove addNativeWord

native
Clyne 12 months ago
parent e8c9f97f4f
commit ec3b03c4fd
Signed by: clyne
GPG Key ID: 3267C8EBF3F9AFC7

@ -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) {

@ -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);

@ -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();

@ -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

@ -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
{

@ -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.

@ -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;

@ -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.

Loading…
Cancel
Save