Ignore:
Timestamp:
May 2, 2023, 3:44:31 AM (16 months ago)
Author:
Fangren Yu <f37yu@…>
Branches:
ast-experimental, master
Children:
0c840fc
Parents:
1ab773e0
Message:

current progress

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/ResolvExpr/Unify.cc

    r1ab773e0 r46da46b  
    134134                env.apply( newSecond );
    135135
    136                 findOpenVars( newFirst, open, closed, need, have, FirstClosed );
    137                 findOpenVars( newSecond, open, closed, need, have, FirstOpen );
     136                // findOpenVars( newFirst, open, closed, need, have, FirstClosed );
     137                findOpenVars( newSecond, open, closed, need, have, newEnv, FirstOpen );
    138138
    139139                return unifyExact(newFirst, newSecond, newEnv, need, have, open, noWiden(), symtab );
     
    10291029
    10301030                void postvisit( const ast::TypeInstType * typeInst ) {
    1031                         assert( open.find( *typeInst ) == open.end() );
     1031                        // assert( open.find( *typeInst ) == open.end() );
    10321032                        handleRefType( typeInst, type2 );
    10331033                }
     
    11421142        ) {
    11431143                ast::OpenVarSet closed;
    1144                 findOpenVars( type1, open, closed, need, have, FirstClosed );
    1145                 findOpenVars( type2, open, closed, need, have, FirstOpen );
     1144                // findOpenVars( type1, open, closed, need, have, FirstClosed );
     1145                findOpenVars( type2, open, closed, need, have, env, FirstOpen );
    11461146                return unifyInexact(
    11471147                        type1, type2, env, need, have, open, WidenMode{ true, true }, symtab, common );
     
    11601160                        entry1 = var1 ? open.find( *var1 ) : open.end(),
    11611161                        entry2 = var2 ? open.find( *var2 ) : open.end();
    1162                 bool isopen1 = entry1 != open.end();
    1163                 bool isopen2 = entry2 != open.end();
    1164 
     1162                // bool isopen1 = entry1 != open.end();
     1163                // bool isopen2 = entry2 != open.end();
     1164                bool isopen1 = var1 && env.lookup(*var1);
     1165                bool isopen2 = var2 && env.lookup(*var2);
     1166
     1167                /*
    11651168                if ( isopen1 && isopen2 ) {
    11661169                        if ( entry1->second.kind != entry2->second.kind ) return false;
     
    11721175                } else if ( isopen2 ) {
    11731176                        return env.bindVar( var2, type1, entry2->second, need, have, open, widen, symtab );
    1174                 } else {
     1177                } */
     1178                if ( isopen1 && isopen2 ) {
     1179                        if ( var1->base->kind != var2->base->kind ) return false;
     1180                        return env.bindVarToVar(
     1181                                var1, var2, ast::TypeData{ var1->base->kind, var1->base->sized||var2->base->sized }, need, have,
     1182                                open, widen, symtab );
     1183                } else if ( isopen1 ) {
     1184                        return env.bindVar( var1, type2, ast::TypeData{var1->base}, need, have, open, widen, symtab );
     1185                } else if ( isopen2 ) {
     1186                        return env.bindVar( var2, type1, ast::TypeData{var2->base}, need, have, open, widen, symtab );
     1187                }else {
    11751188                        return ast::Pass<Unify_new>::read(
    11761189                                type1, type2, env, need, have, open, widen, symtab );
    11771190                }
     1191               
    11781192        }
    11791193
Note: See TracChangeset for help on using the changeset viewer.