LIBEVAL::CONTEXT manages its own local VALUEs.

Don't use std::unique_ptr as we'll just free the
value right after storing it.

Also, don't try to execute a non-existent function.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/21697
This commit is contained in:
Jeff Young 2025-09-11 12:48:43 +01:00
parent fc7d91214d
commit 6ab6283e2e

View File

@ -1160,7 +1160,9 @@ void UOP::Exec( CONTEXT* ctx )
return; return;
case TR_OP_METHOD_CALL: case TR_OP_METHOD_CALL:
m_func( ctx, m_ref.get() ); if( m_func )
m_func( ctx, m_ref.get() );
return; return;
default: default:
@ -1321,9 +1323,8 @@ VALUE* UCODE::Run( CONTEXT* ctx )
} }
catch(...) catch(...)
{ {
// rules which fail outright should not be fired // rules which fail outright should not be fired; return 0/false
std::unique_ptr<VALUE> temp_false = std::make_unique<VALUE>( 0 ); return ctx->StoreValue( new VALUE( 0 ) );
return ctx->StoreValue( temp_false.get() );
} }
if( ctx->SP() == 1 ) if( ctx->SP() == 1 )
@ -1339,8 +1340,7 @@ VALUE* UCODE::Run( CONTEXT* ctx )
wxASSERT( ctx->SP() == 1 ); wxASSERT( ctx->SP() == 1 );
// non-well-formed rules should not be fired on a release build // non-well-formed rules should not be fired on a release build
std::unique_ptr<VALUE> temp_false = std::make_unique<VALUE>( 0 ); return ctx->StoreValue( new VALUE( 0 ) );
return ctx->StoreValue( temp_false.get() );
} }
} }