mirror of
https://github.com/micropython/micropython.git
synced 2026-01-07 12:40:15 +01:00
py: More robust checking in inline assembler compiler.
This commit is contained in:
26
py/compile.c
26
py/compile.c
@@ -3446,20 +3446,32 @@ STATIC void compile_scope_inline_asm(compiler_t *comp, scope_t *scope, pass_kind
|
|||||||
if (MP_PARSE_NODE_STRUCT_KIND(pns2) == PN_pass_stmt) {
|
if (MP_PARSE_NODE_STRUCT_KIND(pns2) == PN_pass_stmt) {
|
||||||
// no instructions
|
// no instructions
|
||||||
continue;
|
continue;
|
||||||
} else if (MP_PARSE_NODE_STRUCT_KIND(pns2) == PN_expr_stmt) {
|
} else if (MP_PARSE_NODE_STRUCT_KIND(pns2) != PN_expr_stmt) {
|
||||||
// an instruction; fall through
|
|
||||||
} else {
|
|
||||||
// not an instruction; error
|
// not an instruction; error
|
||||||
|
not_an_instruction:
|
||||||
compile_syntax_error(comp, nodes[i], "inline assembler expecting an instruction");
|
compile_syntax_error(comp, nodes[i], "inline assembler expecting an instruction");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// check structure of parse node
|
||||||
assert(MP_PARSE_NODE_IS_STRUCT(pns2->nodes[0]));
|
assert(MP_PARSE_NODE_IS_STRUCT(pns2->nodes[0]));
|
||||||
assert(MP_PARSE_NODE_IS_NULL(pns2->nodes[1]));
|
if (!MP_PARSE_NODE_IS_NULL(pns2->nodes[1])) {
|
||||||
|
goto not_an_instruction;
|
||||||
|
}
|
||||||
pns2 = (mp_parse_node_struct_t*)pns2->nodes[0];
|
pns2 = (mp_parse_node_struct_t*)pns2->nodes[0];
|
||||||
assert(MP_PARSE_NODE_STRUCT_KIND(pns2) == PN_power);
|
if (MP_PARSE_NODE_STRUCT_KIND(pns2) != PN_power) {
|
||||||
assert(MP_PARSE_NODE_IS_ID(pns2->nodes[0]));
|
goto not_an_instruction;
|
||||||
assert(MP_PARSE_NODE_IS_STRUCT_KIND(pns2->nodes[1], PN_trailer_paren));
|
}
|
||||||
|
if (!MP_PARSE_NODE_IS_ID(pns2->nodes[0])) {
|
||||||
|
goto not_an_instruction;
|
||||||
|
}
|
||||||
|
if (!MP_PARSE_NODE_IS_STRUCT_KIND(pns2->nodes[1], PN_trailer_paren)) {
|
||||||
|
goto not_an_instruction;
|
||||||
|
}
|
||||||
assert(MP_PARSE_NODE_IS_NULL(pns2->nodes[2]));
|
assert(MP_PARSE_NODE_IS_NULL(pns2->nodes[2]));
|
||||||
|
|
||||||
|
// parse node looks like an instruction
|
||||||
|
// get instruction name and args
|
||||||
qstr op = MP_PARSE_NODE_LEAF_ARG(pns2->nodes[0]);
|
qstr op = MP_PARSE_NODE_LEAF_ARG(pns2->nodes[0]);
|
||||||
pns2 = (mp_parse_node_struct_t*)pns2->nodes[1]; // PN_trailer_paren
|
pns2 = (mp_parse_node_struct_t*)pns2->nodes[1]; // PN_trailer_paren
|
||||||
mp_parse_node_t *pn_arg;
|
mp_parse_node_t *pn_arg;
|
||||||
|
|||||||
Reference in New Issue
Block a user