rev 724 - in trunk: . include/prothon src

SVN User <[email protected]> Mon, 12 Jul 2004 04:00:21 -0400
Newsgroups gmane.comp.lang.prothon.cvs
Message-ID <[email protected]>
Author: mark
Date: 2004-07-12 04:00:19 -0400 (Mon, 12 Jul 2004)
New Revision: 724

Modified:
   trunk/STATUS.txt
   trunk/include/prothon/prothon.h
   trunk/src/parser.h
   trunk/src/parser_routines.c
   trunk/src/prothon.y
   trunk/src/symbol.c
Log:
started implementing debug symbol

Modified: trunk/STATUS.txt
===================================================================
--- trunk/STATUS.txt	2004-07-11 19:30:40 UTC (rev 723)
+++ trunk/STATUS.txt	2004-07-12 08:00:19 UTC (rev 724)
@@ -1,6 +1,10 @@
 
 ----------------------- TO-DO (highest priority first) ------------------------
 
+--- check into tcl and twisted about async io
+
+--- call_ does not respect properties
+
 --- "import as" broken
 
 --- bug: prints ... after 15 items in a list
@@ -17,6 +21,9 @@
 
 --- Module doc strings & Object doc strings
 
+--- add sys.userHome path and name current one sys.prothonHome
+--- use sys.userHome for console history file
+
 --- unicode module - codecs
 		mask off top 3 bits
 		http://www.prothon.org/pipermail/prothon-user/2004-June/001913.html

Modified: trunk/include/prothon/prothon.h
===================================================================
--- trunk/include/prothon/prothon.h	2004-07-11 19:30:40 UTC (rev 723)
+++ trunk/include/prothon/prothon.h	2004-07-12 08:00:19 UTC (rev 724)
@@ -491,6 +491,7 @@
 	GET_,
 	SET_,
 	DEL_, 
+	SRCLOC_,
 
 	SYM_ENUM_COUNT
 } sym_enum_t;

Modified: trunk/src/parser.h
===================================================================
--- trunk/src/parser.h	2004-07-11 19:30:40 UTC (rev 723)
+++ trunk/src/parser.h	2004-07-12 08:00:19 UTC (rev 724)
@@ -85,6 +85,10 @@
 	char*		file_path;
 	clist_p		srcmap;
 	int			doc_flg;
+	int			min_line;
+	int			min_col;
+	int			max_line;
+	int			max_col;
 	code_t		code_data[];
 } code;
 
@@ -214,6 +218,7 @@
 code_p tgt_eq_stmt_to_stmt(void* param, clist_p left, code_p right);
 code_p tgtparm_to_obj(void* param, code_p expr);
 code_p tryfinally_body(void* param, code_p body, code_p final);
+code_p atdebug(void* param, code_p parm);
 code_p unary(void* param, int op, code_p parm);
 code_p while_expr_body_else(void* param, obj_p label, code_p expr, code_p body, code_p els);
 code_p word_expr_to_param(void* param, obj_p word, code_p expr);

Modified: trunk/src/parser_routines.c
===================================================================
--- trunk/src/parser_routines.c	2004-07-11 19:30:40 UTC (rev 723)
+++ trunk/src/parser_routines.c	2004-07-12 08:00:19 UTC (rev 724)
@@ -67,7 +67,8 @@
 
 FILE* parse_debug_fout;
 
-code_p debug_retrn(int line_no, code_p res){
+code_p debug_retrn(isp ist, int line_no, code_p res){
+	check_exceptions(ist);
 	if (trace_parser)
 		fprintf(parse_debug_fout, "******> lin:%4d, len:%3d, dep:%3d, max:%3d\n", line_no, res->len, res->stack_depth, res->max_stack_depth);
 	return res;
@@ -75,7 +76,7 @@
 #endif
 
 #ifndef TRACE_PARSER
-#define debug_retrn(line_no,res)  res
+#define debug_retrn(IST, line_no,res)  res
 #endif
 
 #define IST (((parse_state*) param)->ist)
@@ -174,10 +175,56 @@
 	return parse_state;
 }
 
-//********************************* add_to_const_list ***************************
+//********************************* add_to_const_list *************************
 #define add_to_const_list(param, obj)  \
 	clist_append(((parse_state*)param)->const_objs, obj);
 
+
+//********************************* loc routines ******************************
+void get_loc(isp ist, code_p res, obj_p obj) {
+	obj_p list_loc;
+	if (!obj) return;
+	if (list_loc = get_attr(ist, obj, SYM(SRCLOC_))) {
+		res->min_line = int2i32t(ist, list_item(ist, list_loc, 0));
+		res->min_col  = int2i32t(ist, list_item(ist, list_loc, 1));
+		res->max_line = int2i32t(ist, list_item(ist, list_loc, 2));
+		res->max_col  = int2i32t(ist, list_item(ist, list_loc, 3));
+	}
+}
+
+void merge_loc(code_p dst, code_p src) {
+	if (!src) return;
+	if ( src->max_line  > dst->max_line ||
+		 src->max_line == dst->max_line && src->max_col > dst->max_col ) {
+		dst->max_line  = src->max_line;
+		dst->max_col   = src->max_col;
+	}
+	if ( src->min_line  < dst->min_line ||
+		 src->min_line == dst->min_line && src->min_col < dst->min_col ) {
+		dst->min_line  = src->min_line;
+		dst->min_col   = src->min_col;
+	}
+}
+
+void get_merge_loc(isp ist, code_p dst, obj_p obj) {
+	obj_p list_loc;
+	if (!obj) return;
+	if (list_loc = get_attr(ist, obj, SYM(SRCLOC_))) {
+		if ( int2i32t(ist, list_item(ist, list_loc, 2))  > dst->max_line ||
+			 int2i32t(ist, list_item(ist, list_loc, 2)) == dst->max_line && 
+			 int2i32t(ist, list_item(ist, list_loc, 3))  > dst->max_col     ) {
+			dst->max_line  = int2i32t(ist, list_item(ist, list_loc, 2));
+			dst->max_col   = int2i32t(ist, list_item(ist, list_loc, 3));
+		}
+		if ( int2i32t(ist, list_item(ist, list_loc, 0))  < dst->min_line ||
+			 int2i32t(ist, list_item(ist, list_loc, 0)) == dst->min_line && 
+			 int2i32t(ist, list_item(ist, list_loc, 1))  < dst->min_col     ) {
+			dst->min_line  = int2i32t(ist, list_item(ist, list_loc, 0));
+			dst->min_col   = int2i32t(ist, list_item(ist, list_loc, 1));
+		}
+	}
+}
+
 //********************************* new_code **********************************
 code_p new_code(void* param, int size, int stk, int max_stk, opcode_t opcode) {
 	data_size_t data_size = sizeof(code)+size*sizeof(code_t);
@@ -194,7 +241,11 @@
 	clist_append_num(p->srcmap, 0);
 	clist_append_num(p->srcmap, ((parse_state*) param)->line);
 	clist_append_num(p->srcmap, ((parse_state*) param)->column);
-	return debug_retrn(__LINE__, p);
+	p->min_line = ((parse_state*) param)->line;
+	p->min_col  = ((parse_state*) param)->column;
+	p->max_line = ((parse_state*) param)->line;
+	p->max_col  = ((parse_state*) param)->column;
+	return debug_retrn(IST, __LINE__, p);
 }
 
 //********************************* add_all_srcmap ********************************
@@ -214,6 +265,7 @@
 			clist_append_num(dstmap, clist_num(srcmap, i+2));
 		}
 	}
+	merge_loc(dst, src);
 	if (free_flg) pr_free(srcmap);
 }
 
@@ -263,19 +315,25 @@
 	if (stmt->stack_depth) {
 		code_p res = new_code(param, 1, -1, 0, OP_POP);
 		res->code_data[0].bytecode.param = 1;
-		return debug_retrn(__LINE__, append_code(param, stmt, res, 0));
+		return debug_retrn(IST, __LINE__, append_code(param, stmt, res, 0));
 	}
-	return debug_retrn(__LINE__, stmt);
+	return debug_retrn(IST, __LINE__, stmt);
 }
 
+code_p atdebug(void* param, code_p parm) {
+	printf ("@max_line:%d, max_col:%d, min_line:%d, min_col:%d\n",
+		     parm->max_line, parm->max_col, parm->min_line, parm->min_col);
+	return debug_retrn(IST, __LINE__, parm);
+}
+
 code_p none(void* param){
-	return debug_retrn(__LINE__, new_code(param,0,0,0,0));
+	return debug_retrn(IST, __LINE__, new_code(param,0,0,0,0));
 }
 code_p push_null(void* param) {
 	code_p res = new_code(param, 2, 1, 1, OP_PUSH);
 	res->code_data[0].bytecode.param = 2;
 	res->code_data[1].data = NULL;
-	return debug_retrn(__LINE__, res);
+	return debug_retrn(IST, __LINE__, res);
 }
 clist_p empty_list(void* param){
 	return new_clist(4);
@@ -317,7 +375,7 @@
 			p1->stack_depth = p1->stack_depth + p3->stack_depth;
 			p1->doc_flg = p1->doc_flg || p3->doc_flg;
 			pr_free(p3);
-			return debug_retrn(__LINE__, p1);
+			return debug_retrn(IST, __LINE__, p1);
 		} else if (size) {
 			data_size_t data_size;
 			p3->len += size;
@@ -325,7 +383,7 @@
 			p3 = pr_realloc(p3, data_size);
 			p3->size = data_size;
 		}
-		return debug_retrn(__LINE__, p3);
+		return debug_retrn(IST, __LINE__, p3);
 	} else if (p1 && size) {
 		data_size_t data_size;
 		p1->len += size;
@@ -333,7 +391,7 @@
 		p1 = pr_realloc(p1, data_size);
 		p1->size = data_size;
 	}
-	return debug_retrn(__LINE__, p1);
+	return debug_retrn(IST, __LINE__, p1);
 }
 clist_p label_to_import_path(void* param, obj_p label){
 	return new_clist_1(sym(IST, pr2c_strptr(IST, label)));
@@ -376,7 +434,7 @@
 		if (label_key)
 			p->code_data[k++].data = label_key;
 	}
-	return debug_retrn(__LINE__, p);
+	return debug_retrn(IST, __LINE__, p);
 }
 code_p	from_path_import_params(void* param, clist_p path, clist_p iparms){
 	code_p p;
@@ -406,37 +464,43 @@
 			p->code_data[k++].data = label_key;
 	}
 	p->code_data[k++].bytecode.opcode = OP_POP;
-	return debug_retrn(__LINE__, p);
+	return debug_retrn(IST, __LINE__, p);
 }
+
 code_p label_to_attrref(void* param, obj_p label){
 	code_p p;
 	p = new_code(param, 2, 2, 2, OP_PUSH_LOCAL_REF);
+	get_loc(IST, p, label);
 	p->code_data[1].data = sym(IST, (pr2c_strptr(IST, label)));
-	return debug_retrn(__LINE__, p);
+	return debug_retrn(IST, __LINE__, p);
 }
 code_p self_label_to_attrref(void* param, obj_p label){
 	code_p p;
 	p = new_code(param, 2, 2, 2, OP_PUSH_SELF_REF);
+	get_loc(IST, p, label);
 	p->code_data[1].data = sym(IST, pr2c_strptr(IST, label));
-	return debug_retrn(__LINE__, p);
+	return debug_retrn(IST, __LINE__, p);
 }
 code_p super_label_to_attrref(void* param, obj_p label) {
 	code_p p;
 	p = new_code(param, 2, 2, 2, OP_PUSH_SUPER_REF);
+	get_loc(IST, p, label);
 	p->code_data[1].data = sym(IST, pr2c_strptr(IST, label));
-	return debug_retrn(__LINE__, p);
+	return debug_retrn(IST, __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);
+	get_loc(IST, p, label);
 	p->code_data[1].data = sym(IST, pr2c_strptr(IST, label));
-	return debug_retrn(__LINE__, p);
+	return debug_retrn(IST, __LINE__, p);
 }
 code_p caller_label_to_attrref(void* param, obj_p label){
 	code_p p;
 	p = new_code(param, 2, 2, 2, OP_PUSH_CALLER_REF);
+	get_loc(IST, p, label);
 	p->code_data[1].data = sym(IST, pr2c_strptr(IST, label));
-	return debug_retrn(__LINE__, p);
+	return debug_retrn(IST, __LINE__, p);
 }
 code_p obj_label_to_attrref(void* param, code_p obj, obj_p label){
 	data_size_t data_size;
@@ -449,10 +513,11 @@
 	obj->code_data[obj->len-1].data = sym(IST, pr2c_strptr(IST, label));
 	obj->stack_depth += 1;
 	obj->max_stack_depth = max(obj->max_stack_depth, obj->stack_depth);
-	return debug_retrn(__LINE__, obj);
+	get_merge_loc(IST, obj, label);
+	return debug_retrn(IST, __LINE__, obj);
 }
 code_p attrref_to_tgtparm(void* param, code_p p1){
-	return debug_retrn(__LINE__, p1);
+	return debug_retrn(IST, __LINE__, p1);
 }
 code_p obj_func_params(void* param, code_p obj, clist_p parms){
 	code_p res;
@@ -474,7 +539,7 @@
 	res->code_data[k++].bytecode.param = clist_len(parms);
 	res->stack_depth -= 1+(2*llen);
 	pr_assert(k==res->len);
-	return debug_retrn(__LINE__, res);
+	return debug_retrn(IST, __LINE__, res);
 }
 code_p bound_bind_params(void* param, code_p attr_ref, code_p obj){
 	code_p res;
@@ -487,7 +552,7 @@
 	res->code_data[k++].bytecode.opcode  = OP_BIND;
 	res->stack_depth -= 2;
 	pr_assert(k == res->len);
-	return debug_retrn(__LINE__, res);
+	return debug_retrn(IST, __LINE__, res);
 }
 code_p unbound_bind_params(void* param, code_p attr_ref, code_p obj){
 	code_p res;
@@ -501,7 +566,7 @@
 	res->code_data[k++].bytecode.opcode  = OP_OBJBIND;
 	res->stack_depth -= 2;
 	pr_assert(k == res->len);
-	return debug_retrn(__LINE__, res);
+	return debug_retrn(IST, __LINE__, res);
 }
 code_p bound_func_params(void* param, code_p attr_ref, clist_p parms) {
 	code_p res, nul = push_null(param);
@@ -520,7 +585,7 @@
 	res->code_data[k++].bytecode.param = clist_len(parms);
 	res->stack_depth -= 2+(2*llen);
 	pr_assert(k==res->len);
-	return debug_retrn(__LINE__, res);
+	return debug_retrn(IST, __LINE__, res);
 }
 code_p unbound_func_params(void* param, code_p attr_ref, clist_p parms, int cmd_flag) {
 	code_p res, nul = push_null(param);
@@ -546,7 +611,7 @@
 	}
 	res->stack_depth -= 2+(2*llen);
 	pr_assert(k==res->len);
-	return debug_retrn(__LINE__, res);
+	return debug_retrn(IST, __LINE__, res);
 }
 code_p bound_bind_func_params(void* param, code_p attr_ref, code_p obj, clist_p parms) {
 	code_p res;
@@ -566,7 +631,7 @@
 	res->code_data[k++].bytecode.param  = clist_len(parms);
 	res->stack_depth -= 2+(2*llen);
 	pr_assert(k==res->len);
-	return debug_retrn(__LINE__, res);
+	return debug_retrn(IST, __LINE__, res);
 }
 code_p unbound_bind_func_params(void* param, code_p attr_ref, code_p obj, clist_p parms){
 	code_p res;
@@ -586,14 +651,15 @@
 	res->code_data[k++].bytecode.param  = clist_len(parms);
 	res->stack_depth -= 2+(2*llen);
 	pr_assert(k==res->len);
-	return debug_retrn(__LINE__, res);
+	return debug_retrn(IST, __LINE__, res);
 }
 code_p label_to_formparm(void* param, obj_p label){
 	code_p res = new_code(param, 3, 2, 2, OP_PUSH);
+	get_loc(IST, res, label);
 	res->code_data[0].bytecode.param = 3;
 	res->code_data[1].data = sym(IST, pr2c_strptr(IST, label));
 	res->code_data[2].data = OBJ(NODEF);
-	return debug_retrn(__LINE__, res);
+	return debug_retrn(IST, __LINE__, res);
 }
 code_p label_eq_expr_to_formparm(void* param, obj_p label, code_p expr) {
 	data_size_t data_size;
@@ -611,7 +677,8 @@
 	expr->code_data[expr->len-2].bytecode.opcode = OP_POP;
 	expr->code_data[expr->len-2].bytecode.param  = 1;
 	expr->code_data[expr->len-1].bytecode.opcode = OP_RETURN;
-	return debug_retrn(__LINE__, expr);
+	get_merge_loc(IST, expr, label);
+	return debug_retrn(IST, __LINE__, expr);
 }
 code_p lbl_proto_body_to_obj(void* param, obj_p label, code_p ref, clist_p protos, code_p body) {
 	obj_p func;
@@ -628,6 +695,9 @@
 		calc_code(clist_item(protos, i),&len, &stack_depth, &max_stack_depth);
 	len += (label ? 2 : 3);
 	res = new_code(param, len, stack_depth, max_stack_depth, 0);
+	get_loc(IST, res, label);
+	merge_loc(res, ref);
+	merge_loc(res, body);
 	if (label) {
 		res->code_data[k++].bytecode.opcode = OP_PUSH_LOCAL_REF;
 		res->code_data[k++].data = sym(IST, pr2c_strptr(IST, label));
@@ -654,20 +724,22 @@
 }
 code_p star_ref_to_formparm(void* param, obj_p label){
 	code_p res = new_code(param, 3, 2, 2, OP_PUSH);
+	get_loc(IST, res, label);
 	res->code_data[0].bytecode.param = 3;
 	res->code_data[1].data = sym(IST, pr2c_strptr(IST, label));
 	res->code_data[2].data = OBJ(PARAM_STAR);
-	return debug_retrn(__LINE__, res);
+	return debug_retrn(IST, __LINE__, res);
 }
 code_p star_star_ref_to_formparm(void* param, obj_p label){
 	code_p res = new_code(param, 3, 2, 2, OP_PUSH);
+	get_loc(IST, res, label);
 	res->code_data[0].bytecode.param = 3;
 	res->code_data[1].data = sym(IST, pr2c_strptr(IST, label));
 	res->code_data[2].data = OBJ(PARAM_STAR_STAR);
-	return debug_retrn(__LINE__, res);
+	return debug_retrn(IST, __LINE__, res);
 }
 code_p expr_to_sparm(void* param, code_p p1){
-	return debug_retrn(__LINE__, p1);
+	return debug_retrn(IST, __LINE__, p1);
 }
 void add_slice_count(code_p p, int *len, int *stack_depth, int *max_stack_depth){
 	if (p && p->len)
@@ -702,7 +774,7 @@
 	add_slice(res, p3, &k, parm_cnt, 3);
 	res->code_data[k++].bytecode.opcode = OP_NEWSLICE;
 	res->stack_depth -= 2;
-	return debug_retrn(__LINE__, res);
+	return debug_retrn(IST, __LINE__, res);
 }
 code_p expr_to_slice(void* param, code_p expr) {
 	data_size_t data_size;
@@ -716,7 +788,7 @@
 	expr->code_data[expr->len-3].data = SLICEPARAM_MISSING;
 	expr->code_data[expr->len-2].data = SLICEPARAM_MISSING;
 	expr->code_data[expr->len-1].bytecode.opcode = OP_NEWSLICE;
-	return debug_retrn(__LINE__, expr);
+	return debug_retrn(IST, __LINE__, expr);
 }
 code_p unary(void* param, int op, code_p parm){
 	data_size_t data_size;
@@ -731,7 +803,7 @@
 	parm->code_data[parm->len-2].data = NULL;
 	parm->code_data[parm->len-1].bytecode.opcode = OP_CALL;
 	parm->code_data[parm->len-1].bytecode.param  = 0;
-	return debug_retrn(__LINE__, parm);
+	return debug_retrn(IST, __LINE__, parm);
 }
 code_p binary(void* param, code_p lparm, int op, code_p rparm){
 	code_p res;
@@ -796,7 +868,7 @@
 		res->stack_depth = 1;
 		pr_assert(k==res->len);
 	}
-	return debug_retrn(__LINE__, res);
+	return debug_retrn(IST, __LINE__, res);
 }
 code_p expr_andor_expr(void* param, code_p lparm, code_p rparm, int andor_flg){
 	code_p res;
@@ -828,7 +900,7 @@
 	res->code_data[k++].bytecode.param  = 1;
 	pr_assert(k == res->len);
 	res->stack_depth = 1;
-	return debug_retrn(__LINE__, res);
+	return debug_retrn(IST, __LINE__, res);
 }
 #define SKIP_CODE1_LEN 7
 void add_skip_code1(code_p body, code_p res, int* k){
@@ -888,18 +960,20 @@
 	if (els->len)
 		add_code(els, res, &k);
 	pr_assert(k == res->len);
-	return debug_retrn(__LINE__, res);
+	return debug_retrn(IST, __LINE__, res);
 }
 
 code_p break_stmt(void* param, obj_p label){
 	code_p res = new_code(param, 2, 0, 0, OP_BREAK);
+	get_loc(IST, res, label);
 	res->code_data[1].pstr = pr2c_strptr(IST, label);
-	return debug_retrn(__LINE__, res);
+	return debug_retrn(IST, __LINE__, res);
 }
 code_p continue_stmt(void* param, obj_p label){
 	code_p res = new_code(param, 2, 0, 0, OP_CONTINUE);
+	get_loc(IST, res, label);
 	res->code_data[1].pstr = pr2c_strptr(IST, label);
-	return debug_retrn(__LINE__, res);
+	return debug_retrn(IST, __LINE__, res);
 }
 void patch_break_continues(void* param, obj_p label, code_p body) {
 	int p=0;
@@ -1125,7 +1199,7 @@
 	res->code_data[k++].bytecode.param  = 0;
 	add_for_clause(param, res, &k, expr, forlst, 0, lcc, -1, loc_list);
 	res->stack_depth -=1;
-	return debug_retrn(__LINE__, res);
+	return debug_retrn(IST, __LINE__, res);
 }
 
 code_p for_lcc_body_else(void* param, clist_p targets, code_p body, code_p els){
@@ -1201,7 +1275,7 @@
 	res->code_data[k++].bytecode.param  = 1;
 	res->code_data[k++].bytecode.opcode = OP_RERAISE;
 	pr_assert(end_loc == k);
-	return debug_retrn(__LINE__, res);
+	return debug_retrn(IST, __LINE__, res);
 }
 code_p ref_expr_to_ass_op(void* param, code_p ref, code_p rparm, int iop, int op){
 	code *res;
@@ -1230,7 +1304,7 @@
 	res->code_data[k++].bytecode.param  = 1;
 	pr_assert(len = k);
 	res->stack_depth = 0;
-	return debug_retrn(__LINE__, res);
+	return debug_retrn(IST, __LINE__, res);
 }
 code_p while_expr_body_else(void* param, obj_p label, code_p expr, code_p body, code_p els){
 	code *res;
@@ -1249,6 +1323,10 @@
 		calc_code(els, &len, &stack_depth, &max_stack_depth);
 	end_loc  = len;
 	res = new_code(param, len, stack_depth, max_stack_depth, 0);
+	get_loc(IST, res, label);
+	merge_loc(res, expr);
+	merge_loc(res, body);
+	merge_loc(res, els);	
 	pr_assert(loop_loc == k);
 	add_code(expr, res, &k);
 	res->code_data[k  ].bytecode.opcode = OP_PUSH;
@@ -1277,13 +1355,13 @@
 	if (els->len)
 		add_code(els, res, &k);
 	pr_assert(end_loc == k);
-	return debug_retrn(__LINE__, res);
+	return debug_retrn(IST, __LINE__, res);
 }
 code_p cond_exc_to_assert(void* param, code_p cond, code_p exc){
 	int k=0, len=0, stack_depth=0, max_stack_depth=7, pop_loc;
 	code *res;
 	if(!((parse_state*) param)->assert_enbld)
-		return debug_retrn(__LINE__, none(param));
+		return debug_retrn(IST, __LINE__, none(param));
 	calc_code(cond, &len, &stack_depth, &max_stack_depth);
 	len += 7;
 	calc_code(exc, &len, &stack_depth, &max_stack_depth);
@@ -1310,7 +1388,7 @@
 	res->code_data[k++].bytecode.param  = 1;
 	res->stack_depth -= 1;
 	pr_assert(res->len == k);
-	return debug_retrn(__LINE__, res);
+	return debug_retrn(IST, __LINE__, res);
 }
 
 code_p ref_parm_body_to_def(void* param, code_p name, clist_p params, code_p self, code_p body, int flg) { 
@@ -1403,7 +1481,7 @@
 	pr_assert(res->len == k);
 	if (body->doc_flg)
 		set_attr(IST, func, SYM(DOC_), (obj_p)(body->code_data[1].data));
-	return debug_retrn(__LINE__, res);
+	return debug_retrn(IST, __LINE__, res);
 }
 code_p new_tuple_list(void* param, clist_p lst, int tuple_flag){
 	int i, k=0, len=1, stack_depth=1, max_stack_depth=1;
@@ -1419,7 +1497,7 @@
 	pr_free(lst);
 	res->stack_depth -= clist_len(lst);
 	pr_assert(res->len == k);
-	return debug_retrn(__LINE__, res);
+	return debug_retrn(IST, __LINE__, res);
 }
 code_p new_dict(void* param, clist_p lst){
 	int i, k=0, len=1, stack_depth=1, max_stack_depth=1;
@@ -1443,7 +1521,7 @@
 	pr_free(lst);
 	res->stack_depth -= clist_len(lst)*2;
 	pr_assert(res->len == k);
-	return debug_retrn(__LINE__, res);
+	return debug_retrn(IST, __LINE__, res);
 }
 code_p raise_expr(void* param, code_p expr1,  code_p expr2) {
 	int k=0, len=0, stack_depth=0, max_stack_depth=0;
@@ -1464,7 +1542,7 @@
 	res->code_data[k++].bytecode.opcode = OP_RAISE;
 	res->stack_depth = 0;
 	pr_assert(res->len == k);
-	return debug_retrn(__LINE__, res);
+	return debug_retrn(IST, __LINE__, res);
 }
 code_p word_expr_to_param(void* param, obj_p word, code_p expr){
 	int k=0, len=2, stack_depth=1, max_stack_depth=1;
@@ -1475,25 +1553,29 @@
 	res->code_data[k++].data = word;
 	add_code(expr, res, &k);
 	pr_assert(res->len == k);
-	return debug_retrn(__LINE__, res);
+	return debug_retrn(IST, __LINE__, res);
 }
 code_p expr_to_param(void* param, code_p expr){
-	return debug_retrn(__LINE__, word_expr_to_param(param, OBJ(NOKEY), expr));
+	return debug_retrn(IST, __LINE__, word_expr_to_param(param, OBJ(NOKEY), expr));
 }
 code_p label_eq_expr_to_param(void* param, obj_p label, code_p expr){
-	return debug_retrn(__LINE__, word_expr_to_param(param, sym(IST, pr2c_strptr(IST, label)), expr));
+	code_p res = debug_retrn(IST, __LINE__, word_expr_to_param(param, sym(IST, pr2c_strptr(IST, label)), expr));
+	get_loc(IST, res, label);
+	merge_loc(res, expr);
+	return res;
 }
 code_p star_seq_to_param(void* param, code_p expr){
-	return debug_retrn(__LINE__, word_expr_to_param(param, OBJ(PARAM_STAR), expr));
+	return debug_retrn(IST, __LINE__, word_expr_to_param(param, OBJ(PARAM_STAR), expr));
 }
 code_p star_star_dict_to_param(void* param, code_p expr){
-	return debug_retrn(__LINE__, word_expr_to_param(param, OBJ(PARAM_STAR_STAR), expr));
+	return debug_retrn(IST, __LINE__, word_expr_to_param(param, OBJ(PARAM_STAR_STAR), expr));
 }
 code_p int_to_obj(void* param, obj_p num) {
 	code_p res = new_code(param, 2, 1, 1, OP_PUSH);
+	get_loc(IST, res, num);
 	res->code_data[0].bytecode.param = 2;
 	res->code_data[1].data = num;
-	return debug_retrn(__LINE__, res);
+	return debug_retrn(IST, __LINE__, res);
 }
 code_p float_to_obj(void* param, double num, obj_p int_obj, int imag_flag) {
 	code_p res;
@@ -1504,34 +1586,37 @@
 	else
 		*((double*) obj_malloc(IST, proto, obj, sizeof(double))) = num;
 	res = new_code(param, 2, 1, 1, OP_PUSH);
+	get_loc(IST, res, int_obj);
 	res->code_data[0].bytecode.param = 2;
 	res->code_data[1].data = obj;
 	add_to_const_list(param, obj);
-	return debug_retrn(__LINE__, res);	
+	return debug_retrn(IST, __LINE__, res);	
 }
 code_p string_to_obj(void* param, obj_p str){
 	code_p p = new_code(param, 2, 1, 1, OP_PUSH);
 	obj_p obj = copy_object(IST, str);
+	get_loc(IST, p, str);
 	p->code_data[0].bytecode.param = 2;
 	p->code_data[1].data = obj;
 	add_to_const_list(param, obj);
-	return debug_retrn(__LINE__, p);
+	return debug_retrn(IST, __LINE__, p);
 }
 code_p rquote_lbl_to_obj(void* param, obj_p label) {
 	code_p p = new_code(param, 2, 1, 1, OP_PUSH);
 	obj_p symbol = sym(IST, pr2c_strptr(IST, label));
+	get_loc(IST, p, label);
 	p->code_data[0].bytecode.param = 2;
 	p->code_data[1].data = symbol;
 	add_to_const_list(param, symbol);
-	return debug_retrn(__LINE__, p);
+	return debug_retrn(IST, __LINE__, p);
 }
 code_p self_to_obj(void* param){
 	code_p p = new_code(param, 1, 1, 1, OP_PUSH_SELF);
-	return debug_retrn(__LINE__, p);
+	return debug_retrn(IST, __LINE__, p);
 }
 code_p caller_to_obj(void* param){
 	code_p p = new_code(param, 1, 1, 1, OP_PUSH_CALLER);
-	return debug_retrn(__LINE__, p);
+	return debug_retrn(IST, __LINE__, p);
 }
 code_p assign_right(void* param, clist_p right){
 	code_p res;
@@ -1544,7 +1629,7 @@
 	for(i=0; i < rlen; i++)
 		add_code(clist_item(right,i), res, &k);
 	pr_assert(k==res->len);
-	return debug_retrn(__LINE__, res);
+	return debug_retrn(IST, __LINE__, res);
 }
 code_p tgt_eq_stmt_to_stmt(void* param, clist_p left, code_p right){
 	code_p res;
@@ -1567,27 +1652,30 @@
 	res->code_data[k++].bytecode.param  = llen;
 	res->stack_depth -= llen*2;
 	pr_assert(k==res->len);
-	return debug_retrn(__LINE__, append_code(param, right, res, 0));
+	return debug_retrn(IST, __LINE__, append_code(param, right, res, 0));
 }
 code_p tgt_eq_expr_to_stmt(void* param, clist_p left, clist_p right){
-	return debug_retrn(__LINE__, tgt_eq_stmt_to_stmt(param, left, assign_right(param, right)));
+	return debug_retrn(IST, __LINE__, tgt_eq_stmt_to_stmt(param, left, assign_right(param, right)));
 }
 code_p assign_cleanup(void* param, code_p ass_code){
 	code_p res = new_code(param, 1, -(ass_code->assign_parm_cnt), 0, OP_POP);
 	res->code_data[0].bytecode.param = ass_code->assign_parm_cnt;
-	return debug_retrn(__LINE__, append_code(param, ass_code, res, 0));
+	return debug_retrn(IST, __LINE__, append_code(param, ass_code, res, 0));
 }
 code_p exceptall(void* param){
 	code_p res = new_code(param, 2, 1, 1, OP_PUSH);
 	res->code_data[0].bytecode.param  = 2;
 	res->code_data[1].data = OBJ(EXCEPTION);
-	return debug_retrn(__LINE__, res);
+	return debug_retrn(IST, __LINE__, res);
 }
 code_p expr_label_body_to_except(void* param, code_p expr, obj_p label, code_p body) {
 	code *res;
 	int k=0, len=3, stack_depth=1, max_stack_depth = 1;
 	calc_code(expr, &len, &stack_depth, &max_stack_depth);
 	res = new_code(param, len, stack_depth, max_stack_depth, 0);
+	get_loc(IST, res, label);
+	merge_loc(res, expr);
+	merge_loc(res, body);
 	add_code(expr, res, &k);
 	res->code_data[k  ].bytecode.opcode = OP_PUSH;
 	res->code_data[k++].bytecode.param  = 2;
@@ -1598,7 +1686,7 @@
 	res->code_data[k  ].bytecode.opcode = OP_EXCEPT;
 	res->code_data[k++].bytecode.param  = body->len+2;
 	pr_assert(res->len == k);
-	return debug_retrn(__LINE__, append_code(param, res, body, 0));
+	return debug_retrn(IST, __LINE__, append_code(param, res, body, 0));
 }
 code_p body_except_else_to_tryexcept(void* param, code_p body, clist_p except_list, code_p els){
 	code *res;
@@ -1636,7 +1724,7 @@
 	if (els)
 		add_code(els, res, &k);
 	pr_assert(end_loc == k);
-	return debug_retrn(__LINE__, res);
+	return debug_retrn(IST, __LINE__, res);
 }
 code_p tryfinally_body(void* param, code_p body, code_p final){
 	code *res;
@@ -1650,7 +1738,7 @@
 	add_code(final, res, &k);
 	res->code_data[k++].bytecode.opcode = OP_RERAISE;
 	pr_assert(res->len == k);
-	return debug_retrn(__LINE__, res);
+	return debug_retrn(IST, __LINE__, res);
 }
 code_p op_expr(int op, code_p expr, int size){
 	data_size_t data_size;
@@ -1660,20 +1748,20 @@
 	expr->size = data_size;
 	expr->code_data[expr->len-1].bytecode.opcode = op;
 	expr->stack_depth -= size;
-	return debug_retrn(__LINE__, expr);
+	return expr;
 }
 code_p exec_expr(void* param, code_p expr){
-	return debug_retrn(__LINE__, op_expr(OP_EXEC, expr, 1));
+	return debug_retrn(IST, __LINE__, op_expr(OP_EXEC, expr, 1));
 }
 code_p tgtparm_to_obj(void* param, code_p expr){
-	return debug_retrn(__LINE__, op_expr(OP_DEREF, expr, 1));
+	return debug_retrn(IST, __LINE__, op_expr(OP_DEREF, expr, 1));
 }
 code_p del_ref(void* param, code_p expr){
-	return debug_retrn(__LINE__, op_expr(OP_DEL, expr, 2));
+	return debug_retrn(IST, __LINE__, op_expr(OP_DEL, expr, 2));
 }
 code_p yield_expr(void* param, code_p expr){
-	return debug_retrn(__LINE__, op_expr(OP_YIELD, expr, 1));
+	return debug_retrn(IST, __LINE__, op_expr(OP_YIELD, expr, 1));
 }
 code_p return_expr(void* param, code_p expr){
-	return debug_retrn(__LINE__, op_expr(OP_RETURN, expr, 1));
+	return debug_retrn(IST, __LINE__, op_expr(OP_RETURN, expr, 1));
 }

Modified: trunk/src/prothon.y
===================================================================
--- trunk/src/prothon.y	2004-07-11 19:30:40 UTC (rev 723)
+++ trunk/src/prothon.y	2004-07-12 08:00:19 UTC (rev 724)
@@ -193,6 +193,7 @@
 %left	  '/'	   
 %left	  TDV	 
 %left	  '%'	   
+%left     '@'
 %left     UPL     
 %left     UMI    
 %nonassoc '~'	   
@@ -532,6 +533,7 @@
 	| 	expr RSH_BANG expr      									{ $$ = binary(yylex_param, $1, IRSHIFT_, $3); }
 	| 	expr LSH_BANG expr      									{ $$ = binary(yylex_param, $1, ILSHIFT_, $3); }
 	| 	expr EXP_BANG expr      									{ $$ = binary(yylex_param, $1, IPOW_, $3); }
+	| 	'@' expr 							            			{ $$ = atdebug(yylex_param, $2); }
 	| 	'+' expr 							%prec UPL      			{ $$ = unary(yylex_param, POS_, $2); }
 	| 	'-' expr 							%prec UMI				{ $$ = unary(yylex_param, NEG_, $2); }
 	| 	'~' expr      												{ $$ = unary(yylex_param, INV_, $2); }
@@ -669,6 +671,20 @@
 
 #include <ctype.h>
 
+void set_srcloc(isp ist, void* yylex_param, int token_line, int token_col, obj_p obj) {
+	obj_p list = new_list_obj(IST, 4);
+	int immutable_flg;
+	list_append(IST, list, new_int_obj(IST, token_line));
+	list_append(IST, list, new_int_obj(IST, token_col));
+	list_append(IST, list, new_int_obj(IST, state->line));
+	list_append(IST, list, new_int_obj(IST, state->column));
+	immutable_flg = is_immutable(obj);
+	clr_immutable(obj);
+	set_attr(IST, obj, SYM(SRCLOC_), list);
+	if (immutable_flg)
+		set_immutable(obj);
+} 
+
 // special get character function
 // automatically handle different format line ends (\r, \n, & \r\n -> \n)
 // increment lines and columns for YYLTYPE in parser
@@ -732,7 +748,10 @@
 
 int yylex (YYSTYPE *lvalp, void* yylex_param){
 	int c, indent_cnt=0, unknown_indent_flag=0, mixed_indents, level_mismatch;
-
+	
+	int token_line = state->line;
+	int token_col  = state->column;
+
 	if (state->indents_needed > 0){
 		state->indents_needed--;
 		return INDENT;
@@ -985,11 +1004,12 @@
 		if (x_flag)
 			lvalp->str_type = new_bytes_obj(IST, str_ptr, str_index-1);
 		else
-			lvalp->str_type = new_string_n_obj(IST, str_ptr, str_index-1); 
+			lvalp->str_type = new_string_n_obj(IST, str_ptr, str_index-1);
+		set_srcloc(IST, yylex_param, token_line, token_col, lvalp->str_type);
 #ifdef TRACE_PARSER
-	if (trace_parser){
-		fprintf(((parse_state*) yylex_param)->debug_stream, "\"%s\"\n",str_ptr);
-	}
+		if (trace_parser){
+			fprintf(((parse_state*) yylex_param)->debug_stream, "\"%s\"\n",str_ptr);
+		}
 #endif
 		return STRING;
 	}
@@ -1176,10 +1196,11 @@
 
 		str_ptr = pr_realloc(str_ptr, str_index);
 		lvalp->str_type = new_string_n_obj(IST, str_ptr, str_index-1); 
+		set_srcloc(IST, yylex_param, token_line, token_col, lvalp->str_type);
 #ifdef TRACE_PARSER
-	if (trace_parser){
-		fprintf(((parse_state*) yylex_param)->debug_stream, "\"%s\"\n",str_ptr);
-	}
+		if (trace_parser){
+			fprintf(((parse_state*) yylex_param)->debug_stream, "\"%s\"\n",str_ptr);
+		}
 #endif
 		return LABEL;
 	}
@@ -1267,6 +1288,7 @@
 					printf("Lexical error: invalid integer number format\n");
 					return ERR;
 				}
+				set_srcloc(IST, yylex_param, token_line, token_col, lvalp->int_type);
 				if (imag_flag)
 					return INT_IMAG;
 				else
@@ -1296,6 +1318,7 @@
 			printf("Lexical error: invalid floating number format\n");
 			return ERR;
 		}
+		//set_srcloc(IST, yylex_param, token_line, token_col, lvalp->float_type);
 		if (imag_flag)
 			return FLOAT_IMAG;
 		else

Modified: trunk/src/symbol.c
===================================================================
--- trunk/src/symbol.c	2004-07-11 19:30:40 UTC (rev 723)
+++ trunk/src/symbol.c	2004-07-12 08:00:19 UTC (rev 724)
@@ -162,7 +162,8 @@
 	{ "notifyCallback_",0},
 	{ "get_",           0},
 	{ "set_",           0},
-	{ "del_",           0}
+	{ "del_",           0},
+	{ "srcLoc_",        0}
 };
 
 typedef struct trie_node_s* trie_p;