From 6b6fa3f111e617f901d3a853cf50db4d77ac8fe4 Mon Sep 17 00:00:00 2001 From: Alexander Batalov Date: Tue, 9 May 2023 18:42:47 +0300 Subject: [PATCH 1/9] Fix code format check --- .github/workflows/ci-build.yml | 2 +- src/platform_compat.cc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci-build.yml b/.github/workflows/ci-build.yml index 946be3c..63dcbb5 100644 --- a/.github/workflows/ci-build.yml +++ b/.github/workflows/ci-build.yml @@ -41,7 +41,7 @@ jobs: uses: actions/checkout@v3 - name: clang-format - run: find src -type f -exec clang-format --dry-run --Werror {} \; + run: clang-format --dry-run --Werror src/**/*.cc src/**/*.h android: name: Android diff --git a/src/platform_compat.cc b/src/platform_compat.cc index 7a8f425..031cdae 100644 --- a/src/platform_compat.cc +++ b/src/platform_compat.cc @@ -315,7 +315,7 @@ void compat_resolve_path(char* path) #ifndef _WIN32 char* pch = path; - DIR *dir; + DIR* dir; if (pch[0] == '/') { dir = opendir("/"); pch++; From 2565900f904934a9e0f7f615d3407a1e83783a39 Mon Sep 17 00:00:00 2001 From: Alexander Batalov Date: Thu, 18 May 2023 23:32:16 +0300 Subject: [PATCH 2/9] Fix clang-format args Looks like clang-format in Ubuntu does not recognize glob pattern as macOS does. Previous solution without xargs reported status code of find itself, not clang-format. --- .github/workflows/ci-build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci-build.yml b/.github/workflows/ci-build.yml index 63dcbb5..492e190 100644 --- a/.github/workflows/ci-build.yml +++ b/.github/workflows/ci-build.yml @@ -41,7 +41,7 @@ jobs: uses: actions/checkout@v3 - name: clang-format - run: clang-format --dry-run --Werror src/**/*.cc src/**/*.h + run: find src -type f -name \*.cc -o -name \*.h | xargs clang-format --dry-run --Werror android: name: Android From 666e5cf62d7bbcf4b74fc3907dc94db9a5d3c22e Mon Sep 17 00:00:00 2001 From: Alexander Batalov Date: Tue, 23 May 2023 23:32:11 +0300 Subject: [PATCH 3/9] Fix mouse events processing See alexbatalov/fallout1-ce#55 --- src/dinput.cc | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/dinput.cc b/src/dinput.cc index 4fae607..a5c1dfc 100644 --- a/src/dinput.cc +++ b/src/dinput.cc @@ -50,6 +50,14 @@ bool mouseDeviceUnacquire() // 0x4E053C bool mouseDeviceGetData(MouseData* mouseState) { + // CE: This function is sometimes called outside loops calling `get_input` + // and subsequently `GNW95_process_message`, so mouse events might not be + // handled by SDL yet. + // + // TODO: Move mouse events processing into `GNW95_process_message` and + // update mouse position manually. + SDL_PumpEvents(); + Uint32 buttons = SDL_GetRelativeMouseState(&(mouseState->x), &(mouseState->y)); mouseState->buttons[0] = (buttons & SDL_BUTTON(SDL_BUTTON_LEFT)) != 0; mouseState->buttons[1] = (buttons & SDL_BUTTON(SDL_BUTTON_RIGHT)) != 0; From d641fefc1387886b7cd357b121feab4e93c3d660 Mon Sep 17 00:00:00 2001 From: Alexander Batalov Date: Tue, 23 May 2023 23:43:00 +0300 Subject: [PATCH 4/9] Fix open door sound See alexbatalov/fallout1-ce#71 --- src/proto_instance.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/proto_instance.cc b/src/proto_instance.cc index 8dd9483..0c57d8a 100644 --- a/src/proto_instance.cc +++ b/src/proto_instance.cc @@ -1766,7 +1766,7 @@ int _obj_use_door(Object* a1, Object* a2, int a3) animationRegisterCallback(a2, a2, (AnimationCallback*)_set_door_state_open, -1); } - const char* sfx = sfxBuildOpenName(a2, SCENERY_SOUND_EFFECT_CLOSED); + const char* sfx = sfxBuildOpenName(a2, SCENERY_SOUND_EFFECT_OPEN); animationRegisterPlaySoundEffect(a2, sfx, -1); animationRegisterAnimate(a2, ANIM_STAND, 0); From 61293bd39c0f680efb06023f4484f1ac5a149145 Mon Sep 17 00:00:00 2001 From: Vlad Date: Tue, 23 May 2023 22:45:18 +0200 Subject: [PATCH 5/9] Fix ruined stack in rm_mult_objs_from_inven and name remaining opcodes (#289) --- src/interpreter.cc | 80 ++++++++++++++++++++-------------------- src/interpreter_extra.cc | 6 +-- 2 files changed, 43 insertions(+), 43 deletions(-) diff --git a/src/interpreter.cc b/src/interpreter.cc index 23793ac..59534ec 100644 --- a/src/interpreter.cc +++ b/src/interpreter.cc @@ -87,17 +87,17 @@ static void opLeaveCriticalSection(Program* program); static void opEnterCriticalSection(Program* program); static void opJump(Program* program); static void opCall(Program* program); -static void op801F(Program* program); -static void op801C(Program* program); -static void op801D(Program* program); -static void op8020(Program* program); -static void op8021(Program* program); -static void op8025(Program* program); -static void op8026(Program* program); -static void op8022(Program* program); -static void op8023(Program* program); -static void op8024(Program* program); -static void op801E(Program* program); +static void opPopFlags(Program* program); +static void opPopReturn(Program* program); +static void opPopExit(Program* program); +static void opPopFlagsReturn(Program* program); +static void opPopFlagsExit(Program* program); +static void opPopFlagsReturnValExit(Program* program); +static void opPopFlagsReturnValExitExtern(Program* program); +static void opPopFlagsReturnExtern(Program* program); +static void opPopFlagsExitExtern(Program* program); +static void opPopFlagsReturnValExtern(Program* program); +static void opPopAddress(Program* program); static void opAtoD(Program* program); static void opDtoA(Program* program); static void opExitProgram(Program* program); @@ -2042,7 +2042,7 @@ static void opCall(Program* program) } // 0x46B590 -static void op801F(Program* program) +static void opPopFlags(Program* program) { program->windowId = programStackPopInteger(program); program->checkWaitFunc = (InterpretCheckWaitFunc*)programStackPopPointer(program); @@ -2051,13 +2051,13 @@ static void op801F(Program* program) // pop stack 2 -> set program address // 0x46B63C -static void op801C(Program* program) +static void opPopReturn(Program* program) { program->instructionPointer = programReturnStackPopInteger(program); } // 0x46B658 -static void op801D(Program* program) +static void opPopExit(Program* program) { program->instructionPointer = programReturnStackPopInteger(program); @@ -2065,37 +2065,37 @@ static void op801D(Program* program) } // 0x46B67C -static void op8020(Program* program) +static void opPopFlagsReturn(Program* program) { - op801F(program); + opPopFlags(program); program->instructionPointer = programReturnStackPopInteger(program); } // 0x46B698 -static void op8021(Program* program) +static void opPopFlagsExit(Program* program) { - op801F(program); + opPopFlags(program); program->instructionPointer = programReturnStackPopInteger(program); program->flags |= PROGRAM_FLAG_0x40; } // 0x46B6BC -static void op8025(Program* program) +static void opPopFlagsReturnValExit(Program* program) { ProgramValue value = programStackPopValue(program); - op801F(program); + opPopFlags(program); program->instructionPointer = programReturnStackPopInteger(program); program->flags |= PROGRAM_FLAG_0x40; programStackPushValue(program, value); } // 0x46B73C -static void op8026(Program* program) +static void opPopFlagsReturnValExitExtern(Program* program) { ProgramValue value = programStackPopValue(program); - op801F(program); + opPopFlags(program); Program* v1 = (Program*)programReturnStackPopPointer(program); v1->checkWaitFunc = (InterpretCheckWaitFunc*)programReturnStackPopPointer(program); @@ -2109,9 +2109,9 @@ static void op8026(Program* program) } // 0x46B808 -static void op8022(Program* program) +static void opPopFlagsReturnExtern(Program* program) { - op801F(program); + opPopFlags(program); Program* v1 = (Program*)programReturnStackPopPointer(program); v1->checkWaitFunc = (InterpretCheckWaitFunc*)programReturnStackPopPointer(program); @@ -2121,9 +2121,9 @@ static void op8022(Program* program) } // 0x46B86C -static void op8023(Program* program) +static void opPopFlagsExitExtern(Program* program) { - op801F(program); + opPopFlags(program); Program* v1 = (Program*)programReturnStackPopPointer(program); v1->checkWaitFunc = (InterpretCheckWaitFunc*)programReturnStackPopPointer(program); @@ -2136,11 +2136,11 @@ static void op8023(Program* program) // pop value from stack 1 and push it to script popped from stack 2 // 0x46B8D8 -static void op8024(Program* program) +static void opPopFlagsReturnValExtern(Program* program) { ProgramValue value = programStackPopValue(program); - op801F(program); + opPopFlags(program); Program* v10 = (Program*)programReturnStackPopPointer(program); v10->checkWaitFunc = (InterpretCheckWaitFunc*)programReturnStackPopPointer(program); @@ -2164,7 +2164,7 @@ static void op8024(Program* program) } // 0x46BA10 -static void op801E(Program* program) +static void opPopAddress(Program* program) { programReturnStackPopValue(program); } @@ -2540,17 +2540,17 @@ void interpreterRegisterOpcodeHandlers() interpreterRegisterOpcode(OPCODE_SWAPA, opSwapReturnStack); interpreterRegisterOpcode(OPCODE_POP, opPop); interpreterRegisterOpcode(OPCODE_DUP, opDuplicate); - interpreterRegisterOpcode(OPCODE_POP_RETURN, op801C); - interpreterRegisterOpcode(OPCODE_POP_EXIT, op801D); - interpreterRegisterOpcode(OPCODE_POP_ADDRESS, op801E); - interpreterRegisterOpcode(OPCODE_POP_FLAGS, op801F); - interpreterRegisterOpcode(OPCODE_POP_FLAGS_RETURN, op8020); - interpreterRegisterOpcode(OPCODE_POP_FLAGS_EXIT, op8021); - interpreterRegisterOpcode(OPCODE_POP_FLAGS_RETURN_EXTERN, op8022); - interpreterRegisterOpcode(OPCODE_POP_FLAGS_EXIT_EXTERN, op8023); - interpreterRegisterOpcode(OPCODE_POP_FLAGS_RETURN_VAL_EXTERN, op8024); - interpreterRegisterOpcode(OPCODE_POP_FLAGS_RETURN_VAL_EXIT, op8025); - interpreterRegisterOpcode(OPCODE_POP_FLAGS_RETURN_VAL_EXIT_EXTERN, op8026); + interpreterRegisterOpcode(OPCODE_POP_RETURN, opPopReturn); + interpreterRegisterOpcode(OPCODE_POP_EXIT, opPopExit); + interpreterRegisterOpcode(OPCODE_POP_ADDRESS, opPopAddress); + interpreterRegisterOpcode(OPCODE_POP_FLAGS, opPopFlags); + interpreterRegisterOpcode(OPCODE_POP_FLAGS_RETURN, opPopFlagsReturn); + interpreterRegisterOpcode(OPCODE_POP_FLAGS_EXIT, opPopFlagsExit); + interpreterRegisterOpcode(OPCODE_POP_FLAGS_RETURN_EXTERN, opPopFlagsReturnExtern); + interpreterRegisterOpcode(OPCODE_POP_FLAGS_EXIT_EXTERN, opPopFlagsExitExtern); + interpreterRegisterOpcode(OPCODE_POP_FLAGS_RETURN_VAL_EXTERN, opPopFlagsReturnValExtern); + interpreterRegisterOpcode(OPCODE_POP_FLAGS_RETURN_VAL_EXIT, opPopFlagsReturnValExit); + interpreterRegisterOpcode(OPCODE_POP_FLAGS_RETURN_VAL_EXIT_EXTERN, opPopFlagsReturnValExitExtern); interpreterRegisterOpcode(OPCODE_CHECK_PROCEDURE_ARGUMENT_COUNT, opCheckProcedureArgumentCount); interpreterRegisterOpcode(OPCODE_LOOKUP_PROCEDURE_BY_NAME, opLookupStringProc); interpreterRegisterOpcode(OPCODE_POP_BASE, opPopBase); diff --git a/src/interpreter_extra.cc b/src/interpreter_extra.cc index 12f3222..b2d3295 100644 --- a/src/interpreter_extra.cc +++ b/src/interpreter_extra.cc @@ -3098,8 +3098,7 @@ static void _op_inven_cmds(Program* program) break; } } else { - // FIXME: Should be inven_cmds. - scriptPredefinedError(program, "anim", SCRIPT_ERROR_OBJECT_IS_NULL); + scriptPredefinedError(program, "inven_cmds", SCRIPT_ERROR_OBJECT_IS_NULL); } programStackPushPointer(program, item); @@ -3657,7 +3656,8 @@ static void opRemoveMultipleObjectsFromInventory(Program* program) Object* owner = static_cast(programStackPopPointer(program)); if (owner == NULL || item == NULL) { - // FIXME: Ruined stack. + scriptPredefinedError(program, "rm_mult_objs_from_inven", SCRIPT_ERROR_OBJECT_IS_NULL); + programStackPushInteger(program, 0); return; } From 42c541012c3ba8a58b9441b6bc38f9b15d1dabc1 Mon Sep 17 00:00:00 2001 From: Vasilii Rogin Date: Tue, 23 May 2023 23:50:37 +0300 Subject: [PATCH 6/9] Fix crash in _map_age_dead_critters (#258) Co-authored-by: Alexander Batalov --- src/object.cc | 43 ++++++++++++++++++++++--------------------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/src/object.cc b/src/object.cc index 60b3bd3..a597a76 100644 --- a/src/object.cc +++ b/src/object.cc @@ -2133,27 +2133,18 @@ Object* objectFindFirst() { gObjectFindElevation = 0; - ObjectListNode* objectListNode; for (gObjectFindTile = 0; gObjectFindTile < HEX_GRID_SIZE; gObjectFindTile++) { - objectListNode = gObjectListHeadByTile[gObjectFindTile]; - if (objectListNode) { - break; + ObjectListNode* objectListNode = gObjectListHeadByTile[gObjectFindTile]; + while (objectListNode != NULL) { + Object* object = objectListNode->obj; + if (!artIsObjectTypeHidden(FID_TYPE(object->fid))) { + gObjectFindLastObjectListNode = objectListNode; + return object; + } + objectListNode = objectListNode->next; } } - if (gObjectFindTile == HEX_GRID_SIZE) { - gObjectFindLastObjectListNode = NULL; - return NULL; - } - - while (objectListNode != NULL) { - if (artIsObjectTypeHidden(FID_TYPE(objectListNode->obj->fid)) == 0) { - gObjectFindLastObjectListNode = objectListNode; - return objectListNode->obj; - } - objectListNode = objectListNode->next; - } - gObjectFindLastObjectListNode = NULL; return NULL; } @@ -2167,9 +2158,14 @@ Object* objectFindNext() ObjectListNode* objectListNode = gObjectFindLastObjectListNode->next; - while (gObjectFindTile < HEX_GRID_SIZE) { + while (true) { if (objectListNode == NULL) { - objectListNode = gObjectListHeadByTile[gObjectFindTile++]; + gObjectFindTile++; + if (gObjectFindTile >= HEX_GRID_SIZE) { + break; + } + + objectListNode = gObjectListHeadByTile[gObjectFindTile]; } while (objectListNode != NULL) { @@ -2219,9 +2215,14 @@ Object* objectFindNextAtElevation() ObjectListNode* objectListNode = gObjectFindLastObjectListNode->next; - while (gObjectFindTile < HEX_GRID_SIZE) { + while (true) { if (objectListNode == NULL) { - objectListNode = gObjectListHeadByTile[gObjectFindTile++]; + gObjectFindTile++; + if (gObjectFindTile >= HEX_GRID_SIZE) { + break; + } + + objectListNode = gObjectListHeadByTile[gObjectFindTile]; } while (objectListNode != NULL) { From 53a4437be951f75b10a6d4acb73137868cb59b13 Mon Sep 17 00:00:00 2001 From: Vasilii Rogin Date: Tue, 23 May 2023 23:51:04 +0300 Subject: [PATCH 7/9] Remove trailing comma after reading strParseIntWithKey (#259) --- src/string_parsers.cc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/string_parsers.cc b/src/string_parsers.cc index e0d4b62..092b87f 100644 --- a/src/string_parsers.cc +++ b/src/string_parsers.cc @@ -208,6 +208,10 @@ int strParseIntWithKey(char** stringPtr, const char* key, int* valuePtr, const c *(str + v4) = tmp2; *(str + v2) = tmp1; + if (**stringPtr == ',') { + *stringPtr = *stringPtr + 1; + } + return result; } From 70b0b6166444c11901b345835e4e57293b0695ec Mon Sep 17 00:00:00 2001 From: Vasilii Rogin Date: Wed, 24 May 2023 21:32:09 +0300 Subject: [PATCH 8/9] Delete critter from combat during _partyFixMultipleMembers (#277) Co-authored-by: Alexander Batalov --- src/party_member.cc | 102 ++++++++++++++++++++------------------------ 1 file changed, 46 insertions(+), 56 deletions(-) diff --git a/src/party_member.cc b/src/party_member.cc index b01e441..b4474c8 100644 --- a/src/party_member.cc +++ b/src/party_member.cc @@ -6,6 +6,7 @@ #include "animation.h" #include "color.h" +#include "combat.h" #include "combat_ai.h" #include "combat_ai_defs.h" #include "config.h" @@ -80,7 +81,7 @@ static int _partyMemberPrepItemSave(Object* object); static int _partyMemberItemSave(Object* object); static int _partyMemberItemRecover(STRUCT_519DA8* a1); static int _partyMemberClearItemList(); -static int _partyFixMultipleMembers(); +static int partyFixMultipleMembers(); static int _partyMemberCopyLevelInfo(Object* object, int a2); // 0x519D9C @@ -655,7 +656,7 @@ int _partyMemberRecoverLoad() _partyStatePrepped = 0; if (!_isLoadingGame()) { - _partyFixMultipleMembers(); + partyFixMultipleMembers(); } return 0; @@ -759,7 +760,7 @@ int partyMembersLoad(File* stream) } } - _partyFixMultipleMembers(); + partyFixMultipleMembers(); for (int index = 1; index < gPartyMemberDescriptionsLength; index++) { STRU_519DBC* ptr_519DBC = &(_partyMemberLevelUpInfoList[index]); @@ -1196,16 +1197,14 @@ int partyGetBestSkillValue(int skill) } // 0x495620 -static int _partyFixMultipleMembers() +static int partyFixMultipleMembers() { debugPrint("\n\n\n[Party Members]:"); + // NOTE: Original code is slightly different (uses two nested loops). int critterCount = 0; - for (Object* obj = objectFindFirst(); obj != NULL; obj = objectFindNext()) { - if (PID_TYPE(obj->pid) == OBJ_TYPE_CRITTER) { - critterCount++; - } - + Object* obj = objectFindFirst(); + while (obj != NULL) { bool isPartyMember = false; for (int index = 1; index < gPartyMemberDescriptionsLength; index++) { if (obj->pid == gPartyMemberPids[index]) { @@ -1214,61 +1213,52 @@ static int _partyFixMultipleMembers() } } - if (!isPartyMember) { - continue; - } + if (isPartyMember) { + debugPrint("\n PM: %s", critterGetName(obj)); - debugPrint("\n PM: %s", critterGetName(obj)); - - bool v19 = false; - if (obj->sid == -1) { - v19 = true; - } else { - Object* v7 = NULL; - for (int i = 0; i < gPartyMembersLength; i++) { - if (obj->pid == gPartyMembers[i].object->pid) { - v7 = gPartyMembers[i].object; - break; + bool remove = false; + if (obj->sid == -1) { + remove = true; + } else { + // NOTE: Uninline. + Object* partyMember = partyMemberFindByPid(obj->pid); + if (partyMember != NULL && partyMember != obj) { + if (partyMember->sid == obj->sid) { + obj->sid = -1; + } + remove = true; } } - if (v7 != NULL && obj != v7) { - if (v7->sid == obj->sid) { - obj->sid = -1; + if (remove) { + // NOTE: Uninline. + if (obj != partyMemberFindByPid(obj->pid)) { + debugPrint("\nDestroying evil critter doppleganger!"); + + if (obj->sid != -1) { + scriptRemove(obj->sid); + obj->sid = -1; + } else { + if (queueRemoveEventsByType(obj, EVENT_TYPE_SCRIPT) == -1) { + debugPrint("\nERROR Removing Timed Events on FIX remove!!\n"); + } + } + + _combat_delete_critter(obj); + + objectDestroy(obj, NULL); + + // Start over. + critterCount = 0; + obj = objectFindFirst(); + continue; + } else { + debugPrint("\nError: Attempting to destroy evil critter doppleganger FAILED!"); } - v19 = true; } } - if (!v19) { - continue; - } - - Object* v10 = NULL; - for (int i = 0; i < gPartyMembersLength; i++) { - if (obj->pid == gPartyMembers[i].object->pid) { - v10 = gPartyMembers[i].object; - } - } - - // TODO: Probably wrong. - if (obj == v10) { - debugPrint("\nError: Attempting to destroy evil critter doppleganger FAILED!"); - continue; - } - - debugPrint("\nDestroying evil critter doppleganger!"); - - if (obj->sid != -1) { - scriptRemove(obj->sid); - obj->sid = -1; - } else { - if (queueRemoveEventsByType(obj, EVENT_TYPE_SCRIPT) == -1) { - debugPrint("\nERROR Removing Timed Events on FIX remove!!\n"); - } - } - - objectDestroy(obj, NULL); + obj = objectFindNext(); } for (int index = 0; index < gPartyMembersLength; index++) { From 62c5c4757c6886f7d3e5a0d3ca3d10e57b9e4c1a Mon Sep 17 00:00:00 2001 From: Alexander Batalov Date: Wed, 24 May 2023 21:52:50 +0300 Subject: [PATCH 9/9] Fix comparing pointers and integers See #189 --- src/interpreter.cc | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/interpreter.cc b/src/interpreter.cc index 59534ec..caac822 100644 --- a/src/interpreter.cc +++ b/src/interpreter.cc @@ -932,7 +932,7 @@ static void opConditionalOperatorNotEqual(Program* program) result = value[1].integerValue != value[0].integerValue; break; case VALUE_TYPE_PTR: - result = (intptr_t)(value[1].integerValue) != (intptr_t)(value[0].pointerValue); + result = (uintptr_t)(value[1].integerValue) != (uintptr_t)(value[0].pointerValue); break; default: assert(false && "Should be unreachable"); @@ -941,7 +941,7 @@ static void opConditionalOperatorNotEqual(Program* program) case VALUE_TYPE_PTR: switch (value[0].opcode) { case VALUE_TYPE_INT: - result = (intptr_t)(value[1].pointerValue) != (intptr_t)(value[0].integerValue); + result = (uintptr_t)(value[1].pointerValue) != (uintptr_t)(value[0].integerValue); break; case VALUE_TYPE_PTR: result = value[1].pointerValue != value[0].pointerValue; @@ -1028,7 +1028,7 @@ static void opConditionalOperatorEqual(Program* program) result = value[1].integerValue == value[0].integerValue; break; case VALUE_TYPE_PTR: - result = (intptr_t)(value[1].integerValue) == (intptr_t)(value[0].pointerValue); + result = (uintptr_t)(value[1].integerValue) == (uintptr_t)(value[0].pointerValue); break; default: assert(false && "Should be unreachable"); @@ -1037,7 +1037,7 @@ static void opConditionalOperatorEqual(Program* program) case VALUE_TYPE_PTR: switch (value[0].opcode) { case VALUE_TYPE_INT: - result = (intptr_t)(value[1].pointerValue) == (intptr_t)(value[0].integerValue); + result = (uintptr_t)(value[1].pointerValue) == (uintptr_t)(value[0].integerValue); break; case VALUE_TYPE_PTR: result = value[1].pointerValue == value[0].pointerValue; @@ -1131,7 +1131,7 @@ static void opConditionalOperatorLessThanEquals(Program* program) case VALUE_TYPE_PTR: switch (value[0].opcode) { case VALUE_TYPE_INT: - result = (intptr_t)value[1].pointerValue <= (intptr_t)value[0].integerValue; + result = (uintptr_t)value[1].pointerValue <= (uintptr_t)value[0].integerValue; break; default: assert(false && "Should be unreachable"); @@ -1385,7 +1385,7 @@ static void opConditionalOperatorGreaterThan(Program* program) case VALUE_TYPE_PTR: switch (value[0].opcode) { case VALUE_TYPE_INT: - result = (intptr_t)value[1].pointerValue > (intptr_t)value[0].integerValue; + result = (uintptr_t)value[1].pointerValue > (uintptr_t)value[0].integerValue; break; default: assert(false && "Should be unreachable");