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;