Skip to content

Commit

Permalink
#341 Added event testcases & fixed bugs
Browse files Browse the repository at this point in the history
  • Loading branch information
SanderMertens committed Sep 23, 2015

Verified

This commit was signed with the committer’s verified signature.
TarikGul Tarik Gul
1 parent 7af3f29 commit 7479818
Showing 6 changed files with 916 additions and 204 deletions.
8 changes: 1 addition & 7 deletions packages/corto/lang/src/cx_class.c
Original file line number Diff line number Diff line change
@@ -164,13 +164,7 @@ void cx_class_listenObservers(cx_class this, cx_object object) {
for (i=0; i<base->observers.length; i++) {
observable = observers->buffer[i];
if (observable) {
if (!cx_listening(observable, base->observers.buffer[i], object)) {
/* Do not activate observers that listen for non-observables and childs on non-scoped objects */
if (cx_checkAttr(observable, CX_ATTR_OBSERVABLE) &&
(!(base->observers.buffer[i]->mask & CX_ON_SCOPE) || cx_checkAttr(object, CX_ATTR_SCOPED))) {
cx_listen(observable, base->observers.buffer[i], object);
}
}
cx_listen(observable, base->observers.buffer[i], object);
}
}
} while ((base = cx_class(cx_interface(base)->base)));
27 changes: 16 additions & 11 deletions packages/corto/lang/src/cx_object.c
Original file line number Diff line number Diff line change
@@ -2077,7 +2077,7 @@ void cx_setrefChildLockRequired(cx_object observable) {
}
}

/*#define CX_TRACE_NOTIFICATIONS*/
/* #define CX_TRACE_NOTIFICATIONS */

#ifdef CX_TRACE_NOTIFICATIONS
static cx_uint32 indent = 0;
@@ -2175,8 +2175,8 @@ void cx_observerAlign(cx_object observable, cx__observer *observer, int mask) {
walkData.mask = mask;
walkData.depth = 0;

if (((mask & CX_ON_DECLARE) && (mask & CX_ON_SELF) && cx_checkState(observable, CX_DECLARED)) &&
((mask & CX_ON_DEFINE) && (mask & CX_ON_SELF) && cx_checkState(observable, CX_DEFINED))) {
if (((mask & CX_ON_DECLARE) && (mask & CX_ON_SELF) && cx_checkState(observable, CX_DECLARED)) ||
((mask & CX_ON_DEFINE) && (mask & CX_ON_SELF) && cx_checkState(observable, CX_DEFINED))) {
cx_notifyObserver(observer, observable, observable, mask, 0);
}

@@ -2205,10 +2205,9 @@ cx_int32 cx_listen(cx_object observable, cx_observer observer, cx_object this) {
if (observer->mask & (CX_ON_SCOPE|CX_ON_TREE)) {
if (!cx_checkAttr(observable, CX_ATTR_SCOPED)) {
cx_id id, id2;
cx_error("corto::listen: cannot listen to childs of non-scoped observable '%s' (observer %s)",
cx_seterr("corto::listen: cannot listen to childs of non-scoped observable '%s' (observer %s)",
cx_fullname(observable, id),
cx_fullname(observer, id2));
abort();
goto error;
}
}
@@ -2224,16 +2223,17 @@ cx_int32 cx_listen(cx_object observable, cx_observer observer, cx_object this) {
#ifdef CX_TRACE_NOTIFICATIONS
{
cx_id id1, id2, id3;
printf("%*s [listen] observable '%s' observer '%s' me '%s' %s %s %s %s %s\n",
printf("%*s [listen] observable '%s' observer '%s' me '%s'%s%s%s%s%s%s\n",
indent * 3, "",
cx_fullname(observable, id1),
cx_fullname(observer, id2),
cx_fullname(this, id3),
observer->mask & CX_ON_SELF ? "self" : "",
observer->mask & CX_ON_SCOPE ? "scope" : "",
observer->mask & CX_ON_DECLARE ? "declare" : "",
observer->mask & CX_ON_DEFINE ? "define" : "",
observer->mask & CX_ON_UPDATE ? "update" : "");
observer->mask & CX_ON_SELF ? " self" : "",
observer->mask & CX_ON_SCOPE ? " scope" : "",
observer->mask & CX_ON_TREE ? " tree" : "",
observer->mask & CX_ON_DECLARE ? " declare" : "",
observer->mask & CX_ON_DEFINE ? " define" : "",
observer->mask & CX_ON_UPDATE ? " update" : "");
}
#endif

@@ -2558,6 +2558,11 @@ cx_int32 cx_update(cx_object observable) {
cx__writable* _wr;
cx__persistent* _ps;

if (!cx_checkState(observable, CX_DEFINED)) {
cx_seterr("cannot update undefined object");
goto error;
}

_o = cx__objectObservable(CX_OFFSET(observable, -sizeof(cx__object)));
if (_o->lockRequired) {
_wr = cx__objectWritable(CX_OFFSET(observable, -sizeof(cx__object)));
Loading

0 comments on commit 7479818

Please sign in to comment.