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