diff --git a/sourcepawn/include/sp_vm_context.h b/sourcepawn/include/sp_vm_context.h index 523a6410..23feef4f 100644 --- a/sourcepawn/include/sp_vm_context.h +++ b/sourcepawn/include/sp_vm_context.h @@ -204,17 +204,15 @@ namespace SourcePawn */ virtual int LocalToPhysAddr(cell_t local_addr, cell_t **phys_addr) =0; - /** + /**:TODO: FIX ALL PACKED STUFF COMMENTS! * Converts a local address to a physical string. * Note that SourcePawn does not support packed strings, as such this function is * 'cell to char' only. * * @param local_addr Local address in plugin. - * @param buffer Destination output buffer. - * @param maxlength Maximum length of output buffer, including null terminator. - * @param chars Optionally filled with the number of characters written. + * @param addr Destination output pointer. */ - virtual int LocalToString(cell_t local_addr, char *buffer, size_t maxlength, int *chars) =0; + virtual int LocalToString(cell_t local_addr, char **addr) =0; /** * Converts a physical string to a local address. diff --git a/sourcepawn/vm/jit/x86/jit_x86.cpp b/sourcepawn/vm/jit/x86/jit_x86.cpp index 3bb0da3e..07787592 100644 --- a/sourcepawn/vm/jit/x86/jit_x86.cpp +++ b/sourcepawn/vm/jit/x86/jit_x86.cpp @@ -1093,6 +1093,30 @@ inline void WriteOp_Load_I(JitWriter *jit) IA32_Mov_Reg_RmEBP_Disp_Reg(jit, AMX_REG_PRI, AMX_REG_DAT, AMX_REG_PRI, NOSCALE); } +inline void WriteOp_Lodb_I(JitWriter *jit) +{ + Write_Check_VerifyAddr(jit, AMX_REG_PRI); + + //mov eax, [ebp+eax] + IA32_Mov_Reg_RmEBP_Disp_Reg(jit, AMX_REG_PRI, AMX_REG_DAT, AMX_REG_PRI, NOSCALE); + + //and eax, + cell_t val = jit->read_cell(); + switch(val) + { + case 1: + { + IA32_And_Rm_Imm32(jit, AMX_REG_PRI, 0x000000FF); + break; + } + case 2: + { + IA32_And_Rm_Imm32(jit, AMX_REG_PRI, 0x0000FFFF); + break; + } + } +} + inline void WriteOp_Stor_I(JitWriter *jit) { //mov [ebp+edx], eax @@ -1100,6 +1124,31 @@ inline void WriteOp_Stor_I(JitWriter *jit) IA32_Mov_RmEBP_Reg_Disp_Reg(jit, AMX_REG_DAT, AMX_REG_ALT, NOSCALE, AMX_REG_PRI); } +inline void WriteOp_Strb_I(JitWriter *jit) +{ + Write_Check_VerifyAddr(jit, AMX_REG_ALT); + //mov [ebp+edx], eax + cell_t val = jit->read_cell(); + switch (val) + { + case 1: + { + IA32_Mov_Rm8EBP_Reg_Disp_Reg(jit, AMX_REG_DAT, AMX_REG_ALT, NOSCALE, AMX_REG_PRI); + break; + } + case 2: + { + IA32_Mov_Rm16EBP_Reg_Disp_Reg(jit, AMX_REG_DAT, AMX_REG_ALT, NOSCALE, AMX_REG_PRI); + break; + } + case 4: + { + IA32_Mov_RmEBP_Reg_Disp_Reg(jit, AMX_REG_DAT, AMX_REG_ALT, NOSCALE, AMX_REG_PRI); + break; + } + } +} + inline void WriteOp_Lidx(JitWriter *jit) { //lea eax, [edx+4*eax] diff --git a/sourcepawn/vm/jit/x86/opcode_helpers.h b/sourcepawn/vm/jit/x86/opcode_helpers.h index 11b7748c..2036ead4 100644 --- a/sourcepawn/vm/jit/x86/opcode_helpers.h +++ b/sourcepawn/vm/jit/x86/opcode_helpers.h @@ -104,7 +104,7 @@ typedef enum OP_LREF_S_PRI, //VERIFIED OP_LREF_S_ALT, //~VERIFIED (lref.s.pri) OP_LOAD_I, //VERIFIED - OP_LODB_I, // !GEN :TODO: - only used for pack access - drop support in compiler first + OP_LODB_I, //VERIFIED OP_CONST_PRI, //VERIFIED OP_CONST_ALT, //~VERIFIED (const.pri) OP_ADDR_PRI, //VERIFIED @@ -118,7 +118,7 @@ typedef enum OP_SREF_S_PRI, //VERIFIED OP_SREF_S_ALT, //~VERIFIED (stor.s.alt) OP_STOR_I, //VERIFIED - OP_STRB_I, // !GEN :TODO: - only used for pack access, drop support in compiler first + OP_STRB_I, //VERIFIED OP_LIDX, //VERIFIED OP_LIDX_B, //DONE OP_IDXADDR, //VERIFIED @@ -127,7 +127,7 @@ typedef enum OP_ALIGN_ALT, // !GEN :TODO: - only used for pack access, drop support in compiler first OP_LCTRL, // !GEN OP_SCTRL, // !GEN - OP_MOVE_PRI, //DONE + OP_MOVE_PRI, //~VERIFIED (move.alt) OP_MOVE_ALT, //VERIFIED OP_XCHG, //DONE OP_PUSH_PRI, //DONE @@ -139,7 +139,7 @@ typedef enum OP_POP_PRI, //VERIFIED OP_POP_ALT, //VERIFIED OP_STACK, //VERIFIED - OP_HEAP, //DONE + OP_HEAP, //VERIFIED OP_PROC, //VERIFIED OP_RET, // !GEN OP_RETN, //VERIFIED @@ -211,7 +211,7 @@ typedef enum OP_DEC, //VERIFIED OP_DEC_S, //VERIFIED OP_DEC_I, //VERIFIED - OP_MOVS, //DONE + OP_MOVS, //VERIFIED OP_CMPS, // !GEN OP_FILL, //VERIFIED OP_HALT, //DONE diff --git a/sourcepawn/vm/jit/x86/opcode_switch.inc b/sourcepawn/vm/jit/x86/opcode_switch.inc index febe45e6..7e1ebc0b 100644 --- a/sourcepawn/vm/jit/x86/opcode_switch.inc +++ b/sourcepawn/vm/jit/x86/opcode_switch.inc @@ -508,11 +508,21 @@ WriteOp_Load_I(jit); break; } + case OP_LODB_I: + { + WriteOp_Lodb_I(jit); + break; + } case OP_STOR_I: { WriteOp_Stor_I(jit); break; } + case OP_STRB_I: + { + WriteOp_Strb_I(jit); + break; + } case OP_LIDX: { WriteOp_Lidx(jit); diff --git a/sourcepawn/vm/jit/x86/ungen_opcode_switch.inc b/sourcepawn/vm/jit/x86/ungen_opcode_switch.inc index 0f9ba552..84549267 100644 --- a/sourcepawn/vm/jit/x86/ungen_opcode_switch.inc +++ b/sourcepawn/vm/jit/x86/ungen_opcode_switch.inc @@ -33,16 +33,6 @@ WriteOp_Align_Alt(jit); break; } - case OP_LODB_I: - { - WriteOp_Lodb_I(jit); - break; - } - case OP_STRB_I: - { - WriteOp_Strb_I(jit); - break; - } case OP_LCTRL: { WriteOp_Lctrl(jit); diff --git a/sourcepawn/vm/jit/x86/ungen_opcodes.h b/sourcepawn/vm/jit/x86/ungen_opcodes.h index f720946d..abae1dba 100644 --- a/sourcepawn/vm/jit/x86/ungen_opcodes.h +++ b/sourcepawn/vm/jit/x86/ungen_opcodes.h @@ -111,55 +111,6 @@ inline void WriteOp_Cmps(JitWriter *jit) IA32_Pop_Reg(jit, REG_EDI); } -inline void WriteOp_Lodb_I(JitWriter *jit) -{ - Write_Check_VerifyAddr(jit, AMX_REG_PRI); - - //mov eax, [ebp+eax] - IA32_Mov_Reg_RmEBP_Disp_Reg(jit, AMX_REG_PRI, AMX_REG_DAT, AMX_REG_PRI, NOSCALE); - - //and eax, - cell_t val = jit->read_cell(); - switch(val) - { - case 1: - { - IA32_And_Rm_Imm32(jit, AMX_REG_PRI, 0x000000FF); - break; - } - case 2: - { - IA32_And_Rm_Imm32(jit, AMX_REG_PRI, 0x0000FFFF); - break; - } - } -} - -inline void WriteOp_Strb_I(JitWriter *jit) -{ - Write_Check_VerifyAddr(jit, AMX_REG_ALT); - //mov [ebp+edx], eax - cell_t val = jit->read_cell(); - switch (val) - { - case 1: - { - IA32_Mov_Rm8EBP_Reg_Disp_Reg(jit, AMX_REG_DAT, AMX_REG_ALT, NOSCALE, AMX_REG_PRI); - break; - } - case 2: - { - IA32_Mov_Rm16EBP_Reg_Disp_Reg(jit, AMX_REG_DAT, AMX_REG_ALT, NOSCALE, AMX_REG_PRI); - break; - } - case 4: - { - IA32_Mov_RmEBP_Reg_Disp_Reg(jit, AMX_REG_DAT, AMX_REG_ALT, NOSCALE, AMX_REG_PRI); - break; - } - } -} - inline void WriteOp_Lctrl(JitWriter *jit) { cell_t val = jit->read_cell(); diff --git a/sourcepawn/vm/sp_vm_basecontext.cpp b/sourcepawn/vm/sp_vm_basecontext.cpp index f147aa1b..002f85f4 100644 --- a/sourcepawn/vm/sp_vm_basecontext.cpp +++ b/sourcepawn/vm/sp_vm_basecontext.cpp @@ -465,7 +465,7 @@ int BaseContext::PushCellArray(cell_t *local_addr, cell_t **phys_addr, cell_t ar return SP_ERROR_NONE; } -int BaseContext::LocalToString(cell_t local_addr, char *buffer, size_t maxlength, int *chars) +int BaseContext::LocalToString(cell_t local_addr, char **addr) { int len = 0; cell_t *src; @@ -474,26 +474,7 @@ int BaseContext::LocalToString(cell_t local_addr, char *buffer, size_t maxlength { return SP_ERROR_INVALID_ADDRESS; } - - src = (cell_t *)(ctx->memory + local_addr); - while ((*src != '\0') && ((size_t)len < maxlength)) - { - buffer[len++] = (char)*src++; - } - - if ((size_t)len >= maxlength) - { - len = maxlength - 1; - } - if (len >= 0) - { - buffer[len] = '\0'; - } - - if (chars) - { - *chars = len; - } + *addr = (char *)(ctx->memory + local_addr); return SP_ERROR_NONE; } diff --git a/sourcepawn/vm/sp_vm_basecontext.h b/sourcepawn/vm/sp_vm_basecontext.h index e49972e4..049acdec 100644 --- a/sourcepawn/vm/sp_vm_basecontext.h +++ b/sourcepawn/vm/sp_vm_basecontext.h @@ -31,7 +31,7 @@ namespace SourcePawn virtual int GetPubvarAddrs(uint32_t index, cell_t *local_addr, cell_t **phys_addr); virtual uint32_t GetPubVarsNum(); virtual int LocalToPhysAddr(cell_t local_addr, cell_t **phys_addr); - virtual int LocalToString(cell_t local_addr, char *buffer, size_t maxlength, int *chars); + virtual int LocalToString(cell_t local_addr, char **addr); virtual int StringToLocal(cell_t local_addr, size_t chars, const char *source); virtual int PushCell(cell_t value); virtual int PushCellArray(cell_t *local_addr, cell_t **phys_addr, cell_t array[], unsigned int numcells);