File tree Expand file tree Collapse file tree 6 files changed +42
-15
lines changed Expand file tree Collapse file tree 6 files changed +42
-15
lines changed Original file line number Diff line number Diff line change @@ -24,16 +24,28 @@ def to_uint(n):
24
24
b [- 1 ] &= 0x7f # clear high bit: it's the last byte
25
25
return bytes (b )
26
26
27
+ def align (n , a ):
28
+ return (n + a - 1 ) // a * a
29
+
27
30
def process_file (filename ):
28
31
with open (filename , 'rb' ) as f :
29
32
header = f .read (6 )
30
33
num_qstrs = struct .unpack ('H' , f .read (2 ))[0 ]
31
- data = f .read ()
34
+ qstr_strings_len = struct .unpack ('Q' , f .read (8 ))[0 ]
35
+ qstr_buffer_len = align (qstr_strings_len , 8 )
36
+ qstrbuf = f .read (qstr_buffer_len )[:qstr_strings_len ]
37
+ text = f .read ()
38
+ qstrs = qstrbuf .rstrip ('\0 ' ).split (b'\0 ' )
39
+ if len (qstrs ) != num_qstrs :
40
+ raise ValueError ('expected len(qstrs) == num_qstrs' )
32
41
with open (filename , 'wb' ) as f :
33
42
f .write (header )
34
43
f .write (to_uint (num_qstrs ))
35
- f .write (to_uint (len (data )))
36
- f .write (data )
44
+ for qstr in qstrs :
45
+ f .write (to_uint (len (qstr )))
46
+ f .write (qstr )
47
+ f .write (to_uint (len (text )))
48
+ f .write (text )
37
49
38
50
if __name__ == '__main__' :
39
51
process_file (sys .argv [1 ])
Original file line number Diff line number Diff line change @@ -14,6 +14,17 @@ enum {
14
14
MP_LOCAL_QSTR_number_of ,
15
15
};
16
16
17
+ __attribute__((section (".qstr" )))
18
+ struct {
19
+ #define QDEF (id , str ) const char id[sizeof(str)];
20
+ QSTR_DEFINES
21
+ #undef QDEF
22
+ } QSTR_VALUE = {
23
+ #define QDEF (id , str ) str ,
24
+ QSTR_DEFINES
25
+ #undef QDEF
26
+ };
27
+
17
28
STATIC mp_obj_t modx_add1 (CONTEXT mp_obj_t x ) {
18
29
return RT (mp_binary_op )(MP_BINARY_OP_ADD , x , MP_OBJ_NEW_SMALL_INT (1 ));
19
30
}
@@ -34,14 +45,6 @@ MP_PERSISTENT_NATIVE_HEADER
34
45
35
46
MP_PERSISTENT_NATIVE_INIT
36
47
void init (CONTEXT_ALONE ) {
37
- // create qstrs
38
- {
39
- qstr * q = pnd -> qstr_table ;
40
- #define QDEF (id , str ) *q++ = RT(qstr_from_str)(str);
41
- QSTR_DEFINES
42
- #undef QDEF
43
- }
44
-
45
48
// constants
46
49
RT (mp_store_global )(QSTR (VAL1 ), CONST (_true ));
47
50
RT (mp_store_global )(QSTR (VAL2 ), MP_OBJ_NEW_SMALL_INT (123 ));
Original file line number Diff line number Diff line change @@ -8,6 +8,11 @@ SECTIONS
8
8
{
9
9
. = ALIGN (4);
10
10
KEEP(*(.mpyheader))
11
+ QUAD (_qstr_end - _qstr_start )
12
+ _qstr_start = .;
13
+ KEEP(*(.qstr))
14
+ _qstr_end = .;
15
+ . = ALIGN (8);
11
16
KEEP(*(.mpytext))
12
17
*(.text*)
13
18
*(.rodata*)
Original file line number Diff line number Diff line change @@ -47,7 +47,7 @@ typedef struct _mp_persistent_native_data_t {
47
47
void * data ;
48
48
} mp_persistent_native_data_t ;
49
49
50
- mp_persistent_native_data_t * mp_new_persistent_native_data (size_t num_qstrs );
50
+ mp_persistent_native_data_t * mp_new_persistent_native_data (qstr * qstr_table );
51
51
#endif
52
52
53
53
typedef struct _mp_raw_code_t {
Original file line number Diff line number Diff line change @@ -184,10 +184,10 @@ const void *const mp_fun_table[MP_F_NUMBER_OF] = {
184
184
};
185
185
186
186
#if MICROPY_PERSISTENT_NATIVE
187
- mp_persistent_native_data_t * mp_new_persistent_native_data (size_t num_qstrs ) {
187
+ mp_persistent_native_data_t * mp_new_persistent_native_data (qstr * qstr_table ) {
188
188
mp_persistent_native_data_t * data = m_new_obj (mp_persistent_native_data_t );
189
189
data -> fun_table = mp_fun_table ;
190
- data -> qstr_table = m_new0 ( qstr , num_qstrs ) ;
190
+ data -> qstr_table = qstr_table ;
191
191
data -> data = NULL ;
192
192
return data ;
193
193
}
Original file line number Diff line number Diff line change @@ -217,7 +217,14 @@ mp_raw_code_t *load_raw_code_native(mp_reader_t *reader) {
217
217
if (arch != MP_PERSISTENT_ARCH_CURRENT ) {
<
A3E2
/code>
218
218
nlr_raise (mp_obj_new_exception_msg (& mp_type_ValueError , ".mpy has wrong arch" ));
219
219
}
220
+
221
+ // load qstrs
220
222
uint num_qstrs = read_uint (reader );
223
+ qstr * qstr_table = m_new0 (qstr , num_qstrs );
224
+ qstr * q = qstr_table ;
225
+ for (size_t i = 0 ; i < num_qstrs ; i ++ ) {
226
+ * q ++ = load_qstr (reader );
227
+ }
221
228
222
229
// load machine code
223
230
mp_uint_t len = read_uint (reader );
@@ -226,7 +233,7 @@ mp_raw_code_t *load_raw_code_native(mp_reader_t *reader) {
226
233
MP_PLAT_ALLOC_EXEC (len , & data , & alloc );
227
234
read_bytes (reader , data , len );
228
235
229
- mp_persistent_native_data_t * per_nat_data = mp_new_persistent_native_data (num_qstrs );
236
+ mp_persistent_native_data_t * per_nat_data = mp_new_persistent_native_data (qstr_table );
230
237
231
238
// create raw_code and return it
232
239
mp_raw_code_t * rc = mp_emit_glue_new_raw_code ();
You can’t perform that action at this time.
0 commit comments