Skip to content

Commit

Permalink
#341 Numerous bug fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
SanderMertens committed Oct 26, 2015
1 parent bd0757d commit cf9c7e0
Show file tree
Hide file tree
Showing 14 changed files with 163 additions and 41 deletions.
5 changes: 4 additions & 1 deletion generators/c/api/src/cx_apicollection.c
Original file line number Diff line number Diff line change
Expand Up @@ -41,12 +41,15 @@ static corto_int16 c_apiSequenceTypeForeach(corto_sequence o, c_apiWalk_t* data)
c_specifierId(data->g, corto_type(o), id, NULL, NULL);
c_specifierId(data->g, corto_type(elementType), elementId, &prefix, NULL);



/* Macro */
g_fileWrite(data->header, "#define %sForeach(seq, elem) \\\n", id);
g_fileIndent(data->header);
g_fileWrite(data->header, "corto_uint32 elem##_iter;\\\n");
g_fileWrite(data->header, "%s elem;\\\n", elementId);
g_fileWrite(data->header, "for(elem##_iter=0; (seq).buffer ? elem = (seq).buffer[elem##_iter] : elem, elem##_iter<(seq).length; elem##_iter++)\\\n");
g_fileWrite(data->header, "for(elem##_iter = 0; (elem##_iter < (seq).length) ? elem = (seq).buffer[elem##_iter], TRUE : FALSE; elem##_iter++)\\\n");

g_fileDedent(data->header);
g_fileWrite(data->header, "\n");

Expand Down
5 changes: 5 additions & 0 deletions packages/corto/ast/src/ast.y
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,11 @@ ast_Expression ast_declarationSeqDo(ast_Storage type, ast_ParserDeclarationSeq *
ast_Comma result = ast_CommaCreate();
ast_Expression expr = NULL;

if (type && !corto_instanceof(corto_type_o, type)) {
_fast_err("object in declaration is not a type");
return NULL;
}

ast_Parser_collect(yparser(), result);
yparser()->variableCount = 0;
for(i=0; i<declarations->length; i++)
Expand Down
16 changes: 8 additions & 8 deletions packages/corto/lang/include/corto__api.h
Original file line number Diff line number Diff line change
Expand Up @@ -1281,7 +1281,7 @@ CORTO_LANG_EXPORT corto_int16 corto_wordDeinit(corto_word* value);
#define corto_interfaceseqForeach(seq, elem) \
corto_uint32 elem##_iter;\
corto_interface elem;\
for(elem##_iter=0; (seq).buffer ? elem = (seq).buffer[elem##_iter] : elem, elem##_iter<(seq).length; elem##_iter++)\
for(elem##_iter = 0; (elem##_iter < (seq).length) ? elem = (seq).buffer[elem##_iter], TRUE : FALSE; elem##_iter++)\

CORTO_LANG_EXPORT corto_interface* corto_interfaceseqAppend(corto_interfaceseq *seq, corto_interface element);
CORTO_LANG_EXPORT corto_interface* corto_interfaceseqAppendAlloc(corto_interfaceseq *seq);
Expand All @@ -1292,7 +1292,7 @@ CORTO_LANG_EXPORT void corto_interfaceseqClear(corto_interfaceseq *seq);
#define corto_interfaceVectorseqForeach(seq, elem) \
corto_uint32 elem##_iter;\
corto_interfaceVector elem;\
for(elem##_iter=0; (seq).buffer ? elem = (seq).buffer[elem##_iter] : elem, elem##_iter<(seq).length; elem##_iter++)\
for(elem##_iter = 0; (elem##_iter < (seq).length) ? elem = (seq).buffer[elem##_iter], TRUE : FALSE; elem##_iter++)\

CORTO_LANG_EXPORT corto_interfaceVector* corto_interfaceVectorseqAppend(corto_interfaceVectorseq *seq, corto_interfaceVector element);
CORTO_LANG_EXPORT corto_interfaceVector* corto_interfaceVectorseqAppendAlloc(corto_interfaceVectorseq *seq);
Expand All @@ -1303,7 +1303,7 @@ CORTO_LANG_EXPORT void corto_interfaceVectorseqClear(corto_interfaceVectorseq *s
#define corto_memberseqForeach(seq, elem) \
corto_uint32 elem##_iter;\
corto_member elem;\
for(elem##_iter=0; (seq).buffer ? elem = (seq).buffer[elem##_iter] : elem, elem##_iter<(seq).length; elem##_iter++)\
for(elem##_iter = 0; (elem##_iter < (seq).length) ? elem = (seq).buffer[elem##_iter], TRUE : FALSE; elem##_iter++)\

CORTO_LANG_EXPORT corto_member* corto_memberseqAppend(corto_memberseq *seq, corto_member element);
CORTO_LANG_EXPORT corto_member* corto_memberseqAppendAlloc(corto_memberseq *seq);
Expand All @@ -1314,7 +1314,7 @@ CORTO_LANG_EXPORT void corto_memberseqClear(corto_memberseq *seq);
#define corto_objectseqForeach(seq, elem) \
corto_uint32 elem##_iter;\
corto_object elem;\
for(elem##_iter=0; (seq).buffer ? elem = (seq).buffer[elem##_iter] : elem, elem##_iter<(seq).length; elem##_iter++)\
for(elem##_iter = 0; (elem##_iter < (seq).length) ? elem = (seq).buffer[elem##_iter], TRUE : FALSE; elem##_iter++)\

CORTO_LANG_EXPORT corto_object* corto_objectseqAppend(corto_objectseq *seq, corto_object element);
CORTO_LANG_EXPORT corto_object* corto_objectseqAppendAlloc(corto_objectseq *seq);
Expand All @@ -1325,7 +1325,7 @@ CORTO_LANG_EXPORT void corto_objectseqClear(corto_objectseq *seq);
#define corto_observerseqForeach(seq, elem) \
corto_uint32 elem##_iter;\
corto_observer elem;\
for(elem##_iter=0; (seq).buffer ? elem = (seq).buffer[elem##_iter] : elem, elem##_iter<(seq).length; elem##_iter++)\
for(elem##_iter = 0; (elem##_iter < (seq).length) ? elem = (seq).buffer[elem##_iter], TRUE : FALSE; elem##_iter++)\

CORTO_LANG_EXPORT corto_observer* corto_observerseqAppend(corto_observerseq *seq, corto_observer element);
CORTO_LANG_EXPORT corto_observer* corto_observerseqAppendAlloc(corto_observerseq *seq);
Expand All @@ -1336,7 +1336,7 @@ CORTO_LANG_EXPORT void corto_observerseqClear(corto_observerseq *seq);
#define corto_octetseqForeach(seq, elem) \
corto_uint32 elem##_iter;\
corto_octet elem;\
for(elem##_iter=0; (seq).buffer ? elem = (seq).buffer[elem##_iter] : elem, elem##_iter<(seq).length; elem##_iter++)\
for(elem##_iter = 0; (elem##_iter < (seq).length) ? elem = (seq).buffer[elem##_iter], TRUE : FALSE; elem##_iter++)\

CORTO_LANG_EXPORT corto_octet* corto_octetseqAppend(corto_octetseq *seq, corto_octet element);
CORTO_LANG_EXPORT corto_octet* corto_octetseqAppendAlloc(corto_octetseq *seq);
Expand All @@ -1347,7 +1347,7 @@ CORTO_LANG_EXPORT void corto_octetseqClear(corto_octetseq *seq);
#define corto_parameterseqForeach(seq, elem) \
corto_uint32 elem##_iter;\
corto_parameter elem;\
for(elem##_iter=0; (seq).buffer ? elem = (seq).buffer[elem##_iter] : elem, elem##_iter<(seq).length; elem##_iter++)\
for(elem##_iter = 0; (elem##_iter < (seq).length) ? elem = (seq).buffer[elem##_iter], TRUE : FALSE; elem##_iter++)\

CORTO_LANG_EXPORT corto_parameter* corto_parameterseqAppend(corto_parameterseq *seq, corto_parameter element);
CORTO_LANG_EXPORT corto_parameter* corto_parameterseqAppendAlloc(corto_parameterseq *seq);
Expand All @@ -1358,7 +1358,7 @@ CORTO_LANG_EXPORT void corto_parameterseqClear(corto_parameterseq *seq);
#define corto_vtableForeach(seq, elem) \
corto_uint32 elem##_iter;\
corto_function elem;\
for(elem##_iter=0; (seq).buffer ? elem = (seq).buffer[elem##_iter] : elem, elem##_iter<(seq).length; elem##_iter++)\
for(elem##_iter = 0; (elem##_iter < (seq).length) ? elem = (seq).buffer[elem##_iter], TRUE : FALSE; elem##_iter++)\

CORTO_LANG_EXPORT corto_function* corto_vtableAppend(corto_vtable *seq, corto_function element);
CORTO_LANG_EXPORT corto_function* corto_vtableAppendAlloc(corto_vtable *seq);
Expand Down
2 changes: 1 addition & 1 deletion packages/corto/lang/include/corto_def.h
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ extern int8_t CORTO_DEBUG_ENABLED;
#define CORTO_LIST(type) typedef corto_ll type

#define CORTO_OBSERVER(name)\
void __##name (corto_object, corto_object, corto_object);\
void __##name (corto_object, corto_object);\
void name (corto_function f, void *result, void *args) {\
CORTO_UNUSED(f);\
CORTO_UNUSED(result);\
Expand Down
3 changes: 1 addition & 2 deletions packages/corto/lang/src/corto.c
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ struct corto_exitHandler {

#define VERSION_MAJOR "0"
#define VERSION_MINOR "2"
#define VERSION_PATCH "1"
#define VERSION_PATCH "2"
#define VERSION_SUFFIX "alpha"

#ifdef VERSION_SUFFIX
Expand Down Expand Up @@ -890,7 +890,6 @@ void corto_stop(void) {
/* Deinitialize root */
corto__freeSSO(corto_lang_o);
corto__freeSSO(corto_o);

corto__freeSSO(root_o);

/* Deinit adminLock */
Expand Down
10 changes: 5 additions & 5 deletions packages/corto/lang/src/corto_class.c
Original file line number Diff line number Diff line change
Expand Up @@ -165,8 +165,6 @@ void corto_class_detachObservers(corto_class this, corto_object object) {
observers = corto_class_getObserverVtable(object);
if (observers) {
id = corto__class_observerCount(this);
observers->buffer = CORTO_OFFSET(observers, sizeof(observable));
observers->length = id;
base = this;
do {
for (i=0; i<base->observers.length; i++) {
Expand Down Expand Up @@ -366,9 +364,11 @@ corto_void _corto_class_listen(corto_any this, corto_observer observer, corto_ev
observers->buffer[observer->_template-1].dispatcher = dispatcher;
} else {
corto_id id, id2;
corto_error("failed to set observer for '%s' of type '%s'",
corto_fullname(this.value, id),
corto_fullname(corto_typeof(this.value), id2));
corto_error("failed to set observable for observer '%s' of '%s' of type '%s' (%d)",
corto_nameof(observer),
corto_fullname(this.value, id),
corto_fullname(corto_typeof(this.value), id2),
corto_countof(this.value));
}

/* $end */
Expand Down
6 changes: 0 additions & 6 deletions packages/corto/lang/src/corto_loader.c
Original file line number Diff line number Diff line change
Expand Up @@ -533,7 +533,6 @@ int corto_fileLoader(corto_string file, int argc, char* argv[], void* udata) {
void corto_loaderOnExit(void* udata) {
struct corto_fileHandler* h;
corto_dl dl;
void (*proc)(int code);
corto_iter iter;

CORTO_UNUSED(udata);
Expand All @@ -559,11 +558,6 @@ void corto_loaderOnExit(void* udata) {
/* Free libraries */
if (libraries) {
while ((dl = corto_llTakeFirst(libraries))) {
/* Lookup exit function */
proc = (void(*)(int))corto_dlProc(dl, "exit");
if (proc) {
proc(0);
}
corto_dlClose(dl);
}
corto_llFree(libraries);
Expand Down
57 changes: 51 additions & 6 deletions packages/corto/lang/src/corto_object.c
Original file line number Diff line number Diff line change
Expand Up @@ -475,16 +475,18 @@ void corto__freeSSO(corto_object sso) {
o = CORTO_OFFSET(sso, -sizeof(corto__object));
scope = corto__objectScope(o);

corto_assert(scope != NULL, "corto__freeSSO: static scoped object has no scope (very unlikely, corto__freeSSO called on non-static object?)")
corto_assert(scope != NULL, "corto__freeSSO: static scoped object has no scope")

if (scope->parent) {
corto_release(scope->parent);
}

if (scope->scope) {
if (corto_rbtreeSize(scope->scope)) {
corto_error("corto__freeSSO: scope of object '%s' is not empty (%d left)",
corto_error("corto__freeSSO: scope of object '%s' is not empty (%p/%p: %d left)",
corto_nameof(sso),
sso,
scope->scope,
corto_rbtreeSize(scope->scope));
}
corto_rbtreeFree(scope->scope);
Expand Down Expand Up @@ -553,7 +555,7 @@ int corto__destructor(corto_object o) {
_o = CORTO_OFFSET(o, -sizeof(corto__object));
if (corto_class_instanceof(corto_class_o, t)) {
/* Detach observers from object */
corto_class_detachObservers(corto_class(t), o);
/* corto_class_detachObservers(corto_class(t), o); */

/* Call destructor */
corto_delegateDestruct(corto_typeof(o), o);
Expand Down Expand Up @@ -781,6 +783,7 @@ void corto__orphan(corto_object o) {
_child = CORTO_OFFSET(o, -sizeof(corto__object));
c_scope = corto__objectScope(_child);


if (c_scope->parent) {
_parent = CORTO_OFFSET(c_scope->parent, -sizeof(corto__object));
p_scope = corto__objectScope(_parent);
Expand Down Expand Up @@ -989,6 +992,11 @@ corto_object _corto_declareChild(corto_object parent, corto_string name, corto_t
parent = root_o;
}

if (!name || !strlen(name)) {
corto_seterr("invalid parameter provided for name");
goto error;
}

/* Create new object */
corto_attr oldAttr = corto_setAttr(corto_getAttr()|CORTO_ATTR_SCOPED);
o = corto_declare(type);
Expand Down Expand Up @@ -1141,6 +1149,7 @@ corto_int16 corto_define(corto_object o) {
void corto_delete(corto_object o) {
corto__object* _o;
corto__scope* scope;
corto_type t = corto_typeof(o);

if (corto_checkAttr(o, CORTO_ATTR_SCOPED)) {
_o = CORTO_OFFSET(o, -sizeof(corto__object));
Expand All @@ -1149,10 +1158,16 @@ void corto_delete(corto_object o) {
if (corto_adec(&scope->declared) == 0) {
corto_drop(o);
corto_notify(corto__objectObservable(_o), o, CORTO_ON_DELETE);
if (corto_class_instanceof(corto_class_o, t)) {
corto_class_detachObservers(corto_class(t), o);
}
corto__orphan(o);
corto_release(o);
}
} else {
if (corto_class_instanceof(corto_class_o, t)) {
corto_class_detachObservers(corto_class(t), o);
}
corto_release(o);
}
}
Expand Down Expand Up @@ -1963,11 +1978,13 @@ corto_object corto_lookupLowercase(corto_object o, corto_string name) {
}

corto_object corto_lookup(corto_object o, corto_string name) {
corto_id lower;
corto_id lower; *lower = '\0';
char *ptr = name, ch;
char *bptr = lower;
for(; (ch = *ptr); ptr++) *(bptr++) = tolower(ch);
*bptr = '\0';
if (name) {
for(; (ch = *ptr); ptr++) *(bptr++) = tolower(ch);
*bptr = '\0';
}
return corto_lookupLowercase(o, lower);
}

Expand Down Expand Up @@ -2376,6 +2393,20 @@ corto_int32 corto_silence(corto_object this, corto_observer observer, corto_even
corto_fullname(this, id3));
}
#endif
} else {
corto_id id1, id2, id3;
if (this) {
corto_seterr("observer '%s' ('%s') is not observing '%s'",
corto_fullname(observer, id1),
corto_fullname(this, id2),
corto_fullname(observable, id3));
goto error;
} else {
corto_seterr("observer '%s' is not observing '%s'",
corto_fullname(observer, id1),
corto_fullname(observable, id2));
goto error;
}
}
corto_rwmutexUnlock(&_o->selfLock);
}
Expand All @@ -2392,6 +2423,20 @@ corto_int32 corto_silence(corto_object this, corto_observer observer, corto_even
/* Build new observer array */
oldChildArray = _o->onChildArray;
_o->onChildArray = corto_observersArrayNew(_o->onChild);
} else {
corto_id id1, id2, id3;
if (this) {
corto_seterr("observer '%s' ('%s') is not observing '%s'",
corto_fullname(observer, id1),
corto_fullname(this, id2),
corto_fullname(observable, id3));
goto error;
} else {
corto_seterr("observer '%s' is not observing '%s'",
corto_fullname(observer, id1),
corto_fullname(observable, id2));
goto error;
}
}
corto_rwmutexUnlock(&_o->childLock);
} else {
Expand Down
2 changes: 1 addition & 1 deletion packages/corto/lang/src/corto_resolver.c
Original file line number Diff line number Diff line change
Expand Up @@ -200,7 +200,7 @@ corto_object corto_resolve(corto_object _scope, corto_string str) {
} else if (ch == '/') {
ptr += 1;
} else {
corto_error("corto_resolve: invalid ':' in expression '%s'", str);
corto_seterr("invalid ':' in expression '%s'", str);
o = NULL;
break;
}
Expand Down
3 changes: 2 additions & 1 deletion packages/corto/lang/src/jsw_rbtree.c
Original file line number Diff line number Diff line change
Expand Up @@ -349,6 +349,7 @@ int jsw_rbinsert ( jsw_rbtree_t *tree, void* key, void *data, void **old_out, co
new node directly to the root
*/
tree->root = new_node ( tree, key, data );
++tree->size;

if ( tree->root == NULL )
return 0;
Expand All @@ -369,6 +370,7 @@ int jsw_rbinsert ( jsw_rbtree_t *tree, void* key, void *data, void **old_out, co
if ( q == NULL ) {
/* Insert a new node at the first null link */
p->link[dir] = q = new_node ( tree, key, data );
++tree->size;

if ( q == NULL )
return 0;
Expand Down Expand Up @@ -418,7 +420,6 @@ int jsw_rbinsert ( jsw_rbtree_t *tree, void* key, void *data, void **old_out, co

/* Make the root black for simplified logic */
tree->root->red = 0;
++tree->size;

return 1;
}
Expand Down
2 changes: 2 additions & 0 deletions tools/corto/include/cortotool_install.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,15 @@ corto_int16 cortotool_uninstall(int argc, char *argv[]);
corto_int16 cortotool_locate(int argc, char* argv[]);
corto_int16 cortotool_tar(int argc, char* argv[]);
corto_int16 cortotool_untar(int argc, char* argv[]);
corto_int16 cortotool_update(int argc, char* argv[]);

void cortotool_toLibPath(char *location);

void cortotool_installHelp(void);
void cortotool_uninstallHelp(void);
void cortotool_tarHelp(void);
void cortotool_untarHelp(void);
void cortotool_updateHelp(void);

#ifdef __cplusplus
}
Expand Down
10 changes: 8 additions & 2 deletions tools/corto/src/cortotool.c
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,9 @@ static void cortotool_printUsage(corto_bool expert) {
printf(" add Add a package to a project\n");
printf(" remove Remove a package from a project\n");
printf(" list List packages of a project\n");
printf(" install Install a package.\n");
printf(" uninstall Uninstall a package.\n");
printf(" update Update a package\n");
printf(" run Run a project.\n");
printf(" build Build a project (not needed for apps!).\n");
printf(" test Run tests for a project\n");
Expand All @@ -41,8 +44,6 @@ static void cortotool_printUsage(corto_bool expert) {
printf("Expert commands:\n");
printf(" pp Invoke the corto preprocessor.\n");
printf(" locate Show where a package or component is located.\n");
printf(" install Install a project to the global environment.\n");
printf(" uninstall Remove a project from the global environment.\n");
printf(" tar Package a project in a redistributable tar file.\n");
printf(" untar Unpackage a project to the global environment.\n");
printf(" rebuild Clean, then build a project.\n");
Expand Down Expand Up @@ -166,6 +167,11 @@ int main(int argc, char* argv[]) {
goto error;
}
break;
} else if (!strcmp(argv[i], "update")) {
if (cortotool_update(argc-i, &argv[i])) {
goto error;
}
break;
} else if (!strcmp(argv[i], "locate")) {
if (cortotool_locate(argc-i, &argv[i])) {
goto error;
Expand Down
2 changes: 2 additions & 0 deletions tools/corto/src/cortotool_help.c
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@ int cortotool_help(int argc, char* argv[]) {
cortotool_installHelp();
} else if (!strcmp(argv[1], "uninstall")) {
cortotool_uninstallHelp();
} else if (!strcmp(argv[1], "update")) {
cortotool_updateHelp();
} else if (!strcmp(argv[1], "locate")) {
cortotool_locateHelp();
} else if (!strcmp(argv[1], "shell")) {
Expand Down
Loading

0 comments on commit cf9c7e0

Please sign in to comment.