Home Gnymph Download
int method_Point_2F_Foo( int arity, struct datum * self, ... ) {
        int     in_arity, out_arity, n, i, id;
        struct datum    * t1, * t2, * t3, * t4, * t5, * t6, * t7, * t8, * t9, * t10, * t11, * t12, * t13, ** q;
        va_list	l;
        in_arity = ( arity >> 8 ) & 0xff;
        out_arity = arity & 0xff;
        if( in_arity < 3 || out_arity < 2 )
                error_arity();
        else {
                l = va_start( self );
                t1 = va_arg( l, datum * );
                t2 = list_create( in_arity - 3 );
                for( i = 0; i < in_arity - 3; i++ ) {
                        datum   * p;
                        p = va_arg( l, datum * );
                        list_set_nth( t2, i, p );
                }
                t3 = va_arg( l, datum * );
                t4 = va_arg( l, datum * );
                n = min4( list_size( t4 ), list_size( t3 ), list_size( t1 ), list_size( t2 ) );
                t5 = list_create( n );
                t6 = list_create( n );
                for( i = 0; i < n; i++ ) {
                        t8 = list_get_nth( t4, i );
                        t9 = list_get_nth( t3, i );
                        t10 = list_get_nth( t1, i );
                        t11 = list_get_nth( t2, i );
                        id = convert_datum_to_atom_id( t8 ) - atom_first_method_id;
                        if( 0 <= id && id < atom_id_count )
                                ( *dispatch_table_method[ t9->type * 36 + id ] )( 0x0303, t9, t10, t2, t11, &t12, &t13, &t7 );
                        else
                                error_invalid_method();
                        list_set_nth( t5, i, t12 );
                        list_set_nth( t6, i, t13 );
                }
                q = va_arg( l, datum ** );
                *q = t5;
                q = va_arg( l, datum ** );
                *q = t7;
                for( i = 0; i < out_arity - 2; i++ ) {
                        datum   * p;
                        p = list_get_nth( t6, i );
                        q = va_arg( l, datum ** );
                        *q = p;
                }
                list_free_base( t6 );
                va_end( l );
                list_free_base( t2 );
        }
        return 0;
}