aboutsummaryrefslogtreecommitdiff
path: root/engines/sci/engine/kernel.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/sci/engine/kernel.cpp')
-rw-r--r--engines/sci/engine/kernel.cpp53
1 files changed, 17 insertions, 36 deletions
diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp
index 40c7be207d..d3bcae508c 100644
--- a/engines/sci/engine/kernel.cpp
+++ b/engines/sci/engine/kernel.cpp
@@ -729,12 +729,14 @@ void Kernel::mapFunctions() {
int determine_reg_type(EngineState *s, reg_t reg, bool allow_invalid) {
MemObject *mobj;
+ int type = 0;
if (!reg.segment) {
+ type = KSIG_ARITHMETIC;
if (!reg.offset)
- return KSIG_ARITHMETIC | KSIG_NULL;
+ type |= KSIG_NULL;
- return KSIG_ARITHMETIC;
+ return type;
}
if ((reg.segment >= s->seg_manager->_heap.size()) || !s->seg_manager->_heap[reg.segment])
@@ -755,52 +757,31 @@ int determine_reg_type(EngineState *s, reg_t reg, bool allow_invalid) {
return KSIG_REF;
case MEM_OBJ_CLONES:
- if (allow_invalid || ((CloneTable *)mobj)->isValidEntry(reg.offset))
- return KSIG_OBJECT;
- else
- return KSIG_OBJECT | KSIG_INVALID;
+ type = KSIG_OBJECT;
+ break;
case MEM_OBJ_LOCALS:
- if (allow_invalid || reg.offset < (*(LocalVariables *)mobj)._locals.size() * sizeof(reg_t))
- return KSIG_REF;
- else
- return KSIG_REF | KSIG_INVALID;
-
case MEM_OBJ_STACK:
- if (allow_invalid || reg.offset < (*(DataStack *)mobj).nr * sizeof(reg_t))
- return KSIG_REF;
- else
- return KSIG_REF | KSIG_INVALID;
-
case MEM_OBJ_SYS_STRINGS:
- if (allow_invalid || (reg.offset < SYS_STRINGS_MAX
- && (*(SystemStrings *)mobj).strings[reg.offset].name))
- return KSIG_REF;
- else
- return KSIG_REF | KSIG_INVALID;
+ case MEM_OBJ_DYNMEM:
+ type = KSIG_REF;
+ break;
case MEM_OBJ_LISTS:
- if (allow_invalid || ((ListTable *)mobj)->isValidEntry(reg.offset))
- return KSIG_LIST;
- else
- return KSIG_LIST | KSIG_INVALID;
+ type = KSIG_LIST;
+ break;
case MEM_OBJ_NODES:
- if (allow_invalid || ((NodeTable *)mobj)->isValidEntry(reg.offset))
- return KSIG_NODE;
- else
- return KSIG_NODE | KSIG_INVALID;
-
- case MEM_OBJ_DYNMEM:
- if (allow_invalid || reg.offset < (*(DynMem *)mobj)._size)
- return KSIG_REF;
- else
- return KSIG_REF | KSIG_INVALID;
+ type = KSIG_NODE;
+ break;
default:
return 0;
-
}
+
+ if (!allow_invalid && !mobj->isValidOffset(reg.offset))
+ type |= KSIG_INVALID;
+ return type;
}
const char *kernel_argtype_description(int type) {