Goose  Artifact [1ab82ae9d8]

Artifact 1ab82ae9d80506138f06ce8acc37a54eba9c47a18fb3e5df6608159b2d1af4b3:

  • File bs/builtins/types/overloadset/helpers.cpp — part of check-in [ed31e6303b] at 2019-08-01 15:53:57 on branch trunk —
    • Rewrote the operator helpers: they now generate and invoke an overloadable intrinsic.
    • Implemented the logical not operator.
    (user: achavasse size: 1084)

#include "builtins/builtins.h"
#include "execute/execute.h"

namespace empathy::builtins
{
    ptr< OverloadSet > CreateOverloadSet( Env& env, const StringId& name )
    {
        auto identity = AppendToVectorTerm( RootIdentity(), TERM( name ) );
        auto pOvlSet = make_shared< OverloadSet >( identity );
        env.storeValue( identity, ANYTERM( _ ), ValueToIRExpr( ToValue( pOvlSet ) ) );
        return pOvlSet;
    }

    optional< Value > InvokeOverloadSet( const Context& c, const ptr< OverloadSet >& pOvlSet, const Value& args )
    {
        if( !pOvlSet )
            return nullopt;

        Context localC( make_shared< Env >( *c.env() ), InjectDomainIntoIdentity( c.identity(), DomainCompileTime() ), GetValueType< uint64_t >() );

        auto val = ResolveInvocation( localC, GetOverloadSetInvocationRule(), ToValue( pOvlSet ), args );
        if( !val )
            return nullopt;

        if( val->isConstant() || !llr::CanValueBeEagerlyEvaluated( *val ) )
            return val;

        execute::VM vm;
        return execute::Evaluate( *val, vm );
    }
}