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
40f3c026
Commit
40f3c026
authored
Jul 03, 2014
by
Damien George
Browse files
Rename machine_(u)int_t to mp_(u)int_t.
See discussion in issue #50.
parent
065aba58
Changes
99
Hide whitespace changes
Inline
Side-by-side
bare-arm/mpconfigport.h
View file @
40f3c026
...
...
@@ -37,8 +37,8 @@
#define UINT_FMT "%lu"
#define INT_FMT "%ld"
typedef
int32_t
m
achine
_int_t
;
// must be pointer size
typedef
uint32_t
m
achine
_uint_t
;
// must be pointer size
typedef
int32_t
m
p
_int_t
;
// must be pointer size
typedef
uint32_t
m
p
_uint_t
;
// must be pointer size
typedef
void
*
machine_ptr_t
;
// must be of pointer size
typedef
const
void
*
machine_const_ptr_t
;
// must be of pointer size
...
...
py/asmthumb.c
View file @
40f3c026
...
...
@@ -133,7 +133,7 @@ uint asm_thumb_get_code_size(asm_thumb_t *as) {
void
*
asm_thumb_get_code
(
asm_thumb_t
*
as
)
{
// need to set low bit to indicate that it's thumb code
return
(
void
*
)(((
m
achine
_uint_t
)
as
->
code_base
)
|
1
);
return
(
void
*
)(((
m
p
_uint_t
)
as
->
code_base
)
|
1
);
}
/*
...
...
@@ -378,7 +378,7 @@ void asm_thumb_bcc_n(asm_thumb_t *as, int cond, uint label) {
}
}
void
asm_thumb_mov_reg_i32
(
asm_thumb_t
*
as
,
uint
reg_dest
,
m
achine
_uint_t
i32
)
{
void
asm_thumb_mov_reg_i32
(
asm_thumb_t
*
as
,
uint
reg_dest
,
m
p
_uint_t
i32
)
{
// movw, movt does it in 8 bytes
// ldr [pc, #], dw does it in 6 bytes, but we might not reach to end of code for dw
...
...
@@ -499,7 +499,7 @@ void asm_thumb_bl_ind(asm_thumb_t *as, void *fun_ptr, uint fun_id, uint reg_temp
if
(
0
)
{
// load ptr to function into register using immediate, then branch
// not relocatable
asm_thumb_mov_reg_i32
(
as
,
reg_temp
,
(
m
achine
_uint_t
)
fun_ptr
);
asm_thumb_mov_reg_i32
(
as
,
reg_temp
,
(
m
p
_uint_t
)
fun_ptr
);
asm_thumb_op16
(
as
,
OP_BLX
(
reg_temp
));
}
else
if
(
1
)
{
asm_thumb_op16
(
as
,
OP_FORMAT_9_10
(
ASM_THUMB_FORMAT_9_LDR
|
ASM_THUMB_FORMAT_9_WORD_TRANSFER
,
reg_temp
,
REG_R7
,
fun_id
));
...
...
py/asmthumb.h
View file @
40f3c026
...
...
@@ -185,7 +185,7 @@ void asm_thumb_ite_ge(asm_thumb_t *as);
void
asm_thumb_b_n
(
asm_thumb_t
*
as
,
uint
label
);
void
asm_thumb_bcc_n
(
asm_thumb_t
*
as
,
int
cond
,
uint
label
);
void
asm_thumb_mov_reg_i32
(
asm_thumb_t
*
as
,
uint
reg_dest
,
m
achine
_uint_t
i32_src
);
// convenience
void
asm_thumb_mov_reg_i32
(
asm_thumb_t
*
as
,
uint
reg_dest
,
m
p
_uint_t
i32_src
);
// convenience
void
asm_thumb_mov_reg_i32_optimised
(
asm_thumb_t
*
as
,
uint
reg_dest
,
int
i32_src
);
// convenience
void
asm_thumb_mov_reg_i32_aligned
(
asm_thumb_t
*
as
,
uint
reg_dest
,
int
i32
);
// convenience
void
asm_thumb_mov_local_reg
(
asm_thumb_t
*
as
,
int
local_num_dest
,
uint
rlo_src
);
// convenience
...
...
py/bc.h
View file @
40f3c026
...
...
@@ -55,6 +55,6 @@ void mp_bytecode_print(const void *descr, const byte *code, int len);
void
mp_bytecode_print2
(
const
byte
*
code
,
int
len
);
// Helper macros to access pointer with least significant bit holding a flag
#define MP_TAGPTR_PTR(x) ((void*)((m
achine
_uint_t)(x) & ~((m
achine
_uint_t)1)))
#define MP_TAGPTR_TAG(x) ((m
achine
_uint_t)(x) & 1)
#define MP_TAGPTR_MAKE(ptr, tag) ((void*)((m
achine
_uint_t)(ptr) | tag))
#define MP_TAGPTR_PTR(x) ((void*)((m
p
_uint_t)(x) & ~((m
p
_uint_t)1)))
#define MP_TAGPTR_TAG(x) ((m
p
_uint_t)(x) & 1)
#define MP_TAGPTR_MAKE(ptr, tag) ((void*)((m
p
_uint_t)(ptr) | tag))
py/binary.c
View file @
40f3c026
...
...
@@ -88,7 +88,7 @@ int mp_binary_get_size(char struct_type, char val_type, uint *palign) {
}
mp_obj_t
mp_binary_get_val_array
(
char
typecode
,
void
*
p
,
int
index
)
{
m
achine
_int_t
val
=
0
;
m
p
_int_t
val
=
0
;
switch
(
typecode
)
{
case
'b'
:
val
=
((
int8_t
*
)
p
)[
index
];
...
...
@@ -125,7 +125,7 @@ mp_obj_t mp_binary_get_val_array(char typecode, void *p, int index) {
return
MP_OBJ_NEW_SMALL_INT
(
val
);
}
m
achine
_int_t
mp_binary_get_int
(
uint
size
,
bool
is_signed
,
bool
big_endian
,
byte
*
p
)
{
m
p
_int_t
mp_binary_get_int
(
uint
size
,
bool
is_signed
,
bool
big_endian
,
byte
*
p
)
{
int
delta
;
if
(
!
big_endian
)
{
delta
=
-
1
;
...
...
@@ -134,7 +134,7 @@ machine_int_t mp_binary_get_int(uint size, bool is_signed, bool big_endian, byte
delta
=
1
;
}
m
achine
_int_t
val
=
0
;
m
p
_int_t
val
=
0
;
if
(
is_signed
&&
*
p
&
0x80
)
{
val
=
-
1
;
}
...
...
@@ -155,7 +155,7 @@ mp_obj_t mp_binary_get_val(char struct_type, char val_type, byte **ptr) {
int
size
=
mp_binary_get_size
(
struct_type
,
val_type
,
&
align
);
if
(
struct_type
==
'@'
)
{
// Make pointer aligned
p
=
(
byte
*
)(((
m
achine
_uint_t
)
p
+
align
-
1
)
&
~
((
m
achine
_uint_t
)
align
-
1
));
p
=
(
byte
*
)(((
m
p
_uint_t
)
p
+
align
-
1
)
&
~
((
m
p
_uint_t
)
align
-
1
));
#if MP_ENDIANNESS_LITTLE
struct_type
=
'<'
;
#else
...
...
@@ -164,7 +164,7 @@ mp_obj_t mp_binary_get_val(char struct_type, char val_type, byte **ptr) {
}
*
ptr
=
p
+
size
;
m
achine
_int_t
val
=
mp_binary_get_int
(
size
,
is_signed
(
val_type
),
(
struct_type
==
'>'
),
p
);
m
p
_int_t
val
=
mp_binary_get_int
(
size
,
is_signed
(
val_type
),
(
struct_type
==
'>'
),
p
);
if
(
val_type
==
'O'
)
{
return
(
mp_obj_t
)
val
;
...
...
@@ -184,7 +184,7 @@ void mp_binary_set_val(char struct_type, char val_type, mp_obj_t val_in, byte **
int
size
=
mp_binary_get_size
(
struct_type
,
val_type
,
&
align
);
if
(
struct_type
==
'@'
)
{
// Make pointer aligned
p
=
(
byte
*
)(((
m
achine
_uint_t
)
p
+
align
-
1
)
&
~
((
m
achine
_uint_t
)
align
-
1
));
p
=
(
byte
*
)(((
m
p
_uint_t
)
p
+
align
-
1
)
&
~
((
m
p
_uint_t
)
align
-
1
));
#if MP_ENDIANNESS_LITTLE
struct_type
=
'<'
;
#else
...
...
@@ -196,7 +196,7 @@ void mp_binary_set_val(char struct_type, char val_type, mp_obj_t val_in, byte **
#if MP_ENDIANNESS_BIG
#error Not implemented
#endif
m
achine
_int_t
val
;
m
p
_int_t
val
;
byte
*
in
=
(
byte
*
)
&
val
;
switch
(
val_type
)
{
case
'O'
:
...
...
@@ -239,7 +239,7 @@ void mp_binary_set_val_array(char typecode, void *p, int index, mp_obj_t val_in)
}
}
void
mp_binary_set_val_array_from_int
(
char
typecode
,
void
*
p
,
int
index
,
m
achine
_int_t
val
)
{
void
mp_binary_set_val_array_from_int
(
char
typecode
,
void
*
p
,
int
index
,
m
p
_int_t
val
)
{
switch
(
typecode
)
{
case
'b'
:
((
int8_t
*
)
p
)[
index
]
=
val
;
...
...
py/binary.h
View file @
40f3c026
...
...
@@ -31,7 +31,7 @@
int
mp_binary_get_size
(
char
struct_type
,
char
val_type
,
uint
*
palign
);
mp_obj_t
mp_binary_get_val_array
(
char
typecode
,
void
*
p
,
int
index
);
void
mp_binary_set_val_array
(
char
typecode
,
void
*
p
,
int
index
,
mp_obj_t
val_in
);
void
mp_binary_set_val_array_from_int
(
char
typecode
,
void
*
p
,
int
index
,
m
achine
_int_t
val
);
void
mp_binary_set_val_array_from_int
(
char
typecode
,
void
*
p
,
int
index
,
m
p
_int_t
val
);
mp_obj_t
mp_binary_get_val
(
char
struct_type
,
char
val_type
,
byte
**
ptr
);
void
mp_binary_set_val
(
char
struct_type
,
char
val_type
,
mp_obj_t
val_in
,
byte
**
ptr
);
m
achine
_int_t
mp_binary_get_int
(
uint
size
,
bool
is_signed
,
bool
big_endian
,
byte
*
p
);
m
p
_int_t
mp_binary_get_int
(
uint
size
,
bool
is_signed
,
bool
big_endian
,
byte
*
p
);
py/builtin.c
View file @
40f3c026
...
...
@@ -99,7 +99,7 @@ MP_DEFINE_CONST_FUN_OBJ_1(mp_builtin___repl_print___obj, mp_builtin___repl_print
mp_obj_t
mp_builtin_abs
(
mp_obj_t
o_in
)
{
if
(
MP_OBJ_IS_SMALL_INT
(
o_in
))
{
mp_
small_
int_t
val
=
MP_OBJ_SMALL_INT_VALUE
(
o_in
);
mp_int_t
val
=
MP_OBJ_SMALL_INT_VALUE
(
o_in
);
if
(
val
<
0
)
{
val
=
-
val
;
}
...
...
@@ -173,7 +173,7 @@ MP_DEFINE_CONST_FUN_OBJ_1(mp_builtin_callable_obj, mp_builtin_callable);
STATIC
mp_obj_t
mp_builtin_chr
(
mp_obj_t
o_in
)
{
#if MICROPY_PY_BUILTINS_STR_UNICODE
m
achine
_int_t
c
=
mp_obj_get_int
(
o_in
);
m
p
_int_t
c
=
mp_obj_get_int
(
o_in
);
char
str
[
4
];
int
len
=
0
;
if
(
c
<
0x80
)
{
...
...
@@ -198,7 +198,7 @@ STATIC mp_obj_t mp_builtin_chr(mp_obj_t o_in) {
}
return
mp_obj_new_str
(
str
,
len
,
true
);
#else
m
achine
_int_t
ord
=
mp_obj_get_int
(
o_in
);
m
p
_int_t
ord
=
mp_obj_get_int
(
o_in
);
if
(
0
<=
ord
&&
ord
<=
0x10ffff
)
{
char
str
[
1
]
=
{
ord
};
return
mp_obj_new_str
(
str
,
1
,
true
);
...
...
@@ -250,8 +250,8 @@ MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mp_builtin_dir_obj, 0, 1, mp_builtin_dir);
STATIC
mp_obj_t
mp_builtin_divmod
(
mp_obj_t
o1_in
,
mp_obj_t
o2_in
)
{
if
(
MP_OBJ_IS_SMALL_INT
(
o1_in
)
&&
MP_OBJ_IS_SMALL_INT
(
o2_in
))
{
mp_
small_
int_t
i1
=
MP_OBJ_SMALL_INT_VALUE
(
o1_in
);
mp_
small_
int_t
i2
=
MP_OBJ_SMALL_INT_VALUE
(
o2_in
);
mp_int_t
i1
=
MP_OBJ_SMALL_INT_VALUE
(
o1_in
);
mp_int_t
i2
=
MP_OBJ_SMALL_INT_VALUE
(
o2_in
);
mp_obj_t
args
[
2
];
args
[
0
]
=
MP_OBJ_NEW_SMALL_INT
(
i1
/
i2
);
args
[
1
]
=
MP_OBJ_NEW_SMALL_INT
(
i1
%
i2
);
...
...
@@ -372,11 +372,11 @@ STATIC mp_obj_t mp_builtin_ord(mp_obj_t o_in) {
uint
len
;
const
char
*
str
=
mp_obj_str_get_data
(
o_in
,
&
len
);
#if MICROPY_PY_BUILTINS_STR_UNICODE
m
achine
_uint_t
charlen
=
unichar_charlen
(
str
,
len
);
m
p
_uint_t
charlen
=
unichar_charlen
(
str
,
len
);
if
(
charlen
==
1
)
{
if
(
MP_OBJ_IS_STR
(
o_in
)
&&
UTF8_IS_NONASCII
(
*
str
))
{
m
achine
_int_t
ord
=
*
str
++
&
0x7F
;
for
(
m
achine
_int_t
mask
=
0x40
;
ord
&
mask
;
mask
>>=
1
)
{
m
p
_int_t
ord
=
*
str
++
&
0x7F
;
for
(
m
p
_int_t
mask
=
0x40
;
ord
&
mask
;
mask
>>=
1
)
{
ord
&=
~
mask
;
}
while
(
UTF8_IS_CONT
(
*
str
))
{
...
...
@@ -478,7 +478,7 @@ STATIC mp_obj_t mp_builtin_sorted(uint n_args, const mp_obj_t *args, mp_map_t *k
MP_DEFINE_CONST_FUN_OBJ_KW
(
mp_builtin_sorted_obj
,
1
,
mp_builtin_sorted
);
STATIC
mp_obj_t
mp_builtin_id
(
mp_obj_t
o_in
)
{
return
mp_obj_new_int
((
m
achine
_int_t
)
o_in
);
return
mp_obj_new_int
((
m
p
_int_t
)
o_in
);
}
MP_DEFINE_CONST_FUN_OBJ_1
(
mp_builtin_id_obj
,
mp_builtin_id
);
...
...
py/compile.c
View file @
40f3c026
...
...
@@ -95,7 +95,7 @@ typedef struct _compiler_t {
STATIC
void
compile_syntax_error
(
compiler_t
*
comp
,
mp_parse_node_t
pn
,
const
char
*
msg
)
{
// TODO store the error message to a variable in compiler_t instead of printing it
if
(
MP_PARSE_NODE_IS_STRUCT
(
pn
))
{
printf
(
" File
\"
%s
\"
, line "
UINT_FMT
"
\n
"
,
qstr_str
(
comp
->
source_file
),
(
m
achine
_uint_t
)((
mp_parse_node_struct_t
*
)
pn
)
->
source_line
);
printf
(
" File
\"
%s
\"
, line "
UINT_FMT
"
\n
"
,
qstr_str
(
comp
->
source_file
),
(
m
p
_uint_t
)((
mp_parse_node_struct_t
*
)
pn
)
->
source_line
);
}
else
{
printf
(
" File
\"
%s
\"\n
"
,
qstr_str
(
comp
->
source_file
));
}
...
...
@@ -158,7 +158,7 @@ STATIC mp_parse_node_t fold_constants(compiler_t *comp, mp_parse_node_t pn, mp_m
compile_syntax_error
(
comp
,
(
mp_parse_node_t
)
pns
,
"constant must be an integer"
);
break
;
}
m
achine
_int_t
value
=
MP_PARSE_NODE_LEAF_SMALL_INT
(
pn_value
);
m
p
_int_t
value
=
MP_PARSE_NODE_LEAF_SMALL_INT
(
pn_value
);
// store the value in the table of dynamic constants
mp_map_elem_t
*
elem
=
mp_map_lookup
(
consts
,
MP_OBJ_NEW_QSTR
(
id_qstr
),
MP_MAP_LOOKUP_ADD_IF_NOT_FOUND
);
...
...
@@ -200,8 +200,8 @@ STATIC mp_parse_node_t fold_constants(compiler_t *comp, mp_parse_node_t pn, mp_m
case
PN_expr
:
if
(
n
==
2
&&
MP_PARSE_NODE_IS_SMALL_INT
(
pns
->
nodes
[
0
])
&&
MP_PARSE_NODE_IS_SMALL_INT
(
pns
->
nodes
[
1
]))
{
// int | int
m
achine
_int_t
arg0
=
MP_PARSE_NODE_LEAF_SMALL_INT
(
pns
->
nodes
[
0
]);
m
achine
_int_t
arg1
=
MP_PARSE_NODE_LEAF_SMALL_INT
(
pns
->
nodes
[
1
]);
m
p
_int_t
arg0
=
MP_PARSE_NODE_LEAF_SMALL_INT
(
pns
->
nodes
[
0
]);
m
p
_int_t
arg1
=
MP_PARSE_NODE_LEAF_SMALL_INT
(
pns
->
nodes
[
1
]);
pn
=
mp_parse_node_new_leaf
(
MP_PARSE_NODE_SMALL_INT
,
arg0
|
arg1
);
}
break
;
...
...
@@ -209,16 +209,16 @@ STATIC mp_parse_node_t fold_constants(compiler_t *comp, mp_parse_node_t pn, mp_m
case
PN_and_expr
:
if
(
n
==
2
&&
MP_PARSE_NODE_IS_SMALL_INT
(
pns
->
nodes
[
0
])
&&
MP_PARSE_NODE_IS_SMALL_INT
(
pns
->
nodes
[
1
]))
{
// int & int
m
achine
_int_t
arg0
=
MP_PARSE_NODE_LEAF_SMALL_INT
(
pns
->
nodes
[
0
]);
m
achine
_int_t
arg1
=
MP_PARSE_NODE_LEAF_SMALL_INT
(
pns
->
nodes
[
1
]);
m
p
_int_t
arg0
=
MP_PARSE_NODE_LEAF_SMALL_INT
(
pns
->
nodes
[
0
]);
m
p
_int_t
arg1
=
MP_PARSE_NODE_LEAF_SMALL_INT
(
pns
->
nodes
[
1
]);
pn
=
mp_parse_node_new_leaf
(
MP_PARSE_NODE_SMALL_INT
,
arg0
&
arg1
);
}
break
;
case
PN_shift_expr
:
if
(
n
==
3
&&
MP_PARSE_NODE_IS_SMALL_INT
(
pns
->
nodes
[
0
])
&&
MP_PARSE_NODE_IS_SMALL_INT
(
pns
->
nodes
[
2
]))
{
m
achine
_int_t
arg0
=
MP_PARSE_NODE_LEAF_SMALL_INT
(
pns
->
nodes
[
0
]);
m
achine
_int_t
arg1
=
MP_PARSE_NODE_LEAF_SMALL_INT
(
pns
->
nodes
[
2
]);
m
p
_int_t
arg0
=
MP_PARSE_NODE_LEAF_SMALL_INT
(
pns
->
nodes
[
0
]);
m
p
_int_t
arg1
=
MP_PARSE_NODE_LEAF_SMALL_INT
(
pns
->
nodes
[
2
]);
if
(
MP_PARSE_NODE_IS_TOKEN_KIND
(
pns
->
nodes
[
1
],
MP_TOKEN_OP_DBL_LESS
))
{
// int << int
if
(
!
(
arg1
>=
BITS_PER_WORD
||
arg0
>
(
MP_SMALL_INT_MAX
>>
arg1
)
||
arg0
<
(
MP_SMALL_INT_MIN
>>
arg1
)))
{
...
...
@@ -235,10 +235,10 @@ STATIC mp_parse_node_t fold_constants(compiler_t *comp, mp_parse_node_t pn, mp_m
break
;
case
PN_arith_expr
:
// overflow checking here relies on SMALL_INT being strictly smaller than m
achine
_int_t
// overflow checking here relies on SMALL_INT being strictly smaller than m
p
_int_t
if
(
n
==
3
&&
MP_PARSE_NODE_IS_SMALL_INT
(
pns
->
nodes
[
0
])
&&
MP_PARSE_NODE_IS_SMALL_INT
(
pns
->
nodes
[
2
]))
{
m
achine
_int_t
arg0
=
MP_PARSE_NODE_LEAF_SMALL_INT
(
pns
->
nodes
[
0
]);
m
achine
_int_t
arg1
=
MP_PARSE_NODE_LEAF_SMALL_INT
(
pns
->
nodes
[
2
]);
m
p
_int_t
arg0
=
MP_PARSE_NODE_LEAF_SMALL_INT
(
pns
->
nodes
[
0
]);
m
p
_int_t
arg1
=
MP_PARSE_NODE_LEAF_SMALL_INT
(
pns
->
nodes
[
2
]);
if
(
MP_PARSE_NODE_IS_TOKEN_KIND
(
pns
->
nodes
[
1
],
MP_TOKEN_OP_PLUS
))
{
// int + int
arg0
+=
arg1
;
...
...
@@ -258,8 +258,8 @@ STATIC mp_parse_node_t fold_constants(compiler_t *comp, mp_parse_node_t pn, mp_m
case
PN_term
:
if
(
n
==
3
&&
MP_PARSE_NODE_IS_SMALL_INT
(
pns
->
nodes
[
0
])
&&
MP_PARSE_NODE_IS_SMALL_INT
(
pns
->
nodes
[
2
]))
{
m
achine
_int_t
arg0
=
MP_PARSE_NODE_LEAF_SMALL_INT
(
pns
->
nodes
[
0
]);
m
achine
_int_t
arg1
=
MP_PARSE_NODE_LEAF_SMALL_INT
(
pns
->
nodes
[
2
]);
m
p
_int_t
arg0
=
MP_PARSE_NODE_LEAF_SMALL_INT
(
pns
->
nodes
[
0
]);
m
p
_int_t
arg1
=
MP_PARSE_NODE_LEAF_SMALL_INT
(
pns
->
nodes
[
2
]);
if
(
MP_PARSE_NODE_IS_TOKEN_KIND
(
pns
->
nodes
[
1
],
MP_TOKEN_OP_STAR
))
{
// int * int
if
(
!
mp_small_int_mul_overflow
(
arg0
,
arg1
))
{
...
...
@@ -288,7 +288,7 @@ STATIC mp_parse_node_t fold_constants(compiler_t *comp, mp_parse_node_t pn, mp_m
case
PN_factor_2
:
if
(
MP_PARSE_NODE_IS_SMALL_INT
(
pns
->
nodes
[
1
]))
{
m
achine
_int_t
arg
=
MP_PARSE_NODE_LEAF_SMALL_INT
(
pns
->
nodes
[
1
]);
m
p
_int_t
arg
=
MP_PARSE_NODE_LEAF_SMALL_INT
(
pns
->
nodes
[
1
]);
if
(
MP_PARSE_NODE_IS_TOKEN_KIND
(
pns
->
nodes
[
0
],
MP_TOKEN_OP_PLUS
))
{
// +int
pn
=
mp_parse_node_new_leaf
(
MP_PARSE_NODE_SMALL_INT
,
arg
);
...
...
@@ -336,7 +336,7 @@ STATIC mp_parse_node_t fold_constants(compiler_t *comp, mp_parse_node_t pn, mp_m
mp_obj_t
dest
[
2
];
mp_load_method_maybe
(
elem
->
value
,
q_attr
,
dest
);
if
(
MP_OBJ_IS_SMALL_INT
(
dest
[
0
])
&&
dest
[
1
]
==
NULL
)
{
m
achine
_int_t
val
=
MP_OBJ_SMALL_INT_VALUE
(
dest
[
0
]);
m
p
_int_t
val
=
MP_OBJ_SMALL_INT_VALUE
(
dest
[
0
]);
if
(
MP_SMALL_INT_FITS
(
val
))
{
pn
=
mp_parse_node_new_leaf
(
MP_PARSE_NODE_SMALL_INT
,
val
);
}
...
...
@@ -482,7 +482,7 @@ STATIC void cpython_c_print_quoted_str(vstr_t *vstr, const char *str, uint len,
STATIC
void
cpython_c_tuple_emit_const
(
compiler_t
*
comp
,
mp_parse_node_t
pn
,
vstr_t
*
vstr
)
{
if
(
MP_PARSE_NODE_IS_STRUCT_KIND
(
pn
,
PN_string
))
{
mp_parse_node_struct_t
*
pns
=
(
mp_parse_node_struct_t
*
)
pn
;
cpython_c_print_quoted_str
(
vstr
,
(
const
char
*
)
pns
->
nodes
[
0
],
(
m
achine
_uint_t
)
pns
->
nodes
[
1
],
false
);
cpython_c_print_quoted_str
(
vstr
,
(
const
char
*
)
pns
->
nodes
[
0
],
(
m
p
_uint_t
)
pns
->
nodes
[
1
],
false
);
return
;
}
...
...
@@ -2528,7 +2528,7 @@ void compile_atom_string(compiler_t *comp, mp_parse_node_struct_t *pns) {
mp_parse_node_struct_t
*
pns_string
=
(
mp_parse_node_struct_t
*
)
pns
->
nodes
[
i
];
assert
(
MP_PARSE_NODE_STRUCT_KIND
(
pns_string
)
==
PN_string
);
pn_kind
=
MP_PARSE_NODE_STRING
;
n_bytes
+=
(
m
achine
_uint_t
)
pns_string
->
nodes
[
1
];
n_bytes
+=
(
m
p
_uint_t
)
pns_string
->
nodes
[
1
];
}
if
(
i
==
0
)
{
string_kind
=
pn_kind
;
...
...
@@ -2549,8 +2549,8 @@ void compile_atom_string(compiler_t *comp, mp_parse_node_struct_t *pns) {
s_dest
+=
s_len
;
}
else
{
mp_parse_node_struct_t
*
pns_string
=
(
mp_parse_node_struct_t
*
)
pns
->
nodes
[
i
];
memcpy
(
s_dest
,
(
const
char
*
)
pns_string
->
nodes
[
0
],
(
m
achine
_uint_t
)
pns_string
->
nodes
[
1
]);
s_dest
+=
(
m
achine
_uint_t
)
pns_string
->
nodes
[
1
];
memcpy
(
s_dest
,
(
const
char
*
)
pns_string
->
nodes
[
0
],
(
m
p
_uint_t
)
pns_string
->
nodes
[
1
]);
s_dest
+=
(
m
p
_uint_t
)
pns_string
->
nodes
[
1
];
}
}
qstr
q
=
qstr_build_end
(
q_ptr
);
...
...
@@ -2858,10 +2858,10 @@ void compile_node(compiler_t *comp, mp_parse_node_t pn) {
if
(
MP_PARSE_NODE_IS_NULL
(
pn
))
{
// pass
}
else
if
(
MP_PARSE_NODE_IS_SMALL_INT
(
pn
))
{
m
achine
_int_t
arg
=
MP_PARSE_NODE_LEAF_SMALL_INT
(
pn
);
m
p
_int_t
arg
=
MP_PARSE_NODE_LEAF_SMALL_INT
(
pn
);
EMIT_ARG
(
load_const_small_int
,
arg
);
}
else
if
(
MP_PARSE_NODE_IS_LEAF
(
pn
))
{
m
achine
_uint_t
arg
=
MP_PARSE_NODE_LEAF_ARG
(
pn
);
m
p
_uint_t
arg
=
MP_PARSE_NODE_LEAF_ARG
(
pn
);
switch
(
MP_PARSE_NODE_LEAF_KIND
(
pn
))
{
case
MP_PARSE_NODE_ID
:
EMIT_ARG
(
load_id
,
arg
);
break
;
case
MP_PARSE_NODE_INTEGER
:
EMIT_ARG
(
load_const_int
,
arg
);
break
;
...
...
@@ -2883,7 +2883,7 @@ void compile_node(compiler_t *comp, mp_parse_node_t pn) {
mp_parse_node_struct_t
*
pns
=
(
mp_parse_node_struct_t
*
)
pn
;
EMIT_ARG
(
set_line_number
,
pns
->
source_line
);
if
(
MP_PARSE_NODE_STRUCT_KIND
(
pns
)
==
PN_string
)
{
EMIT_ARG
(
load_const_str
,
qstr_from_strn
((
const
char
*
)
pns
->
nodes
[
0
],
(
m
achine
_uint_t
)
pns
->
nodes
[
1
]),
false
);
EMIT_ARG
(
load_const_str
,
qstr_from_strn
((
const
char
*
)
pns
->
nodes
[
0
],
(
m
p
_uint_t
)
pns
->
nodes
[
1
]),
false
);
}
else
{
compile_function_t
f
=
compile_function
[
MP_PARSE_NODE_STRUCT_KIND
(
pns
)];
if
(
f
==
NULL
)
{
...
...
@@ -3337,7 +3337,7 @@ STATIC void compile_scope_inline_asm(compiler_t *comp, scope_t *scope, pass_kind
return
;
}
if
(
pass
>
MP_PASS_SCOPE
)
{
m
achine
_int_t
bytesize
=
MP_PARSE_NODE_LEAF_SMALL_INT
(
pn_arg
[
0
]);
m
p
_int_t
bytesize
=
MP_PARSE_NODE_LEAF_SMALL_INT
(
pn_arg
[
0
]);
for
(
uint
i
=
1
;
i
<
n_args
;
i
++
)
{
if
(
!
MP_PARSE_NODE_IS_SMALL_INT
(
pn_arg
[
i
]))
{
compile_syntax_error
(
comp
,
nodes
[
i
],
"inline assembler 'data' requires integer arguments"
);
...
...
py/emit.h
View file @
40f3c026
...
...
@@ -65,7 +65,7 @@ typedef struct _emit_method_table_t {
void
(
*
import_from
)(
emit_t
*
emit
,
qstr
qstr
);
void
(
*
import_star
)(
emit_t
*
emit
);
void
(
*
load_const_tok
)(
emit_t
*
emit
,
mp_token_kind_t
tok
);
void
(
*
load_const_small_int
)(
emit_t
*
emit
,
m
achine
_int_t
arg
);
void
(
*
load_const_small_int
)(
emit_t
*
emit
,
m
p
_int_t
arg
);
void
(
*
load_const_int
)(
emit_t
*
emit
,
qstr
qstr
);
void
(
*
load_const_dec
)(
emit_t
*
emit
,
qstr
qstr
);
void
(
*
load_const_str
)(
emit_t
*
emit
,
qstr
qstr
,
bool
bytes
);
...
...
py/emitbc.c
View file @
40f3c026
...
...
@@ -99,7 +99,7 @@ STATIC byte* emit_get_cur_to_write_code_info(emit_t* emit, int num_bytes_to_writ
}
STATIC
void
emit_align_code_info_to_machine_word
(
emit_t
*
emit
)
{
emit
->
code_info_offset
=
(
emit
->
code_info_offset
+
sizeof
(
m
achine
_uint_t
)
-
1
)
&
(
~
(
sizeof
(
m
achine
_uint_t
)
-
1
));
emit
->
code_info_offset
=
(
emit
->
code_info_offset
+
sizeof
(
m
p
_uint_t
)
-
1
)
&
(
~
(
sizeof
(
m
p
_uint_t
)
-
1
));
}
STATIC
void
emit_write_code_info_qstr
(
emit_t
*
emit
,
qstr
qstr
)
{
...
...
@@ -139,7 +139,7 @@ STATIC byte* emit_get_cur_to_write_bytecode(emit_t* emit, int num_bytes_to_write
}
STATIC
void
emit_align_bytecode_to_machine_word
(
emit_t
*
emit
)
{
emit
->
bytecode_offset
=
(
emit
->
bytecode_offset
+
sizeof
(
m
achine
_uint_t
)
-
1
)
&
(
~
(
sizeof
(
m
achine
_uint_t
)
-
1
));
emit
->
bytecode_offset
=
(
emit
->
bytecode_offset
+
sizeof
(
m
p
_uint_t
)
-
1
)
&
(
~
(
sizeof
(
m
p
_uint_t
)
-
1
));
}
STATIC
void
emit_write_bytecode_byte
(
emit_t
*
emit
,
byte
b1
)
{
...
...
@@ -171,7 +171,7 @@ STATIC void emit_write_bytecode_uint(emit_t* emit, uint num) {
}
// Similar to emit_write_bytecode_uint(), just some extra handling to encode sign
STATIC
void
emit_write_bytecode_byte_int
(
emit_t
*
emit
,
byte
b1
,
m
achine
_int_t
num
)
{
STATIC
void
emit_write_bytecode_byte_int
(
emit_t
*
emit
,
byte
b1
,
m
p
_int_t
num
)
{
emit_write_bytecode_byte
(
emit
,
b1
);
// We store each 7 bits in a separate byte, and that's how many bytes needed
...
...
@@ -206,8 +206,8 @@ STATIC void emit_write_bytecode_byte_uint(emit_t* emit, byte b, uint num) {
STATIC
void
emit_write_bytecode_byte_ptr
(
emit_t
*
emit
,
byte
b
,
void
*
ptr
)
{
emit_write_bytecode_byte
(
emit
,
b
);
emit_align_bytecode_to_machine_word
(
emit
);
m
achine
_uint_t
*
c
=
(
m
achine
_uint_t
*
)
emit_get_cur_to_write_bytecode
(
emit
,
sizeof
(
m
achine
_uint_t
));
*
c
=
(
m
achine
_uint_t
)
ptr
;
m
p
_uint_t
*
c
=
(
m
p
_uint_t
*
)
emit_get_cur_to_write_bytecode
(
emit
,
sizeof
(
m
p
_uint_t
));
*
c
=
(
m
p
_uint_t
)
ptr
;
}
/* currently unused
...
...
@@ -269,7 +269,7 @@ STATIC void emit_bc_start_pass(emit_t *emit, pass_kind_t pass, scope_t *scope) {
// write code info size; use maximum space (4 bytes) to write it; TODO possible optimise this
{
byte
*
c
=
emit_get_cur_to_write_code_info
(
emit
,
4
);
m
achine
_uint_t
s
=
emit
->
code_info_size
;
m
p
_uint_t
s
=
emit
->
code_info_size
;
c
[
0
]
=
s
&
0xff
;
c
[
1
]
=
(
s
>>
8
)
&
0xff
;
c
[
2
]
=
(
s
>>
16
)
&
0xff
;
...
...
@@ -428,7 +428,7 @@ STATIC void emit_bc_load_const_tok(emit_t *emit, mp_token_kind_t tok) {
}
}
STATIC
void
emit_bc_load_const_small_int
(
emit_t
*
emit
,
m
achine
_int_t
arg
)
{
STATIC
void
emit_bc_load_const_small_int
(
emit_t
*
emit
,
m
p
_int_t
arg
)
{
emit_bc_pre
(
emit
,
1
);
emit_write_bytecode_byte_int
(
emit
,
MP_BC_LOAD_CONST_SMALL_INT
,
arg
);
}
...
...
py/emitcpy.c
View file @
40f3c026
...
...
@@ -173,7 +173,7 @@ STATIC void emit_cpy_load_const_tok(emit_t *emit, mp_token_kind_t tok) {
}
}
STATIC
void
emit_cpy_load_const_small_int
(
emit_t
*
emit
,
m
achine
_int_t
arg
)
{
STATIC
void
emit_cpy_load_const_small_int
(
emit_t
*
emit
,
m
p
_int_t
arg
)
{
emit_pre
(
emit
,
1
,
3
);
if
(
emit
->
pass
==
MP_PASS_EMIT
)
{
printf
(
"LOAD_CONST "
INT_FMT
"
\n
"
,
arg
);
...
...
py/emitglue.c
View file @
40f3c026
...
...
@@ -95,7 +95,7 @@ void mp_emit_glue_assign_native(mp_raw_code_t *rc, mp_raw_code_kind_t kind, void
#ifdef DEBUG_PRINT
DEBUG_printf
(
"assign native: kind=%d fun=%p len=%u n_args=%d
\n
"
,
kind
,
fun
,
len
,
n_args
);
byte
*
fun_data
=
(
byte
*
)(((
m
achine
_uint_t
)
fun
)
&
(
~
1
));
// need to clear lower bit in case it's thumb code
byte
*
fun_data
=
(
byte
*
)(((
m
p
_uint_t
)
fun
)
&
(
~
1
));
// need to clear lower bit in case it's thumb code
for
(
int
i
=
0
;
i
<
128
&&
i
<
len
;
i
++
)
{
if
(
i
>
0
&&
i
%
16
==
0
)
{
DEBUG_printf
(
"
\n
"
);
...
...
py/emitnative.c
View file @
40f3c026
...
...
@@ -140,7 +140,7 @@ typedef struct _stack_info_t {
stack_info_kind_t
kind
;
union
{
int
u_reg
;
m
achine
_int_t
u_imm
;
m
p
_int_t
u_imm
;
};
}
stack_info_t
;
...
...
@@ -285,7 +285,7 @@ STATIC void emit_native_start_pass(emit_t *emit, pass_kind_t pass, scope_t *scop
}
}
asm_thumb_mov_reg_i32
(
emit
->
as
,
REG_R7
,
(
m
achine
_uint_t
)
mp_fun_table
);
asm_thumb_mov_reg_i32
(
emit
->
as
,
REG_R7
,
(
m
p
_uint_t
)
mp_fun_table
);
#endif
}
...
...
@@ -472,7 +472,7 @@ STATIC void emit_post_push_reg(emit_t *emit, vtype_kind_t vtype, int reg) {
adjust_stack
(
emit
,
1
);
}
STATIC
void
emit_post_push_imm
(
emit_t
*
emit
,
vtype_kind_t
vtype
,
m
achine
_int_t
imm
)
{
STATIC
void
emit_post_push_imm
(
emit_t
*
emit
,
vtype_kind_t
vtype
,
m
p
_int_t
imm
)
{
stack_info_t
*
si
=
&
emit
->
stack_info
[
emit
->
stack_size
];
si
->
vtype
=
vtype
;
si
->
kind
=
STACK_IMM
;
...
...
@@ -516,9 +516,9 @@ STATIC void emit_get_stack_pointer_to_reg_for_pop(emit_t *emit, int reg_dest, in
case
VTYPE_BOOL
:
si
->
vtype
=
VTYPE_PYOBJ
;
if
(
si
->
u_imm
==
0
)
{
ASM_MOV_IMM_TO_LOCAL_USING
((
m
achine
_uint_t
)
mp_const_false
,
emit
->
stack_start
+
emit
->
stack_size
-
1
-
i
,
reg_dest
);
ASM_MOV_IMM_TO_LOCAL_USING
((
m
p
_uint_t
)
mp_const_false
,
emit
->
stack_start
+
emit
->
stack_size
-
1
-
i
,
reg_dest
);
}
else
{
ASM_MOV_IMM_TO_LOCAL_USING
((
m
achine
_uint_t
)
mp_const_true
,
emit
->
stack_start
+
emit
->
stack_size
-
1
-
i
,
reg_dest
);
ASM_MOV_IMM_TO_LOCAL_USING
((
m
p
_uint_t
)
mp_const_true
,
emit
->
stack_start
+
emit
->
stack_size
-
1
-
i
,
reg_dest
);
}
break
;
case
VTYPE_INT
:
...
...
@@ -557,7 +557,7 @@ STATIC void emit_call(emit_t *emit, mp_fun_kind_t fun_kind, void *fun) {
#endif
}
STATIC
void
emit_call_with_imm_arg
(
emit_t
*
emit
,
mp_fun_kind_t
fun_kind
,
void
*
fun
,
m
achine
_int_t
arg_val
,
int
arg_reg
)
{
STATIC
void
emit_call_with_imm_arg
(
emit_t
*
emit
,
mp_fun_kind_t
fun_kind
,
void
*
fun
,
m
p
_int_t
arg_val
,
int
arg_reg
)
{
need_reg_all
(
emit
);
ASM_MOV_IMM_TO_REG
(
arg_val
,
arg_reg
);
#if N_X64
...
...
@@ -567,8 +567,8 @@ STATIC void emit_call_with_imm_arg(emit_t *emit, mp_fun_kind_t fun_kind, void *f
#endif
}
// the first arg is stored in the code aligned on a m
achine
_uint_t boundary
STATIC
void
emit_call_with_imm_arg_aligned
(
emit_t
*
emit
,
mp_fun_kind_t
fun_kind
,
void
*
fun
,
m
achine
_int_t
arg_val
,
int
arg_reg
)
{
// the first arg is stored in the code aligned on a m
p
_uint_t boundary
STATIC
void
emit_call_with_imm_arg_aligned
(
emit_t
*
emit
,
mp_fun_kind_t
fun_kind
,
void
*
fun
,
m
p
_int_t
arg_val
,
int
arg_reg
)
{
need_reg_all
(
emit
);
ASM_MOV_ALIGNED_IMM_TO_REG
(
arg_val
,
arg_reg
);
#if N_X64
...
...
@@ -578,7 +578,7 @@ STATIC void emit_call_with_imm_arg_aligned(emit_t *emit, mp_fun_kind_t fun_kind,
#endif
}
STATIC
void
emit_call_with_2_imm_args
(
emit_t
*
emit
,
mp_fun_kind_t
fun_kind
,
void
*
fun
,
m
achine
_int_t
arg_val1
,
int
arg_reg1
,
m
achine
_int_t
arg_val2
,
int
arg_reg2
)
{
STATIC
void
emit_call_with_2_imm_args
(
emit_t
*
emit
,
mp_fun_kind_t
fun_kind
,
void
*
fun
,
m
p
_int_t
arg_val1
,
int
arg_reg1
,
m
p
_int_t
arg_val2
,
int
arg_reg2
)
{
need_reg_all
(
emit
);
ASM_MOV_IMM_TO_REG
(
arg_val1
,
arg_reg1
);
ASM_MOV_IMM_TO_REG
(
arg_val2
,
arg_reg2
);
...
...
@@ -589,8 +589,8 @@ STATIC void emit_call_with_2_imm_args(emit_t *emit, mp_fun_kind_t fun_kind, void
#endif
}
// the first arg is stored in the code aligned on a m
achine
_uint_t boundary
STATIC
void
emit_call_with_3_imm_args_and_first_aligned
(
emit_t
*
emit
,
mp_fun_kind_t
fun_kind
,
void
*
fun
,
m
achine
_int_t
arg_val1
,
int
arg_reg1
,
m
achine
_int_t
arg_val2
,
int
arg_reg2
,
m
achine
_int_t
arg_val3
,
int
arg_reg3
)
{
// the first arg is stored in the code aligned on a m
p
_uint_t boundary
STATIC
void
emit_call_with_3_imm_args_and_first_aligned
(
emit_t
*
emit
,
mp_fun_kind_t
fun_kind
,
void
*
fun
,
m
p
_int_t
arg_val1
,
int
arg_reg1
,
m
p
_int_t
arg_val2
,
int
arg_reg2
,
m
p
_int_t
arg_val3
,
int
arg_reg3
)
{
need_reg_all
(
emit
);
ASM_MOV_ALIGNED_IMM_TO_REG
(
arg_val1
,
arg_reg1
);
ASM_MOV_IMM_TO_REG
(
arg_val2
,
arg_reg2
);
...
...
@@ -671,7 +671,7 @@ STATIC void emit_native_load_const_tok(emit_t *emit, mp_token_kind_t tok) {
DEBUG_printf
(
"load_const_tok %d
\n
"
,
tok
);
emit_native_pre
(
emit
);
int
vtype
;
m
achine
_uint_t
val
;
m
p
_uint_t
val
;
if
(
emit
->
do_viper_types
)
{
switch
(
tok
)
{
case
MP_TOKEN_KW_NONE
:
vtype
=
VTYPE_PTR_NONE
;
val
=
0
;
break
;
...
...
@@ -682,16 +682,16 @@ STATIC void emit_native_load_const_tok(emit_t *emit, mp_token_kind_t tok) {
}
else
{
vtype
=
VTYPE_PYOBJ
;
switch
(
tok
)
{
case
MP_TOKEN_KW_NONE
:
val
=
(
m
achine
_uint_t
)
mp_const_none
;
break
;
case
MP_TOKEN_KW_FALSE
:
val
=
(
m
achine
_uint_t
)
mp_const_false
;
break
;
case
MP_TOKEN_KW_TRUE
:
val
=
(
m
achine
_uint_t
)
mp_const_true
;
break
;
case
MP_TOKEN_KW_NONE
:
val
=
(
m
p
_uint_t
)
mp_const_none
;
break
;
case
MP_TOKEN_KW_FALSE
:
val
=
(
m
p
_uint_t
)
mp_const_false
;
break
;
case
MP_TOKEN_KW_TRUE
:
val
=
(
m
p
_uint_t
)
mp_const_true
;
break
;
default:
assert
(
0
);
vtype
=
0
;
val
=
0
;
// shouldn't happen
}
}
emit_post_push_imm
(
emit
,
vtype
,
val
);
}
STATIC
void
emit_native_load_const_small_int
(
emit_t
*
emit
,
m
achine
_int_t
arg
)
{
STATIC
void
emit_native_load_const_small_int
(
emit_t
*
emit
,
m
p
_int_t
arg
)
{
DEBUG_printf
(
"load_const_small_int %d
\n
"
,
arg
);
emit_native_pre
(
emit
);
if
(
emit
->
do_viper_types
)
{
...
...
@@ -722,7 +722,7 @@ STATIC void emit_native_load_const_str(emit_t *emit, qstr qstr, bool bytes) {
// not implemented properly
// load a pointer to the asciiz string?
assert
(
0
);
emit_post_push_imm
(
emit
,
VTYPE_PTR
,
(
m
achine
_uint_t
)
qstr_str
(
qstr
));
emit_post_push_imm
(
emit
,
VTYPE_PTR
,
(
m
p
_uint_t
)
qstr_str
(
qstr
));
}
else
{
if
(
bytes
)
{
emit_call_with_imm_arg
(
emit
,
0
,
mp_load_const_bytes
,
qstr
,
REG_ARG_1
);
// TODO need to add function to runtime table
...
...
@@ -815,7 +815,7 @@ STATIC void emit_native_load_subscr(emit_t *emit) {
vtype_kind_t
vtype_lhs
,
vtype_rhs
;
emit_pre_pop_reg_reg
(
emit
,
&
vtype_rhs
,
REG_ARG_2
,
&
vtype_lhs
,
REG_ARG_1
);
if
(
vtype_lhs
==
VTYPE_PYOBJ
&&
vtype_rhs
==
VTYPE_PYOBJ
)
{
emit_call_with_imm_arg
(
emit
,
MP_F_OBJ_SUBSCR
,
mp_obj_subscr
,
(
m
achine
_uint_t
)
MP_OBJ_SENTINEL
,
REG_ARG_3
);
emit_call_with_imm_arg
(
emit
,
MP_F_OBJ_SUBSCR
,
mp_obj_subscr
,
(
m
p
_uint_t
)
MP_OBJ_SENTINEL
,
REG_ARG_3
);
emit_post_push_reg
(
emit
,
VTYPE_PYOBJ
,
REG_RET
);
}
else
{
printf
(
"ViperTypeError: can't do subscr of types %d and %d
\n
"
,
vtype_lhs
,
vtype_rhs
);
...
...
@@ -925,7 +925,7 @@ STATIC void emit_native_delete_attr(emit_t *emit, qstr qstr) {
vtype_kind_t
vtype_base
;
emit_pre_pop_reg
(
emit
,
&
vtype_base
,
REG_ARG_1
);
// arg1 = base
assert
(
vtype_base
==
VTYPE_PYOBJ
);
emit_call_with_2_imm_args
(
emit
,
MP_F_STORE_ATTR
,
mp_store_attr
,
qstr
,
REG_ARG_2
,
(
m
achine
_uint_t
)
MP_OBJ_NULL
,
REG_ARG_3
);
// arg2 = attribute name, arg3 = value (null for delete)
emit_call_with_2_imm_args
(
emit
,
MP_F_STORE_ATTR
,
mp_store_attr
,
qstr
,
REG_ARG_2
,
(
m
p
_uint_t
)
MP_OBJ_NULL
,
REG_ARG_3
);
// arg2 = attribute name, arg3 = value (null for delete)
emit_post
(
emit
);
}
...
...
@@ -934,7 +934,7 @@ STATIC void emit_native_delete_subscr(emit_t *emit) {
emit_pre_pop_reg_reg
(
emit
,
&
vtype_index
,
REG_ARG_2
,
&
vtype_base
,
REG_ARG_1
);
// index, base
assert
(
vtype_index
==
VTYPE_PYOBJ
);
assert
(
vtype_base
==
VTYPE_PYOBJ
);
emit_call_with_imm_arg
(
emit
,
MP_F_OBJ_SUBSCR
,
mp_obj_subscr
,
(
m
achine
_uint_t
)
MP_OBJ_NULL
,
REG_ARG_3
);
emit_call_with_imm_arg
(
emit
,
MP_F_OBJ_SUBSCR
,
mp_obj_subscr
,
(
m
p
_uint_t
)
MP_OBJ_NULL
,
REG_ARG_3
);
}
STATIC
void
emit_native_dup_top
(
emit_t
*
emit
)
{
...
...
@@ -1071,7 +1071,7 @@ STATIC void emit_native_setup_except(emit_t *emit, uint label) {
emit_native_pre
(
emit
);
// need to commit stack because we may jump elsewhere
need_stack_settled
(
emit
);
emit_get_stack_pointer_to_reg_for_push
(
emit
,
REG_ARG_1
,
sizeof
(
nlr_buf_t
)
/
sizeof
(
m
achine
_uint_t
));
// arg1 = pointer to nlr buf
emit_get_stack_pointer_to_reg_for_push
(
emit
,
REG_ARG_1
,
sizeof
(
nlr_buf_t
)
/
sizeof
(
m
p
_uint_t
));
// arg1 = pointer to nlr buf
emit_call
(
emit
,
0
,
nlr_push
);
// TODO need to add function to runtime table
#if N_X64
asm_x64_test_r8_with_r8
(
emit
->
as
,
REG_RET
,
REG_RET
);
...
...
@@ -1108,7 +1108,7 @@ STATIC void emit_native_for_iter(emit_t *emit, uint label) {
emit_access_stack
(
emit
,
1
,
&
vtype
,
REG_ARG_1
);
assert
(
vtype
==
VTYPE_PYOBJ
);
emit_call
(
emit
,
MP_F_ITERNEXT
,
mp_iternext
);
ASM_MOV_IMM_TO_REG
((
m
achine
_uint_t
)
MP_OBJ_STOP_ITERATION
,
REG_TEMP1
);
ASM_MOV_IMM_TO_REG
((
m
p
_uint_t
)
MP_OBJ_STOP_ITERATION
,
REG_TEMP1
);
#if N_X64
asm_x64_cmp_r64_with_r64
(
emit
->
as
,
REG_RET
,
REG_TEMP1
);
asm_x64_jcc_label
(
emit
->
as
,
JCC_JE
,
label
);
...
...
@@ -1129,7 +1129,7 @@ STATIC void emit_native_for_iter_end(emit_t *emit) {
STATIC
void
emit_native_pop_block
(
emit_t
*
emit
)
{
emit_native_pre
(
emit
);
emit_call
(
emit
,
0
,
nlr_pop
);
// TODO need to add function to runtime table
adjust_stack
(
emit
,
-
(
m
achine
_int_t
)(
sizeof
(
nlr_buf_t
)
/
sizeof
(
m
achine
_uint_t
)));
adjust_stack
(
emit
,
-
(
m
p
_int_t
)(
sizeof
(
nlr_buf_t
)
/
sizeof
(
m
p
_uint_t
)));
emit_post
(
emit
);
}
...
...
@@ -1137,7 +1137,7 @@ STATIC void emit_native_pop_except(emit_t *emit) {
/*
emit_native_pre(emit);
emit_call(emit, 0, nlr_pop); // TODO need to add function to runtime table
adjust_stack(emit, -(m
achine
_int_t)(sizeof(nlr_buf_t) / sizeof(m
achine
_uint_t)));