diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-10-30 06:56:18 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-10-30 06:56:18 +0000 |
commit | 3e9e2bd4ed14de63e8e18e779a5e8c1060ea5bcf () | |
tree | 873570181bc80e61f01eca31effb94af645c188c | |
parent | ad2c05f1c0947cbcc5dd86b00dda06bf4c391692 (diff) |
* eval.c (rb_eval): NODE_XSTR should pass copy of literal string.
* array.c (rb_ary_update): a[n,m]=nil no longer works as element deletion. * enum.c (enum_sort_by): protect continuation jump in. [ruby-dev:24642] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@7145 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 12 | ||||
-rw-r--r-- | Makefile.in | 2 | ||||
-rw-r--r-- | array.c | 6 | ||||
-rw-r--r-- | configure.in | 5 | ||||
-rw-r--r-- | enum.c | 3 | ||||
-rw-r--r-- | eval.c | 9 | ||||
-rw-r--r-- | ext/win32ole/win32ole.c | 2 | ||||
-rw-r--r-- | gc.c | 6 | ||||
-rw-r--r-- | node.h | 7 | ||||
-rw-r--r-- | parse.y | 17 | ||||
-rw-r--r-- | regcomp.c | 15 | ||||
-rw-r--r-- | regexec.c | 111 | ||||
-rw-r--r-- | regint.h | 2 | ||||
-rw-r--r-- | regparse.c | 1 | ||||
-rw-r--r-- | regparse.h | 3 | ||||
-rw-r--r-- | test/ripper/test_parser_events.rb | 2 | ||||
-rw-r--r-- | variable.c | 2 |
17 files changed, 116 insertions, 89 deletions
@@ -5,6 +5,18 @@ Sat Oct 30 15:24:41 2004 Masaki Suketa <[email protected]> * ext/win32ole/tests/testOLETYPELIB.rb: add WIN32OLE_TYPELIB class. Fri Oct 29 21:27:51 2004 Nobuyoshi Nakada <[email protected]> * io.c (rb_io_check_initialized): new function to check uninitialized @@ -6,7 +6,7 @@ srcdir = @srcdir@ VPATH = $(srcdir):$(srcdir)/missing CC = @CC@ -YACC = @YACC@ PURIFY = AUTOCONF = autoconf @SET_MAKE@ @@ -1091,7 +1091,7 @@ rb_ary_update(ary, beg, len, rpl) } rb_ary_modify(ary); - if (NIL_P(rpl)) { rlen = 0; } else { @@ -1683,7 +1683,7 @@ ary_sort_check(data) struct ary_sort_data *data; { if (RARRAY(data->ary)->ptr != data->ptr || RARRAY(data->ary)->len != data->len) { - rb_raise(rb_eArgError, "array modified during sort"); } } @@ -2085,7 +2085,7 @@ rb_ary_slice_bang(argc, argv, ary) pos = RARRAY(ary)->len + pos; } arg2 = rb_ary_subseq(ary, pos, len); - rb_ary_update(ary, pos, len, Qnil); /* Qnil/rb_ary_new2(0) */ return arg2; } @@ -157,11 +157,6 @@ AC_SUBST(OUTFLAG) RUBY_MINGW32 -AC_PROG_YACC -if test "$YACC" = "yacc"; then - AC_DEFINE([OLD_YACC]) -fi - AC_CHECK_TOOL(RANLIB, ranlib, :) AC_CHECK_TOOL(AR, ar) if test -z "$AR"; then @@ -494,6 +494,9 @@ enum_sort_by(obj) if (RARRAY(ary)->len > 1) { qsort(RARRAY(ary)->ptr, RARRAY(ary)->len, sizeof(VALUE), sort_by_cmp, 0); } for (i=0; i<RARRAY(ary)->len; i++) { RARRAY(ary)->ptr[i] = RNODE(RARRAY(ary)->ptr[i])->u2.value; } @@ -3640,7 +3640,7 @@ rb_eval(self, n) break; case NODE_XSTR: - result = rb_funcall(self, '`', 1, node->nd_lit); break; case NODE_LIT: @@ -3731,7 +3731,7 @@ rb_eval(self, n) if (NIL_P(ruby_class)) { rb_raise(rb_eTypeError, "no class to undef method"); } - rb_undef(ruby_class, node->nd_mid); result = Qnil; break; @@ -3739,12 +3739,13 @@ rb_eval(self, n) if (NIL_P(ruby_class)) { rb_raise(rb_eTypeError, "no class to make alias"); } - rb_alias(ruby_class, node->nd_new, node->nd_old); result = Qnil; break; case NODE_VALIAS: - rb_alias_variable(node->nd_new, node->nd_old); result = Qnil; break; @@ -1816,7 +1816,7 @@ fole_initialize(argc, argv, self) SysFreeString(pBuf); if(FAILED(hr)) { ole_raise(hr, eWIN32OLE_RUNTIME_ERROR, - "Unknown OLE server `%s'", StringValuePtr(svr_name)); } @@ -806,6 +806,8 @@ gc_mark_children(ptr, lev) case NODE_OP_ASGN_OR: case NODE_OP_ASGN_AND: case NODE_MODULE: gc_mark((VALUE)obj->as.node.u1.node, lev); /* fall through */ case NODE_METHOD: /* 2 */ @@ -820,6 +822,7 @@ gc_mark_children(ptr, lev) case NODE_COLON3: case NODE_OPT_N: case NODE_EVSTR: ptr = (VALUE)obj->as.node.u2.node; goto again; @@ -859,11 +862,8 @@ gc_mark_children(ptr, lev) case NODE_CVAR: case NODE_NTH_REF: case NODE_BACK_REF: - case NODE_ALIAS: - case NODE_VALIAS: case NODE_REDO: case NODE_RETRY: - case NODE_UNDEF: case NODE_SELF: case NODE_NIL: case NODE_TRUE: @@ -217,9 +217,6 @@ typedef struct RNode { #define nd_noex u1.id #define nd_defn u3.node -#define nd_old u1.id -#define nd_new u2.id - #define nd_cfnc u1.cfunc #define nd_argc u2.argc @@ -319,8 +316,8 @@ typedef struct RNode { #define NEW_SVALUE(a) NEW_NODE(NODE_SVALUE,a,0,0) #define NEW_BLOCK_ARG(v) NEW_NODE(NODE_BLOCK_ARG,v,0,local_cnt(v)) #define NEW_BLOCK_PASS(b) NEW_NODE(NODE_BLOCK_PASS,0,b,0) -#define NEW_ALIAS(n,o) NEW_NODE(NODE_ALIAS,o,n,0) -#define NEW_VALIAS(n,o) NEW_NODE(NODE_VALIAS,o,n,0) #define NEW_UNDEF(i) NEW_NODE(NODE_UNDEF,0,i,0) #define NEW_CLASS(n,b,s) NEW_NODE(NODE_CLASS,n,NEW_SCOPE(b),(s)) #define NEW_SCLASS(r,b) NEW_NODE(NODE_SCLASS,r,NEW_SCOPE(b),0) @@ -490,9 +490,9 @@ static void ripper_compile_error _((struct parser_params*, const char *fmt, ...) %type <node> f_arglist f_args f_optarg f_opt f_block_arg opt_f_block_arg %type <node> assoc_list assocs assoc kwargs undef_list backref string_dvar %type <node> for_var block_var opt_block_var block_par -%type <node> brace_block cmd_brace_block do_block lhs none %type <node> mlhs mlhs_head mlhs_basic mlhs_entry mlhs_item mlhs_node -%type <id> fitem variable sym symbol operation operation2 operation3 %type <id> cname fname op f_rest_arg %type <num> f_norm_arg f_arg /*%%%*/ @@ -1511,10 +1511,21 @@ fname : tIDENTIFIER } ; -fitem : fname | symbol ; undef_list : fitem { /*%%%*/ @@ -684,7 +684,16 @@ compile_range_repeat_node(QualifierNode* qn, int target_len, int empty_info, r = compile_tree_empty_check(qn->target, reg, empty_info); if (r) return r; - r = add_opcode(reg, qn->greedy ? OP_REPEAT_INC : OP_REPEAT_INC_NG); if (r) return r; r = add_mem_num(reg, num_repeat); /* OP_REPEAT ID */ return r; @@ -3057,6 +3066,10 @@ setup_tree(Node* node, regex_t* reg, int state, ScanEnv* env) QualifierNode* qn = &(NQUALIFIER(node)); Node* target = qn->target; if (IS_REPEAT_INFINITE(qn->upper) || qn->upper >= 1) { r = get_min_match_length(target, &d, env); if (r) break; @@ -1053,6 +1053,7 @@ match_at(regex_t* reg, UChar* str, UChar* end, UChar* sstart, char *alloca_base; StackType *stk_alloc, *stk_base, *stk, *stk_end; StackType *stkp; /* used as any purpose. */ StackIndex *repeat_stk; StackIndex *mem_start_stk, *mem_end_stk; n = reg->num_repeat + reg->num_mem * 2; @@ -2170,79 +2171,67 @@ match_at(regex_t* reg, UChar* str, UChar* end, UChar* sstart, break; case OP_REPEAT_INC: STAT_OP_IN(OP_REPEAT_INC); - { - StackIndex si; - GET_MEMNUM_INC(mem, p); /* mem: OP_REPEAT ID */ -#ifdef USE_SUBEXP_CALL - if (reg->num_call > 0) { - STACK_GET_REPEAT(mem, stkp); - si = GET_STACK_INDEX(stkp); - } - else { - si = repeat_stk[mem]; - stkp = STACK_AT(si); - } -#else - si = repeat_stk[mem]; - stkp = STACK_AT(si); -#endif - stkp->u.repeat.count++; - if (stkp->u.repeat.count == reg->repeat_range[mem].upper) { - /* end of repeat. Nothing to do. */ - } - else if (stkp->u.repeat.count >= reg->repeat_range[mem].lower) { - STACK_PUSH_ALT(p, s, sprev); - p = stkp->u.repeat.pcode; - } - else { - p = stkp->u.repeat.pcode; - } - STACK_PUSH_REPEAT_INC(si); } STAT_OP_OUT; continue; break; - case OP_REPEAT_INC_NG: STAT_OP_IN(OP_REPEAT_INC_NG); - { - StackIndex si; - - GET_MEMNUM_INC(mem, p); /* mem: OP_REPEAT ID */ -#ifdef USE_SUBEXP_CALL - if (reg->num_call > 0) { - STACK_GET_REPEAT(mem, stkp); - si = GET_STACK_INDEX(stkp); - } - else { - si = repeat_stk[mem]; - stkp = STACK_AT(si); - } -#else - si = repeat_stk[mem]; - stkp = STACK_AT(si); -#endif - stkp->u.repeat.count++; - if (stkp->u.repeat.count < reg->repeat_range[mem].upper) { - if (stkp->u.repeat.count >= reg->repeat_range[mem].lower) { - UChar* pcode = stkp->u.repeat.pcode; - STACK_PUSH_REPEAT_INC(si); - STACK_PUSH_ALT(pcode, s, sprev); - } - else { - p = stkp->u.repeat.pcode; - STACK_PUSH_REPEAT_INC(si); - } - } - else if (stkp->u.repeat.count == reg->repeat_range[mem].upper) { - STACK_PUSH_REPEAT_INC(si); - } } STAT_OP_OUT; continue; break; case OP_PUSH_POS: STAT_OP_IN(OP_PUSH_POS); STACK_PUSH_POS(s, sprev); STAT_OP_OUT; @@ -500,6 +500,8 @@ enum OpCode { OP_REPEAT_NG, /* {n,m}? (non greedy) */ OP_REPEAT_INC, OP_REPEAT_INC_NG, /* non greedy */ OP_NULL_CHECK_START, /* null loop checker start */ OP_NULL_CHECK_END, /* null loop checker end */ OP_NULL_CHECK_END_MEMST, /* null loop checker end (with capture status) */ @@ -1058,6 +1058,7 @@ node_new_qualifier(int lower, int upper, int by_number) Node* node = node_new(); CHECK_NULL_RETURN(node); node->type = N_QUALIFIER; NQUALIFIER(node).target = NULL; NQUALIFIER(node).lower = lower; NQUALIFIER(node).upper = upper; @@ -96,6 +96,7 @@ typedef struct { } CClassNode; typedef struct { struct _Node* target; int lower; int upper; @@ -121,6 +122,7 @@ typedef struct { #define NST_ADDR_FIXED (1<<9) #define NST_NAMED_GROUP (1<<10) #define NST_NAME_REF (1<<11) #define SET_EFFECT_STATUS(node,f) (node)->u.effect.state |= (f) #define CLEAR_EFFECT_STATUS(node,f) (node)->u.effect.state &= ~(f) @@ -140,6 +142,7 @@ typedef struct { #define IS_CALL_RECURSION(cn) (((cn)->state & NST_RECURSION) != 0) #define IS_CALL_NAME_REF(cn) (((cn)->state & NST_NAME_REF) != 0) #define IS_BACKREF_NAME_REF(bn) (((bn)->state & NST_NAME_REF) != 0) typedef struct { int state; @@ -50,7 +50,7 @@ class TestRipper_ParserEvents < Test::Unit::TestCase end def test_alias - assert_equal '[alias(a,b)]', parse('alias a b') end def test_var_alias @@ -967,7 +967,7 @@ rb_free_generic_ivar(obj) { st_table *tbl; -// if (!generic_iv_tbl) return; if (st_delete(generic_iv_tbl, &obj, (st_data_t *)&tbl)) st_free_table(tbl); } |