* parse.y (parser_parse_string): mention "regexp" in a error

message.  a patch from Mauricio Fernandez <mfp at acm.org>
  [ruby-core:07340]

* eval.c (rb_f_autoload): check if ruby_cbase is nil (during
  instance_eval for objects cannot have singleton classes,
  e.g. fixnums and symbols).  [ruby-dev:28178]

* gc.c (rb_gc_call_finalizer_at_exit): turn on during_gc while
  invoking finalizers.

* gc.c (rb_gc_finalize_deferred): ditto.

* io.c (rb_write_error2): use fwrite(3) if rb_stderr is not
  updated or is already freed.  [ruby-dev:28313]

* eval.c (error_line): include the class name of a surrounding
  method in error position description.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9918 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
matz 2006-02-13 04:53:22 +00:00
Родитель c37c5419d2
Коммит 7f72360259
13 изменённых файлов: 475 добавлений и 581 удалений

Просмотреть файл

@ -1,3 +1,9 @@
Mon Feb 13 13:49:48 2006 Yukihiro Matsumoto <matz@ruby-lang.org>
* parse.y (parser_parse_string): mention "regexp" in a error
message. a patch from Mauricio Fernandez <mfp at acm.org>
[ruby-core:07340]
Mon Feb 13 00:01:32 2006 K.Kosako <sndgk393 AT ybb.ne.jp>
* oniguruma.h: Version 4.0.1
@ -18,16 +24,46 @@ Sat Feb 11 21:57:29 2006 Masaki Suketa <masaki.suketa@nifty.ne.jp>
* ext/win32ole/tests/testWIN32OLE.rb: ditto.
Sat Feb 11 01:57:44 2006 Yukihiro Matsumoto <matz@ruby-lang.org>
* eval.c (rb_f_autoload): check if ruby_cbase is nil (during
instance_eval for objects cannot have singleton classes,
e.g. fixnums and symbols). [ruby-dev:28178]
Fri Feb 10 12:31:05 2006 Yukihiro Matsumoto <matz@ruby-lang.org>
* eval.c (rb_eval): should support NODE_ZSUPER in NODE_ITER.
[ruby-dev:28326]
* eval.c (ZSUPER_ARGS): support macro.
Wed Feb 8 10:26:06 2006 Yukihiro Matsumoto <matz@ruby-lang.org>
* gc.c (rb_gc_call_finalizer_at_exit): turn on during_gc while
invoking finalizers.
* gc.c (rb_gc_finalize_deferred): ditto.
Tue Feb 7 23:03:13 2006 Hirokazu Yamamoto <ocean@m2.ccsnet.ne.jp>
* ext/zlib/zlib.c: should not access ruby objects in finalizer.
[ruby-dev:28286]
Tue Feb 7 18:42:00 2006 Yukihiro Matsumoto <matz@ruby-lang.org>
* io.c (rb_write_error2): use fwrite(3) if rb_stderr is not
updated or is already freed. [ruby-dev:28313]
Mon Feb 6 16:02:51 2006 WATANABE Hirofumi <eban@ruby-lang.org>
* file.c (rb_thread_flock): ERROR_NOT_LOCKED is not an error on Cygwin.
In such situation, flock() should return 0.
Mon Feb 6 14:36:29 2006 Yukihiro Matsumoto <matz@ruby-lang.org>
* eval.c (error_line): include the class name of a surrounding
method in error position description.
Mon Feb 6 00:14:57 2006 Yukihiro Matsumoto <matz@ruby-lang.org>
* enum.c (enum_find_index): a new method Enumerable#find_index.

13
error.c
Просмотреть файл

@ -961,7 +961,13 @@ Init_Exception(void)
rb_eIndexError = rb_define_class("IndexError", rb_eStandardError);
rb_eKeyError = rb_define_class("KeyError", rb_eIndexError);
rb_eRangeError = rb_define_class("RangeError", rb_eStandardError);
rb_eNameError = rb_define_class("NameError", rb_eException);
rb_eScriptError = rb_define_class("ScriptError", rb_eException);
rb_eSyntaxError = rb_define_class("SyntaxError", rb_eScriptError);
rb_eLoadError = rb_define_class("LoadError", rb_eScriptError);
rb_eNotImpError = rb_define_class("NotImplementedError", rb_eScriptError);
rb_eNameError = rb_define_class("NameError", rb_eScriptError);
rb_define_method(rb_eNameError, "initialize", name_err_initialize, -1);
rb_define_method(rb_eNameError, "name", name_err_name, 0);
rb_define_method(rb_eNameError, "to_s", name_err_to_s, 0);
@ -975,11 +981,6 @@ Init_Exception(void)
rb_define_method(rb_eNoMethodError, "initialize", nometh_err_initialize, -1);
rb_define_method(rb_eNoMethodError, "args", nometh_err_args, 0);
rb_eScriptError = rb_define_class("ScriptError", rb_eException);
rb_eSyntaxError = rb_define_class("SyntaxError", rb_eScriptError);
rb_eLoadError = rb_define_class("LoadError", rb_eScriptError);
rb_eNotImpError = rb_define_class("NotImplementedError", rb_eScriptError);
rb_eRuntimeError = rb_define_class("RuntimeError", rb_eStandardError);
rb_eSecurityError = rb_define_class("SecurityError", rb_eStandardError);
rb_eNoMemError = rb_define_class("NoMemoryError", rb_eException);

291
eval.c
Просмотреть файл

@ -248,14 +248,15 @@ static VALUE rb_mod_define_method(int, VALUE*, VALUE);
NORETURN(static void rb_raise_jump(VALUE));
static VALUE rb_make_exception(int argc, VALUE *argv);
static int scope_vmode;
#define SCOPE_PUBLIC 0
#define SCOPE_PRIVATE 1
#define SCOPE_PROTECTED 2
#define SCOPE_MODFUNC 5
#define SCOPE_MASK 7
#define SCOPE_SET(f) (scope_vmode=(f))
#define SCOPE_TEST(f) (scope_vmode&(f))
static int vis_mode;
#define VIS_PUBLIC 0
#define VIS_PRIVATE 1
#define VIS_PROTECTED 2
#define VIS_MODFUNC 5
#define VIS_MASK 7
#define VIS_SET(f) (vis_mode=(f))
#define VIS_TEST(f) (vis_mode&(f))
#define VIS_MODE(f) (vis_mode)
NODE* ruby_current_node;
int ruby_safe_level = 0;
@ -672,13 +673,13 @@ rb_attr(VALUE klass, ID id, int read, int write, int ex)
if (!ex) noex = NOEX_PUBLIC;
else {
if (SCOPE_TEST(SCOPE_PRIVATE)) {
if (VIS_TEST(VIS_PRIVATE)) {
noex = NOEX_PRIVATE;
rb_warning((scope_vmode == SCOPE_MODFUNC) ?
rb_warning((VIS_MODE() == VIS_MODFUNC) ?
"attribute accessor as module_function" :
"private attribute?");
}
else if (SCOPE_TEST(SCOPE_PROTECTED)) {
else if (VIS_TEST(VIS_PROTECTED)) {
noex = NOEX_PROTECTED;
}
else {
@ -729,6 +730,9 @@ static unsigned long frame_unique = 0;
_frame.block = (link)?ruby_frame->block:0;\
_frame.flags = 0; \
_frame.uniq = frame_unique++; \
_frame.callee = 0; \
_frame.this_func = 0; \
_frame.this_class = 0; \
ruby_frame = &_frame
#define POP_FRAME() \
@ -747,7 +751,7 @@ static unsigned long block_unique = 0;
_block.cref = ruby_cref; \
_block.frame.node = ruby_current_node;\
_block.scope = ruby_scope; \
_block.vmode = scope_vmode; \
_block.vmode = vis_mode; \
_block.flags = BLOCK_D_SCOPE; \
_block.dyna_vars = ruby_dyna_vars; \
_block.wrapper = ruby_wrapper; \
@ -776,6 +780,8 @@ struct RVarmap *ruby_dyna_vars;
#define DVAR_DONT_RECYCLE FL_USER2
#define DMETHOD_P() (ruby_frame->prev ? (ruby_frame->prev->flags & FRAME_DMETH) : 0)
static struct RVarmap*
new_dvar(ID id, VALUE value, struct RVarmap *prev)
{
@ -953,7 +959,7 @@ static NODE *top_cref;
#define POP_CREF() ruby_cref = ruby_cref->nd_next
#define PUSH_SCOPE() do { \
volatile int _vmode = scope_vmode; \
volatile int _vmode = vis_mode; \
struct SCOPE * volatile _old; \
NEWOBJ(_scope, struct SCOPE); \
OBJSETUP(_scope, 0, T_SCOPE); \
@ -962,7 +968,7 @@ static NODE *top_cref;
_scope->flags = 0; \
_old = ruby_scope; \
ruby_scope = _scope; \
scope_vmode = SCOPE_PUBLIC
vis_mode = VIS_PUBLIC
typedef struct thread * rb_thread_t;
static rb_thread_t curr_thread = 0;
@ -983,7 +989,7 @@ static void scope_dup(struct SCOPE *);
} \
ruby_scope->flags |= SCOPE_NOSTACK; \
ruby_scope = _old; \
scope_vmode = _vmode; \
vis_mode = _vmode; \
} while (0)
struct ruby_env {
@ -1083,25 +1089,58 @@ warn_printf(const char *fmt, ...)
rb_write_error(buf);
}
static VALUE
error_line(struct FRAME *frame, NODE *node)
{
char *file;
int line;
if (node) {
file = node->nd_file;
line = nd_line(node);
}
else {
file = ruby_sourcefile;
line = ruby_sourceline;
}
ruby_set_current_source();
if (ruby_sourcefile) {
if (frame->callee) {
if (frame->flags & FRAME_FUNC) {
return rb_sprintf("%s:%d:in `%s'", file, line,
rb_id2name(frame->this_func));
}
else {
VALUE oklass = frame->this_class;
if (TYPE(oklass) == T_ICLASS) {
oklass = RBASIC(oklass)->klass;
}
else if (FL_TEST(oklass, FL_SINGLETON)) {
oklass = rb_iv_get(oklass, "__attached__");
}
return rb_sprintf("%s:%d:in `%s#%s'", file, line,
rb_class2name(oklass),
rb_id2name(frame->this_func));
}
}
else if (!node && ruby_sourceline == 0) {
return rb_str_new2(ruby_sourcefile);
}
else {
return rb_sprintf("%s:%d", file, line);
}
}
}
#define warn_print(x) rb_write_error(x)
#define warn_print2(x,l) rb_write_error2(x,l)
static void
error_pos(void)
{
ruby_set_current_source();
if (ruby_sourcefile) {
if (ruby_frame->callee) {
warn_printf("%s:%d:in `%s'", ruby_sourcefile, ruby_sourceline,
rb_id2name(ruby_frame->callee));
}
else if (ruby_sourceline == 0) {
warn_printf("%s", ruby_sourcefile);
}
else {
warn_printf("%s:%d", ruby_sourcefile, ruby_sourceline);
}
}
VALUE pos = error_line(ruby_frame, 0);
warn_printf("%s", StringValueCStr(pos));
}
static VALUE
@ -1285,7 +1324,7 @@ ruby_init(void)
PUSH_SCOPE();
top_scope = ruby_scope;
/* default visibility is private at toplevel */
SCOPE_SET(SCOPE_PRIVATE);
VIS_SET(VIS_PRIVATE);
PUSH_TAG(PROT_NONE);
if ((state = EXEC_TAG()) == 0) {
@ -1495,7 +1534,7 @@ ruby_exec_internal(void)
PUSH_THREAD_TAG();
/* default visibility is private at toplevel */
SCOPE_SET(SCOPE_PRIVATE);
VIS_SET(VIS_PRIVATE);
if ((state = EXEC_TAG()) == 0) {
eval_node(ruby_top_self, ruby_eval_tree);
}
@ -1582,9 +1621,6 @@ rb_eval_string_wrap(const char *str, int *state)
ruby_top_self = rb_obj_clone(ruby_top_self);
rb_extend_object(ruby_top_self, ruby_wrapper);
PUSH_FRAME(Qfalse);
ruby_frame->callee = 0;
ruby_frame->this_func = 0;
ruby_frame->this_class = 0;
ruby_frame->self = self;
PUSH_CREF(ruby_wrapper = rb_module_new());
PUSH_SCOPE();
@ -1712,9 +1748,6 @@ rb_eval_cmd(VALUE cmd, VALUE arg, int level)
saved_scope = ruby_scope;
ruby_scope = top_scope;
PUSH_FRAME(Qfalse);
ruby_frame->callee = 0;
ruby_frame->this_func = 0;
ruby_frame->this_class = 0;
ruby_frame->self = ruby_top_self;
PUSH_CREF(ruby_wrapper ? ruby_wrapper : rb_cObject);
@ -1743,49 +1776,47 @@ ruby_current_class_object()
}
static VALUE
ev_const_defined(NODE *cref, ID id, VALUE self)
ev_const_defined(ID id, VALUE self)
{
NODE *cbase = cref;
NODE *cbase = ruby_cref;
VALUE result;
while (cbase && cbase->nd_next) {
struct RClass *klass = RCLASS(cbase->nd_clss);
if (!NIL_P(klass)) {
if (klass->iv_tbl && st_lookup(klass->iv_tbl, id, &result)) {
if (result == Qundef && NIL_P(rb_autoload_p((VALUE)klass, id))) {
return Qfalse;
}
return Qtrue;
if (NIL_P(klass)) return rb_const_defined(CLASS_OF(self), id);
if (klass->iv_tbl && st_lookup(klass->iv_tbl, id, &result)) {
if (result == Qundef && NIL_P(rb_autoload_p((VALUE)klass, id))) {
return Qfalse;
}
return Qtrue;
}
cbase = cbase->nd_next;
}
return rb_const_defined(cref->nd_clss, id);
return rb_const_defined(ruby_cbase, id);
}
static VALUE
ev_const_get(NODE *cref, ID id, VALUE self)
ev_const_get(ID id, VALUE self)
{
NODE *cbase = cref;
NODE *cbase = ruby_cref;
VALUE result;
while (cbase && cbase->nd_next) {
VALUE klass = cbase->nd_clss;
if (!NIL_P(klass)) {
while (RCLASS(klass)->iv_tbl &&
st_lookup(RCLASS(klass)->iv_tbl, id, &result)) {
if (result == Qundef) {
if (!RTEST(rb_autoload_load(klass, id))) break;
continue;
}
return result;
if (NIL_P(klass)) return rb_const_get(CLASS_OF(self), id);
while (RCLASS(klass)->iv_tbl &&
st_lookup(RCLASS(klass)->iv_tbl, id, &result)) {
if (result == Qundef) {
if (!RTEST(rb_autoload_load(klass, id))) break;
continue;
}
return result;
}
cbase = cbase->nd_next;
}
return rb_const_get(cref->nd_clss, id);
return rb_const_get(ruby_cbase, id);
}
static VALUE
@ -2071,7 +2102,8 @@ rb_mod_alias_method(VALUE mod, VALUE newname, VALUE oldname)
static NODE*
copy_node_scope(NODE *node, NODE *rval)
{
NODE *copy = NEW_NODE(NODE_SCOPE,0,rval,node->nd_next);
NODE *cref = NEW_NODE(NODE_CREF,rval->nd_clss,0,rval->nd_next);;
NODE *copy = NEW_NODE(NODE_SCOPE,0,cref,node->nd_next);
if (node->nd_tbl) {
copy->nd_tbl = ALLOC_N(ID, node->nd_tbl[0]+1);
@ -2128,6 +2160,21 @@ copy_node_scope(NODE *node, NODE *rval)
#define SETUP_ARGS(anode) SETUP_ARGS0(anode, anode->nd_alen)
#define ZSUPER_ARGS() do {\
argc = ruby_frame->argc;\
if (argc && DMETHOD_P()) {\
if (TYPE(RBASIC(ruby_scope)->klass) != T_ARRAY ||\
RARRAY(RBASIC(ruby_scope)->klass)->len != argc) {\
rb_raise(rb_eRuntimeError, \
"super: specify arguments explicitly");\
}\
argv = RARRAY(RBASIC(ruby_scope)->klass)->ptr;\
}\
else {\
argv = ruby_scope->local_vars + 2;\
}\
} while (0)
#define MATCH_DATA *rb_svar(node->nd_cnt)
static const char* is_defined(VALUE, NODE*, char*, int);
@ -2268,7 +2315,7 @@ is_defined(VALUE self, NODE *node /* OK */, char *buf, int noeval)
break;
case NODE_CONST:
if (ev_const_defined(ruby_cref, node->nd_vid, self)) {
if (ev_const_defined(node->nd_vid, self)) {
return "constant";
}
break;
@ -2949,6 +2996,8 @@ rb_eval(VALUE self, NODE *n)
case NODE_LAMBDA:
PUSH_TAG(PROT_LOOP);
PUSH_FRAME(Qtrue);
ruby_frame->this_func = 0;
ruby_frame->this_class = 0;
PUSH_BLOCK(ruby_frame->block, node->nd_var, node->nd_body);
state = EXEC_TAG();
result = proc_lambda();
@ -3283,6 +3332,7 @@ rb_eval(VALUE self, NODE *n)
case NODE_VCALL:
scope = CALLING_VCALL; break;
case NODE_SUPER:
case NODE_ZSUPER:
scope = CALLING_SUPER; break;
default:
/* error! */
@ -3297,8 +3347,13 @@ rb_eval(VALUE self, NODE *n)
if (scope == CALLING_NORMAL) {
recv = rb_eval(self, node->nd_recv);
}
SETUP_ARGS(node->nd_args);
ruby_current_node = node;
if (nd_type(node) == NODE_ZSUPER) {
ZSUPER_ARGS();
}
else {
SETUP_ARGS(node->nd_args);
ruby_current_node = node;
}
SET_CURRENT_SOURCE();
if (scope == CALLING_SUPER) {
result = call_super(argc, argv, block);
@ -3371,19 +3426,7 @@ rb_eval(VALUE self, NODE *n)
}
}
if (nd_type(node) == NODE_ZSUPER) {
argc = ruby_frame->argc;
if (argc && ruby_frame->prev &&
(ruby_frame->prev->flags & FRAME_DMETH)) {
if (TYPE(RBASIC(ruby_scope)->klass) != T_ARRAY ||
RARRAY(RBASIC(ruby_scope)->klass)->len != argc) {
rb_raise(rb_eRuntimeError,
"super: specify arguments explicitly");
}
argv = RARRAY(RBASIC(ruby_scope)->klass)->ptr;
}
else {
argv = ruby_scope->local_vars + 2;
}
ZSUPER_ARGS();
}
else {
SETUP_ARGS(node->nd_args);
@ -3579,7 +3622,7 @@ rb_eval(VALUE self, NODE *n)
break;
case NODE_CONST:
result = ev_const_get(ruby_cref, node->nd_vid, self);
result = ev_const_get(node->nd_vid, self);
break;
case NODE_CVAR:
@ -3779,7 +3822,7 @@ rb_eval(VALUE self, NODE *n)
int noex;
if (NIL_P(ruby_cbase)) {
rb_raise(rb_eTypeError, "no class/module to add method");
rb_raise(rb_eTypeError, "no class/module to define method");
}
if (ruby_cbase == rb_cObject && node->nd_mid == init) {
rb_warn("redefining Object#initialize may cause infinite loop");
@ -3796,10 +3839,10 @@ rb_eval(VALUE self, NODE *n)
}
}
if (SCOPE_TEST(SCOPE_PRIVATE) || node->nd_mid == init) {
if (VIS_TEST(VIS_PRIVATE) || node->nd_mid == init) {
noex = NOEX_PRIVATE;
}
else if (SCOPE_TEST(SCOPE_PROTECTED)) {
else if (VIS_TEST(VIS_PROTECTED)) {
noex = NOEX_PROTECTED;
}
else {
@ -3811,7 +3854,7 @@ rb_eval(VALUE self, NODE *n)
defn = copy_node_scope(node->nd_defn, ruby_cref);
rb_add_method(ruby_cbase, node->nd_mid, defn, noex);
if (scope_vmode == SCOPE_MODFUNC) {
if (VIS_MODE() == VIS_MODFUNC) {
rb_add_method(rb_singleton_class(ruby_cbase),
node->nd_mid, defn, NOEX_PUBLIC);
}
@ -4038,6 +4081,7 @@ module_setup(VALUE module, NODE *n)
}
PUSH_CREF(module);
VIS_SET(VIS_PUBLIC);
PUSH_TAG(PROT_NONE);
if ((state = EXEC_TAG()) == 0) {
EXEC_EVENT_HOOK(RUBY_EVENT_CLASS, n, ruby_cbase,
@ -4740,8 +4784,8 @@ rb_yield_0(VALUE val, VALUE self, VALUE klass /* OK */, int flags, int avalue)
ruby_wrapper = block->wrapper;
old_scope = ruby_scope;
ruby_scope = block->scope;
old_vmode = scope_vmode;
scope_vmode = (flags & YIELD_PUBLIC_DEF) ? SCOPE_PUBLIC : block->vmode;
old_vmode = vis_mode;
vis_mode = (flags & YIELD_PUBLIC_DEF) ? VIS_PUBLIC : block->vmode;
if (block->flags & BLOCK_D_SCOPE) {
/* put place holder for dynamic (in-block) local variables */
ruby_dyna_vars = new_dvar(0, 0, block->dyna_vars);
@ -4926,7 +4970,7 @@ rb_yield_0(VALUE val, VALUE self, VALUE klass /* OK */, int flags, int avalue)
if (ruby_scope->flags & SCOPE_DONT_RECYCLE)
scope_dup(old_scope);
ruby_scope = old_scope;
scope_vmode = old_vmode;
vis_mode = old_vmode;
switch (state) {
case 0:
break;
@ -5672,7 +5716,7 @@ formal_assign(VALUE recv, NODE *node, int argc, const VALUE *argv, VALUE *local_
ruby_frame->self = recv;\
ruby_frame->argc = argc;\
ruby_frame->block = block;\
ruby_frame->flags = (flags & NOEX_RECV) ? FRAME_FUNC : 0;\
ruby_frame->flags = ((flags & NOEX_RECV) ? FRAME_FUNC : 0) | 0;
static VALUE
rb_call0(VALUE klass, VALUE recv, ID id, ID oid,
@ -5682,6 +5726,7 @@ rb_call0(VALUE klass, VALUE recv, ID id, ID oid,
{
NODE *b2; /* OK */
volatile VALUE result = Qnil;
int dmeth = DMETHOD_P();
static int tick;
volatile VALUE args;
volatile int safe = -1;
@ -5839,7 +5884,7 @@ rb_call0(VALUE klass, VALUE recv, ID id, ID oid,
break;
case TAG_RETRY:
if (rb_block_given_p()) JUMP_TAG(state);
if (block) JUMP_TAG(state);
/* fall through */
default:
jump_tag_but_local_jump(state, result);
@ -6067,17 +6112,7 @@ backtrace(int lev)
frame = frame->prev;
}
if (lev < 0) {
ruby_set_current_source();
if (frame->this_func) {
str = rb_sprintf("%s:%d:in `%s'", ruby_sourcefile, ruby_sourceline,
rb_id2name(frame->this_func));
}
else if (ruby_sourceline == 0) {
str = rb_str_new2(ruby_sourcefile);
}
else {
str = rb_sprintf("%s:%d", ruby_sourcefile, ruby_sourceline);
}
str = error_line(frame, 0);
rb_ary_push(ary, str);
if (lev < -1) return ary;
}
@ -6093,8 +6128,7 @@ backtrace(int lev)
for (; frame && (n = frame->node); frame = frame->prev) {
if (frame->prev && frame->prev->this_func) {
if (frame->prev->node == n) continue;
str = rb_sprintf("%s:%d:in `%s'", n->nd_file, nd_line(n),
rb_id2name(frame->prev->this_func));
str = error_line(frame->prev, n);
}
else {
str = rb_sprintf("%s:%d", n->nd_file, nd_line(n));
@ -6216,8 +6250,8 @@ eval(VALUE self, VALUE src, VALUE scope, const char *file, int line)
ruby_scope = data->scope;
old_dyna_vars = ruby_dyna_vars;
ruby_dyna_vars = data->dyna_vars;
old_vmode = scope_vmode;
scope_vmode = data->vmode;
old_vmode = vis_mode;
vis_mode = data->vmode;
old_cref = (VALUE)ruby_cref;
ruby_cref = data->cref;
old_wrapper = ruby_wrapper;
@ -6264,8 +6298,7 @@ eval(VALUE self, VALUE src, VALUE scope, const char *file, int line)
ruby_frame = frame.tmp;
ruby_scope = old_scope;
ruby_dyna_vars = old_dyna_vars;
data->vmode = scope_vmode; /* write back visibility mode */
scope_vmode = old_vmode;
vis_mode = old_vmode;
if (dont_recycle) {
struct tag *tag;
struct RVarmap *vars;
@ -6381,15 +6414,15 @@ exec_under(VALUE (*func) (VALUE), VALUE under, VALUE args)
ruby_frame->this_class = f->this_class;
ruby_frame->argc = f->argc;
mode = scope_vmode;
SCOPE_SET(SCOPE_PUBLIC);
mode = vis_mode;
VIS_SET(VIS_PUBLIC);
PUSH_TAG(PROT_NONE);
if ((state = EXEC_TAG()) == 0) {
val = (*func)(args);
}
POP_TAG();
POP_CREF();
SCOPE_SET(mode);
VIS_SET(mode);
POP_FRAME();
if (state) JUMP_TAG(state);
@ -6650,16 +6683,15 @@ rb_load(VALUE fname, int wrap)
self = rb_obj_clone(ruby_top_self);
rb_extend_object(self, ruby_wrapper);
PUSH_CREF(ruby_wrapper);
/* default visibility is private at loading toplevel */
VIS_SET(VIS_PRIVATE);
}
PUSH_FRAME(Qfalse);
ruby_frame->callee = 0;
ruby_frame->this_func = 0;
ruby_frame->this_class = 0;
ruby_frame->self = self;
PUSH_SCOPE();
/* default visibility is private at loading toplevel */
SCOPE_SET(SCOPE_PRIVATE);
PUSH_TAG(PROT_NONE);
/* default visibility is private at loading toplevel */
VIS_SET(VIS_PRIVATE);
state = EXEC_TAG();
callee = ruby_frame->callee;
this_func = ruby_frame->this_func;
@ -6981,15 +7013,18 @@ rb_require_safe(VALUE fname, int safe)
struct {
NODE *node;
ID this_func, callee;
int vmode, safe;
int safe, vmode;
} volatile saved;
char *volatile ftptr = 0;
saved.vmode = scope_vmode;
saved.node = ruby_current_node;
saved.callee = ruby_frame->callee;
saved.this_func = ruby_frame->this_func;
saved.safe = ruby_safe_level;
saved.vmode = vis_mode;
PUSH_SCOPE();
PUSH_CREF(ruby_cbase);
VIS_SET(VIS_PUBLIC);
PUSH_TAG(PROT_NONE);
if ((state = EXEC_TAG()) == 0) {
VALUE path;
@ -7024,7 +7059,7 @@ rb_require_safe(VALUE fname, int safe)
ruby_sourceline = 0;
ruby_frame->callee = 0;
ruby_frame->this_func = 0;
SCOPE_SET(SCOPE_PUBLIC);
VIS_SET(VIS_PUBLIC);
handle = (long)dln_load(RSTRING(path)->ptr);
rb_ary_push(ruby_dln_librefs, LONG2NUM(handle));
break;
@ -7039,8 +7074,10 @@ rb_require_safe(VALUE fname, int safe)
ruby_set_current_source();
ruby_frame->this_func = saved.this_func;
ruby_frame->callee = saved.callee;
SCOPE_SET(saved.vmode);
ruby_safe_level = saved.safe;
VIS_SET(saved.vmode);
POP_CREF();
POP_SCOPE();
if (ftptr) {
if (st_delete(loading_tbl, (st_data_t *)&ftptr, 0)) { /* loading done */
free(ftptr);
@ -7098,7 +7135,7 @@ rb_mod_public(int argc, VALUE *argv, VALUE module)
{
secure_visibility(module);
if (argc == 0) {
SCOPE_SET(SCOPE_PUBLIC);
VIS_SET(VIS_PUBLIC);
}
else {
set_method_visibility(module, argc, argv, NOEX_PUBLIC);
@ -7121,7 +7158,7 @@ rb_mod_protected(int argc, VALUE *argv, VALUE module)
{
secure_visibility(module);
if (argc == 0) {
SCOPE_SET(SCOPE_PROTECTED);
VIS_SET(VIS_PROTECTED);
}
else {
set_method_visibility(module, argc, argv, NOEX_PROTECTED);
@ -7153,7 +7190,7 @@ rb_mod_private(int argc, VALUE *argv, VALUE module)
{
secure_visibility(module);
if (argc == 0) {
SCOPE_SET(SCOPE_PRIVATE);
VIS_SET(VIS_PRIVATE);
}
else {
set_method_visibility(module, argc, argv, NOEX_PRIVATE);
@ -7269,7 +7306,7 @@ rb_mod_modfunc(int argc, VALUE *argv, VALUE module)
secure_visibility(module);
if (argc == 0) {
SCOPE_SET(SCOPE_MODFUNC);
VIS_SET(VIS_MODFUNC);
return module;
}
@ -7575,9 +7612,6 @@ call_end_proc(VALUE data)
PUSH_FRAME(Qfalse);
ruby_frame->self = ruby_frame->prev->self;
ruby_frame->node = 0;
ruby_frame->callee = 0;
ruby_frame->this_func = 0;
ruby_frame->this_class = 0;
proc_invoke(data, rb_ary_new2(0), Qundef, 0);
POP_FRAME();
}
@ -7830,6 +7864,11 @@ rb_mod_autoload_p(VALUE mod, VALUE sym)
static VALUE
rb_f_autoload(VALUE obj, VALUE sym, VALUE file)
{
VALUE klass = ruby_cbase;
if (NIL_P(ruby_cbase)) {
rb_raise(rb_eTypeError, "no class/module for autoload target");
}
return rb_mod_autoload(ruby_cbase, sym, file);
}
@ -7848,6 +7887,9 @@ static VALUE
rb_f_autoload_p(VALUE obj, VALUE sym)
{
/* use ruby_cbase as same as rb_f_autoload. */
if (NIL_P(ruby_cbase)) {
return Qfalse;
}
return rb_mod_autoload_p(ruby_cbase, sym);
}
@ -8282,7 +8324,6 @@ proc_invoke(VALUE proc, VALUE args /* OK */, VALUE self, VALUE klass)
if (self != Qundef) _block.frame.self = self;
if (klass) _block.frame.this_class = klass;
_block.frame.argc = RARRAY(tmp)->len;
if (ruby_frame->flags & FRAME_DMETH)
if (_block.frame.argc && (ruby_frame->flags & FRAME_DMETH)) {
NEWOBJ(scope, struct SCOPE);
OBJSETUP(scope, tmp, T_SCOPE);
@ -9385,10 +9426,10 @@ rb_mod_define_method(int argc, VALUE *argv, VALUE mod)
rb_raise(rb_eTypeError, "wrong argument type (expected Proc/Method)");
}
if (SCOPE_TEST(SCOPE_PRIVATE)) {
if (VIS_TEST(VIS_PRIVATE)) {
noex = NOEX_PRIVATE;
}
else if (SCOPE_TEST(SCOPE_PROTECTED)) {
else if (VIS_TEST(VIS_PROTECTED)) {
noex = NOEX_PROTECTED;
}
else {
@ -9758,7 +9799,7 @@ struct thread {
NODE *cref;
struct ruby_env *anchor;
int flags; /* misc. states (vmode/rb_trap_immediate/raised) */
int flags; /* misc. states (rb_trap_immediate/raised) */
NODE *node;
@ -10175,7 +10216,7 @@ rb_thread_save_context(rb_thread_t th)
th->cref = ruby_cref;
th->dyna_vars = ruby_dyna_vars;
th->flags &= THREAD_FLAGS_MASK;
th->flags |= (rb_trap_immediate<<8) | scope_vmode;
th->flags |= (rb_trap_immediate<<8) | vis_mode;
th->tag = prot_tag;
th->tracing = tracing;
th->errinfo = ruby_errinfo;
@ -10251,8 +10292,8 @@ rb_thread_restore_context_0(rb_thread_t th, int exit, void *vp)
ruby_scope = th->scope;
ruby_wrapper = th->wrapper;
ruby_cref = th->cref;
vis_mode = th->flags&VIS_MASK;
ruby_dyna_vars = th->dyna_vars;
scope_vmode = th->flags&SCOPE_MASK;
prot_tag = th->tag;
tracing = th->tracing;
ruby_errinfo = th->errinfo;

Просмотреть файл

@ -32,7 +32,7 @@ struct dbmdata {
};
static void
closed_dbm()
closed_dbm(void)
{
rb_raise(rb_eDBMError, "closed DBM file");
}
@ -49,8 +49,7 @@ closed_dbm()
}
static void
free_dbm(dbmp)
struct dbmdata *dbmp;
free_dbm(struct dbmdata *dbmp)
{
if (dbmp) {
if (dbmp->di_dbm) dbm_close(dbmp->di_dbm);
@ -59,8 +58,7 @@ free_dbm(dbmp)
}
static VALUE
fdbm_close(obj)
VALUE obj;
fdbm_close(VALUE obj)
{
struct dbmdata *dbmp;
@ -72,8 +70,7 @@ fdbm_close(obj)
}
static VALUE
fdbm_closed(obj)
VALUE obj;
fdbm_closed(VALUE obj)
{
struct dbmdata *dbmp;
@ -86,19 +83,14 @@ fdbm_closed(obj)
return Qfalse;
}
static VALUE fdbm_alloc _((VALUE));
static VALUE
fdbm_alloc(klass)
VALUE klass;
fdbm_alloc(VALUE klass)
{
return Data_Wrap_Struct(klass, 0, free_dbm, 0);
}
static VALUE
fdbm_initialize(argc, argv, obj)
int argc;
VALUE *argv;
VALUE obj;
fdbm_initialize(int argc, VALUE *argv, VALUE obj)
{
VALUE file, vmode, vflags;
DBM *dbm;
@ -151,10 +143,7 @@ fdbm_initialize(argc, argv, obj)
}
static VALUE
fdbm_s_open(argc, argv, klass)
int argc;
VALUE *argv;
VALUE klass;
fdbm_s_open(int argc, VALUE *argv, VALUE klass)
{
VALUE obj = Data_Wrap_Struct(klass, 0, free_dbm, 0);
@ -170,8 +159,7 @@ fdbm_s_open(argc, argv, klass)
}
static VALUE
fdbm_fetch(obj, keystr, ifnone)
VALUE obj, keystr, ifnone;
fdbm_fetch(VALUE obj, VALUE keystr, VALUE ifnone)
{
datum key, value;
struct dbmdata *dbmp;
@ -192,17 +180,13 @@ fdbm_fetch(obj, keystr, ifnone)
}
static VALUE
fdbm_aref(obj, keystr)
VALUE obj, keystr;
fdbm_aref(VALUE obj, VALUE keystr)
{
return fdbm_fetch(obj, keystr, Qnil);
}
static VALUE
fdbm_fetch_m(argc, argv, obj)
int argc;
VALUE *argv;
VALUE obj;
fdbm_fetch_m(int argc, VALUE *argv, VALUE obj)
{
VALUE keystr, valstr, ifnone;
@ -215,8 +199,7 @@ fdbm_fetch_m(argc, argv, obj)
}
static VALUE
fdbm_index(obj, valstr)
VALUE obj, valstr;
fdbm_index(VALUE obj, VALUE valstr)
{
datum key, val;
struct dbmdata *dbmp;
@ -238,8 +221,7 @@ fdbm_index(obj, valstr)
}
static VALUE
fdbm_select(obj)
VALUE obj;
fdbm_select(VALUE obj)
{
VALUE new = rb_ary_new();
datum key, val;
@ -263,10 +245,7 @@ fdbm_select(obj)
}
static VALUE
fdbm_values_at(argc, argv, obj)
int argc;
VALUE *argv;
VALUE obj;
fdbm_values_at(int argc, VALUE *argv, VALUE obj)
{
VALUE new = rb_ary_new2(argc);
int i;
@ -279,16 +258,14 @@ fdbm_values_at(argc, argv, obj)
}
static void
fdbm_modify(obj)
VALUE obj;
fdbm_modify(VALUE obj)
{
rb_secure(4);
if (OBJ_FROZEN(obj)) rb_error_frozen("DBM");
}
static VALUE
fdbm_delete(obj, keystr)
VALUE obj, keystr;
fdbm_delete(VALUE obj, VALUE keystr)
{
datum key, value;
struct dbmdata *dbmp;
@ -322,8 +299,7 @@ fdbm_delete(obj, keystr)
}
static VALUE
fdbm_shift(obj)
VALUE obj;
fdbm_shift(VALUE obj)
{
datum key, val;
struct dbmdata *dbmp;
@ -345,8 +321,7 @@ fdbm_shift(obj)
}
static VALUE
fdbm_delete_if(obj)
VALUE obj;
fdbm_delete_if(VALUE obj)
{
datum key, val;
struct dbmdata *dbmp;
@ -386,8 +361,7 @@ fdbm_delete_if(obj)
}
static VALUE
fdbm_clear(obj)
VALUE obj;
fdbm_clear(VALUE obj)
{
datum key;
struct dbmdata *dbmp;
@ -407,8 +381,7 @@ fdbm_clear(obj)
}
static VALUE
fdbm_invert(obj)
VALUE obj;
fdbm_invert(VALUE obj)
{
datum key, val;
struct dbmdata *dbmp;
@ -455,8 +428,7 @@ fdbm_replace(VALUE obj, VALUE other)
}
static VALUE
fdbm_store(obj, keystr, valstr)
VALUE obj, keystr, valstr;
fdbm_store(VALUE obj, VALUE keystr, VALUE valstr)
{
datum key, val;
struct dbmdata *dbmp;
@ -486,8 +458,7 @@ fdbm_store(obj, keystr, valstr)
}
static VALUE
fdbm_length(obj)
VALUE obj;
fdbm_length(VALUE obj)
{
datum key;
struct dbmdata *dbmp;
@ -506,8 +477,7 @@ fdbm_length(obj)
}
static VALUE
fdbm_empty_p(obj)
VALUE obj;
fdbm_empty_p(VALUE obj)
{
datum key;
struct dbmdata *dbmp;
@ -530,8 +500,7 @@ fdbm_empty_p(obj)
}
static VALUE
fdbm_each_value(obj)
VALUE obj;
fdbm_each_value(VALUE obj)
{
datum key, val;
struct dbmdata *dbmp;
@ -547,8 +516,7 @@ fdbm_each_value(obj)
}
static VALUE
fdbm_each_key(obj)
VALUE obj;
fdbm_each_key(VALUE obj)
{
datum key;
struct dbmdata *dbmp;
@ -563,8 +531,7 @@ fdbm_each_key(obj)
}
static VALUE
fdbm_each_pair(obj)
VALUE obj;
fdbm_each_pair(VALUE obj)
{
datum key, val;
DBM *dbm;
@ -585,8 +552,7 @@ fdbm_each_pair(obj)
}
static VALUE
fdbm_keys(obj)
VALUE obj;
fdbm_keys(VALUE obj)
{
datum key;
struct dbmdata *dbmp;
@ -604,8 +570,7 @@ fdbm_keys(obj)
}
static VALUE
fdbm_values(obj)
VALUE obj;
fdbm_values(VALUE obj)
{
datum key, val;
struct dbmdata *dbmp;
@ -623,8 +588,7 @@ fdbm_values(obj)
}
static VALUE
fdbm_has_key(obj, keystr)
VALUE obj, keystr;
fdbm_has_key(VALUE obj, VALUE keystr)
{
datum key, val;
struct dbmdata *dbmp;
@ -641,8 +605,7 @@ fdbm_has_key(obj, keystr)
}
static VALUE
fdbm_has_value(obj, valstr)
VALUE obj, valstr;
fdbm_has_value(VALUE obj, VALUE valstr)
{
datum key, val;
struct dbmdata *dbmp;
@ -663,8 +626,7 @@ fdbm_has_value(obj, valstr)
}
static VALUE
fdbm_to_a(obj)
VALUE obj;
fdbm_to_a(VALUE obj)
{
datum key, val;
struct dbmdata *dbmp;
@ -683,8 +645,7 @@ fdbm_to_a(obj)
}
static VALUE
fdbm_to_hash(obj)
VALUE obj;
fdbm_to_hash(VALUE obj)
{
datum key, val;
struct dbmdata *dbmp;
@ -703,14 +664,13 @@ fdbm_to_hash(obj)
}
static VALUE
fdbm_reject(obj)
VALUE obj;
fdbm_reject(VALUE obj)
{
return rb_hash_delete_if(fdbm_to_hash(obj));
}
void
Init_dbm()
Init_dbm(void)
{
rb_cDBM = rb_define_class("DBM", rb_cObject);
rb_eDBMError = rb_define_class("DBMError", rb_eStandardError);

Просмотреть файл

@ -21,8 +21,7 @@ static VALUE rb_cGDBM, rb_eGDBMError, rb_eGDBMFatalError;
#define MY_BLOCK_SIZE (2048)
#define MY_FATAL_FUNC rb_gdbm_fatal
static void
rb_gdbm_fatal(msg)
char *msg;
rb_gdbm_fatal(char *msg)
{
rb_raise(rb_eGDBMFatalError, msg);
}
@ -33,7 +32,7 @@ struct dbmdata {
};
static void
closed_dbm()
closed_dbm(void)
{
rb_raise(rb_eRuntimeError, "closed GDBM file");
}
@ -50,8 +49,7 @@ closed_dbm()
}
static void
free_dbm(dbmp)
struct dbmdata *dbmp;
free_dbm(struct dbmdata *dbmp)
{
if (dbmp) {
if (dbmp->di_dbm) gdbm_close(dbmp->di_dbm);
@ -60,8 +58,7 @@ free_dbm(dbmp)
}
static VALUE
fgdbm_close(obj)
VALUE obj;
fgdbm_close(VALUE obj)
{
struct dbmdata *dbmp;
@ -73,8 +70,7 @@ fgdbm_close(obj)
}
static VALUE
fgdbm_closed(obj)
VALUE obj;
fgdbm_closed(VALUE obj)
{
struct dbmdata *dbmp;
@ -87,20 +83,14 @@ fgdbm_closed(obj)
return Qfalse;
}
static VALUE fgdbm_s_alloc _((VALUE));
static VALUE
fgdbm_s_alloc(klass)
VALUE klass;
fgdbm_s_alloc(VALUE klass)
{
return Data_Wrap_Struct(klass, 0, free_dbm, 0);
}
static VALUE
fgdbm_initialize(argc, argv, obj)
int argc;
VALUE *argv;
VALUE obj;
fgdbm_initialize(int argc, VALUE *argv, VALUE obj)
{
VALUE file, vmode, vflags;
GDBM_FILE dbm;
@ -161,10 +151,7 @@ fgdbm_initialize(argc, argv, obj)
}
static VALUE
fgdbm_s_open(argc, argv, klass)
int argc;
VALUE *argv;
VALUE klass;
fgdbm_s_open(int argc, VALUE *argv, VALUE klass)
{
VALUE obj = Data_Wrap_Struct(klass, 0, free_dbm, 0);
@ -180,9 +167,7 @@ fgdbm_s_open(argc, argv, klass)
}
static VALUE
rb_gdbm_fetch(dbm, key)
GDBM_FILE dbm;
datum key;
rb_gdbm_fetch(GDBM_FILE dbm, datum key)
{
datum val;
VALUE str;
@ -202,9 +187,7 @@ rb_gdbm_fetch(dbm, key)
}
static VALUE
rb_gdbm_fetch2(dbm, keystr)
GDBM_FILE dbm;
VALUE keystr;
rb_gdbm_fetch2(GDBM_FILE dbm, VALUE keystr)
{
datum key;
@ -216,8 +199,7 @@ rb_gdbm_fetch2(dbm, keystr)
}
static VALUE
rb_gdbm_fetch3(obj, keystr)
VALUE obj, keystr;
rb_gdbm_fetch3(VALUE obj, VALUE keystr)
{
struct dbmdata *dbmp;
GDBM_FILE dbm;
@ -227,8 +209,7 @@ rb_gdbm_fetch3(obj, keystr)
}
static VALUE
rb_gdbm_firstkey(dbm)
GDBM_FILE dbm;
rb_gdbm_firstkey(GDBM_FILE dbm)
{
datum key;
VALUE str;
@ -248,9 +229,7 @@ rb_gdbm_firstkey(dbm)
}
static VALUE
rb_gdbm_nextkey(dbm, keystr)
GDBM_FILE dbm;
VALUE keystr;
rb_gdbm_nextkey(GDBM_FILE dbm, VALUE keystr)
{
datum key, key2;
VALUE str;
@ -272,8 +251,7 @@ rb_gdbm_nextkey(dbm, keystr)
}
static VALUE
fgdbm_fetch(obj, keystr, ifnone)
VALUE obj, keystr, ifnone;
fgdbm_fetch(VALUE obj, VALUE keystr, VALUE ifnone)
{
VALUE valstr;
@ -287,17 +265,13 @@ fgdbm_fetch(obj, keystr, ifnone)
}
static VALUE
fgdbm_aref(obj, keystr)
VALUE obj, keystr;
fgdbm_aref(VALUE obj, VALUE keystr)
{
return rb_gdbm_fetch3(obj, keystr);
}
static VALUE
fgdbm_fetch_m(argc, argv, obj)
int argc;
VALUE *argv;
VALUE obj;
fgdbm_fetch_m(int argc, VALUE *argv, VALUE obj)
{
VALUE keystr, valstr, ifnone;
@ -310,8 +284,7 @@ fgdbm_fetch_m(argc, argv, obj)
}
static VALUE
fgdbm_index(obj, valstr)
VALUE obj, valstr;
fgdbm_index(VALUE obj, VALUE valstr)
{
struct dbmdata *dbmp;
GDBM_FILE dbm;
@ -334,8 +307,7 @@ fgdbm_index(obj, valstr)
}
static VALUE
fgdbm_select(obj)
VALUE obj;
fgdbm_select(VALUE obj)
{
VALUE new = rb_ary_new();
GDBM_FILE dbm;
@ -358,10 +330,7 @@ fgdbm_select(obj)
}
static VALUE
fgdbm_values_at(argc, argv, obj)
int argc;
VALUE *argv;
VALUE obj;
fgdbm_values_at(int argc, VALUE *argv, VALUE obj)
{
VALUE new = rb_ary_new2(argc);
int i;
@ -374,16 +343,14 @@ fgdbm_values_at(argc, argv, obj)
}
static void
rb_gdbm_modify(obj)
VALUE obj;
rb_gdbm_modify(VALUE obj)
{
rb_secure(4);
if (OBJ_FROZEN(obj)) rb_error_frozen("GDBM");
}
static VALUE
rb_gdbm_delete(obj, keystr)
VALUE obj, keystr;
rb_gdbm_delete(VALUE obj, VALUE keystr)
{
datum key;
struct dbmdata *dbmp;
@ -410,8 +377,7 @@ rb_gdbm_delete(obj, keystr)
}
static VALUE
fgdbm_delete(obj, keystr)
VALUE obj, keystr;
fgdbm_delete(VALUE obj, VALUE keystr)
{
VALUE valstr;
@ -421,8 +387,7 @@ fgdbm_delete(obj, keystr)
}
static VALUE
fgdbm_shift(obj)
VALUE obj;
fgdbm_shift(VALUE obj)
{
struct dbmdata *dbmp;
GDBM_FILE dbm;
@ -439,8 +404,7 @@ fgdbm_shift(obj)
}
static VALUE
fgdbm_delete_if(obj)
VALUE obj;
fgdbm_delete_if(VALUE obj)
{
struct dbmdata *dbmp;
GDBM_FILE dbm;
@ -472,8 +436,7 @@ fgdbm_delete_if(obj)
}
static VALUE
fgdbm_clear(obj)
VALUE obj;
fgdbm_clear(VALUE obj)
{
datum key, nextkey;
struct dbmdata *dbmp;
@ -510,8 +473,7 @@ fgdbm_clear(obj)
}
static VALUE
fgdbm_invert(obj)
VALUE obj;
fgdbm_invert(VALUE obj)
{
struct dbmdata *dbmp;
GDBM_FILE dbm;
@ -528,42 +490,8 @@ fgdbm_invert(obj)
return hash;
}
static VALUE each_pair _((VALUE));
static VALUE fgdbm_store _((VALUE,VALUE,VALUE));
static VALUE
update_i(pair, dbm)
VALUE pair, dbm;
{
Check_Type(pair, T_ARRAY);
if (RARRAY(pair)->len < 2) {
rb_raise(rb_eArgError, "pair must be [key, value]");
}
fgdbm_store(dbm, RARRAY(pair)->ptr[0], RARRAY(pair)->ptr[1]);
return Qnil;
}
static VALUE
fgdbm_update(obj, other)
VALUE obj, other;
{
rb_block_call(other, rb_intern("each_pair"), 0, 0, update_i, obj);
return obj;
}
static VALUE
fgdbm_replace(obj, other)
VALUE obj, other;
{
fgdbm_clear(obj);
rb_block_call(other, rb_intern("each_pair"), 0, 0, update_i, obj);
return obj;
}
static VALUE
fgdbm_store(obj, keystr, valstr)
VALUE obj, keystr, valstr;
fgdbm_store(VALUE obj, VALUE keystr, VALUE valstr)
{
datum key, val;
struct dbmdata *dbmp;
@ -590,8 +518,33 @@ fgdbm_store(obj, keystr, valstr)
}
static VALUE
fgdbm_length(obj)
VALUE obj;
update_i(VALUE pair, VALUE dbm)
{
Check_Type(pair, T_ARRAY);
if (RARRAY(pair)->len < 2) {
rb_raise(rb_eArgError, "pair must be [key, value]");
}
fgdbm_store(dbm, RARRAY(pair)->ptr[0], RARRAY(pair)->ptr[1]);
return Qnil;
}
static VALUE
fgdbm_update(VALUE obj, VALUE other)
{
rb_block_call(other, rb_intern("each_pair"), 0, 0, update_i, obj);
return obj;
}
static VALUE
fgdbm_replace(VALUE obj, VALUE other)
{
fgdbm_clear(obj);
rb_block_call(other, rb_intern("each_pair"), 0, 0, update_i, obj);
return obj;
}
static VALUE
fgdbm_length(VALUE obj)
{
datum key, nextkey;
struct dbmdata *dbmp;
@ -612,8 +565,7 @@ fgdbm_length(obj)
}
static VALUE
fgdbm_empty_p(obj)
VALUE obj;
fgdbm_empty_p(VALUE obj)
{
datum key;
struct dbmdata *dbmp;
@ -636,8 +588,7 @@ fgdbm_empty_p(obj)
}
static VALUE
fgdbm_each_value(obj)
VALUE obj;
fgdbm_each_value(VALUE obj)
{
struct dbmdata *dbmp;
GDBM_FILE dbm;
@ -654,8 +605,7 @@ fgdbm_each_value(obj)
}
static VALUE
fgdbm_each_key(obj)
VALUE obj;
fgdbm_each_key(VALUE obj)
{
struct dbmdata *dbmp;
GDBM_FILE dbm;
@ -672,8 +622,7 @@ fgdbm_each_key(obj)
}
static VALUE
fgdbm_each_pair(obj)
VALUE obj;
fgdbm_each_pair(VALUE obj)
{
GDBM_FILE dbm;
struct dbmdata *dbmp;
@ -691,8 +640,7 @@ fgdbm_each_pair(obj)
}
static VALUE
fgdbm_keys(obj)
VALUE obj;
fgdbm_keys(VALUE obj)
{
struct dbmdata *dbmp;
GDBM_FILE dbm;
@ -710,8 +658,7 @@ fgdbm_keys(obj)
}
static VALUE
fgdbm_values(obj)
VALUE obj;
fgdbm_values(VALUE obj)
{
datum key, nextkey;
struct dbmdata *dbmp;
@ -731,8 +678,7 @@ fgdbm_values(obj)
}
static VALUE
fgdbm_has_key(obj, keystr)
VALUE obj, keystr;
fgdbm_has_key(VALUE obj, VALUE keystr)
{
datum key;
struct dbmdata *dbmp;
@ -749,8 +695,7 @@ fgdbm_has_key(obj, keystr)
}
static VALUE
fgdbm_has_value(obj, valstr)
VALUE obj, valstr;
fgdbm_has_value(VALUE obj, VALUE valstr)
{
struct dbmdata *dbmp;
GDBM_FILE dbm;
@ -774,8 +719,7 @@ fgdbm_has_value(obj, valstr)
}
static VALUE
fgdbm_to_a(obj)
VALUE obj;
fgdbm_to_a(VALUE obj)
{
struct dbmdata *dbmp;
GDBM_FILE dbm;
@ -793,8 +737,7 @@ fgdbm_to_a(obj)
}
static VALUE
fgdbm_reorganize(obj)
VALUE obj;
fgdbm_reorganize(VALUE obj)
{
struct dbmdata *dbmp;
GDBM_FILE dbm;
@ -806,8 +749,7 @@ fgdbm_reorganize(obj)
}
static VALUE
fgdbm_sync(obj)
VALUE obj;
fgdbm_sync(VALUE obj)
{
struct dbmdata *dbmp;
GDBM_FILE dbm;
@ -819,8 +761,7 @@ fgdbm_sync(obj)
}
static VALUE
fgdbm_set_cachesize(obj, val)
VALUE obj, val;
fgdbm_set_cachesize(VALUE obj, VALUE val)
{
struct dbmdata *dbmp;
GDBM_FILE dbm;
@ -835,8 +776,7 @@ fgdbm_set_cachesize(obj, val)
}
static VALUE
fgdbm_set_fastmode(obj, val)
VALUE obj, val;
fgdbm_set_fastmode(VALUE obj, VALUE val)
{
struct dbmdata *dbmp;
GDBM_FILE dbm;
@ -854,8 +794,7 @@ fgdbm_set_fastmode(obj, val)
}
static VALUE
fgdbm_set_syncmode(obj, val)
VALUE obj, val;
fgdbm_set_syncmode(VALUE obj, VALUE val)
{
#if !defined(GDBM_SYNCMODE)
fgdbm_set_fastmode(obj, RTEST(val) ? Qfalse : Qtrue);
@ -878,8 +817,7 @@ fgdbm_set_syncmode(obj, val)
}
static VALUE
fgdbm_to_hash(obj)
VALUE obj;
fgdbm_to_hash(VALUE obj)
{
struct dbmdata *dbmp;
GDBM_FILE dbm;
@ -897,14 +835,13 @@ fgdbm_to_hash(obj)
}
static VALUE
fgdbm_reject(obj)
VALUE obj;
fgdbm_reject(VALUE obj)
{
return rb_hash_delete_if(fgdbm_to_hash(obj));
}
void
Init_gdbm()
Init_gdbm(void)
{
rb_cGDBM = rb_define_class("GDBM", rb_cObject);
rb_eGDBMError = rb_define_class("GDBMError", rb_eStandardError);

Просмотреть файл

@ -143,10 +143,7 @@ static long masks[] = {
datum nullitem = {NULL, 0};
DBM *
sdbm_open(file, flags, mode)
register char *file;
register int flags;
register int mode;
sdbm_open(register char *file, register int flags, register int mode)
{
register DBM *db;
register char *dirname;
@ -175,11 +172,7 @@ register int mode;
}
DBM *
sdbm_prep(dirname, pagname, flags, mode)
char *dirname;
char *pagname;
int flags;
int mode;
sdbm_prep(char *dirname, char *pagname, int flags, int mode)
{
register DBM *db;
struct stat dstat;
@ -235,8 +228,7 @@ int mode;
}
void
sdbm_close(db)
register DBM *db;
sdbm_close(register DBM *db)
{
if (db == NULL)
errno = EINVAL;
@ -248,9 +240,7 @@ register DBM *db;
}
datum
sdbm_fetch(db, key)
register DBM *db;
datum key;
sdbm_fetch(register DBM *db, datum key)
{
if (db == NULL || bad(key))
return errno = EINVAL, nullitem;
@ -262,9 +252,7 @@ datum key;
}
int
sdbm_delete(db, key)
register DBM *db;
datum key;
sdbm_delete(register DBM *db, datum key)
{
if (db == NULL || bad(key))
return errno = EINVAL, -1;
@ -288,11 +276,7 @@ datum key;
}
int
sdbm_store(db, key, val, flags)
register DBM *db;
datum key;
datum val;
int flags;
sdbm_store(register DBM *db, datum key, datum val, int flags)
{
int need;
register long hash;
@ -350,10 +334,7 @@ int flags;
* giving up.
*/
static int
makroom(db, hash, need)
register DBM *db;
long hash;
int need;
makroom(register DBM *db, long int hash, int need)
{
long newp;
char twin[PBLKSIZ];
@ -450,8 +431,7 @@ int need;
* deletions aren't taken into account. (ndbm bug)
*/
datum
sdbm_firstkey(db)
register DBM *db;
sdbm_firstkey(register DBM *db)
{
if (db == NULL)
return errno = EINVAL, nullitem;
@ -470,8 +450,7 @@ register DBM *db;
}
datum
sdbm_nextkey(db)
register DBM *db;
sdbm_nextkey(register DBM *db)
{
if (db == NULL)
return errno = EINVAL, nullitem;
@ -482,9 +461,7 @@ register DBM *db;
* all important binary trie traversal
*/
static int
getpage(db, hash)
register DBM *db;
register long hash;
getpage(register DBM *db, register long int hash)
{
register int hbit;
register long dbit;
@ -526,9 +503,7 @@ register long hash;
}
static int
getdbit(db, dbit)
register DBM *db;
register long dbit;
getdbit(register DBM *db, register long int dbit)
{
register long c;
register long dirb;
@ -549,9 +524,7 @@ register long dbit;
}
static int
setdbit(db, dbit)
register DBM *db;
register long dbit;
setdbit(register DBM *db, register long int dbit)
{
register long c;
register long dirb;
@ -585,8 +558,7 @@ register long dbit;
* the page, try the next page in sequence
*/
static datum
getnext(db)
register DBM *db;
getnext(register DBM *db)
{
datum key;
@ -661,9 +633,7 @@ static int seepair proto((char *, int, char *, int));
*/
static int
fitpair(pag, need)
char *pag;
int need;
fitpair(char *pag, int need)
{
register int n;
register int off;
@ -680,10 +650,7 @@ int need;
}
static void
putpair(pag, key, val)
char *pag;
datum key;
datum val;
putpair(char *pag, datum key, datum val)
{
register int n;
register int off;
@ -711,9 +678,7 @@ datum val;
}
static datum
getpair(pag, key)
char *pag;
datum key;
getpair(char *pag, datum key)
{
register int i;
register int n;
@ -733,9 +698,7 @@ datum key;
#ifdef SEEDUPS
static int
duppair(pag, key)
char *pag;
datum key;
duppair(char *pag, datum key)
{
register short *ino = (short *) pag;
return GET_SHORT(ino,0) > 0 &&
@ -744,9 +707,7 @@ datum key;
#endif
static datum
getnkey(pag, num)
char *pag;
int num;
getnkey(char *pag, int num)
{
datum key;
register int off;
@ -765,9 +726,7 @@ int num;
}
static int
delpair(pag, key)
char *pag;
datum key;
delpair(char *pag, datum key)
{
register int n;
register int i;
@ -837,11 +796,7 @@ datum key;
* return 0 if not found.
*/
static int
seepair(pag, n, key, siz)
char *pag;
register int n;
register char *key;
register int siz;
seepair(char *pag, register int n, register char *key, register int siz)
{
register int i;
register int off = PBLKSIZ;
@ -857,10 +812,7 @@ register int siz;
}
static void
splpage(pag, new, sbit)
char *pag;
char *new;
long sbit;
splpage(char *pag, char *new, long int sbit)
{
datum key;
datum val;
@ -901,8 +853,7 @@ long sbit;
* this could be made more rigorous.
*/
static int
chkpage(pag)
char *pag;
chkpage(char *pag)
{
register int n;
register int off;
@ -942,9 +893,7 @@ char *pag;
* 65587 even better.
*/
long
sdbm_hash(str, len)
register char *str;
register int len;
sdbm_hash(register char *str, register int len)
{
register unsigned long n = 0;

Просмотреть файл

@ -41,8 +41,7 @@ closed_sdbm()
}
static void
free_sdbm(dbmp)
struct dbmdata *dbmp;
free_sdbm(struct dbmdata *dbmp)
{
if (dbmp->di_dbm) sdbm_close(dbmp->di_dbm);
@ -50,8 +49,7 @@ free_sdbm(dbmp)
}
static VALUE
fsdbm_close(obj)
VALUE obj;
fsdbm_close(VALUE obj)
{
struct dbmdata *dbmp;
@ -63,8 +61,7 @@ fsdbm_close(obj)
}
static VALUE
fsdbm_closed(obj)
VALUE obj;
fsdbm_closed(VALUE obj)
{
struct dbmdata *dbmp;
@ -77,19 +74,14 @@ fsdbm_closed(obj)
return Qfalse;
}
static VALUE fsdbm_alloc _((VALUE));
static VALUE
fsdbm_alloc(klass)
VALUE klass;
fsdbm_alloc(VALUE klass)
{
return Data_Wrap_Struct(klass, 0, free_sdbm, 0);
}
static VALUE
fsdbm_initialize(argc, argv, obj)
int argc;
VALUE *argv;
VALUE obj;
fsdbm_initialize(int argc, VALUE *argv, VALUE obj)
{
VALUE file, vmode;
DBM *dbm;
@ -129,10 +121,7 @@ fsdbm_initialize(argc, argv, obj)
}
static VALUE
fsdbm_s_open(argc, argv, klass)
int argc;
VALUE *argv;
VALUE klass;
fsdbm_s_open(int argc, VALUE *argv, VALUE klass)
{
VALUE obj = Data_Wrap_Struct(klass, 0, free_sdbm, 0);
@ -148,8 +137,7 @@ fsdbm_s_open(argc, argv, klass)
}
static VALUE
fsdbm_fetch(obj, keystr, ifnone)
VALUE obj, keystr, ifnone;
fsdbm_fetch(VALUE obj, VALUE keystr, VALUE ifnone)
{
datum key, value;
struct dbmdata *dbmp;
@ -170,17 +158,13 @@ fsdbm_fetch(obj, keystr, ifnone)
}
static VALUE
fsdbm_aref(obj, keystr)
VALUE obj, keystr;
fsdbm_aref(VALUE obj, VALUE keystr)
{
return fsdbm_fetch(obj, keystr, Qnil);
}
static VALUE
fsdbm_fetch_m(argc, argv, obj)
int argc;
VALUE *argv;
VALUE obj;
fsdbm_fetch_m(int argc, VALUE *argv, VALUE obj)
{
VALUE keystr, valstr, ifnone;
@ -193,8 +177,7 @@ fsdbm_fetch_m(argc, argv, obj)
}
static VALUE
fsdbm_index(obj, valstr)
VALUE obj, valstr;
fsdbm_index(VALUE obj, VALUE valstr)
{
datum key, val;
struct dbmdata *dbmp;
@ -215,8 +198,7 @@ fsdbm_index(obj, valstr)
}
static VALUE
fsdbm_select(obj)
VALUE obj;
fsdbm_select(VALUE obj)
{
VALUE new = rb_ary_new();
datum key, val;
@ -240,10 +222,7 @@ fsdbm_select(obj)
}
static VALUE
fsdbm_values_at(argc, argv, obj)
int argc;
VALUE *argv;
VALUE obj;
fsdbm_values_at(int argc, VALUE *argv, VALUE obj)
{
VALUE new = rb_ary_new2(argc);
int i;
@ -256,16 +235,14 @@ fsdbm_values_at(argc, argv, obj)
}
static void
fdbm_modify(obj)
VALUE obj;
fdbm_modify(VALUE obj)
{
rb_secure(4);
if (OBJ_FROZEN(obj)) rb_error_frozen("SDBM");
}
static VALUE
fsdbm_delete(obj, keystr)
VALUE obj, keystr;
fsdbm_delete(VALUE obj, VALUE keystr)
{
datum key, value;
struct dbmdata *dbmp;
@ -300,8 +277,7 @@ fsdbm_delete(obj, keystr)
}
static VALUE
fsdbm_shift(obj)
VALUE obj;
fsdbm_shift(VALUE obj)
{
datum key, val;
struct dbmdata *dbmp;
@ -324,8 +300,7 @@ fsdbm_shift(obj)
}
static VALUE
fsdbm_delete_if(obj)
VALUE obj;
fsdbm_delete_if(VALUE obj)
{
datum key, val;
struct dbmdata *dbmp;
@ -364,8 +339,7 @@ fsdbm_delete_if(obj)
}
static VALUE
fsdbm_clear(obj)
VALUE obj;
fsdbm_clear(VALUE obj)
{
datum key;
struct dbmdata *dbmp;
@ -385,8 +359,7 @@ fsdbm_clear(obj)
}
static VALUE
fsdbm_invert(obj)
VALUE obj;
fsdbm_invert(VALUE obj)
{
datum key, val;
struct dbmdata *dbmp;
@ -404,42 +377,8 @@ fsdbm_invert(obj)
return hash;
}
static VALUE each_pair _((VALUE));
static VALUE fsdbm_store _((VALUE,VALUE,VALUE));
static VALUE
update_i(pair, dbm)
VALUE pair, dbm;
{
Check_Type(pair, T_ARRAY);
if (RARRAY(pair)->len < 2) {
rb_raise(rb_eArgError, "pair must be [key, value]");
}
fsdbm_store(dbm, RARRAY(pair)->ptr[0], RARRAY(pair)->ptr[1]);
return Qnil;
}
static VALUE
fsdbm_update(obj, other)
VALUE obj, other;
{
rb_block_call(other, rb_intern("each_pair"), 0, 0, update_i, obj);
return obj;
}
static VALUE
fsdbm_replace(obj, other)
VALUE obj, other;
{
fsdbm_clear(obj);
rb_block_call(other, rb_intern("each_pair"), 0, 0, update_i, obj);
return obj;
}
static VALUE
fsdbm_store(obj, keystr, valstr)
VALUE obj, keystr, valstr;
fsdbm_store(VALUE obj, VALUE keystr, VALUE valstr)
{
datum key, val;
struct dbmdata *dbmp;
@ -474,8 +413,33 @@ fsdbm_store(obj, keystr, valstr)
}
static VALUE
fsdbm_length(obj)
VALUE obj;
update_i(VALUE pair, VALUE dbm)
{
Check_Type(pair, T_ARRAY);
if (RARRAY(pair)->len < 2) {
rb_raise(rb_eArgError, "pair must be [key, value]");
}
fsdbm_store(dbm, RARRAY(pair)->ptr[0], RARRAY(pair)->ptr[1]);
return Qnil;
}
static VALUE
fsdbm_update(VALUE obj, VALUE other)
{
rb_block_call(other, rb_intern("each_pair"), 0, 0, update_i, obj);
return obj;
}
static VALUE
fsdbm_replace(VALUE obj, VALUE other)
{
fsdbm_clear(obj);
rb_block_call(other, rb_intern("each_pair"), 0, 0, update_i, obj);
return obj;
}
static VALUE
fsdbm_length(VALUE obj)
{
datum key;
struct dbmdata *dbmp;
@ -494,8 +458,7 @@ fsdbm_length(obj)
}
static VALUE
fsdbm_empty_p(obj)
VALUE obj;
fsdbm_empty_p(VALUE obj)
{
datum key;
struct dbmdata *dbmp;
@ -518,8 +481,7 @@ fsdbm_empty_p(obj)
}
static VALUE
fsdbm_each_value(obj)
VALUE obj;
fsdbm_each_value(VALUE obj)
{
datum key, val;
struct dbmdata *dbmp;
@ -535,8 +497,7 @@ fsdbm_each_value(obj)
}
static VALUE
fsdbm_each_key(obj)
VALUE obj;
fsdbm_each_key(VALUE obj)
{
datum key;
struct dbmdata *dbmp;
@ -551,8 +512,7 @@ fsdbm_each_key(obj)
}
static VALUE
fsdbm_each_pair(obj)
VALUE obj;
fsdbm_each_pair(VALUE obj)
{
datum key, val;
DBM *dbm;
@ -572,8 +532,7 @@ fsdbm_each_pair(obj)
}
static VALUE
fsdbm_keys(obj)
VALUE obj;
fsdbm_keys(VALUE obj)
{
datum key;
struct dbmdata *dbmp;
@ -590,8 +549,7 @@ fsdbm_keys(obj)
}
static VALUE
fsdbm_values(obj)
VALUE obj;
fsdbm_values(VALUE obj)
{
datum key, val;
struct dbmdata *dbmp;
@ -609,8 +567,7 @@ fsdbm_values(obj)
}
static VALUE
fsdbm_has_key(obj, keystr)
VALUE obj, keystr;
fsdbm_has_key(VALUE obj, VALUE keystr)
{
datum key, val;
struct dbmdata *dbmp;
@ -627,8 +584,7 @@ fsdbm_has_key(obj, keystr)
}
static VALUE
fsdbm_has_value(obj, valstr)
VALUE obj, valstr;
fsdbm_has_value(VALUE obj, VALUE valstr)
{
datum key, val;
struct dbmdata *dbmp;
@ -649,8 +605,7 @@ fsdbm_has_value(obj, valstr)
}
static VALUE
fsdbm_to_a(obj)
VALUE obj;
fsdbm_to_a(VALUE obj)
{
datum key, val;
struct dbmdata *dbmp;
@ -669,8 +624,7 @@ fsdbm_to_a(obj)
}
static VALUE
fsdbm_to_hash(obj)
VALUE obj;
fsdbm_to_hash(VALUE obj)
{
datum key, val;
struct dbmdata *dbmp;
@ -689,8 +643,7 @@ fsdbm_to_hash(obj)
}
static VALUE
fsdbm_reject(obj)
VALUE obj;
fsdbm_reject(VALUE obj)
{
return rb_hash_delete_if(fsdbm_to_hash(obj));
}

Просмотреть файл

@ -31,7 +31,7 @@
/*--------- Prototypes --------*/
static NORETURN(void raise_zlib_error _((int, const char *)));
static NORETURN(void raise_zlib_error _((int, const char*)));
static VALUE rb_zlib_version _((VALUE));
static VALUE do_checksum _((int, VALUE*, uLong (*) _((uLong, const Bytef*, uInt))));
static VALUE rb_zlib_adler32 _((int, VALUE*, VALUE));
@ -43,14 +43,14 @@ static void finalizer_warn _((const char*));
struct zstream;
struct zstream_funcs;
static void zstream_init _((struct zstream*, const struct zstream_funcs *));
static void zstream_init _((struct zstream*, const struct zstream_funcs*));
static void zstream_expand_buffer _((struct zstream*));
static void zstream_expand_buffer_into _((struct zstream*, int));
static void zstream_append_buffer _((struct zstream*, const char*, int));
static void zstream_append_buffer _((struct zstream*, const Bytef*, int));
static VALUE zstream_detach_buffer _((struct zstream*));
static VALUE zstream_shift_buffer _((struct zstream*, int));
static void zstream_buffer_ungetc _((struct zstream*, int));
static void zstream_append_input _((struct zstream*, const char*, unsigned int));
static void zstream_append_input _((struct zstream*, const Bytef*, unsigned int));
static void zstream_discard_input _((struct zstream*, unsigned int));
static void zstream_reset_input _((struct zstream*));
static void zstream_passthrough_input _((struct zstream*));
@ -272,7 +272,7 @@ static VALUE
do_checksum(argc, argv, func)
int argc;
VALUE *argv;
uLong (*func) _((uLong, const Bytef *, uInt));
uLong (*func) _((uLong, const Bytef*, uInt));
{
VALUE str, vsum;
unsigned long sum;
@ -294,7 +294,7 @@ do_checksum(argc, argv, func)
}
else {
StringValue(str);
sum = func(sum, RSTRING(str)->ptr, RSTRING(str)->len);
sum = func(sum, (Bytef*)RSTRING(str)->ptr, RSTRING(str)->len);
}
return rb_uint2inum(sum);
}
@ -447,7 +447,7 @@ zstream_expand_buffer(z)
rb_str_buf_new makes a zero-length string. */
z->buf = rb_str_new(0, ZSTREAM_INITIAL_BUFSIZE);
z->buf_filled = 0;
z->stream.next_out = RSTRING(z->buf)->ptr;
z->stream.next_out = (Bytef*)RSTRING(z->buf)->ptr;
z->stream.avail_out = ZSTREAM_INITIAL_BUFSIZE;
RBASIC(z->buf)->klass = 0;
return;
@ -466,7 +466,7 @@ zstream_expand_buffer(z)
z->stream.avail_out = (inc < ZSTREAM_AVAIL_OUT_STEP_MAX) ?
inc : ZSTREAM_AVAIL_OUT_STEP_MAX;
}
z->stream.next_out = RSTRING(z->buf)->ptr + z->buf_filled;
z->stream.next_out = (Bytef*)RSTRING(z->buf)->ptr + z->buf_filled;
}
static void
@ -479,13 +479,13 @@ zstream_expand_buffer_into(z, size)
rb_str_buf_new makes a zero-length string. */
z->buf = rb_str_new(0, size);
z->buf_filled = 0;
z->stream.next_out = RSTRING(z->buf)->ptr;
z->stream.next_out = (Bytef*)RSTRING(z->buf)->ptr;
z->stream.avail_out = size;
RBASIC(z->buf)->klass = 0;
}
else if (z->stream.avail_out != size) {
rb_str_resize(z->buf, z->buf_filled + size);
z->stream.next_out = RSTRING(z->buf)->ptr + z->buf_filled;
z->stream.next_out = (Bytef*)RSTRING(z->buf)->ptr + z->buf_filled;
z->stream.avail_out = size;
}
}
@ -493,14 +493,14 @@ zstream_expand_buffer_into(z, size)
static void
zstream_append_buffer(z, src, len)
struct zstream *z;
const char *src;
const Bytef *src;
int len;
{
if (NIL_P(z->buf)) {
z->buf = rb_str_buf_new(len);
rb_str_buf_cat(z->buf, src, len);
rb_str_buf_cat(z->buf, (char*)src, len);
z->buf_filled = len;
z->stream.next_out = RSTRING(z->buf)->ptr;
z->stream.next_out = (Bytef*)RSTRING(z->buf)->ptr;
z->stream.avail_out = 0;
RBASIC(z->buf)->klass = 0;
return;
@ -520,11 +520,11 @@ zstream_append_buffer(z, src, len)
}
memcpy(RSTRING(z->buf)->ptr + z->buf_filled, src, len);
z->buf_filled += len;
z->stream.next_out = RSTRING(z->buf)->ptr + z->buf_filled;
z->stream.next_out = (Bytef*)RSTRING(z->buf)->ptr + z->buf_filled;
}
#define zstream_append_buffer2(z,v) \
zstream_append_buffer((z),RSTRING(v)->ptr,RSTRING(v)->len)
zstream_append_buffer((z),(Bytef*)RSTRING(v)->ptr,RSTRING(v)->len)
static VALUE
zstream_detach_buffer(z)
@ -564,7 +564,7 @@ zstream_shift_buffer(z, len)
z->buf_filled -= len;
memmove(RSTRING(z->buf)->ptr, RSTRING(z->buf)->ptr + len,
z->buf_filled);
z->stream.next_out = RSTRING(z->buf)->ptr + z->buf_filled;
z->stream.next_out = (Bytef*)RSTRING(z->buf)->ptr + z->buf_filled;
z->stream.avail_out = RSTRING(z->buf)->len - z->buf_filled;
if (z->stream.avail_out > ZSTREAM_AVAIL_OUT_STEP_MAX) {
z->stream.avail_out = ZSTREAM_AVAIL_OUT_STEP_MAX;
@ -594,23 +594,23 @@ zstream_buffer_ungetc(z, c)
static void
zstream_append_input(z, src, len)
struct zstream *z;
const char *src;
const Bytef *src;
unsigned int len;
{
if (len <= 0) return;
if (NIL_P(z->input)) {
z->input = rb_str_buf_new(len);
rb_str_buf_cat(z->input, src, len);
rb_str_buf_cat(z->input, (char*)src, len);
RBASIC(z->input)->klass = 0;
}
else {
rb_str_buf_cat(z->input, src, len);
rb_str_buf_cat(z->input, (char*)src, len);
}
}
#define zstream_append_input2(z,v)\
zstream_append_input((z), RSTRING(v)->ptr, RSTRING(v)->len)
zstream_append_input((z), (Bytef*)RSTRING(v)->ptr, RSTRING(v)->len)
static void
zstream_discard_input(z, len)
@ -716,12 +716,12 @@ zstream_run(z, src, len, flush)
volatile VALUE guard;
if (NIL_P(z->input) && len == 0) {
z->stream.next_in = "";
z->stream.next_in = (Bytef*)"";
z->stream.avail_in = 0;
}
else {
zstream_append_input(z, src, len);
z->stream.next_in = RSTRING(z->input)->ptr;
z->stream.next_in = (Bytef*)RSTRING(z->input)->ptr;
z->stream.avail_in = RSTRING(z->input)->len;
/* keep reference to `z->input' so as not to be garbage collected
after zstream_reset_input() and prevent `z->stream.next_in'
@ -780,7 +780,7 @@ zstream_sync(z, src, len)
int err;
if (!NIL_P(z->input)) {
z->stream.next_in = RSTRING(z->input)->ptr;
z->stream.next_in = (Bytef*)RSTRING(z->input)->ptr;
z->stream.avail_in = RSTRING(z->input)->len;
err = inflateSync(&z->stream);
if (err == Z_OK) {
@ -791,7 +791,7 @@ zstream_sync(z, src, len)
}
zstream_reset_input(z);
if (err != Z_DATA_ERROR) {
rest = rb_str_new(z->stream.next_in, z->stream.avail_in);
rest = rb_str_new((char*)z->stream.next_in, z->stream.avail_in);
raise_zlib_error(err, z->stream.msg);
}
}
@ -806,7 +806,7 @@ zstream_sync(z, src, len)
return Qtrue;
}
if (err != Z_DATA_ERROR) {
rest = rb_str_new(z->stream.next_in, z->stream.avail_in);
rest = rb_str_new((char*)z->stream.next_in, z->stream.avail_in);
raise_zlib_error(err, z->stream.msg);
}
return Qfalse;
@ -970,7 +970,7 @@ rb_zstream_finish(obj)
struct zstream *z = get_zstream(obj);
VALUE dst;
zstream_run(z, "", 0, Z_FINISH);
zstream_run(z, (Bytef*)"", 0, Z_FINISH);
dst = zstream_detach_buffer(z);
OBJ_INFECT(dst, obj);
@ -1200,10 +1200,10 @@ static VALUE
deflate_run(args)
VALUE args;
{
struct zstream *z = (struct zstream *)((VALUE *)args)[0];
VALUE src = ((VALUE *)args)[1];
struct zstream *z = (struct zstream*)((VALUE*)args)[0];
VALUE src = ((VALUE*)args)[1];
zstream_run(z, RSTRING(src)->ptr, RSTRING(src)->len, Z_FINISH);
zstream_run(z, (Bytef*)RSTRING(src)->ptr, RSTRING(src)->len, Z_FINISH);
return zstream_detach_buffer(z);
}
@ -1263,12 +1263,12 @@ do_deflate(z, src, flush)
int flush;
{
if (NIL_P(src)) {
zstream_run(z, "", 0, Z_FINISH);
zstream_run(z, (Bytef*)"", 0, Z_FINISH);
return;
}
StringValue(src);
if (flush != Z_NO_FLUSH || RSTRING(src)->len > 0) { /* prevent BUF_ERROR */
zstream_run(z, RSTRING(src)->ptr, RSTRING(src)->len, flush);
zstream_run(z, (Bytef*)RSTRING(src)->ptr, RSTRING(src)->len, flush);
}
}
@ -1342,7 +1342,7 @@ rb_deflate_flush(argc, argv, obj)
rb_scan_args(argc, argv, "01", &v_flush);
flush = FIXNUMARG(v_flush, Z_SYNC_FLUSH);
if (flush != Z_NO_FLUSH) { /* prevent Z_BUF_ERROR */
zstream_run(z, "", 0, flush);
zstream_run(z, (Bytef*)"", 0, flush);
}
dst = zstream_detach_buffer(z);
@ -1403,7 +1403,7 @@ rb_deflate_set_dictionary(obj, dic)
OBJ_INFECT(obj, dic);
StringValue(src);
err = deflateSetDictionary(&z->stream,
RSTRING(src)->ptr, RSTRING(src)->len);
(Bytef*)RSTRING(src)->ptr, RSTRING(src)->len);
if (err != Z_OK) {
raise_zlib_error(err, z->stream.msg);
}
@ -1465,11 +1465,11 @@ static VALUE
inflate_run(args)
VALUE args;
{
struct zstream *z = (struct zstream *)((VALUE *)args)[0];
VALUE src = ((VALUE *)args)[1];
struct zstream *z = (struct zstream*)((VALUE*)args)[0];
VALUE src = ((VALUE*)args)[1];
zstream_run(z, RSTRING(src)->ptr, RSTRING(src)->len, Z_SYNC_FLUSH);
zstream_run(z, "", 0, Z_FINISH); /* for checking errors */
zstream_run(z, (Bytef*)RSTRING(src)->ptr, RSTRING(src)->len, Z_SYNC_FLUSH);
zstream_run(z, (Bytef*)"", 0, Z_FINISH); /* for checking errors */
return zstream_detach_buffer(z);
}
@ -1520,12 +1520,12 @@ do_inflate(z, src)
VALUE src;
{
if (NIL_P(src)) {
zstream_run(z, "", 0, Z_FINISH);
zstream_run(z, (Bytef*)"", 0, Z_FINISH);
return;
}
StringValue(src);
if (RSTRING(src)->len > 0) { /* prevent Z_BUF_ERROR */
zstream_run(z, RSTRING(src)->ptr, RSTRING(src)->len, Z_SYNC_FLUSH);
zstream_run(z, (Bytef*)RSTRING(src)->ptr, RSTRING(src)->len, Z_SYNC_FLUSH);
}
}
@ -1621,7 +1621,7 @@ rb_inflate_sync(obj, src)
OBJ_INFECT(obj, src);
StringValue(src);
return zstream_sync(z, RSTRING(src)->ptr, RSTRING(src)->len);
return zstream_sync(z, (Bytef*)RSTRING(src)->ptr, RSTRING(src)->len);
}
/*
@ -1665,7 +1665,7 @@ rb_inflate_set_dictionary(obj, dic)
OBJ_INFECT(obj, dic);
StringValue(src);
err = inflateSetDictionary(&z->stream,
RSTRING(src)->ptr, RSTRING(src)->len);
(Bytef*)RSTRING(src)->ptr, RSTRING(src)->len);
if (err != Z_OK) {
raise_zlib_error(err, z->stream.msg);
}
@ -1849,7 +1849,7 @@ static VALUE
gzfile_read_raw_partial(arg)
VALUE arg;
{
struct gzfile *gz = (struct gzfile *)arg;
struct gzfile *gz = (struct gzfile*)arg;
VALUE str;
str = rb_funcall(gz->io, id_readpartial, 1, INT2FIX(GZFILE_READ_SIZE));
@ -1861,7 +1861,7 @@ static VALUE
gzfile_read_raw_rescue(arg)
VALUE arg;
{
struct gzfile *gz = (struct gzfile *)arg;
struct gzfile *gz = (struct gzfile*)arg;
VALUE str = Qnil;
if (rb_obj_is_kind_of(ruby_errinfo, rb_eNoMethodError)) {
str = rb_funcall(gz->io, id_read, 1, INT2FIX(GZFILE_READ_SIZE));
@ -1955,7 +1955,7 @@ static void
gzfile_make_header(gz)
struct gzfile *gz;
{
unsigned char buf[10]; /* the size of gzip header */
Bytef buf[10]; /* the size of gzip header */
unsigned char flags = 0, extraflags = 0;
if (!NIL_P(gz->orig_name)) {
@ -1986,11 +1986,11 @@ gzfile_make_header(gz)
if (!NIL_P(gz->orig_name)) {
zstream_append_buffer2(&gz->z, gz->orig_name);
zstream_append_buffer(&gz->z, "\0", 1);
zstream_append_buffer(&gz->z, (Bytef*)"\0", 1);
}
if (!NIL_P(gz->comment)) {
zstream_append_buffer2(&gz->z, gz->comment);
zstream_append_buffer(&gz->z, "\0", 1);
zstream_append_buffer(&gz->z, (Bytef*)"\0", 1);
}
gz->z.flags |= GZFILE_FLAG_HEADER_FINISHED;
@ -2000,7 +2000,7 @@ static void
gzfile_make_footer(gz)
struct gzfile *gz;
{
unsigned char buf[8]; /* 8 is the size of gzip footer */
Bytef buf[8]; /* 8 is the size of gzip footer */
gzfile_set32(gz->crc, buf);
gzfile_set32(gz->z.stream.total_in, &buf[4]);
@ -2020,7 +2020,7 @@ gzfile_read_header(gz)
rb_raise(cGzError, "not in gzip format");
}
head = RSTRING(gz->z.input)->ptr;
head = (unsigned char*)RSTRING(gz->z.input)->ptr;
if (head[0] != GZ_MAGIC1 || head[1] != GZ_MAGIC2) {
rb_raise(cGzError, "not in gzip format");
@ -2058,7 +2058,7 @@ gzfile_read_header(gz)
if (!gzfile_read_raw_ensure(gz, 2)) {
rb_raise(cGzError, "unexpected end of file");
}
len = gzfile_get16(RSTRING(gz->z.input)->ptr);
len = gzfile_get16((Bytef*)RSTRING(gz->z.input)->ptr);
if (!gzfile_read_raw_ensure(gz, 2 + len)) {
rb_raise(cGzError, "unexpected end of file");
}
@ -2096,8 +2096,8 @@ gzfile_check_footer(gz)
rb_raise(cNoFooter, "footer is not found");
}
crc = gzfile_get32(RSTRING(gz->z.input)->ptr);
length = gzfile_get32(RSTRING(gz->z.input)->ptr + 4);
crc = gzfile_get32((Bytef*)RSTRING(gz->z.input)->ptr);
length = gzfile_get32((Bytef*)RSTRING(gz->z.input)->ptr + 4);
gz->z.stream.total_in += 8; /* to rewind correctly */
zstream_discard_input(&gz->z, 8);
@ -2143,7 +2143,7 @@ gzfile_read_more(gz)
break;
}
if (RSTRING(str)->len > 0) { /* prevent Z_BUF_ERROR */
zstream_run(&gz->z, RSTRING(str)->ptr, RSTRING(str)->len,
zstream_run(&gz->z, (Bytef*)RSTRING(str)->ptr, RSTRING(str)->len,
Z_SYNC_FLUSH);
}
if (gz->z.buf_filled > 0) break;
@ -2160,7 +2160,7 @@ gzfile_calc_crc(gz, str)
gz->ungetc -= RSTRING(str)->len;
}
else {
gz->crc = crc32(gz->crc, RSTRING(str)->ptr + gz->ungetc,
gz->crc = crc32(gz->crc, (Bytef*)RSTRING(str)->ptr + gz->ungetc,
RSTRING(str)->len - gz->ungetc);
gz->ungetc = 0;
}
@ -2285,7 +2285,7 @@ gzfile_writer_end(gz)
gzfile_make_header(gz);
}
zstream_run(&gz->z, "", 0, Z_FINISH);
zstream_run(&gz->z, (Bytef*)"", 0, Z_FINISH);
gzfile_make_footer(gz);
gzfile_write_raw(gz);
zstream_end(&gz->z);
@ -2812,7 +2812,7 @@ rb_gzwriter_flush(argc, argv, obj)
flush = FIXNUMARG(v_flush, Z_SYNC_FLUSH);
if (flush != Z_NO_FLUSH) { /* prevent Z_BUF_ERROR */
zstream_run(&gz->z, "", 0, flush);
zstream_run(&gz->z, (Bytef*)"", 0, flush);
}
gzfile_write_raw(gz);
@ -2834,7 +2834,7 @@ rb_gzwriter_write(obj, str)
if (TYPE(str) != T_STRING) {
str = rb_obj_as_string(str);
}
gzfile_write(gz, RSTRING(str)->ptr, RSTRING(str)->len);
gzfile_write(gz, (Bytef*)RSTRING(str)->ptr, RSTRING(str)->len);
return INT2FIX(RSTRING(str)->len);
}
@ -2848,7 +2848,7 @@ rb_gzwriter_putc(obj, ch)
struct gzfile *gz = get_gzfile(obj);
char c = NUM2CHR(ch);
gzfile_write(gz, &c, 1);
gzfile_write(gz, (Bytef*)&c, 1);
return ch;
}

7
gc.c
Просмотреть файл

@ -772,7 +772,6 @@ gc_mark_children(VALUE ptr, int lev)
case NODE_IF: /* 1,2,3 */
case NODE_FOR:
case NODE_ITER:
case NODE_CREF:
case NODE_WHEN:
case NODE_MASGN:
case NODE_RESCUE:
@ -792,6 +791,7 @@ gc_mark_children(VALUE ptr, int lev)
case NODE_CALL:
case NODE_DEFS:
case NODE_OP_ASGN1:
case NODE_CREF:
gc_mark((VALUE)obj->as.node.u1.node, lev);
/* fall through */
case NODE_SUPER: /* 3 */
@ -1831,11 +1831,13 @@ rb_gc_finalize_deferred(void)
{
RVALUE *p = deferred_final_list;
during_gc++;
deferred_final_list = 0;
if (p) {
finalize_list(p);
}
free_unused_heaps();
during_gc = 0;
}
void
@ -1844,6 +1846,8 @@ rb_gc_call_finalizer_at_exit(void)
RVALUE *p, *pend;
int i;
/* finalizers are part of garbage collection */
during_gc++;
/* run finalizers */
if (need_call_final) {
p = deferred_final_list;
@ -1884,6 +1888,7 @@ rb_gc_call_finalizer_at_exit(void)
p++;
}
}
during_gc = 0;
}
/*

7
io.c
Просмотреть файл

@ -3798,7 +3798,12 @@ rb_obj_display(int argc, VALUE *argv, VALUE self)
void
rb_write_error2(const char *mesg, long len)
{
rb_io_write(rb_stderr, rb_str_new(mesg, len));
if (rb_stderr == orig_stderr || RFILE(orig_stderr)->fptr->fd < 0) {
fwrite(mesg, sizeof(char), len, stderr);
}
else {
rb_io_write(rb_stderr, rb_str_new(mesg, len));
}
}
void

Просмотреть файл

@ -206,7 +206,7 @@ module IRB
begin
load rc_file
rescue LoadError, Errno::ENOENT
rescue
rescue # StandardError, ScriptError
print "load error: #{rc_file}\n"
print $!.class, ": ", $!, "\n"
for err in $@[0, $@.size - 2]
@ -250,7 +250,7 @@ module IRB
for m in @CONF[:LOAD_MODULES]
begin
require m
rescue
rescue # StandardError, ScriptError
print $@[0], ":", $!.class, ": ", $!, "\n"
end
end

2
node.h
Просмотреть файл

@ -225,6 +225,7 @@ typedef struct RNode {
#define nd_modl u1.id
#define nd_clss u1.value
#define nd_vis u2.argc
#define nd_beg u1.node
#define nd_end u2.node
@ -325,7 +326,6 @@ typedef struct RNode {
#define NEW_MODULE(n,b) NEW_NODE(NODE_MODULE,n,NEW_SCOPE(b),0)
#define NEW_COLON2(c,i) NEW_NODE(NODE_COLON2,c,i,0)
#define NEW_COLON3(i) NEW_NODE(NODE_COLON3,0,i,0)
#define NEW_CREF(c) (NEW_NODE(NODE_CREF,0,0,c))
#define NEW_DOT2(b,e) NEW_NODE(NODE_DOT2,b,e,0)
#define NEW_DOT3(b,e) NEW_NODE(NODE_DOT3,b,e,0)
#define NEW_ATTRSET(a) NEW_NODE(NODE_ATTRSET,a,0,0)

13
parse.y
Просмотреть файл

@ -5194,9 +5194,16 @@ parser_parse_string(struct parser_params *parser, NODE *quote)
}
pushback(c);
if (tokadd_string(func, term, paren, &quote->nd_nest) == -1) {
ruby_sourceline = nd_line(quote);
rb_compile_error(PARSER_ARG "unterminated string meets end of file");
return tSTRING_END;
if (func & STR_FUNC_REGEXP) {
ruby_sourceline = nd_line(quote);
rb_compile_error(PARSER_ARG "unterminated regexp meets end of file");
return tREGEXP_END;
}
else {
ruby_sourceline = nd_line(quote);
rb_compile_error(PARSER_ARG "unterminated string meets end of file");
return tSTRING_END;
}
}
tokfix();