Switch to 32-bit math by default.
I'll need a way to get back into 64-bit mode.
This commit is contained in:
@ -228,10 +228,11 @@ namespace Dillo::Hydrogen::JavaScriptForge ::detail:: StackMachine_m
|
|||||||
{
|
{
|
||||||
if( std::holds_alternative< T >( peek() ) ) return std::get< T >( pop() );
|
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< 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() ) );
|
else return boost::lexical_cast< T >( std::get< std::string >( pop() ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
std::variant< std::string, StackMachine::Integer >
|
StackMachine::Value
|
||||||
StackMachine::pop()
|
StackMachine::pop()
|
||||||
{
|
{
|
||||||
const auto rv= std::move( peek() );
|
const auto rv= std::move( peek() );
|
||||||
@ -239,7 +240,7 @@ namespace Dillo::Hydrogen::JavaScriptForge ::detail:: StackMachine_m
|
|||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::variant< std::string, StackMachine::Integer > &
|
StackMachine::Value &
|
||||||
StackMachine::peek()
|
StackMachine::peek()
|
||||||
{
|
{
|
||||||
if( stack.empty() ) throw std::runtime_error{ "FATAL: No more elements in stack." };
|
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
|
void
|
||||||
StackMachine::push( std::variant< std::string, Integer > element )
|
StackMachine::push( Value element )
|
||||||
{
|
{
|
||||||
stack.push_back( std::move( element ) );
|
stack.push_back( std::move( element ) );
|
||||||
}
|
}
|
||||||
@ -264,11 +265,18 @@ namespace Dillo::Hydrogen::JavaScriptForge ::detail:: StackMachine_m
|
|||||||
stack.push_back( std::move( element ) );
|
stack.push_back( std::move( element ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
StackMachine::push( Long element )
|
||||||
|
{
|
||||||
|
stack.push_back( std::move( element ) );
|
||||||
|
}
|
||||||
|
|
||||||
template< typename T >
|
template< typename T >
|
||||||
void
|
void
|
||||||
StackMachine::push( const T &t )
|
StackMachine::push( const T &t )
|
||||||
{
|
{
|
||||||
if constexpr( std::is_same_v< Integer, T > ) push( 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 if constexpr( std::is_same_v< std::string, T > ) push( t );
|
||||||
else push( boost::lexical_cast< std::string >( t ) );
|
else push( boost::lexical_cast< std::string >( t ) );
|
||||||
}
|
}
|
||||||
|
|||||||
@ -32,14 +32,17 @@ namespace Dillo::Hydrogen::JavaScriptForge ::detail:: StackMachine_m
|
|||||||
class exports::StackMachine
|
class exports::StackMachine
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
using Integer= std::int64_t;
|
using Long= std::uint64_t;
|
||||||
|
using Integer= std::int32_t;
|
||||||
using Float= long double;
|
using Float= long double;
|
||||||
|
|
||||||
|
using Value= std::variant< std::string, Integer, Long >;
|
||||||
|
|
||||||
// The main runtime stack of the forth engine.
|
// The main runtime stack of the forth engine.
|
||||||
// It grows on the "back".
|
// It grows on the "back".
|
||||||
// A `std::deque` is used instead of `std::vector`, because
|
// A `std::deque` is used instead of `std::vector`, because
|
||||||
// it helps cut down on large allocations, by subdividing things.
|
// 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?
|
// TODO: Should these tokens be binary?
|
||||||
// Upside: compressed.
|
// Upside: compressed.
|
||||||
@ -86,12 +89,13 @@ namespace Dillo::Hydrogen::JavaScriptForge ::detail:: StackMachine_m
|
|||||||
|
|
||||||
void runWord( std::string_view word );
|
void runWord( std::string_view word );
|
||||||
|
|
||||||
std::variant< std::string, Integer > pop();
|
Value pop();
|
||||||
std::variant< std::string, Integer > &peek();
|
Value &peek();
|
||||||
|
|
||||||
void push( std::string s );
|
void push( std::string s );
|
||||||
void push( Integer s );
|
void push( Integer s );
|
||||||
void push( std::variant< std::string, Integer > s );
|
void push( Long s );
|
||||||
|
void push( Value s );
|
||||||
|
|
||||||
template< typename T >
|
template< typename T >
|
||||||
T pop();
|
T pop();
|
||||||
|
|||||||
Reference in New Issue
Block a user