nlr_raise NULL error

C programming, build, interpreter/VM.
Target audience: MicroPython Developers.
Post Reply
p-i-
Posts: 20
Joined: Sun Sep 14, 2014 2:24 pm

nlr_raise NULL error

Post by p-i- » Sun Sep 21, 2014 12:05 pm

I am getting "use of declared identifier NULL" here:

Code: Select all

[stackctrl.c line 59]        nlr_raise(mp_obj_new_exception_msg(&mp_type_RuntimeError, "maximum recursion depth exceeded"));
The caret is on nlr_raise.

I go to the definition (line 81 of nlr.h):

Code: Select all

// use nlr_raise instead of nlr_jump so that debugging is easier
#ifndef DEBUG
#define nlr_raise(val) nlr_jump(val)
#else
#warning "this path gets hit"
#define nlr_raise(val) \
    do { \
        void *_val = val; \
        assert(_val != NULL); \
        assert(mp_obj_is_exception_instance(_val)); \
        nlr_jump(_val); \
    } while (0)
#endif
I put in a #warning just to show that DEBUG is defined

So this means nlr_jump is NULL?

Looking further up nlr.h, I comment out a few lines to get µPy to use the compiler's setjmp/longjmp:

Code: Select all

#include <limits.h>
#include <setjmp.h>
#include <assert.h>

typedef struct _nlr_buf_t nlr_buf_t;
struct _nlr_buf_t {
    // the entries here must all be machine word size
    nlr_buf_t *prev;
    void *ret_val;
// π
//#if !MICROPY_NLR_SETJMP
//#if defined(__i386__)
//    void *regs[6];
//#elif defined(__x86_64__)
//  #if defined(__CYGWIN__)
//    void *regs[12];
//  #else
//    void *regs[8];
//  #endif
//#elif defined(__thumb2__) || defined(__thumb__) || defined(__arm__)
//    void *regs[10];
//#else
    #define MICROPY_NLR_SETJMP (1)
//    #warning "No native NLR support for this arch, using setjmp implementation"
//#endif
//#endif

#if MICROPY_NLR_SETJMP
    jmp_buf jmpbuf;
#endif
};

#if MICROPY_NLR_SETJMP
extern nlr_buf_t *nlr_setjmp_top;
NORETURN void nlr_setjmp_jump(void *val);
// nlr_push() must be defined as a macro, because "The stack context will be
// invalidated if the function which called setjmp() returns."
#define nlr_push(buf) ((buf)->prev = nlr_setjmp_top, nlr_setjmp_top = (buf), setjmp((buf)->jmpbuf))
#define nlr_pop() { nlr_setjmp_top = nlr_setjmp_top->prev; }
#define nlr_jump(val) nlr_setjmp_jump(val)
#else
unsigned int nlr_push(nlr_buf_t *);
void nlr_pop(void);
NORETURN void nlr_jump(void *val);
#endif

// This must be implemented by a port.  It's called by nlr_jump
// if no nlr buf has been pushed.  It must not return, but rather
// should bail out with a fatal error.
void nlr_jump_fail(void *val);
So tracing back from nlr_jump,

Code: Select all

#define nlr_jump(val) nlr_setjmp_jump(val)

Code: Select all

NORETURN void nlr_setjmp_jump(void *val);
Searching the project for nlr_setjmp_jump, I find the definition in nlrsetjump.c:

Code: Select all

#include <setjmp.h>
#include <stdio.h>
#include "mpconfig.h"
#include "nlr.h"

#if MICROPY_NLR_SETJMP

nlr_buf_t *nlr_setjmp_top;

void nlr_setjmp_jump(void *val) {
    nlr_buf_t *buf = nlr_setjmp_top;
    nlr_setjmp_top = buf->prev;
    buf->ret_val = val;
    longjmp(buf->jmpbuf, 1);
}

#endif
So I don't understand the original compiler error.

What is going on here?

stijn
Posts: 735
Joined: Thu Apr 24, 2014 9:13 am

Re: nlr_raise NULL error

Post by stijn » Sun Sep 21, 2014 1:09 pm

Code: Select all

"use of declared identifier NULL"
That cannot possibly be the exact error message. Please post it exactly as it appears, i.e. copy-paste. And also what compiler/platform you are using.
Anyway: is it possible you are compiling C as C++? In that case NULL should be declared in cstddef

p-i-
Posts: 20
Joined: Sun Sep 14, 2014 2:24 pm

Re: nlr_raise NULL error

Post by p-i- » Sun Sep 21, 2014 5:38 pm

UNdeclared!

Argh! I use speech recognition (RSI) and it sometimes catches me out.

Yes, you were right, it was missing a definition for NULL itself. Fixed!

Post Reply