Goose  Diff

Differences From Artifact [72a21b14e2]:

  • File bs/builtins/types/runtime/unify.cpp — part of check-in [12f37d77cb] at 2019-12-05 17:40:07 on branch trunk — Implemented a helper to check whether a type is compile-time only. (user: achavasse size: 7146)

To Artifact [b06161ef0b]:

  • File bs/builtins/types/runtime/unify.cpp — part of check-in [cc380f4f8f] at 2020-01-22 22:14:16 on branch trunk — Standardized the way type values are encoded to make room for an optional pointer to a list of predicates for refinement types. (user: achavasse size: 7028)

1

2
3
4
5
6
7
8
9
10

11
12

13
14
15
16
17
18
19
1
2
3
4
5
6
7
8
9
10

11


12
13
14
15
16
17
18
19

+








-
+
-
-
+







#include "builtins/builtins.h"
#include "builtins/helpers.h"

using namespace goose;
using namespace goose::ir;

namespace goose::builtins
{
    void SetupRuntimeTypesUnification( Env& e )
    {
        auto rtIntTypePattern = Value( TypeType(), VEC( TSID( rt_type ),
        auto rtIntTypePattern = Value( TypeType(), MkStdType( TSID( integer ),
            ANYTERM( _ ),
            TSID( integer ), VEC( ANYTERM( _ ), ANYTERM( _ ) ) ) );
            VEC( ANYTERM( _ ), ANYTERM( _ ) ) ) );

        // ct_int type against a IntegerType type:
        // return the IntegerType type. We don't care if the
        // ct_int fits at this point, this will be dealt with by
        // the ct_int value unification rule below.
        e.unificationRuleSet()->addSymRule(
            ValueToIRExpr( rtIntTypePattern ),
113
114
115
116
117
118
119
120

121
122

123
124

125
126

127
128
129
130
131
132
133
113
114
115
116
117
118
119

120


121
122

123


124
125
126
127
128
129
130
131







-
+
-
-
+

-
+
-
-
+







            }

            auto* llvmType = static_cast< llvm::IntegerType* >( GetLLVMType( *rttypeVal ) );
            co_yield { ValueToIRExpr(
                Value( lhsVal->type(), move( valToLoad ) ) ), c };
        } );

        auto rtInt8TypePattern = Value( TypeType(), VEC( TSID( rt_type ),
        auto rtInt8TypePattern = Value( TypeType(), MkStdType( TSID( integer ),
            ANYTERM( _ ),
            TSID( integer ), VEC( TERM( 8U ), ANYTERM( _ ) ) ) );
            VEC( TERM( 8U ), ANYTERM( _ ) ) ) );

        auto rtInt8PtrTypePattern = Value( TypeType(), VEC( TSID( rt_type ),
        auto rtInt8PtrTypePattern = Value( TypeType(), MkStdType( TSID( pointer ),
            ANYTERM( _ ),
            TSID( pointer ), ValueToIRExpr( rtInt8TypePattern ) ) );
            ValueToIRExpr( rtInt8TypePattern ) ) );

        // ct_string type against a char*:
        // return the char* type.
        e.unificationRuleSet()->addSymRule(
            ValueToIRExpr( rtInt8PtrTypePattern ),
            GetValueType< string >(),
        []( const Term& lhs, const Term& rhs, UnificationContext& c ) -> UniGen
175
176
177
178
179
180
181
182
183


184
185
186
187
188
189
190
191
173
174
175
176
177
178
179


180
181

182
183
184
185
186
187
188







-
-
+
+
-







            auto str = *FromValue< string >( *ValueFromIRExpr( lhs ) );
            auto rhsVal = *ValuePatternFromIRExpr( rhs );

            co_yield { ValueToIRExpr(
                BuildComputedValue( rhsVal.type(), llr::LoadConstStr( str ) ) ), c };
        } );

        auto ptrTypePattern = Value( TypeType(), VEC( TSID( rt_type ),
            ANYTERM( _ ),
        auto ptrTypePattern = Value( TypeType(), MkStdType( TSID( pointer ),
            ANYTERM( _ ) ) );
            TSID( pointer ), ANYTERM( _ ) ) );

        // nullptr constant unification against a pointer of any type;
        // Yield a value of the given pointer type, with a 0 integer as its content.
        // This'll be recognized by codegen to emit a null pointer value of the right type.
        e.unificationRuleSet()->addSymRule(

            ParamPat( ValueToIRExpr( ptrTypePattern ) ),