rev 404 - in trunk: modules/Prosist pr

SVN User <[email protected]> Fri, 23 Apr 2004 15:42:58 -0400
Newsgroups gmane.comp.lang.prothon.cvs
Message-ID <[email protected]>
Author: mark
Date: 2004-04-23 15:42:56 -0400 (Fri, 23 Apr 2004)
New Revision: 404

Modified:
   trunk/modules/Prosist/Prosist.c
   trunk/pr/closure.pr
Log:
don't you hate it when you rewrite a large chunk of code
and then the results don't change a bit

Modified: trunk/modules/Prosist/Prosist.c
===================================================================
--- trunk/modules/Prosist/Prosist.c	2004-04-23 07:36:32 UTC (rev 403)
+++ trunk/modules/Prosist/Prosist.c	2004-04-23 19:42:56 UTC (rev 404)
@@ -453,44 +453,18 @@
 void store_obj(isp ist, psrec_p psrecp, obj_p obj) {
 	apr_status_t aprerr;
 	apr_datum_t key, value;
-	obj_p id_tuple, proxy_obj;
+	obj_p proxy_obj;
 	psid_t id;
 	int i, plen, added_attr = FALSE;
 	ADD_BUF_DECLARE;
 
+	if (obj == OBJ(NONE)) return;
+
 	id = obj_to_id(ist, psrecp, obj); if_exc_return;
 	ADD_BUF_START();
 	ADD_NUM(id); 
 	ADD_BUF_TO_DATUM(key);
 
-	id_tuple = dict_item(ist, psrecp->idobj_to_id, obj);
-	if (id_tuple) {
-		size_t slen;
-		char* s1 = pr_strptr(list_item(ist, id_tuple, 0));
-		char* s2 = pr_strptr(list_item(ist, id_tuple, 1));
-		if_exc_return;
-		slen = strlen(s1)+strlen(s2)+2;
-		ADD_BUF_START();
-		ADD_CHR('`');
-		ADD_STR(s1);
-		ADD_CHR('.');
-		ADD_STR(s2);
-		ADD_BUF_TO_DATUM(value);
-
-#ifdef PROSIST_DEBUG
-	{	char *valbuf, *keybuf = pr_malloc(key.dsize+1);
-		memcpy(keybuf, key.dptr, key.dsize);
-		keybuf[key.dsize] = 0;
-		valbuf = pr_malloc(value.dsize+1);
-		memcpy(valbuf, value.dptr, value.dsize);
-		valbuf[value.dsize] = 0;
-		printf("store_obj, key: %s, val: %s\n", keybuf, valbuf); }
-#endif
-		aprerr = apr_dbm_store(psrecp->db, key, value);
-		IF_APR_DBM_ERR(psrecp->db, "storing id object ", value.dptr);
-		ADD_BUF_END();
-		return;
-	}
 	proxy_obj = dict_item(ist, psrecp->obj_to_proxy, obj);
 	if (!proxy_obj) {
 		raise_exception(ist, ProsistExc_OBJ, "store_obj called with unknown obj");
@@ -498,7 +472,7 @@
 	}
 	ADD_BUF_START();
 	plen = proto_len(ist, proxy_obj);
-	if (plen) ADD_CHR('p');  // Tuple proto = 992060
+	if (plen) ADD_CHR('p');
 	for(i=0; i < plen; i++) {
 		psid_t id = obj_to_id(ist, psrecp, proto_item(ist, proxy_obj, i)); if_exc_return;
 		ADD_NUM(id);
@@ -563,102 +537,88 @@
 	del_unlock(olst);
 }
 
-//******************************** rdlock_append ******************************
-int rdlock_append(isp ist, psrec_p psrecp, obj_p olst, obj_p obj) {/*
-	if_rdlock(obj) {								
-		unlock_objects(ist, olst);
-		return TRUE;
-	}
-	if (is_unclonable(obj) || obj_registered_QUES(ist, psrecp, obj))
-		return FALSE;
-
-	if_exc_return TRUE;
-
-	list_append(ist, olst, obj);
-*/	return FALSE;
-}
-
-//******************************** obj_registered_QUES ************************
-int obj_registered_QUES(isp ist, psrec_p psrecp, obj_p obj) {
-	obj_p id_obj = dict_item(ist, psrecp->obj_to_id, obj);
-	if_exc_return FALSE;
-	if (!id_obj) {
-		id_obj = NEW_INT(psrecp->nextid++);
-		dict_add(ist, psrecp->obj_to_id, obj, id_obj); if_exc_return FALSE;
-		dict_add(ist, psrecp->id_to_obj, id_obj, obj); 
-		return FALSE;
-	}
-	return TRUE;
-}
-
-/*
-add locked objects
-	if obj in obj-to-id return
-	lock object
-	assign id
-	if identity tuple
-		store obj in obj-to-id
-		store obj in id-to-obj
-		store obj in obj-to-tuple
-		store obj in tuple-to-obj
-		write obj to dbm
-		unlock object
-	else
-		get proxy object
-		if (unclonable or proxy == None) 
-			unlock object
-			return
-		store proxy in obj-to-obj_to_proxy
-		store obj in obj-to-id
-		store obj in id-to-obj
-		for each reference
-			if ref not in obj-to-id and clonable
-				add ref to reflist
-*/
-
 //******************************** append_store_refs ****************************
-void append_store_refs(isp ist, psrec_p psrecp, obj_p obj, obj_p store_refs) {/*
-	obj_p id_tuple, proxy_obj;
+void append_store_refs(isp ist, psrec_p psrecp, obj_p obj, int objidx, obj_p store_refs) {
+	psid_t id;
+	obj_p id_obj, id_tuple, proxy_obj;
 	int i, idx=0, plen, tuple_type=FALSE;
-	obj_p obj = list_item(ist, store_refs, *loidx);
-	
+
+	if (obj == OBJ(NONE) || dict_item(ist, psrecp->obj_to_id, obj)) return;
+	rdlock_rtrn(obj);
+	id = psrecp->nextid++;
+	id_obj = NEW_INT(id);
+
 	if (id_tuple = get_attr(ist, obj, SYM(__ID__))) {
-		dict_add(ist, psrecp->id_to_idobj, id_tuple, obj);
+		apr_status_t aprerr;
+		size_t slen;
+		char *s1, *s2;
+		apr_datum_t key, value;
+		ADD_BUF_DECLARE;
+		dict_add(ist, psrecp->obj_to_id, obj, id_obj);     if_exc_return;
+		dict_add(ist, psrecp->id_to_obj, id_obj, obj);     if_exc_return;
+		dict_add(ist, psrecp->id_to_idobj, id_tuple, obj); if_exc_return;
 		dict_add(ist, psrecp->idobj_to_id, obj, id_tuple);
-		(*loidx)++;
+		ADD_BUF_START();
+		ADD_NUM(id); 
+		ADD_BUF_TO_DATUM(key);
+		s1 = pr_strptr(list_item(ist, id_tuple, 0));
+		s2 = pr_strptr(list_item(ist, id_tuple, 1));
+		slen = strlen(s1)+strlen(s2)+2;
+		ADD_BUF_START();
+		ADD_CHR('`');
+		ADD_STR(s1);
+		ADD_CHR('.');
+		ADD_STR(s2);
+		ADD_BUF_TO_DATUM(value);
+#ifdef PROSIST_DEBUG
+	{	char *valbuf, *keybuf = pr_malloc(key.dsize+1);
+		memcpy(keybuf, key.dptr, key.dsize);
+		keybuf[key.dsize] = 0;
+		valbuf = pr_malloc(value.dsize+1);
+		memcpy(valbuf, value.dptr, value.dsize);
+		valbuf[value.dsize] = 0;
+		printf("store id obj, key: %s, val: %s\n", keybuf, valbuf); }
+#endif
+		aprerr = apr_dbm_store(psrecp->db, key, value);
+		IF_APR_DBM_ERR(psrecp->db, "storing id object ", value.dptr);
+		ADD_BUF_END();
+		read_unlock(ist, obj);
+		list_item_set(ist, store_refs, objidx, OBJ(NONE));
 		return;
 	}
-	proxy_obj = call_func0(ist, obj, SYM(__TOSTORPROXY__));
-	if (ist->exception_obj) { unlock_objects(ist, psrecp); return; }
+	proxy_obj = call_func0(ist, obj, SYM(__TOSTORPROXY__)); if_exc_return;
 	
 	if (proxy_obj == OBJ(NONE) || is_unclonable(proxy_obj)) { 
 		del_unlock(proxy_obj); 
 		read_unlock(ist, obj);
-		list_item_set(ist, store_refs, *loidx, OBJ(NONE));
-		(*loidx)++;
+		list_item_set(ist, store_refs, objidx, OBJ(NONE));
 		return;
 	}
 	if (proxy_obj->data_type == DATA_TYPE_DATAPTR) {
 		tuple_type = has_proto_QUES(ist, proxy_obj, OBJ(TUPLE_PROTO));
 		if (!tuple_type && !has_proto_QUES(ist, proxy_obj, OBJ(STRING_PROTO))) {
 			raise_exception(ist, ProsistExc_OBJ, "unstorable object (data ptr) found in tree");
-			unlock_objects(ist, psrecp); 
 			return;
 		}
 	}
-	(*loidx)++;
-	dict_add(ist, psrecp->obj_to_proxy, obj, proxy_obj);
+	dict_add(ist, psrecp->obj_to_proxy, obj,    proxy_obj); if_exc_return;
+	dict_add(ist, psrecp->obj_to_id,    obj,    id_obj);    if_exc_return;
+	dict_add(ist, psrecp->id_to_obj,    id_obj, obj);       if_exc_return;
 
 	plen = proto_len(ist, proxy_obj);
 	for(i=0; i < plen; i++) {
 		obj_p proto = proto_item(ist, proxy_obj, i);
-		if (rdlock_append(ist, psrecp, store_refs, proto)) return;
+		if (!is_unclonable(proto) && !dict_item(ist, psrecp->obj_to_id, proto))
+			list_append(ist, store_refs, proto);
+		if_exc_return;
 	}
 	if (proxy_obj->has_attrs) {
 		attr_key_t key = attr_first_key(ist, proxy_obj);
 		while(key) {
 			obj_p attr = attr_value_by_key(ist, proxy_obj, key);
-			if (rdlock_append(ist, psrecp, store_refs, attr)) return;
+			if (!is_unclonable(attr) && !dict_item(ist, psrecp->obj_to_id, attr))
+				list_append(ist, store_refs, attr);
+			if_exc_return;
 			key = attr_next_key(ist, proxy_obj, key);
 		}
 	}
@@ -666,10 +626,12 @@
 		int llen = (int) list_len(ist, proxy_obj);
 		for (i=0; i < llen; i++) {
 			obj_p item = list_item(ist, proxy_obj, i);
-			if (rdlock_append(ist, psrecp, store_refs, item)) return;
+			if (!is_unclonable(item) && !dict_item(ist, psrecp->obj_to_id, item))
+				list_append(ist, store_refs, item);
+			if_exc_return;
 		}
 	}
-*/}
+}
 
 //******************************** load_db ************************************
 obj_p load_db(isp ist, psrec_p psrecp) {
@@ -717,7 +679,7 @@
 	list_append(ist, store_refs, psrecp->root);
 	for (i=0; i < (int) list_len(ist, store_refs); i++) {
 		obj_p item = list_item(ist, store_refs, i);
-		append_store_refs(ist, psrecp, item, store_refs);
+		append_store_refs(ist, psrecp, item, i, store_refs);
 		IF_EXC_UNLKOBJS_RTRN();
 	}
 	llen = (int) list_len(ist, store_refs);

Modified: trunk/pr/closure.pr
===================================================================
--- trunk/pr/closure.pr	2004-04-23 07:36:32 UTC (rev 403)
+++ trunk/pr/closure.pr	2004-04-23 19:42:56 UTC (rev 404)
@@ -1,13 +1,17 @@
 #!/usr/bin/env prothon
 
+print
+print 'this should print 1 2 3'
+# tested example
+def getFunc():
+    counter = 0
+    def count():
+            &counter += 1
+            print &counter,
+    return count
 
-def f1():
-   count = 0
-   def f2():
-      &count += 1
-      return &count
-   return f2
-
-f =f1()
-print f(), f(), f()  # prints 1 2 3
-
+c = getFunc()
+c()     # prints 1
+c()     # prints 2
+c()     # prints 3
+    
\ No newline at end of file