Files
LithosAnanke/src/word_registry.c
T
Robert Allan JamesandClaude Sonnet 5 6c6293cd52 Move PLOT/FB-WIDTH/FB-HEIGHT registration to Hestia only -- FABRIC-3.6.md task 1.8
Real fix for task 0.8's finding. register_framebuffer_words() was
called unconditionally from register_forth79_words() (word_registry.c),
itself called unconditionally from vm_init_with_host() -- the generic
per-VM bootstrap every VM goes through, with no way to know a VM's
name at that point.

Removed the unconditional call. Added a name-gated call instead in
capsule_birth_baby() (capsule_birth.c), beside the existing
is_fleet_foundation check -- the one place in the birth path where
capsule_name and the newly-allocated VM* are both in scope together:
Hestia gets register_framebuffer_words(), nobody else does.

Positively verified live, exactly as the task's own check demands:
FB-WIDTH via VM-EXEC returns UNKNOWN WORD in Hermes and Artemis, 1280
in Hestia. Confirmed at the fundamental level too: Hera's own base
PARITY:M7.1a word count dropped from 531 to 528 -- exactly the three
words removed -- identical across all three architectures.

Three-arch boot clean: amd64/aarch64/riscv64 all reach [zuse@Hera] ok>,
zero UNKNOWN WORD during boot. mkcapsule --lint capsules/ clean, 38
files / 0 violations (pure C change, no capsule content touched). No
compiler warnings.

Side effect on the vendored hosted build, expected and not a
regression: capsule_birth.c is kernel-only, so the hosted starforth
binary has no Hestia concept and now never registers these words at
all -- confirmed live. framebuffer_words.c's own top comment already
calls this surface "kernel-only, no-op on hosted builds," so the prior
stub registration was already vestigial. Ran a plain `make` sanity
build per CLAUDE.md's own stated purpose for that target; regenerated
lfs/amd64/starforth included here rather than left stale.

Authorized by Captain Bob ("yes").

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-19 17:36:18 -04:00

155 lines
7.3 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
StarForth — Steady-State Virtual Machine Runtime
Copyright (c) 2023–2025 Robert A. James
All rights reserved.
This file is part of the StarForth project.
Licensed under the StarForth License, Version 1.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at:
https://github.com/star.4th@proton.me/StarForth/LICENSE.txt
This software is provided "AS IS", WITHOUT WARRANTY OF ANY KIND,
express or implied, including but not limited to the warranties of
merchantability, fitness for a particular purpose, and noninfringement.
See the License for the specific language governing permissions and
limitations under the License.
StarForth — Steady-State Virtual Machine Runtime
Copyright (c) 2023–2025 Robert A. James
All rights reserved.
This file is part of the StarForth project.
Licensed under the StarForth License, Version 1.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at:
https://github.com/star.4th@proton.me/StarForth/LICENSE.txt
This software is provided "AS IS", WITHOUT WARRANTY OF ANY KIND,
express or implied, including but not limited to the warranties of
merchantability, fitness for a particular purpose, and noninfringement.
See the License for the specific language governing permissions and
limitations under the License.
*/
#include "../include/word_registry.h"
#include "../include/log.h"
#include <string.h>
/* Include all FORTH-79 word module headers + extensions */
#include "word_source/include/acl_words.h"
#include "word_source/include/stack_words.h"
#include "word_source/include/return_stack_words.h"
#include "word_source/include/memory_words.h"
#include "word_source/include/dictionary_words.h"
#include "word_source/include/arithmetic_words.h"
#include "word_source/include/double_words.h"
#include "word_source/include/mixed_arithmetic_words.h"
#include "word_source/include/logical_words.h"
#include "word_source/include/io_words.h"
#include "word_source/include/format_words.h"
#include "word_source/include/string_words.h"
#include "word_source/include/control_words.h"
#include "word_source/include/defining_words.h"
#include "word_source/include/dictionary_manipulation_words.h"
#include "word_source/include/vocabulary_words.h"
#include "word_source/include/block_words.h"
#include "word_source/include/editor_words.h"
#include "word_source/include/system_words.h"
#include "word_source/include/starforth_words.h"
#include "word_source/include/physics_benchmark_words.h"
#include "word_source/include/physics_pipelining_diagnostic_words.h"
#include "word_source/include/physics_freeze_words.h"
#include "word_source/include/dictionary_heat_diagnostic_words.h"
#include "word_source/include/log_words.h"
#include "word_source/include/q48_words.h"
#include "word_source/include/inference_words.h"
#include "word_source/include/defer_words.h"
#include "word_source/include/framebuffer_words.h"
#include "word_source/include/keyboard_words.h"
#include "word_source/include/ttf_words.h"
#include "word_source/include/scroll_words.h"
#ifdef __STARKERNEL__
#include "starkernel/doe_log.h"
#include "starkernel/repl.h"
#endif
/**
* @brief Registers a single FORTH word in the virtual machine
* @param vm Pointer to the virtual machine instance
* @param name Name of the FORTH word to register
* @param func Function pointer to the word's implementation
*/
void register_word(VM *vm, const char *name, word_func_t func) {
DictEntry *entry = vm_create_word(vm, name, strlen(name), func);
if (entry) {
log_message(LOG_DEBUG, "Registered word: %s", name);
} else {
log_message(LOG_ERROR, "Failed to register word: %s", name);
}
}
/**
* @brief Registers all standard FORTH-79 words in the virtual machine
* @param vm Pointer to the virtual machine instance
* @details Registers all 18 FORTH-79 word modules in dependency order,
* starting with fundamental stack operations and building up to
* more complex functionality like control flow and editing.
*/
void register_forth79_words(VM *vm) {
log_message(LOG_INFO, "Registering FORTH-79 Standard word set...");
/* Register all 18 FORTH-79 word modules IN DEPENDENCY ORDER */
register_stack_words(vm); /* Module 1: Stack Operations - FOUNDATION */
register_return_stack_words(vm); /* Module 2: Return Stack Operations */
register_memory_words(vm); /* Module 3: Memory Operations */
register_arithmetic_words(vm); /* Module 4: Arithmetic Operations */
register_logical_words(vm); /* Module 5: Logical & Comparison */
register_mixed_arithmetic_words(vm); /* Module 6: Mixed Arithmetic - needs arithmetic + stack */
register_double_words(vm); /* Module 7: Double Number Arithmetic */
register_format_words(vm); /* Module 8: Formatting & Conversion */
register_string_words(vm); /* Module 9: String & Text Processing */
register_io_words(vm); /* Module 10: I/O & Terminal */
register_block_words(vm); /* Module 11: Block & Mass Storage */
register_dictionary_words(vm); /* Module 12: Dictionary & Compilation */
register_dictionary_manipulation_words(vm); /* Module 13: Dictionary Manipulation */
register_vocabulary_words(vm); /* Module 14: Vocabulary System */
register_system_words(vm); /* Module 15: System & Environment */
register_editor_words(vm); /* Module 16: Line Editor */
register_defining_words(vm); /* Module 17: Defining Words */
register_control_words(vm); /* Module 18: Control Flow */
register_starforth_words(vm); /* Module 19: StarForth Implementation Extensions */
register_acl_words(vm); /* Module 20: Word-Level ACL System */
register_physics_benchmark_words(vm); /* Module 21: Physics Benchmark Words */
register_physics_pipelining_diagnostic_words(vm); /* Module 21: Pipelining Diagnostics */
register_physics_freeze_words(vm); /* Module 22: Phase 2 Freeze/Decay Control Words */
register_dictionary_heat_diagnostic_words(vm); /* Module 23: Dictionary Heat Optimization */
register_log_words(vm); /* Module 24: Log Level Control */
register_q48_words(vm); /* Module 25: Q48.16 Fixed-Point Math */
register_inference_words(vm); /* Module 26: SSM Inference + Jacquard */
register_defer_words(vm); /* Module 27: DEFER / IS late binding */
/* Module 28 (PLOT/FB-WIDTH/FB-HEIGHT, framebuffer_words.c) deliberately
* NOT registered here -- FABRIC-3.6.md task 1.8 (item 33): every VM got
* these unconditionally before this change (confirmed live, task 0.8 --
* Hermes and Artemis could both call FB-WIDTH despite never loading
* fabric.4th). Hestia is now the sole owner; see the name-gated call in
* capsule_birth_baby() (capsule_birth.c), the only place a VM's name is
* known at the point its dictionary is built. */
register_keyboard_words(vm); /* Module 29: Console fabric -- raw keyboard scancode diagnostic */
register_ttf_words(vm); /* Module 30: TrueType text entry point */
register_scroll_words(vm); /* Module 31: REPL scrollback (FABRIC-0.md 4.4q) */
#ifdef __STARKERNEL__
register_doe_log_words(vm); /* Module 32: DoE instrumentation runtime toggle (HB-ON/HB-OFF) */
sk_repl_register_words(vm); /* Module 33: BLK-ATTACH-ACK, Artemis's storage-attach reply target */
#endif
log_message(LOG_INFO, "FORTH-79 Standard word set registration complete");
}