Goose  Artifact [e19c357854]

Artifact e19c357854cb23eeb7e13887e799c710c410a6b0fa501b793828932ab9834229:

  • File bs/builtins/types/localvar/invoke.cpp — part of check-in [0d5427d49b] at 2022-05-23 08:44:00 on branch cir-stack-language —
    • CIR instructions are now stored in lists
    • Execute: handle the stack
    • Converted some instructions to use the stack
    (user: zlodo size: 1307)

#include "builtins/builtins.h"

using namespace goose::sema;

namespace goose::builtins
{
    class LocVarInvocationRule : public InvocationRule
    {
        public:
            bool canBeInvoked( const Context& c, const Value& callee ) const final
            {
                auto lv = *FromValue< LocalVar >( callee );

                auto val = BuildComputedValue( lv.type(),
                    GetAddrFromLocalVar( lv ),
                    cir::Load( lv.type() ) );

                return sema::CanBeInvoked( c, val );
            }

            Value resolveInvocation( Context& c, LocationId locationId, const Value& callee, const Term& args ) const final
            {
                auto lv = *FromValue< LocalVar >( callee );

                auto val = BuildComputedValue( lv.type(),
                    GetAddrFromLocalVar( lv ),
                    cir::Load( lv.type() ) );

                return sema::GetInvocationRule( *c.env(), val )->resolveInvocation( c, locationId, val, args );
            }
    };

    void SetupLocalVarInvocationRule( Env& e )
    {
        e.invocationRuleSet()->addRule(
            ValueToEIR( Value(
                GetValueType< LocalVar >( ANYTERM( _ ) ),
                ANYTERM( _ ) ) ),
            make_shared< LocVarInvocationRule >() );
    }
}