Changed StringToLocal to work with real strings
moved out two .b opcodes out of the ungenerated group since now are needed for strings --HG-- extra : convert_revision : svn%3A39bc706e-5318-0410-9160-8a85361fbb7c/trunk%40160
This commit is contained in:
parent
2348f9106a
commit
453f0db476
@ -204,17 +204,15 @@ namespace SourcePawn
|
|||||||
*/
|
*/
|
||||||
virtual int LocalToPhysAddr(cell_t local_addr, cell_t **phys_addr) =0;
|
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.
|
* Converts a local address to a physical string.
|
||||||
* Note that SourcePawn does not support packed strings, as such this function is
|
* Note that SourcePawn does not support packed strings, as such this function is
|
||||||
* 'cell to char' only.
|
* 'cell to char' only.
|
||||||
*
|
*
|
||||||
* @param local_addr Local address in plugin.
|
* @param local_addr Local address in plugin.
|
||||||
* @param buffer Destination output buffer.
|
* @param addr Destination output pointer.
|
||||||
* @param maxlength Maximum length of output buffer, including null terminator.
|
|
||||||
* @param chars Optionally filled with the number of characters written.
|
|
||||||
*/
|
*/
|
||||||
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.
|
* Converts a physical string to a local address.
|
||||||
|
@ -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);
|
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, <bitmask>
|
||||||
|
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)
|
inline void WriteOp_Stor_I(JitWriter *jit)
|
||||||
{
|
{
|
||||||
//mov [ebp+edx], eax
|
//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);
|
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)
|
inline void WriteOp_Lidx(JitWriter *jit)
|
||||||
{
|
{
|
||||||
//lea eax, [edx+4*eax]
|
//lea eax, [edx+4*eax]
|
||||||
|
@ -104,7 +104,7 @@ typedef enum
|
|||||||
OP_LREF_S_PRI, //VERIFIED
|
OP_LREF_S_PRI, //VERIFIED
|
||||||
OP_LREF_S_ALT, //~VERIFIED (lref.s.pri)
|
OP_LREF_S_ALT, //~VERIFIED (lref.s.pri)
|
||||||
OP_LOAD_I, //VERIFIED
|
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_PRI, //VERIFIED
|
||||||
OP_CONST_ALT, //~VERIFIED (const.pri)
|
OP_CONST_ALT, //~VERIFIED (const.pri)
|
||||||
OP_ADDR_PRI, //VERIFIED
|
OP_ADDR_PRI, //VERIFIED
|
||||||
@ -118,7 +118,7 @@ typedef enum
|
|||||||
OP_SREF_S_PRI, //VERIFIED
|
OP_SREF_S_PRI, //VERIFIED
|
||||||
OP_SREF_S_ALT, //~VERIFIED (stor.s.alt)
|
OP_SREF_S_ALT, //~VERIFIED (stor.s.alt)
|
||||||
OP_STOR_I, //VERIFIED
|
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, //VERIFIED
|
||||||
OP_LIDX_B, //DONE
|
OP_LIDX_B, //DONE
|
||||||
OP_IDXADDR, //VERIFIED
|
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_ALIGN_ALT, // !GEN :TODO: - only used for pack access, drop support in compiler first
|
||||||
OP_LCTRL, // !GEN
|
OP_LCTRL, // !GEN
|
||||||
OP_SCTRL, // !GEN
|
OP_SCTRL, // !GEN
|
||||||
OP_MOVE_PRI, //DONE
|
OP_MOVE_PRI, //~VERIFIED (move.alt)
|
||||||
OP_MOVE_ALT, //VERIFIED
|
OP_MOVE_ALT, //VERIFIED
|
||||||
OP_XCHG, //DONE
|
OP_XCHG, //DONE
|
||||||
OP_PUSH_PRI, //DONE
|
OP_PUSH_PRI, //DONE
|
||||||
@ -139,7 +139,7 @@ typedef enum
|
|||||||
OP_POP_PRI, //VERIFIED
|
OP_POP_PRI, //VERIFIED
|
||||||
OP_POP_ALT, //VERIFIED
|
OP_POP_ALT, //VERIFIED
|
||||||
OP_STACK, //VERIFIED
|
OP_STACK, //VERIFIED
|
||||||
OP_HEAP, //DONE
|
OP_HEAP, //VERIFIED
|
||||||
OP_PROC, //VERIFIED
|
OP_PROC, //VERIFIED
|
||||||
OP_RET, // !GEN
|
OP_RET, // !GEN
|
||||||
OP_RETN, //VERIFIED
|
OP_RETN, //VERIFIED
|
||||||
@ -211,7 +211,7 @@ typedef enum
|
|||||||
OP_DEC, //VERIFIED
|
OP_DEC, //VERIFIED
|
||||||
OP_DEC_S, //VERIFIED
|
OP_DEC_S, //VERIFIED
|
||||||
OP_DEC_I, //VERIFIED
|
OP_DEC_I, //VERIFIED
|
||||||
OP_MOVS, //DONE
|
OP_MOVS, //VERIFIED
|
||||||
OP_CMPS, // !GEN
|
OP_CMPS, // !GEN
|
||||||
OP_FILL, //VERIFIED
|
OP_FILL, //VERIFIED
|
||||||
OP_HALT, //DONE
|
OP_HALT, //DONE
|
||||||
|
@ -508,11 +508,21 @@
|
|||||||
WriteOp_Load_I(jit);
|
WriteOp_Load_I(jit);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case OP_LODB_I:
|
||||||
|
{
|
||||||
|
WriteOp_Lodb_I(jit);
|
||||||
|
break;
|
||||||
|
}
|
||||||
case OP_STOR_I:
|
case OP_STOR_I:
|
||||||
{
|
{
|
||||||
WriteOp_Stor_I(jit);
|
WriteOp_Stor_I(jit);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case OP_STRB_I:
|
||||||
|
{
|
||||||
|
WriteOp_Strb_I(jit);
|
||||||
|
break;
|
||||||
|
}
|
||||||
case OP_LIDX:
|
case OP_LIDX:
|
||||||
{
|
{
|
||||||
WriteOp_Lidx(jit);
|
WriteOp_Lidx(jit);
|
||||||
|
@ -33,16 +33,6 @@
|
|||||||
WriteOp_Align_Alt(jit);
|
WriteOp_Align_Alt(jit);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case OP_LODB_I:
|
|
||||||
{
|
|
||||||
WriteOp_Lodb_I(jit);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case OP_STRB_I:
|
|
||||||
{
|
|
||||||
WriteOp_Strb_I(jit);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case OP_LCTRL:
|
case OP_LCTRL:
|
||||||
{
|
{
|
||||||
WriteOp_Lctrl(jit);
|
WriteOp_Lctrl(jit);
|
||||||
|
@ -111,55 +111,6 @@ inline void WriteOp_Cmps(JitWriter *jit)
|
|||||||
IA32_Pop_Reg(jit, REG_EDI);
|
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, <bitmask>
|
|
||||||
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)
|
inline void WriteOp_Lctrl(JitWriter *jit)
|
||||||
{
|
{
|
||||||
cell_t val = jit->read_cell();
|
cell_t val = jit->read_cell();
|
||||||
|
@ -465,7 +465,7 @@ int BaseContext::PushCellArray(cell_t *local_addr, cell_t **phys_addr, cell_t ar
|
|||||||
return SP_ERROR_NONE;
|
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;
|
int len = 0;
|
||||||
cell_t *src;
|
cell_t *src;
|
||||||
@ -474,26 +474,7 @@ int BaseContext::LocalToString(cell_t local_addr, char *buffer, size_t maxlength
|
|||||||
{
|
{
|
||||||
return SP_ERROR_INVALID_ADDRESS;
|
return SP_ERROR_INVALID_ADDRESS;
|
||||||
}
|
}
|
||||||
|
*addr = (char *)(ctx->memory + local_addr);
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
return SP_ERROR_NONE;
|
return SP_ERROR_NONE;
|
||||||
}
|
}
|
||||||
|
@ -31,7 +31,7 @@ namespace SourcePawn
|
|||||||
virtual int GetPubvarAddrs(uint32_t index, cell_t *local_addr, cell_t **phys_addr);
|
virtual int GetPubvarAddrs(uint32_t index, cell_t *local_addr, cell_t **phys_addr);
|
||||||
virtual uint32_t GetPubVarsNum();
|
virtual uint32_t GetPubVarsNum();
|
||||||
virtual int LocalToPhysAddr(cell_t local_addr, cell_t **phys_addr);
|
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 StringToLocal(cell_t local_addr, size_t chars, const char *source);
|
||||||
virtual int PushCell(cell_t value);
|
virtual int PushCell(cell_t value);
|
||||||
virtual int PushCellArray(cell_t *local_addr, cell_t **phys_addr, cell_t array[], unsigned int numcells);
|
virtual int PushCellArray(cell_t *local_addr, cell_t **phys_addr, cell_t array[], unsigned int numcells);
|
||||||
|
Loading…
Reference in New Issue
Block a user