* io.c (rb_io_mode_flags): both 'r+b' and 'rb+' should be allowed.

* io.c (rb_io_mode_modenum): ditto.

* gc.c (rb_memerror): rename from mem_error, and exported.

* gc.c (Init_GC): pre-allocate NoMemoryError instance.

* object.c (convert_type): error message changed from "failed to
  convert" to "cannot convert", since it does not try to convert
  if an object does not respond to the converting method.

* eval.c (block_pass): convert Method to Proc using
  rb_check_convert_type().

* object.c (rb_check_convert_type): always convert T_DATA

* eval.c (rb_thread_cleanup): should not terminate main_thread by
  Fatal error.

* regex.c (is_in_list): need to not exclude NUL and NEWLINE.

* re.c (rb_reg_expr_str): wrong backslash escapement.

* re.c (rb_reg_expr_str): do not escape embedded space
  characters.

* marshal.c (w_object): T_DATA process patch from Joel VanderWerf
  <vjoel@PATH.Berkeley.EDU>.  This is temporary hack; it remains
  undocumented, and it will be removed when marshaling is
  re-designed.

* marshal.c (r_object): ditto.

* numeric.c (num_step): Integer#step is moved to Numeric#step;
  Fixnum#step is merged into this method.

* numeric.c (int_dotimes): Fixnum#times is merged.

* numeric.c (int_upto): Fixnum#upto is merged.

* numeric.c (int_downto): Fixnum#downto is merged.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2401 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
matz 2002-04-24 04:54:16 +00:00
parent b596fbbc37
commit e3a8c62630
24 changed files with 485 additions and 434 deletions

View File

@ -1,3 +1,9 @@
Wed Apr 24 06:48:31 2002 Koji Arai <jca02266@nifty.ne.jp>
* io.c (rb_io_mode_flags): both 'r+b' and 'rb+' should be allowed.
* io.c (rb_io_mode_modenum): ditto.
Wed Apr 24 01:16:14 2002 Nobuyoshi Nakada <nobu@ruby-lang.org> Wed Apr 24 01:16:14 2002 Nobuyoshi Nakada <nobu@ruby-lang.org>
* ext/stringio/stringio.c (strio_mark): must check if ptr is NULL * ext/stringio/stringio.c (strio_mark): must check if ptr is NULL
@ -14,12 +20,61 @@ Wed Apr 24 00:37:12 2002 NAKAMURA Usaku <usa@ruby-lang.org>
* lib/mkmf.rb (create_makefile): add `{$(srcdir)}' when including depend * lib/mkmf.rb (create_makefile): add `{$(srcdir)}' when including depend
file. file.
Tue Apr 23 12:58:18 2002 Yukihiro Matsumoto <matz@ruby-lang.org>
* gc.c (rb_memerror): rename from mem_error, and exported.
* gc.c (Init_GC): pre-allocate NoMemoryError instance.
* object.c (convert_type): error message changed from "failed to
convert" to "cannot convert", since it does not try to convert
if an object does not respond to the converting method.
Mon Apr 22 09:31:30 2002 Yukihiro Matsumoto <matz@ruby-lang.org>
* eval.c (block_pass): convert Method to Proc using
rb_check_convert_type().
* object.c (rb_check_convert_type): always convert T_DATA
* eval.c (rb_thread_cleanup): should not terminate main_thread by
Fatal error.
* regex.c (is_in_list): need to not exclude NUL and NEWLINE.
Sat Apr 20 00:19:13 2002 Yukihiro Matsumoto <matz@ruby-lang.org>
* re.c (rb_reg_expr_str): wrong backslash escapement.
* re.c (rb_reg_expr_str): do not escape embedded space
characters.
Fri Apr 19 22:03:40 2002 NAKAMURA Usaku <usa@ruby-lang.org> Fri Apr 19 22:03:40 2002 NAKAMURA Usaku <usa@ruby-lang.org>
* win32/Makefile.sub: add -DNT to $CFLAGS instead of $CPPFLAGS. * win32/Makefile.sub: add -DNT to $CFLAGS instead of $CPPFLAGS.
* win32/setup.mak: ditto. * win32/setup.mak: ditto.
Fri Apr 19 17:24:22 2002 Yukihiro Matsumoto <matz@ruby-lang.org>
* marshal.c (w_object): T_DATA process patch from Joel VanderWerf
<vjoel@PATH.Berkeley.EDU>. This is temporary hack; it remains
undocumented, and it will be removed when marshaling is
re-designed.
* marshal.c (r_object): ditto.
Fri Apr 19 17:10:55 2002 Yukihiro Matsumoto <matz@ruby-lang.org>
* numeric.c (num_step): Integer#step is moved to Numeric#step;
Fixnum#step is merged into this method.
* numeric.c (int_dotimes): Fixnum#times is merged.
* numeric.c (int_upto): Fixnum#upto is merged.
* numeric.c (int_downto): Fixnum#downto is merged.
Fri Apr 19 16:22:55 2002 WATANABE Hirofumi <eban@ruby-lang.org> Fri Apr 19 16:22:55 2002 WATANABE Hirofumi <eban@ruby-lang.org>
* ext/socket/extconf.rb: include <windows.h>, <winsock.h> on _WIN32. * ext/socket/extconf.rb: include <windows.h>, <winsock.h> on _WIN32.

View File

@ -207,13 +207,6 @@ to_ary(ary)
return rb_convert_type(ary, T_ARRAY, "Array", "to_ary"); return rb_convert_type(ary, T_ARRAY, "Array", "to_ary");
} }
static VALUE
to_ary_failed(failed)
int *failed;
{
*failed = Qtrue;
}
static VALUE rb_ary_replace _((VALUE, VALUE)); static VALUE rb_ary_replace _((VALUE, VALUE));
static VALUE static VALUE

48
error.c
View File

@ -182,30 +182,30 @@ static struct types {
int type; int type;
const char *name; const char *name;
} builtin_types[] = { } builtin_types[] = {
T_NIL, "nil", {T_NIL, "nil"},
T_OBJECT, "Object", {T_OBJECT, "Object"},
T_CLASS, "Class", {T_CLASS, "Class"},
T_ICLASS, "iClass", /* internal use: mixed-in module holder */ {T_ICLASS, "iClass"}, /* internal use: mixed-in module holder */
T_MODULE, "Module", {T_MODULE, "Module"},
T_FLOAT, "Float", {T_FLOAT, "Float"},
T_STRING, "String", {T_STRING, "String"},
T_REGEXP, "Regexp", {T_REGEXP, "Regexp"},
T_ARRAY, "Array", {T_ARRAY, "Array"},
T_FIXNUM, "Fixnum", {T_FIXNUM, "Fixnum"},
T_HASH, "Hash", {T_HASH, "Hash"},
T_STRUCT, "Struct", {T_STRUCT, "Struct"},
T_BIGNUM, "Bignum", {T_BIGNUM, "Bignum"},
T_FILE, "File", {T_FILE, "File"},
T_TRUE, "true", {T_TRUE, "true"},
T_FALSE, "false", {T_FALSE, "false"},
T_SYMBOL, "Symbol", /* :symbol */ {T_SYMBOL, "Symbol"}, /* :symbol */
T_DATA, "Data", /* internal use: wrapped C pointers */ {T_DATA, "Data"}, /* internal use: wrapped C pointers */
T_MATCH, "MatchData", /* data of $~ */ {T_MATCH, "MatchData"}, /* data of $~ */
T_VARMAP, "Varmap", /* internal use: dynamic variables */ {T_VARMAP, "Varmap"}, /* internal use: dynamic variables */
T_SCOPE, "Scope", /* internal use: variable scope */ {T_SCOPE, "Scope"}, /* internal use: variable scope */
T_NODE, "Node", /* internal use: syntax tree node */ {T_NODE, "Node"}, /* internal use: syntax tree node */
T_UNDEF, "undef", /* internal use: #undef; should not happen */ {T_UNDEF, "undef"}, /* internal use: #undef; should not happen */
-1, 0, {-1, 0}
}; };
void void

62
eval.c
View File

@ -105,7 +105,6 @@ static void rb_f_END _((void));
static VALUE rb_f_block_given_p _((void)); static VALUE rb_f_block_given_p _((void));
static VALUE block_pass _((VALUE,NODE*)); static VALUE block_pass _((VALUE,NODE*));
static VALUE rb_cMethod; static VALUE rb_cMethod;
static VALUE method_proc _((VALUE));
static VALUE method_call _((int, VALUE*, VALUE)); static VALUE method_call _((int, VALUE*, VALUE));
static VALUE rb_cUnboundMethod; static VALUE rb_cUnboundMethod;
static VALUE umethod_bind _((VALUE, VALUE)); static VALUE umethod_bind _((VALUE, VALUE));
@ -117,7 +116,7 @@ static int scope_vmode;
#define SCOPE_PROTECTED 2 #define SCOPE_PROTECTED 2
#define SCOPE_MODFUNC 5 #define SCOPE_MODFUNC 5
#define SCOPE_MASK 7 #define SCOPE_MASK 7
#define SCOPE_SET(f) do {scope_vmode=(f);} while(0) #define SCOPE_SET(f) scope_vmode=(f)
#define SCOPE_TEST(f) (scope_vmode&(f)) #define SCOPE_TEST(f) (scope_vmode&(f))
int ruby_safe_level = 0; int ruby_safe_level = 0;
@ -440,7 +439,7 @@ rb_method_boundp(klass, id, ex)
return Qfalse; return Qfalse;
} }
static ID init, alloc, eqq, each, aref, aset, match, to_ary, missing; static ID init, alloc, eqq, each, aref, aset, match, missing;
static ID added, singleton_added; static ID added, singleton_added;
static ID __id__, __send__; static ID __id__, __send__;
@ -507,7 +506,7 @@ struct SCOPE *ruby_scope;
static struct FRAME *top_frame; static struct FRAME *top_frame;
static struct SCOPE *top_scope; static struct SCOPE *top_scope;
#define PUSH_FRAME() { \ #define PUSH_FRAME() do { \
struct FRAME _frame; \ struct FRAME _frame; \
_frame.prev = ruby_frame; \ _frame.prev = ruby_frame; \
_frame.tmp = 0; \ _frame.tmp = 0; \
@ -524,7 +523,7 @@ static struct SCOPE *top_scope;
ruby_sourcefile = _frame.file; \ ruby_sourcefile = _frame.file; \
ruby_sourceline = _frame.line; \ ruby_sourceline = _frame.line; \
ruby_frame = _frame.prev; \ ruby_frame = _frame.prev; \
} } while (0)
struct BLOCKTAG { struct BLOCKTAG {
struct RBasic super; struct RBasic super;
@ -565,7 +564,7 @@ new_blktag()
return blktag; return blktag;
} }
#define PUSH_BLOCK(v,b) { \ #define PUSH_BLOCK(v,b) do { \
struct BLOCK _block; \ struct BLOCK _block; \
_block.tag = new_blktag(); \ _block.tag = new_blktag(); \
_block.var = v; \ _block.var = v; \
@ -590,10 +589,10 @@ new_blktag()
else if (!(_block.scope->flags & SCOPE_DONT_RECYCLE)) \ else if (!(_block.scope->flags & SCOPE_DONT_RECYCLE)) \
rb_gc_force_recycle((VALUE)_block.tag); \ rb_gc_force_recycle((VALUE)_block.tag); \
ruby_block = _block.prev; \ ruby_block = _block.prev; \
} } while (0)
struct RVarmap *ruby_dyna_vars; struct RVarmap *ruby_dyna_vars;
#define PUSH_VARS() { \ #define PUSH_VARS() do { \
struct RVarmap * volatile _old; \ struct RVarmap * volatile _old; \
_old = ruby_dyna_vars; \ _old = ruby_dyna_vars; \
ruby_dyna_vars = 0 ruby_dyna_vars = 0
@ -604,7 +603,7 @@ struct RVarmap *ruby_dyna_vars;
FL_SET(_old, DVAR_DONT_RECYCLE); \ FL_SET(_old, DVAR_DONT_RECYCLE); \
}\ }\
ruby_dyna_vars = _old; \ ruby_dyna_vars = _old; \
} } while (0)
#define DVAR_DONT_RECYCLE FL_USER2 #define DVAR_DONT_RECYCLE FL_USER2
@ -747,7 +746,7 @@ static struct iter *ruby_iter;
#define ITER_PRE 1 #define ITER_PRE 1
#define ITER_CUR 2 #define ITER_CUR 2
#define PUSH_ITER(i) { \ #define PUSH_ITER(i) do { \
struct iter _iter; \ struct iter _iter; \
_iter.prev = ruby_iter; \ _iter.prev = ruby_iter; \
_iter.iter = (i); \ _iter.iter = (i); \
@ -755,7 +754,7 @@ static struct iter *ruby_iter;
#define POP_ITER() \ #define POP_ITER() \
ruby_iter = _iter.prev; \ ruby_iter = _iter.prev; \
} } while (0)
struct tag { struct tag {
jmp_buf buf; jmp_buf buf;
@ -769,7 +768,7 @@ struct tag {
}; };
static struct tag *prot_tag; static struct tag *prot_tag;
#define PUSH_TAG(ptag) { \ #define PUSH_TAG(ptag) do { \
struct tag _tag; \ struct tag _tag; \
_tag.retval = Qnil; \ _tag.retval = Qnil; \
_tag.frame = ruby_frame; \ _tag.frame = ruby_frame; \
@ -796,11 +795,11 @@ static struct tag *prot_tag;
if (_tag.prev) \ if (_tag.prev) \
_tag.prev->retval = _tag.retval;\ _tag.prev->retval = _tag.retval;\
prot_tag = _tag.prev; \ prot_tag = _tag.prev; \
} } while (0)
#define POP_TMPTAG() \ #define POP_TMPTAG() \
prot_tag = _tag.prev; \ prot_tag = _tag.prev; \
} } while (0)
#define TAG_RETURN 0x1 #define TAG_RETURN 0x1
#define TAG_BREAK 0x2 #define TAG_BREAK 0x2
@ -815,18 +814,18 @@ static struct tag *prot_tag;
VALUE ruby_class; VALUE ruby_class;
static VALUE ruby_wrapper; /* security wrapper */ static VALUE ruby_wrapper; /* security wrapper */
#define PUSH_CLASS() { \ #define PUSH_CLASS() do { \
VALUE _class = ruby_class VALUE _class = ruby_class
#define POP_CLASS() ruby_class = _class; \ #define POP_CLASS() ruby_class = _class; \
} } while (0)
static NODE *ruby_cref = 0; static NODE *ruby_cref = 0;
static NODE *top_cref; static NODE *top_cref;
#define PUSH_CREF(c) ruby_cref = rb_node_newnode(NODE_CREF,(c),0,ruby_cref) #define PUSH_CREF(c) ruby_cref = rb_node_newnode(NODE_CREF,(c),0,ruby_cref)
#define POP_CREF() ruby_cref = ruby_cref->nd_next #define POP_CREF() ruby_cref = ruby_cref->nd_next
#define PUSH_SCOPE() { \ #define PUSH_SCOPE() do { \
volatile int _vmode = scope_vmode; \ volatile int _vmode = scope_vmode; \
struct SCOPE * volatile _old; \ struct SCOPE * volatile _old; \
NEWOBJ(_scope, struct SCOPE); \ NEWOBJ(_scope, struct SCOPE); \
@ -858,7 +857,7 @@ static void scope_dup _((struct SCOPE *));
ruby_scope->flags |= SCOPE_NOSTACK; \ ruby_scope->flags |= SCOPE_NOSTACK; \
ruby_scope = _old; \ ruby_scope = _old; \
scope_vmode = _vmode; \ scope_vmode = _vmode; \
} } while (0)
static VALUE rb_eval _((VALUE,NODE*)); static VALUE rb_eval _((VALUE,NODE*));
static VALUE eval _((VALUE,VALUE,VALUE,char*,int)); static VALUE eval _((VALUE,VALUE,VALUE,char*,int));
@ -1756,7 +1755,7 @@ copy_node_scope(node, rval)
}\ }\
} while (0) } while (0)
#define BEGIN_CALLARGS {\ #define BEGIN_CALLARGS do {\
struct BLOCK *tmp_block = ruby_block;\ struct BLOCK *tmp_block = ruby_block;\
if (ruby_iter->iter == ITER_PRE) {\ if (ruby_iter->iter == ITER_PRE) {\
ruby_block = ruby_block->prev;\ ruby_block = ruby_block->prev;\
@ -1766,7 +1765,7 @@ copy_node_scope(node, rval)
#define END_CALLARGS \ #define END_CALLARGS \
ruby_block = tmp_block;\ ruby_block = tmp_block;\
POP_ITER();\ POP_ITER();\
} } while (0)
#define MATCH_DATA *rb_svar(node->nd_cnt) #define MATCH_DATA *rb_svar(node->nd_cnt)
@ -2152,7 +2151,10 @@ rb_eval(self, n)
int state; int state;
volatile VALUE result = Qnil; volatile VALUE result = Qnil;
#define RETURN(v) { result = (v); goto finish; } #define RETURN(v) do { \
result = (v); \
goto finish; \
} while (0)
again: again:
if (!node) RETURN(Qnil); if (!node) RETURN(Qnil);
@ -4929,7 +4931,7 @@ eval(self, src, scope, file, line)
char *file; char *file;
int line; int line;
{ {
struct BLOCK *data; struct BLOCK *data = NULL;
volatile VALUE result = Qnil; volatile VALUE result = Qnil;
struct SCOPE * volatile old_scope; struct SCOPE * volatile old_scope;
struct BLOCK * volatile old_block; struct BLOCK * volatile old_block;
@ -5472,7 +5474,6 @@ rb_f_require(obj, fname)
{ {
VALUE feature, tmp; VALUE feature, tmp;
char *ext, *ftptr; /* OK */ char *ext, *ftptr; /* OK */
volatile VALUE load;
int state; int state;
volatile int safe = ruby_safe_level; volatile int safe = ruby_safe_level;
@ -6019,7 +6020,6 @@ Init_eval()
aref = rb_intern("[]"); aref = rb_intern("[]");
aset = rb_intern("[]="); aset = rb_intern("[]=");
match = rb_intern("=~"); match = rb_intern("=~");
to_ary = rb_intern("to_ary");
missing = rb_intern("method_missing"); missing = rb_intern("method_missing");
added = rb_intern("method_added"); added = rb_intern("method_added");
singleton_added = rb_intern("singleton_method_added"); singleton_added = rb_intern("singleton_method_added");
@ -6590,6 +6590,7 @@ block_pass(self, node)
NODE *node; NODE *node;
{ {
VALUE block = rb_eval(self, node->nd_body); /* OK */ VALUE block = rb_eval(self, node->nd_body); /* OK */
VALUE b;
struct BLOCK * volatile old_block; struct BLOCK * volatile old_block;
struct BLOCK _block; struct BLOCK _block;
struct BLOCK *data; struct BLOCK *data;
@ -6604,13 +6605,12 @@ block_pass(self, node)
POP_ITER(); POP_ITER();
return result; return result;
} }
if (rb_obj_is_kind_of(block, rb_cMethod)) { b = rb_check_convert_type(block, T_DATA, "Proc", "to_proc");
block = method_proc(block); if (!rb_obj_is_proc(b)) {
}
else if (!rb_obj_is_proc(block)) {
rb_raise(rb_eTypeError, "wrong argument type %s (expected Proc)", rb_raise(rb_eTypeError, "wrong argument type %s (expected Proc)",
rb_class2name(CLASS_OF(block))); rb_class2name(CLASS_OF(block)));
} }
block = b;
if (rb_safe_level() >= 1 && OBJ_TAINTED(block)) { if (rb_safe_level() >= 1 && OBJ_TAINTED(block)) {
if (rb_safe_level() > proc_get_safe_level(block)) { if (rb_safe_level() > proc_get_safe_level(block)) {
@ -8697,8 +8697,10 @@ rb_thread_cleanup()
rb_thread_ready(th); rb_thread_ready(th);
th->gid = 0; th->gid = 0;
th->priority = 0; th->priority = 0;
th->status = THREAD_TO_KILL; if (th != main_thread) {
RDATA(th->thread)->dfree = NULL; th->status = THREAD_TO_KILL;
RDATA(th->thread)->dfree = NULL;
}
} }
} }
END_FOREACH(th); END_FOREACH(th);

9
file.c
View File

@ -1587,7 +1587,7 @@ rb_file_s_basename(argc, argv)
VALUE *argv; VALUE *argv;
{ {
VALUE fname, fext, basename; VALUE fname, fext, basename;
char *name, *p, *ext; char *name, *p, *ext = NULL;
int f; int f;
if (rb_scan_args(argc, argv, "11", &fname, &fext) == 2) { if (rb_scan_args(argc, argv, "11", &fname, &fext) == 2) {
@ -1998,7 +1998,7 @@ static VALUE
rb_stat_clone(obj) rb_stat_clone(obj)
VALUE obj; VALUE obj;
{ {
struct stat st, *nst; struct stat *nst;
VALUE clone; VALUE clone;
@ -2403,7 +2403,7 @@ rb_find_file_ext(filep, ext)
VALUE *filep; VALUE *filep;
const char * const *ext; const char * const *ext;
{ {
char *path, *e, *found; char *path, *found;
char *f = RSTRING(*filep)->ptr; char *f = RSTRING(*filep)->ptr;
VALUE fname; VALUE fname;
int i, j; int i, j;
@ -2454,10 +2454,9 @@ VALUE
rb_find_file(path) rb_find_file(path)
VALUE path; VALUE path;
{ {
VALUE tmp, fname; VALUE tmp;
char *f = RSTRING(path)->ptr; char *f = RSTRING(path)->ptr;
char *lpath; char *lpath;
struct stat st;
if (f[0] == '~') { if (f[0] == '~') {
path = rb_file_s_expand_path(1, &path); path = rb_file_s_expand_path(1, &path);

40
gc.c
View File

@ -66,22 +66,19 @@ static void run_final();
#endif #endif
static unsigned long malloc_memories = 0; static unsigned long malloc_memories = 0;
static VALUE nomem_error;
static void void
mem_error(mesg) rb_memerror()
char *mesg;
{ {
static int recurse = 0; static int recurse = 0;
if (rb_safe_level() >= 4) { if (recurse > 0 && rb_safe_level() < 4) {
rb_raise(rb_eNoMemError, mesg); fprintf(stderr, "[FATAL] failed to allocate memory\n");
exit(1);
} }
if (recurse == 0) { recurse++;
recurse++; rb_exc_raise(nomem_error);
rb_fatal(mesg);
}
fprintf(stderr, "[FATAL] failed to allocate memory\n");
exit(1);
} }
void * void *
@ -104,10 +101,7 @@ ruby_xmalloc(size)
rb_gc(); rb_gc();
RUBY_CRITICAL(mem = malloc(size)); RUBY_CRITICAL(mem = malloc(size));
if (!mem) { if (!mem) {
if (size >= 10 * 1024 * 1024) { rb_memerror();
mem_error("tried to allocate too big memory");
}
mem_error("failed to allocate memory");
} }
} }
@ -144,10 +138,7 @@ ruby_xrealloc(ptr, size)
rb_gc(); rb_gc();
RUBY_CRITICAL(mem = realloc(ptr, size)); RUBY_CRITICAL(mem = realloc(ptr, size));
if (!mem) { if (!mem) {
if (size >= 10 * 1024 * 1024) { rb_memerror();
rb_raise(rb_eNoMemError, "tried to re-allocate too big memory");
}
mem_error("failed to allocate memory(realloc)");
} }
} }
@ -287,11 +278,11 @@ add_heap()
RUBY_CRITICAL(heaps = (heaps_used>0)? RUBY_CRITICAL(heaps = (heaps_used>0)?
(RVALUE**)realloc(heaps, heaps_length*sizeof(RVALUE*)): (RVALUE**)realloc(heaps, heaps_length*sizeof(RVALUE*)):
(RVALUE**)malloc(heaps_length*sizeof(RVALUE*))); (RVALUE**)malloc(heaps_length*sizeof(RVALUE*)));
if (heaps == 0) mem_error("heaps: can't alloc memory"); if (heaps == 0) rb_memerror();
RUBY_CRITICAL(heaps_limits = (heaps_used>0)? RUBY_CRITICAL(heaps_limits = (heaps_used>0)?
(int*)realloc(heaps_limits, heaps_length*sizeof(int)): (int*)realloc(heaps_limits, heaps_length*sizeof(int)):
(int*)malloc(heaps_length*sizeof(int))); (int*)malloc(heaps_length*sizeof(int)));
if (heaps_limits == 0) mem_error("heaps_limits: can't alloc memory"); if (heaps_limits == 0) rb_memerror();
} }
for (;;) { for (;;) {
@ -299,7 +290,7 @@ add_heap()
heaps_limits[heaps_used] = heap_slots; heaps_limits[heaps_used] = heap_slots;
if (p == 0) { if (p == 0) {
if (heap_slots == HEAP_MIN_SLOTS) { if (heap_slots == HEAP_MIN_SLOTS) {
mem_error("add_heap: can't alloc memory"); rb_memerror();
} }
heap_slots = HEAP_MIN_SLOTS; heap_slots = HEAP_MIN_SLOTS;
continue; continue;
@ -396,8 +387,6 @@ int
ruby_stack_length(p) ruby_stack_length(p)
VALUE **p; VALUE **p;
{ {
int ret;
SET_STACK_END; SET_STACK_END;
if (p) *p = STACK_END; if (p) *p = STACK_END;
return STACK_LENGTH; return STACK_LENGTH;
@ -1558,4 +1547,7 @@ Init_GC()
finalizers = rb_ary_new(); finalizers = rb_ary_new();
source_filenames = st_init_strtable(); source_filenames = st_init_strtable();
nomem_error = rb_exc_new(rb_eNoMemError, "failed to allocate memory");
rb_global_variable(&nomem_error);
} }

View File

@ -202,6 +202,7 @@ void rb_file_const _((const char*, VALUE));
int rb_find_file_ext _((VALUE*, const char* const*)); int rb_find_file_ext _((VALUE*, const char* const*));
VALUE rb_find_file _((VALUE)); VALUE rb_find_file _((VALUE));
/* gc.c */ /* gc.c */
NORETURN(void rb_memerror __((void)));
int ruby_stack_check _((void)); int ruby_stack_check _((void));
int ruby_stack_length _((VALUE**)); int ruby_stack_length _((VALUE**));
char *rb_source_filename _((const char*)); char *rb_source_filename _((const char*));
@ -254,7 +255,6 @@ VALUE rb_num_coerce_bin _((VALUE, VALUE));
VALUE rb_float_new _((double)); VALUE rb_float_new _((double));
VALUE rb_num2fix _((VALUE)); VALUE rb_num2fix _((VALUE));
VALUE rb_fix2str _((VALUE, int)); VALUE rb_fix2str _((VALUE, int));
VALUE rb_fix_upto _((VALUE, VALUE));
/* object.c */ /* object.c */
int rb_eql _((VALUE, VALUE)); int rb_eql _((VALUE, VALUE));
VALUE rb_any_to_s _((VALUE)); VALUE rb_any_to_s _((VALUE));

61
io.c
View File

@ -265,7 +265,7 @@ io_write(io, str)
{ {
OpenFile *fptr; OpenFile *fptr;
FILE *f; FILE *f;
int n; long n;
rb_secure(4); rb_secure(4);
if (TYPE(str) != T_STRING) if (TYPE(str) != T_STRING)
@ -284,7 +284,7 @@ io_write(io, str)
#ifdef __human68k__ #ifdef __human68k__
{ {
register char *ptr = RSTRING(str)->ptr; register char *ptr = RSTRING(str)->ptr;
n = (int)RSTRING(str)->len; n = RSTRING(str)->len;
while (--n >= 0) while (--n >= 0)
if (fputc(*ptr++, f) == EOF) if (fputc(*ptr++, f) == EOF)
break; break;
@ -305,7 +305,7 @@ io_write(io, str)
fptr->mode |= FMODE_WBUF; fptr->mode |= FMODE_WBUF;
} }
return INT2FIX(n); return LONG2FIX(n);
} }
VALUE VALUE
@ -613,8 +613,7 @@ remain_size(fptr)
{ {
struct stat st; struct stat st;
off_t siz = BUFSIZ; off_t siz = BUFSIZ;
long bytes = 0; off_t pos;
int n;
if (feof(fptr->f)) return 0; if (feof(fptr->f)) return 0;
if (fstat(fileno(fptr->f), &st) == 0 && S_ISREG(st.st_mode) if (fstat(fileno(fptr->f), &st) == 0 && S_ISREG(st.st_mode)
@ -623,8 +622,6 @@ remain_size(fptr)
#endif #endif
) )
{ {
off_t pos;
pos = ftello(fptr->f); pos = ftello(fptr->f);
if (st.st_size > pos && pos >= 0) { if (st.st_size > pos && pos >= 0) {
siz = st.st_size - pos + 1; siz = st.st_size - pos + 1;
@ -643,14 +640,14 @@ read_all(fptr, siz)
{ {
VALUE str; VALUE str;
long bytes = 0; long bytes = 0;
int n; long n;
if (feof(fptr->f)) return Qnil; if (feof(fptr->f)) return Qnil;
READ_CHECK(fptr->f); READ_CHECK(fptr->f);
if (!siz) siz = BUFSIZ; if (!siz) siz = BUFSIZ;
str = rb_tainted_str_new(0, siz); str = rb_tainted_str_new(0, siz);
for (;;) { for (;;) {
n = io_fread(RSTRING(str)->ptr+bytes, (long)siz-bytes, fptr->f); n = io_fread(RSTRING(str)->ptr+bytes, siz-bytes, fptr->f);
if (n == 0 && bytes == 0) { if (n == 0 && bytes == 0) {
if (feof(fptr->f)) return Qnil; if (feof(fptr->f)) return Qnil;
rb_sys_fail(fptr->path); rb_sys_fail(fptr->path);
@ -1003,7 +1000,7 @@ rb_io_readlines(argc, argv, io)
VALUE io; VALUE io;
{ {
VALUE line, ary; VALUE line, ary;
VALUE rs, str; VALUE rs;
OpenFile *fptr; OpenFile *fptr;
if (argc == 0) { if (argc == 0) {
@ -1452,17 +1449,19 @@ rb_io_mode_flags(mode)
rb_raise(rb_eArgError, "illegal access mode %s", mode); rb_raise(rb_eArgError, "illegal access mode %s", mode);
} }
if (*m == 'b') { while (*m) {
flags |= FMODE_BINMODE; switch (*m++) {
m++; case 'b':
flags |= FMODE_BINMODE;
break;
case '+':
flags |= FMODE_READWRITE;
break;
default:
goto error;
}
} }
if (*m == '+') {
flags |= FMODE_READWRITE;
if (m[1] != 0) goto error;
}
else if (*m != 0) goto error;
return flags; return flags;
} }
@ -1470,7 +1469,7 @@ static int
rb_io_modenum_flags(mode) rb_io_modenum_flags(mode)
int mode; int mode;
{ {
int flags; int flags = 0;
switch (mode & (O_RDONLY|O_WRONLY|O_RDWR)) { switch (mode & (O_RDONLY|O_WRONLY|O_RDWR)) {
case O_RDONLY: case O_RDONLY:
@ -1515,19 +1514,21 @@ rb_io_mode_modenum(mode)
rb_raise(rb_eArgError, "illegal access mode %s", mode); rb_raise(rb_eArgError, "illegal access mode %s", mode);
} }
if (*m == 'b') { while (*m) {
switch (*m++) {
case 'b':
#ifdef O_BINARY #ifdef O_BINARY
flags |= O_BINARY; flags |= O_BINARY;
#endif #endif
m++; break;
case '+':
flags |= O_RDWR;
break;
default:
goto error;
}
} }
if (*m == '+') {
flags |= O_RDWR;
if (m[1] != 0) goto error;
}
else if (*m != 0) goto error;
return flags; return flags;
} }
@ -3554,8 +3555,6 @@ argf_readchar()
static VALUE static VALUE
argf_eof() argf_eof()
{ {
int first = first_p;
if (!next_argv()) return Qtrue; if (!next_argv()) return Qtrue;
if (next_p == 1) { if (next_p == 1) {
return Qtrue; return Qtrue;

View File

@ -185,7 +185,7 @@ def install_files(mfile, ifiles, map = INSTALL_DIRS, srcprefix = nil)
path = Hash.new {|h, i| h[i] = dirs.push([i])[-1]} path = Hash.new {|h, i| h[i] = dirs.push([i])[-1]}
ifiles.each do |files, dir, prefix| ifiles.each do |files, dir, prefix|
dir = map.inject(dir) {|dir, (orig, new)| dir.gsub(orig, new)} if map dir = map.inject(dir) {|dir, (orig, new)| dir.gsub(orig, new)} if map
prefix = %r"\A#{Regexp.quote(prefix)}/" if prefix prefix = %r"\A#{Regexp.quote(prefix)}/?" if prefix
if( files[0,2] == "./" ) if( files[0,2] == "./" )
# install files which are in current working directory. # install files which are in current working directory.
Dir.glob(files) do |f| Dir.glob(files) do |f|

View File

@ -55,6 +55,7 @@ shortlen(len, ds)
#define TYPE_UCLASS 'C' #define TYPE_UCLASS 'C'
#define TYPE_OBJECT 'o' #define TYPE_OBJECT 'o'
#define TYPE_DATA 'd'
#define TYPE_USERDEF 'u' #define TYPE_USERDEF 'u'
#define TYPE_USRMARHAL 'U' #define TYPE_USRMARHAL 'U'
#define TYPE_FLOAT 'f' #define TYPE_FLOAT 'f'
@ -76,6 +77,7 @@ shortlen(len, ds)
#define TYPE_LINK '@' #define TYPE_LINK '@'
static ID s_dump, s_load; static ID s_dump, s_load;
static ID s_dump_data, s_load_data, s_alloc;
struct dump_arg { struct dump_arg {
VALUE obj; VALUE obj;
@ -490,6 +492,34 @@ w_object(obj, arg, limit)
} }
break; break;
case T_DATA:
w_byte(TYPE_DATA, arg);
{
VALUE klass = CLASS_OF(obj);
char *path;
if (FL_TEST(klass, FL_SINGLETON)) {
if (RCLASS(klass)->m_tbl->num_entries > 0 ||
RCLASS(klass)->iv_tbl->num_entries > 1) {
rb_raise(rb_eTypeError, "singleton can't be dumped");
}
}
path = rb_class2name(klass);
w_unique(path, arg);
}
{
VALUE v;
if (!rb_respond_to(obj, s_dump_data)) {
rb_raise(rb_eTypeError,
"class %s needs to have instance method `_dump_data'",
rb_class2name(CLASS_OF(obj)));
}
v = rb_funcall(obj, s_dump_data, 0);
w_object(v, arg, limit);
}
break;
default: default:
rb_raise(rb_eTypeError, "can't dump %s", rb_raise(rb_eTypeError, "can't dump %s",
rb_class2name(CLASS_OF(obj))); rb_class2name(CLASS_OF(obj)));
@ -1010,6 +1040,30 @@ r_object(arg)
} }
break; break;
case TYPE_DATA:
{
VALUE klass;
klass = rb_path2class(r_unique(arg));
if (!rb_respond_to(klass, s_alloc)) {
rb_raise(rb_eTypeError,
"class %s needs to have class method `_alloc'",
rb_class2name(klass));
}
v = rb_funcall(klass, s_alloc, 0);
if (TYPE(v) != T_DATA) {
rb_raise(rb_eArgError, "dump format error");
}
r_regist(v, arg);
if (!rb_respond_to(v, s_load_data)) {
rb_raise(rb_eTypeError,
"class %s needs to have instance method `_load_data'",
rb_class2name(klass));
}
rb_funcall(v, s_load_data, 1, r_object(arg));
}
break;
case TYPE_MODULE_OLD: case TYPE_MODULE_OLD:
{ {
char *buf; char *buf;
@ -1134,6 +1188,9 @@ Init_marshal()
s_dump = rb_intern("_dump"); s_dump = rb_intern("_dump");
s_load = rb_intern("_load"); s_load = rb_intern("_load");
s_dump_data = rb_intern("_dump_data");
s_load_data = rb_intern("_load_data");
s_alloc = rb_intern("_alloc");
rb_define_module_function(rb_mMarshal, "dump", marshal_dump, -1); rb_define_module_function(rb_mMarshal, "dump", marshal_dump, -1);
rb_define_module_function(rb_mMarshal, "load", marshal_load, -1); rb_define_module_function(rb_mMarshal, "load", marshal_load, -1);
rb_define_module_function(rb_mMarshal, "restore", marshal_load, -1); rb_define_module_function(rb_mMarshal, "restore", marshal_load, -1);

217
numeric.c
View File

@ -153,7 +153,7 @@ num_remainder(x, y)
{ {
VALUE z = rb_funcall(x, '%', 1, y); VALUE z = rb_funcall(x, '%', 1, y);
if ((!RTEST(rb_equal(z, INT2FIX(0)))) && if ((!rb_equal(z, INT2FIX(0))) &&
((RTEST(rb_funcall(x, '<', 1, INT2FIX(0))) && ((RTEST(rb_funcall(x, '<', 1, INT2FIX(0))) &&
RTEST(rb_funcall(y, '>', 1, INT2FIX(0)))) || RTEST(rb_funcall(y, '>', 1, INT2FIX(0)))) ||
(RTEST(rb_funcall(x, '>', 1, INT2FIX(0))) && (RTEST(rb_funcall(x, '>', 1, INT2FIX(0))) &&
@ -184,7 +184,7 @@ static VALUE
num_zero_p(num) num_zero_p(num)
VALUE num; VALUE num;
{ {
if (RTEST(rb_equal(num, INT2FIX(0)))) { if (rb_equal(num, INT2FIX(0))) {
return Qtrue; return Qtrue;
} }
return Qfalse; return Qfalse;
@ -762,6 +762,59 @@ num_truncate(num)
return flo_truncate(rb_Float(num)); return flo_truncate(rb_Float(num));
} }
static VALUE
num_step(argc, argv, from)
int argc;
VALUE *argv;
VALUE from;
{
VALUE to, step;
VALUE i = from;
ID cmp;
if (rb_scan_args(argc, argv, "11", &to, &step) == 1) {
step = INT2FIX(1);
}
else if (rb_equal(step, INT2FIX(0))) {
rb_raise(rb_eArgError, "step cannot be 0");
}
if (FIXNUM_P(from) && FIXNUM_P(to) && FIXNUM_P(step)) {
long i, end, diff;
i = FIX2LONG(from);
end = FIX2LONG(to);
diff = FIX2LONG(step);
if (diff > 0) {
while (i <= end) {
rb_yield(INT2FIX(i));
i += diff;
}
}
else {
while (i >= end) {
rb_yield(INT2FIX(i));
i += diff;
}
}
return from;
}
if (RTEST(rb_funcall(step, '>', 1, INT2FIX(0)))) {
cmp = '>';
}
else {
cmp = '<';
}
for (;;) {
if (RTEST(rb_funcall(i, cmp, 1, to))) break;
rb_yield(i);
i = rb_funcall(i, '+', 1, step);
}
return from;
}
long long
rb_num2long(val) rb_num2long(val)
VALUE val; VALUE val;
@ -1452,12 +1505,22 @@ static VALUE
int_upto(from, to) int_upto(from, to)
VALUE from, to; VALUE from, to;
{ {
VALUE i = from; if (FIXNUM_P(from) && FIXNUM_P(to)) {
long i, end;
for (;;) { end = FIX2LONG(to);
if (RTEST(rb_funcall(i, '>', 1, to))) break; for (i = FIX2LONG(from); i <= end; i++) {
rb_yield(i); rb_yield(INT2FIX(i));
i = rb_funcall(i, '+', 1, INT2FIX(1)); }
}
else {
VALUE i = from;
for (;;) {
if (RTEST(rb_funcall(i, '>', 1, to))) break;
rb_yield(i);
i = rb_funcall(i, '+', 1, INT2FIX(1));
}
} }
return from; return from;
} }
@ -1466,37 +1529,22 @@ static VALUE
int_downto(from, to) int_downto(from, to)
VALUE from, to; VALUE from, to;
{ {
VALUE i = from; if (FIXNUM_P(from) && FIXNUM_P(to)) {
long i, end;
for (;;) { end = FIX2LONG(to);
if (RTEST(rb_funcall(i, '<', 1, to))) break; for (i=FIX2LONG(from); i >= end; i--) {
rb_yield(i); rb_yield(INT2FIX(i));
i = rb_funcall(i, '-', 1, INT2FIX(1)); }
}
return from;
}
static VALUE
int_step(from, to, step)
VALUE from, to, step;
{
VALUE i = from;
ID cmp;
if (rb_equal(step, INT2FIX(0))) {
rb_raise(rb_eArgError, "step cannot be 0");
}
if (RTEST(rb_funcall(step, '>', 1, INT2FIX(0)))) {
cmp = '>';
} }
else { else {
cmp = '<'; VALUE i = from;
}
for (;;) { for (;;) {
if (RTEST(rb_funcall(i, cmp, 1, to))) break; if (RTEST(rb_funcall(i, '<', 1, to))) break;
rb_yield(i); rb_yield(i);
i = rb_funcall(i, '+', 1, step); i = rb_funcall(i, '-', 1, INT2FIX(1));
}
} }
return from; return from;
} }
@ -1505,94 +1553,23 @@ static VALUE
int_dotimes(num) int_dotimes(num)
VALUE num; VALUE num;
{ {
VALUE i = INT2FIX(0); if (FIXNUM_P(num)) {
long i, end;
for (;;) { end = FIX2LONG(num);
if (!RTEST(rb_funcall(i, '<', 1, num))) break; for (i=0; i<end; i++) {
rb_yield(i);
i = rb_funcall(i, '+', 1, INT2FIX(1));
}
return num;
}
static VALUE
fix_upto(from, to)
VALUE from, to;
{
long i, end;
if (!FIXNUM_P(to)) return int_upto(from, to);
end = FIX2LONG(to);
for (i = FIX2LONG(from); i <= end; i++) {
rb_yield(INT2FIX(i));
}
return from;
}
VALUE
rb_fix_upto(from, to)
VALUE from, to;
{
return fix_upto(from, to);
}
static VALUE
fix_downto(from, to)
VALUE from, to;
{
long i, end;
if (!FIXNUM_P(to)) return int_downto(from, to);
end = FIX2LONG(to);
for (i=FIX2LONG(from); i >= end; i--) {
rb_yield(INT2FIX(i));
}
return from;
}
static VALUE
fix_step(from, to, step)
VALUE from, to, step;
{
long i, end, diff;
if (!FIXNUM_P(to) || !FIXNUM_P(step))
return int_step(from, to, step);
i = FIX2LONG(from);
end = FIX2LONG(to);
diff = FIX2LONG(step);
if (diff == 0) {
rb_raise(rb_eArgError, "step cannot be 0");
}
if (diff > 0) {
while (i <= end) {
rb_yield(INT2FIX(i)); rb_yield(INT2FIX(i));
i += diff;
} }
} }
else { else {
while (i >= end) { VALUE i = INT2FIX(0);
rb_yield(INT2FIX(i));
i += diff; for (;;) {
if (!RTEST(rb_funcall(i, '<', 1, num))) break;
rb_yield(i);
i = rb_funcall(i, '+', 1, INT2FIX(1));
} }
} }
return from;
}
static VALUE
fix_dotimes(num)
VALUE num;
{
long i, end;
end = FIX2LONG(num);
for (i=0; i<end; i++) {
rb_yield(INT2FIX(i));
}
return num; return num;
} }
@ -1643,6 +1620,7 @@ Init_Numeric()
rb_define_method(rb_cNumeric, "ceil", num_ceil, 0); rb_define_method(rb_cNumeric, "ceil", num_ceil, 0);
rb_define_method(rb_cNumeric, "round", num_round, 0); rb_define_method(rb_cNumeric, "round", num_round, 0);
rb_define_method(rb_cNumeric, "truncate", num_truncate, 0); rb_define_method(rb_cNumeric, "truncate", num_truncate, 0);
rb_define_method(rb_cNumeric, "step", num_step, -1);
rb_cInteger = rb_define_class("Integer", rb_cNumeric); rb_cInteger = rb_define_class("Integer", rb_cNumeric);
rb_undef_method(CLASS_OF(rb_cInteger), "allocate"); rb_undef_method(CLASS_OF(rb_cInteger), "allocate");
@ -1651,7 +1629,6 @@ Init_Numeric()
rb_define_method(rb_cInteger, "integer?", int_int_p, 0); rb_define_method(rb_cInteger, "integer?", int_int_p, 0);
rb_define_method(rb_cInteger, "upto", int_upto, 1); rb_define_method(rb_cInteger, "upto", int_upto, 1);
rb_define_method(rb_cInteger, "downto", int_downto, 1); rb_define_method(rb_cInteger, "downto", int_downto, 1);
rb_define_method(rb_cInteger, "step", int_step, 2);
rb_define_method(rb_cInteger, "times", int_dotimes, 0); rb_define_method(rb_cInteger, "times", int_dotimes, 0);
rb_include_module(rb_cInteger, rb_mPrecision); rb_include_module(rb_cInteger, rb_mPrecision);
rb_define_method(rb_cInteger, "succ", int_succ, 0); rb_define_method(rb_cInteger, "succ", int_succ, 0);
@ -1703,13 +1680,7 @@ Init_Numeric()
rb_define_method(rb_cFixnum, ">>", fix_rshift, 1); rb_define_method(rb_cFixnum, ">>", fix_rshift, 1);
rb_define_method(rb_cFixnum, "to_f", fix_to_f, 0); rb_define_method(rb_cFixnum, "to_f", fix_to_f, 0);
rb_define_method(rb_cFixnum, "size", fix_size, 0); rb_define_method(rb_cFixnum, "size", fix_size, 0);
rb_define_method(rb_cFixnum, "upto", fix_upto, 1);
rb_define_method(rb_cFixnum, "downto", fix_downto, 1);
rb_define_method(rb_cFixnum, "step", fix_step, 2);
rb_define_method(rb_cFixnum, "times", fix_dotimes, 0);
rb_define_method(rb_cFixnum, "zero?", fix_zero_p, 0); rb_define_method(rb_cFixnum, "zero?", fix_zero_p, 0);
rb_cFloat = rb_define_class("Float", rb_cNumeric); rb_cFloat = rb_define_class("Float", rb_cNumeric);

View File

@ -867,7 +867,7 @@ convert_type(val, tname, method, raise)
m = rb_intern(method); m = rb_intern(method);
if (!rb_respond_to(val, m)) { if (!rb_respond_to(val, m)) {
if (raise) { if (raise) {
rb_raise(rb_eTypeError, "failed to convert %s into %s", rb_raise(rb_eTypeError, "cannot convert %s into %s",
NIL_P(val) ? "nil" : NIL_P(val) ? "nil" :
val == Qtrue ? "true" : val == Qtrue ? "true" :
val == Qfalse ? "false" : val == Qfalse ? "false" :
@ -906,7 +906,8 @@ rb_check_convert_type(val, type, tname, method)
{ {
VALUE v; VALUE v;
if (TYPE(val) == type) return val; /* always convert T_DATA */
if (TYPE(val) == type && type != T_DATA) return val;
v = convert_type(val, tname, method, Qfalse); v = convert_type(val, tname, method, Qfalse);
if (NIL_P(v)) return Qnil; if (NIL_P(v)) return Qnil;
if (TYPE(v) != type) { if (TYPE(v) != type) {

84
parse.y
View File

@ -472,7 +472,7 @@ stmt : kALIAS fitem {lex_state = EXPR_FNAME;} fitem
} }
| primary_value '[' aref_args ']' tOP_ASGN command_call | primary_value '[' aref_args ']' tOP_ASGN command_call
{ {
NODE *tmp, *args = NEW_LIST($6); NODE *args = NEW_LIST($6);
$3 = list_append($3, NEW_NIL()); $3 = list_append($3, NEW_NIL());
list_concat(args, $3); list_concat(args, $3);
@ -836,7 +836,7 @@ arg : lhs '=' arg
} }
| primary_value '[' aref_args ']' tOP_ASGN arg | primary_value '[' aref_args ']' tOP_ASGN arg
{ {
NODE *tmp, *args = NEW_LIST($6); NODE *args = NEW_LIST($6);
$3 = list_append($3, NEW_NIL()); $3 = list_append($3, NEW_NIL());
list_concat(args, $3); list_concat(args, $3);
@ -5203,46 +5203,46 @@ static struct {
ID token; ID token;
char *name; char *name;
} op_tbl[] = { } op_tbl[] = {
tDOT2, "..", {tDOT2, ".."},
tDOT3, "...", {tDOT3, "..."},
'+', "+", {'+', "+"},
'-', "-", {'-', "-"},
'+', "+(binary)", {'+', "+(binary)"},
'-', "-(binary)", {'-', "-(binary)"},
'*', "*", {'*', "*"},
'/', "/", {'/', "/"},
'%', "%", {'%', "%"},
tPOW, "**", {tPOW, "**"},
tUPLUS, "+@", {tUPLUS, "+@"},
tUMINUS, "-@", {tUMINUS, "-@"},
tUPLUS, "+(unary)", {tUPLUS, "+(unary)"},
tUMINUS, "-(unary)", {tUMINUS, "-(unary)"},
'|', "|", {'|', "|"},
'^', "^", {'^', "^"},
'&', "&", {'&', "&"},
tCMP, "<=>", {tCMP, "<=>"},
'>', ">", {'>', ">"},
tGEQ, ">=", {tGEQ, ">="},
'<', "<", {'<', "<"},
tLEQ, "<=", {tLEQ, "<="},
tEQ, "==", {tEQ, "=="},
tEQQ, "===", {tEQQ, "==="},
tNEQ, "!=", {tNEQ, "!="},
tMATCH, "=~", {tMATCH, "=~"},
tNMATCH, "!~", {tNMATCH, "!~"},
'!', "!", {'!', "!"},
'~', "~", {'~', "~"},
'!', "!(unary)", {'!', "!(unary)"},
'~', "~(unary)", {'~', "~(unary)"},
'!', "!@", {'!', "!@"},
'~', "~@", {'~', "~@"},
tAREF, "[]", {tAREF, "[]"},
tASET, "[]=", {tASET, "[]="},
tLSHFT, "<<", {tLSHFT, "<<"},
tRSHFT, ">>", {tRSHFT, ">>"},
tCOLON2, "::", {tCOLON2, "::"},
'`', "`", {'`', "`"},
0, 0, {0, 0}
}; };
static st_table *sym_tbl; static st_table *sym_tbl;

View File

@ -109,8 +109,6 @@ static int
r_eq(a, b) r_eq(a, b)
VALUE a, b; VALUE a, b;
{ {
VALUE r;
if (a == b) return Qtrue; if (a == b) return Qtrue;
if (rb_funcall(a, id_cmp, 1, b) == INT2FIX(0)) if (rb_funcall(a, id_cmp, 1, b) == INT2FIX(0))

66
re.c
View File

@ -90,8 +90,6 @@ rb_memcmp(p1, p2, len)
char *p1, *p2; char *p1, *p2;
long len; long len;
{ {
int tmp;
if (!ruby_ignorecase) { if (!ruby_ignorecase) {
return memcmp(p1, p2, len); return memcmp(p1, p2, len);
} }
@ -230,7 +228,7 @@ rb_reg_expr_str(str, s, len)
need_escape = 1; need_escape = 1;
break; break;
} }
p++; p += mbclen(*p);
} }
if (!need_escape) { if (!need_escape) {
rb_str_buf_cat(str, s, len); rb_str_buf_cat(str, s, len);
@ -238,13 +236,7 @@ rb_reg_expr_str(str, s, len)
else { else {
p = s; p = s;
while (p<pend) { while (p<pend) {
if (*p == '\\') { if (*p == '/' && (s == p || p[-1] != '\\')) {
rb_str_buf_cat(str, p++, 1);
if (p<pend) {
rb_str_buf_cat(str, p, 1);
}
}
else if (*p == '/') {
char c = '\\'; char c = '\\';
rb_str_buf_cat(str, &c, 1); rb_str_buf_cat(str, &c, 1);
rb_str_buf_cat(str, p, 1); rb_str_buf_cat(str, p, 1);
@ -257,35 +249,14 @@ rb_reg_expr_str(str, s, len)
else if (ISPRINT(*p)) { else if (ISPRINT(*p)) {
rb_str_buf_cat(str, p, 1); rb_str_buf_cat(str, p, 1);
} }
else { else if (!ISSPACE(*p)) {
char b[8]; char b[8];
switch (*p) {
case '\r': sprintf(b, "\\%03o", *p & 0377);
rb_str_buf_cat(str, "\\r", 2); rb_str_buf_cat(str, b, 4);
break; }
case '\n': else {
rb_str_buf_cat(str, "\\n", 2); rb_str_buf_cat(str, p, 1);
break;
case '\t':
rb_str_buf_cat(str, "\\t", 2);
break;
case '\f':
rb_str_buf_cat(str, "\\f", 2);
break;
case 007:
rb_str_buf_cat(str, "\\a", 2);
break;
case 013:
rb_str_buf_cat(str, "\\v", 2);
break;
case 033:
rb_str_buf_cat(str, "\\e", 2);
break;
default:
sprintf(b, "\\%03o", *p & 0377);
rb_str_buf_cat(str, b, 4);
break;
}
} }
p++; p++;
} }
@ -367,10 +338,11 @@ rb_reg_to_s(re)
options = RREGEXP(re)->ptr->options; options = RREGEXP(re)->ptr->options;
ptr = RREGEXP(re)->str; ptr = RREGEXP(re)->str;
len = RREGEXP(re)->len; len = RREGEXP(re)->len;
if (len >= 4 && ptr[0] == '(' && ptr[1] == '?' && ptr[len-1] == ')') { again:
if (len >= 4 && ptr[0] == '(' && ptr[1] == '?') {
int err = 1; int err = 1;
ptr += 2; ptr += 2;
if ((len -= 3) > 0) { if ((len -= 2) > 0) {
do { do {
if (*ptr == 'm') { if (*ptr == 'm') {
options |= RE_OPTION_MULTILINE; options |= RE_OPTION_MULTILINE;
@ -402,11 +374,17 @@ rb_reg_to_s(re)
++ptr; ++ptr;
} while (--len > 0); } while (--len > 0);
} }
if (*ptr == ':') { if (*ptr == ')') {
Regexp *rp = ALLOC(Regexp); --len;
MEMZERO((char *)rp, Regexp, 1); ++ptr;
goto again;
}
if (*ptr == ':' && ptr[len-1] == ')') {
Regexp *rp;
kcode_set_option(re); kcode_set_option(re);
err = re_compile_pattern(++ptr, --len, rp) != 0; rp = ALLOC(Regexp);
MEMZERO((char *)rp, Regexp, 1);
err = re_compile_pattern(++ptr, len -= 2, rp) != 0;
kcode_reset_option(); kcode_reset_option();
re_free_pattern(rp); re_free_pattern(rp);
} }

10
regex.c
View File

@ -720,9 +720,9 @@ is_in_list(c, b)
else else
j = k; j = k;
} }
if (i < size && EXTRACT_MBC(&b[i*8]) <= c if (i < size && EXTRACT_MBC(&b[i*8]) <= c)
&& ((unsigned char)c != '\n' && (unsigned char)c != '\0'))
return 1; return 1;
return 0; return 0;
} }
@ -832,7 +832,7 @@ print_partial_compiled_pattern(start, end)
unsigned bit; unsigned bit;
unsigned char map_byte = p[c]; unsigned char map_byte = p[c];
putchar ('/'); putchar('/');
for (bit = 0; bit < BYTEWIDTH; bit++) for (bit = 0; bit < BYTEWIDTH; bit++)
if (map_byte & (1 << bit)) if (map_byte & (1 << bit))
@ -840,10 +840,10 @@ print_partial_compiled_pattern(start, end)
} }
p += mcnt; p += mcnt;
mcnt = EXTRACT_UNSIGNED_AND_INCR(p); mcnt = EXTRACT_UNSIGNED_AND_INCR(p);
printf("/"); putchar('/');
while (mcnt--) { while (mcnt--) {
print_mbc(EXTRACT_MBC_AND_INCR(p)); print_mbc(EXTRACT_MBC_AND_INCR(p));
printf("-"); putchar('-');
print_mbc(EXTRACT_MBC_AND_INCR(p)); print_mbc(EXTRACT_MBC_AND_INCR(p));
} }
break; break;

View File

@ -23,8 +23,8 @@
Last change: May 21, 1993 by t^2 */ Last change: May 21, 1993 by t^2 */
/* modified for Ruby by matz@netlab.co.jp */ /* modified for Ruby by matz@netlab.co.jp */
#ifndef __REGEXP_LIBRARY #ifndef REGEX_H
#define __REGEXP_LIBRARY #define REGEX_H
/* symbol mangling for ruby */ /* symbol mangling for ruby */
#ifdef RUBY #ifdef RUBY
@ -222,4 +222,4 @@ extern void re_free_registers ();
#endif /* __STDC__ */ #endif /* __STDC__ */
#endif /* !__REGEXP_LIBRARY */ #endif /* !REGEX_H */

15
ruby.h
View File

@ -66,7 +66,7 @@ extern "C" {
#endif #endif
#if SIZEOF_LONG != SIZEOF_VOIDP #if SIZEOF_LONG != SIZEOF_VOIDP
---->> ruby requires sizeof(void*) == sizeof(long) to be compiled. <<---- # error ---->> ruby requires sizeof(void*) == sizeof(long) to be compiled. <<----
#endif #endif
typedef unsigned long VALUE; typedef unsigned long VALUE;
typedef unsigned long ID; typedef unsigned long ID;
@ -271,11 +271,11 @@ char *rb_str2cstr _((VALUE,int*));
VALUE rb_newobj _((void)); VALUE rb_newobj _((void));
#define NEWOBJ(obj,type) type *obj = (type*)rb_newobj() #define NEWOBJ(obj,type) type *obj = (type*)rb_newobj()
#define OBJSETUP(obj,c,t) {\ #define OBJSETUP(obj,c,t) do {\
RBASIC(obj)->flags = (t);\ RBASIC(obj)->flags = (t);\
RBASIC(obj)->klass = (c);\ RBASIC(obj)->klass = (c);\
if (rb_safe_level() >= 3) FL_SET(obj, FL_TAINT);\ if (rb_safe_level() >= 3) FL_SET(obj, FL_TAINT);\
} } while (0)
#define CLONESETUP(clone,obj) do {\ #define CLONESETUP(clone,obj) do {\
OBJSETUP(clone,rb_singleton_class_clone(RBASIC(obj)->klass),RBASIC(obj)->flags);\ OBJSETUP(clone,rb_singleton_class_clone(RBASIC(obj)->klass),RBASIC(obj)->flags);\
rb_singleton_class_attached(RBASIC(clone)->klass, (VALUE)clone);\ rb_singleton_class_attached(RBASIC(clone)->klass, (VALUE)clone);\
@ -365,9 +365,8 @@ typedef void (*RUBY_DATA_FUNC) _((void*));
VALUE rb_data_object_alloc _((VALUE,void*,RUBY_DATA_FUNC,RUBY_DATA_FUNC)); VALUE rb_data_object_alloc _((VALUE,void*,RUBY_DATA_FUNC,RUBY_DATA_FUNC));
#define Data_Wrap_Struct(klass,mark,free,sval) (\ #define Data_Wrap_Struct(klass,mark,free,sval)\
rb_data_object_alloc(klass,sval,(RUBY_DATA_FUNC)mark,(RUBY_DATA_FUNC)free)\ rb_data_object_alloc(klass,sval,(RUBY_DATA_FUNC)mark,(RUBY_DATA_FUNC)free)
)
#define Data_Make_Struct(klass,type,mark,free,sval) (\ #define Data_Make_Struct(klass,type,mark,free,sval) (\
sval = ALLOC(type),\ sval = ALLOC(type),\
@ -375,10 +374,10 @@ VALUE rb_data_object_alloc _((VALUE,void*,RUBY_DATA_FUNC,RUBY_DATA_FUNC));
Data_Wrap_Struct(klass,mark,free,sval)\ Data_Wrap_Struct(klass,mark,free,sval)\
) )
#define Data_Get_Struct(obj,type,sval) {\ #define Data_Get_Struct(obj,type,sval) do {\
Check_Type(obj, T_DATA); \ Check_Type(obj, T_DATA); \
sval = (type*)DATA_PTR(obj);\ sval = (type*)DATA_PTR(obj);\
} } while (0)
struct RStruct { struct RStruct {
struct RBasic basic; struct RBasic basic;

View File

@ -23,8 +23,9 @@ typedef LONG rb_atomic_t;
/* Windows doesn't allow interrupt while system calls */ /* Windows doesn't allow interrupt while system calls */
# define TRAP_BEG do {\ # define TRAP_BEG do {\
rb_atomic_t trap_immediate = ATOMIC_SET(rb_trap_immediate, 1); rb_atomic_t trap_immediate = ATOMIC_SET(rb_trap_immediate, 1)
# define TRAP_END ATOMIC_SET(rb_trap_immediate, trap_immediate);\ # define TRAP_END\
ATOMIC_SET(rb_trap_immediate, trap_immediate);\
} while (0) } while (0)
# define RUBY_CRITICAL(statements) do {\ # define RUBY_CRITICAL(statements) do {\
win32_enter_critical();\ win32_enter_critical();\
@ -41,7 +42,7 @@ typedef int rb_atomic_t;
# define TRAP_BEG do {\ # define TRAP_BEG do {\
int trap_immediate = rb_trap_immediate;\ int trap_immediate = rb_trap_immediate;\
rb_trap_immediate = 1; rb_trap_immediate = 1
# define TRAP_END rb_trap_immediate = trap_immediate;\ # define TRAP_END rb_trap_immediate = trap_immediate;\
} while (0) } while (0)
@ -55,9 +56,12 @@ typedef int rb_atomic_t;
EXTERN rb_atomic_t rb_trap_immediate; EXTERN rb_atomic_t rb_trap_immediate;
EXTERN int rb_prohibit_interrupt; EXTERN int rb_prohibit_interrupt;
#define DEFER_INTS {rb_prohibit_interrupt++;} #define DEFER_INTS (rb_prohibit_interrupt++)
#define ALLOW_INTS {rb_prohibit_interrupt--; CHECK_INTS;} #define ALLOW_INTS do {\
#define ENABLE_INTS {rb_prohibit_interrupt--;} rb_prohibit_interrupt--;\
CHECK_INTS;\
} while (0)
#define ENABLE_INTS (rb_prohibit_interrupt--)
VALUE rb_with_disable_interrupt _((VALUE(*)(ANYARGS),VALUE)); VALUE rb_with_disable_interrupt _((VALUE(*)(ANYARGS),VALUE));
@ -68,23 +72,28 @@ EXTERN int rb_thread_critical;
void rb_thread_schedule _((void)); void rb_thread_schedule _((void));
#if defined(HAVE_SETITIMER) && !defined(__BOW__) #if defined(HAVE_SETITIMER) && !defined(__BOW__)
EXTERN int rb_thread_pending; EXTERN int rb_thread_pending;
# define CHECK_INTS if (!rb_prohibit_interrupt) {\ # define CHECK_INTS do {\
if (rb_trap_pending) rb_trap_exec();\ if (!rb_prohibit_interrupt) {\
if (rb_thread_pending && !rb_thread_critical) rb_thread_schedule();\ if (rb_trap_pending) rb_trap_exec();\
} if (rb_thread_pending && !rb_thread_critical)\
rb_thread_schedule();\
}\
} while (0)
#else #else
/* pseudo preemptive thread switching */ /* pseudo preemptive thread switching */
EXTERN int rb_thread_tick; EXTERN int rb_thread_tick;
#define THREAD_TICK 500 #define THREAD_TICK 500
#define CHECK_INTS if (!rb_prohibit_interrupt) {\ #define CHECK_INTS do {\
if (rb_trap_pending) rb_trap_exec();\ if (!rb_prohibit_interrupt) {\
if (!rb_thread_critical) {\ if (rb_trap_pending) rb_trap_exec();\
if (rb_thread_tick-- <= 0) {\ if (!rb_thread_critical) {\
rb_thread_tick = THREAD_TICK;\ if (rb_thread_tick-- <= 0) {\
rb_thread_schedule();\ rb_thread_tick = THREAD_TICK;\
rb_thread_schedule();\
}\
}\ }\
}\ }\
} } while (0)
#endif #endif
#endif #endif

View File

@ -34,139 +34,139 @@ static struct signals {
int signo; int signo;
} siglist [] = { } siglist [] = {
#ifdef SIGHUP #ifdef SIGHUP
"HUP", SIGHUP, {"HUP", SIGHUP},
#endif #endif
#ifdef SIGINT #ifdef SIGINT
"INT", SIGINT, {"INT", SIGINT},
#endif #endif
#ifdef SIGQUIT #ifdef SIGQUIT
"QUIT", SIGQUIT, {"QUIT", SIGQUIT},
#endif #endif
#ifdef SIGILL #ifdef SIGILL
"ILL", SIGILL, {"ILL", SIGILL},
#endif #endif
#ifdef SIGTRAP #ifdef SIGTRAP
"TRAP", SIGTRAP, {"TRAP", SIGTRAP},
#endif #endif
#ifdef SIGIOT #ifdef SIGIOT
"IOT", SIGIOT, {"IOT", SIGIOT},
#endif #endif
#ifdef SIGABRT #ifdef SIGABRT
"ABRT", SIGABRT, {"ABRT", SIGABRT},
#endif #endif
#ifdef SIGEMT #ifdef SIGEMT
"EMT", SIGEMT, {"EMT", SIGEMT},
#endif #endif
#ifdef SIGFPE #ifdef SIGFPE
"FPE", SIGFPE, {"FPE", SIGFPE},
#endif #endif
#ifdef SIGKILL #ifdef SIGKILL
"KILL", SIGKILL, {"KILL", SIGKILL},
#endif #endif
#ifdef SIGBUS #ifdef SIGBUS
"BUS", SIGBUS, {"BUS", SIGBUS},
#endif #endif
#ifdef SIGSEGV #ifdef SIGSEGV
"SEGV", SIGSEGV, {"SEGV", SIGSEGV},
#endif #endif
#ifdef SIGSYS #ifdef SIGSYS
"SYS", SIGSYS, {"SYS", SIGSYS},
#endif #endif
#ifdef SIGPIPE #ifdef SIGPIPE
"PIPE", SIGPIPE, {"PIPE", SIGPIPE},
#endif #endif
#ifdef SIGALRM #ifdef SIGALRM
"ALRM", SIGALRM, {"ALRM", SIGALRM},
#endif #endif
#ifdef SIGTERM #ifdef SIGTERM
"TERM", SIGTERM, {"TERM", SIGTERM},
#endif #endif
#ifdef SIGURG #ifdef SIGURG
"URG", SIGURG, {"URG", SIGURG},
#endif #endif
#ifdef SIGSTOP #ifdef SIGSTOP
"STOP", SIGSTOP, {"STOP", SIGSTOP},
#endif #endif
#ifdef SIGTSTP #ifdef SIGTSTP
"TSTP", SIGTSTP, {"TSTP", SIGTSTP},
#endif #endif
#ifdef SIGCONT #ifdef SIGCONT
"CONT", SIGCONT, {"CONT", SIGCONT},
#endif #endif
#ifdef SIGCHLD #ifdef SIGCHLD
"CHLD", SIGCHLD, {"CHLD", SIGCHLD},
#endif #endif
#ifdef SIGCLD #ifdef SIGCLD
"CLD", SIGCLD, {"CLD", SIGCLD},
#else #else
# ifdef SIGCHLD # ifdef SIGCHLD
"CLD", SIGCHLD, {"CLD", SIGCHLD},
# endif # endif
#endif #endif
#ifdef SIGTTIN #ifdef SIGTTIN
"TTIN", SIGTTIN, {"TTIN", SIGTTIN},
#endif #endif
#ifdef SIGTTOU #ifdef SIGTTOU
"TTOU", SIGTTOU, {"TTOU", SIGTTOU},
#endif #endif
#ifdef SIGIO #ifdef SIGIO
"IO", SIGIO, {"IO", SIGIO},
#endif #endif
#ifdef SIGXCPU #ifdef SIGXCPU
"XCPU", SIGXCPU, {"XCPU", SIGXCPU},
#endif #endif
#ifdef SIGXFSZ #ifdef SIGXFSZ
"XFSZ", SIGXFSZ, {"XFSZ", SIGXFSZ},
#endif #endif
#ifdef SIGVTALRM #ifdef SIGVTALRM
"VTALRM", SIGVTALRM, {"VTALRM", SIGVTALRM},
#endif #endif
#ifdef SIGPROF #ifdef SIGPROF
"PROF", SIGPROF, {"PROF", SIGPROF},
#endif #endif
#ifdef SIGWINCH #ifdef SIGWINCH
"WINCH", SIGWINCH, {"WINCH", SIGWINCH},
#endif #endif
#ifdef SIGUSR1 #ifdef SIGUSR1
"USR1", SIGUSR1, {"USR1", SIGUSR1},
#endif #endif
#ifdef SIGUSR2 #ifdef SIGUSR2
"USR2", SIGUSR2, {"USR2", SIGUSR2},
#endif #endif
#ifdef SIGLOST #ifdef SIGLOST
"LOST", SIGLOST, {"LOST", SIGLOST},
#endif #endif
#ifdef SIGMSG #ifdef SIGMSG
"MSG", SIGMSG, {"MSG", SIGMSG},
#endif #endif
#ifdef SIGPWR #ifdef SIGPWR
"PWR", SIGPWR, {"PWR", SIGPWR},
#endif #endif
#ifdef SIGPOLL #ifdef SIGPOLL
"POLL", SIGPOLL, {"POLL", SIGPOLL},
#endif #endif
#ifdef SIGDANGER #ifdef SIGDANGER
"DANGER", SIGDANGER, {"DANGER", SIGDANGER},
#endif #endif
#ifdef SIGMIGRATE #ifdef SIGMIGRATE
"MIGRATE", SIGMIGRATE, {"MIGRATE", SIGMIGRATE},
#endif #endif
#ifdef SIGPRE #ifdef SIGPRE
"PRE", SIGPRE, {"PRE", SIGPRE},
#endif #endif
#ifdef SIGGRANT #ifdef SIGGRANT
"GRANT", SIGGRANT, {"GRANT", SIGGRANT},
#endif #endif
#ifdef SIGRETRACT #ifdef SIGRETRACT
"RETRACT", SIGRETRACT, {"RETRACT", SIGRETRACT},
#endif #endif
#ifdef SIGSOUND #ifdef SIGSOUND
"SOUND", SIGSOUND, {"SOUND", SIGSOUND},
#endif #endif
#ifdef SIGINFO #ifdef SIGINFO
"INFO", SIGINFO, {"INFO", SIGINFO},
#endif #endif
NULL, 0, {NULL, 0}
}; };
static int static int
@ -481,7 +481,7 @@ trap(arg)
{ {
sighandler_t func; sighandler_t func;
VALUE command, old; VALUE command, old;
int sig; int sig = -1;
char *s; char *s;
func = sighandler; func = sighandler;

View File

@ -293,7 +293,6 @@ str_copy(str, clone)
int clone; int clone;
{ {
VALUE str2; VALUE str2;
VALUE klass;
int flags; int flags;
StringValue(str); StringValue(str);
@ -528,16 +527,18 @@ rb_str_resize(str, len)
VALUE str; VALUE str;
long len; long len;
{ {
if (len < 0) {
rb_raise(rb_eArgError, "negative string size (or size too big)");
}
if (len != RSTRING(str)->len) { if (len != RSTRING(str)->len) {
rb_str_modify(str); rb_str_modify(str);
if (len >= 0) { if (RSTRING(str)->len < len || RSTRING(str)->len - len > 1024) {
if (RSTRING(str)->len < len || RSTRING(str)->len - len > 1024) { RESIZE_CAPA(str, len);
RESIZE_CAPA(str, len);
}
RSTRING(str)->len = len;
RSTRING(str)->ptr[len] = '\0'; /* sentinel */
} }
RSTRING(str)->len = len;
RSTRING(str)->ptr[len] = '\0'; /* sentinel */
} }
return str; return str;
} }
@ -548,7 +549,7 @@ rb_str_buf_cat(str, ptr, len)
const char *ptr; const char *ptr;
long len; long len;
{ {
long i, capa, total; long capa, total;
if (FL_TEST(str, ELTS_SHARED)) { if (FL_TEST(str, ELTS_SHARED)) {
rb_str_modify(str); rb_str_modify(str);
@ -582,8 +583,6 @@ rb_str_cat(str, ptr, len)
const char *ptr; const char *ptr;
long len; long len;
{ {
long i, capa;
rb_str_modify(str); rb_str_modify(str);
if (len > 0) { if (len > 0) {
if (!FL_TEST(str, ELTS_SHARED) && !FL_TEST(str, STR_ASSOC)) { if (!FL_TEST(str, ELTS_SHARED) && !FL_TEST(str, STR_ASSOC)) {
@ -615,7 +614,7 @@ VALUE
rb_str_buf_append(str, str2) rb_str_buf_append(str, str2)
VALUE str, str2; VALUE str, str2;
{ {
long i, capa, len; long capa, len;
if (FL_TEST(str, ELTS_SHARED)) { if (FL_TEST(str, ELTS_SHARED)) {
rb_str_modify(str); rb_str_modify(str);
@ -641,7 +640,7 @@ VALUE
rb_str_append(str, str2) rb_str_append(str, str2)
VALUE str, str2; VALUE str, str2;
{ {
long i, capa, len; long len;
StringValue(str2); StringValue(str2);
rb_str_modify(str); rb_str_modify(str);

4
time.c
View File

@ -1153,9 +1153,11 @@ time_zone(time)
VALUE time; VALUE time;
{ {
struct time_object *tobj; struct time_object *tobj;
#if !defined(HAVE_TM_ZONE) && (!defined(HAVE_TZNAME) || !defined(HAVE_DAYLIGHT))
char buf[64]; char buf[64];
int len; int len;
#endif
GetTimeval(time, tobj); GetTimeval(time, tobj);
if (tobj->tm_got == 0) { if (tobj->tm_got == 0) {
time_get_tm(time, tobj->gmt); time_get_tm(time, tobj->gmt);

View File

@ -69,8 +69,6 @@ fc_i(key, value, res)
VALUE value; VALUE value;
struct fc_result *res; struct fc_result *res;
{ {
VALUE path;
if (!rb_is_const_id(key)) return ST_CONTINUE; if (!rb_is_const_id(key)) return ST_CONTINUE;
if (value == res->klass) { if (value == res->klass) {
@ -1150,8 +1148,7 @@ rb_const_get(klass, id)
rb_id2name(id), rb_id2name(id),
RSTRING(rb_class_path(klass))->ptr); RSTRING(rb_class_path(klass))->ptr);
} }
else { else { /* global_uninitialized */
global_uninitialized:
rb_name_error(id, "uninitialized constant %s",rb_id2name(id)); rb_name_error(id, "uninitialized constant %s",rb_id2name(id));
} }
return Qnil; /* not reached */ return Qnil; /* not reached */

View File

@ -1,4 +1,4 @@
#define RUBY_VERSION "1.7.2" #define RUBY_VERSION "1.7.2"
#define RUBY_RELEASE_DATE "2002-04-23" #define RUBY_RELEASE_DATE "2002-04-24"
#define RUBY_VERSION_CODE 172 #define RUBY_VERSION_CODE 172
#define RUBY_RELEASE_CODE 20020423 #define RUBY_RELEASE_CODE 20020424