rev 454 - in trunk: include/prothon src
SVN User <[email protected]> Tue, 04 May 2004 02:21:42 -0400
| Newsgroups | gmane.comp.lang.prothon.cvs |
|---|---|
| Message-ID | <[email protected]> |
Author: mark
Date: 2004-05-04 02:21:39 -0400 (Tue, 04 May 2004)
New Revision: 454
Modified:
trunk/include/prothon/prothon.h
trunk/src/builtins-core.c
trunk/src/interp.c
trunk/src/symbol.c
Log:
added unbind method, changed obj.func.bind() to mean
obj.func.bind(obj)
Modified: trunk/include/prothon/prothon.h
===================================================================
--- trunk/include/prothon/prothon.h 2004-05-04 05:58:04 UTC (rev 453)
+++ trunk/include/prothon/prothon.h 2004-05-04 06:21:39 UTC (rev 454)
@@ -409,6 +409,7 @@
__FROMSTORPROXY__,
__CALL__,
__BINDOBJ__,
+ __CONTAINER__,
SYM_ENUM_COUNT
} sym_enum_t;
Modified: trunk/src/builtins-core.c
===================================================================
--- trunk/src/builtins-core.c 2004-05-04 05:58:04 UTC (rev 453)
+++ trunk/src/builtins-core.c 2004-05-04 06:21:39 UTC (rev 454)
@@ -698,14 +698,23 @@
}
DEF(Func, bind, FPARM1(obj, OBJ(NONE))) {
- obj_p bind_obj = copy_object(ist, self);
- if (parms[1] == OBJ(NONE))
- del_attr(ist, bind_obj, SYM(__BINDOBJ__));
- else
- set_attr(ist, bind_obj, SYM(__BINDOBJ__), parms[1]);
+ obj_p bindee, bind_obj = copy_object(ist, self);
+ if (parms[1] == OBJ(NONE)) {
+ if (!(bindee = get_attr(ist, self, SYM(__CONTAINER__)))) {
+ raise_exception(ist, OBJ(INTERPRETER_EXC), "no default object found for bind method");
+ return NULL;
+ }
+ } else
+ bindee = parms[1];
+ set_attr(ist, bind_obj, SYM(__BINDOBJ__), bindee);
return bind_obj;
}
+DEF(Func, unbind, NULL) {
+ del_attr(ist, self, SYM(__BINDOBJ__));
+ return self;
+}
+
DEF(Func, __cDataLen__, NULL) {
return NEW_INT(sizeof(code) + ((code_p)(self->data.ptr))->len * sizeof(code_t));
}
@@ -786,6 +795,7 @@
MODULE_SUB_INIT(Func);
MODULE_ADD_SYM(Func, __str__);
MODULE_ADD_SYM(Func, bind);
+ MODULE_ADD_SYM(Func, unbind);
MODULE_ADD_SYM(Func, __cDataLen__);
MODULE_ADD_SYM(Func, __objList__);
Modified: trunk/src/interp.c
===================================================================
--- trunk/src/interp.c 2004-05-04 05:58:04 UTC (rev 453)
+++ trunk/src/interp.c 2004-05-04 06:21:39 UTC (rev 454)
@@ -803,10 +803,12 @@
fr_push(sym);
} break;
case OP_DEREF: {
- obj_p ret;
+ obj_p att;
fr_sp -= 2;
- ret = get_item(ist, fr_stack[fr_sp], fr_stack[fr_sp+1]);
- fr_push(ret);
+ att = get_item(ist, fr_stack[fr_sp], fr_stack[fr_sp+1]);
+ if(has_proto_QUES(ist, att, OBJ(FUNC_PROTO)))
+ set_attr(ist, att, SYM(__CONTAINER__), fr_stack[fr_sp]);
+ fr_push(att);
break;
}
case OP_ASSIGN: {
Modified: trunk/src/symbol.c
===================================================================
--- trunk/src/symbol.c 2004-05-04 05:58:04 UTC (rev 453)
+++ trunk/src/symbol.c 2004-05-04 06:21:39 UTC (rev 454)
@@ -152,7 +152,8 @@
{ "__toStorProxy__", 0 },
{ "__fromStorProxy__", 0},
{ "__call__", 0},
- { "__bindObj__", 0}
+ { "__bindObj__", 0},
+ { "__container__", 0}
};
typedef struct trie_node_s* trie_p;