Skip to content

Commit

Permalink
Some fixes to be able to mix RML and MM datatypes (and change the MM …
Browse files Browse the repository at this point in the history
…representation with a #define)

git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@18010 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
sjoelund committed Nov 5, 2013
1 parent 5cf2076 commit 8747410
Show file tree
Hide file tree
Showing 4 changed files with 59 additions and 31 deletions.
52 changes: 27 additions & 25 deletions Compiler/runtime/Dynload.cpp
Expand Up @@ -77,7 +77,7 @@ static int value_to_type_desc(void *value, type_description *desc)
void *data = RML_STRUCTDATA(value)[UNBOX_OFFSET];
int len = RML_HDRSTRLEN(RML_GETHDR(data));
desc->type = TYPE_DESC_STRING;
desc->data.string = init_modelica_string(RML_STRINGDATA(data));
desc->data.string = GC_strdup(RML_STRINGDATA(data));
}; break;
case Values__ARRAY_3dBOX2: {
void *data = RML_STRUCTDATA(value)[UNBOX_OFFSET];
Expand Down Expand Up @@ -344,27 +344,27 @@ static int mmc_to_value(void* mmc, void** res)
unsigned ctor;
int i;
void* t;
if (0 == ((long)mmc & 1)) {
*res = Values__INTEGER(mmc);
if (MMC_IS_INTEGER(mmc)) {
*res = Values__INTEGER(mk_icon(MMC_UNTAGFIXNUM(mmc)));
return 0;
}
hdr = RML_GETHDR(mmc);
if (hdr == RML_REALHDR) {
hdr = MMC_GETHDR(mmc);
if (hdr == MMC_REALHDR) {
*res = Values__REAL(mk_rcon(mmc_unbox_real(mmc)));
return 0;
}
if (RML_HDRISSTRING(hdr)) {
if (MMC_HDRISSTRING(hdr)) {
MMC_CHECK_STRING(mmc);
// We need to duplicate the string because literals may not be accessible anymore... Bleh
*res = Values__STRING(mk_scon(MMC_STRINGDATA(mmc)));
return 0;
}
if (hdr == RML_NILHDR) {
if (hdr == MMC_NILHDR) {
*res = Values__LIST(mk_nil());
return 0;
}

numslots = RML_HDRSLOTS(hdr);
numslots = MMC_HDRSLOTS(hdr);
ctor = 255 & (hdr >> 2);


Expand All @@ -381,10 +381,10 @@ static int mmc_to_value(void* mmc, void** res)
if (numslots>0 && ctor > 1) { /* RECORD */
void *namelst = (void *) mk_nil();
void *varlst = (void *) mk_nil();
struct record_description* desc = (struct record_description*) RML_FETCH(RML_OFFSET(RML_UNTAGPTR(mmc),1));
struct record_description* desc = (struct record_description*) MMC_FETCH(MMC_OFFSET(MMC_UNTAGPTR(mmc),1));
assert(desc != NULL);
for (i=numslots; i>1; i--) {
assert(0 == mmc_to_value(RML_FETCH(RML_OFFSET(RML_UNTAGPTR(mmc),i)),&t));
assert(0 == mmc_to_value(MMC_FETCH(MMC_OFFSET(MMC_UNTAGPTR(mmc),i)),&t));
varlst = mk_cons(t, varlst);
t = (void*) desc->fieldNames[i-2];
namelst = mk_cons(mk_scon(t != NULL ? (const char*) t : "(null)"), namelst);
Expand All @@ -397,7 +397,7 @@ static int mmc_to_value(void* mmc, void** res)
if (numslots>0 && ctor == 0) { /* TUPLE */
void *varlst = (void *) mk_nil();
for (i=numslots; i>0; i--) {
assert(0 == mmc_to_value(RML_FETCH(RML_OFFSET(RML_UNTAGPTR(mmc),i)),&t));
assert(0 == mmc_to_value(MMC_FETCH(MMC_OFFSET(MMC_UNTAGPTR(mmc),i)),&t));
varlst = mk_cons(t, varlst);
}
*res = (void *) Values__META_5fTUPLE(varlst);
Expand All @@ -410,7 +410,7 @@ static int mmc_to_value(void* mmc, void** res)
}

if (numslots==1 && ctor==1) /* SOME(x) */ {
assert(0 == mmc_to_value(RML_FETCH(RML_OFFSET(RML_UNTAGPTR(mmc),1)),&t));
assert(0 == mmc_to_value(MMC_FETCH(MMC_OFFSET(MMC_UNTAGPTR(mmc),1)),&t));
*res = Values__OPTION(mk_some(t));
return 0;
}
Expand All @@ -437,10 +437,12 @@ static void *value_to_mmc(void* value)
{
switch (RML_HDRCTOR(RML_GETHDR(value))) {
case Values__INTEGER_3dBOX1:
case Values__BOOL_3dBOX1:
case Values__BOOL_3dBOX1: {
return mmc_mk_icon(RML_UNTAGFIXNUM(RML_STRUCTDATA(value)[UNBOX_OFFSET+0]));
};
case Values__STRING_3dBOX1: {
void *data = RML_STRUCTDATA(value)[UNBOX_OFFSET+0];
return data;
return mmc_mk_scon(RML_STRINGDATA(data));
};
case Values__REAL_3dBOX1: {
void *data = RML_STRUCTDATA(value)[UNBOX_OFFSET+0];
Expand All @@ -463,7 +465,7 @@ static void *value_to_mmc(void* value)
fprintf(stderr, "[dynload]: value_to_mmc: malloc failed\n");
return 0;
}
while (!MMC_NILTEST(tmp)) {
while (RML_GETHDR(tmp) != RML_NILHDR) {
i++; tmp = RML_CDR(tmp);
}
/* duplicate string? will this give problems with GC? */
Expand All @@ -473,9 +475,9 @@ static void *value_to_mmc(void* value)
data_mmc = (void**) malloc((i+1)*sizeof(void*));
i=0;
data_mmc[0] = desc;
while (!MMC_NILTEST(names)) {
while (RML_GETHDR(names) != RML_NILHDR) {
desc->fieldNames[i] = RML_STRINGDATA(RML_CAR(names));
names = MMC_CDR(names);
names = RML_CDR(names);
data_mmc[i+1] = value_to_mmc(RML_CAR(data));
i++;
data = MMC_CDR(data);
Expand All @@ -491,19 +493,19 @@ static void *value_to_mmc(void* value)
case Values__LIST_3dBOX1: {
void* data = RML_STRUCTDATA(value)[UNBOX_OFFSET+0];
void* tmp = mmc_mk_nil();
while (!MMC_NILTEST(data)) {
tmp = mmc_mk_cons(value_to_mmc(MMC_CAR(data)), tmp);
data = MMC_CDR(data);
while (RML_GETHDR(data) != RML_NILHDR) {
tmp = mmc_mk_cons(value_to_mmc(RML_CAR(data)), tmp);
data = RML_CDR(data);
}
/* Transform list by first reversing it to preserve the order */
return listReverse(tmp);
};
case Values__META_5fARRAY_3dBOX1: {
void* data = RML_STRUCTDATA(value)[UNBOX_OFFSET+0];
void* tmp = mmc_mk_nil();
while (!MMC_NILTEST(data)) {
tmp = mmc_mk_cons(value_to_mmc(MMC_CAR(data)), tmp);
data = MMC_CDR(data);
while (RML_GETHDR(data) != RML_NILHDR) {
tmp = mmc_mk_cons(value_to_mmc(RML_CAR(data)), tmp);
data = RML_CDR(data);
}
return listArray(listReverse(tmp));
};
Expand All @@ -514,13 +516,13 @@ static void *value_to_mmc(void* value)
void **data_mmc;
void *res;

while (!MMC_NILTEST(tmp)) {
while (RML_GETHDR(tmp) != RML_NILHDR) {
len++; tmp = RML_CDR(tmp);
}
data_mmc = (void**) malloc(len*sizeof(void*));
len = 0;
tmp = data;
while (!MMC_NILTEST(tmp)) {
while (RML_GETHDR(tmp) != RML_NILHDR) {
data_mmc[len++] = value_to_mmc(RML_CAR(tmp));
tmp = RML_CDR(tmp);
}
Expand Down
1 change: 1 addition & 0 deletions SimulationRuntime/c/meta/gc/mmc_gc.h
Expand Up @@ -127,6 +127,7 @@ static inline void mmc_GC_add_roots(modelica_metatype* p, int n, mmc_GC_local_st
#define mmc_GC_init_default(void) GC_INIT()
#define mmc_GC_clear(void)
#define mmc_GC_collect(local_GC_state)
#define mmc_alloc_words_atomic(nwords) GC_malloc_atomic(nwords * sizeof(void*))

#else /* NO_GC */

Expand Down
11 changes: 8 additions & 3 deletions SimulationRuntime/c/meta/meta_modelica.c
Expand Up @@ -112,8 +112,13 @@ modelica_boolean valueEq(modelica_metatype lhs, modelica_metatype rhs)
return 1;
}

if ((0 == ((mmc_sint_t)lhs & 1)) && (0 == ((mmc_sint_t)rhs & 1))) {
return lhs == rhs;
if (MMC_IS_INTEGER(lhs) != MMC_IS_INTEGER(rhs)) {
/* Should trigger an assertion for most code */
return 0;
}

if (MMC_IS_INTEGER(lhs)) {
return 0;
}

h_lhs = MMC_GETHDR(lhs);
Expand Down Expand Up @@ -230,7 +235,7 @@ inline static int anyStringWork(void* any, int ix)
struct record_description *desc;
/* char buf[34] = {0}; */

if (MMC_IS_IMMEDIATE(any)) {
if (MMC_IS_INTEGER(any)) {
checkAnyStringBufSize(ix,40);
ix += sprintf(anyStringBuf+ix, "%ld", (signed long) MMC_UNTAGFIXNUM(any));
return ix;
Expand Down
26 changes: 23 additions & 3 deletions SimulationRuntime/c/meta/meta_modelica.h
Expand Up @@ -128,8 +128,26 @@ typedef int mmc_switch_type;

#endif

#define RML_STYLE_TAGPTR
#ifdef RML_STYLE_TAGPTR

/* RML-style tagged pointers */
#define MMC_TAGPTR(p) ((void*)((char*)(p) + 3))
#define MMC_UNTAGPTR(x) ((void*)((char*)(x) - 3))
#define MMC_IS_INTEGER(X) (0 == ((mmc_sint_t) X & 1))
#define MMC_TAGFIXNUM(i) (((i) << 1)+0)
#define MMC_UNTAGFIXNUM(X) (((mmc_sint_t) (X)) >> 1)

#else

#define MMC_TAGPTR(p) ((void*)((char*)(p) + 0))
#define MMC_UNTAGPTR(x) ((void*)((char*)(x) - 0))
#define MMC_IS_INTEGER(X) (1 == ((mmc_sint_t) X & 1))
#define MMC_TAGFIXNUM(i) (((i) << 1)+1)
#define MMC_UNTAGFIXNUM(X) (((mmc_sint_t) (X-1)) >> 1)

#endif

#define MMC_STRUCTHDR(slots,ctor) (((slots) << 10) + (((ctor) & 255) << 2))
#define MMC_NILHDR MMC_STRUCTHDR(0,0)
#define MMC_CONSHDR MMC_STRUCTHDR(2,1)
Expand All @@ -140,9 +158,7 @@ typedef int mmc_switch_type;
#define MMC_CDR(X) MMC_FETCH(MMC_OFFSET(MMC_UNTAGPTR(X),2))
#define MMC_NILTEST(x) (MMC_GETHDR(x) == MMC_NILHDR)
#define MMC_IMMEDIATE(i) ((void*)(i))
#define MMC_IS_IMMEDIATE(x) (!((mmc_uint_t)(x) & 1))
#define MMC_TAGFIXNUM(i) ((i) << 1)
#define MMC_UNTAGFIXNUM(X) (((mmc_sint_t) X) >> 1)
#define MMC_IS_IMMEDIATE(x) (MMC_IS_INTEGER(x))
#define MMC_REALHDR (((MMC_SIZE_DBL/MMC_SIZE_INT) << 10) + 9)
#define MMC_HDR_IS_FORWARD(hdr) (((hdr) & 3) == 3)
/*
Expand Down Expand Up @@ -281,7 +297,11 @@ static inline void* mmc_mk_scon(const char *s)
unsigned char c = *s;
return mmc_strings_len1[(unsigned int)c];
}
#if defined(RML_STYLE_TAGPTR)
p = (struct mmc_string *) mmc_alloc_words(nwords);
#else
p = (struct mmc_string *) mmc_alloc_words_atomic(nwords);
#endif
p->header = header;
memcpy(p->data, s, nbytes+1); /* including terminating '\0' */
res = MMC_TAGPTR(p);
Expand Down

0 comments on commit 8747410

Please sign in to comment.