Beispiel #1
0
mword is_false_tptr(mword *bs){ // is_false_tptr#

    return 
           (tageq(bs, BABEL_TAG_FALSE     , TAG_SIZE)
        ||  tageq(bs, BABEL_TAG_REJECT    , TAG_SIZE)
        ||  tageq(bs, BABEL_TAG_UNEXIST   , TAG_SIZE)
        ||  tageq(bs, BABEL_TAG_INTERP_NIL, TAG_SIZE));

}
Beispiel #2
0
// same as pop_udr_stack except calls mc_free if PACMAN tag
//
void zap_udr_stack(mword *stack_ptr){ // zap_udr_stack#

    mword *free_ptr = (mword*)icar(stack_ptr);

    mword *tag = (mword*)icar(icdr(icar(icar(stack_ptr))));
    mword *temp = (mword*)icar(icar(icar(stack_ptr)));

    (mword*)*stack_ptr = _pop((mword*)icar(stack_ptr));

    //_dump(stack_ptr);

//    trace;
//    _mem(temp);
//    printf("\n");

    if(is_tptr(tag) && tageq(tag,BABEL_TAG_PACMAN,TAG_SIZE)){
        //printf("MATCH\n");
        mc_free(temp);
    }

    free_lumbar(free_ptr);

}
Beispiel #3
0
// XXX The return-value from this function contains unsafe pointers!!! XXX
// XXX internal interp use ONLY                                        XXX
// XXX If you pass tag=nil, returns ALL tags in bs                     XXX
// XXX PERF: A _tags2ar (like _bs2ar) would be more efficient          XXX
//
mword *tptr_find_tag_unsafe(bvm_cache *this_bvm, mword *bs, mword *tag){ // tptr_find_tag_unsafe#

    mword *span_array     = _bs2ar(this_bvm, bs);
    mword size_span_array = size(span_array);
    mword size_inte;
    mword *tag_list       = nil;
    mword *curr_span_elem;
    mword *curr_inte_elem;


//_dump(span_array);

    int i,j;
    for(i=0; i<size_span_array; i++){

        curr_span_elem = rci(span_array,i);

        if(is_inte(curr_span_elem)){ // check each element

            size_inte = size(curr_span_elem);

            for(j=0;j<size_inte;j++){

                curr_inte_elem = rci(curr_span_elem,j);

                if(is_nil(curr_inte_elem)){
                    continue;
                }

                if(is_tptr(curr_inte_elem)){

                    if(is_nil(tag)){

                        // push onto tag_list
                        if(is_nil(tag_list)){
                            tag_list = _cons(this_bvm, (curr_span_elem+j), nil);
                        }
                        else{
                            _unshift(this_bvm, tag_list, (curr_span_elem+j));
                        }

                    }
                    else{

                        if( tageq(curr_inte_elem, tag, TAG_SIZE) ){

                            // push onto tag_list
                            if(is_nil(tag_list)){
                                tag_list = _cons(this_bvm, (curr_span_elem+j), nil);
                            }
                            else{
                                _unshift(this_bvm, tag_list, (curr_span_elem+j));
                            }

                        }

                    }


                }

            }

        }

    }

    return tag_list;

}