polserver/pol-core/bscript/executor.inl.h
Kevin Eady 5cf6949ea7
Add support for regular expressions (#818)
* implementation

* tests

* maybe fix windows compilation?

* undo change of match_flag_type

* switch to boost regex

* move flags to BRegExp object

* fix tests due to cmake 4 update

* update grammar

* update prettifier

* move flag parsing to BRegExp ctor

* add AST nodes, update instr generation and execution

* copy tests but use regular expression literals

* fix grammar for handling division correctly

* modify return values a bit, update tests
- string.match: make groups hold structs of matched, offset
- string.match: add offset
- string.replace: use a groups array like string.match vs individual arguments

* bundle of changes

- standardize error messages
- add more tests for coverage
- move BRegExp creation to static method:  previous implementation had
  ctor throwing, which was no good inside executor since it didn't have
  a try/catch

* more tests; add OT_REGEXP to basic.em

* move string regex stuff to bregexp and support regex/wregex via std::visit

* maybe fix compilation errors?

* add unicode escape sequence handling

* really maybe fix compilation error?

* fix compiler warnings

* refactor a bit to remove duplicate code

* address discord comments
- just return wstring, no need for vector<wchar_t> method

* Add string.split by string and regexp

* Use Max_Split instead of Limit
This makes it match basic::SplitWords

* add support for empty string delim in SplitWords

* remove duplicate code across string.split and mf_SplitWords

* Squashed commit of the following:

commit b3148e069f
Author: turleypol <turley@polserver.com>
Date:   Sat Sep 27 17:02:22 2025 +0200

    memorylocation of input string is not allowed to changed, switched back
    to uniqueptr

commit 5a4d1c8fcb
Author: turleypol <turley@polserver.com>
Date:   Sat Sep 27 10:18:01 2025 +0200

    no need to use ptr for input

commit 90fa0edc66
Author: turleypol <turley@polserver.com>
Date:   Sat Sep 27 09:56:29 2025 +0200

    fixed typo

commit bed4ff3ac9
Author: turleypol <turley@polserver.com>
Date:   Sat Sep 27 09:47:36 2025 +0200

    make Callback for BContinuation move only

* use uninit when group isn't matched

* fix multiline flag handling; add test

* add docs and doc example tests

* some cleanup

* address review comments
- allow move assignment

* add core-changes
2025-11-17 18:02:45 +01:00

79 lines
2.1 KiB
C++

// Really for IDE integration
#include "bobject.h"
#include <ranges>
namespace Pol::Bscript
{
template <typename Callback>
struct CallbackData
{
CallbackData( Callback&& callback ) : callback( std::move( callback ) ) {}
CallbackData( const CallbackData& data ) = delete;
CallbackData& operator=( const CallbackData& data ) = delete;
CallbackData( CallbackData&& data ) = default;
CallbackData& operator=( CallbackData&& data ) = default;
~CallbackData() = default;
static BObjectImp* call( Executor& exec, BContinuation* continuation, void* data,
BObjectRef result )
{
CallbackData* cbData = static_cast<CallbackData*>( data );
return cbData->callback( exec, continuation, result );
}
static void free( void* data )
{
CallbackData* cbData = static_cast<CallbackData*>( data );
delete cbData;
}
static size_t size() { return sizeof( CallbackData ); }
private:
Callback callback;
};
// returns BError* or BContinuation*
template <typename Callback>
BObjectImp* Executor::makeContinuation( BObjectRef funcref, Callback&& callback,
BObjectRefVec args )
{
auto* func = funcref->impptr_if<BFunctionRef>();
if ( !func )
return new BError( "Invalid parameter type" );
// Add function arguments to value stack. Add arguments if there are not enough. Remove if
// there are too many
while ( func->numParams() > static_cast<int>( args.size() ) )
{
args.emplace_back( UninitObject::create() );
}
// Resize args only for non-varadic functions
if ( !func->variadic() )
args.resize( func->numParams() );
CallbackData<Callback>* details = new CallbackData<Callback>( std::move( callback ) );
return new BContinuation(
std::move( funcref ), std::move( args ),
{ CallbackData<Callback>::call, CallbackData<Callback>::free, CallbackData<Callback>::size },
std::move( details ) );
}
} // namespace Pol::Bscript
template <typename Callback>
inline void Pol::Bscript::Executor::walkCallStack( Callback&& callback )
{
callback( PC );
for ( auto& call : ControlStack | std::views::reverse )
{
callback( call.PC );
}
}