rev 403 - in trunk: include/prothon modules/Prosist pr src

SVN User <[email protected]> Fri, 23 Apr 2004 03:36:34 -0400
Newsgroups gmane.comp.lang.prothon.cvs
Message-ID <[email protected]>
Author: mark
Date: 2004-04-23 03:36:32 -0400 (Fri, 23 Apr 2004)
New Revision: 403

Modified:
   trunk/include/prothon/prothon.h
   trunk/modules/Prosist/Prosist.c
   trunk/pr/prosist.pr
   trunk/src/builtins-core.c
   trunk/src/builtins-dict.c
   trunk/src/object.c
   trunk/src/symbol.c
Log:
in middle of Prosist restructuring

Modified: trunk/include/prothon/prothon.h
===================================================================
--- trunk/include/prothon/prothon.h	2004-04-23 01:23:16 UTC (rev 402)
+++ trunk/include/prothon/prothon.h	2004-04-23 07:36:32 UTC (rev 403)
@@ -64,6 +64,9 @@
 #define TRACE_INTERPRETER
 //#define DUMP_OBJECTS_AT_END
 
+#define PROSIST_DEBUG
+
+
 //*****************************************************************************
 
 #include <apr.h>
@@ -233,9 +236,8 @@
 //************************* WELL-KNOWN-OBJECTS ********************************
 // these are created at object system initialization
 typedef enum {
-	NO_PROTO=-1,
 // "identity" objects
-	PR_FALSE,			// 0 False
+	PR_FALSE=0,			// 0 False
 	PR_TRUE,			// 1 True
 	OBJECT,				// 2 Object
 	NONE,				// 3 None

Modified: trunk/modules/Prosist/Prosist.c
===================================================================
--- trunk/modules/Prosist/Prosist.c	2004-04-23 01:23:16 UTC (rev 402)
+++ trunk/modules/Prosist/Prosist.c	2004-04-23 07:36:32 UTC (rev 403)
@@ -73,7 +73,7 @@
 	obj_p		idobj_to_id;
 	obj_p		id_to_obj;
 	obj_p		obj_to_id;
-	obj_p		proxies;
+	obj_p		obj_to_proxy;
 } psrec_t;
 
 typedef psrec_t* psrec_p;
@@ -155,6 +155,17 @@
 	aprerr = apr_dbm_fetch(psrecp->db, key_d, &value);
 	IF_APR_DBM_ERR(psrecp->db, "loading int value ", key_d.dptr);
 	ADD_BUF_END();
+
+#ifdef PROSIST_DEBUG
+	{	char *valbuf, *keybuf = pr_malloc(key_d.dsize+1);
+		memcpy(keybuf, key_d.dptr, key_d.dsize);
+		keybuf[key_d.dsize] = 0;
+		valbuf = pr_malloc(value.dsize+1);
+		memcpy(valbuf, value.dptr, value.dsize);
+		valbuf[value.dsize] = 0;
+		printf("load_dbm_int, key: %s, val: %s\n", keybuf, valbuf); }
+#endif
+
 	return atoi(value.dptr);
 }
 
@@ -171,6 +182,16 @@
 	ADD_NUM(val);
 	ADD_BUF_TO_DATUM(value);
 
+#ifdef PROSIST_DEBUG
+	{	char *valbuf, *keybuf = pr_malloc(key_d.dsize+1);
+		memcpy(keybuf, key_d.dptr, key_d.dsize);
+		keybuf[key_d.dsize] = 0;
+		valbuf = pr_malloc(value.dsize+1);
+		memcpy(valbuf, value.dptr, value.dsize);
+		valbuf[value.dsize] = 0;
+		printf("store_dbm_int, key: %s, val: %s\n", keybuf, valbuf); }
+#endif
+
 	aprerr = apr_dbm_store(psrecp->db, key_d, value);
 	IF_APR_DBM_ERR(psrecp->db, "storing int value ", key_d.dptr);
 	ADD_BUF_END();
@@ -189,6 +210,17 @@
 	aprerr = apr_dbm_fetch(psrecp->db, key, &value);
 	IF_APR_DBM_ERR(psrecp->db, "loading object ", key.dptr);
 	ADD_BUF_END();
+
+#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("load_obj_by_id, key: %s, val: %s\n", keybuf, valbuf); }
+#endif
+
 	return value;
 }
 
@@ -196,26 +228,13 @@
 psid_t obj_to_id(isp ist, psrec_p psrecp, obj_p obj) {
 	obj_p id_obj = dict_item(ist, psrecp->obj_to_id, obj); if_exc_return -1;
 	if (!id_obj) {
-		dump(ist, "obj-to-id.txt", obj);
+		//dump(ist, "obj-to-id.txt", obj);
 		raise_exception(ist, ProsistExc_OBJ, "obj_to_id called on obj with no id");
 		return -1;
 	}
 	return (psid_t) id_obj->data.i64;
 }
 
-//******************************** 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;
-}
-
 //******************************** apr_str ************************************
 apr_datum_t apr_str(char* str){
 	apr_datum_t apr_str;
@@ -245,7 +264,7 @@
 	value = load_obj_by_id(psrecp, id);  if_exc_return NULL;
 	p = value.dptr;
 	end = p + value.dsize;
-
+	
 	obj = dict_item(ist, psrecp->id_to_obj, id_obj);  if_exc_return NULL;
 
 	while (p < end) {
@@ -322,8 +341,8 @@
 	return res;
 }
 
-//******************************** append_ids *********************************
-void append_ids(isp ist, psrec_p psrecp, obj_p idlist, psid_t id) {
+//******************************** append_load_ids *********************************
+void append_load_ids(isp ist, psrec_p psrecp, obj_p idlist, psid_t id) {
 	apr_datum_t value;
 	obj_p id_obj;
 	psid_t n;
@@ -430,26 +449,6 @@
 	}
 }
 
-//******************************** load_db ************************************
-obj_p load_db(isp ist, psrec_p psrecp) {
-	int llen, idx = 0;
-	obj_p idlist = new_list_obj(ist, 20), root = NULL;
-		
-	append_ids(ist, psrecp, idlist, 0); if_exc_return NULL;
-	for (; idx < (int) list_len(ist, idlist); idx++) {
-		psid_t id = (psid_t) (list_item(ist, idlist, idx)->data.i64);
-		append_ids(ist, psrecp, idlist, id); if_exc_return NULL;
-	}
-	root = load_obj(ist, psrecp, NEW_INT(0)); if_exc_return NULL;
-	llen = (int) list_len(ist, idlist);
-	for(idx=0; idx < llen; idx++) {
-		obj_p id_obj = list_item(ist, idlist, idx);
-		load_obj(ist, psrecp, id_obj); if_exc_return NULL;
-		del_unlock(id_obj);
-	}
-	return root;
-}
-
 //******************************** store_obj **********************************
 void store_obj(isp ist, psrec_p psrecp, obj_p obj) {
 	apr_status_t aprerr;
@@ -477,19 +476,29 @@
 		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->proxies, obj);
+	proxy_obj = dict_item(ist, psrecp->obj_to_proxy, obj);
 	if (!proxy_obj) {
 		raise_exception(ist, ProsistExc_OBJ, "store_obj called with unknown obj");
 		return;
 	}
 	ADD_BUF_START();
 	plen = proto_len(ist, proxy_obj);
-	if (plen) ADD_CHR('p');
+	if (plen) ADD_CHR('p');  // Tuple proto = 992060
 	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);
@@ -527,26 +536,37 @@
 		}
 	}
 	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 proxy object ", key.dptr);
 	ADD_BUF_END();
 }
 
-//******************************** unlock_list ********************************
-void unlock_list(isp ist, obj_p olst) {
+//******************************** unlock_objects *****************************
+void unlock_objects(isp ist, psrec_p psrecp) {
+	obj_p olst = dict_keys_values(ist, psrecp->obj_to_proxy, 1 /*keys*/);
 	int i, llen = (int) list_len(ist, olst);
 	for(i=0; i < llen; i++) {					
 		obj_p item = list_item(ist, olst, i);		
-		if (item != OBJ(NONE))					
-			read_unlock(ist, item);				
+		read_unlock(ist, item);				
 	}											
 	del_unlock(olst);
 }
 
 //******************************** rdlock_append ******************************
-int rdlock_append(isp ist, psrec_p psrecp, obj_p olst, obj_p obj) {
+int rdlock_append(isp ist, psrec_p psrecp, obj_p olst, obj_p obj) {/*
 	if_rdlock(obj) {								
-		unlock_list(ist, olst);
+		unlock_objects(ist, olst);
 		return TRUE;
 	}
 	if (is_unclonable(obj) || obj_registered_QUES(ist, psrecp, obj))
@@ -555,14 +575,52 @@
 	if_exc_return TRUE;
 
 	list_append(ist, olst, obj);
-	return FALSE;
+*/	return FALSE;
 }
 
-//******************************** add_locked_objs ****************************
-void add_locked_objs(isp ist, psrec_p psrecp, int *loidx, obj_p locked_objs) {
+//******************************** 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;
 	int i, idx=0, plen, tuple_type=FALSE;
-	obj_p obj = list_item(ist, locked_objs, *loidx);
+	obj_p obj = list_item(ist, store_refs, *loidx);
 	
 	if (id_tuple = get_attr(ist, obj, SYM(__ID__))) {
 		dict_add(ist, psrecp->id_to_idobj, id_tuple, obj);
@@ -571,12 +629,12 @@
 		return;
 	}
 	proxy_obj = call_func0(ist, obj, SYM(__TOSTORPROXY__));
-	if (ist->exception_obj) { unlock_list(ist, locked_objs); return; }
+	if (ist->exception_obj) { unlock_objects(ist, psrecp); return; }
 	
 	if (proxy_obj == OBJ(NONE) || is_unclonable(proxy_obj)) { 
 		del_unlock(proxy_obj); 
 		read_unlock(ist, obj);
-		list_item_set(ist, locked_objs, *loidx, OBJ(NONE));
+		list_item_set(ist, store_refs, *loidx, OBJ(NONE));
 		(*loidx)++;
 		return;
 	}
@@ -584,23 +642,23 @@
 		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_list(ist, locked_objs); 
+			unlock_objects(ist, psrecp); 
 			return;
 		}
 	}
 	(*loidx)++;
-	dict_add(ist, psrecp->proxies, obj, proxy_obj);
+	dict_add(ist, psrecp->obj_to_proxy, obj, proxy_obj);
 
 	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, locked_objs, proto)) return;
+		if (rdlock_append(ist, psrecp, store_refs, proto)) 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, locked_objs, attr)) return;
+			if (rdlock_append(ist, psrecp, store_refs, attr)) return;
 			key = attr_next_key(ist, proxy_obj, key);
 		}
 	}
@@ -608,21 +666,45 @@
 		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, locked_objs, item)) return;
+			if (rdlock_append(ist, psrecp, store_refs, item)) return;
 		}
 	}
+*/}
+
+//******************************** load_db ************************************
+obj_p load_db(isp ist, psrec_p psrecp) {
+	int llen, idx = 0;
+	obj_p debug, idlist = new_list_obj(ist, 20), root = NULL;
+		
+	append_load_ids(ist, psrecp, idlist, 0); if_exc_return NULL;
+	for (; idx < (int) list_len(ist, idlist); idx++) {
+		psid_t id = (psid_t) (list_item(ist, idlist, idx)->data.i64);
+		append_load_ids(ist, psrecp, idlist, id); if_exc_return NULL;
+	}
+	root = load_obj(ist, psrecp, NEW_INT(0)); if_exc_return NULL;
+	llen = (int) list_len(ist, idlist);
+	for(idx=0; idx < llen; idx++) {
+		obj_p id_obj = list_item(ist, idlist, idx);
+		load_obj(ist, psrecp, id_obj); if_exc_return NULL;
+		del_unlock(id_obj);
+	}
+
+	debug = dict_item(ist, root, NEW_INT(1));
+	dump(ist, "root.txt", debug);
+
+	return root;
 }
 
-#define IF_EXC_UNLKLIST_RTRN()			\
+#define IF_EXC_UNLKOBJS_RTRN()			\
 	if (ist->exception_obj) {			\
-		unlock_list(ist, locked_objs);	\
+		unlock_objects(ist, psrecp);	\
 		return;							\
 	}
 
 //******************************** store_new_db *******************************
 void store_new_db(isp ist, psrec_p psrecp) {
-	obj_p locked_objs;
-	int i, idx = 0, llen;
+	obj_p store_refs;
+	int i, llen;
 	if (apr_dbm_exists(psrecp->db, apr_str("0"))) {
 		raise_exception(ist, ProsistExc_OBJ, "Database already exists");
 		return;
@@ -631,25 +713,22 @@
 		raise_exception(ist, ProsistExc_OBJ, "root object is not storable");
 		return;
 	}
-	// use ist->lockstack for this?
-	locked_objs = new_list_obj(ist, 20); 
-	if (rdlock_append(ist, psrecp, locked_objs, psrecp->root)) return;
-	while (idx < (int) list_len(ist, locked_objs)) {
-		add_locked_objs(ist, psrecp, &idx, locked_objs);
-		IF_EXC_UNLKLIST_RTRN();
+	store_refs = new_list_obj(ist, 20); 
+	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);
+		IF_EXC_UNLKOBJS_RTRN();
 	}
-	llen = (int) list_len(ist, locked_objs);
+	llen = (int) list_len(ist, store_refs);
 	for (i=0; i < llen; i++) {
-		obj_p item = list_item(ist, locked_objs, i);
-		if (item != OBJ(NONE)) {
-			store_obj(ist, psrecp, item);
-			IF_EXC_UNLKLIST_RTRN();
-		}
+		obj_p item = list_item(ist, store_refs, i);
+		store_obj(ist, psrecp, item);
+		IF_EXC_UNLKOBJS_RTRN();
 	}
-	unlock_list(ist, locked_objs);
+	unlock_objects(ist, psrecp);
 }
 
-
 //******************************** FUNCTION DEFS ******************************
 MODULE_START(Prosist)
 {
@@ -713,7 +792,7 @@
 	psrecp->idobj_to_id = NEW_DICT(4*INITIAL_OBJ_COUNT);
 	psrecp->id_to_obj   = NEW_DICT(4*INITIAL_OBJ_COUNT);
 	psrecp->obj_to_id   = NEW_DICT(4*INITIAL_OBJ_COUNT);
-	psrecp->proxies     = NEW_DICT(4*INITIAL_OBJ_COUNT);
+	psrecp->obj_to_proxy     = NEW_DICT(4*INITIAL_OBJ_COUNT);
 
 	if (root_obj == OBJ(NONE)) {
 		psrecp->nextid = load_dbm_int(psrecp, "!nextid");

Modified: trunk/pr/prosist.pr
===================================================================
--- trunk/pr/prosist.pr	2004-04-23 01:23:16 UTC (rev 402)
+++ trunk/pr/prosist.pr	2004-04-23 07:36:32 UTC (rev 403)
@@ -3,13 +3,20 @@
 # prosist.pr
 
 import Prosist
+
 #/*
+print
+
 a = {1:(2,)}
 db = Prosist('test.pdb', root=a, mode=Prosist.RWTRUNCATE)
 db.close()
+
+print
+
 db = Prosist('test.pdb')
 print db.root
 db.close()
+
 #*/
 
 /*
Modified: trunk/src/builtins-core.c
===================================================================
--- trunk/src/builtins-core.c	2004-04-23 01:23:16 UTC (rev 402)
+++ trunk/src/builtins-core.c	2004-04-23 07:36:32 UTC (rev 403)
@@ -495,9 +495,8 @@
 		int is_str;
 
 		if (item) {
-			is_str = has_proto_QUES(ist, item, OBJ(STRING_PROTO));
-
-			if ((uintptr_t)item > 10) {
+			if ((uintptr_t) item > 10) {
+				is_str = has_proto_QUES(ist, item, OBJ(STRING_PROTO));
 				item_str = as_str(ist, item);
 			} else {
 				apr_snprintf(msg, sizeof(msg), "<objptr:%lx>", (unsigned long)(uintptr_t)item);

Modified: trunk/src/builtins-dict.c
===================================================================
--- trunk/src/builtins-dict.c	2004-04-23 01:23:16 UTC (rev 402)
+++ trunk/src/builtins-dict.c	2004-04-23 07:36:32 UTC (rev 403)
@@ -169,11 +169,8 @@
 	i32_t i, hash_in;
 	obj_p key, res, rp[2];
 	dict_p dict, dp;
-	rp[0]=0; rp[1]=key_in;
 
-	//if ((unsigned long)(intptr_t)key_in == 0x009ab740)
-	//	dump(ist, "debug.txt", key_in);
-
+	rp[0]=0; rp[1]=key_in;
 	rdlock_rtrn(dict_obj) NULL;
 	hash_in = hash_value(ist, key_in); 
 	if (ist->exception_obj) {

Modified: trunk/src/object.c
===================================================================
--- trunk/src/object.c	2004-04-23 01:23:16 UTC (rev 402)
+++ trunk/src/object.c	2004-04-23 07:36:32 UTC (rev 403)
@@ -984,11 +984,12 @@
 	obj_p sym_obj = dict_item(ist, OBJ(SYMBOLS), key_obj);
 	if (!sym_obj) {
 		raise_exception(ist, OBJ(INTERNAL_EXC), "key_to_symstr sym lookup error");
-		return "";
+		res = "";
+	} else {
+		res = symch(ist, sym_obj);
+		del_unlock(sym_obj);
 	}
-	res = symch(ist, sym_obj);
 	del_unlock(key_obj);
-	del_unlock(sym_obj);
 	return res;
 }
 
@@ -1040,9 +1041,13 @@
 		for( i=ATTRS_OVERHEAD+attr_bsize(attrs); 
 			 i < ATTRS_OVERHEAD+attr_bsize(attrs)+attr_asize(attrs); i++){
 			if (attrs[i].attr.key > 0) {
+				char* sstr;
 				attr_key_t key = attrs[i].attr.key;
 				obj_p val = attrs[i].attr.value;
-				ind(dep+1); fprintf(fout,"KEY: %s\n", key_to_symstr(ist, key)); prt_flg = 1;
+				sstr = key_to_symstr(ist, key);
+				if (catch_exception(ist, OBJ(INTERNAL_EXC), NULL))
+					sstr = "<***err in key_to_symstr>";
+				ind(dep+1); fprintf(fout,"KEY: %s\n", sstr); prt_flg = 1;
 				ind(dep+1); fprintf(fout,"VALUE: ");prt_flg = 1;
 				if (val) dump_obj(ist, val, dep+1);
 				else     fprintf(fout,"0\n");prt_flg = 1;

Modified: trunk/src/symbol.c
===================================================================
--- trunk/src/symbol.c	2004-04-23 01:23:16 UTC (rev 402)
+++ trunk/src/symbol.c	2004-04-23 07:36:32 UTC (rev 403)
@@ -136,12 +136,12 @@
 	{ "__copy__",		0 },
 	{ "__covers__QUES",	0 },
 	{ "__coerce__",		0 },
-	{ "__str__",		0 }, // cf
+	{ "__str__",		0 },
 	{ "next",			0 },
 	{ "__getItem__",	0 },
 	{ "__setItem__",	0 },
 	{ "__delItem__",	0 },
-	{ "__objList__",	0 },
+	{ "__objList__",	0 }, // f3
 	{ "__cDataLen__",	0 },
 	{ "__del__",		0 },
 	{ "len",			0 },