Skip to content
GitLab
Menu
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
TASTE
uPython-mirror
Commits
7e5fb24e
Commit
7e5fb24e
authored
Feb 01, 2014
by
Damien George
Browse files
py: Reduce code size of compiler by a bit.
parent
e24b5637
Changes
1
Show whitespace changes
Inline
Side-by-side
py/compile.c
View file @
7e5fb24e
...
...
@@ -1771,22 +1771,23 @@ void compile_expr_stmt(compiler_t *comp, mp_parse_node_struct_t *pns) {
c_assign
(
comp
,
pns
->
nodes
[
0
],
ASSIGN_AUG_LOAD
);
// lhs load for aug assign
compile_node
(
comp
,
pns1
->
nodes
[
1
]);
// rhs
assert
(
MP_PARSE_NODE_IS_TOKEN
(
pns1
->
nodes
[
0
]));
// note that we don't really need to implement separate inplace ops, just normal binary ops will suffice
rt_binary_op_t
op
;
switch
(
MP_PARSE_NODE_LEAF_ARG
(
pns1
->
nodes
[
0
]))
{
case
MP_TOKEN_DEL_PIPE_EQUAL
:
EMIT_ARG
(
binary_op
,
RT_BINARY_OP_INPLACE_OR
);
break
;
case
MP_TOKEN_DEL_CARET_EQUAL
:
EMIT_ARG
(
binary_op
,
RT_BINARY_OP_INPLACE_XOR
);
break
;
case
MP_TOKEN_DEL_AMPERSAND_EQUAL
:
EMIT_ARG
(
binary_op
,
RT_BINARY_OP_INPLACE_AND
);
break
;
case
MP_TOKEN_DEL_DBL_LESS_EQUAL
:
EMIT_ARG
(
binary_op
,
RT_BINARY_OP_INPLACE_LSHIFT
);
break
;
case
MP_TOKEN_DEL_DBL_MORE_EQUAL
:
EMIT_ARG
(
binary_op
,
RT_BINARY_OP_INPLACE_RSHIFT
);
break
;
case
MP_TOKEN_DEL_PLUS_EQUAL
:
EMIT_ARG
(
binary_op
,
RT_BINARY_OP_INPLACE_ADD
);
break
;
case
MP_TOKEN_DEL_MINUS_EQUAL
:
EMIT_ARG
(
binary_op
,
RT_BINARY_OP_INPLACE_SUBTRACT
);
break
;
case
MP_TOKEN_DEL_STAR_EQUAL
:
EMIT_ARG
(
binary_op
,
RT_BINARY_OP_INPLACE_MULTIPLY
);
break
;
case
MP_TOKEN_DEL_DBL_SLASH_EQUAL
:
EMIT_ARG
(
binary_op
,
RT_BINARY_OP_INPLACE_FLOOR_DIVIDE
);
break
;
case
MP_TOKEN_DEL_SLASH_EQUAL
:
EMIT_ARG
(
binary_op
,
RT_BINARY_OP_INPLACE_TRUE_DIVIDE
);
break
;
case
MP_TOKEN_DEL_PERCENT_EQUAL
:
EMIT_ARG
(
binary_op
,
RT_BINARY_OP_INPLACE_MODULO
);
break
;
case
MP_TOKEN_DEL_DBL_STAR_EQUAL
:
EMIT_ARG
(
binary_op
,
RT_BINARY_OP_INPLACE_POWER
);
break
;
default:
assert
(
0
);
// shouldn't happen
}
case
MP_TOKEN_DEL_PIPE_EQUAL
:
op
=
RT_BINARY_OP_INPLACE_OR
;
break
;
case
MP_TOKEN_DEL_CARET_EQUAL
:
op
=
RT_BINARY_OP_INPLACE_XOR
;
break
;
case
MP_TOKEN_DEL_AMPERSAND_EQUAL
:
op
=
RT_BINARY_OP_INPLACE_AND
;
break
;
case
MP_TOKEN_DEL_DBL_LESS_EQUAL
:
op
=
RT_BINARY_OP_INPLACE_LSHIFT
;
break
;
case
MP_TOKEN_DEL_DBL_MORE_EQUAL
:
op
=
RT_BINARY_OP_INPLACE_RSHIFT
;
break
;
case
MP_TOKEN_DEL_PLUS_EQUAL
:
op
=
RT_BINARY_OP_INPLACE_ADD
;
break
;
case
MP_TOKEN_DEL_MINUS_EQUAL
:
op
=
RT_BINARY_OP_INPLACE_SUBTRACT
;
break
;
case
MP_TOKEN_DEL_STAR_EQUAL
:
op
=
RT_BINARY_OP_INPLACE_MULTIPLY
;
break
;
case
MP_TOKEN_DEL_DBL_SLASH_EQUAL
:
op
=
RT_BINARY_OP_INPLACE_FLOOR_DIVIDE
;
break
;
case
MP_TOKEN_DEL_SLASH_EQUAL
:
op
=
RT_BINARY_OP_INPLACE_TRUE_DIVIDE
;
break
;
case
MP_TOKEN_DEL_PERCENT_EQUAL
:
op
=
RT_BINARY_OP_INPLACE_MODULO
;
break
;
case
MP_TOKEN_DEL_DBL_STAR_EQUAL
:
op
=
RT_BINARY_OP_INPLACE_POWER
;
break
;
default:
assert
(
0
);
op
=
RT_BINARY_OP_INPLACE_OR
;
// shouldn't happen
}
EMIT_ARG
(
binary_op
,
op
);
c_assign
(
comp
,
pns
->
nodes
[
0
],
ASSIGN_AUG_STORE
);
// lhs store for aug assign
}
else
if
(
kind
==
PN_expr_stmt_assign_list
)
{
int
rhs
=
MP_PARSE_NODE_STRUCT_NUM_NODES
(
pns1
)
-
1
;
...
...
@@ -1943,20 +1944,19 @@ void compile_comparison(compiler_t *comp, mp_parse_node_struct_t *pns) {
EMIT
(
dup_top
);
EMIT
(
rot_three
);
}
if
(
MP_PARSE_NODE_IS_TOKEN_KIND
(
pns
->
nodes
[
i
],
MP_TOKEN_OP_LESS
))
{
EMIT_ARG
(
binary_op
,
RT_COMPARE_OP_LESS
);
}
else
if
(
MP_PARSE_NODE_IS_TOKEN_KIND
(
pns
->
nodes
[
i
],
MP_TOKEN_OP_MORE
))
{
EMIT_ARG
(
binary_op
,
RT_COMPARE_OP_MORE
);
}
else
if
(
MP_PARSE_NODE_IS_TOKEN_KIND
(
pns
->
nodes
[
i
],
MP_TOKEN_OP_DBL_EQUAL
))
{
EMIT_ARG
(
binary_op
,
RT_COMPARE_OP_EQUAL
);
}
else
if
(
MP_PARSE_NODE_IS_TOKEN_KIND
(
pns
->
nodes
[
i
],
MP_TOKEN_OP_LESS_EQUAL
))
{
EMIT_ARG
(
binary_op
,
RT_COMPARE_OP_LESS_EQUAL
);
}
else
if
(
MP_PARSE_NODE_IS_TOKEN_KIND
(
pns
->
nodes
[
i
],
MP_TOKEN_OP_MORE_EQUAL
))
{
EMIT_ARG
(
binary_op
,
RT_COMPARE_OP_MORE_EQUAL
);
}
else
if
(
MP_PARSE_NODE_IS_TOKEN_KIND
(
pns
->
nodes
[
i
],
MP_TOKEN_OP_NOT_EQUAL
))
{
EMIT_ARG
(
binary_op
,
RT_COMPARE_OP_NOT_EQUAL
);
}
else
if
(
MP_PARSE_NODE_IS_TOKEN_KIND
(
pns
->
nodes
[
i
],
MP_TOKEN_KW_IN
))
{
EMIT_ARG
(
binary_op
,
RT_COMPARE_OP_IN
);
if
(
MP_PARSE_NODE_IS_TOKEN
(
pns
->
nodes
[
i
]))
{
rt_binary_op_t
op
;
switch
(
MP_PARSE_NODE_LEAF_ARG
(
pns
->
nodes
[
i
]))
{
case
MP_TOKEN_OP_LESS
:
op
=
RT_COMPARE_OP_LESS
;
break
;
case
MP_TOKEN_OP_MORE
:
op
=
RT_COMPARE_OP_MORE
;
break
;
case
MP_TOKEN_OP_DBL_EQUAL
:
op
=
RT_COMPARE_OP_EQUAL
;
break
;
case
MP_TOKEN_OP_LESS_EQUAL
:
op
=
RT_COMPARE_OP_LESS_EQUAL
;
break
;
case
MP_TOKEN_OP_MORE_EQUAL
:
op
=
RT_COMPARE_OP_MORE_EQUAL
;
break
;
case
MP_TOKEN_OP_NOT_EQUAL
:
op
=
RT_COMPARE_OP_NOT_EQUAL
;
break
;
case
MP_TOKEN_KW_IN
:
op
=
RT_COMPARE_OP_IN
;
break
;
default:
assert
(
0
);
op
=
RT_COMPARE_OP_LESS
;
// shouldn't happen
}
EMIT_ARG
(
binary_op
,
op
);
}
else
if
(
MP_PARSE_NODE_IS_STRUCT
(
pns
->
nodes
[
i
]))
{
mp_parse_node_struct_t
*
pns2
=
(
mp_parse_node_struct_t
*
)
pns
->
nodes
[
i
];
int
kind
=
MP_PARSE_NODE_STRUCT_KIND
(
pns2
);
...
...
Write
Preview
Supports
Markdown
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