[Scummvm-git-logs] scummvm master -> 23278f7f3b93fb693868dcf579591ade48528165

dreammaster noreply at scummvm.org
Tue Dec 26 09:06:27 UTC 2023


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
23278f7f3b M4: Work around pointers > 4 bytes screwing up convs


Commit: 23278f7f3b93fb693868dcf579591ade48528165
    https://github.com/scummvm/scummvm/commit/23278f7f3b93fb693868dcf579591ade48528165
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2023-12-25T23:06:11-10:00

Commit Message:
M4: Work around pointers > 4 bytes screwing up convs

This solution adds an array of pointers into Conv,
and decl_chunk now has a 32-bit array index rather
than a pointer

Changed paths:
    engines/m4/adv_r/conv.cpp
    engines/m4/adv_r/conv.h
    engines/m4/adv_r/conv_io.cpp
    engines/m4/adv_r/conv_io.h


diff --git a/engines/m4/adv_r/conv.cpp b/engines/m4/adv_r/conv.cpp
index 5d5debd71f3..a0fd63fce14 100644
--- a/engines/m4/adv_r/conv.cpp
+++ b/engines/m4/adv_r/conv.cpp
@@ -78,18 +78,18 @@ static void conv_exec_entry(int32 offset, Conv *c) {
 			c_asgn = get_c_asgn(c, i);
 
 			decl = get_decl(c, c_asgn->c_op_l);
-			l_op = conv_get_decl_val(decl);
+			l_op = conv_get_decl_val(c, decl);
 
 			if (conv_ops_cond_successful(l_op, c_asgn->c_op, c_asgn->c_op_r)) {
 				decl = get_decl(c, c_asgn->index);
-				conv_set_decl_val(decl, conv_ops_process_asgn(conv_get_decl_val(decl), c_asgn->op, c_asgn->opnd1));
+				conv_set_decl_val(c, decl, conv_ops_process_asgn(conv_get_decl_val(c, decl), c_asgn->op, c_asgn->opnd1));
 			}
 			break;
 
 		case ASGN_CHUNK:
 			asgn = get_asgn(c, i);
 			decl = get_decl(c, asgn->index);
-			conv_set_decl_val(decl, conv_ops_process_asgn(conv_get_decl_val(decl), asgn->op, asgn->opnd1));
+			conv_set_decl_val(c, decl, conv_ops_process_asgn(conv_get_decl_val(c, decl), asgn->op, asgn->opnd1));
 			break;
 
 		case HIDE_CHUNK:
@@ -105,7 +105,7 @@ static void conv_exec_entry(int32 offset, Conv *c) {
 			entry = get_hash_entry(c, c_misc->index);
 
 			decl = get_decl(c, c_misc->c_op_l);
-			l_op = conv_get_decl_val(decl);
+			l_op = conv_get_decl_val(c, decl);
 
 			if (conv_ops_cond_successful(l_op, c_misc->c_op, c_misc->c_op_r)) {
 				if (!(entry->status & DESTROYED))
@@ -127,7 +127,7 @@ static void conv_exec_entry(int32 offset, Conv *c) {
 			entry = get_hash_entry(c, c_misc->index);
 
 			decl = get_decl(c, c_misc->c_op_l);
-			l_op = conv_get_decl_val(decl);
+			l_op = conv_get_decl_val(c, decl);
 
 			if (conv_ops_cond_successful(l_op, c_misc->c_op, c_misc->c_op_r)) {
 				if (!(entry->status & DESTROYED)) {
@@ -148,7 +148,7 @@ static void conv_exec_entry(int32 offset, Conv *c) {
 			entry = get_hash_entry(c, c_misc->index);
 
 			decl = get_decl(c, c_misc->c_op_l);
-			l_op = conv_get_decl_val(decl);
+			l_op = conv_get_decl_val(c, decl);
 
 			if (conv_ops_cond_successful(l_op, c_misc->c_op, c_misc->c_op_r))
 				entry->status |= DESTROYED;
@@ -158,7 +158,7 @@ static void conv_exec_entry(int32 offset, Conv *c) {
 			c_goto = get_c_goto(c, i);
 			decl = get_decl(c, c_goto->opnd1);
 
-			l_op = conv_get_decl_val(decl);
+			l_op = conv_get_decl_val(c, decl);
 			r_op = c_goto->opnd2; //val
 
 			if (conv_ops_cond_successful(l_op, c_goto->op, r_op)) {
@@ -171,7 +171,7 @@ static void conv_exec_entry(int32 offset, Conv *c) {
 			c_goto = get_c_goto(c, i);
 			decl = get_decl(c, c_goto->opnd1);
 
-			l_op = conv_get_decl_val(decl);
+			l_op = conv_get_decl_val(c, decl);
 			r_op = c_goto->opnd2; //val
 
 			if (conv_ops_cond_successful(l_op, c_goto->op, r_op)) {
@@ -325,7 +325,7 @@ static int conv_get_mesg(int32 offset, int32 is_valid, Conv *c) {
 			c_reply = get_c_reply(c, i);
 			decl = get_decl(c, c_reply->op_l);
 
-			l_op = conv_get_decl_val(decl);
+			l_op = conv_get_decl_val(c, decl);
 			r_op = c_reply->op_r; //val
 
 			if (is_valid && conv_ops_cond_successful(l_op, c_reply->op, r_op)) {
diff --git a/engines/m4/adv_r/conv.h b/engines/m4/adv_r/conv.h
index cfffe1c9c39..0c82cf41bd7 100644
--- a/engines/m4/adv_r/conv.h
+++ b/engines/m4/adv_r/conv.h
@@ -23,6 +23,7 @@
 #ifndef M4_ADV_R_CONV_H
 #define M4_ADV_R_CONV_H
 
+#include "common/array.h"
 #include "m4/m4_types.h"
 
 namespace M4 {
@@ -84,14 +85,15 @@ namespace M4 {
 
 
 struct Conv {
-	int32 chunkSize;
-	char *conv;
-	int32 myCNode;
-	int32 exit_now;
-	int32 node_hash;
-
-	int32 mode;
-	int32 c_entry_num;
+	int32 chunkSize = 0;
+	char *conv = nullptr;
+	int32 myCNode = 0;
+	int32 exit_now = 0;
+	int32 node_hash = 0;
+
+	int32 mode = 0;
+	int32 c_entry_num = 0;
+	Common::Array<int32 *> _pointers;
 };
 
 struct ConvDisplayData {
@@ -115,7 +117,7 @@ struct decl_chunk {
 	int32 tag;
 	int32 val;
 	int32 flags;
-	int32 *addr;
+	int32 addrIndex;	// Index into Conv::_pointers array
 } PACKED_STRUCT;
 
 struct fall_chunk {
diff --git a/engines/m4/adv_r/conv_io.cpp b/engines/m4/adv_r/conv_io.cpp
index 8f5df9137cc..4c563c1c3fa 100644
--- a/engines/m4/adv_r/conv_io.cpp
+++ b/engines/m4/adv_r/conv_io.cpp
@@ -174,21 +174,21 @@ int conv_toggle_flags(entry_chunk *entry) {
 	return entry->status;
 }
 
-int32 conv_get_decl_val(decl_chunk *decl) {
+int32 conv_get_decl_val(Conv *c, decl_chunk *decl) {
 	switch (decl->flags) {
 	case DECL_POINTER:
-		return *decl->addr;
+		return *c->_pointers[decl->addrIndex];
 
 	default:
 		return decl->val;
 	}
 }
 
-void conv_set_decl_val(decl_chunk *decl, int32 val) {
+void conv_set_decl_val(Conv *c, decl_chunk *decl, int32 val) {
 	switch (decl->flags) {
 	case DECL_POINTER:
 		decl->val = val;
-		*decl->addr = val;
+		*c->_pointers[decl->addrIndex] = val;
 		break;
 
 	default:
@@ -217,7 +217,7 @@ void conv_export_value(Conv *c, int32 val, int index) {
 		case DECL_CHUNK:
 			if (i == index) {
 				decl = get_decl(c, ent);
-				conv_set_decl_val(decl, val);
+				conv_set_decl_val(c, decl, val);
 			}
 			i++;
 			break;
@@ -254,7 +254,9 @@ void conv_export_pointer(Conv *c, int32 *val, int index) {
 		case DECL_CHUNK:
 			if (i == index) {
 				decl = get_decl(c, ent);
-				decl->addr = val;
+
+				c->_pointers.push_back(val);
+				decl->addrIndex = c->_pointers.size() - 1;
 				decl->flags = DECL_POINTER;
 			}
 			i++;
@@ -476,15 +478,14 @@ static void conv_save_state(Conv *c) {
 	int32 val = 0;
 	entry_chunk *entry = nullptr;
 
-	while (ent < c->chunkSize)
-	{
+	while (ent < c->chunkSize) {
 		conv_ops_get_entry(ent, &next, &tag, c);
 		decl_chunk *decl; 	// declared here for the benefit of Watcom 10.0 not liking to scope things into switches
 
 		switch (tag) {
 		case DECL_CHUNK:
 			decl = get_decl(c, ent);
-			val = conv_get_decl_val(decl);
+			val = conv_get_decl_val(c, decl);
 
 			memcpy(&conv_save_buff[offset], &val, sizeof(int32));
 			offset += sizeof(int32);
@@ -617,7 +618,7 @@ static Conv *conv_restore_state(Conv *c) {
 			offset += sizeof(int32);
 			decl = get_decl(c, ent);
 
-			conv_set_decl_val(decl, val);
+			conv_set_decl_val(c, decl, val);
 			break;
 
 		default:
@@ -771,7 +772,7 @@ Conv *conv_load(const char *filename, int x1, int y1, int32 myTrigger, bool want
 		conv_unload();
 	}
 
-	convers = (Conv *)mem_alloc(sizeof(Conv), "Conv struct");
+	convers = new Conv();
 
 	if (!convers) {
 		conv_set_handle(nullptr);
@@ -857,7 +858,7 @@ void conv_unload(Conv *c) {
 	if (c) {
 		if (c->conv)
 			mem_free(c->conv);
-		mem_free(c);
+		delete c;
 	}
 
 	_GC(globConv) = c = nullptr;
diff --git a/engines/m4/adv_r/conv_io.h b/engines/m4/adv_r/conv_io.h
index e5e72dd96c4..c672dcd54cd 100644
--- a/engines/m4/adv_r/conv_io.h
+++ b/engines/m4/adv_r/conv_io.h
@@ -89,10 +89,6 @@ struct Converstation_Globals {
 	void syncGame(Common::Serializer &s);
 
 	void conv_reset_all();
-	void conv_reset(const char *filename);
-
-	void conv_play(Conv *c);
-	void conv_go(Conv *c);
 };
 
 Conv *conv_load(const char *filename, int x1, int y1, int32 myTrigger, bool want_box = true);
@@ -117,8 +113,8 @@ const char *get_conv_name();
 const char *conv_sound_to_play();
 int32 conv_whos_talking();
 
-int32 conv_get_decl_val(decl_chunk *decl);
-void conv_set_decl_val(decl_chunk *decl, int32 val);
+int32 conv_get_decl_val(Conv *c, decl_chunk *decl);
+void conv_set_decl_val(Conv *c, decl_chunk *decl, int32 val);
 void conv_export_value(Conv *c, int32 val, int index);
 void conv_export_value_curr(int32 val, int index);
 void conv_export_pointer(Conv *c, int32 *val, int index);




More information about the Scummvm-git-logs mailing list