fix segfault

This commit is contained in:
Aliaksei Chapyzhenka 2019-12-17 14:51:11 -08:00
parent ca5d36e166
commit 6d25281a39
3 changed files with 27 additions and 9 deletions

View File

@ -17,6 +17,7 @@ p.property('ptr', 'trigger');
p.property('ptr', 'triee');
p.property('ptr', 'lifee');
p.property('ptr', 'info');
p.property('ptr', 'tmpStr');
p.property('i32', 'stackPointer');
p.property('ptr', 'id');
p.property('ptr', 'napi_env');

2
vcd.c
View File

@ -123,10 +123,12 @@ METHOD(init) {
ASSERT_OBJECT(args[2], state->info)
static char triggerString [4096] = " ";
static char tmpStr [4096] = " ";
state->trigger = triggerString;
state->reason = "NO REASON";
state->napi_env = env;
state->tmpStr = tmpStr;
napi_value status;
ASSERT(status, napi_create_string_latin1(env, "declaration", NAPI_AUTO_LENGTH, &status))

View File

@ -8,6 +8,17 @@
napi_throw(env, val); \
}
void strcopy(const unsigned char* p, const unsigned char* endp, unsigned char* dst) {
unsigned char* src;
src = p;
while (src < (endp - 1)) {
*dst = *src;
src++;
dst++;
}
*dst = 0;
}
// FIXME use a better structure to match strings
int stringEq (
const unsigned char* gold, // search pattern
@ -60,15 +71,16 @@ int commandSpan(vcd_parser_t* state, const unsigned char* p, const unsigned char
return 0;
}
int scopeIdentifierSpan(vcd_parser_t* state, const unsigned char* p, /* FIXME const */ unsigned char* endp) {
int scopeIdentifierSpan(vcd_parser_t* state, const unsigned char* p, const unsigned char* endp) {
napi_env env = state->napi_env;
*(endp - 1) = 0; // FIXME NULL termination of ASCII string
// *(endp - 1) = 0; // FIXME NULL termination of ASCII string
strcopy(p, endp, state->tmpStr);
napi_value name, obj, stack, top;
ASSERT(name, napi_create_string_latin1(env, (char*)p, (endp - p - 1), &name))
ASSERT(obj, napi_create_object(env, &obj))
ASSERT(state->info, napi_get_named_property(env, state->info, "stack", &stack))
ASSERT(top, napi_get_element(env, stack, state->stackPointer, &top))
ASSERT(top, napi_set_named_property(env, top, p, obj))
ASSERT(top, napi_set_named_property(env, top, state->tmpStr, obj))
state->stackPointer += 1;
ASSERT(top, napi_set_element(env, stack, state->stackPointer, obj))
return 0;
@ -81,18 +93,21 @@ int varSizeSpan(vcd_parser_t* state, const unsigned char* p, const unsigned char
int varIdSpan(vcd_parser_t* state, const unsigned char* p, const unsigned char* endp) {
napi_env env = state->napi_env;
napi_value val;
ASSERT(state->id, napi_create_string_latin1(env, (char*)p, (endp - p - 1), &state->id))
napi_value varId;
ASSERT(varId, napi_create_string_latin1(env, (char*)p, (endp - p - 1), &varId))
ASSERT(state->info, napi_set_named_property(env, state->info, "varId", varId))
return 0;
}
int varNameSpan(vcd_parser_t* state, const unsigned char* p, /* FIXME const */ unsigned char* endp) {
int varNameSpan(vcd_parser_t* state, const unsigned char* p, const unsigned char* endp) {
napi_env env = state->napi_env;
*(endp - 1) = 0; // FIXME NULL termination of ASCII string
napi_value stack, top;
// *(endp - 1) = 0; // FIXME NULL termination of ASCII string
strcopy(p, endp, state->tmpStr);
napi_value stack, top, varId;
ASSERT(state->info, napi_get_named_property(env, state->info, "stack", &stack))
ASSERT(top, napi_get_element(env, stack, state->stackPointer, &top))
ASSERT(state->info, napi_set_named_property(env, top, p, state->id))
ASSERT(state->info, napi_get_named_property(env, state->info, "varId", &varId))
ASSERT(state->info, napi_set_named_property(env, top, state->tmpStr, varId))
return 0;
}