logo       
Google Custom Search
    AddThis Social Bookmark Button

rev 671 - in trunk: . src: msg#00108

Subject: rev 671 - in trunk: . src
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);





Try Searching:
servers, voip, java, networking, microsoft ...
<Prev in Thread] Current Thread [Next in Thread>