Branch: Tag:

2013-06-19

2013-06-19 18:50:28 by Henrik Grubbström (Grubba) <grubba@grubba.org>

[runtime][amd64] Fixed some free_svalue-related bugs.

free_svalues() now survives freeing unfinished arrays.

amd64_free_svalue() now supports freeing PIKE_T_VOID svalues.

1096:    /* load type -> RAX */    mov_sval_type( src, REG_RAX );    -  /* if RAX < MIN_REF_TYPE+1 */ +  and_reg_imm(REG_RAX, ~(MIN_REF_TYPE - 1)); +  +  /* if RAX != MIN_REF_TYPE */    cmp_reg32_imm( REG_RAX,MIN_REF_TYPE); -  jl( &label_A ); +  jne( &label_A );       /* Load pointer to refs -> RAX */    mov_mem_reg( src, OFFSETOF(svalue, u.refs), REG_RAX);
1116:    LABEL_A;   }    - /* Type already in RAX */ + /* Type already in register. Note: Clobbers the type register. */   static void amd64_free_svalue_type(enum amd64_reg src, enum amd64_reg type,    int guaranteed_ref )   {
1125:    if( src == REG_RAX )    Pike_fatal("Clobbering RAX for free-svalue\n");    +  and_reg_imm(type, ~(MIN_REF_TYPE - 1)); +     cmp_reg32_imm(type,MIN_REF_TYPE); -  jl( &label_A ); +  jne( &label_A );       /* Load pointer to refs -> RAX */    mov_mem_reg( src, OFFSETOF(svalue, u.refs), REG_RAX);