rev 405 - trunk/modules/Prosist
SVN User <[email protected]> Fri, 23 Apr 2004 19:27:20 -0400
| Newsgroups | gmane.comp.lang.prothon.cvs |
|---|---|
| Message-ID | <[email protected]> |
Author: mark
Date: 2004-04-23 19:27:18 -0400 (Fri, 23 Apr 2004)
New Revision: 405
Modified:
trunk/modules/Prosist/Prosist.c
Log:
fixed problem losing types in prosist saving
Modified: trunk/modules/Prosist/Prosist.c
===================================================================
--- trunk/modules/Prosist/Prosist.c 2004-04-23 19:42:56 UTC (rev 404)
+++ trunk/modules/Prosist/Prosist.c 2004-04-23 23:27:18 UTC (rev 405)
@@ -80,6 +80,7 @@
MODULE_DECLARE(Prosist);
MODULE_DECLARE(ProsistExc);
+MODULE_DECLARE(MutWrap);
MODULE_CONSTANT_DECLARE(Prosist, READONLY );
MODULE_CONSTANT_DECLARE(Prosist, READWRITE);
@@ -142,6 +143,16 @@
#define ADD_BUF_END() pr_free(_buf)
+//******************************** new_mutwrap_obj ****************************
+obj_p new_mutwrap_obj(isp ist, obj_p obj) {
+ obj_p mutwrap_obj = new_object(ist, MutWrap_OBJ);
+ mutwrap_obj->data_type = DATA_TYPE_DATAPTR;
+ mutwrap_obj->data.ptr = obj;
+ set_immutable(mutwrap_obj);
+ return mutwrap_obj;
+}
+#define NEW_MW(obj) new_mutwrap_obj(ist, obj)
+
//******************************** load_dbm_int *******************************
i32_t load_dbm_int(psrec_p psrecp, char* key) {
apr_status_t aprerr;
@@ -226,13 +237,19 @@
//******************************** obj_to_id ********************************
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;
+ psid_t res;
+ obj_p id_obj, mw_obj;
+ mw_obj = NEW_MW(obj);
+ id_obj = dict_item(ist, psrecp->obj_to_id, mw_obj); if_exc_return -1;
if (!id_obj) {
//dump(ist, "obj-to-id.txt", obj);
raise_exception(ist, ProsistExc_OBJ, "obj_to_id called on obj with no id");
- return -1;
+ } else {
+ del_unlock(id_obj);
+ res = (psid_t) id_obj->data.i64;
}
- return (psid_t) id_obj->data.i64;
+ del_unlock(mw_obj);
+ return res;
}
//******************************** apr_str ************************************
@@ -247,7 +264,8 @@
void empty_obj(isp ist, psrec_p psrecp, obj_p id_obj, int *new_flg) {
if (*new_flg) {
obj_p obj = NEW_OBJ(NULL);
- dict_add(ist, psrecp->obj_to_id, obj, id_obj); if_exc_return;
+ obj_p mw_obj = NEW_MW(obj);
+ dict_add(ist, psrecp->obj_to_id, mw_obj, id_obj); if_exc_return;
dict_add(ist, psrecp->id_to_obj, id_obj, obj);
}
*new_flg = FALSE;
@@ -276,9 +294,8 @@
for(n=0; *p != ',' && *p != ';'; p++)
n = n*10 + *p - '0';
ref_idobj = NEW_INT(n);
- proto = dict_item( ist, psrecp->id_to_obj,
- ref_idobj); if_exc_return NULL;
- del_unlock(ref_idobj);
+ proto = dict_item( ist, psrecp->id_to_obj, ref_idobj);
+ del_unlock(ref_idobj); if_exc_return NULL;
if (first_proto)
switch_proto(ist, obj, proto);
else
@@ -363,7 +380,7 @@
case '`': {
int i=0, mlen, module_flg = TRUE;
char *module, *name;
- obj_p module_obj, obj, id_tuple;
+ obj_p module_obj, mw_obj, obj, id_tuple;
mlen = max(8, (int) value.dsize);
module = pr_malloc(mlen);
for(p++; *p != '.'; p++) module[i++] = *p;
@@ -389,10 +406,12 @@
raise_exception(ist, ProsistExc_OBJ, "identity object is missing id tuple");
return;
}
+ mw_obj = NEW_MW(obj);
dict_add(ist, psrecp->id_to_obj, id_obj, obj); if_exc_return;
- dict_add(ist, psrecp->obj_to_id, obj, id_obj); if_exc_return;
+ dict_add(ist, psrecp->obj_to_id, mw_obj, id_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);
+ dict_add(ist, psrecp->idobj_to_id, mw_obj, id_tuple);
+ del_unlock(mw_obj);
break;
}
case 'p': {
@@ -453,7 +472,7 @@
void store_obj(isp ist, psrec_p psrecp, obj_p obj) {
apr_status_t aprerr;
apr_datum_t key, value;
- obj_p proxy_obj;
+ obj_p mw_obj, proxy_obj;
psid_t id;
int i, plen, added_attr = FALSE;
ADD_BUF_DECLARE;
@@ -465,7 +484,9 @@
ADD_NUM(id);
ADD_BUF_TO_DATUM(key);
- proxy_obj = dict_item(ist, psrecp->obj_to_proxy, obj);
+ mw_obj = NEW_MW(obj);
+ proxy_obj = dict_item(ist, psrecp->obj_to_proxy, mw_obj);
+ del_unlock(mw_obj);
if (!proxy_obj) {
raise_exception(ist, ProsistExc_OBJ, "store_obj called with unknown obj");
return;
@@ -540,10 +561,14 @@
//******************************** append_store_refs ****************************
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;
+ obj_p mw_obj, id_obj, id_tuple, proxy_obj;
int i, idx=0, plen, tuple_type=FALSE;
- if (obj == OBJ(NONE) || dict_item(ist, psrecp->obj_to_id, obj)) return;
+ mw_obj = NEW_MW(obj);
+ if (obj == OBJ(NONE) || dict_item(ist, psrecp->obj_to_id, mw_obj)) {
+ del_unlock(mw_obj);
+ return;
+ }
rdlock_rtrn(obj);
id = psrecp->nextid++;
id_obj = NEW_INT(id);
@@ -554,10 +579,14 @@
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);
+ dict_add(ist, psrecp->obj_to_id, mw_obj, id_obj);
+ if (ist->exception_obj) { del_unlock(mw_obj); return; }
+ dict_add(ist, psrecp->id_to_obj, id_obj, obj);
+ if (ist->exception_obj) { del_unlock(mw_obj); return; }
+ dict_add(ist, psrecp->id_to_idobj, id_tuple, obj);
+ if (ist->exception_obj) { del_unlock(mw_obj); return; }
+ dict_add(ist, psrecp->idobj_to_id, mw_obj, id_tuple);
+ if (ist->exception_obj) { del_unlock(mw_obj); return; }
ADD_BUF_START();
ADD_NUM(id);
ADD_BUF_TO_DATUM(key);
@@ -584,12 +613,14 @@
ADD_BUF_END();
read_unlock(ist, obj);
list_item_set(ist, store_refs, objidx, OBJ(NONE));
+ del_unlock(mw_obj);
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);
+ del_unlock(mw_obj);
read_unlock(ist, obj);
list_item_set(ist, store_refs, objidx, OBJ(NONE));
return;
@@ -598,26 +629,37 @@
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");
+ del_unlock(proxy_obj);
+ del_unlock(mw_obj);
return;
}
}
- 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;
+ dict_add(ist, psrecp->obj_to_proxy, mw_obj, proxy_obj);
+ if (ist->exception_obj) { del_unlock(mw_obj); return; }
+ dict_add(ist, psrecp->obj_to_id, mw_obj, id_obj);
+ if (ist->exception_obj) { del_unlock(mw_obj); return; }
+ dict_add(ist, psrecp->id_to_obj, id_obj, obj);
+ if (ist->exception_obj) { del_unlock(mw_obj); return; }
+ del_unlock(mw_obj);
+
plen = proto_len(ist, proxy_obj);
- for(i=0; i < plen; i++) {
+ for(i=0; i < plen; i++) { // Tuple proto 992060
obj_p proto = proto_item(ist, proxy_obj, i);
- if (!is_unclonable(proto) && !dict_item(ist, psrecp->obj_to_id, proto))
+ mw_obj = NEW_MW(proto);
+ if (!is_unclonable(proto) && !dict_item(ist, psrecp->obj_to_id, mw_obj))
list_append(ist, store_refs, proto);
+ del_unlock(mw_obj);
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 (!is_unclonable(attr) && !dict_item(ist, psrecp->obj_to_id, attr))
+ mw_obj = NEW_MW(attr);
+ if (!is_unclonable(attr) && !dict_item(ist, psrecp->obj_to_id, mw_obj))
list_append(ist, store_refs, attr);
+ del_unlock(mw_obj);
if_exc_return;
key = attr_next_key(ist, proxy_obj, key);
}
@@ -626,8 +668,10 @@
int llen = (int) list_len(ist, proxy_obj);
for (i=0; i < llen; i++) {
obj_p item = list_item(ist, proxy_obj, i);
- if (!is_unclonable(item) && !dict_item(ist, psrecp->obj_to_id, item))
+ mw_obj = NEW_MW(item);
+ if (!is_unclonable(item) && !dict_item(ist, psrecp->obj_to_id, mw_obj))
list_append(ist, store_refs, item);
+ del_unlock(mw_obj);
if_exc_return;
}
}
@@ -636,7 +680,7 @@
//******************************** 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;
+ obj_p 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++) {
@@ -651,8 +695,8 @@
del_unlock(id_obj);
}
- debug = dict_item(ist, root, NEW_INT(1));
- dump(ist, "root.txt", debug);
+ //debug = dict_item(ist, root, NEW_MW(NEW_INT(1)));
+ //dump(ist, "root.txt", debug);
return root;
}
@@ -702,6 +746,10 @@
MODULE_SET_DOC(ProsistExc, "Prosist module error");
MODULE_ADD_TO_OBJ(ProsistExc, Prosist_OBJ, "ProsistException");
+ MutWrap_OBJ = NEW_OBJ(NULL);
+ MODULE_SET_DOC(MutWrap, "wrapper to make any object immutable and storable by object id");
+ MODULE_ADD_TO_OBJ(MutWrap, Prosist_OBJ, "MutWrap");
+
Prosist_OBJ->unclonable = TRUE;
set_obj_rdacc(Prosist_OBJ, ACC_USER1);
@@ -809,7 +857,20 @@
return parms[1];
}
+DEF(MutWrap, __hash__, NULL) {
+ return new_hash_obj(ist, (i32_t)(intptr_t) self->data.ptr);
+}
+DEF(MutWrap, __eq__QUES, FORM_RPARAM) {
+ CHECK_TYPE_EXC(parms[1], MutWrap_OBJ, "immutable object wrapper");
+ if (self->data.ptr == parms[1]->data.ptr) return OBJ(PR_TRUE);
+ else return OBJ(PR_FALSE);
+}
+
+DEF(MutWrap, __objList__, FORM_RPARAM) {
+ return parms[1];
+}
+
MAIN_MODULE_INIT(Prosist)
{
MODULE_SUB_INIT(Prosist);
@@ -818,5 +879,9 @@
MODULE_ADD_SYM(Prosist, closed_QUES);
MODULE_ADD_SYM(Prosist, __objList__);
+ MODULE_ADD_SYM(MutWrap, __hash__);
+ MODULE_ADD_SYM(MutWrap, __eq__QUES);
+ MODULE_ADD_SYM(MutWrap, __objList__);
+
check_exceptions(ist);
}