Exemplo n.º 1
0
Var Interpreter::update_Callable( Var callable, Var varargs ) {
    // -> new Callable[ surdef_list, self_type, parm_type ]
    TypeInfo *type = type_info( callable.type_expr() );
    if ( isa_Void( type->parameters[ 2 ] ) ) {
        // -> no previously defined parms
        Expr n_data = concat( callable.expr(), pointer_on( varargs.expr() ) );
        Var varargs_type = type_of( varargs );


        // -> Callable[ surdef_list, self_type, parm_type ]
        Var *parms[ 3 ];
        parms[ 0 ] = &type->parameters[ 0 ];
        parms[ 1 ] = &type->parameters[ 1 ];
        parms[ 2 ] = &varargs_type;

        Var res( type_for( class_info( class_Callable ), parms ), n_data );
        res.add_ref_from( callable );
        res.add_ref( callable.expr().size_in_bits(), varargs );
        return res;
    }
    //
    PRINT( type->parameters[ 2 ] );
    TODO;
    return error_var;
}
Exemplo n.º 2
0
Var Interpreter::make_Callable( Vec<Var> lst, Var self ) {
    // remove doubles
    for( int i = 0; i < lst.size(); ++i )
        for( int j = i + 1; j < lst.size(); ++j )
            if ( lst[ i ].expr() == lst[ j ].expr() )
                lst.remove_unordered( j-- );

    //
    Expr surdef_list_data = cst( SI32( lst.size() ) );
    for( int i = 0; i < lst.size(); ++i )
        surdef_list_data = concat( surdef_list_data, pointer_on( lst[ i ].expr() ) );
    Var surdef_list( &type_SurdefList, surdef_list_data );

    //
    Var self_type = type_of( self ); // returns void if self is not defined

    // -> Callable[ surdef_list, self_type, parm_type ]
    Var *parms[ 3 ];
    parms[ 0 ] = &surdef_list;
    parms[ 1 ] = &self_type;
    parms[ 2 ] = &void_var;

    Var *callable_type = type_for( class_info( class_Callable ), parms );
    return Var( callable_type, self ? pointer_on( self.expr() ) : cst() ).add_ref( 0, self );
}
Exemplo n.º 3
0
Var Interpreter::ext_method( const Var &var ) {
    if ( isa_Def( var ) )
        if ( DefInfo *d = def_info( pointer_on( var.expr() ) ) )
            if ( d->self_as_arg() )
                return var;
    return Var();
}
Exemplo n.º 4
0
bool Interpreter::is_of_class( const Var &var, const Var &class_ ) const {
    Expr class_ptr = slice( var.type->ptr->expr(), 0, arch->ptr_size );
    return val_at( class_ptr, arch->ptr_size + 2 * 32 ) == class_.expr();
}
Exemplo n.º 5
0
bool Interpreter::equal( Var a, Var b ) {
    if ( isa_Type( a ) and isa_Type( b ) )
        return a.expr() == b.expr();
    if ( isa_SurdefList( a ) and isa_SurdefList( b ) )
        return a.expr() == b.expr();
    if ( isa_Callable( a ) and isa_Callable( b ) )
        return a.expr() == b.expr();
    if ( isa_SI32( a ) and isa_SI32( b ) )
        return a.expr() == b.expr();
    if ( isa_PI32( a ) and isa_PI32( b ) )
        return a.expr() == b.expr();
    if ( isa_SI64( a ) and isa_SI64( b ) )
        return a.expr() == b.expr();
    if ( isa_PI64( a ) and isa_PI64( b ) )
        return a.expr() == b.expr();
    if ( isa_Void( a ) )
        return isa_Void( b );
    if ( isa_Void( b ) )
        return isa_Void( a );
    //
    if ( isa_Type( a ) and isa_Callable( b ) ) {
        Var t = main_scope->apply( b, 0, 0, 0, 0, 0, Scope::APPLY_MODE_PARTIAL_INST, Expr(), 0 );
        return a.expr() == t.type_expr();
    }

    PRINT( a );
    PRINT( b );
    TODO;
    return false;
}