|
@@ -343,8 +343,7 @@ static void sDereference(Script* sc) {
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
Value* v = sPushStack(sc, 1);
|
|
Value* v = sPushStack(sc, 1);
|
|
- if(vSetType(v, VT_POINTER) ||
|
|
+ if(vSetType(v, VT_POINTER) || vSetOffset(v, address + sc->stackVarIndex)) {
|
|
- vSetOffset(v, (uint32)(address + sc->stackVarIndex))) {
|
|
|
|
sCannotSetValueType(sc);
|
|
sCannotSetValueType(sc);
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
@@ -357,7 +356,7 @@ static void sGlobalDereference(Script* sc) {
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
Value* v = sPushStack(sc, 1);
|
|
Value* v = sPushStack(sc, 1);
|
|
- if(vSetType(v, VT_POINTER) || vSetOffset(v, (uint32)address)) {
|
|
+ if(vSetType(v, VT_POINTER) || vSetOffset(v, address)) {
|
|
sCannotSetValueType(sc);
|
|
sCannotSetValueType(sc);
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
@@ -382,14 +381,14 @@ static void sAddReference(Script* sc) {
|
|
}
|
|
}
|
|
Value* v = sPeekStack(sc, VT_POINTER);
|
|
Value* v = sPeekStack(sc, VT_POINTER);
|
|
if(v != NULL) {
|
|
if(v != NULL) {
|
|
- if(vSetOffset(v, vGetOffset(*v) + (uint32)(add * size))) {
|
|
+ if(vSetOffset(v, vGetOffset(*v) + add * size)) {
|
|
sCannotSetValueType(sc);
|
|
sCannotSetValueType(sc);
|
|
}
|
|
}
|
|
} else {
|
|
} else {
|
|
sc->error[0] = '\0';
|
|
sc->error[0] = '\0';
|
|
v = sPeekStack(sc, VT_ARRAY);
|
|
v = sPeekStack(sc, VT_ARRAY);
|
|
if(vSetType(v, VT_POINTER) ||
|
|
if(vSetType(v, VT_POINTER) ||
|
|
- vSetOffset(v, vGetOffset(*v) + (uint32)(add * size))) {
|
|
+ vSetOffset(v, vGetOffset(*v) + add * size)) {
|
|
sCannotSetValueType(sc);
|
|
sCannotSetValueType(sc);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -412,10 +411,10 @@ static void sPushStructReference(Script* sc) {
|
|
}
|
|
}
|
|
|
|
|
|
static Value* sLoadFromPointer(Script* sc, Value* p, ValueType wantedType) {
|
|
static Value* sLoadFromPointer(Script* sc, Value* p, ValueType wantedType) {
|
|
- uint32 offset = vGetOffset(*p);
|
|
+ int32 offset = vGetOffset(*p);
|
|
if(p->data.intValue < 0) {
|
|
if(p->data.intValue < 0) {
|
|
- if(offset >= SCRIPT_STACK_SIZE) {
|
|
+ if(offset < 0 || offset >= SCRIPT_STACK_SIZE) {
|
|
- sError(sc, "load offset overflow");
|
|
+ sError(sc, "invalid offset");
|
|
return NULL;
|
|
return NULL;
|
|
}
|
|
}
|
|
Value* v = sc->stack + offset;
|
|
Value* v = sc->stack + offset;
|
|
@@ -432,8 +431,8 @@ static Value* sLoadFromPointer(Script* sc, Value* p, ValueType wantedType) {
|
|
sError(sc, "invalid heap pointer %d", p->data.intValue);
|
|
sError(sc, "invalid heap pointer %d", p->data.intValue);
|
|
return NULL;
|
|
return NULL;
|
|
}
|
|
}
|
|
- if((int32)offset >= a->realLength) {
|
|
+ if(offset >= a->realLength) {
|
|
- sError(sc, "invalid heap pointer offset %u %d", offset, a->realLength);
|
|
+ sError(sc, "invalid heap pointer offset %d %d", offset, a->realLength);
|
|
return NULL;
|
|
return NULL;
|
|
}
|
|
}
|
|
return a->data + offset;
|
|
return a->data + offset;
|