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;