From 9597771fe4c0aa42f20514d7315e706bf6dc51cf Mon Sep 17 00:00:00 2001 From: Damien George Date: Sat, 10 May 2014 18:07:08 +0100 Subject: [PATCH] py, emitters: Fix dummy_data size for bytecode and thumb. Thumb uses a bit less RAM, bytecode uses a tiny bit more, to avoid overflow of the dummy buffer in certain cases. Addresses issue #599. --- py/asmthumb.c | 14 +++++++++----- py/emitbc.c | 9 ++++++--- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/py/asmthumb.c b/py/asmthumb.c index 9e3a9abe25..891947567b 100644 --- a/py/asmthumb.c +++ b/py/asmthumb.c @@ -46,7 +46,7 @@ struct _asm_thumb_t { uint code_offset; uint code_size; byte *code_base; - byte dummy_data[8]; + byte dummy_data[4]; uint max_num_labels; int *label_offsets; @@ -113,6 +113,7 @@ void asm_thumb_end_pass(asm_thumb_t *as) { } // all functions must go through this one to emit bytes +// if as->pass < ASM_THUMB_PASS_EMIT, then this function only returns a buffer of 4 bytes length STATIC byte *asm_thumb_get_cur_to_write_bytes(asm_thumb_t *as, int num_bytes_to_write) { //printf("emit %d\n", num_bytes_to_write); if (as->pass < ASM_THUMB_PASS_EMIT) { @@ -251,10 +252,13 @@ void asm_thumb_align(asm_thumb_t* as, uint align) { void asm_thumb_data(asm_thumb_t* as, uint bytesize, uint val) { byte *c = asm_thumb_get_cur_to_write_bytes(as, bytesize); - // little endian - for (uint i = 0; i < bytesize; i++) { - *c++ = val; - val >>= 8; + // only write to the buffer in the emit pass (otherwise we overflow dummy_data) + if (as->pass == ASM_THUMB_PASS_EMIT) { + // little endian + for (uint i = 0; i < bytesize; i++) { + *c++ = val; + val >>= 8; + } } } diff --git a/py/emitbc.c b/py/emitbc.c index e9c3b164fa..bfd378b5e5 100644 --- a/py/emitbc.c +++ b/py/emitbc.c @@ -44,6 +44,9 @@ #if !MICROPY_EMIT_CPYTHON +#define BYTES_FOR_INT ((BYTES_PER_WORD * 8 + 6) / 7) +#define DUMMY_DATA_SIZE (BYTES_FOR_INT) + struct _emit_t { pass_kind_t pass; int stack_size; @@ -62,7 +65,7 @@ struct _emit_t { uint bytecode_offset; uint bytecode_size; byte *code_base; // stores both byte code and code info - byte dummy_data[8]; + byte dummy_data[DUMMY_DATA_SIZE]; }; STATIC void emit_bc_rot_two(emit_t *emit); @@ -152,7 +155,7 @@ STATIC void emit_write_bytecode_byte_byte(emit_t* emit, byte b1, uint b2) { STATIC void emit_write_bytecode_uint(emit_t* emit, uint num) { // We store each 7 bits in a separate byte, and that's how many bytes needed - byte buf[(BYTES_PER_WORD * 8 + 6) / 7]; + byte buf[BYTES_FOR_INT]; byte *p = buf + sizeof(buf); // We encode in little-ending order, but store in big-endian, to help decoding do { @@ -171,7 +174,7 @@ STATIC void emit_write_bytecode_byte_int(emit_t* emit, byte b1, machine_int_t nu emit_write_bytecode_byte(emit, b1); // We store each 7 bits in a separate byte, and that's how many bytes needed - byte buf[(BYTES_PER_WORD * 8 + 6) / 7]; + byte buf[BYTES_FOR_INT]; byte *p = buf + sizeof(buf); // We encode in little-ending order, but store in big-endian, to help decoding do {