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;