From cc4e57d6b54705cca83254bdb12bf6e7b605c6d41671cdb79560a9cacbe6b2b5 Mon Sep 17 00:00:00 2001 From: ADAM David Alan Martin Date: Wed, 17 Sep 2025 11:38:14 -0400 Subject: [PATCH] Switch to 32-bit math by default. I'll need a way to get back into 64-bit mode. --- js4g/StackMachine.cc | 14 +++++++++++--- js4g/StackMachine.h | 14 +++++++++----- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/js4g/StackMachine.cc b/js4g/StackMachine.cc index e699c72..62a2118 100644 --- a/js4g/StackMachine.cc +++ b/js4g/StackMachine.cc @@ -228,10 +228,11 @@ namespace Dillo::Hydrogen::JavaScriptForge ::detail:: StackMachine_m { if( std::holds_alternative< T >( peek() ) ) return std::get< T >( pop() ); else if( std::holds_alternative< Integer >( peek() ) ) return boost::lexical_cast< T >( std::get< Integer >( pop() ) ); + else if( std::holds_alternative< Long >( peek() ) ) return boost::lexical_cast< T >( std::get< Long >( pop() ) ); else return boost::lexical_cast< T >( std::get< std::string >( pop() ) ); } - std::variant< std::string, StackMachine::Integer > + StackMachine::Value StackMachine::pop() { const auto rv= std::move( peek() ); @@ -239,7 +240,7 @@ namespace Dillo::Hydrogen::JavaScriptForge ::detail:: StackMachine_m return rv; } - std::variant< std::string, StackMachine::Integer > & + StackMachine::Value & StackMachine::peek() { if( stack.empty() ) throw std::runtime_error{ "FATAL: No more elements in stack." }; @@ -247,7 +248,7 @@ namespace Dillo::Hydrogen::JavaScriptForge ::detail:: StackMachine_m } void - StackMachine::push( std::variant< std::string, Integer > element ) + StackMachine::push( Value element ) { stack.push_back( std::move( element ) ); } @@ -264,11 +265,18 @@ namespace Dillo::Hydrogen::JavaScriptForge ::detail:: StackMachine_m stack.push_back( std::move( element ) ); } + void + StackMachine::push( Long element ) + { + stack.push_back( std::move( element ) ); + } + template< typename T > void StackMachine::push( const T &t ) { if constexpr( std::is_same_v< Integer, T > ) push( t ); + else if constexpr( std::is_same_v< Long, T > ) push( t ); else if constexpr( std::is_same_v< std::string, T > ) push( t ); else push( boost::lexical_cast< std::string >( t ) ); } diff --git a/js4g/StackMachine.h b/js4g/StackMachine.h index b852604..b603a3b 100644 --- a/js4g/StackMachine.h +++ b/js4g/StackMachine.h @@ -32,14 +32,17 @@ namespace Dillo::Hydrogen::JavaScriptForge ::detail:: StackMachine_m class exports::StackMachine { private: - using Integer= std::int64_t; + using Long= std::uint64_t; + using Integer= std::int32_t; using Float= long double; + using Value= std::variant< std::string, Integer, Long >; + // The main runtime stack of the forth engine. // It grows on the "back". // A `std::deque` is used instead of `std::vector`, because // it helps cut down on large allocations, by subdividing things. - std::vector< std::variant< std::string, Integer > > stack; + std::vector< Value > stack; // TODO: Should these tokens be binary? // Upside: compressed. @@ -86,12 +89,13 @@ namespace Dillo::Hydrogen::JavaScriptForge ::detail:: StackMachine_m void runWord( std::string_view word ); - std::variant< std::string, Integer > pop(); - std::variant< std::string, Integer > &peek(); + Value pop(); + Value &peek(); void push( std::string s ); void push( Integer s ); - void push( std::variant< std::string, Integer > s ); + void push( Long s ); + void push( Value s ); template< typename T > T pop();