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 },