Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2013-12-23 19:37:39 +0400
committerSergey Sharybin <sergey.vfx@gmail.com>2013-12-23 19:37:39 +0400
commit890be761f58ee5f388ef52b19eab82d3dcd33718 (patch)
tree2e3ec4e76d1407e97bd9d35cfa1a47ab47952b9f /source/blender/makesdna/intern
parentc9c0d11f2ada314868a806f4884b2d12058e75bf (diff)
Make makesdna capable of detecting 32bit alignment issues on 64bit platform
Summary: Just some extra comparison between native and 32bit structure length was needed. Reviewers: brecht, campbellbarton Reviewed By: brecht Differential Revision: http://developer.blender.org/D131
Diffstat (limited to 'source/blender/makesdna/intern')
-rw-r--r--source/blender/makesdna/intern/makesdna.c16
1 files changed, 13 insertions, 3 deletions
diff --git a/source/blender/makesdna/intern/makesdna.c b/source/blender/makesdna/intern/makesdna.c
index 39bf5ec437f..35be44c4090 100644
--- a/source/blender/makesdna/intern/makesdna.c
+++ b/source/blender/makesdna/intern/makesdna.c
@@ -148,6 +148,7 @@ static int nr_structs = 0;
static char **names, *namedata; /* at address names[a] is string a */
static char **types, *typedata; /* at address types[a] is string a */
static short *typelens_native; /* at typelens[a] is the length of type 'a' on this systems bitness (32 or 64) */
+static short *typelens_32; /* contains sizes as they are calculated on 32 bit systems */
static short *typelens_64; /* contains sizes as they are calculated on 64 bit systems */
static short **structs, *structdata; /* at sp = structs[a] is the first address of a struct definition
* sp[0] is type number
@@ -246,6 +247,7 @@ static int add_type(const char *str, int len)
if (strcmp(str, types[nr]) == 0) {
if (len) {
typelens_native[nr] = len;
+ typelens_32[nr] = len;
typelens_64[nr] = len;
}
return nr;
@@ -262,6 +264,7 @@ static int add_type(const char *str, int len)
strcpy(cp, str);
types[nr_types] = cp;
typelens_native[nr_types] = len;
+ typelens_32[nr_types] = len;
typelens_64[nr_types] = len;
if (nr_types >= maxnr) {
@@ -720,7 +723,7 @@ static int arraysize(const char *str)
static int calculate_structlens(int firststruct)
{
- int a, b, len_native, len_64, unknown = nr_structs, lastunknown, structtype, type, mul, namelen;
+ int a, b, len_native, len_32, len_64, unknown = nr_structs, lastunknown, structtype, type, mul, namelen;
short *sp, *structpoin;
const char *cp;
int has_pointer, dna_error = 0;
@@ -739,6 +742,7 @@ static int calculate_structlens(int firststruct)
sp = structpoin + 2;
len_native = 0;
+ len_32 = 0;
len_64 = 0;
has_pointer = 0;
@@ -780,6 +784,7 @@ static int calculate_structlens(int firststruct)
}
len_native += sizeof(void *) * mul;
+ len_32 += 4 * mul;
len_64 += 8 * mul;
}
@@ -821,11 +826,13 @@ static int calculate_structlens(int firststruct)
}
len_native += mul * typelens_native[type];
+ len_32 += mul * typelens_32[type];
len_64 += mul * typelens_64[type];
}
else {
len_native = 0;
+ len_32 = 0;
len_64 = 0;
break;
}
@@ -836,10 +843,11 @@ static int calculate_structlens(int firststruct)
}
else {
typelens_native[structtype] = len_native;
+ typelens_32[structtype] = len_32;
typelens_64[structtype] = len_64;
/* two ways to detect if a struct contains a pointer:
- * has_pointer is set or len_64 != len_native */
- if (has_pointer || len_64 != len_native) {
+ * has_pointer is set or len_native doesn't match any of 32/64bit lengths*/
+ if (has_pointer || len_64 != len_native || len_32 != len_native) {
if (len_64 % 8) {
printf("Sizeerror 8 in struct: %s (add %d bytes)\n", types[structtype], len_64 % 8);
dna_error = 1;
@@ -961,6 +969,7 @@ static int make_structDNA(const char *baseDirectory, FILE *file)
names = MEM_callocN(sizeof(char *) * maxnr, "names");
types = MEM_callocN(sizeof(char *) * maxnr, "types");
typelens_native = MEM_callocN(sizeof(short) * maxnr, "typelens_native");
+ typelens_32 = MEM_callocN(sizeof(short) * maxnr, "typelens_64");
typelens_64 = MEM_callocN(sizeof(short) * maxnr, "typelens_64");
structs = MEM_callocN(sizeof(short *) * maxnr, "structs");
@@ -1127,6 +1136,7 @@ static int make_structDNA(const char *baseDirectory, FILE *file)
MEM_freeN(names);
MEM_freeN(types);
MEM_freeN(typelens_native);
+ MEM_freeN(typelens_32);
MEM_freeN(typelens_64);
MEM_freeN(structs);