rev 671 - in trunk: . src

SVN User <[email protected]> Sun, 27 Jun 2004 23:33:26 -0400
Newsgroups gmane.comp.lang.prothon.cvs
Message-ID <[email protected]>
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);