Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
TASTE
uPython-mirror
Commits
02f8941b
Commit
02f8941b
authored
Dec 12, 2013
by
Damien
Browse files
py: reduce use of emit_verbatim calls to minimum.
parent
9ecbcfff
Changes
1
Hide whitespace changes
Inline
Side-by-side
py/compile.c
View file @
02f8941b
...
...
@@ -282,21 +282,61 @@ static bool cpython_c_tuple_is_const(py_parse_node_t pn) {
return
true
;
}
static
void
cpython_c_tuple_emit_const
(
compiler_t
*
comp
,
py_parse_node_t
pn
)
{
static
void
cpython_c_print_quoted_str
(
vstr_t
*
vstr
,
qstr
qstr
,
bool
bytes
)
{
const
char
*
str
=
qstr_str
(
qstr
);
int
len
=
strlen
(
str
);
bool
has_single_quote
=
false
;
bool
has_double_quote
=
false
;
for
(
int
i
=
0
;
i
<
len
;
i
++
)
{
if
(
str
[
i
]
==
'\''
)
{
has_single_quote
=
true
;
}
else
if
(
str
[
i
]
==
'"'
)
{
has_double_quote
=
true
;
}
}
if
(
bytes
)
{
vstr_printf
(
vstr
,
"b"
);
}
bool
quote_single
=
false
;
if
(
has_single_quote
&&
!
has_double_quote
)
{
vstr_printf
(
vstr
,
"
\"
"
);
}
else
{
quote_single
=
true
;
vstr_printf
(
vstr
,
"'"
);
}
for
(
int
i
=
0
;
i
<
len
;
i
++
)
{
if
(
str
[
i
]
==
'\n'
)
{
vstr_printf
(
vstr
,
"
\\
n"
);
}
else
if
(
str
[
i
]
==
'\\'
)
{
vstr_printf
(
vstr
,
"
\\\\
"
);
}
else
if
(
str
[
i
]
==
'\''
&&
quote_single
)
{
vstr_printf
(
vstr
,
"
\\
'"
);
}
else
{
vstr_printf
(
vstr
,
"%c"
,
str
[
i
]);
}
}
if
(
has_single_quote
&&
!
has_double_quote
)
{
vstr_printf
(
vstr
,
"
\"
"
);
}
else
{
vstr_printf
(
vstr
,
"'"
);
}
}
static
void
cpython_c_tuple_emit_const
(
compiler_t
*
comp
,
py_parse_node_t
pn
,
vstr_t
*
vstr
)
{
assert
(
PY_PARSE_NODE_IS_LEAF
(
pn
));
int
arg
=
PY_PARSE_NODE_LEAF_ARG
(
pn
);
switch
(
PY_PARSE_NODE_LEAF_KIND
(
pn
))
{
case
PY_PARSE_NODE_ID
:
assert
(
0
);
case
PY_PARSE_NODE_SMALL_INT
:
EMIT
(
load_const_verbatim_int
,
arg
);
break
;
case
PY_PARSE_NODE_INTEGER
:
EMIT
(
load_const_verbatim_str
,
qstr_str
(
arg
));
break
;
case
PY_PARSE_NODE_DECIMAL
:
EMIT
(
load_const_verbatim_str
,
qstr_str
(
arg
));
break
;
case
PY_PARSE_NODE_STRING
:
EMIT
(
load_const_verbatim
_quoted_str
,
arg
,
false
);
break
;
case
PY_PARSE_NODE_BYTES
:
EMIT
(
load_const_verbatim
_quoted_str
,
arg
,
true
);
break
;
case
PY_PARSE_NODE_SMALL_INT
:
vstr_printf
(
vstr
,
"%d"
,
arg
);
break
;
case
PY_PARSE_NODE_INTEGER
:
vstr_printf
(
vstr
,
"%s"
,
qstr_str
(
arg
));
break
;
case
PY_PARSE_NODE_DECIMAL
:
vstr_printf
(
vstr
,
"%s"
,
qstr_str
(
arg
));
break
;
case
PY_PARSE_NODE_STRING
:
cpython_c_print
_quoted_str
(
vstr
,
arg
,
false
);
break
;
case
PY_PARSE_NODE_BYTES
:
cpython_c_print
_quoted_str
(
vstr
,
arg
,
true
);
break
;
case
PY_PARSE_NODE_TOKEN
:
switch
(
arg
)
{
case
PY_TOKEN_KW_FALSE
:
EMIT
(
load_const_verbatim_
str
,
"False"
);
break
;
case
PY_TOKEN_KW_NONE
:
EMIT
(
load_const_verbatim_
str
,
"None"
);
break
;
case
PY_TOKEN_KW_TRUE
:
EMIT
(
load_const_verbatim_
str
,
"True"
);
break
;
case
PY_TOKEN_KW_FALSE
:
vstr_printf
(
v
str
,
"False"
);
break
;
case
PY_TOKEN_KW_NONE
:
vstr_printf
(
v
str
,
"None"
);
break
;
case
PY_TOKEN_KW_TRUE
:
vstr_printf
(
v
str
,
"True"
);
break
;
default:
assert
(
0
);
}
break
;
...
...
@@ -325,25 +365,28 @@ static void cpython_c_tuple(compiler_t *comp, py_parse_node_t pn, py_parse_node_
}
if
(
total
>
0
&&
is_const
)
{
bool
need_comma
=
false
;
EMIT
(
load_const_verbatim_start
);
EMIT
(
load_const_verbatim_
str
,
"("
);
vstr_t
*
vstr
=
vstr_new
(
);
vstr_printf
(
v
str
,
"("
);
if
(
!
PY_PARSE_NODE_IS_NULL
(
pn
))
{
cpython_c_tuple_emit_const
(
comp
,
pn
);
cpython_c_tuple_emit_const
(
comp
,
pn
,
vstr
);
need_comma
=
true
;
}
for
(
int
i
=
0
;
i
<
n
;
i
++
)
{
if
(
need_comma
)
{
EMIT
(
load_const_verbatim_
str
,
", "
);
vstr_printf
(
v
str
,
", "
);
}
cpython_c_tuple_emit_const
(
comp
,
pns_list
->
nodes
[
i
]);
cpython_c_tuple_emit_const
(
comp
,
pns_list
->
nodes
[
i
]
,
vstr
);
need_comma
=
true
;
}
if
(
total
==
1
)
{
EMIT
(
load_const_verbatim_
str
,
",)"
);
vstr_printf
(
v
str
,
",)"
);
}
else
{
EMIT
(
load_const_verbatim_
str
,
")"
);
vstr_printf
(
v
str
,
")"
);
}
EMIT
(
load_const_verbatim_start
);
EMIT
(
load_const_verbatim_str
,
vstr_str
(
vstr
));
EMIT
(
load_const_verbatim_end
);
vstr_free
(
vstr
);
}
else
{
if
(
!
PY_PARSE_NODE_IS_NULL
(
pn
))
{
compile_node
(
comp
,
pn
);
...
...
@@ -1198,24 +1241,29 @@ void compile_import_from(compiler_t *comp, py_parse_node_struct_t *pns) {
py_parse_node_t
*
pn_nodes
;
int
n
=
list_get
(
&
pns
->
nodes
[
1
],
PN_import_as_names
,
&
pn_nodes
);
#if MICROPY_EMIT_CPYTHON
EMIT
(
load_const_verbatim_start
);
EMIT
(
load_const_verbatim_str
,
"("
);
for
(
int
i
=
0
;
i
<
n
;
i
++
)
{
assert
(
PY_PARSE_NODE_IS_STRUCT_KIND
(
pn_nodes
[
i
],
PN_import_as_name
));
py_parse_node_struct_t
*
pns3
=
(
py_parse_node_struct_t
*
)
pn_nodes
[
i
];
qstr
id2
=
PY_PARSE_NODE_LEAF_ARG
(
pns3
->
nodes
[
0
]);
// should be id
if
(
i
>
0
)
{
EMIT
(
load_const_verbatim_str
,
", "
);
{
vstr_t
*
vstr
=
vstr_new
();
vstr_printf
(
vstr
,
"("
);
for
(
int
i
=
0
;
i
<
n
;
i
++
)
{
assert
(
PY_PARSE_NODE_IS_STRUCT_KIND
(
pn_nodes
[
i
],
PN_import_as_name
));
py_parse_node_struct_t
*
pns3
=
(
py_parse_node_struct_t
*
)
pn_nodes
[
i
];
qstr
id2
=
PY_PARSE_NODE_LEAF_ARG
(
pns3
->
nodes
[
0
]);
// should be id
if
(
i
>
0
)
{
vstr_printf
(
vstr
,
", "
);
}
vstr_printf
(
vstr
,
"'"
);
vstr_printf
(
vstr
,
qstr_str
(
id2
));
vstr_printf
(
vstr
,
"'"
);
}
EMIT
(
load_const_verbatim_str
,
"'"
);
EMIT
(
load_const_verbatim_str
,
qstr_str
(
id2
));
EMIT
(
load_const_verbatim_str
,
"'"
);
}
if
(
n
==
1
)
{
EMIT
(
load_const_verbatim_str
,
","
);
if
(
n
==
1
)
{
vstr_printf
(
vstr
,
","
);
}
vstr_printf
(
vstr
,
")"
);
EMIT
(
load_const_verbatim_start
);
EMIT
(
load_const_verbatim_str
,
vstr_str
(
vstr
));
EMIT
(
load_const_verbatim_end
);
vstr_free
(
vstr
);
}
EMIT
(
load_const_verbatim_str
,
")"
);
EMIT
(
load_const_verbatim_end
);
#else
for
(
int
i
=
0
;
i
<
n
;
i
++
)
{
assert
(
PY_PARSE_NODE_IS_STRUCT_KIND
(
pn_nodes
[
i
],
PN_import_as_name
));
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new 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