rev 406 - in trunk: modules/Prosist pr src
SVN User <[email protected]> Sat, 24 Apr 2004 01:38:11 -0400
| Newsgroups | gmane.comp.lang.prothon.cvs |
|---|---|
| Message-ID | <[email protected]> |
Author: mark
Date: 2004-04-24 01:38:08 -0400 (Sat, 24 Apr 2004)
New Revision: 406
Added:
trunk/pr/modint.pr
Modified:
trunk/modules/Prosist/Prosist.c
trunk/pr/prosist.pr
trunk/src/lock.c
Log:
prosist almost works as good as a pickle
Modified: trunk/modules/Prosist/Prosist.c
===================================================================
--- trunk/modules/Prosist/Prosist.c 2004-04-23 23:27:18 UTC (rev 405)
+++ trunk/modules/Prosist/Prosist.c 2004-04-24 05:38:08 UTC (rev 406)
@@ -271,203 +271,6 @@
*new_flg = FALSE;
}
-//******************************** load_obj ***********************************
-obj_p load_obj(isp ist, psrec_p psrecp, obj_p id_obj) {
- apr_datum_t value;
- psid_t n, id;
- char *p, *end;
- obj_p res, obj;
- id = (psid_t) id_obj->data.i64;
-
- 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) {
- switch (*p) {
- case 'p': {
- int first_proto = TRUE;
- while(*p++ != ';') {
- obj_p ref_idobj, proto;
- 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);
- del_unlock(ref_idobj); if_exc_return NULL;
- if (first_proto)
- switch_proto(ist, obj, proto);
- else
- ins_proto(ist, obj, proto, 0x7fffffff);
- first_proto = FALSE;
- }
- break;
- }
- case 'a': {
- while(*p++ != ';') {
- obj_p ref_id_obj, aval;
- char *q, *aname = pr_malloc(value.dsize);
- for (q=aname; *p != ':';) *q++ = *p++;
- *q = 0;
- for(n=0, p++; *p != ',' && *p != ';'; p++)
- n = n*10 + *p - '0';
- ref_id_obj = NEW_INT(n);
- aval = dict_item( ist, psrecp->id_to_obj, ref_id_obj);
- if_exc_return NULL;
- set_attr(ist, obj, sym(ist, aname), aval); if_exc_return NULL;
- del_unlock(ref_id_obj);
- }
- break;
- }
- case 'l': {
- init_list_data(ist, obj, 0);
- while(++p < end) {
- obj_p ref_id_obj, item;
- for(n=0; *p != ',' && p < end; p++)
- n = n*10 + *p - '0';
- ref_id_obj = NEW_INT(n);
- item = dict_item( ist, psrecp->id_to_obj, ref_id_obj);
- if_exc_return NULL;
- list_append(ist, obj, item);
- del_unlock(ref_id_obj);
- }
- goto done;
- }
- case 'i':
- obj->data_type = DATA_TYPE_IMMDATA;
- for(n=0,p++; *p != ':'; p++)
- n = n*10 + *p - '0';
- obj->imm_data_len = n;
- memcpy(&(obj->data), p+1, sizeof(obj->data));
- goto done;
- case 's':
- set_string_data(ist, obj, p+1, end-(p+1));
- goto done;
- case '`':
- del_unlock(obj);
- return NULL;
- default:
- raise_exception(ist, ProsistExc_OBJ, "invalid record from db: %d", id);
- return NULL;
- }
- }
-done:
- res = call_func0(ist, obj, SYM(__FROMSTORPROXY__));
- del_unlock(obj);
- return res;
-}
-
-//******************************** 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;
- int new_flg = TRUE;
- char *p, *end;
-
- id_obj = NEW_INT(id);
- if (dict_item(ist, psrecp->id_to_obj, id_obj)) {
- del_unlock(id_obj);
- return;
- }
- value = load_obj_by_id(psrecp, id); if_exc_return;
- p = value.dptr;
- end = p + value.dsize;
-
- while (p < end) {
- switch (*p) {
- case '`': {
- int i=0, mlen, module_flg = TRUE;
- char *module, *name;
- 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;
- module[i] = 0;
- if (module[0] == '*')
- module_flg = FALSE;
- name = pr_malloc(value.dsize - i);
- for(i=0,p++; p < end; p++) name[i++] = *p;
- name[i] = 0;
- // do auto-import here XXX
- if (module_flg)
- module_obj = get_attr(ist, OBJ(MODULES), sym(ist, module));
- else
- module_obj = OBJ(OBJECT);
- if_exc_return;
- obj = get_attr(ist, module_obj, sym(ist, name)); if_exc_return;
- if (!obj) {
- raise_exception(ist, ProsistExc_OBJ, "identity object %s not found in module %s", name, module);
- return;
- }
- id_tuple = get_attr(ist, obj, SYM(__ID__)); if_exc_return;
- if (!id_tuple) {
- 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, 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, mw_obj, id_tuple);
- del_unlock(mw_obj);
- break;
- }
- case 'p': {
- empty_obj(ist, psrecp, id_obj, &new_flg);
- while(*p++ != ';') {
- obj_p ref_id_obj;
- for(n=0; *p != ',' && *p != ';'; p++)
- n = n*10 + *p - '0';
- ref_id_obj = NEW_INT(n);
- if (!dict_item(ist, psrecp->id_to_obj, ref_id_obj))
- list_append(ist, idlist, ref_id_obj);
- else
- del_unlock(ref_id_obj);
- }
- break;
- }
- case 'a': {
- empty_obj(ist, psrecp, id_obj, &new_flg);
- while(*p++ != ';') {
- obj_p ref_id_obj;
- while(*p++ != ':');
- for(n=0; *p != ',' && *p != ';'; p++)
- n = n*10 + *p - '0';
- ref_id_obj = NEW_INT(n);
- if (!dict_item(ist, psrecp->id_to_obj, ref_id_obj))
- list_append(ist, idlist, ref_id_obj);
- else
- del_unlock(ref_id_obj);
- }
- break;
- }
- case 'l': {
- empty_obj(ist, psrecp, id_obj, &new_flg);
- while(++p < end) {
- obj_p ref_id_obj;
- for(n=0; *p != ',' && p < end; p++)
- n = n*10 + *p - '0';
- ref_id_obj = NEW_INT(n);
- if (!dict_item(ist, psrecp->id_to_obj, ref_id_obj))
- list_append(ist, idlist, ref_id_obj);
- else
- del_unlock(ref_id_obj);
- }
- return;
- }
- case 'i':
- case 's':
- empty_obj(ist, psrecp, id_obj, &new_flg);
- return;
- default:
- raise_exception(ist, ProsistExc_OBJ, "invalid record from db: %d", id);
- return;
- }
- }
-}
-
//******************************** store_obj **********************************
void store_obj(isp ist, psrec_p psrecp, obj_p obj) {
apr_status_t aprerr;
@@ -552,8 +355,9 @@
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);
- read_unlock(ist, item);
+ obj_p item = list_item(ist, olst, i);
+ if (item != OBJ(NONE))
+ read_unlock(ist, item);
}
del_unlock(olst);
}
@@ -677,28 +481,202 @@
}
}
-//******************************** 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_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;
+//******************************** load_obj ***********************************
+obj_p load_obj(isp ist, psrec_p psrecp, obj_p id_obj) {
+ apr_datum_t value;
+ psid_t n, id;
+ char *p, *end;
+ obj_p res, obj;
+ id = (psid_t) id_obj->data.i64;
+
+ 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) {
+ switch (*p) {
+ case 'p': {
+ int first_proto = TRUE;
+ while(*p++ != ';') {
+ obj_p ref_idobj, proto;
+ 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);
+ del_unlock(ref_idobj); if_exc_return NULL;
+ if (first_proto)
+ switch_proto(ist, obj, proto);
+ else
+ ins_proto(ist, obj, proto, 0x7fffffff);
+ first_proto = FALSE;
+ }
+ break;
+ }
+ case 'a': {
+ while(*p++ != ';') {
+ obj_p ref_id_obj, aval;
+ char *q, *aname = pr_malloc(value.dsize);
+ for (q=aname; *p != ':';) *q++ = *p++;
+ *q = 0;
+ for(n=0, p++; *p != ',' && *p != ';'; p++)
+ n = n*10 + *p - '0';
+ ref_id_obj = NEW_INT(n);
+ aval = dict_item( ist, psrecp->id_to_obj, ref_id_obj);
+ if_exc_return NULL;
+ set_attr(ist, obj, sym(ist, aname), aval); if_exc_return NULL;
+ del_unlock(ref_id_obj);
+ }
+ break;
+ }
+ case 'l': {
+ init_list_data(ist, obj, 0);
+ while(++p < end) {
+ obj_p ref_id_obj, item;
+ for(n=0; *p != ',' && p < end; p++)
+ n = n*10 + *p - '0';
+ ref_id_obj = NEW_INT(n);
+ item = dict_item( ist, psrecp->id_to_obj, ref_id_obj);
+ if_exc_return NULL;
+ list_append(ist, obj, item);
+ del_unlock(ref_id_obj);
+ }
+ goto done;
+ }
+ case 'i':
+ obj->data_type = DATA_TYPE_IMMDATA;
+ for(n=0,p++; *p != ':'; p++)
+ n = n*10 + *p - '0';
+ obj->imm_data_len = n;
+ memcpy(&(obj->data), p+1, sizeof(obj->data));
+ goto done;
+ case 's':
+ set_string_data(ist, obj, p+1, end-(p+1));
+ goto done;
+ case '`':
+ del_unlock(obj);
+ return NULL;
+ default:
+ raise_exception(ist, ProsistExc_OBJ, "invalid record from db: %d", id);
+ 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;
+done:
+ res = call_func0(ist, obj, SYM(__FROMSTORPROXY__));
+ if (obj != res)
+ del_unlock(obj);
+ return res;
+}
+
+//******************************** 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;
+ int new_flg = TRUE;
+ char *p, *end;
+
+ id_obj = NEW_INT(id);
+ if (dict_item(ist, psrecp->id_to_obj, id_obj)) {
del_unlock(id_obj);
+ return;
}
+ value = load_obj_by_id(psrecp, id); if_exc_return;
+ p = value.dptr;
+ end = p + value.dsize;
- //debug = dict_item(ist, root, NEW_MW(NEW_INT(1)));
- //dump(ist, "root.txt", debug);
-
- return root;
+ while (p < end) {
+ switch (*p) {
+ case '`': {
+ int i=0, mlen, module_flg = TRUE;
+ char *module, *name;
+ 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;
+ module[i] = 0;
+ if (module[0] == '*')
+ module_flg = FALSE;
+ name = pr_malloc(value.dsize - i);
+ for(i=0,p++; p < end; p++) name[i++] = *p;
+ name[i] = 0;
+ // do auto-import here XXX
+ if (module_flg)
+ module_obj = get_attr(ist, OBJ(MODULES), sym(ist, module));
+ else
+ module_obj = OBJ(OBJECT);
+ if_exc_return;
+ obj = get_attr(ist, module_obj, sym(ist, name)); if_exc_return;
+ if (!obj) {
+ raise_exception(ist, ProsistExc_OBJ, "identity object %s not found in module %s", name, module);
+ return;
+ }
+ id_tuple = get_attr(ist, obj, SYM(__ID__)); if_exc_return;
+ if (!id_tuple) {
+ 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, 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, mw_obj, id_tuple);
+ del_unlock(mw_obj);
+ break;
+ }
+ case 'p': {
+ empty_obj(ist, psrecp, id_obj, &new_flg);
+ while(*p++ != ';') {
+ obj_p ref_id_obj;
+ for(n=0; *p != ',' && *p != ';'; p++)
+ n = n*10 + *p - '0';
+ ref_id_obj = NEW_INT(n);
+ if (!dict_item(ist, psrecp->id_to_obj, ref_id_obj))
+ list_append(ist, idlist, ref_id_obj);
+ else
+ del_unlock(ref_id_obj);
+ }
+ break;
+ }
+ case 'a': {
+ empty_obj(ist, psrecp, id_obj, &new_flg);
+ while(*p++ != ';') {
+ obj_p ref_id_obj;
+ while(*p++ != ':');
+ for(n=0; *p != ',' && *p != ';'; p++)
+ n = n*10 + *p - '0';
+ ref_id_obj = NEW_INT(n);
+ if (!dict_item(ist, psrecp->id_to_obj, ref_id_obj))
+ list_append(ist, idlist, ref_id_obj);
+ else
+ del_unlock(ref_id_obj);
+ }
+ break;
+ }
+ case 'l': {
+ empty_obj(ist, psrecp, id_obj, &new_flg);
+ while(++p < end) {
+ obj_p ref_id_obj;
+ for(n=0; *p != ',' && p < end; p++)
+ n = n*10 + *p - '0';
+ ref_id_obj = NEW_INT(n);
+ if (!dict_item(ist, psrecp->id_to_obj, ref_id_obj))
+ list_append(ist, idlist, ref_id_obj);
+ else
+ del_unlock(ref_id_obj);
+ }
+ return;
+ }
+ case 'i':
+ case 's':
+ empty_obj(ist, psrecp, id_obj, &new_flg);
+ return;
+ default:
+ raise_exception(ist, ProsistExc_OBJ, "invalid record from db: %d", id);
+ return;
+ }
+ }
}
#define IF_EXC_UNLKOBJS_RTRN() \
@@ -735,6 +713,28 @@
unlock_objects(ist, psrecp);
}
+//******************************** load_db ************************************
+obj_p load_db(isp ist, psrec_p psrecp) {
+ int llen, idx = 0;
+ obj_p id_obj, 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;
+ }
+ llen = (int) list_len(ist, idlist);
+ for(idx=llen-1; idx >= 0; idx--) {
+ id_obj = list_item(ist, idlist, idx);
+ load_obj(ist, psrecp, id_obj); if_exc_return NULL;
+ del_unlock(id_obj);
+ }
+ id_obj = NEW_INT(0);
+ root = load_obj(ist, psrecp, id_obj);
+ del_unlock(id_obj);
+ return root;
+}
+
//******************************** FUNCTION DEFS ******************************
MODULE_START(Prosist)
{
Added: trunk/pr/modint.pr
===================================================================
--- trunk/pr/modint.pr 2004-04-23 23:27:18 UTC (rev 405)
+++ trunk/pr/modint.pr 2004-04-24 05:38:08 UTC (rev 406)
@@ -0,0 +1,19 @@
+# tested code
+
+ModInt = Object()
+with ModInt:
+ .modulo = 10 #default
+ def .__init__(*x):
+ if Len(x): .val = x[0] # val kludge here
+ def .__add__(other):
+ if .modulo != other.modulo:
+ raise TypeError
+ return (.val + other.val) % .modulo
+
+Mod16Int = ModInt()
+Mod16Int.modulo = 16
+
+i = Mod16Int(27)
+j = Mod16Int(4)
+print "sum is %02i" % (i + j) # prints 15
+
Modified: trunk/pr/prosist.pr
===================================================================
--- trunk/pr/prosist.pr 2004-04-23 23:27:18 UTC (rev 405)
+++ trunk/pr/prosist.pr 2004-04-24 05:38:08 UTC (rev 406)
@@ -4,7 +4,7 @@
import Prosist
-#/*
+/*
print
a = {1:(2,)}
@@ -17,9 +17,9 @@
print db.root
db.close()
-#*/
+*/
-/*
+#/*
b = 7.3
c = "hello"
@@ -52,7 +52,6 @@
a = 1
print
-print x
-#, x[6].a , x[6].b , x[6].c
+print x, x[6].a , x[6].b , x[6].c
-*/
\ No newline at end of file
+#*/
\ No newline at end of file
Modified: trunk/src/lock.c
===================================================================
--- trunk/src/lock.c 2004-04-23 23:27:18 UTC (rev 405)
+++ trunk/src/lock.c 2004-04-24 05:38:08 UTC (rev 406)
@@ -112,6 +112,8 @@
//********************************* read_lock *********************************
int read_lock(isp ist, obj_p obj) {
get_wrlock(obj, NO_WAIT);
+ if ((intptr_t)obj == 0x009ab9e0)
+ obj = obj + 0;
if (ist->access < obj->rd_access) {
raise_exception(ist, OBJ(PERMISSION_EXC), "read permission exception");
free_wrlock(obj);