Author: mark
Date: 2004-06-27 23:33:22 -0400 (Sun, 27 Jun 2004)
New Revision: 671
Modified:
trunk/STATUS.txt
trunk/src/builtins-core.c
trunk/src/console.c
Log:
Finished Weakref, not tested
Modified: trunk/STATUS.txt
===================================================================
--- trunk/STATUS.txt 2004-06-27 23:21:31 UTC (rev 670)
+++ trunk/STATUS.txt 2004-06-28 03:33:22 UTC (rev 671)
@@ -1,6 +1,8 @@
----------------------- TO-DO (highest priority first) ------------------------
+--- kill init_ return?
+
--- Add properties methods: prop keyword, get_, set_, delete_, wildcards
--- change file.setStdout to property
@@ -137,6 +139,10 @@
http://www.prothon.org/pipermail/prothon-user/2004-June/002431.html
http://www.prothon.org/pipermail/prothon-user/2004-June/002443.html
+------------------------ OPTIMIZATION TO_DO -----------------------------------
+
+--- Lazy string concatenation
+
---------------- Ideas to consider for inclusion ------------------------------
Psyco in std interpreter?
Modified: trunk/src/builtins-core.c
===================================================================
--- trunk/src/builtins-core.c 2004-06-27 23:21:31 UTC (rev 670)
+++ trunk/src/builtins-core.c 2004-06-28 03:33:22 UTC (rev 671)
@@ -1012,29 +1012,161 @@
}
// ***************************** WeakRef **************************************
+
+MODULE_CONSTANT_DECLARE(WeakRef, READ );
+MODULE_CONSTANT_DECLARE(WeakRef, WRITE);
+MODULE_CONSTANT_DECLARE(WeakRef, DELETE );
+
+typedef struct {
+ data_size_t data_size;
+ int exists;
+ int notify_flags;
+ obj_p ref;
+} weak_ref_t;
+
+typedef weak_ref_t* weak_ref_p;
+
MODULE_START(WeakRef)
{
WeakRef_OBJ = NEW_OBJ(NULL);
MODULE_ADD_TO_OBJ(WeakRef, OBJ(OBJECT), "WeakRef");
+
+ MODULE_CONSTANT_INT(WeakRef, READ, READ_NOTIFY)
+ MODULE_CONSTANT_INT(WeakRef, WRITE, WRITE_NOTIFY)
+ MODULE_CONSTANT_INT(WeakRef, DELETE, DELETE_NOTIFY)
}
DEF(WeakRef, str_, NULL) {
+ weak_ref_p wrp;
char *str_obj, buf[256];
- if (self == WeakRef_OBJ) return NEW_STRING("<Proto:WeakRef>");
+ if (self == WeakRef_OBJ) return NEW_STRING("<Prototype:WeakRef>");
BIN_STR_CHK(WeakRef);
- str_obj = as_str(ist, (obj_p)(self->data.ptr));
- apr_snprintf(buf, sizeof(buf), "<WeakRef:%s>", str_obj);
+ wrp = self->data.ptr;
+ if (wrp->exists) {
+ str_obj = as_str(ist, wrp->ref);
+ apr_snprintf(buf, sizeof(buf), "<WeakRef:%s>", str_obj);
+ } else
+ apr_snprintf(buf, sizeof(buf), "<WeakRef:deleted:%x>",
(long)(intptr_t) wrp->ref);
set_unclonable(self);
return NEW_STRING(buf);
}
DEF(WeakRef, init_, FORM_RPARAM) {
+ weak_ref_p wrp;
+ obj_p callback_func;
+
BIN_EMPTY_CHK();
- SET_TYPE_IF_EXC(WeakRef_OBJ, self, DATA_TYPE_EXTPTR) return NULL;
- self->data.ptr = parms[1];
+ SET_TYPE_IF_EXC(WeakRef_OBJ, self, DATA_TYPE_DATAPTR) return NULL;
+ wrp = pr_malloc(sizeof(weak_ref_t));
+ wrp->data_size = sizeof(weak_ref_t);
+ wrp->exists = TRUE;
+ wrp->notify_flags = DELETE_NOTIFY;
+ wrp->ref = parms[1];
+ callback_func = get_attr(ist, WeakRef_OBJ, sym(ist, "callback_"));
+ add_notification(ist, parms[1], callback_func, DELETE_NOTIFY);
set_unclonable(self);
return self;
}
+DEF(WeakRef, ref, NULL) {
+ weak_ref_p wrp = self->data.ptr;
+ if(!wrp->exists) {
+ raise_exception(ist, OBJ(INTERPRETER_EXC), "object doesn't
exist anymore");
+ del_notify_unlock();
+ }
+ return wrp->ref;
+}
+
+DEF(WeakRef, exists_QUES, NULL) {
+ weak_ref_p wrp = self->data.ptr;
+ if (wrp->exists) return OBJ(PR_TRUE);
+ else return OBJ(PR_FALSE);
+}
+
+DEF(WeakRef, flags, NULL) {
+ weak_ref_p wrp = self->data.ptr;
+ return NEW_INT(wrp->notify_flags);
+}
+
+DEF( WeakRef, notify, FPARM3( func, OBJ(NODEF),
+ param, OBJ(NONE),
+ flags,
NEW_INT(WRITE_NOTIFY|DELETE_NOTIFY) ) ) {
+ weak_ref_p wrp = self->data.ptr;
+ obj_p callback_func;
+ int flags;
+ CHECK_TYPE_EXC(parms[1], OBJ(FUNC_PROTO), function);
+ INT_32_PARAM(3, flags);
+ del_notify_lock();
+ if (!wrp->exists) {
+ raise_exception(ist, OBJ(INTERPRETER_EXC), "object doesn't
exist anymore");
+ del_notify_unlock();
+ return NULL;
+ }
+ if (flags & READ_NOTIFY) {
+ set_attr(ist, wrp->ref, sym(ist, "onRead_"), parms[3]);
+ if (parms[3] != OBJ(NONE))
+ set_attr(ist, wrp->ref, sym(ist, "onReadParam_"),
parms[5]);
+ }
+ if (flags & WRITE_NOTIFY) {
+ set_attr(ist, wrp->ref, sym(ist, "onWrite_"), parms[3]);
+ if (parms[3] != OBJ(NONE))
+ set_attr(ist, wrp->ref, sym(ist, "onWriteParam_"),
parms[5]);
+ }
+ if (flags & DELETE_NOTIFY) {
+ set_attr(ist, wrp->ref, sym(ist, "onDelete_"), parms[3]);
+ if (parms[3] != OBJ(NONE))
+ set_attr(ist, wrp->ref, sym(ist, "onDeleteParam_"),
parms[5]);
+ }
+ if (wrp->notify_flags != (wrp->notify_flags | flags)) {
+ wrp->notify_flags |= flags;
+ callback_func = get_attr(ist, WeakRef_OBJ, sym(ist,
"callback_"));
+ add_notification(ist, wrp->ref, callback_func,
wrp->notify_flags);
+ }
+ del_notify_unlock();
+ return self;
+}
+
+DEF(WeakRef, callback_, FORM_RPARAM) {
+ obj_p arr[2];
+ int flags = int2i32t(ist, parms[1]);
+ arr[0] = OBJ(NOKEY);
+ if (flags & READ_NOTIFY) {
+ obj_p on_read_func = get_attr(ist, self, sym(ist, "onRead_"));
+ obj_p on_read_param = get_attr(ist, self, sym(ist,
"onReadParam_"));
+ if (on_read_func && on_read_param) {
+ arr[1] = on_read_param;
+ call_func(ist, NULL, on_read_func, 2, arr, NULL);
+ } else if (on_read_func)
+ call_func(ist, NULL, on_read_func, 0, NULL, NULL);
+ }
+ if (flags & WRITE_NOTIFY) {
+ obj_p on_write_func = get_attr(ist, self, sym(ist,
"onWrite_"));
+ obj_p on_write_param = get_attr(ist, self, sym(ist,
"onWriteParam_"));
+ if (on_write_func && on_write_param) {
+ arr[1] = on_write_param;
+ call_func(ist, NULL, on_write_func, 2, arr, NULL);
+ } else if (on_write_func)
+ call_func(ist, NULL, on_write_func, 0, NULL, NULL);
+ }
+ if (flags & DELETE_NOTIFY) {
+ weak_ref_p wrp = self->data.ptr;
+ obj_p on_delete_func = get_attr(ist, self, sym(ist,
"onDelete_"));
+ obj_p on_delete_param = get_attr(ist, self, sym(ist,
"onDeleteParam_"));
+ wrp->exists = FALSE;
+ if (on_delete_func && on_delete_param) {
+ arr[1] = on_delete_param;
+ call_func(ist, NULL, on_delete_func, 2, arr, NULL);
+ check_exceptions(ist);
+ } else if (on_delete_func) {
+ call_func(ist, NULL, on_delete_func, 0, NULL, NULL);
+ check_exceptions(ist);
+ }
+ }
+ return OBJ(NONE);
+}
+DEF(WeakRef, objList_, FORM_RPARAM) {
+ return parms[1];
+}
+
// ***************************** UNIQUEOBJECTS ********************************
MODULE_START(UniqueObjects)
{
@@ -1165,6 +1297,12 @@
MODULE_SUB_INIT(WeakRef);
MODULE_ADD_SYM(WeakRef, init_);
MODULE_ADD_SYM(WeakRef, str_);
+ MODULE_ADD_SYM(WeakRef, ref);
+ MODULE_ADD_SYM(WeakRef, exists_QUES);
+ MODULE_ADD_SYM(WeakRef, flags);
+ MODULE_ADD_SYM(WeakRef, notify);
+ MODULE_ADD_SYM(WeakRef, callback_);
+ MODULE_ADD_SYM(WeakRef, objList_);
MODULE_SUB_INIT(UniqueObjects);
MODULE_ADD_SYM(NoKey, str_);
Modified: trunk/src/console.c
===================================================================
--- trunk/src/console.c 2004-06-27 23:21:31 UTC (rev 670)
+++ trunk/src/console.c 2004-06-28 03:33:22 UTC (rev 671)
@@ -233,7 +233,6 @@
res = exec_string(ist, src, TRUE, &frame);
if (check_exceptions(ist)) {
ist->frame = NULL;
- printf("\n");
} else {
if (res && res != OBJ(NONE)) {
char* res_str = as_str(ist, res);
|