/*
 * Generic stack scanning function
 *
 * This currently only scans the last 32 levels of the current stack.
 */
#ifdef __GNUC__
#include "private.h"
#include "node.h"
/*--------------------------------------------------------- */
void
lub_heap_scan_stack(void)
{
    char *start,*end;
#define FRAME_ADDRESS(n)                            \
    {                                               \
        char *fn = __builtin_return_address(n);     \
        if(!fn || (fn > lub_heap_data_start))       \
        {                                           \
            break;                                  \
        }                                           \
        end = __builtin_frame_address(n);           \
    }                                               \

    start = end = __builtin_frame_address(0);

    do {
        FRAME_ADDRESS(0);
        FRAME_ADDRESS(1);
        FRAME_ADDRESS(2);
        FRAME_ADDRESS(3);
        FRAME_ADDRESS(4);
        FRAME_ADDRESS(5);
        FRAME_ADDRESS(6);
        FRAME_ADDRESS(7);
        FRAME_ADDRESS(8);
        FRAME_ADDRESS(9);
        FRAME_ADDRESS(10);
        FRAME_ADDRESS(11);
        FRAME_ADDRESS(12);
        FRAME_ADDRESS(13);
        FRAME_ADDRESS(14);
        FRAME_ADDRESS(15);
        FRAME_ADDRESS(16);
        FRAME_ADDRESS(17);
        FRAME_ADDRESS(18);
        FRAME_ADDRESS(19);
        FRAME_ADDRESS(20);
        FRAME_ADDRESS(21);
        FRAME_ADDRESS(22);
        FRAME_ADDRESS(23);
        FRAME_ADDRESS(24);
        FRAME_ADDRESS(25);
        FRAME_ADDRESS(26);
        FRAME_ADDRESS(27);
        FRAME_ADDRESS(28);
        FRAME_ADDRESS(29);
        FRAME_ADDRESS(30);
        FRAME_ADDRESS(31);
    } while(0);
    /* now scan the memory */
    lub_heap_scan_memory(start,end-start);
}
/*--------------------------------------------------------- */
#else /* not __GNUC__ */
    #warning "Generic stack scanning not implemented for non-GCC compiler..."
#endif /* not __GNUC__*/