rev 536 - in trunk: include/prothon pr/test src

SVN User <[email protected]> Sun, 23 May 2004 01:46:29 -0400
Newsgroups gmane.comp.lang.prothon.cvs
Message-ID <[email protected]>
Author: mark
Date: 2004-05-23 01:46:26 -0400 (Sun, 23 May 2004)
New Revision: 536

Modified:
   trunk/include/prothon/prothon.h
   trunk/pr/test/meow.pr
   trunk/src/builtins-core.c
   trunk/src/bytecodes.h
   trunk/src/interp.c
   trunk/src/object.c
   trunk/src/parser.h
   trunk/src/parser_routines.c
   trunk/src/prothon.y
   trunk/src/symbol.c
Log:
added ante keyword, updated meow.pr

Modified: trunk/include/prothon/prothon.h
===================================================================
--- trunk/include/prothon/prothon.h	2004-05-23 00:41:18 UTC (rev 535)
+++ trunk/include/prothon/prothon.h	2004-05-23 05:46:26 UTC (rev 536)
@@ -284,17 +284,18 @@
 	SLICE_PROTO,		// 17 Slice
 	LOCAL_PROTO,		// 18 
 	OUTER_PROTO,		// 19 
-	GEN_PROTO,			// 20 
-	THREAD_PROTO,		// 21 Thread
-	MUTEX_PROTO,		// 22 Mutex
- 
+	ANTE_PROTO,			// 20
+	GEN_PROTO,			// 21 
+	THREAD_PROTO,		// 22 Thread
+	MUTEX_PROTO,		// 23 Mutex
+  
 // Exceptions
-	EXCEPTION,			//  23 Exception
-	INTERNAL_EXC,		//  24 InternalError
-	PARSEERROR_EXC,		//  25
-	INTERPRETER_EXC,	//  26
-	ASSERTION_EXC,		//  27 AssertionError
-	NAME_EXC,			//  28 NameError
+	EXCEPTION,			//  24 Exception
+	INTERNAL_EXC,		//  25 InternalError
+	PARSEERROR_EXC,		//  26
+	INTERPRETER_EXC,	//  27
+	ASSERTION_EXC,		//  28 AssertionError
+	NAME_EXC,			//  29 NameError
 	INDEX_EXC,			//   IndexError
 	TYPE_EXC,			//   TypeError
 	MUTABLE_EXC,		//	 Mutable Error
@@ -312,9 +313,9 @@
 	MAX_INT,			//   MaxInt
 
 // Containers
-	ROOT_GLOBALS,		//  41 Root_Globals
-	SYMBOLS,			//  42 Symbols_dict
-	MODULES,			//  43 Modules
+	ROOT_GLOBALS,		//   Root_Globals
+	SYMBOLS,			//   Symbols_dict
+	MODULES,			//   Modules
 
 	OBJ_ENUM_COUNT
 } obj_enum_t;
@@ -425,6 +426,8 @@
 	BINDOBJ_,
 	PREVSCOPE_,
 	ACCLEVEL_,
+	CONT_,
+	NAME_,
 
 	SYM_ENUM_COUNT
 } sym_enum_t;
@@ -855,6 +858,14 @@
 // in an object.  In this case the data is an local variable with no prefix.
 obj_p new_local_obj(isp ist, obj_p symbol);
 
+// NEW_ANTE_OBJ: This represents the reference of an ante variable like "ante.var"
+// This is much like a slice in that it indicates how data is to be referenced
+// in an object.  In this case the data is an ante prefixed variable like "ante.var".
+// An Ante reference is the same as "self" with lookup of the var happening on the
+// prototype of "self" except that all matches are ignored until the prototype
+// "container" is passed by on the prototype chain of "self".
+obj_p new_ante_obj(isp ist, obj_p container, obj_p symbol) ;
+
 //************************* Prothon C FUNCTION ********************************
 // This is the type of C function that the dll author must provide to implement
 // a Prothon function in C.  A pointer to this type is passed to new_C_func_obj.

Modified: trunk/pr/test/meow.pr
===================================================================
--- trunk/pr/test/meow.pr	2004-05-23 00:41:18 UTC (rev 535)
+++ trunk/pr/test/meow.pr	2004-05-23 05:46:26 UTC (rev 536)
@@ -12,7 +12,7 @@
 with Mammal:
    def describe():
           print "I am a mammal."
-          Animal.describe{self}()
+          ante.describe()
           self.make_noise()
    def make_noise():
      print "I make mammal noise."

Modified: trunk/src/builtins-core.c
===================================================================
--- trunk/src/builtins-core.c	2004-05-23 00:41:18 UTC (rev 535)
+++ trunk/src/builtins-core.c	2004-05-23 05:46:26 UTC (rev 536)
@@ -72,6 +72,7 @@
 MODULE_DECLARE(Exception);
 MODULE_DECLARE(Gen);
 MODULE_DECLARE(Local);
+MODULE_DECLARE(Ante);
 MODULE_DECLARE(Seq);
 MODULE_DECLARE(Func);
 MODULE_DECLARE(Method);
@@ -89,6 +90,7 @@
 	set_obj_doc(OBJ(SLICE_PROTO),   "Slice object prototype");
 	set_obj_doc(OBJ(LOCAL_PROTO),   "Local object prototype");
 	set_obj_doc(OBJ(OUTER_PROTO),   "Outer object prototype");
+	set_obj_doc(OBJ(ANTE_PROTO),    "Ante object prototype");
 	set_obj_doc(OBJ(ROOT_GLOBALS),  "Root_Globals: recursive container of all objects");
 	set_obj_doc(OBJ(MODULES),       "Modules: container of all modules");
 
@@ -556,6 +558,19 @@
 	return call_func0(ist, self->data.ptr, SYM(STR_));
 }
 
+// ***************************** ANTE ******************************************
+MODULE_START(Ante)
+{
+	Ante_OBJ = OBJ(ANTE_PROTO);
+	MODULE_SET_DOC(Ante, "ante object prototype");
+	set_attr(ist, OBJ(OBJECT), sym(ist, "Ante"), Ante_OBJ);
+	set_obj_id(Ante_OBJ, *, Ante);
+}
+
+DEF(Ante, str_, NULL) {
+	return call_func0(ist, self->data.ptr, SYM(STR_));
+}
+
 // ***************************** SEQUENCE *************************************
 
 MODULE_START(Seq)
@@ -878,6 +893,9 @@
 	MODULE_SUB_INIT(Local);
 	MODULE_ADD_SYM(Local, str_);
 
+	MODULE_SUB_INIT(Ante);
+	MODULE_ADD_SYM(Ante, str_);
+
 	MODULE_SUB_INIT(Func);
 	MODULE_ADD_SYM(Func, init_);
 	MODULE_ADD_SYM(Func, str_);

Modified: trunk/src/bytecodes.h
===================================================================
--- trunk/src/bytecodes.h	2004-05-23 00:41:18 UTC (rev 535)
+++ trunk/src/bytecodes.h	2004-05-23 05:46:26 UTC (rev 536)
@@ -176,6 +176,13 @@
 // |opcode|symbol-key|
 OP_PUSH_SELF_REF,
 
+// PUSH_ANTE_REF(ante.symbol)
+// push inherited ante obj reference (self/ref) onto stack
+// stack: -> ante-proto,symbol
+// param: <unused>
+// |opcode|symbol-key|
+OP_PUSH_ANTE_REF,
+
 // PUSH_OUTER_REF(outer.symbol)
 // push inherited super obj reference (super/ref) onto stack
 // stack: -> super-obj,symbol

Modified: trunk/src/interp.c
===================================================================
--- trunk/src/interp.c	2004-05-23 00:41:18 UTC (rev 535)
+++ trunk/src/interp.c	2004-05-23 05:46:26 UTC (rev 536)
@@ -141,6 +141,16 @@
 	return local_obj;
 }
 
+//********************************* new_ante_obj *****************************
+obj_p new_ante_obj(isp ist, obj_p container, obj_p symbol) {
+	obj_p ante_obj = NEW_OBJ(OBJ(ANTE_PROTO));
+	ante_obj->data_type = DATA_TYPE_DATAPTR;
+	ante_obj->data.ptr = symbol;
+	set_attr(ist, ante_obj, SYM(CONT_), container);
+	ante_obj->immutable = TRUE;
+	return ante_obj;
+}
+
 //********************************* new_outer_obj *****************************
 obj_p new_outer_obj(isp ist, obj_p symbol){
 	obj_p outer_obj = NEW_OBJ(OBJ(OUTER_PROTO));
@@ -207,6 +217,20 @@
 		obj_p param[2];  
 		param[0]=0; param[1]=slice1(ref_key);
         return call_func(ist, ref_self, SYM(GETITEM_), 2, param, 0);
+	} else if (has_proto_QUES(ist, ref_key, OBJ(ANTE_PROTO))) {
+		obj_p res, cont = get_attr(ist, ref_key, SYM(CONT_));
+		if (!cont) {
+			raise_exception(ist, OBJ(NAME_EXC), "Container obj for attribute %s not found",
+					                             symch(ist, ref_key->data.ptr));
+			return NULL;
+		}
+		if_exc_return NULL;
+		res = get_proto_attr(ist, ref_self, ref_key->data.ptr, NULL, cont);
+		if (!res) {
+			raise_exception(ist, OBJ(NAME_EXC), "Ante attribute %s not found",
+					                             symch(ist, ref_key->data.ptr));
+		}
+		return res;
 	} else {
 		raise_exception(ist, OBJ(INTERNAL_EXC), "Invalid reference type");
 		return NULL;
@@ -240,6 +264,21 @@
 		param[0]=0; param[1]=slice1(ref_key);
 		param[2]=0; param[3]=value;
         call_func(ist, ref_self, SYM(SETITEM_), 4, param, 0);
+	} else if (has_proto_QUES(ist, ref_key, OBJ(ANTE_PROTO))) {
+		obj_p res, proto, cont = get_attr(ist, ref_key, SYM(CONT_));
+		if (!cont) {
+			raise_exception(ist, OBJ(NAME_EXC), "Container obj for attribute %s not found",
+					                             symch(ist, ref_key->data.ptr));
+			return;
+		}
+		if_exc_return;
+		res = get_proto_attr(ist, ref_self, ref_key->data.ptr, &proto, cont);
+		if (!res) {
+			raise_exception(ist, OBJ(NAME_EXC), "Ante attribute %s not found",
+					                             symch(ist, ref_key->data.ptr));
+			return;
+		}
+		set_attr(ist, proto, ref_key->data.ptr, value);
 	} else
 		raise_exception(ist, OBJ(INTERNAL_EXC), "Invalid reference type");
 }
@@ -269,6 +308,21 @@
 		obj_p param[2];  
 		param[0]=0; param[1]=slice1(ref_key);
         call_func(ist, ref_self, SYM(DELITEM_), 2, param, 0);
+	} else if (has_proto_QUES(ist, ref_key, OBJ(ANTE_PROTO))) {
+		obj_p res, proto, cont = get_attr(ist, ref_key, SYM(CONT_));
+		if (!cont) {
+			raise_exception(ist, OBJ(NAME_EXC), "Container obj for attribute %s not found",
+					                             symch(ist, ref_key->data.ptr));
+			return;
+		}
+		if_exc_return;
+		res = get_proto_attr(ist, ref_self, ref_key->data.ptr, &proto, cont);
+		if (!res) {
+			raise_exception(ist, OBJ(NAME_EXC), "Ante attribute %s not found",
+					                             symch(ist, ref_key->data.ptr));
+			return;
+		}
+		del_attr(ist, proto, ref_key->data.ptr);
 	} else
 		raise_exception(ist, OBJ(INTERNAL_EXC), "Invalid reference type");
 }
@@ -846,6 +900,17 @@
 				fr_push(frame->self);  
 				fr_push(fr_data(1)); 
 				break;
+			case OP_PUSH_ANTE_REF: {
+				obj_p cont;
+				if ( !frame->self || !frame->func ||
+					!(cont = get_attr(ist, frame->func, SYM(CONT_))) ) {
+					raise_exception(ist, OBJ(INTERPRETER_EXC), "ante.var only valid in function");
+					break;
+				}
+				fr_push(frame->self);
+				fr_push(new_ante_obj(ist, cont, fr_data(1))); 
+				break;
+			}
 			case OP_PUSH_LOCAL_REF: 
 				fr_push(frame->locals);  
 				fr_push(new_local_obj(ist, fr_data(1))); 
@@ -872,6 +937,10 @@
 									      as_str(ist, fr_stack[fr_sp+1]) );
 					break;
 				}
+				if (has_proto_QUES(ist, att, OBJ(FUNC_PROTO))) {
+					set_attr(ist, att, SYM(CONT_), fr_stack[fr_sp]);
+					set_attr(ist, att, SYM(NAME_), fr_stack[fr_sp+1]);
+				}
 				fr_push(att);
 			}   break;
 			case OP_ASSIGN: {
@@ -1195,16 +1264,31 @@
 				frame->next_frame = switch_frame;
 end_op_obj:		break;
 			case OP_CALL: {
+				obj_p name_obj;
 				fr_sp -= 3+(2*param);
-				if (has_proto_QUES(ist, fr_stack[fr_sp+1], OBJ(LOCAL_PROTO))) {
-			 		func_obj = get_scope_attr(ist, fr_stack[fr_sp], fr_stack[fr_sp+1]->data.ptr, NULL, NULL);
+				name_obj = fr_stack[fr_sp+1];
+				if (has_proto_QUES(ist, name_obj, OBJ(ANTE_PROTO))) {
+					obj_p cont = get_attr(ist, name_obj, SYM(CONT_));
+					name_obj = name_obj->data.ptr;
+					if (!cont) {
+						raise_exception( ist, OBJ(INTERNAL_EXC), "container not found for attribute %s", 
+							                                      symch(ist, name_obj) );
+						break;
+					}
+			 		func_obj = get_proto_attr(ist, fr_stack[fr_sp], name_obj, NULL, cont);
 					goto got_func;
 				}
-				if (has_proto_QUES(ist, fr_stack[fr_sp+1], OBJ(OUTER_PROTO))) {
-			 		func_obj = get_scope_attr(ist, fr_stack[fr_sp], fr_stack[fr_sp+1]->data.ptr, NULL, fr_stack[fr_sp]);
+				if (has_proto_QUES(ist, name_obj, OBJ(LOCAL_PROTO))) {
+					name_obj = name_obj->data.ptr;
+			 		func_obj = get_scope_attr(ist, fr_stack[fr_sp], name_obj, NULL, NULL);
 					goto got_func;
 				}
-				if (!has_proto_QUES(ist, fr_stack[fr_sp+1], OBJ(SYMBOL_PROTO))) {
+				if (has_proto_QUES(ist, name_obj, OBJ(OUTER_PROTO))) {
+					name_obj = name_obj->data.ptr;
+			 		func_obj = get_scope_attr(ist, fr_stack[fr_sp], name_obj, NULL, fr_stack[fr_sp]);
+					goto got_func;
+				}
+				if (!has_proto_QUES(ist, name_obj, OBJ(SYMBOL_PROTO))) {
 					raise_exception(ist, OBJ(INTERNAL_EXC), "Indexed function call not supported yet");
 					break;
 				}
@@ -1265,6 +1349,11 @@
 					frame_p new_frame;
 					IF_EXC_BREAK;
 					if (!func_obj->data.ptr) goto no_func_ptr2;
+					if (name_obj) {
+						set_attr(ist, func_obj, SYM(CONT_), fr_stack[fr_sp]);
+						set_attr(ist, func_obj, SYM(NAME_), name_obj);
+						name_obj = NULL;
+					}
 					new_locals = NEW_OBJ(NULL);
 					if ( !(self = fr_stack[fr_sp+2]) &&
 						 !(self = get_attr(ist, func_obj, SYM(BINDOBJ_))) &&
@@ -1299,6 +1388,7 @@
 						if (value) {
 							fr_stack[fr_sp]   = value;
 							fr_stack[fr_sp+1] = SYM(CALL_);
+							name_obj = NULL;
 							goto get_func;
 						}
 					}

Modified: trunk/src/object.c
===================================================================
--- trunk/src/object.c	2004-05-23 00:41:18 UTC (rev 535)
+++ trunk/src/object.c	2004-05-23 05:46:26 UTC (rev 536)
@@ -214,6 +214,7 @@
 	OBJ(SLICE_PROTO)        = NEW_OBJ(NULL);
 	OBJ(LOCAL_PROTO)        = NEW_OBJ(NULL);
 	OBJ(OUTER_PROTO)        = NEW_OBJ(NULL);
+	OBJ(ANTE_PROTO)         = NEW_OBJ(NULL);
 	OBJ(THREAD_PROTO)       = NEW_OBJ(NULL);
 	OBJ(MUTEX_PROTO)        = NEW_OBJ(NULL);
 	OBJ(ROOT_GLOBALS)       = NEW_OBJ(NULL);

Modified: trunk/src/parser.h
===================================================================
--- trunk/src/parser.h	2004-05-23 00:41:18 UTC (rev 535)
+++ trunk/src/parser.h	2004-05-23 05:46:26 UTC (rev 536)
@@ -155,6 +155,7 @@
 code_p continue_stmt(void* param, obj_p label);
 code_p del_ref(void* param, code_p expr);
 code_p self_label_to_attrref(void* param, obj_p label);
+code_p ante_label_to_attrref(void* param, obj_p label);
 code_p outer_label_to_attrref(void* param, obj_p label);
 code_p caller_label_to_attrref(void* param, obj_p label);
 code_p self_to_obj(void* param);

Modified: trunk/src/parser_routines.c
===================================================================
--- trunk/src/parser_routines.c	2004-05-23 00:41:18 UTC (rev 535)
+++ trunk/src/parser_routines.c	2004-05-23 05:46:26 UTC (rev 536)
@@ -408,6 +408,12 @@
 	p->code_data[1].data = sym(IST, pr_strptr(label));
 	return debug_retrn(__LINE__, p);
 }
+code_p ante_label_to_attrref(void* param, obj_p label) {
+	code_p p;
+	p = new_code(param, 2, 2, 2, OP_PUSH_ANTE_REF);
+	p->code_data[1].data = sym(IST, pr_strptr(label));
+	return debug_retrn(__LINE__, p);
+}
 code_p outer_label_to_attrref(void* param, obj_p label){
 	code_p p;
 	p = new_code(param, 2, 2, 2, OP_PUSH_OUTER_REF);

Modified: trunk/src/prothon.y
===================================================================
--- trunk/src/prothon.y	2004-05-23 00:41:18 UTC (rev 535)
+++ trunk/src/prothon.y	2004-05-23 05:46:26 UTC (rev 536)
@@ -100,6 +100,7 @@
 int yylex (YYSTYPE *lvalp, void* yylex_param);
 %}
 
+%nonassoc ANTE 
 %nonassoc AS 
 %nonassoc ASSERT    
 %nonassoc BREAK     
@@ -593,6 +594,7 @@
 	;
 bound_ref:
 		SELF '.' LABEL												{ $$ = self_label_to_attrref(yylex_param, $3); }
+	|	ANTE '.' LABEL												{ $$ = ante_label_to_attrref(yylex_param, $3); }
 	|	OUTER '.' LABEL												{ $$ = outer_label_to_attrref(yylex_param, $3); }
 	|	CALLER '.' LABEL											{ $$ = caller_label_to_attrref(yylex_param, $3); }
 	|	obj '.' LABEL												{ $$ = obj_label_to_attrref(yylex_param, $1, $3); }
@@ -1120,6 +1122,7 @@
 		if (!strcmp(str_ptr,"not"))  	return NOT;
 		if (!strcmp(str_ptr,"in")) 		return IN_;
 		if (!strcmp(str_ptr,"is")) 		return IS;
+		if (!strcmp(str_ptr,"ante")) 	return ANTE;
 		if (!strcmp(str_ptr,"as")) 		return AS;
 		if (!strcmp(str_ptr,"assert")) 	return ASSERT;
 		if (!strcmp(str_ptr,"break")) 	return BREAK;

Modified: trunk/src/symbol.c
===================================================================
--- trunk/src/symbol.c	2004-05-23 00:41:18 UTC (rev 535)
+++ trunk/src/symbol.c	2004-05-23 05:46:26 UTC (rev 536)
@@ -151,8 +151,10 @@
 	{ "fromStorProxy_", 0},
 	{ "call_",          0},
 	{ "bindObj_",		0},
-	{ "prevScope_",    0},
-	{ "accLevel_",      0}
+	{ "prevScope_",     0},
+	{ "accLevel_",      0},
+	{ "cont_",          0},
+	{ "name_",          0}
 };
 
 typedef struct trie_node_s* trie_p;