1.1 --- a/sourcepawn/vm/sp_vm.c Sun Aug 06 18:38:00 2006 +0000
1.2 +++ b/sourcepawn/vm/sp_vm.c Sun Aug 06 23:08:02 2006 +0000
1.3 @@ -403,10 +403,6 @@
1.4 }
1.5
1.6 memcpy(ph_addr, array, numcells * sizeof(cell_t));
1.7 - if (phys_addr)
1.8 - {
1.9 - *phys_addr = ph_addr;
1.10 - }
1.11
1.12 if ((err = SP_PushCell(ctx, *local_addr)) != SP_ERR_NONE)
1.13 {
1.14 @@ -414,6 +410,11 @@
1.15 return err;
1.16 }
1.17
1.18 + if (phys_addr)
1.19 + {
1.20 + *phys_addr = ph_addr;
1.21 + }
1.22 +
1.23 return SP_ERR_NONE;
1.24 }
1.25
1.26 @@ -467,16 +468,43 @@
1.27 }
1.28 ph_addr[numcells] = '\0';
1.29
1.30 - if (phys_addr)
1.31 - {
1.32 - *phys_addr = ph_addr;
1.33 - }
1.34 -
1.35 if ((err = SP_PushCell(ctx, *local_addr)) != SP_ERR_NONE)
1.36 {
1.37 SP_HeapRelease(ctx, *local_addr);
1.38 return err;
1.39 }
1.40
1.41 + if (phys_addr)
1.42 + {
1.43 + *phys_addr = ph_addr;
1.44 + }
1.45 +
1.46 return SP_ERR_NONE;
1.47 }
1.48 +
1.49 +int SP_StringToLocal(sp_context_t *ctx, cell_t local_addr, size_t chars, const char *source)
1.50 +{
1.51 + cell_t *dest;
1.52 + size_t i, len;
1.53 +
1.54 + if (((local_addr >= ctx->hp) && (local_addr < ctx->sp)) || (local_addr < 0) || ((ucell_t)local_addr >= ctx->memory))
1.55 + {
1.56 + return SP_ERR_INVALID_ADDRESS;
1.57 + }
1.58 +
1.59 + len = strlen(source);
1.60 + dest = (cell_t *)(ctx->data + local_addr);
1.61 +
1.62 + if (len >= chars)
1.63 + {
1.64 + len = chars - 1;
1.65 + }
1.66 +
1.67 + for (i=0; i<len; i++)
1.68 + {
1.69 + dest[i] = (cell_t)source[i];
1.70 + }
1.71 + dest[len] = '\0';
1.72 +
1.73 + return SP_ERR_NONE;
1.74 +}
2.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
2.2 +++ b/sourcepawn/vm/sp_vm_debug.c Sun Aug 06 23:08:02 2006 +0000
2.3 @@ -0,0 +1,88 @@
2.4 +#include "sp_vm.h"
2.5 +#include "sp_vm_debug.h"
2.6 +
2.7 +int SP_DbgLookupFile(sp_context_t *ctx, ucell_t addr, const char **filename)
2.8 +{
2.9 + uint32_t mid, low, high;
2.10 + int diff;
2.11 +
2.12 + high = ctx->plugin->debug.files_num - 1;
2.13 + low = 0;
2.14 +
2.15 + while (low <= high)
2.16 + {
2.17 + mid = (low + high) / 2;
2.18 + diff = ctx->files[mid].addr - addr;
2.19 + if (diff == 0)
2.20 + {
2.21 + *filename = ctx->files[mid].name;
2.22 + return SP_ERR_NONE;
2.23 + } else if (diff < 0) {
2.24 + low = mid + 1;
2.25 + } else {
2.26 + high = mid - 1;
2.27 + }
2.28 + }
2.29 +
2.30 + return SP_ERR_NOT_FOUND;
2.31 +}
2.32 +
2.33 +int SP_DbgLookupFunction(sp_context_t *ctx, ucell_t addr, const char **name)
2.34 +{
2.35 + uint32_t iter, max = ctx->plugin->debug.syms_num;
2.36 +
2.37 + for (iter=0; iter<max; iter++)
2.38 + {
2.39 + if ((ctx->symbols[iter].sym->ident == SP_SYM_FUNCTION)
2.40 + && (ctx->symbols[iter].codestart <= addr)
2.41 + && (ctx->symbols[iter].codeend > addr))
2.42 + {
2.43 + break;
2.44 + }
2.45 + }
2.46 +
2.47 + if (iter >= max)
2.48 + {
2.49 + return SP_ERR_NOT_FOUND;
2.50 + }
2.51 +
2.52 + *name = ctx->symbols[iter].name;
2.53 +
2.54 + return SP_ERR_NONE;
2.55 +}
2.56 +
2.57 +int SP_DbgLookupLine(sp_context_t *ctx, ucell_t addr, uint32_t *line)
2.58 +{
2.59 + uint32_t mid, low, high;
2.60 + int diff;
2.61 +
2.62 + high = ctx->plugin->debug.lines_num - 1;
2.63 + low = 0;
2.64 +
2.65 + while (low <= high)
2.66 + {
2.67 + mid = (low + high) / 2;
2.68 + diff = ctx->lines[mid].addr - addr;
2.69 + if (diff == 0)
2.70 + {
2.71 + *line = ctx->lines[mid].line;
2.72 + return SP_ERR_NONE;
2.73 + } else if (diff < 0) {
2.74 + low = mid + 1;
2.75 + } else {
2.76 + high = mid - 1;
2.77 + }
2.78 + }
2.79 +
2.80 + return SP_ERR_NOT_FOUND;
2.81 +}
2.82 +
2.83 +int SP_DbgInstallBreak(sp_context_t *ctx, SPVM_DEBUGBREAK newpfn, SPVM_DEBUGBREAK *oldpfn)
2.84 +{
2.85 + if (ctx->dbreak)
2.86 + *oldpfn = ctx->dbreak;
2.87 +
2.88 + ctx->dbreak = newpfn;
2.89 +
2.90 + return SP_ERR_NONE;
2.91 +}