コード例 #1
0
ファイル: backtrace.c プロジェクト: LambdaOS/sbcl
static void
print_entry_name (lispobj name)
{
  if (lowtag_of (name) == LIST_POINTER_LOWTAG) {
    putchar('(');
    while (name != NIL) {
      struct cons *cons = (struct cons *) native_pointer(name);
      print_entry_name(cons->car);
      name = cons->cdr;
      if (name != NIL)
        putchar(' ');
    }
    putchar(')');
  } else if (lowtag_of(name) == OTHER_POINTER_LOWTAG) {
    lispobj *object = (lispobj *) native_pointer(name);
    if (widetag_of(*object) == SYMBOL_HEADER_WIDETAG) {
      struct symbol *symbol = (struct symbol *) object;
      if (symbol->package != NIL) {
        struct package *pkg
          = (struct package *) native_pointer(symbol->package);
        lispobj pkg_name = pkg->_name;
        if (string_equal(native_pointer(pkg_name), "COMMON-LISP"))
            ;
        else if (string_equal(native_pointer(pkg_name), "COMMON-LISP-USER")) {
            fputs("CL-USER::", stdout);
        }
        else if (string_equal(native_pointer(pkg_name), "KEYWORD")) {
            putchar(':');
        } else {
            print_string(native_pointer(pkg_name));
            fputs("::", stdout);
        }
      }
      print_string(native_pointer(symbol->name));
    } else if (widetag_of(*object) == SIMPLE_BASE_STRING_WIDETAG
#ifdef SIMPLE_CHARACTER_STRING_WIDETAG
               || widetag_of(*object) == SIMPLE_CHARACTER_STRING_WIDETAG
#endif
               ) {
      putchar('"');
      print_string(object);
      putchar('"');
    } else {
      printf("<??? type %d>", (int) widetag_of(*object));
    }
  } else {
    printf("<??? lowtag %d>", (int) lowtag_of(name));
  }
}
コード例 #2
0
ファイル: breakpoint.c プロジェクト: naurril/sbcl
static lispobj find_code(os_context_t *context)
{
#ifdef reg_CODE
    lispobj code = *os_context_register_addr(context, reg_CODE);
    lispobj header;

    if (lowtag_of(code) != OTHER_POINTER_LOWTAG)
        return NIL;

    header = *(lispobj *)(code-OTHER_POINTER_LOWTAG);

    if (widetag_of(header) == CODE_HEADER_WIDETAG)
        return code;
    else
        return code - HeaderValue(header)*sizeof(lispobj);
#else
    lispobj codeptr =
        (lispobj)component_ptr_from_pc((lispobj *)(*os_context_pc_addr(context)));

    if (codeptr == 0)
        return NIL;
    else
        return codeptr + OTHER_POINTER_LOWTAG;
#endif
}
コード例 #3
0
ファイル: backtrace.c プロジェクト: JonathanSmith/sbcl
static struct code *
code_pointer(lispobj object)
{
    lispobj *headerp, header;
    int type, len;

    headerp = (lispobj *) native_pointer(object);
    header = *headerp;
    type = widetag_of(header);

    switch (type) {
        case CODE_HEADER_WIDETAG:
            break;
        case RETURN_PC_HEADER_WIDETAG:
        case SIMPLE_FUN_HEADER_WIDETAG:
            len = HEADER_LENGTH(header);
            if (len == 0)
                headerp = NULL;
            else
                headerp -= len;
            break;
        default:
            headerp = NULL;
    }

    return (struct code *) headerp;
}
コード例 #4
0
ファイル: backtrace.c プロジェクト: LambdaOS/sbcl
static void
print_string (lispobj *object)
{
  int tag = widetag_of(*object);
  struct vector *vector = (struct vector *) object;

#define doit(TYPE)                              \
  do {                                          \
    int i;                                      \
    int n = fixnum_value(vector->length);       \
    TYPE *data = (TYPE *) vector->data;         \
    for (i = 0; i < n; i++) {                   \
      wchar_t c = (wchar_t) data[i];            \
      if (c == '\\' || c == '"')                \
        putchar('\\');                          \
      sbcl_putwc(c, stdout);                    \
    }                                           \
  } while (0)

  switch (tag) {
  case SIMPLE_BASE_STRING_WIDETAG:
    doit(unsigned char);
    break;
#ifdef SIMPLE_CHARACTER_STRING_WIDETAG
  case SIMPLE_CHARACTER_STRING_WIDETAG:
    doit(unsigned int);
    break;
#endif
  default:
    printf("<??? type %d>", tag);
  }
#undef doit
}
コード例 #5
0
ファイル: monitor.c プロジェクト: hanshuebner/sbcl
static void
search_cmd(char **ptr)
{
    static int lastval = 0, lastcount = 0;
    static lispobj *start = 0, *end = 0;
    int val, count;
    lispobj *addr, obj;

    if (more_p(ptr)) {
        val = parse_number(ptr);
        if (val < 0 || val > 0xff) {
            printf("can only search for single bytes\n");
            return;
        }
        if (more_p(ptr)) {
            addr = (lispobj *)native_pointer((uword_t)parse_addr(ptr));
            if (more_p(ptr)) {
                count = parse_number(ptr);
            }
            else {
                /* Specified value and address, but no count. Only one. */
                count = -1;
            }
        }
        else {
            /* Specified a value, but no address, so search same range. */
            addr = start;
            count = lastcount;
        }
    }
    else {
        /* Specified nothing, search again for val. */
        val = lastval;
        addr = end;
        count = lastcount;
    }

    lastval = val;
    start = end = addr;
    lastcount = count;

    printf("searching for 0x%x at %p\n", val, (void*)(uword_t)end);

    while (search_for_type(val, &end, &count)) {
        printf("found 0x%x at %p:\n", val, (void*)(uword_t)end);
        obj = *end;
        addr = end;
        end += 2;
        if (widetag_of(obj) == SIMPLE_FUN_HEADER_WIDETAG) {
            print((uword_t)addr | FUN_POINTER_LOWTAG);
        } else if (other_immediate_lowtag_p(obj)) {
            print((lispobj)addr | OTHER_POINTER_LOWTAG);
        } else {
            print((lispobj)addr);
        }
        if (count == -1) {
            return;
        }
    }
}
コード例 #6
0
ファイル: backtrace.c プロジェクト: LambdaOS/sbcl
static int string_equal (lispobj *object, char *string)
{
    int tag = widetag_of(*object);
    struct vector *vector = (struct vector *) object;

    if (tag != SIMPLE_BASE_STRING_WIDETAG)
        return 0;
    return !strcmp((char *) vector->data, string);
}
コード例 #7
0
ファイル: save.c プロジェクト: r3v01v3r/sbcl-tfb
static void
scan_objects(lispobj *start, long n_words, scan_table table)
{
    lispobj *end = start + n_words;
    lispobj *object_ptr;
    long n_words_scanned;
    for (object_ptr = start;
         object_ptr < end;
         object_ptr += n_words_scanned) {
        lispobj obj = *object_ptr;

        n_words_scanned = (table[widetag_of(obj)])(object_ptr);
    }
}
コード例 #8
0
ファイル: save.c プロジェクト: r3v01v3r/sbcl-tfb
static long
lutex_scan_action(lispobj *obj)
{
    /* note the address of the lutex */
    if(n_lutexes >= max_lutexes) {
        max_lutexes *= 2;
        lutex_addresses = realloc(lutex_addresses, max_lutexes * sizeof(void *));
        gc_assert(lutex_addresses);
    }

    lutex_addresses[n_lutexes++] = obj;

    return (*sizetab[widetag_of(*obj)])(obj);
}
コード例 #9
0
ファイル: save.c プロジェクト: r3v01v3r/sbcl-tfb
static long
default_scan_action(lispobj *obj)
{
    return (sizetab[widetag_of(*obj)])(obj);
}