Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
M
micropython
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Analytics
Analytics
Repository
Value Stream
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Commits
Open sidebar
xpstem
micropython
Commits
bad4e15d
Commit
bad4e15d
authored
Dec 08, 2018
by
Damien George
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
py/objexcept: Use macros to make offsets in emergency exc buf clearer.
parent
38151f35
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
24 additions
and
13 deletions
+24
-13
py/objexcept.c
py/objexcept.c
+24
-13
No files found.
py/objexcept.c
View file @
bad4e15d
...
@@ -40,12 +40,23 @@
...
@@ -40,12 +40,23 @@
// Number of items per traceback entry (file, line, block)
// Number of items per traceback entry (file, line, block)
#define TRACEBACK_ENTRY_LEN (3)
#define TRACEBACK_ENTRY_LEN (3)
// Number of traceback entries to reserve in the emergency exception buffer
// Optionally allocated buffer for storing some traceback, the tuple argument,
#define EMG_TRACEBACK_ALLOC (2 * TRACEBACK_ENTRY_LEN)
// and possible string object and data, for when the heap is locked.
// Optionally allocated buffer for storing the first argument of an exception
// allocated when the heap is locked.
#if MICROPY_ENABLE_EMERGENCY_EXCEPTION_BUF
#if MICROPY_ENABLE_EMERGENCY_EXCEPTION_BUF
// When used the layout of the emergency exception buffer is:
// - traceback entry (file, line, block)
// - traceback entry (file, line, block)
// - mp_obj_tuple_t object
// - n_args * mp_obj_t for tuple
// - mp_obj_str_t object
// - string data
#define EMG_BUF_TRACEBACK_OFFSET (0)
#define EMG_BUF_TRACEBACK_SIZE (2 * TRACEBACK_ENTRY_LEN * sizeof(size_t))
#define EMG_BUF_TUPLE_OFFSET (EMG_BUF_TRACEBACK_OFFSET + EMG_BUF_TRACEBACK_SIZE)
#define EMG_BUF_TUPLE_SIZE(n_args) (sizeof(mp_obj_tuple_t) + n_args * sizeof(mp_obj_t))
#define EMG_BUF_STR_OFFSET (EMG_BUF_TUPLE_OFFSET + EMG_BUF_TUPLE_SIZE(1))
# if MICROPY_EMERGENCY_EXCEPTION_BUF_SIZE > 0
# if MICROPY_EMERGENCY_EXCEPTION_BUF_SIZE > 0
#define mp_emergency_exception_buf_size MICROPY_EMERGENCY_EXCEPTION_BUF_SIZE
#define mp_emergency_exception_buf_size MICROPY_EMERGENCY_EXCEPTION_BUF_SIZE
...
@@ -153,9 +164,9 @@ mp_obj_t mp_obj_exception_make_new(const mp_obj_type_t *type, size_t n_args, siz
...
@@ -153,9 +164,9 @@ mp_obj_t mp_obj_exception_make_new(const mp_obj_type_t *type, size_t n_args, siz
// reserved room (after the traceback data) for a tuple with 1 element.
// reserved room (after the traceback data) for a tuple with 1 element.
// Otherwise we are free to use the whole buffer after the traceback data.
// Otherwise we are free to use the whole buffer after the traceback data.
if
(
o_tuple
==
NULL
&&
mp_emergency_exception_buf_size
>=
if
(
o_tuple
==
NULL
&&
mp_emergency_exception_buf_size
>=
EMG_
TRACEBACK_ALLOC
*
sizeof
(
size_t
)
+
sizeof
(
mp_obj_tuple_t
)
+
n_args
*
sizeof
(
mp_obj_t
))
{
EMG_
BUF_TUPLE_OFFSET
+
EMG_BUF_TUPLE_SIZE
(
n_args
))
{
o_tuple
=
(
mp_obj_tuple_t
*
)
o_tuple
=
(
mp_obj_tuple_t
*
)
((
uint8_t
*
)
MP_STATE_VM
(
mp_emergency_exception_buf
)
+
EMG_
TRACEBACK_ALLOC
*
sizeof
(
size_t
)
);
((
uint8_t
*
)
MP_STATE_VM
(
mp_emergency_exception_buf
)
+
EMG_
BUF_TUPLE_OFFSET
);
}
}
#endif
#endif
...
@@ -366,11 +377,10 @@ mp_obj_t mp_obj_new_exception_msg_varg(const mp_obj_type_t *exc_type, const char
...
@@ -366,11 +377,10 @@ mp_obj_t mp_obj_new_exception_msg_varg(const mp_obj_type_t *exc_type, const char
// that buffer to store the string object and its data (at least 16 bytes for
// that buffer to store the string object and its data (at least 16 bytes for
// the string data), reserving room at the start for the traceback and 1-tuple.
// the string data), reserving room at the start for the traceback and 1-tuple.
if
((
o_str
==
NULL
||
o_str_buf
==
NULL
)
if
((
o_str
==
NULL
||
o_str_buf
==
NULL
)
&&
mp_emergency_exception_buf_size
>=
EMG_TRACEBACK_ALLOC
*
sizeof
(
size_t
)
&&
mp_emergency_exception_buf_size
>=
EMG_BUF_STR_OFFSET
+
sizeof
(
mp_obj_str_t
)
+
16
)
{
+
sizeof
(
mp_obj_tuple_t
)
+
sizeof
(
mp_obj_t
)
+
sizeof
(
mp_obj_str_t
)
+
16
)
{
used_emg_buf
=
true
;
used_emg_buf
=
true
;
o_str
=
(
mp_obj_str_t
*
)((
uint8_t
*
)
MP_STATE_VM
(
mp_emergency_exception_buf
)
o_str
=
(
mp_obj_str_t
*
)((
uint8_t
*
)
MP_STATE_VM
(
mp_emergency_exception_buf
)
+
EMG_
TRACEBACK_ALLOC
*
sizeof
(
size_t
)
+
sizeof
(
mp_obj_tuple_t
)
+
sizeof
(
mp_obj_t
)
);
+
EMG_
BUF_STR_OFFSET
);
o_str_buf
=
(
byte
*
)
&
o_str
[
1
];
o_str_buf
=
(
byte
*
)
&
o_str
[
1
];
o_str_alloc
=
(
uint8_t
*
)
MP_STATE_VM
(
mp_emergency_exception_buf
)
o_str_alloc
=
(
uint8_t
*
)
MP_STATE_VM
(
mp_emergency_exception_buf
)
+
mp_emergency_exception_buf_size
-
o_str_buf
;
+
mp_emergency_exception_buf_size
-
o_str_buf
;
...
@@ -464,11 +474,12 @@ void mp_obj_exception_add_traceback(mp_obj_t self_in, qstr file, size_t line, qs
...
@@ -464,11 +474,12 @@ void mp_obj_exception_add_traceback(mp_obj_t self_in, qstr file, size_t line, qs
self
->
traceback_data
=
m_new_maybe
(
size_t
,
TRACEBACK_ENTRY_LEN
);
self
->
traceback_data
=
m_new_maybe
(
size_t
,
TRACEBACK_ENTRY_LEN
);
if
(
self
->
traceback_data
==
NULL
)
{
if
(
self
->
traceback_data
==
NULL
)
{
#if MICROPY_ENABLE_EMERGENCY_EXCEPTION_BUF
#if MICROPY_ENABLE_EMERGENCY_EXCEPTION_BUF
if
(
mp_emergency_exception_buf_size
>=
EMG_
TRACEBACK_ALLOC
*
sizeof
(
size_t
)
)
{
if
(
mp_emergency_exception_buf_size
>=
EMG_
BUF_TRACEBACK_OFFSET
+
EMG_BUF_TRACEBACK_SIZE
)
{
// There is room in the emergency buffer for traceback data
// There is room in the emergency buffer for traceback data
size_t
*
tb
=
(
size_t
*
)
MP_STATE_VM
(
mp_emergency_exception_buf
);
size_t
*
tb
=
(
size_t
*
)((
uint8_t
*
)
MP_STATE_VM
(
mp_emergency_exception_buf
)
+
EMG_BUF_TRACEBACK_OFFSET
);
self
->
traceback_data
=
tb
;
self
->
traceback_data
=
tb
;
self
->
traceback_alloc
=
EMG_
TRACEBACK_ALLOC
;
self
->
traceback_alloc
=
EMG_
BUF_TRACEBACK_SIZE
/
sizeof
(
size_t
)
;
}
else
{
}
else
{
// Can't allocate and no room in emergency buffer
// Can't allocate and no room in emergency buffer
return
;
return
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment