parent
3ff53c8e04
commit
5b21e94beb
Notes:
git
2022-07-22 01:42:33 +09:00
528
class.c
528
class.c
@ -106,7 +106,7 @@ rb_class_remove_from_super_subclasses(VALUE klass)
|
||||
next->prev = prev;
|
||||
}
|
||||
|
||||
xfree(entry);
|
||||
xfree(entry);
|
||||
}
|
||||
|
||||
RCLASS_SUBCLASS_ENTRY(klass) = NULL;
|
||||
@ -123,11 +123,11 @@ rb_class_remove_from_module_subclasses(VALUE klass)
|
||||
if (prev) {
|
||||
prev->next = next;
|
||||
}
|
||||
if (next) {
|
||||
if (next) {
|
||||
next->prev = prev;
|
||||
}
|
||||
}
|
||||
|
||||
xfree(entry);
|
||||
xfree(entry);
|
||||
}
|
||||
|
||||
RCLASS_MODULE_SUBCLASS_ENTRY(klass) = NULL;
|
||||
@ -148,11 +148,11 @@ rb_class_foreach_subclass(VALUE klass, void (*f)(VALUE, VALUE), VALUE arg)
|
||||
/* do not be tempted to simplify this loop into a for loop, the order of
|
||||
operations is important here if `f` modifies the linked list */
|
||||
while (cur) {
|
||||
VALUE curklass = cur->klass;
|
||||
cur = cur->next;
|
||||
VALUE curklass = cur->klass;
|
||||
cur = cur->next;
|
||||
// do not trigger GC during f, otherwise the cur will become
|
||||
// a dangling pointer if the subclass is collected
|
||||
f(curklass, arg);
|
||||
f(curklass, arg);
|
||||
}
|
||||
}
|
||||
|
||||
@ -316,13 +316,13 @@ rb_check_inheritable(VALUE super)
|
||||
{
|
||||
if (!RB_TYPE_P(super, T_CLASS)) {
|
||||
rb_raise(rb_eTypeError, "superclass must be an instance of Class (given an instance of %"PRIsVALUE")",
|
||||
rb_obj_class(super));
|
||||
rb_obj_class(super));
|
||||
}
|
||||
if (RBASIC(super)->flags & FL_SINGLETON) {
|
||||
rb_raise(rb_eTypeError, "can't make subclass of singleton class");
|
||||
rb_raise(rb_eTypeError, "can't make subclass of singleton class");
|
||||
}
|
||||
if (super == rb_cClass) {
|
||||
rb_raise(rb_eTypeError, "can't make subclass of Class");
|
||||
rb_raise(rb_eTypeError, "can't make subclass of Class");
|
||||
}
|
||||
}
|
||||
|
||||
@ -344,12 +344,12 @@ static void
|
||||
clone_method(VALUE old_klass, VALUE new_klass, ID mid, const rb_method_entry_t *me)
|
||||
{
|
||||
if (me->def->type == VM_METHOD_TYPE_ISEQ) {
|
||||
rb_cref_t *new_cref;
|
||||
rb_vm_rewrite_cref(me->def->body.iseq.cref, old_klass, new_klass, &new_cref);
|
||||
rb_add_method_iseq(new_klass, mid, me->def->body.iseq.iseqptr, new_cref, METHOD_ENTRY_VISI(me));
|
||||
rb_cref_t *new_cref;
|
||||
rb_vm_rewrite_cref(me->def->body.iseq.cref, old_klass, new_klass, &new_cref);
|
||||
rb_add_method_iseq(new_klass, mid, me->def->body.iseq.iseqptr, new_cref, METHOD_ENTRY_VISI(me));
|
||||
}
|
||||
else {
|
||||
rb_method_entry_set(new_klass, mid, me, METHOD_ENTRY_VISI(me));
|
||||
rb_method_entry_set(new_klass, mid, me, METHOD_ENTRY_VISI(me));
|
||||
}
|
||||
}
|
||||
|
||||
@ -393,13 +393,13 @@ static void
|
||||
class_init_copy_check(VALUE clone, VALUE orig)
|
||||
{
|
||||
if (orig == rb_cBasicObject) {
|
||||
rb_raise(rb_eTypeError, "can't copy the root class");
|
||||
rb_raise(rb_eTypeError, "can't copy the root class");
|
||||
}
|
||||
if (RCLASS_SUPER(clone) != 0 || clone == rb_cBasicObject) {
|
||||
rb_raise(rb_eTypeError, "already initialized class");
|
||||
rb_raise(rb_eTypeError, "already initialized class");
|
||||
}
|
||||
if (FL_TEST(orig, FL_SINGLETON)) {
|
||||
rb_raise(rb_eTypeError, "can't copy singleton class");
|
||||
rb_raise(rb_eTypeError, "can't copy singleton class");
|
||||
}
|
||||
}
|
||||
|
||||
@ -407,31 +407,31 @@ static void
|
||||
copy_tables(VALUE clone, VALUE orig)
|
||||
{
|
||||
if (RCLASS_IV_TBL(clone)) {
|
||||
st_free_table(RCLASS_IV_TBL(clone));
|
||||
RCLASS_IV_TBL(clone) = 0;
|
||||
st_free_table(RCLASS_IV_TBL(clone));
|
||||
RCLASS_IV_TBL(clone) = 0;
|
||||
}
|
||||
if (RCLASS_CONST_TBL(clone)) {
|
||||
rb_free_const_table(RCLASS_CONST_TBL(clone));
|
||||
RCLASS_CONST_TBL(clone) = 0;
|
||||
rb_free_const_table(RCLASS_CONST_TBL(clone));
|
||||
RCLASS_CONST_TBL(clone) = 0;
|
||||
}
|
||||
RCLASS_M_TBL(clone) = 0;
|
||||
if (RCLASS_IV_TBL(orig)) {
|
||||
st_data_t id;
|
||||
st_data_t id;
|
||||
|
||||
rb_iv_tbl_copy(clone, orig);
|
||||
CONST_ID(id, "__tmp_classpath__");
|
||||
st_delete(RCLASS_IV_TBL(clone), &id, 0);
|
||||
CONST_ID(id, "__classpath__");
|
||||
st_delete(RCLASS_IV_TBL(clone), &id, 0);
|
||||
CONST_ID(id, "__classid__");
|
||||
st_delete(RCLASS_IV_TBL(clone), &id, 0);
|
||||
rb_iv_tbl_copy(clone, orig);
|
||||
CONST_ID(id, "__tmp_classpath__");
|
||||
st_delete(RCLASS_IV_TBL(clone), &id, 0);
|
||||
CONST_ID(id, "__classpath__");
|
||||
st_delete(RCLASS_IV_TBL(clone), &id, 0);
|
||||
CONST_ID(id, "__classid__");
|
||||
st_delete(RCLASS_IV_TBL(clone), &id, 0);
|
||||
}
|
||||
if (RCLASS_CONST_TBL(orig)) {
|
||||
struct clone_const_arg arg;
|
||||
struct clone_const_arg arg;
|
||||
|
||||
arg.tbl = RCLASS_CONST_TBL(clone) = rb_id_table_create(0);
|
||||
arg.klass = clone;
|
||||
rb_id_table_foreach(RCLASS_CONST_TBL(orig), clone_const_i, &arg);
|
||||
arg.tbl = RCLASS_CONST_TBL(clone) = rb_id_table_create(0);
|
||||
arg.klass = clone;
|
||||
rb_id_table_foreach(RCLASS_CONST_TBL(orig), clone_const_i, &arg);
|
||||
}
|
||||
}
|
||||
|
||||
@ -493,11 +493,11 @@ rb_mod_init_copy(VALUE clone, VALUE orig)
|
||||
RCLASS_ALLOCATOR(clone) = RCLASS_ALLOCATOR(orig);
|
||||
copy_tables(clone, orig);
|
||||
if (RCLASS_M_TBL(orig)) {
|
||||
struct clone_method_arg arg;
|
||||
arg.old_klass = orig;
|
||||
arg.new_klass = clone;
|
||||
RCLASS_M_TBL_INIT(clone);
|
||||
rb_id_table_foreach(RCLASS_M_TBL(orig), clone_method_i, &arg);
|
||||
struct clone_method_arg arg;
|
||||
arg.old_klass = orig;
|
||||
arg.new_klass = clone;
|
||||
RCLASS_M_TBL_INIT(clone);
|
||||
rb_id_table_foreach(RCLASS_M_TBL(orig), clone_method_i, &arg);
|
||||
}
|
||||
|
||||
if (RCLASS_ORIGIN(orig) == orig) {
|
||||
@ -595,49 +595,49 @@ rb_singleton_class_clone_and_attach(VALUE obj, VALUE attach)
|
||||
return klass;
|
||||
}
|
||||
else {
|
||||
/* copy singleton(unnamed) class */
|
||||
/* copy singleton(unnamed) class */
|
||||
bool klass_of_clone_is_new;
|
||||
VALUE clone = class_alloc(RBASIC(klass)->flags, 0);
|
||||
VALUE clone = class_alloc(RBASIC(klass)->flags, 0);
|
||||
|
||||
if (BUILTIN_TYPE(obj) == T_CLASS) {
|
||||
if (BUILTIN_TYPE(obj) == T_CLASS) {
|
||||
klass_of_clone_is_new = true;
|
||||
RBASIC_SET_CLASS(clone, clone);
|
||||
}
|
||||
else {
|
||||
RBASIC_SET_CLASS(clone, clone);
|
||||
}
|
||||
else {
|
||||
VALUE klass_metaclass_clone = rb_singleton_class_clone(klass);
|
||||
// When `METACLASS_OF(klass) == klass_metaclass_clone`, it means the
|
||||
// recursive call did not clone `METACLASS_OF(klass)`.
|
||||
klass_of_clone_is_new = (METACLASS_OF(klass) != klass_metaclass_clone);
|
||||
RBASIC_SET_CLASS(clone, klass_metaclass_clone);
|
||||
}
|
||||
}
|
||||
|
||||
RCLASS_SET_SUPER(clone, RCLASS_SUPER(klass));
|
||||
RCLASS_ALLOCATOR(clone) = RCLASS_ALLOCATOR(klass);
|
||||
if (RCLASS_IV_TBL(klass)) {
|
||||
rb_iv_tbl_copy(clone, klass);
|
||||
}
|
||||
if (RCLASS_CONST_TBL(klass)) {
|
||||
struct clone_const_arg arg;
|
||||
arg.tbl = RCLASS_CONST_TBL(clone) = rb_id_table_create(0);
|
||||
arg.klass = clone;
|
||||
rb_id_table_foreach(RCLASS_CONST_TBL(klass), clone_const_i, &arg);
|
||||
}
|
||||
if (attach != Qundef) {
|
||||
rb_singleton_class_attached(clone, attach);
|
||||
}
|
||||
RCLASS_M_TBL_INIT(clone);
|
||||
{
|
||||
struct clone_method_arg arg;
|
||||
arg.old_klass = klass;
|
||||
arg.new_klass = clone;
|
||||
rb_id_table_foreach(RCLASS_M_TBL(klass), clone_method_i, &arg);
|
||||
}
|
||||
RCLASS_SET_SUPER(clone, RCLASS_SUPER(klass));
|
||||
RCLASS_ALLOCATOR(clone) = RCLASS_ALLOCATOR(klass);
|
||||
if (RCLASS_IV_TBL(klass)) {
|
||||
rb_iv_tbl_copy(clone, klass);
|
||||
}
|
||||
if (RCLASS_CONST_TBL(klass)) {
|
||||
struct clone_const_arg arg;
|
||||
arg.tbl = RCLASS_CONST_TBL(clone) = rb_id_table_create(0);
|
||||
arg.klass = clone;
|
||||
rb_id_table_foreach(RCLASS_CONST_TBL(klass), clone_const_i, &arg);
|
||||
}
|
||||
if (attach != Qundef) {
|
||||
rb_singleton_class_attached(clone, attach);
|
||||
}
|
||||
RCLASS_M_TBL_INIT(clone);
|
||||
{
|
||||
struct clone_method_arg arg;
|
||||
arg.old_klass = klass;
|
||||
arg.new_klass = clone;
|
||||
rb_id_table_foreach(RCLASS_M_TBL(klass), clone_method_i, &arg);
|
||||
}
|
||||
if (klass_of_clone_is_new) {
|
||||
rb_singleton_class_attached(METACLASS_OF(clone), clone);
|
||||
}
|
||||
FL_SET(clone, FL_SINGLETON);
|
||||
FL_SET(clone, FL_SINGLETON);
|
||||
|
||||
return clone;
|
||||
return clone;
|
||||
}
|
||||
}
|
||||
|
||||
@ -645,7 +645,7 @@ void
|
||||
rb_singleton_class_attached(VALUE klass, VALUE obj)
|
||||
{
|
||||
if (FL_TEST(klass, FL_SINGLETON)) {
|
||||
rb_class_ivar_set(klass, id_attached, obj);
|
||||
rb_class_ivar_set(klass, id_attached, obj);
|
||||
}
|
||||
}
|
||||
|
||||
@ -666,7 +666,7 @@ int
|
||||
rb_singleton_class_internal_p(VALUE sklass)
|
||||
{
|
||||
return (RB_TYPE_P(rb_attr_get(sklass, id_attached), T_CLASS) &&
|
||||
!rb_singleton_class_has_metaclass_p(sklass));
|
||||
!rb_singleton_class_has_metaclass_p(sklass));
|
||||
}
|
||||
|
||||
/*!
|
||||
@ -708,13 +708,13 @@ make_metaclass(VALUE klass)
|
||||
rb_singleton_class_attached(metaclass, klass);
|
||||
|
||||
if (META_CLASS_OF_CLASS_CLASS_P(klass)) {
|
||||
SET_METACLASS_OF(klass, metaclass);
|
||||
SET_METACLASS_OF(metaclass, metaclass);
|
||||
SET_METACLASS_OF(klass, metaclass);
|
||||
SET_METACLASS_OF(metaclass, metaclass);
|
||||
}
|
||||
else {
|
||||
VALUE tmp = METACLASS_OF(klass); /* for a meta^(n)-class klass, tmp is meta^(n)-class of Class class */
|
||||
SET_METACLASS_OF(klass, metaclass);
|
||||
SET_METACLASS_OF(metaclass, ENSURE_EIGENCLASS(tmp));
|
||||
VALUE tmp = METACLASS_OF(klass); /* for a meta^(n)-class klass, tmp is meta^(n)-class of Class class */
|
||||
SET_METACLASS_OF(klass, metaclass);
|
||||
SET_METACLASS_OF(metaclass, ENSURE_EIGENCLASS(tmp));
|
||||
}
|
||||
|
||||
super = RCLASS_SUPER(klass);
|
||||
@ -855,10 +855,10 @@ VALUE
|
||||
rb_make_metaclass(VALUE obj, VALUE unused)
|
||||
{
|
||||
if (BUILTIN_TYPE(obj) == T_CLASS) {
|
||||
return make_metaclass(obj);
|
||||
return make_metaclass(obj);
|
||||
}
|
||||
else {
|
||||
return make_singleton_class(obj);
|
||||
return make_singleton_class(obj);
|
||||
}
|
||||
}
|
||||
|
||||
@ -900,21 +900,21 @@ rb_define_class(const char *name, VALUE super)
|
||||
|
||||
id = rb_intern(name);
|
||||
if (rb_const_defined(rb_cObject, id)) {
|
||||
klass = rb_const_get(rb_cObject, id);
|
||||
if (!RB_TYPE_P(klass, T_CLASS)) {
|
||||
rb_raise(rb_eTypeError, "%s is not a class (%"PRIsVALUE")",
|
||||
name, rb_obj_class(klass));
|
||||
}
|
||||
if (rb_class_real(RCLASS_SUPER(klass)) != super) {
|
||||
rb_raise(rb_eTypeError, "superclass mismatch for class %s", name);
|
||||
}
|
||||
klass = rb_const_get(rb_cObject, id);
|
||||
if (!RB_TYPE_P(klass, T_CLASS)) {
|
||||
rb_raise(rb_eTypeError, "%s is not a class (%"PRIsVALUE")",
|
||||
name, rb_obj_class(klass));
|
||||
}
|
||||
if (rb_class_real(RCLASS_SUPER(klass)) != super) {
|
||||
rb_raise(rb_eTypeError, "superclass mismatch for class %s", name);
|
||||
}
|
||||
|
||||
/* Class may have been defined in Ruby and not pin-rooted */
|
||||
rb_vm_add_root_module(klass);
|
||||
return klass;
|
||||
return klass;
|
||||
}
|
||||
if (!super) {
|
||||
rb_raise(rb_eArgError, "no super class for `%s'", name);
|
||||
rb_raise(rb_eArgError, "no super class for `%s'", name);
|
||||
}
|
||||
klass = rb_define_class_id(id, super);
|
||||
rb_vm_add_root_module(klass);
|
||||
@ -936,26 +936,26 @@ rb_define_class_id_under(VALUE outer, ID id, VALUE super)
|
||||
VALUE klass;
|
||||
|
||||
if (rb_const_defined_at(outer, id)) {
|
||||
klass = rb_const_get_at(outer, id);
|
||||
if (!RB_TYPE_P(klass, T_CLASS)) {
|
||||
rb_raise(rb_eTypeError, "%"PRIsVALUE"::%"PRIsVALUE" is not a class"
|
||||
" (%"PRIsVALUE")",
|
||||
outer, rb_id2str(id), rb_obj_class(klass));
|
||||
}
|
||||
if (rb_class_real(RCLASS_SUPER(klass)) != super) {
|
||||
rb_raise(rb_eTypeError, "superclass mismatch for class "
|
||||
"%"PRIsVALUE"::%"PRIsVALUE""
|
||||
" (%"PRIsVALUE" is given but was %"PRIsVALUE")",
|
||||
outer, rb_id2str(id), RCLASS_SUPER(klass), super);
|
||||
}
|
||||
klass = rb_const_get_at(outer, id);
|
||||
if (!RB_TYPE_P(klass, T_CLASS)) {
|
||||
rb_raise(rb_eTypeError, "%"PRIsVALUE"::%"PRIsVALUE" is not a class"
|
||||
" (%"PRIsVALUE")",
|
||||
outer, rb_id2str(id), rb_obj_class(klass));
|
||||
}
|
||||
if (rb_class_real(RCLASS_SUPER(klass)) != super) {
|
||||
rb_raise(rb_eTypeError, "superclass mismatch for class "
|
||||
"%"PRIsVALUE"::%"PRIsVALUE""
|
||||
" (%"PRIsVALUE" is given but was %"PRIsVALUE")",
|
||||
outer, rb_id2str(id), RCLASS_SUPER(klass), super);
|
||||
}
|
||||
/* Class may have been defined in Ruby and not pin-rooted */
|
||||
rb_vm_add_root_module(klass);
|
||||
|
||||
return klass;
|
||||
return klass;
|
||||
}
|
||||
if (!super) {
|
||||
rb_raise(rb_eArgError, "no super class for `%"PRIsVALUE"::%"PRIsVALUE"'",
|
||||
rb_class_path(outer), rb_id2str(id));
|
||||
rb_raise(rb_eArgError, "no super class for `%"PRIsVALUE"::%"PRIsVALUE"'",
|
||||
rb_class_path(outer), rb_id2str(id));
|
||||
}
|
||||
klass = rb_define_class_id(id, super);
|
||||
rb_set_class_path_string(klass, outer, rb_id2str(id));
|
||||
@ -1010,14 +1010,14 @@ rb_define_module(const char *name)
|
||||
|
||||
id = rb_intern(name);
|
||||
if (rb_const_defined(rb_cObject, id)) {
|
||||
module = rb_const_get(rb_cObject, id);
|
||||
if (!RB_TYPE_P(module, T_MODULE)) {
|
||||
rb_raise(rb_eTypeError, "%s is not a module (%"PRIsVALUE")",
|
||||
name, rb_obj_class(module));
|
||||
}
|
||||
module = rb_const_get(rb_cObject, id);
|
||||
if (!RB_TYPE_P(module, T_MODULE)) {
|
||||
rb_raise(rb_eTypeError, "%s is not a module (%"PRIsVALUE")",
|
||||
name, rb_obj_class(module));
|
||||
}
|
||||
/* Module may have been defined in Ruby and not pin-rooted */
|
||||
rb_vm_add_root_module(module);
|
||||
return module;
|
||||
return module;
|
||||
}
|
||||
module = rb_module_new();
|
||||
rb_vm_add_root_module(module);
|
||||
@ -1038,15 +1038,15 @@ rb_define_module_id_under(VALUE outer, ID id)
|
||||
VALUE module;
|
||||
|
||||
if (rb_const_defined_at(outer, id)) {
|
||||
module = rb_const_get_at(outer, id);
|
||||
if (!RB_TYPE_P(module, T_MODULE)) {
|
||||
rb_raise(rb_eTypeError, "%"PRIsVALUE"::%"PRIsVALUE" is not a module"
|
||||
" (%"PRIsVALUE")",
|
||||
outer, rb_id2str(id), rb_obj_class(module));
|
||||
}
|
||||
module = rb_const_get_at(outer, id);
|
||||
if (!RB_TYPE_P(module, T_MODULE)) {
|
||||
rb_raise(rb_eTypeError, "%"PRIsVALUE"::%"PRIsVALUE" is not a module"
|
||||
" (%"PRIsVALUE")",
|
||||
outer, rb_id2str(id), rb_obj_class(module));
|
||||
}
|
||||
/* Module may have been defined in Ruby and not pin-rooted */
|
||||
rb_gc_register_mark_object(module);
|
||||
return module;
|
||||
return module;
|
||||
}
|
||||
module = rb_module_new();
|
||||
rb_const_set(outer, id, module);
|
||||
@ -1065,14 +1065,14 @@ rb_include_class_new(VALUE module, VALUE super)
|
||||
|
||||
RCLASS_SET_ORIGIN(klass, klass);
|
||||
if (BUILTIN_TYPE(module) == T_ICLASS) {
|
||||
module = METACLASS_OF(module);
|
||||
module = METACLASS_OF(module);
|
||||
}
|
||||
RUBY_ASSERT(!RB_TYPE_P(module, T_ICLASS));
|
||||
if (!RCLASS_IV_TBL(module)) {
|
||||
RCLASS_IV_TBL(module) = st_init_numtable();
|
||||
RCLASS_IV_TBL(module) = st_init_numtable();
|
||||
}
|
||||
if (!RCLASS_CONST_TBL(module)) {
|
||||
RCLASS_CONST_TBL(module) = rb_id_table_create(0);
|
||||
RCLASS_CONST_TBL(module) = rb_id_table_create(0);
|
||||
}
|
||||
RCLASS_IV_TBL(klass) = RCLASS_IV_TBL(module);
|
||||
RCLASS_CVC_TBL(klass) = RCLASS_CVC_TBL(module);
|
||||
@ -1093,7 +1093,7 @@ ensure_includable(VALUE klass, VALUE module)
|
||||
Check_Type(module, T_MODULE);
|
||||
rb_module_set_initialized(module);
|
||||
if (!NIL_P(rb_refinement_module_get_refined_class(module))) {
|
||||
rb_raise(rb_eArgError, "refinement module is not allowed");
|
||||
rb_raise(rb_eArgError, "refinement module is not allowed");
|
||||
}
|
||||
}
|
||||
|
||||
@ -1106,7 +1106,7 @@ rb_include_module(VALUE klass, VALUE module)
|
||||
|
||||
changed = include_modules_at(klass, RCLASS_ORIGIN(klass), module, TRUE);
|
||||
if (changed < 0)
|
||||
rb_raise(rb_eArgError, "cyclic include detected");
|
||||
rb_raise(rb_eArgError, "cyclic include detected");
|
||||
|
||||
if (RB_TYPE_P(klass, T_MODULE)) {
|
||||
rb_subclass_entry_t *iclass = RCLASS_SUBCLASSES(klass);
|
||||
@ -1194,8 +1194,8 @@ do_include_modules_at(const VALUE klass, VALUE c, VALUE module, int search_super
|
||||
|
||||
while (module) {
|
||||
int c_seen = FALSE;
|
||||
int superclass_seen = FALSE;
|
||||
struct rb_id_table *tbl;
|
||||
int superclass_seen = FALSE;
|
||||
struct rb_id_table *tbl;
|
||||
|
||||
if (klass == c) {
|
||||
c_seen = TRUE;
|
||||
@ -1245,8 +1245,8 @@ do_include_modules_at(const VALUE klass, VALUE c, VALUE module, int search_super
|
||||
}
|
||||
|
||||
// setup T_ICLASS for the include/prepend module
|
||||
iclass = rb_include_class_new(module, super_class);
|
||||
c = RCLASS_SET_SUPER(c, iclass);
|
||||
iclass = rb_include_class_new(module, super_class);
|
||||
c = RCLASS_SET_SUPER(c, iclass);
|
||||
RCLASS_SET_INCLUDER(iclass, klass);
|
||||
add_subclass = TRUE;
|
||||
if (module != RCLASS_ORIGIN(module)) {
|
||||
@ -1262,25 +1262,25 @@ do_include_modules_at(const VALUE klass, VALUE c, VALUE module, int search_super
|
||||
add_subclass = FALSE;
|
||||
}
|
||||
|
||||
if (add_subclass) {
|
||||
VALUE m = module;
|
||||
if (add_subclass) {
|
||||
VALUE m = module;
|
||||
if (BUILTIN_TYPE(m) == T_ICLASS) m = METACLASS_OF(m);
|
||||
rb_module_add_to_subclasses_list(m, iclass);
|
||||
}
|
||||
}
|
||||
|
||||
if (BUILTIN_TYPE(klass) == T_MODULE && FL_TEST(klass, RMODULE_IS_REFINEMENT)) {
|
||||
VALUE refined_class =
|
||||
rb_refinement_module_get_refined_class(klass);
|
||||
if (BUILTIN_TYPE(klass) == T_MODULE && FL_TEST(klass, RMODULE_IS_REFINEMENT)) {
|
||||
VALUE refined_class =
|
||||
rb_refinement_module_get_refined_class(klass);
|
||||
|
||||
rb_id_table_foreach(RCLASS_M_TBL(module), add_refined_method_entry_i, (void *)refined_class);
|
||||
RUBY_ASSERT(BUILTIN_TYPE(c) == T_MODULE);
|
||||
}
|
||||
}
|
||||
|
||||
tbl = RCLASS_CONST_TBL(module);
|
||||
if (tbl && rb_id_table_size(tbl))
|
||||
rb_id_table_foreach(tbl, clear_constant_cache_i, NULL);
|
||||
if (tbl && rb_id_table_size(tbl))
|
||||
rb_id_table_foreach(tbl, clear_constant_cache_i, NULL);
|
||||
skip:
|
||||
module = RCLASS_SUPER(module);
|
||||
module = RCLASS_SUPER(module);
|
||||
}
|
||||
|
||||
return method_changed;
|
||||
@ -1302,20 +1302,20 @@ move_refined_method(ID key, VALUE value, void *data)
|
||||
struct rb_id_table *tbl = RCLASS_M_TBL(klass);
|
||||
|
||||
if (me->def->body.refined.orig_me) {
|
||||
const rb_method_entry_t *orig_me = me->def->body.refined.orig_me, *new_me;
|
||||
RB_OBJ_WRITE(me, &me->def->body.refined.orig_me, NULL);
|
||||
new_me = rb_method_entry_clone(me);
|
||||
const rb_method_entry_t *orig_me = me->def->body.refined.orig_me, *new_me;
|
||||
RB_OBJ_WRITE(me, &me->def->body.refined.orig_me, NULL);
|
||||
new_me = rb_method_entry_clone(me);
|
||||
rb_method_table_insert(klass, tbl, key, new_me);
|
||||
rb_method_entry_copy(me, orig_me);
|
||||
return ID_TABLE_CONTINUE;
|
||||
}
|
||||
else {
|
||||
rb_method_entry_copy(me, orig_me);
|
||||
return ID_TABLE_CONTINUE;
|
||||
}
|
||||
else {
|
||||
rb_method_table_insert(klass, tbl, key, me);
|
||||
return ID_TABLE_DELETE;
|
||||
}
|
||||
return ID_TABLE_DELETE;
|
||||
}
|
||||
}
|
||||
else {
|
||||
return ID_TABLE_CONTINUE;
|
||||
return ID_TABLE_CONTINUE;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1339,14 +1339,14 @@ ensure_origin(VALUE klass)
|
||||
{
|
||||
VALUE origin = RCLASS_ORIGIN(klass);
|
||||
if (origin == klass) {
|
||||
origin = class_alloc(T_ICLASS, klass);
|
||||
RCLASS_SET_SUPER(origin, RCLASS_SUPER(klass));
|
||||
RCLASS_SET_SUPER(klass, origin);
|
||||
RCLASS_SET_ORIGIN(klass, origin);
|
||||
RCLASS_M_TBL(origin) = RCLASS_M_TBL(klass);
|
||||
RCLASS_M_TBL_INIT(klass);
|
||||
origin = class_alloc(T_ICLASS, klass);
|
||||
RCLASS_SET_SUPER(origin, RCLASS_SUPER(klass));
|
||||
RCLASS_SET_SUPER(klass, origin);
|
||||
RCLASS_SET_ORIGIN(klass, origin);
|
||||
RCLASS_M_TBL(origin) = RCLASS_M_TBL(klass);
|
||||
RCLASS_M_TBL_INIT(klass);
|
||||
rb_id_table_foreach(RCLASS_M_TBL(origin), cache_clear_refined_method, (void *)klass);
|
||||
rb_id_table_foreach(RCLASS_M_TBL(origin), move_refined_method, (void *)klass);
|
||||
rb_id_table_foreach(RCLASS_M_TBL(origin), move_refined_method, (void *)klass);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
@ -1366,7 +1366,7 @@ rb_prepend_module(VALUE klass, VALUE module)
|
||||
changed = do_include_modules_at(klass, klass, module, FALSE, false);
|
||||
RUBY_ASSERT(changed >= 0); // already checked for cyclic prepend above
|
||||
if (changed) {
|
||||
rb_vm_check_redefinition_by_prepend(klass);
|
||||
rb_vm_check_redefinition_by_prepend(klass);
|
||||
}
|
||||
if (RB_TYPE_P(klass, T_MODULE)) {
|
||||
rb_subclass_entry_t *iclass = RCLASS_SUBCLASSES(klass);
|
||||
@ -1433,10 +1433,10 @@ rb_mod_included_modules(VALUE mod)
|
||||
|
||||
for (p = RCLASS_SUPER(mod); p; p = RCLASS_SUPER(p)) {
|
||||
if (p != origin && RCLASS_ORIGIN(p) == p && BUILTIN_TYPE(p) == T_ICLASS) {
|
||||
VALUE m = METACLASS_OF(p);
|
||||
if (RB_TYPE_P(m, T_MODULE))
|
||||
rb_ary_push(ary, m);
|
||||
}
|
||||
VALUE m = METACLASS_OF(p);
|
||||
if (RB_TYPE_P(m, T_MODULE))
|
||||
rb_ary_push(ary, m);
|
||||
}
|
||||
}
|
||||
return ary;
|
||||
}
|
||||
@ -1468,8 +1468,8 @@ rb_mod_include_p(VALUE mod, VALUE mod2)
|
||||
Check_Type(mod2, T_MODULE);
|
||||
for (p = RCLASS_SUPER(mod); p; p = RCLASS_SUPER(p)) {
|
||||
if (BUILTIN_TYPE(p) == T_ICLASS && !FL_TEST(p, RICLASS_IS_ORIGIN)) {
|
||||
if (METACLASS_OF(p) == mod2) return Qtrue;
|
||||
}
|
||||
if (METACLASS_OF(p) == mod2) return Qtrue;
|
||||
}
|
||||
}
|
||||
return Qfalse;
|
||||
}
|
||||
@ -1504,12 +1504,12 @@ rb_mod_ancestors(VALUE mod)
|
||||
for (p = mod; p; p = RCLASS_SUPER(p)) {
|
||||
if (p == refined_class) break;
|
||||
if (p != RCLASS_ORIGIN(p)) continue;
|
||||
if (BUILTIN_TYPE(p) == T_ICLASS) {
|
||||
rb_ary_push(ary, METACLASS_OF(p));
|
||||
}
|
||||
if (BUILTIN_TYPE(p) == T_ICLASS) {
|
||||
rb_ary_push(ary, METACLASS_OF(p));
|
||||
}
|
||||
else {
|
||||
rb_ary_push(ary, p);
|
||||
}
|
||||
rb_ary_push(ary, p);
|
||||
}
|
||||
}
|
||||
return ary;
|
||||
}
|
||||
@ -1603,10 +1603,10 @@ ins_methods_i(st_data_t name, st_data_t type, st_data_t ary)
|
||||
switch ((rb_method_visibility_t)type) {
|
||||
case METHOD_VISI_UNDEF:
|
||||
case METHOD_VISI_PRIVATE:
|
||||
break;
|
||||
break;
|
||||
default: /* everything but private */
|
||||
ins_methods_push(name, ary);
|
||||
break;
|
||||
ins_methods_push(name, ary);
|
||||
break;
|
||||
}
|
||||
return ST_CONTINUE;
|
||||
}
|
||||
@ -1615,7 +1615,7 @@ static int
|
||||
ins_methods_type_i(st_data_t name, st_data_t type, st_data_t ary, rb_method_visibility_t visi)
|
||||
{
|
||||
if ((rb_method_visibility_t)type == visi) {
|
||||
ins_methods_push(name, ary);
|
||||
ins_methods_push(name, ary);
|
||||
}
|
||||
return ST_CONTINUE;
|
||||
}
|
||||
@ -1642,7 +1642,7 @@ static int
|
||||
ins_methods_undef_i(st_data_t name, st_data_t type, st_data_t ary)
|
||||
{
|
||||
if ((rb_method_visibility_t)type == METHOD_VISI_UNDEF) {
|
||||
ins_methods_push(name, ary);
|
||||
ins_methods_push(name, ary);
|
||||
}
|
||||
return ST_CONTINUE;
|
||||
}
|
||||
@ -1660,20 +1660,20 @@ method_entry_i(ID key, VALUE value, void *data)
|
||||
rb_method_visibility_t type;
|
||||
|
||||
if (me->def->type == VM_METHOD_TYPE_REFINED) {
|
||||
VALUE owner = me->owner;
|
||||
me = rb_resolve_refined_method(Qnil, me);
|
||||
if (!me) return ID_TABLE_CONTINUE;
|
||||
if (!arg->recur && me->owner != owner) return ID_TABLE_CONTINUE;
|
||||
VALUE owner = me->owner;
|
||||
me = rb_resolve_refined_method(Qnil, me);
|
||||
if (!me) return ID_TABLE_CONTINUE;
|
||||
if (!arg->recur && me->owner != owner) return ID_TABLE_CONTINUE;
|
||||
}
|
||||
if (!st_is_member(arg->list, key)) {
|
||||
if (UNDEFINED_METHOD_ENTRY_P(me)) {
|
||||
type = METHOD_VISI_UNDEF; /* none */
|
||||
}
|
||||
else {
|
||||
type = METHOD_ENTRY_VISI(me);
|
||||
RUBY_ASSERT(type != METHOD_VISI_UNDEF);
|
||||
}
|
||||
st_add_direct(arg->list, key, (st_data_t)type);
|
||||
if (UNDEFINED_METHOD_ENTRY_P(me)) {
|
||||
type = METHOD_VISI_UNDEF; /* none */
|
||||
}
|
||||
else {
|
||||
type = METHOD_ENTRY_VISI(me);
|
||||
RUBY_ASSERT(type != METHOD_VISI_UNDEF);
|
||||
}
|
||||
st_add_direct(arg->list, key, (st_data_t)type);
|
||||
}
|
||||
return ID_TABLE_CONTINUE;
|
||||
}
|
||||
@ -1714,14 +1714,14 @@ class_instance_method_list(int argc, const VALUE *argv, VALUE mod, int obj, int
|
||||
}
|
||||
|
||||
if (!recur && RCLASS_ORIGIN(mod) != mod) {
|
||||
mod = RCLASS_ORIGIN(mod);
|
||||
prepended = 1;
|
||||
mod = RCLASS_ORIGIN(mod);
|
||||
prepended = 1;
|
||||
}
|
||||
|
||||
for (; mod; mod = RCLASS_SUPER(mod)) {
|
||||
add_instance_method_list(mod, &me_arg);
|
||||
if (BUILTIN_TYPE(mod) == T_ICLASS && !prepended) continue;
|
||||
if (!recur) break;
|
||||
if (BUILTIN_TYPE(mod) == T_ICLASS && !prepended) continue;
|
||||
if (!recur) break;
|
||||
}
|
||||
ary = rb_ary_new2(me_arg.list->num_entries);
|
||||
st_foreach(me_arg.list, func, ary);
|
||||
@ -1866,7 +1866,7 @@ rb_obj_methods(int argc, const VALUE *argv, VALUE obj)
|
||||
{
|
||||
rb_check_arity(argc, 0, 1);
|
||||
if (argc > 0 && !RTEST(argv[0])) {
|
||||
return rb_obj_singleton_methods(argc, argv, obj);
|
||||
return rb_obj_singleton_methods(argc, argv, obj);
|
||||
}
|
||||
return class_instance_method_list(argc, argv, CLASS_OF(obj), 1, ins_methods_i);
|
||||
}
|
||||
@ -1966,14 +1966,14 @@ rb_obj_singleton_methods(int argc, const VALUE *argv, VALUE obj)
|
||||
me_arg.list = st_init_numtable();
|
||||
me_arg.recur = recur;
|
||||
if (klass && FL_TEST(klass, FL_SINGLETON)) {
|
||||
if ((mtbl = RCLASS_M_TBL(origin)) != 0) rb_id_table_foreach(mtbl, method_entry_i, &me_arg);
|
||||
klass = RCLASS_SUPER(klass);
|
||||
if ((mtbl = RCLASS_M_TBL(origin)) != 0) rb_id_table_foreach(mtbl, method_entry_i, &me_arg);
|
||||
klass = RCLASS_SUPER(klass);
|
||||
}
|
||||
if (recur) {
|
||||
while (klass && (FL_TEST(klass, FL_SINGLETON) || RB_TYPE_P(klass, T_ICLASS))) {
|
||||
if (klass != origin && (mtbl = RCLASS_M_TBL(klass)) != 0) rb_id_table_foreach(mtbl, method_entry_i, &me_arg);
|
||||
klass = RCLASS_SUPER(klass);
|
||||
}
|
||||
while (klass && (FL_TEST(klass, FL_SINGLETON) || RB_TYPE_P(klass, T_ICLASS))) {
|
||||
if (klass != origin && (mtbl = RCLASS_M_TBL(klass)) != 0) rb_id_table_foreach(mtbl, method_entry_i, &me_arg);
|
||||
klass = RCLASS_SUPER(klass);
|
||||
}
|
||||
}
|
||||
ary = rb_ary_new2(me_arg.list->num_entries);
|
||||
st_foreach(me_arg.list, ins_methods_i, ary);
|
||||
@ -2045,7 +2045,7 @@ rb_undef_methods_from(VALUE klass, VALUE super)
|
||||
{
|
||||
struct rb_id_table *mtbl = RCLASS_M_TBL(super);
|
||||
if (mtbl) {
|
||||
rb_id_table_foreach(mtbl, undef_method_i, (void *)klass);
|
||||
rb_id_table_foreach(mtbl, undef_method_i, (void *)klass);
|
||||
}
|
||||
}
|
||||
|
||||
@ -2093,15 +2093,15 @@ singleton_class_of(VALUE obj)
|
||||
case T_BIGNUM:
|
||||
case T_FLOAT:
|
||||
case T_SYMBOL:
|
||||
rb_raise(rb_eTypeError, "can't define singleton");
|
||||
rb_raise(rb_eTypeError, "can't define singleton");
|
||||
|
||||
case T_FALSE:
|
||||
case T_TRUE:
|
||||
case T_NIL:
|
||||
klass = special_singleton_class_of(obj);
|
||||
if (NIL_P(klass))
|
||||
rb_bug("unknown immediate %p", (void *)obj);
|
||||
return klass;
|
||||
klass = special_singleton_class_of(obj);
|
||||
if (NIL_P(klass))
|
||||
rb_bug("unknown immediate %p", (void *)obj);
|
||||
return klass;
|
||||
|
||||
case T_STRING:
|
||||
if (FL_TEST_RAW(obj, RSTRING_FSTR)) {
|
||||
@ -2112,9 +2112,9 @@ singleton_class_of(VALUE obj)
|
||||
klass = METACLASS_OF(obj);
|
||||
if (!(FL_TEST(klass, FL_SINGLETON) &&
|
||||
rb_attr_get(klass, id_attached) == obj)) {
|
||||
rb_serial_t serial = RCLASS_SERIAL(klass);
|
||||
klass = rb_make_metaclass(obj, klass);
|
||||
RCLASS_SERIAL(klass) = serial;
|
||||
rb_serial_t serial = RCLASS_SERIAL(klass);
|
||||
klass = rb_make_metaclass(obj, klass);
|
||||
RCLASS_SERIAL(klass) = serial;
|
||||
}
|
||||
|
||||
RB_FL_SET_RAW(klass, RB_OBJ_FROZEN_RAW(obj));
|
||||
@ -2127,11 +2127,11 @@ rb_freeze_singleton_class(VALUE x)
|
||||
{
|
||||
/* should not propagate to meta-meta-class, and so on */
|
||||
if (!(RBASIC(x)->flags & FL_SINGLETON)) {
|
||||
VALUE klass = RBASIC_CLASS(x);
|
||||
if (klass && (klass = RCLASS_ORIGIN(klass)) != 0 &&
|
||||
FL_TEST(klass, (FL_SINGLETON|FL_FREEZE)) == FL_SINGLETON) {
|
||||
OBJ_FREEZE_RAW(klass);
|
||||
}
|
||||
VALUE klass = RBASIC_CLASS(x);
|
||||
if (klass && (klass = RCLASS_ORIGIN(klass)) != 0 &&
|
||||
FL_TEST(klass, (FL_SINGLETON|FL_FREEZE)) == FL_SINGLETON) {
|
||||
OBJ_FREEZE_RAW(klass);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -2148,7 +2148,7 @@ rb_singleton_class_get(VALUE obj)
|
||||
VALUE klass;
|
||||
|
||||
if (SPECIAL_CONST_P(obj)) {
|
||||
return rb_special_singleton_class(obj);
|
||||
return rb_special_singleton_class(obj);
|
||||
}
|
||||
klass = METACLASS_OF(obj);
|
||||
if (!FL_TEST(klass, FL_SINGLETON)) return Qnil;
|
||||
@ -2223,13 +2223,13 @@ rb_keyword_error_new(const char *error, VALUE keys)
|
||||
VALUE error_message = rb_sprintf("%s keyword%.*s", error, len > 1, "s");
|
||||
|
||||
if (len > 0) {
|
||||
rb_str_cat_cstr(error_message, ": ");
|
||||
while (1) {
|
||||
rb_str_cat_cstr(error_message, ": ");
|
||||
while (1) {
|
||||
const VALUE k = RARRAY_AREF(keys, i);
|
||||
rb_str_append(error_message, rb_inspect(k));
|
||||
if (++i >= len) break;
|
||||
rb_str_cat_cstr(error_message, ", ");
|
||||
}
|
||||
rb_str_append(error_message, rb_inspect(k));
|
||||
if (++i >= len) break;
|
||||
rb_str_cat_cstr(error_message, ", ");
|
||||
}
|
||||
}
|
||||
|
||||
return rb_exc_new_str(rb_eArgError, error_message);
|
||||
@ -2248,7 +2248,7 @@ unknown_keyword_error(VALUE hash, const ID *table, int keywords)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < keywords; i++) {
|
||||
st_data_t key = ID2SYM(table[i]);
|
||||
st_data_t key = ID2SYM(table[i]);
|
||||
rb_hash_stlike_delete(hash, &key, NULL);
|
||||
}
|
||||
rb_keyword_error("unknown", rb_hash_keys(hash));
|
||||
@ -2272,8 +2272,8 @@ rb_extract_keywords(VALUE *orighash)
|
||||
VALUE hash = *orighash;
|
||||
|
||||
if (RHASH_EMPTY_P(hash)) {
|
||||
*orighash = 0;
|
||||
return hash;
|
||||
*orighash = 0;
|
||||
return hash;
|
||||
}
|
||||
rb_hash_foreach(hash, separate_symbol, (st_data_t)&parthash);
|
||||
*orighash = parthash[1];
|
||||
@ -2299,36 +2299,36 @@ rb_get_kwargs(VALUE keyword_hash, const ID *table, int required, int optional, V
|
||||
if (NIL_P(keyword_hash)) keyword_hash = 0;
|
||||
|
||||
if (optional < 0) {
|
||||
rest = 1;
|
||||
optional = -1-optional;
|
||||
rest = 1;
|
||||
optional = -1-optional;
|
||||
}
|
||||
if (required) {
|
||||
for (; i < required; i++) {
|
||||
VALUE keyword = ID2SYM(table[i]);
|
||||
if (keyword_hash) {
|
||||
for (; i < required; i++) {
|
||||
VALUE keyword = ID2SYM(table[i]);
|
||||
if (keyword_hash) {
|
||||
if (extract_kwarg(keyword, values[i])) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if (NIL_P(missing)) missing = rb_ary_tmp_new(1);
|
||||
rb_ary_push(missing, keyword);
|
||||
}
|
||||
if (!NIL_P(missing)) {
|
||||
rb_keyword_error("missing", missing);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if (NIL_P(missing)) missing = rb_ary_tmp_new(1);
|
||||
rb_ary_push(missing, keyword);
|
||||
}
|
||||
if (!NIL_P(missing)) {
|
||||
rb_keyword_error("missing", missing);
|
||||
}
|
||||
}
|
||||
j = i;
|
||||
if (optional && keyword_hash) {
|
||||
for (i = 0; i < optional; i++) {
|
||||
for (i = 0; i < optional; i++) {
|
||||
if (extract_kwarg(ID2SYM(table[required+i]), values[required+i])) {
|
||||
j++;
|
||||
}
|
||||
}
|
||||
j++;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!rest && keyword_hash) {
|
||||
if (RHASH_SIZE(keyword_hash) > (unsigned int)(values ? 0 : j)) {
|
||||
unknown_keyword_error(keyword_hash, table, required+optional);
|
||||
}
|
||||
if (RHASH_SIZE(keyword_hash) > (unsigned int)(values ? 0 : j)) {
|
||||
unknown_keyword_error(keyword_hash, table, required+optional);
|
||||
}
|
||||
}
|
||||
if (values && !keyword_hash) {
|
||||
for (i = 0; i < required + optional; i++) {
|
||||
@ -2359,30 +2359,30 @@ rb_scan_args_parse(int kw_flag, const char *fmt, struct rb_scan_args_t *arg)
|
||||
|
||||
if (ISDIGIT(*p)) {
|
||||
arg->n_lead = *p - '0';
|
||||
p++;
|
||||
if (ISDIGIT(*p)) {
|
||||
p++;
|
||||
if (ISDIGIT(*p)) {
|
||||
arg->n_opt = *p - '0';
|
||||
p++;
|
||||
}
|
||||
p++;
|
||||
}
|
||||
}
|
||||
if (*p == '*') {
|
||||
arg->f_var = 1;
|
||||
p++;
|
||||
p++;
|
||||
}
|
||||
if (ISDIGIT(*p)) {
|
||||
arg->n_trail = *p - '0';
|
||||
p++;
|
||||
p++;
|
||||
}
|
||||
if (*p == ':') {
|
||||
arg->f_hash = 1;
|
||||
p++;
|
||||
p++;
|
||||
}
|
||||
if (*p == '&') {
|
||||
arg->f_block = 1;
|
||||
p++;
|
||||
p++;
|
||||
}
|
||||
if (*p != '\0') {
|
||||
rb_fatal("bad scan arg format: %s", fmt);
|
||||
rb_fatal("bad scan arg format: %s", fmt);
|
||||
}
|
||||
}
|
||||
|
||||
@ -2418,37 +2418,37 @@ rb_scan_args_assign(const struct rb_scan_args_t *arg, int argc, const VALUE *con
|
||||
for (i = 0; i < n_lead; i++) {
|
||||
var = rb_scan_args_next_param();
|
||||
if (var) *var = argv[argi];
|
||||
argi++;
|
||||
argi++;
|
||||
}
|
||||
/* capture optional arguments */
|
||||
for (i = 0; i < n_opt; i++) {
|
||||
var = rb_scan_args_next_param();
|
||||
if (argi < argc - n_trail) {
|
||||
if (var) *var = argv[argi];
|
||||
argi++;
|
||||
}
|
||||
else {
|
||||
if (var) *var = Qnil;
|
||||
}
|
||||
argi++;
|
||||
}
|
||||
else {
|
||||
if (var) *var = Qnil;
|
||||
}
|
||||
}
|
||||
/* capture variable length arguments */
|
||||
if (f_var) {
|
||||
int n_var = argc - argi - n_trail;
|
||||
|
||||
var = rb_scan_args_next_param();
|
||||
if (0 < n_var) {
|
||||
if (0 < n_var) {
|
||||
if (var) *var = rb_ary_new_from_values(n_var, &argv[argi]);
|
||||
argi += n_var;
|
||||
}
|
||||
else {
|
||||
if (var) *var = rb_ary_new();
|
||||
}
|
||||
argi += n_var;
|
||||
}
|
||||
else {
|
||||
if (var) *var = rb_ary_new();
|
||||
}
|
||||
}
|
||||
/* capture trailing mandatory arguments */
|
||||
for (i = 0; i < n_trail; i++) {
|
||||
var = rb_scan_args_next_param();
|
||||
if (var) *var = argv[argi];
|
||||
argi++;
|
||||
argi++;
|
||||
}
|
||||
/* capture an option hash - phase 2: assignment */
|
||||
if (f_hash) {
|
||||
@ -2458,12 +2458,12 @@ rb_scan_args_assign(const struct rb_scan_args_t *arg, int argc, const VALUE *con
|
||||
/* capture iterator block */
|
||||
if (f_block) {
|
||||
var = rb_scan_args_next_param();
|
||||
if (rb_block_given_p()) {
|
||||
*var = rb_block_proc();
|
||||
}
|
||||
else {
|
||||
*var = Qnil;
|
||||
}
|
||||
if (rb_block_given_p()) {
|
||||
*var = rb_block_proc();
|
||||
}
|
||||
else {
|
||||
*var = Qnil;
|
||||
}
|
||||
}
|
||||
|
||||
if (argi == argc) {
|
||||
|
14
compar.c
14
compar.c
@ -30,13 +30,13 @@ rb_cmperr(VALUE x, VALUE y)
|
||||
VALUE classname;
|
||||
|
||||
if (SPECIAL_CONST_P(y) || BUILTIN_TYPE(y) == T_FLOAT) {
|
||||
classname = rb_inspect(y);
|
||||
classname = rb_inspect(y);
|
||||
}
|
||||
else {
|
||||
classname = rb_obj_class(y);
|
||||
classname = rb_obj_class(y);
|
||||
}
|
||||
rb_raise(rb_eArgError, "comparison of %"PRIsVALUE" with %"PRIsVALUE" failed",
|
||||
rb_obj_class(x), classname);
|
||||
rb_obj_class(x), classname);
|
||||
}
|
||||
|
||||
static VALUE
|
||||
@ -51,11 +51,11 @@ rb_invcmp(VALUE x, VALUE y)
|
||||
{
|
||||
VALUE invcmp = rb_exec_recursive(invcmp_recursive, x, y);
|
||||
if (invcmp == Qundef || NIL_P(invcmp)) {
|
||||
return Qnil;
|
||||
return Qnil;
|
||||
}
|
||||
else {
|
||||
int result = -rb_cmpint(invcmp, x, y);
|
||||
return INT2FIX(result);
|
||||
int result = -rb_cmpint(invcmp, x, y);
|
||||
return INT2FIX(result);
|
||||
}
|
||||
}
|
||||
|
||||
@ -229,7 +229,7 @@ cmp_clamp(int argc, VALUE *argv, VALUE x)
|
||||
}
|
||||
}
|
||||
if (!NIL_P(min) && !NIL_P(max) && cmpint(min, max) > 0) {
|
||||
rb_raise(rb_eArgError, "min argument must be smaller than max argument");
|
||||
rb_raise(rb_eArgError, "min argument must be smaller than max argument");
|
||||
}
|
||||
|
||||
if (!NIL_P(min)) {
|
||||
|
118
debug.c
118
debug.c
@ -64,23 +64,23 @@ const union {
|
||||
enum ruby_rarray_flags rarray_flags;
|
||||
enum ruby_rarray_consts rarray_consts;
|
||||
enum {
|
||||
RUBY_FMODE_READABLE = FMODE_READABLE,
|
||||
RUBY_FMODE_WRITABLE = FMODE_WRITABLE,
|
||||
RUBY_FMODE_READWRITE = FMODE_READWRITE,
|
||||
RUBY_FMODE_BINMODE = FMODE_BINMODE,
|
||||
RUBY_FMODE_SYNC = FMODE_SYNC,
|
||||
RUBY_FMODE_TTY = FMODE_TTY,
|
||||
RUBY_FMODE_DUPLEX = FMODE_DUPLEX,
|
||||
RUBY_FMODE_APPEND = FMODE_APPEND,
|
||||
RUBY_FMODE_CREATE = FMODE_CREATE,
|
||||
RUBY_FMODE_NOREVLOOKUP = 0x00000100,
|
||||
RUBY_FMODE_TRUNC = FMODE_TRUNC,
|
||||
RUBY_FMODE_TEXTMODE = FMODE_TEXTMODE,
|
||||
RUBY_FMODE_PREP = 0x00010000,
|
||||
RUBY_FMODE_SETENC_BY_BOM = FMODE_SETENC_BY_BOM,
|
||||
RUBY_FMODE_UNIX = 0x00200000,
|
||||
RUBY_FMODE_INET = 0x00400000,
|
||||
RUBY_FMODE_INET6 = 0x00800000,
|
||||
RUBY_FMODE_READABLE = FMODE_READABLE,
|
||||
RUBY_FMODE_WRITABLE = FMODE_WRITABLE,
|
||||
RUBY_FMODE_READWRITE = FMODE_READWRITE,
|
||||
RUBY_FMODE_BINMODE = FMODE_BINMODE,
|
||||
RUBY_FMODE_SYNC = FMODE_SYNC,
|
||||
RUBY_FMODE_TTY = FMODE_TTY,
|
||||
RUBY_FMODE_DUPLEX = FMODE_DUPLEX,
|
||||
RUBY_FMODE_APPEND = FMODE_APPEND,
|
||||
RUBY_FMODE_CREATE = FMODE_CREATE,
|
||||
RUBY_FMODE_NOREVLOOKUP = 0x00000100,
|
||||
RUBY_FMODE_TRUNC = FMODE_TRUNC,
|
||||
RUBY_FMODE_TEXTMODE = FMODE_TEXTMODE,
|
||||
RUBY_FMODE_PREP = 0x00010000,
|
||||
RUBY_FMODE_SETENC_BY_BOM = FMODE_SETENC_BY_BOM,
|
||||
RUBY_FMODE_UNIX = 0x00200000,
|
||||
RUBY_FMODE_INET = 0x00400000,
|
||||
RUBY_FMODE_INET6 = 0x00800000,
|
||||
|
||||
RUBY_NODE_TYPESHIFT = NODE_TYPESHIFT,
|
||||
RUBY_NODE_TYPEMASK = NODE_TYPEMASK,
|
||||
@ -88,9 +88,9 @@ const union {
|
||||
RUBY_NODE_FL_NEWLINE = NODE_FL_NEWLINE
|
||||
} various;
|
||||
union {
|
||||
enum imemo_type types;
|
||||
enum {RUBY_IMEMO_MASK = IMEMO_MASK} mask;
|
||||
struct RIMemo *ptr;
|
||||
enum imemo_type types;
|
||||
enum {RUBY_IMEMO_MASK = IMEMO_MASK} mask;
|
||||
struct RIMemo *ptr;
|
||||
} imemo;
|
||||
struct RSymbol *symbol_ptr;
|
||||
enum vm_call_flag_bits vm_call_flags;
|
||||
@ -102,9 +102,9 @@ int
|
||||
ruby_debug_print_indent(int level, int debug_level, int indent_level)
|
||||
{
|
||||
if (level < debug_level) {
|
||||
fprintf(stderr, "%*s", indent_level, "");
|
||||
fflush(stderr);
|
||||
return TRUE;
|
||||
fprintf(stderr, "%*s", indent_level, "");
|
||||
fflush(stderr);
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
@ -124,11 +124,11 @@ VALUE
|
||||
ruby_debug_print_value(int level, int debug_level, const char *header, VALUE obj)
|
||||
{
|
||||
if (level < debug_level) {
|
||||
char buff[0x100];
|
||||
rb_raw_obj_info(buff, 0x100, obj);
|
||||
char buff[0x100];
|
||||
rb_raw_obj_info(buff, 0x100, obj);
|
||||
|
||||
fprintf(stderr, "DBG> %s: %s\n", header, buff);
|
||||
fflush(stderr);
|
||||
fprintf(stderr, "DBG> %s: %s\n", header, buff);
|
||||
fflush(stderr);
|
||||
}
|
||||
return obj;
|
||||
}
|
||||
@ -143,8 +143,8 @@ ID
|
||||
ruby_debug_print_id(int level, int debug_level, const char *header, ID id)
|
||||
{
|
||||
if (level < debug_level) {
|
||||
fprintf(stderr, "DBG> %s: %s\n", header, rb_id2name(id));
|
||||
fflush(stderr);
|
||||
fprintf(stderr, "DBG> %s: %s\n", header, rb_id2name(id));
|
||||
fflush(stderr);
|
||||
}
|
||||
return id;
|
||||
}
|
||||
@ -153,8 +153,8 @@ NODE *
|
||||
ruby_debug_print_node(int level, int debug_level, const char *header, const NODE *node)
|
||||
{
|
||||
if (level < debug_level) {
|
||||
fprintf(stderr, "DBG> %s: %s (%u)\n", header,
|
||||
ruby_node_name(nd_type(node)), nd_line(node));
|
||||
fprintf(stderr, "DBG> %s: %s (%u)\n", header,
|
||||
ruby_node_name(nd_type(node)), nd_line(node));
|
||||
}
|
||||
return (NODE *)node;
|
||||
}
|
||||
@ -184,11 +184,11 @@ ruby_env_debug_option(const char *str, int len, void *arg)
|
||||
size_t retlen;
|
||||
unsigned long n;
|
||||
#define SET_WHEN(name, var, val) do { \
|
||||
if (len == sizeof(name) - 1 && \
|
||||
strncmp(str, (name), len) == 0) { \
|
||||
(var) = (val); \
|
||||
return 1; \
|
||||
} \
|
||||
if (len == sizeof(name) - 1 && \
|
||||
strncmp(str, (name), len) == 0) { \
|
||||
(var) = (val); \
|
||||
return 1; \
|
||||
} \
|
||||
} while (0)
|
||||
#define NAME_MATCH_VALUE(name) \
|
||||
((size_t)len >= sizeof(name)-1 && \
|
||||
@ -197,24 +197,24 @@ ruby_env_debug_option(const char *str, int len, void *arg)
|
||||
(str[sizeof(name)-1] == '=' && \
|
||||
(str += sizeof(name), len -= sizeof(name), 1))))
|
||||
#define SET_UINT(val) do { \
|
||||
n = ruby_scan_digits(str, len, 10, &retlen, &ov); \
|
||||
if (!ov && retlen) { \
|
||||
val = (unsigned int)n; \
|
||||
} \
|
||||
str += retlen; \
|
||||
len -= retlen; \
|
||||
n = ruby_scan_digits(str, len, 10, &retlen, &ov); \
|
||||
if (!ov && retlen) { \
|
||||
val = (unsigned int)n; \
|
||||
} \
|
||||
str += retlen; \
|
||||
len -= retlen; \
|
||||
} while (0)
|
||||
#define SET_UINT_LIST(name, vals, num) do { \
|
||||
int i; \
|
||||
for (i = 0; i < (num); ++i) { \
|
||||
SET_UINT((vals)[i]); \
|
||||
if (!len || *str != ':') break; \
|
||||
++str; \
|
||||
--len; \
|
||||
} \
|
||||
if (len > 0) { \
|
||||
fprintf(stderr, "ignored "name" option: `%.*s'\n", len, str); \
|
||||
} \
|
||||
int i; \
|
||||
for (i = 0; i < (num); ++i) { \
|
||||
SET_UINT((vals)[i]); \
|
||||
if (!len || *str != ':') break; \
|
||||
++str; \
|
||||
--len; \
|
||||
} \
|
||||
if (len > 0) { \
|
||||
fprintf(stderr, "ignored "name" option: `%.*s'\n", len, str); \
|
||||
} \
|
||||
} while (0)
|
||||
#define SET_WHEN_UINT(name, vals, num, req) \
|
||||
if (NAME_MATCH_VALUE(name)) SET_UINT_LIST(name, vals, num);
|
||||
@ -223,9 +223,9 @@ ruby_env_debug_option(const char *str, int len, void *arg)
|
||||
SET_WHEN("core", ruby_enable_coredump, 1);
|
||||
SET_WHEN("ci", ruby_on_ci, 1);
|
||||
if (NAME_MATCH_VALUE("rgengc")) {
|
||||
if (!len) ruby_rgengc_debug = 1;
|
||||
else SET_UINT_LIST("rgengc", &ruby_rgengc_debug, 1);
|
||||
return 1;
|
||||
if (!len) ruby_rgengc_debug = 1;
|
||||
else SET_UINT_LIST("rgengc", &ruby_rgengc_debug, 1);
|
||||
return 1;
|
||||
}
|
||||
#if defined _WIN32
|
||||
# if RUBY_MSVCRT_VERSION >= 80
|
||||
@ -234,9 +234,9 @@ ruby_env_debug_option(const char *str, int len, void *arg)
|
||||
#endif
|
||||
#if defined _WIN32 || defined __CYGWIN__
|
||||
if (NAME_MATCH_VALUE("codepage")) {
|
||||
if (!len) fprintf(stderr, "missing codepage argument");
|
||||
else SET_UINT_LIST("codepage", ruby_w32_codepage, numberof(ruby_w32_codepage));
|
||||
return 1;
|
||||
if (!len) fprintf(stderr, "missing codepage argument");
|
||||
else SET_UINT_LIST("codepage", ruby_w32_codepage, numberof(ruby_w32_codepage));
|
||||
return 1;
|
||||
}
|
||||
#endif
|
||||
return 0;
|
||||
@ -246,7 +246,7 @@ static void
|
||||
set_debug_option(const char *str, int len, void *arg)
|
||||
{
|
||||
if (!ruby_env_debug_option(str, len, arg)) {
|
||||
fprintf(stderr, "unexpected debug option: %.*s\n", len, str);
|
||||
fprintf(stderr, "unexpected debug option: %.*s\n", len, str);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -103,13 +103,13 @@ rb_debug_counter_show_results(const char *msg)
|
||||
setlocale(LC_NUMERIC, "");
|
||||
|
||||
if (env == NULL || strcmp("1", env) != 0) {
|
||||
int i;
|
||||
int i;
|
||||
fprintf(stderr, "[RUBY_DEBUG_COUNTER]\t%d %s\n", getpid(), msg);
|
||||
for (i=0; i<RB_DEBUG_COUNTER_MAX; i++) {
|
||||
for (i=0; i<RB_DEBUG_COUNTER_MAX; i++) {
|
||||
fprintf(stderr, "[RUBY_DEBUG_COUNTER]\t%-30s\t%'14"PRIuSIZE"\n",
|
||||
debug_counter_names[i],
|
||||
rb_debug_counter[i]);
|
||||
}
|
||||
debug_counter_names[i],
|
||||
rb_debug_counter[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
150
dln.c
150
dln.c
@ -110,8 +110,8 @@ init_funcname_len(const char **file)
|
||||
|
||||
/* Load the file as an object one */
|
||||
for (base = p; *p; p++) { /* Find position of last '/' */
|
||||
if (*p == '.' && !dot) dot = p;
|
||||
if (isdirsep(*p)) base = p+1, dot = NULL;
|
||||
if (*p == '.' && !dot) dot = p;
|
||||
if (isdirsep(*p)) base = p+1, dot = NULL;
|
||||
}
|
||||
*file = base;
|
||||
/* Delete suffix if it exists */
|
||||
@ -126,7 +126,7 @@ static const char funcname_prefix[sizeof(FUNCNAME_PREFIX) - 1] = FUNCNAME_PREFIX
|
||||
const size_t plen = sizeof(funcname_prefix);\
|
||||
char *const tmp = ALLOCA_N(char, plen+flen+1);\
|
||||
if (!tmp) {\
|
||||
dln_memerror();\
|
||||
dln_memerror();\
|
||||
}\
|
||||
memcpy(tmp, funcname_prefix, plen);\
|
||||
memcpy(tmp+plen, base, flen);\
|
||||
@ -170,14 +170,14 @@ dln_strerror(char *message, size_t size)
|
||||
size_t len = snprintf(message, size, "%d: ", error);
|
||||
|
||||
#define format_message(sublang) FormatMessage(\
|
||||
FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, \
|
||||
NULL, error, MAKELANGID(LANG_NEUTRAL, (sublang)), \
|
||||
message + len, size - len, NULL)
|
||||
FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, \
|
||||
NULL, error, MAKELANGID(LANG_NEUTRAL, (sublang)), \
|
||||
message + len, size - len, NULL)
|
||||
if (format_message(SUBLANG_ENGLISH_US) == 0)
|
||||
format_message(SUBLANG_DEFAULT);
|
||||
format_message(SUBLANG_DEFAULT);
|
||||
for (p = message + len; *p; p++) {
|
||||
if (*p == '\n' || *p == '\r')
|
||||
*p = ' ';
|
||||
if (*p == '\n' || *p == '\r')
|
||||
*p = ' ';
|
||||
}
|
||||
return message;
|
||||
}
|
||||
@ -200,18 +200,18 @@ aix_loaderror(const char *pathname)
|
||||
snprintf(errbuf, sizeof(errbuf), "load failed - %s. ", pathname);
|
||||
|
||||
if (loadquery(L_GETMESSAGES, &message[0], sizeof(message)) != -1) {
|
||||
ERRBUF_APPEND("Please issue below command for detailed reasons:\n\t");
|
||||
ERRBUF_APPEND("/usr/sbin/execerror ruby ");
|
||||
for (i=0; message[i]; i++) {
|
||||
ERRBUF_APPEND("\"");
|
||||
ERRBUF_APPEND(message[i]);
|
||||
ERRBUF_APPEND("\" ");
|
||||
}
|
||||
ERRBUF_APPEND("\n");
|
||||
ERRBUF_APPEND("Please issue below command for detailed reasons:\n\t");
|
||||
ERRBUF_APPEND("/usr/sbin/execerror ruby ");
|
||||
for (i=0; message[i]; i++) {
|
||||
ERRBUF_APPEND("\"");
|
||||
ERRBUF_APPEND(message[i]);
|
||||
ERRBUF_APPEND("\" ");
|
||||
}
|
||||
ERRBUF_APPEND("\n");
|
||||
}
|
||||
else {
|
||||
ERRBUF_APPEND(strerror(errno));
|
||||
ERRBUF_APPEND("[loadquery failed]");
|
||||
ERRBUF_APPEND(strerror(errno));
|
||||
ERRBUF_APPEND("[loadquery failed]");
|
||||
}
|
||||
dln_loaderror("%s", errbuf);
|
||||
}
|
||||
@ -229,22 +229,22 @@ rb_w32_check_imported(HMODULE ext, HMODULE mine)
|
||||
desc = ImageDirectoryEntryToData(ext, TRUE, IMAGE_DIRECTORY_ENTRY_IMPORT, &size);
|
||||
if (!desc) return 0;
|
||||
while (desc->Name) {
|
||||
PIMAGE_THUNK_DATA pint = (PIMAGE_THUNK_DATA)((char *)ext + desc->Characteristics);
|
||||
PIMAGE_THUNK_DATA piat = (PIMAGE_THUNK_DATA)((char *)ext + desc->FirstThunk);
|
||||
for (; piat->u1.Function; piat++, pint++) {
|
||||
static const char prefix[] = "rb_";
|
||||
PIMAGE_IMPORT_BY_NAME pii;
|
||||
const char *name;
|
||||
PIMAGE_THUNK_DATA pint = (PIMAGE_THUNK_DATA)((char *)ext + desc->Characteristics);
|
||||
PIMAGE_THUNK_DATA piat = (PIMAGE_THUNK_DATA)((char *)ext + desc->FirstThunk);
|
||||
for (; piat->u1.Function; piat++, pint++) {
|
||||
static const char prefix[] = "rb_";
|
||||
PIMAGE_IMPORT_BY_NAME pii;
|
||||
const char *name;
|
||||
|
||||
if (IMAGE_SNAP_BY_ORDINAL(pint->u1.Ordinal)) continue;
|
||||
pii = (PIMAGE_IMPORT_BY_NAME)((char *)ext + (size_t)pint->u1.AddressOfData);
|
||||
name = (const char *)pii->Name;
|
||||
if (strncmp(name, prefix, sizeof(prefix) - 1) == 0) {
|
||||
FARPROC addr = GetProcAddress(mine, name);
|
||||
if (addr) return (FARPROC)piat->u1.Function == addr;
|
||||
}
|
||||
}
|
||||
desc++;
|
||||
if (IMAGE_SNAP_BY_ORDINAL(pint->u1.Ordinal)) continue;
|
||||
pii = (PIMAGE_IMPORT_BY_NAME)((char *)ext + (size_t)pint->u1.AddressOfData);
|
||||
name = (const char *)pii->Name;
|
||||
if (strncmp(name, prefix, sizeof(prefix) - 1) == 0) {
|
||||
FARPROC addr = GetProcAddress(mine, name);
|
||||
if (addr) return (FARPROC)piat->u1.Function == addr;
|
||||
}
|
||||
}
|
||||
desc++;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
@ -252,11 +252,11 @@ rb_w32_check_imported(HMODULE ext, HMODULE mine)
|
||||
|
||||
#if defined(DLN_NEEDS_ALT_SEPARATOR) && DLN_NEEDS_ALT_SEPARATOR
|
||||
#define translit_separator(src) do { \
|
||||
char *tmp = ALLOCA_N(char, strlen(src) + 1), *p = tmp, c; \
|
||||
do { \
|
||||
*p++ = ((c = *file++) == '/') ? DLN_NEEDS_ALT_SEPARATOR : c; \
|
||||
} while (c); \
|
||||
(src) = tmp; \
|
||||
char *tmp = ALLOCA_N(char, strlen(src) + 1), *p = tmp, c; \
|
||||
do { \
|
||||
*p++ = ((c = *file++) == '/') ? DLN_NEEDS_ALT_SEPARATOR : c; \
|
||||
} while (c); \
|
||||
(src) = tmp; \
|
||||
} while (0)
|
||||
#else
|
||||
#define translit_separator(str) (void)(str)
|
||||
@ -273,7 +273,7 @@ dln_incompatible_func(void *handle, const char *funcname, void *const fp, const
|
||||
if (!ex) return false;
|
||||
if (ex == fp) return false;
|
||||
if (dladdr(ex, &dli)) {
|
||||
*libname = dli.dli_fname;
|
||||
*libname = dli.dli_fname;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
@ -287,7 +287,7 @@ dln_incompatible_library_p(void *handle, const char **libname)
|
||||
{
|
||||
#define check_func(func) \
|
||||
if (dln_incompatible_func(handle, EXTERNAL_PREFIX #func, (void *)&func, libname)) \
|
||||
return true
|
||||
return true
|
||||
check_func(ruby_xmalloc);
|
||||
return false;
|
||||
}
|
||||
@ -337,7 +337,7 @@ dln_open(const char *file)
|
||||
/* Convert the file path to wide char */
|
||||
WCHAR *winfile = rb_w32_mbstr_to_wstr(CP_UTF8, file, -1, NULL);
|
||||
if (!winfile) {
|
||||
dln_memerror();
|
||||
dln_memerror();
|
||||
}
|
||||
|
||||
/* Load file */
|
||||
@ -345,15 +345,15 @@ dln_open(const char *file)
|
||||
free(winfile);
|
||||
|
||||
if (!handle) {
|
||||
error = dln_strerror();
|
||||
goto failed;
|
||||
error = dln_strerror();
|
||||
goto failed;
|
||||
}
|
||||
|
||||
# if defined(RUBY_EXPORT)
|
||||
if (!rb_w32_check_imported(handle, rb_libruby_handle())) {
|
||||
FreeLibrary(handle);
|
||||
error = incompatible;
|
||||
goto failed;
|
||||
FreeLibrary(handle);
|
||||
error = incompatible;
|
||||
goto failed;
|
||||
}
|
||||
# endif
|
||||
|
||||
@ -378,24 +378,24 @@ dln_open(const char *file)
|
||||
|
||||
# if defined(RUBY_EXPORT)
|
||||
{
|
||||
const char *libruby_name = NULL;
|
||||
if (dln_incompatible_library_p(handle, &libruby_name)) {
|
||||
if (dln_disable_dlclose()) {
|
||||
/* dlclose() segfaults */
|
||||
if (libruby_name) {
|
||||
dln_fatalerror("linked to incompatible %s - %s", libruby_name, file);
|
||||
}
|
||||
dln_fatalerror("%s - %s", incompatible, file);
|
||||
}
|
||||
else {
|
||||
dlclose(handle);
|
||||
if (libruby_name) {
|
||||
dln_loaderror("linked to incompatible %s - %s", libruby_name, file);
|
||||
}
|
||||
error = incompatible;
|
||||
goto failed;
|
||||
}
|
||||
}
|
||||
const char *libruby_name = NULL;
|
||||
if (dln_incompatible_library_p(handle, &libruby_name)) {
|
||||
if (dln_disable_dlclose()) {
|
||||
/* dlclose() segfaults */
|
||||
if (libruby_name) {
|
||||
dln_fatalerror("linked to incompatible %s - %s", libruby_name, file);
|
||||
}
|
||||
dln_fatalerror("%s - %s", incompatible, file);
|
||||
}
|
||||
else {
|
||||
dlclose(handle);
|
||||
if (libruby_name) {
|
||||
dln_loaderror("linked to incompatible %s - %s", libruby_name, file);
|
||||
}
|
||||
error = incompatible;
|
||||
goto failed;
|
||||
}
|
||||
}
|
||||
}
|
||||
# endif
|
||||
#endif
|
||||
@ -471,17 +471,17 @@ dln_load(const char *file)
|
||||
|
||||
#elif defined(_AIX)
|
||||
{
|
||||
void (*init_fct)(void);
|
||||
void (*init_fct)(void);
|
||||
|
||||
init_fct = (void(*)(void))load((char*)file, 1, 0);
|
||||
if (init_fct == NULL) {
|
||||
aix_loaderror(file);
|
||||
}
|
||||
if (loadbind(0, (void*)dln_load, (void*)init_fct) == -1) {
|
||||
aix_loaderror(file);
|
||||
}
|
||||
(*init_fct)();
|
||||
return (void*)init_fct;
|
||||
init_fct = (void(*)(void))load((char*)file, 1, 0);
|
||||
if (init_fct == NULL) {
|
||||
aix_loaderror(file);
|
||||
}
|
||||
if (loadbind(0, (void*)dln_load, (void*)init_fct) == -1) {
|
||||
aix_loaderror(file);
|
||||
}
|
||||
(*init_fct)();
|
||||
return (void*)init_fct;
|
||||
}
|
||||
#else
|
||||
dln_notimplement();
|
||||
|
234
dln_find.c
234
dln_find.c
@ -53,26 +53,26 @@ char *getenv();
|
||||
#endif
|
||||
|
||||
static char *dln_find_1(const char *fname, const char *path, char *buf, size_t size, int exe_flag
|
||||
DLN_FIND_EXTRA_ARG_DECL);
|
||||
DLN_FIND_EXTRA_ARG_DECL);
|
||||
|
||||
char *
|
||||
dln_find_exe_r(const char *fname, const char *path, char *buf, size_t size
|
||||
DLN_FIND_EXTRA_ARG_DECL)
|
||||
DLN_FIND_EXTRA_ARG_DECL)
|
||||
{
|
||||
char *envpath = 0;
|
||||
|
||||
if (!path) {
|
||||
path = getenv(PATH_ENV);
|
||||
if (path) path = envpath = strdup(path);
|
||||
path = getenv(PATH_ENV);
|
||||
if (path) path = envpath = strdup(path);
|
||||
}
|
||||
|
||||
if (!path) {
|
||||
path =
|
||||
"/usr/local/bin" PATH_SEP
|
||||
"/usr/ucb" PATH_SEP
|
||||
"/usr/bin" PATH_SEP
|
||||
"/bin" PATH_SEP
|
||||
".";
|
||||
path =
|
||||
"/usr/local/bin" PATH_SEP
|
||||
"/usr/ucb" PATH_SEP
|
||||
"/usr/bin" PATH_SEP
|
||||
"/bin" PATH_SEP
|
||||
".";
|
||||
}
|
||||
buf = dln_find_1(fname, path, buf, size, 1 DLN_FIND_EXTRA_ARG);
|
||||
if (envpath) free(envpath);
|
||||
@ -81,7 +81,7 @@ dln_find_exe_r(const char *fname, const char *path, char *buf, size_t size
|
||||
|
||||
char *
|
||||
dln_find_file_r(const char *fname, const char *path, char *buf, size_t size
|
||||
DLN_FIND_EXTRA_ARG_DECL)
|
||||
DLN_FIND_EXTRA_ARG_DECL)
|
||||
{
|
||||
if (!path) path = ".";
|
||||
return dln_find_1(fname, path, buf, size, 0 DLN_FIND_EXTRA_ARG);
|
||||
@ -89,8 +89,8 @@ dln_find_file_r(const char *fname, const char *path, char *buf, size_t size
|
||||
|
||||
static char *
|
||||
dln_find_1(const char *fname, const char *path, char *fbuf, size_t size,
|
||||
int exe_flag /* non 0 if looking for executable. */
|
||||
DLN_FIND_EXTRA_ARG_DECL)
|
||||
int exe_flag /* non 0 if looking for executable. */
|
||||
DLN_FIND_EXTRA_ARG_DECL)
|
||||
{
|
||||
register const char *dp;
|
||||
register const char *ep;
|
||||
@ -99,7 +99,7 @@ dln_find_1(const char *fname, const char *path, char *fbuf, size_t size,
|
||||
size_t i, fnlen, fspace;
|
||||
#ifdef DOSISH
|
||||
static const char extension[][5] = {
|
||||
EXECUTABLE_EXTS,
|
||||
EXECUTABLE_EXTS,
|
||||
};
|
||||
size_t j;
|
||||
int is_abs = 0, has_path = 0;
|
||||
@ -110,21 +110,21 @@ dln_find_1(const char *fname, const char *path, char *fbuf, size_t size,
|
||||
static const char pathname_too_long[] = "openpath: pathname too long (ignored)\n\
|
||||
\tDirectory \"%.*s\"%s\n\tFile \"%.*s\"%s\n";
|
||||
#define PATHNAME_TOO_LONG() dln_warning(dln_warning_arg pathname_too_long, \
|
||||
((bp - fbuf) > 100 ? 100 : (int)(bp - fbuf)), fbuf, \
|
||||
((bp - fbuf) > 100 ? "..." : ""), \
|
||||
(fnlen > 100 ? 100 : (int)fnlen), fname, \
|
||||
(fnlen > 100 ? "..." : ""))
|
||||
((bp - fbuf) > 100 ? 100 : (int)(bp - fbuf)), fbuf, \
|
||||
((bp - fbuf) > 100 ? "..." : ""), \
|
||||
(fnlen > 100 ? 100 : (int)fnlen), fname, \
|
||||
(fnlen > 100 ? "..." : ""))
|
||||
|
||||
#define RETURN_IF(expr) if (expr) return (char *)fname;
|
||||
|
||||
RETURN_IF(!fname);
|
||||
fnlen = strlen(fname);
|
||||
if (fnlen >= size) {
|
||||
dln_warning(dln_warning_arg
|
||||
"openpath: pathname too long (ignored)\n\tFile \"%.*s\"%s\n",
|
||||
(fnlen > 100 ? 100 : (int)fnlen), fname,
|
||||
(fnlen > 100 ? "..." : ""));
|
||||
return NULL;
|
||||
dln_warning(dln_warning_arg
|
||||
"openpath: pathname too long (ignored)\n\tFile \"%.*s\"%s\n",
|
||||
(fnlen > 100 ? 100 : (int)fnlen), fname,
|
||||
(fnlen > 100 ? "..." : ""));
|
||||
return NULL;
|
||||
}
|
||||
#ifdef DOSISH
|
||||
# ifndef CharNext
|
||||
@ -132,52 +132,52 @@ dln_find_1(const char *fname, const char *path, char *fbuf, size_t size,
|
||||
# endif
|
||||
# ifdef DOSISH_DRIVE_LETTER
|
||||
if (((p[0] | 0x20) - 'a') < 26 && p[1] == ':') {
|
||||
p += 2;
|
||||
is_abs = 1;
|
||||
p += 2;
|
||||
is_abs = 1;
|
||||
}
|
||||
# endif
|
||||
switch (*p) {
|
||||
case '/': case '\\':
|
||||
is_abs = 1;
|
||||
p++;
|
||||
is_abs = 1;
|
||||
p++;
|
||||
}
|
||||
has_path = is_abs;
|
||||
while (*p) {
|
||||
switch (*p) {
|
||||
case '/': case '\\':
|
||||
has_path = 1;
|
||||
ext = 0;
|
||||
p++;
|
||||
break;
|
||||
case '.':
|
||||
ext = p;
|
||||
p++;
|
||||
break;
|
||||
default:
|
||||
p = CharNext(p);
|
||||
}
|
||||
switch (*p) {
|
||||
case '/': case '\\':
|
||||
has_path = 1;
|
||||
ext = 0;
|
||||
p++;
|
||||
break;
|
||||
case '.':
|
||||
ext = p;
|
||||
p++;
|
||||
break;
|
||||
default:
|
||||
p = CharNext(p);
|
||||
}
|
||||
}
|
||||
if (ext) {
|
||||
for (j = 0; STRCASECMP(ext, extension[j]); ) {
|
||||
if (++j == sizeof(extension) / sizeof(extension[0])) {
|
||||
ext = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
for (j = 0; STRCASECMP(ext, extension[j]); ) {
|
||||
if (++j == sizeof(extension) / sizeof(extension[0])) {
|
||||
ext = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
ep = bp = 0;
|
||||
if (!exe_flag) {
|
||||
RETURN_IF(is_abs);
|
||||
RETURN_IF(is_abs);
|
||||
}
|
||||
else if (has_path) {
|
||||
RETURN_IF(ext);
|
||||
i = p - fname;
|
||||
if (i + 1 > size) goto toolong;
|
||||
fspace = size - i - 1;
|
||||
bp = fbuf;
|
||||
ep = p;
|
||||
memcpy(fbuf, fname, i + 1);
|
||||
goto needs_extension;
|
||||
RETURN_IF(ext);
|
||||
i = p - fname;
|
||||
if (i + 1 > size) goto toolong;
|
||||
fspace = size - i - 1;
|
||||
bp = fbuf;
|
||||
ep = p;
|
||||
memcpy(fbuf, fname, i + 1);
|
||||
goto needs_extension;
|
||||
}
|
||||
p = fname;
|
||||
#endif
|
||||
@ -189,85 +189,85 @@ dln_find_1(const char *fname, const char *path, char *fbuf, size_t size,
|
||||
#undef RETURN_IF
|
||||
|
||||
for (dp = path;; dp = ++ep) {
|
||||
register size_t l;
|
||||
register size_t l;
|
||||
|
||||
/* extract a component */
|
||||
ep = strchr(dp, PATH_SEP[0]);
|
||||
if (ep == NULL)
|
||||
ep = dp+strlen(dp);
|
||||
/* extract a component */
|
||||
ep = strchr(dp, PATH_SEP[0]);
|
||||
if (ep == NULL)
|
||||
ep = dp+strlen(dp);
|
||||
|
||||
/* find the length of that component */
|
||||
l = ep - dp;
|
||||
bp = fbuf;
|
||||
fspace = size - 2;
|
||||
if (l > 0) {
|
||||
/*
|
||||
** If the length of the component is zero length,
|
||||
** start from the current directory. If the
|
||||
** component begins with "~", start from the
|
||||
** user's $HOME environment variable. Otherwise
|
||||
** take the path literally.
|
||||
*/
|
||||
/* find the length of that component */
|
||||
l = ep - dp;
|
||||
bp = fbuf;
|
||||
fspace = size - 2;
|
||||
if (l > 0) {
|
||||
/*
|
||||
** If the length of the component is zero length,
|
||||
** start from the current directory. If the
|
||||
** component begins with "~", start from the
|
||||
** user's $HOME environment variable. Otherwise
|
||||
** take the path literally.
|
||||
*/
|
||||
|
||||
if (*dp == '~' && (l == 1 ||
|
||||
if (*dp == '~' && (l == 1 ||
|
||||
#if defined(DOSISH)
|
||||
dp[1] == '\\' ||
|
||||
dp[1] == '\\' ||
|
||||
#endif
|
||||
dp[1] == '/')) {
|
||||
const char *home;
|
||||
dp[1] == '/')) {
|
||||
const char *home;
|
||||
|
||||
home = getenv("HOME");
|
||||
if (home != NULL) {
|
||||
i = strlen(home);
|
||||
if (fspace < i)
|
||||
goto toolong;
|
||||
fspace -= i;
|
||||
memcpy(bp, home, i);
|
||||
bp += i;
|
||||
}
|
||||
dp++;
|
||||
l--;
|
||||
}
|
||||
if (l > 0) {
|
||||
if (fspace < l)
|
||||
goto toolong;
|
||||
fspace -= l;
|
||||
memcpy(bp, dp, l);
|
||||
bp += l;
|
||||
}
|
||||
home = getenv("HOME");
|
||||
if (home != NULL) {
|
||||
i = strlen(home);
|
||||
if (fspace < i)
|
||||
goto toolong;
|
||||
fspace -= i;
|
||||
memcpy(bp, home, i);
|
||||
bp += i;
|
||||
}
|
||||
dp++;
|
||||
l--;
|
||||
}
|
||||
if (l > 0) {
|
||||
if (fspace < l)
|
||||
goto toolong;
|
||||
fspace -= l;
|
||||
memcpy(bp, dp, l);
|
||||
bp += l;
|
||||
}
|
||||
|
||||
/* add a "/" between directory and filename */
|
||||
if (ep[-1] != '/')
|
||||
*bp++ = '/';
|
||||
}
|
||||
/* add a "/" between directory and filename */
|
||||
if (ep[-1] != '/')
|
||||
*bp++ = '/';
|
||||
}
|
||||
|
||||
/* now append the file name */
|
||||
i = fnlen;
|
||||
if (fspace < i) {
|
||||
/* now append the file name */
|
||||
i = fnlen;
|
||||
if (fspace < i) {
|
||||
goto toolong;
|
||||
}
|
||||
fspace -= i;
|
||||
memcpy(bp, fname, i + 1);
|
||||
}
|
||||
fspace -= i;
|
||||
memcpy(bp, fname, i + 1);
|
||||
|
||||
#if defined(DOSISH)
|
||||
if (exe_flag && !ext) {
|
||||
if (exe_flag && !ext) {
|
||||
goto needs_extension;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef S_ISREG
|
||||
# define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
|
||||
#endif
|
||||
if (stat(fbuf, &st) == 0 && S_ISREG(st.st_mode)) {
|
||||
if (exe_flag == 0) return fbuf;
|
||||
/* looking for executable */
|
||||
if (eaccess(fbuf, X_OK) == 0) return fbuf;
|
||||
}
|
||||
if (stat(fbuf, &st) == 0 && S_ISREG(st.st_mode)) {
|
||||
if (exe_flag == 0) return fbuf;
|
||||
/* looking for executable */
|
||||
if (eaccess(fbuf, X_OK) == 0) return fbuf;
|
||||
}
|
||||
next:
|
||||
/* if not, and no other alternatives, life is bleak */
|
||||
if (*ep == '\0') {
|
||||
return NULL;
|
||||
}
|
||||
/* if not, and no other alternatives, life is bleak */
|
||||
if (*ep == '\0') {
|
||||
return NULL;
|
||||
}
|
||||
continue;
|
||||
|
||||
toolong:
|
||||
@ -287,6 +287,6 @@ dln_find_1(const char *fname, const char *path, char *fbuf, size_t size,
|
||||
}
|
||||
goto next;
|
||||
#endif
|
||||
/* otherwise try the next component in the search path */
|
||||
/* otherwise try the next component in the search path */
|
||||
}
|
||||
}
|
||||
|
2
dmyenc.c
2
dmyenc.c
@ -5,6 +5,6 @@ void
|
||||
Init_enc(void)
|
||||
{
|
||||
if (require("enc/encdb.so") == 1) {
|
||||
require("enc/trans/transdb.so");
|
||||
require("enc/trans/transdb.so");
|
||||
}
|
||||
}
|
||||
|
356
encoding.c
356
encoding.c
@ -210,7 +210,7 @@ check_encoding(rb_encoding *enc)
|
||||
{
|
||||
int index = rb_enc_to_index(enc);
|
||||
if (rb_enc_from_index(index) != enc)
|
||||
return -1;
|
||||
return -1;
|
||||
if (rb_enc_autoload_p(enc)) {
|
||||
index = rb_enc_autoload(enc);
|
||||
}
|
||||
@ -221,7 +221,7 @@ static int
|
||||
enc_check_encoding(VALUE obj)
|
||||
{
|
||||
if (!is_obj_encoding(obj)) {
|
||||
return -1;
|
||||
return -1;
|
||||
}
|
||||
return check_encoding(RDATA(obj)->data);
|
||||
}
|
||||
@ -231,7 +231,7 @@ static void
|
||||
not_encoding(VALUE enc)
|
||||
{
|
||||
rb_raise(rb_eTypeError, "wrong argument type %"PRIsVALUE" (expected Encoding)",
|
||||
rb_obj_class(enc));
|
||||
rb_obj_class(enc));
|
||||
}
|
||||
|
||||
static rb_encoding *
|
||||
@ -239,7 +239,7 @@ must_encoding(VALUE enc)
|
||||
{
|
||||
int index = enc_check_encoding(enc);
|
||||
if (index < 0) {
|
||||
not_encoding(enc);
|
||||
not_encoding(enc);
|
||||
}
|
||||
return DATA_PTR(enc);
|
||||
}
|
||||
@ -249,16 +249,16 @@ must_encindex(int index)
|
||||
{
|
||||
rb_encoding *enc = rb_enc_from_index(index);
|
||||
if (!enc) {
|
||||
rb_raise(rb_eEncodingError, "encoding index out of bound: %d",
|
||||
index);
|
||||
rb_raise(rb_eEncodingError, "encoding index out of bound: %d",
|
||||
index);
|
||||
}
|
||||
if (ENC_TO_ENCINDEX(enc) != (int)(index & ENC_INDEX_MASK)) {
|
||||
rb_raise(rb_eEncodingError, "wrong encoding index %d for %s (expected %d)",
|
||||
index, rb_enc_name(enc), ENC_TO_ENCINDEX(enc));
|
||||
rb_raise(rb_eEncodingError, "wrong encoding index %d for %s (expected %d)",
|
||||
index, rb_enc_name(enc), ENC_TO_ENCINDEX(enc));
|
||||
}
|
||||
if (rb_enc_autoload_p(enc) && rb_enc_autoload(enc) == -1) {
|
||||
rb_loaderror("failed to load encoding (%s)",
|
||||
rb_enc_name(enc));
|
||||
rb_loaderror("failed to load encoding (%s)",
|
||||
rb_enc_name(enc));
|
||||
}
|
||||
return enc;
|
||||
}
|
||||
@ -271,16 +271,16 @@ rb_to_encoding_index(VALUE enc)
|
||||
|
||||
idx = enc_check_encoding(enc);
|
||||
if (idx >= 0) {
|
||||
return idx;
|
||||
return idx;
|
||||
}
|
||||
else if (NIL_P(enc = rb_check_string_type(enc))) {
|
||||
return -1;
|
||||
return -1;
|
||||
}
|
||||
if (!rb_enc_asciicompat(rb_enc_get(enc))) {
|
||||
return -1;
|
||||
return -1;
|
||||
}
|
||||
if (!(name = rb_str_to_cstr(enc))) {
|
||||
return -1;
|
||||
return -1;
|
||||
}
|
||||
return rb_enc_find_index(name);
|
||||
}
|
||||
@ -292,10 +292,10 @@ name_for_encoding(volatile VALUE *enc)
|
||||
const char *n;
|
||||
|
||||
if (!rb_enc_asciicompat(rb_enc_get(name))) {
|
||||
rb_raise(rb_eArgError, "invalid encoding name (non ASCII)");
|
||||
rb_raise(rb_eArgError, "invalid encoding name (non ASCII)");
|
||||
}
|
||||
if (!(n = rb_str_to_cstr(name))) {
|
||||
rb_raise(rb_eArgError, "invalid encoding name (NUL byte)");
|
||||
rb_raise(rb_eArgError, "invalid encoding name (NUL byte)");
|
||||
}
|
||||
return n;
|
||||
}
|
||||
@ -314,7 +314,7 @@ str_to_encindex(VALUE enc)
|
||||
{
|
||||
int idx = str_find_encindex(enc);
|
||||
if (idx < 0) {
|
||||
rb_raise(rb_eArgError, "unknown encoding name - %"PRIsVALUE, enc);
|
||||
rb_raise(rb_eArgError, "unknown encoding name - %"PRIsVALUE, enc);
|
||||
}
|
||||
return idx;
|
||||
}
|
||||
@ -365,20 +365,20 @@ enc_register_at(struct enc_table *enc_table, int index, const char *name, rb_enc
|
||||
|
||||
if (!valid_encoding_name_p(name)) return -1;
|
||||
if (!ent->name) {
|
||||
ent->name = name = strdup(name);
|
||||
ent->name = name = strdup(name);
|
||||
}
|
||||
else if (STRCASECMP(name, ent->name)) {
|
||||
return -1;
|
||||
return -1;
|
||||
}
|
||||
encoding = (rb_raw_encoding *)ent->enc;
|
||||
if (!encoding) {
|
||||
encoding = xmalloc(sizeof(rb_encoding));
|
||||
encoding = xmalloc(sizeof(rb_encoding));
|
||||
}
|
||||
if (base_encoding) {
|
||||
*encoding = *base_encoding;
|
||||
*encoding = *base_encoding;
|
||||
}
|
||||
else {
|
||||
memset(encoding, 0, sizeof(*ent->enc));
|
||||
memset(encoding, 0, sizeof(*ent->enc));
|
||||
}
|
||||
encoding->name = name;
|
||||
encoding->ruby_encoding_index = index;
|
||||
@ -405,7 +405,7 @@ static rb_encoding *
|
||||
enc_from_index(struct enc_table *enc_table, int index)
|
||||
{
|
||||
if (UNLIKELY(index < 0 || enc_table->count <= (index &= ENC_INDEX_MASK))) {
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
return enc_table->list[index].enc;
|
||||
}
|
||||
@ -464,7 +464,7 @@ enc_registered(struct enc_table *enc_table, const char *name)
|
||||
if (!name) return -1;
|
||||
if (!enc_table->list) return -1;
|
||||
if (st_lookup(enc_table->names, (st_data_t)name, &idx)) {
|
||||
return (int)idx;
|
||||
return (int)idx;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
@ -487,7 +487,7 @@ static void
|
||||
enc_check_duplication(struct enc_table *enc_table, const char *name)
|
||||
{
|
||||
if (enc_registered(enc_table, name) >= 0) {
|
||||
rb_raise(rb_eArgError, "encoding %s is already registered", name);
|
||||
rb_raise(rb_eArgError, "encoding %s is already registered", name);
|
||||
}
|
||||
}
|
||||
|
||||
@ -581,11 +581,11 @@ enc_replicate_with_index(struct enc_table *enc_table, const char *name, rb_encod
|
||||
idx = enc_register(enc_table, name, origenc);
|
||||
}
|
||||
else {
|
||||
idx = enc_register_at(enc_table, idx, name, origenc);
|
||||
idx = enc_register_at(enc_table, idx, name, origenc);
|
||||
}
|
||||
if (idx >= 0) {
|
||||
set_base_encoding(enc_table, idx, origenc);
|
||||
set_encoding_const(name, rb_enc_from_index(idx));
|
||||
set_base_encoding(enc_table, idx, origenc);
|
||||
set_encoding_const(name, rb_enc_from_index(idx));
|
||||
}
|
||||
else {
|
||||
rb_raise(rb_eArgError, "failed to replicate encoding");
|
||||
@ -705,7 +705,7 @@ static int
|
||||
enc_alias_internal(struct enc_table *enc_table, const char *alias, int idx)
|
||||
{
|
||||
return st_insert2(enc_table->names, (st_data_t)alias, (st_data_t)idx,
|
||||
enc_dup_name);
|
||||
enc_dup_name);
|
||||
}
|
||||
|
||||
static int
|
||||
@ -713,7 +713,7 @@ enc_alias(struct enc_table *enc_table, const char *alias, int idx)
|
||||
{
|
||||
if (!valid_encoding_name_p(alias)) return -1;
|
||||
if (!enc_alias_internal(enc_table, alias, idx))
|
||||
set_encoding_const(alias, enc_from_index(enc_table, idx));
|
||||
set_encoding_const(alias, enc_from_index(enc_table, idx));
|
||||
return idx;
|
||||
}
|
||||
|
||||
@ -769,7 +769,7 @@ rb_enc_init(struct enc_table *enc_table)
|
||||
{
|
||||
enc_table_expand(enc_table, ENCODING_COUNT + 1);
|
||||
if (!enc_table->names) {
|
||||
enc_table->names = st_init_strcasetable();
|
||||
enc_table->names = st_init_strcasetable();
|
||||
}
|
||||
#define OnigEncodingASCII_8BIT OnigEncodingASCII
|
||||
#define ENC_REGISTER(enc) enc_register_at(enc_table, ENCINDEX_##enc, rb_enc_name(&OnigEncoding##enc), &OnigEncoding##enc)
|
||||
@ -815,9 +815,9 @@ load_encoding(const char *name)
|
||||
int idx;
|
||||
|
||||
while (s < e) {
|
||||
if (!ISALNUM(*s)) *s = '_';
|
||||
else if (ISUPPER(*s)) *s = (char)TOLOWER(*s);
|
||||
++s;
|
||||
if (!ISALNUM(*s)) *s = '_';
|
||||
else if (ISUPPER(*s)) *s = (char)TOLOWER(*s);
|
||||
++s;
|
||||
}
|
||||
enclib = rb_fstring(enclib);
|
||||
ruby_debug = Qfalse;
|
||||
@ -850,16 +850,16 @@ enc_autoload_body(struct enc_table *enc_table, rb_encoding *enc)
|
||||
|
||||
if (base) {
|
||||
int i = 0;
|
||||
do {
|
||||
if (i >= enc_table->count) return -1;
|
||||
} while (enc_table->list[i].enc != base && (++i, 1));
|
||||
if (rb_enc_autoload_p(base)) {
|
||||
if (rb_enc_autoload(base) < 0) return -1;
|
||||
}
|
||||
i = enc->ruby_encoding_index;
|
||||
enc_register_at(enc_table, i & ENC_INDEX_MASK, rb_enc_name(enc), base);
|
||||
do {
|
||||
if (i >= enc_table->count) return -1;
|
||||
} while (enc_table->list[i].enc != base && (++i, 1));
|
||||
if (rb_enc_autoload_p(base)) {
|
||||
if (rb_enc_autoload(base) < 0) return -1;
|
||||
}
|
||||
i = enc->ruby_encoding_index;
|
||||
enc_register_at(enc_table, i & ENC_INDEX_MASK, rb_enc_name(enc), base);
|
||||
((rb_raw_encoding *)enc)->ruby_encoding_index = i;
|
||||
i &= ENC_INDEX_MASK;
|
||||
i &= ENC_INDEX_MASK;
|
||||
return i;
|
||||
}
|
||||
else {
|
||||
@ -888,19 +888,19 @@ rb_enc_find_index(const char *name)
|
||||
GLOBAL_ENC_TABLE_EVAL(enc_table, i = enc_registered(enc_table, name));
|
||||
|
||||
if (i < 0) {
|
||||
i = load_encoding(name);
|
||||
i = load_encoding(name);
|
||||
}
|
||||
else if (!(enc = rb_enc_from_index(i))) {
|
||||
if (i != UNSPECIFIED_ENCODING) {
|
||||
rb_raise(rb_eArgError, "encoding %s is not registered", name);
|
||||
}
|
||||
if (i != UNSPECIFIED_ENCODING) {
|
||||
rb_raise(rb_eArgError, "encoding %s is not registered", name);
|
||||
}
|
||||
}
|
||||
else if (rb_enc_autoload_p(enc)) {
|
||||
if (rb_enc_autoload(enc) < 0) {
|
||||
rb_warn("failed to load encoding (%s); use ASCII-8BIT instead",
|
||||
name);
|
||||
return 0;
|
||||
}
|
||||
if (rb_enc_autoload(enc) < 0) {
|
||||
rb_warn("failed to load encoding (%s); use ASCII-8BIT instead",
|
||||
name);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return i;
|
||||
}
|
||||
@ -933,11 +933,11 @@ enc_capable(VALUE obj)
|
||||
case T_REGEXP:
|
||||
case T_FILE:
|
||||
case T_SYMBOL:
|
||||
return TRUE;
|
||||
return TRUE;
|
||||
case T_DATA:
|
||||
if (is_data_encoding(obj)) return TRUE;
|
||||
if (is_data_encoding(obj)) return TRUE;
|
||||
default:
|
||||
return FALSE;
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
@ -959,11 +959,11 @@ enc_get_index_str(VALUE str)
|
||||
{
|
||||
int i = ENCODING_GET_INLINED(str);
|
||||
if (i == ENCODING_INLINE_MAX) {
|
||||
VALUE iv;
|
||||
VALUE iv;
|
||||
|
||||
#if 0
|
||||
iv = rb_ivar_get(str, rb_id_encoding());
|
||||
i = NUM2INT(iv);
|
||||
iv = rb_ivar_get(str, rb_id_encoding());
|
||||
i = NUM2INT(iv);
|
||||
#else
|
||||
/*
|
||||
* Tentatively, assume ASCII-8BIT, if encoding index instance
|
||||
@ -984,31 +984,31 @@ rb_enc_get_index(VALUE obj)
|
||||
VALUE tmp;
|
||||
|
||||
if (SPECIAL_CONST_P(obj)) {
|
||||
if (!SYMBOL_P(obj)) return -1;
|
||||
obj = rb_sym2str(obj);
|
||||
if (!SYMBOL_P(obj)) return -1;
|
||||
obj = rb_sym2str(obj);
|
||||
}
|
||||
switch (BUILTIN_TYPE(obj)) {
|
||||
case T_STRING:
|
||||
case T_SYMBOL:
|
||||
case T_REGEXP:
|
||||
i = enc_get_index_str(obj);
|
||||
break;
|
||||
i = enc_get_index_str(obj);
|
||||
break;
|
||||
case T_FILE:
|
||||
tmp = rb_funcallv(obj, rb_intern("internal_encoding"), 0, 0);
|
||||
if (NIL_P(tmp)) {
|
||||
tmp = rb_funcallv(obj, rb_intern("external_encoding"), 0, 0);
|
||||
}
|
||||
if (is_obj_encoding(tmp)) {
|
||||
i = enc_check_encoding(tmp);
|
||||
}
|
||||
break;
|
||||
tmp = rb_funcallv(obj, rb_intern("internal_encoding"), 0, 0);
|
||||
if (NIL_P(tmp)) {
|
||||
tmp = rb_funcallv(obj, rb_intern("external_encoding"), 0, 0);
|
||||
}
|
||||
if (is_obj_encoding(tmp)) {
|
||||
i = enc_check_encoding(tmp);
|
||||
}
|
||||
break;
|
||||
case T_DATA:
|
||||
if (is_data_encoding(obj)) {
|
||||
i = enc_check_encoding(obj);
|
||||
}
|
||||
break;
|
||||
if (is_data_encoding(obj)) {
|
||||
i = enc_check_encoding(obj);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
break;
|
||||
}
|
||||
return i;
|
||||
}
|
||||
@ -1021,8 +1021,8 @@ enc_set_index(VALUE obj, int idx)
|
||||
}
|
||||
|
||||
if (idx < ENCODING_INLINE_MAX) {
|
||||
ENCODING_SET_INLINED(obj, idx);
|
||||
return;
|
||||
ENCODING_SET_INLINED(obj, idx);
|
||||
return;
|
||||
}
|
||||
ENCODING_SET_INLINED(obj, ENCODING_INLINE_MAX);
|
||||
rb_ivar_set(obj, rb_id_encoding(), INT2NUM(idx));
|
||||
@ -1046,19 +1046,19 @@ rb_enc_associate_index(VALUE obj, int idx)
|
||||
rb_check_frozen(obj);
|
||||
oldidx = rb_enc_get_index(obj);
|
||||
if (oldidx == idx)
|
||||
return obj;
|
||||
return obj;
|
||||
if (SPECIAL_CONST_P(obj)) {
|
||||
rb_raise(rb_eArgError, "cannot set encoding");
|
||||
rb_raise(rb_eArgError, "cannot set encoding");
|
||||
}
|
||||
enc = must_encindex(idx);
|
||||
if (!ENC_CODERANGE_ASCIIONLY(obj) ||
|
||||
!rb_enc_asciicompat(enc)) {
|
||||
ENC_CODERANGE_CLEAR(obj);
|
||||
!rb_enc_asciicompat(enc)) {
|
||||
ENC_CODERANGE_CLEAR(obj);
|
||||
}
|
||||
termlen = rb_enc_mbminlen(enc);
|
||||
oldtermlen = rb_enc_mbminlen(rb_enc_from_index(oldidx));
|
||||
if (oldtermlen != termlen && RB_TYPE_P(obj, T_STRING)) {
|
||||
rb_str_change_terminator_length(obj, oldtermlen, termlen);
|
||||
rb_str_change_terminator_length(obj, oldtermlen, termlen);
|
||||
}
|
||||
enc_set_index(obj, idx);
|
||||
return obj;
|
||||
@ -1080,9 +1080,9 @@ static rb_encoding*
|
||||
rb_encoding_check(rb_encoding* enc, VALUE str1, VALUE str2)
|
||||
{
|
||||
if (!enc)
|
||||
rb_raise(rb_eEncCompatError, "incompatible character encodings: %s and %s",
|
||||
rb_enc_name(rb_enc_get(str1)),
|
||||
rb_enc_name(rb_enc_get(str2)));
|
||||
rb_raise(rb_eEncCompatError, "incompatible character encodings: %s and %s",
|
||||
rb_enc_name(rb_enc_get(str1)),
|
||||
rb_enc_name(rb_enc_get(str2)));
|
||||
return enc;
|
||||
}
|
||||
|
||||
@ -1111,48 +1111,48 @@ enc_compatible_latter(VALUE str1, VALUE str2, int idx1, int idx2)
|
||||
|
||||
isstr2 = RB_TYPE_P(str2, T_STRING);
|
||||
if (isstr2 && RSTRING_LEN(str2) == 0)
|
||||
return enc1;
|
||||
return enc1;
|
||||
isstr1 = RB_TYPE_P(str1, T_STRING);
|
||||
if (isstr1 && isstr2 && RSTRING_LEN(str1) == 0)
|
||||
return (rb_enc_asciicompat(enc1) && rb_enc_str_asciionly_p(str2)) ? enc1 : enc2;
|
||||
return (rb_enc_asciicompat(enc1) && rb_enc_str_asciionly_p(str2)) ? enc1 : enc2;
|
||||
if (!rb_enc_asciicompat(enc1) || !rb_enc_asciicompat(enc2)) {
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* objects whose encoding is the same of contents */
|
||||
if (!isstr2 && idx2 == ENCINDEX_US_ASCII)
|
||||
return enc1;
|
||||
return enc1;
|
||||
if (!isstr1 && idx1 == ENCINDEX_US_ASCII)
|
||||
return enc2;
|
||||
return enc2;
|
||||
|
||||
if (!isstr1) {
|
||||
VALUE tmp = str1;
|
||||
int idx0 = idx1;
|
||||
str1 = str2;
|
||||
str2 = tmp;
|
||||
idx1 = idx2;
|
||||
idx2 = idx0;
|
||||
idx0 = isstr1;
|
||||
isstr1 = isstr2;
|
||||
isstr2 = idx0;
|
||||
VALUE tmp = str1;
|
||||
int idx0 = idx1;
|
||||
str1 = str2;
|
||||
str2 = tmp;
|
||||
idx1 = idx2;
|
||||
idx2 = idx0;
|
||||
idx0 = isstr1;
|
||||
isstr1 = isstr2;
|
||||
isstr2 = idx0;
|
||||
}
|
||||
if (isstr1) {
|
||||
int cr1, cr2;
|
||||
int cr1, cr2;
|
||||
|
||||
cr1 = rb_enc_str_coderange(str1);
|
||||
if (isstr2) {
|
||||
cr2 = rb_enc_str_coderange(str2);
|
||||
if (cr1 != cr2) {
|
||||
/* may need to handle ENC_CODERANGE_BROKEN */
|
||||
if (cr1 == ENC_CODERANGE_7BIT) return enc2;
|
||||
if (cr2 == ENC_CODERANGE_7BIT) return enc1;
|
||||
}
|
||||
if (cr2 == ENC_CODERANGE_7BIT) {
|
||||
return enc1;
|
||||
}
|
||||
}
|
||||
if (cr1 == ENC_CODERANGE_7BIT)
|
||||
return enc2;
|
||||
cr1 = rb_enc_str_coderange(str1);
|
||||
if (isstr2) {
|
||||
cr2 = rb_enc_str_coderange(str2);
|
||||
if (cr1 != cr2) {
|
||||
/* may need to handle ENC_CODERANGE_BROKEN */
|
||||
if (cr1 == ENC_CODERANGE_7BIT) return enc2;
|
||||
if (cr2 == ENC_CODERANGE_7BIT) return enc1;
|
||||
}
|
||||
if (cr2 == ENC_CODERANGE_7BIT) {
|
||||
return enc1;
|
||||
}
|
||||
}
|
||||
if (cr1 == ENC_CODERANGE_7BIT)
|
||||
return enc2;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@ -1167,10 +1167,10 @@ enc_compatible_str(VALUE str1, VALUE str2)
|
||||
return 0;
|
||||
|
||||
if (idx1 == idx2) {
|
||||
return rb_enc_from_index(idx1);
|
||||
return rb_enc_from_index(idx1);
|
||||
}
|
||||
else {
|
||||
return enc_compatible_latter(str1, str2, idx1, idx2);
|
||||
return enc_compatible_latter(str1, str2, idx1, idx2);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1184,7 +1184,7 @@ rb_enc_compatible(VALUE str1, VALUE str2)
|
||||
return 0;
|
||||
|
||||
if (idx1 == idx2) {
|
||||
return rb_enc_from_index(idx1);
|
||||
return rb_enc_from_index(idx1);
|
||||
}
|
||||
|
||||
return enc_compatible_latter(str1, str2, idx1, idx2);
|
||||
@ -1209,7 +1209,7 @@ rb_obj_encoding(VALUE obj)
|
||||
{
|
||||
int idx = rb_enc_get_index(obj);
|
||||
if (idx < 0) {
|
||||
rb_raise(rb_eTypeError, "unknown encoding");
|
||||
rb_raise(rb_eTypeError, "unknown encoding");
|
||||
}
|
||||
return rb_enc_from_encoding_index(idx & ENC_INDEX_MASK);
|
||||
}
|
||||
@ -1276,7 +1276,7 @@ rb_enc_codepoint_len(const char *p, const char *e, int *len_p, rb_encoding *enc)
|
||||
rb_raise(rb_eArgError, "empty string");
|
||||
r = rb_enc_precise_mbclen(p, e, enc);
|
||||
if (!MBCLEN_CHARFOUND_P(r)) {
|
||||
rb_raise(rb_eArgError, "invalid byte sequence in %s", rb_enc_name(enc));
|
||||
rb_raise(rb_eArgError, "invalid byte sequence in %s", rb_enc_name(enc));
|
||||
}
|
||||
if (len_p) *len_p = MBCLEN_CHARFOUND_LEN(r);
|
||||
return rb_enc_mbc_to_codepoint(p, e, enc);
|
||||
@ -1287,7 +1287,7 @@ rb_enc_codelen(int c, rb_encoding *enc)
|
||||
{
|
||||
int n = ONIGENC_CODE_TO_MBCLEN(enc,c);
|
||||
if (n == 0) {
|
||||
rb_raise(rb_eArgError, "invalid codepoint 0x%x in %s", c, rb_enc_name(enc));
|
||||
rb_raise(rb_eArgError, "invalid codepoint 0x%x in %s", c, rb_enc_name(enc));
|
||||
}
|
||||
return n;
|
||||
}
|
||||
@ -1319,16 +1319,16 @@ enc_inspect(VALUE self)
|
||||
rb_encoding *enc;
|
||||
|
||||
if (!is_data_encoding(self)) {
|
||||
not_encoding(self);
|
||||
not_encoding(self);
|
||||
}
|
||||
if (!(enc = DATA_PTR(self)) || rb_enc_from_index(rb_enc_to_index(enc)) != enc) {
|
||||
rb_raise(rb_eTypeError, "broken Encoding");
|
||||
rb_raise(rb_eTypeError, "broken Encoding");
|
||||
}
|
||||
return rb_enc_sprintf(rb_usascii_encoding(),
|
||||
"#<%"PRIsVALUE":%s%s%s>", rb_obj_class(self),
|
||||
rb_enc_name(enc),
|
||||
(ENC_DUMMY_P(enc) ? " (dummy)" : ""),
|
||||
rb_enc_autoload_p(enc) ? " (autoload)" : "");
|
||||
"#<%"PRIsVALUE":%s%s%s>", rb_obj_class(self),
|
||||
rb_enc_name(enc),
|
||||
(ENC_DUMMY_P(enc) ? " (dummy)" : ""),
|
||||
rb_enc_autoload_p(enc) ? " (autoload)" : "");
|
||||
}
|
||||
|
||||
/*
|
||||
@ -1352,8 +1352,8 @@ enc_names_i(st_data_t name, st_data_t idx, st_data_t args)
|
||||
VALUE *arg = (VALUE *)args;
|
||||
|
||||
if ((int)idx == (int)arg[0]) {
|
||||
VALUE str = rb_fstring_cstr((char *)name);
|
||||
rb_ary_push(arg[1], str);
|
||||
VALUE str = rb_fstring_cstr((char *)name);
|
||||
rb_ary_push(arg[1], str);
|
||||
}
|
||||
return ST_CONTINUE;
|
||||
}
|
||||
@ -1440,7 +1440,7 @@ enc_find(VALUE klass, VALUE enc)
|
||||
{
|
||||
int idx;
|
||||
if (is_obj_encoding(enc))
|
||||
return enc;
|
||||
return enc;
|
||||
idx = str_to_encindex(enc);
|
||||
if (idx == UNSPECIFIED_ENCODING) return Qnil;
|
||||
return rb_enc_from_encoding_index(idx);
|
||||
@ -1561,10 +1561,10 @@ rb_locale_encindex(void)
|
||||
GLOBAL_ENC_TABLE_ENTER(enc_table);
|
||||
if (enc_registered(enc_table, "locale") < 0) {
|
||||
# if defined _WIN32
|
||||
void Init_w32_codepage(void);
|
||||
Init_w32_codepage();
|
||||
void Init_w32_codepage(void);
|
||||
Init_w32_codepage();
|
||||
# endif
|
||||
enc_alias_internal(enc_table, "locale", idx);
|
||||
enc_alias_internal(enc_table, "locale", idx);
|
||||
}
|
||||
GLOBAL_ENC_TABLE_LEAVE();
|
||||
|
||||
@ -1586,7 +1586,7 @@ rb_filesystem_encindex(void)
|
||||
idx = enc_registered(enc_table, "filesystem"));
|
||||
|
||||
if (idx < 0)
|
||||
idx = ENCINDEX_ASCII_8BIT;
|
||||
idx = ENCINDEX_ASCII_8BIT;
|
||||
return idx;
|
||||
}
|
||||
|
||||
@ -1609,8 +1609,8 @@ enc_set_default_encoding(struct default_encoding *def, VALUE encoding, const cha
|
||||
int overridden = FALSE;
|
||||
|
||||
if (def->index != -2)
|
||||
/* Already set */
|
||||
overridden = TRUE;
|
||||
/* Already set */
|
||||
overridden = TRUE;
|
||||
|
||||
GLOBAL_ENC_TABLE_ENTER(enc_table);
|
||||
{
|
||||
@ -1809,45 +1809,45 @@ set_encoding_const(const char *name, rb_encoding *enc)
|
||||
|
||||
if (ISDIGIT(*s)) return;
|
||||
if (ISUPPER(*s)) {
|
||||
hasupper = 1;
|
||||
while (*++s && (ISALNUM(*s) || *s == '_')) {
|
||||
if (ISLOWER(*s)) haslower = 1;
|
||||
}
|
||||
hasupper = 1;
|
||||
while (*++s && (ISALNUM(*s) || *s == '_')) {
|
||||
if (ISLOWER(*s)) haslower = 1;
|
||||
}
|
||||
}
|
||||
if (!*s) {
|
||||
if (s - name > ENCODING_NAMELEN_MAX) return;
|
||||
valid = 1;
|
||||
rb_define_const(rb_cEncoding, name, encoding);
|
||||
if (s - name > ENCODING_NAMELEN_MAX) return;
|
||||
valid = 1;
|
||||
rb_define_const(rb_cEncoding, name, encoding);
|
||||
}
|
||||
if (!valid || haslower) {
|
||||
size_t len = s - name;
|
||||
if (len > ENCODING_NAMELEN_MAX) return;
|
||||
if (!haslower || !hasupper) {
|
||||
do {
|
||||
if (ISLOWER(*s)) haslower = 1;
|
||||
if (ISUPPER(*s)) hasupper = 1;
|
||||
} while (*++s && (!haslower || !hasupper));
|
||||
len = s - name;
|
||||
}
|
||||
len += strlen(s);
|
||||
if (len++ > ENCODING_NAMELEN_MAX) return;
|
||||
MEMCPY(s = ALLOCA_N(char, len), name, char, len);
|
||||
name = s;
|
||||
if (!valid) {
|
||||
if (ISLOWER(*s)) *s = ONIGENC_ASCII_CODE_TO_UPPER_CASE((int)*s);
|
||||
for (; *s; ++s) {
|
||||
if (!ISALNUM(*s)) *s = '_';
|
||||
}
|
||||
if (hasupper) {
|
||||
rb_define_const(rb_cEncoding, name, encoding);
|
||||
}
|
||||
}
|
||||
if (haslower) {
|
||||
for (s = (char *)name; *s; ++s) {
|
||||
if (ISLOWER(*s)) *s = ONIGENC_ASCII_CODE_TO_UPPER_CASE((int)*s);
|
||||
}
|
||||
rb_define_const(rb_cEncoding, name, encoding);
|
||||
}
|
||||
size_t len = s - name;
|
||||
if (len > ENCODING_NAMELEN_MAX) return;
|
||||
if (!haslower || !hasupper) {
|
||||
do {
|
||||
if (ISLOWER(*s)) haslower = 1;
|
||||
if (ISUPPER(*s)) hasupper = 1;
|
||||
} while (*++s && (!haslower || !hasupper));
|
||||
len = s - name;
|
||||
}
|
||||
len += strlen(s);
|
||||
if (len++ > ENCODING_NAMELEN_MAX) return;
|
||||
MEMCPY(s = ALLOCA_N(char, len), name, char, len);
|
||||
name = s;
|
||||
if (!valid) {
|
||||
if (ISLOWER(*s)) *s = ONIGENC_ASCII_CODE_TO_UPPER_CASE((int)*s);
|
||||
for (; *s; ++s) {
|
||||
if (!ISALNUM(*s)) *s = '_';
|
||||
}
|
||||
if (hasupper) {
|
||||
rb_define_const(rb_cEncoding, name, encoding);
|
||||
}
|
||||
}
|
||||
if (haslower) {
|
||||
for (s = (char *)name; *s; ++s) {
|
||||
if (ISLOWER(*s)) *s = ONIGENC_ASCII_CODE_TO_UPPER_CASE((int)*s);
|
||||
}
|
||||
rb_define_const(rb_cEncoding, name, encoding);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -1898,14 +1898,14 @@ rb_enc_aliases_enc_i(st_data_t name, st_data_t orig, st_data_t arg)
|
||||
VALUE key, str = rb_ary_entry(ary, idx);
|
||||
|
||||
if (NIL_P(str)) {
|
||||
rb_encoding *enc = rb_enc_from_index(idx);
|
||||
rb_encoding *enc = rb_enc_from_index(idx);
|
||||
|
||||
if (!enc) return ST_CONTINUE;
|
||||
if (STRCASECMP((char*)name, rb_enc_name(enc)) == 0) {
|
||||
return ST_CONTINUE;
|
||||
}
|
||||
str = rb_fstring_cstr(rb_enc_name(enc));
|
||||
rb_ary_store(ary, idx, str);
|
||||
if (!enc) return ST_CONTINUE;
|
||||
if (STRCASECMP((char*)name, rb_enc_name(enc)) == 0) {
|
||||
return ST_CONTINUE;
|
||||
}
|
||||
str = rb_fstring_cstr(rb_enc_name(enc));
|
||||
rb_ary_store(ary, idx, str);
|
||||
}
|
||||
key = rb_fstring_cstr((char *)name);
|
||||
rb_hash_aset(aliases, key, str);
|
||||
@ -2012,7 +2012,7 @@ Init_Encoding(void)
|
||||
rb_gc_register_mark_object(list);
|
||||
|
||||
for (i = 0; i < enc_table->count; ++i) {
|
||||
rb_ary_push(list, enc_new(enc_table->list[i].enc));
|
||||
rb_ary_push(list, enc_new(enc_table->list[i].enc));
|
||||
}
|
||||
|
||||
rb_marshal_define_compat(rb_cEncoding, Qnil, 0, enc_m_loader);
|
||||
|
438
enumerator.c
438
enumerator.c
@ -240,9 +240,9 @@ enumerator_memsize(const void *p)
|
||||
static const rb_data_type_t enumerator_data_type = {
|
||||
"enumerator",
|
||||
{
|
||||
enumerator_mark,
|
||||
enumerator_free,
|
||||
enumerator_memsize,
|
||||
enumerator_mark,
|
||||
enumerator_free,
|
||||
enumerator_memsize,
|
||||
enumerator_compact,
|
||||
},
|
||||
0, 0, RUBY_TYPED_FREE_IMMEDIATELY
|
||||
@ -255,7 +255,7 @@ enumerator_ptr(VALUE obj)
|
||||
|
||||
TypedData_Get_Struct(obj, struct enumerator, &enumerator_data_type, ptr);
|
||||
if (!ptr || ptr->obj == Qundef) {
|
||||
rb_raise(rb_eArgError, "uninitialized enumerator");
|
||||
rb_raise(rb_eArgError, "uninitialized enumerator");
|
||||
}
|
||||
return ptr;
|
||||
}
|
||||
@ -287,9 +287,9 @@ proc_entry_memsize(const void *p)
|
||||
static const rb_data_type_t proc_entry_data_type = {
|
||||
"proc_entry",
|
||||
{
|
||||
proc_entry_mark,
|
||||
proc_entry_free,
|
||||
proc_entry_memsize,
|
||||
proc_entry_mark,
|
||||
proc_entry_free,
|
||||
proc_entry_memsize,
|
||||
proc_entry_compact,
|
||||
},
|
||||
};
|
||||
@ -371,12 +371,12 @@ obj_to_enum(int argc, VALUE *argv, VALUE obj)
|
||||
VALUE enumerator, meth = sym_each;
|
||||
|
||||
if (argc > 0) {
|
||||
--argc;
|
||||
meth = *argv++;
|
||||
--argc;
|
||||
meth = *argv++;
|
||||
}
|
||||
enumerator = rb_enumeratorize_with_size(obj, meth, argc, argv, 0);
|
||||
if (rb_block_given_p()) {
|
||||
enumerator_ptr(enumerator)->size = rb_block_proc();
|
||||
enumerator_ptr(enumerator)->size = rb_block_proc();
|
||||
}
|
||||
return enumerator;
|
||||
}
|
||||
@ -402,7 +402,7 @@ enumerator_init(VALUE enum_obj, VALUE obj, VALUE meth, int argc, const VALUE *ar
|
||||
TypedData_Get_Struct(enum_obj, struct enumerator, &enumerator_data_type, ptr);
|
||||
|
||||
if (!ptr) {
|
||||
rb_raise(rb_eArgError, "unallocated enumerator");
|
||||
rb_raise(rb_eArgError, "unallocated enumerator");
|
||||
}
|
||||
|
||||
ptr->obj = obj;
|
||||
@ -482,14 +482,14 @@ enumerator_init_copy(VALUE obj, VALUE orig)
|
||||
if (!OBJ_INIT_COPY(obj, orig)) return obj;
|
||||
ptr0 = enumerator_ptr(orig);
|
||||
if (ptr0->fib) {
|
||||
/* Fibers cannot be copied */
|
||||
rb_raise(rb_eTypeError, "can't copy execution context");
|
||||
/* Fibers cannot be copied */
|
||||
rb_raise(rb_eTypeError, "can't copy execution context");
|
||||
}
|
||||
|
||||
TypedData_Get_Struct(obj, struct enumerator, &enumerator_data_type, ptr1);
|
||||
|
||||
if (!ptr1) {
|
||||
rb_raise(rb_eArgError, "unallocated enumerator");
|
||||
rb_raise(rb_eArgError, "unallocated enumerator");
|
||||
}
|
||||
|
||||
ptr1->obj = ptr0->obj;
|
||||
@ -547,8 +547,8 @@ enumerator_block_call(VALUE obj, rb_block_call_func *func, VALUE arg)
|
||||
ID meth = e->meth;
|
||||
|
||||
if (e->args) {
|
||||
argc = RARRAY_LENINT(e->args);
|
||||
argv = RARRAY_CONST_PTR(e->args);
|
||||
argc = RARRAY_LENINT(e->args);
|
||||
argv = RARRAY_CONST_PTR(e->args);
|
||||
}
|
||||
return rb_block_call_kw(e->obj, meth, argc, argv, func, arg, e->kw_splat);
|
||||
}
|
||||
@ -593,20 +593,20 @@ static VALUE
|
||||
enumerator_each(int argc, VALUE *argv, VALUE obj)
|
||||
{
|
||||
if (argc > 0) {
|
||||
struct enumerator *e = enumerator_ptr(obj = rb_obj_dup(obj));
|
||||
VALUE args = e->args;
|
||||
if (args) {
|
||||
struct enumerator *e = enumerator_ptr(obj = rb_obj_dup(obj));
|
||||
VALUE args = e->args;
|
||||
if (args) {
|
||||
#if SIZEOF_INT < SIZEOF_LONG
|
||||
/* check int range overflow */
|
||||
rb_long2int(RARRAY_LEN(args) + argc);
|
||||
/* check int range overflow */
|
||||
rb_long2int(RARRAY_LEN(args) + argc);
|
||||
#endif
|
||||
args = rb_ary_dup(args);
|
||||
rb_ary_cat(args, argv, argc);
|
||||
}
|
||||
else {
|
||||
args = rb_ary_new4(argc, argv);
|
||||
}
|
||||
e->args = args;
|
||||
args = rb_ary_dup(args);
|
||||
rb_ary_cat(args, argv, argc);
|
||||
}
|
||||
else {
|
||||
args = rb_ary_new4(argc, argv);
|
||||
}
|
||||
e->args = args;
|
||||
e->size = Qnil;
|
||||
e->size_fn = 0;
|
||||
}
|
||||
@ -622,7 +622,7 @@ enumerator_with_index_i(RB_BLOCK_CALL_FUNC_ARGLIST(val, m))
|
||||
MEMO_V1_SET(memo, rb_int_succ(idx));
|
||||
|
||||
if (argc <= 1)
|
||||
return rb_yield_values(2, val, idx);
|
||||
return rb_yield_values(2, val, idx);
|
||||
|
||||
return rb_yield_values(2, rb_ary_new4(argc, argv), idx);
|
||||
}
|
||||
@ -679,7 +679,7 @@ static VALUE
|
||||
enumerator_with_object_i(RB_BLOCK_CALL_FUNC_ARGLIST(val, memo))
|
||||
{
|
||||
if (argc <= 1)
|
||||
return rb_yield_values(2, val, memo);
|
||||
return rb_yield_values(2, val, memo);
|
||||
|
||||
return rb_yield_values(2, rb_ary_new4(argc, argv), memo);
|
||||
}
|
||||
@ -764,21 +764,21 @@ get_next_values(VALUE obj, struct enumerator *e)
|
||||
VALUE curr, vs;
|
||||
|
||||
if (e->stop_exc)
|
||||
rb_exc_raise(e->stop_exc);
|
||||
rb_exc_raise(e->stop_exc);
|
||||
|
||||
curr = rb_fiber_current();
|
||||
|
||||
if (!e->fib || !rb_fiber_alive_p(e->fib)) {
|
||||
next_init(obj, e);
|
||||
next_init(obj, e);
|
||||
}
|
||||
|
||||
vs = rb_fiber_resume(e->fib, 1, &curr);
|
||||
if (e->stop_exc) {
|
||||
e->fib = 0;
|
||||
e->dst = Qnil;
|
||||
e->lookahead = Qundef;
|
||||
e->feedvalue = Qundef;
|
||||
rb_exc_raise(e->stop_exc);
|
||||
e->fib = 0;
|
||||
e->dst = Qnil;
|
||||
e->lookahead = Qundef;
|
||||
e->feedvalue = Qundef;
|
||||
rb_exc_raise(e->stop_exc);
|
||||
}
|
||||
return vs;
|
||||
}
|
||||
@ -1020,7 +1020,7 @@ enumerator_feed(VALUE obj, VALUE v)
|
||||
struct enumerator *e = enumerator_ptr(obj);
|
||||
|
||||
if (e->feedvalue != Qundef) {
|
||||
rb_raise(rb_eTypeError, "feed value already set");
|
||||
rb_raise(rb_eTypeError, "feed value already set");
|
||||
}
|
||||
e->feedvalue = v;
|
||||
|
||||
@ -1065,36 +1065,36 @@ inspect_enumerator(VALUE obj, VALUE dummy, int recur)
|
||||
cname = rb_obj_class(obj);
|
||||
|
||||
if (!e || e->obj == Qundef) {
|
||||
return rb_sprintf("#<%"PRIsVALUE": uninitialized>", rb_class_path(cname));
|
||||
return rb_sprintf("#<%"PRIsVALUE": uninitialized>", rb_class_path(cname));
|
||||
}
|
||||
|
||||
if (recur) {
|
||||
str = rb_sprintf("#<%"PRIsVALUE": ...>", rb_class_path(cname));
|
||||
return str;
|
||||
str = rb_sprintf("#<%"PRIsVALUE": ...>", rb_class_path(cname));
|
||||
return str;
|
||||
}
|
||||
|
||||
if (e->procs) {
|
||||
long i;
|
||||
long i;
|
||||
|
||||
eobj = generator_ptr(e->obj)->obj;
|
||||
/* In case procs chained enumerator traversing all proc entries manually */
|
||||
if (rb_obj_class(eobj) == cname) {
|
||||
str = rb_inspect(eobj);
|
||||
}
|
||||
else {
|
||||
str = rb_sprintf("#<%"PRIsVALUE": %+"PRIsVALUE">", rb_class_path(cname), eobj);
|
||||
}
|
||||
for (i = 0; i < RARRAY_LEN(e->procs); i++) {
|
||||
str = rb_sprintf("#<%"PRIsVALUE": %"PRIsVALUE, cname, str);
|
||||
append_method(RARRAY_AREF(e->procs, i), str, e->meth, e->args);
|
||||
rb_str_buf_cat2(str, ">");
|
||||
}
|
||||
return str;
|
||||
eobj = generator_ptr(e->obj)->obj;
|
||||
/* In case procs chained enumerator traversing all proc entries manually */
|
||||
if (rb_obj_class(eobj) == cname) {
|
||||
str = rb_inspect(eobj);
|
||||
}
|
||||
else {
|
||||
str = rb_sprintf("#<%"PRIsVALUE": %+"PRIsVALUE">", rb_class_path(cname), eobj);
|
||||
}
|
||||
for (i = 0; i < RARRAY_LEN(e->procs); i++) {
|
||||
str = rb_sprintf("#<%"PRIsVALUE": %"PRIsVALUE, cname, str);
|
||||
append_method(RARRAY_AREF(e->procs, i), str, e->meth, e->args);
|
||||
rb_str_buf_cat2(str, ">");
|
||||
}
|
||||
return str;
|
||||
}
|
||||
|
||||
eobj = rb_attr_get(obj, id_receiver);
|
||||
if (NIL_P(eobj)) {
|
||||
eobj = e->obj;
|
||||
eobj = e->obj;
|
||||
}
|
||||
|
||||
/* (1..100).each_cons(2) => "#<Enumerator: 1..100:each_cons(2)>" */
|
||||
@ -1129,48 +1129,48 @@ append_method(VALUE obj, VALUE str, ID default_method, VALUE default_args)
|
||||
|
||||
method = rb_attr_get(obj, id_method);
|
||||
if (method != Qfalse) {
|
||||
if (!NIL_P(method)) {
|
||||
Check_Type(method, T_SYMBOL);
|
||||
method = rb_sym2str(method);
|
||||
}
|
||||
else {
|
||||
method = rb_id2str(default_method);
|
||||
}
|
||||
rb_str_buf_cat2(str, ":");
|
||||
rb_str_buf_append(str, method);
|
||||
if (!NIL_P(method)) {
|
||||
Check_Type(method, T_SYMBOL);
|
||||
method = rb_sym2str(method);
|
||||
}
|
||||
else {
|
||||
method = rb_id2str(default_method);
|
||||
}
|
||||
rb_str_buf_cat2(str, ":");
|
||||
rb_str_buf_append(str, method);
|
||||
}
|
||||
|
||||
eargs = rb_attr_get(obj, id_arguments);
|
||||
if (NIL_P(eargs)) {
|
||||
eargs = default_args;
|
||||
eargs = default_args;
|
||||
}
|
||||
if (eargs != Qfalse) {
|
||||
long argc = RARRAY_LEN(eargs);
|
||||
const VALUE *argv = RARRAY_CONST_PTR(eargs); /* WB: no new reference */
|
||||
long argc = RARRAY_LEN(eargs);
|
||||
const VALUE *argv = RARRAY_CONST_PTR(eargs); /* WB: no new reference */
|
||||
|
||||
if (argc > 0) {
|
||||
VALUE kwds = Qnil;
|
||||
if (argc > 0) {
|
||||
VALUE kwds = Qnil;
|
||||
|
||||
rb_str_buf_cat2(str, "(");
|
||||
rb_str_buf_cat2(str, "(");
|
||||
|
||||
if (RB_TYPE_P(argv[argc-1], T_HASH) && !RHASH_EMPTY_P(argv[argc-1])) {
|
||||
int all_key = TRUE;
|
||||
rb_hash_foreach(argv[argc-1], key_symbol_p, (VALUE)&all_key);
|
||||
if (all_key) kwds = argv[--argc];
|
||||
}
|
||||
int all_key = TRUE;
|
||||
rb_hash_foreach(argv[argc-1], key_symbol_p, (VALUE)&all_key);
|
||||
if (all_key) kwds = argv[--argc];
|
||||
}
|
||||
|
||||
while (argc--) {
|
||||
VALUE arg = *argv++;
|
||||
while (argc--) {
|
||||
VALUE arg = *argv++;
|
||||
|
||||
rb_str_append(str, rb_inspect(arg));
|
||||
rb_str_buf_cat2(str, ", ");
|
||||
}
|
||||
if (!NIL_P(kwds)) {
|
||||
rb_hash_foreach(kwds, kwd_append, str);
|
||||
}
|
||||
rb_str_set_len(str, RSTRING_LEN(str)-2);
|
||||
rb_str_buf_cat2(str, ")");
|
||||
}
|
||||
rb_str_append(str, rb_inspect(arg));
|
||||
rb_str_buf_cat2(str, ", ");
|
||||
}
|
||||
if (!NIL_P(kwds)) {
|
||||
rb_hash_foreach(kwds, kwd_append, str);
|
||||
}
|
||||
rb_str_set_len(str, RSTRING_LEN(str)-2);
|
||||
rb_str_buf_cat2(str, ")");
|
||||
}
|
||||
}
|
||||
|
||||
return str;
|
||||
@ -1209,28 +1209,28 @@ enumerator_size(VALUE obj)
|
||||
VALUE size;
|
||||
|
||||
if (e->procs) {
|
||||
struct generator *g = generator_ptr(e->obj);
|
||||
VALUE receiver = rb_check_funcall(g->obj, id_size, 0, 0);
|
||||
long i = 0;
|
||||
struct generator *g = generator_ptr(e->obj);
|
||||
VALUE receiver = rb_check_funcall(g->obj, id_size, 0, 0);
|
||||
long i = 0;
|
||||
|
||||
for (i = 0; i < RARRAY_LEN(e->procs); i++) {
|
||||
VALUE proc = RARRAY_AREF(e->procs, i);
|
||||
struct proc_entry *entry = proc_entry_ptr(proc);
|
||||
lazyenum_size_func *size_fn = entry->fn->size;
|
||||
if (!size_fn) {
|
||||
return Qnil;
|
||||
}
|
||||
receiver = (*size_fn)(proc, receiver);
|
||||
}
|
||||
return receiver;
|
||||
for (i = 0; i < RARRAY_LEN(e->procs); i++) {
|
||||
VALUE proc = RARRAY_AREF(e->procs, i);
|
||||
struct proc_entry *entry = proc_entry_ptr(proc);
|
||||
lazyenum_size_func *size_fn = entry->fn->size;
|
||||
if (!size_fn) {
|
||||
return Qnil;
|
||||
}
|
||||
receiver = (*size_fn)(proc, receiver);
|
||||
}
|
||||
return receiver;
|
||||
}
|
||||
|
||||
if (e->size_fn) {
|
||||
return (*e->size_fn)(e->obj, e->args, obj);
|
||||
return (*e->size_fn)(e->obj, e->args, obj);
|
||||
}
|
||||
if (e->args) {
|
||||
argc = (int)RARRAY_LEN(e->args);
|
||||
argv = RARRAY_CONST_PTR(e->args);
|
||||
argc = (int)RARRAY_LEN(e->args);
|
||||
argv = RARRAY_CONST_PTR(e->args);
|
||||
}
|
||||
size = rb_check_funcall_kw(e->size, id_call, argc, argv, e->kw_splat);
|
||||
if (size != Qundef) return size;
|
||||
@ -1265,9 +1265,9 @@ yielder_memsize(const void *p)
|
||||
static const rb_data_type_t yielder_data_type = {
|
||||
"yielder",
|
||||
{
|
||||
yielder_mark,
|
||||
yielder_free,
|
||||
yielder_memsize,
|
||||
yielder_mark,
|
||||
yielder_free,
|
||||
yielder_memsize,
|
||||
yielder_compact,
|
||||
},
|
||||
0, 0, RUBY_TYPED_FREE_IMMEDIATELY
|
||||
@ -1280,7 +1280,7 @@ yielder_ptr(VALUE obj)
|
||||
|
||||
TypedData_Get_Struct(obj, struct yielder, &yielder_data_type, ptr);
|
||||
if (!ptr || ptr->proc == Qundef) {
|
||||
rb_raise(rb_eArgError, "uninitialized yielder");
|
||||
rb_raise(rb_eArgError, "uninitialized yielder");
|
||||
}
|
||||
return ptr;
|
||||
}
|
||||
@ -1306,7 +1306,7 @@ yielder_init(VALUE obj, VALUE proc)
|
||||
TypedData_Get_Struct(obj, struct yielder, &yielder_data_type, ptr);
|
||||
|
||||
if (!ptr) {
|
||||
rb_raise(rb_eArgError, "unallocated yielder");
|
||||
rb_raise(rb_eArgError, "unallocated yielder");
|
||||
}
|
||||
|
||||
ptr->proc = proc;
|
||||
@ -1405,9 +1405,9 @@ generator_memsize(const void *p)
|
||||
static const rb_data_type_t generator_data_type = {
|
||||
"generator",
|
||||
{
|
||||
generator_mark,
|
||||
generator_free,
|
||||
generator_memsize,
|
||||
generator_mark,
|
||||
generator_free,
|
||||
generator_memsize,
|
||||
generator_compact,
|
||||
},
|
||||
0, 0, RUBY_TYPED_FREE_IMMEDIATELY
|
||||
@ -1420,7 +1420,7 @@ generator_ptr(VALUE obj)
|
||||
|
||||
TypedData_Get_Struct(obj, struct generator, &generator_data_type, ptr);
|
||||
if (!ptr || ptr->proc == Qundef) {
|
||||
rb_raise(rb_eArgError, "uninitialized generator");
|
||||
rb_raise(rb_eArgError, "uninitialized generator");
|
||||
}
|
||||
return ptr;
|
||||
}
|
||||
@ -1447,7 +1447,7 @@ generator_init(VALUE obj, VALUE proc)
|
||||
TypedData_Get_Struct(obj, struct generator, &generator_data_type, ptr);
|
||||
|
||||
if (!ptr) {
|
||||
rb_raise(rb_eArgError, "unallocated generator");
|
||||
rb_raise(rb_eArgError, "unallocated generator");
|
||||
}
|
||||
|
||||
ptr->proc = proc;
|
||||
@ -1462,21 +1462,21 @@ generator_initialize(int argc, VALUE *argv, VALUE obj)
|
||||
VALUE proc;
|
||||
|
||||
if (argc == 0) {
|
||||
rb_need_block();
|
||||
rb_need_block();
|
||||
|
||||
proc = rb_block_proc();
|
||||
proc = rb_block_proc();
|
||||
}
|
||||
else {
|
||||
rb_scan_args(argc, argv, "1", &proc);
|
||||
rb_scan_args(argc, argv, "1", &proc);
|
||||
|
||||
if (!rb_obj_is_proc(proc))
|
||||
rb_raise(rb_eTypeError,
|
||||
"wrong argument type %"PRIsVALUE" (expected Proc)",
|
||||
rb_obj_class(proc));
|
||||
if (!rb_obj_is_proc(proc))
|
||||
rb_raise(rb_eTypeError,
|
||||
"wrong argument type %"PRIsVALUE" (expected Proc)",
|
||||
rb_obj_class(proc));
|
||||
|
||||
if (rb_block_given_p()) {
|
||||
rb_warn("given block not used");
|
||||
}
|
||||
if (rb_block_given_p()) {
|
||||
rb_warn("given block not used");
|
||||
}
|
||||
}
|
||||
|
||||
return generator_init(obj, proc);
|
||||
@ -1495,7 +1495,7 @@ generator_init_copy(VALUE obj, VALUE orig)
|
||||
TypedData_Get_Struct(obj, struct generator, &generator_data_type, ptr1);
|
||||
|
||||
if (!ptr1) {
|
||||
rb_raise(rb_eArgError, "unallocated generator");
|
||||
rb_raise(rb_eArgError, "unallocated generator");
|
||||
}
|
||||
|
||||
ptr1->proc = ptr0->proc;
|
||||
@ -1512,7 +1512,7 @@ generator_each(int argc, VALUE *argv, VALUE obj)
|
||||
|
||||
rb_ary_push(args, yielder_new());
|
||||
if (argc > 0) {
|
||||
rb_ary_cat(args, argv, argc);
|
||||
rb_ary_cat(args, argv, argc);
|
||||
}
|
||||
|
||||
return rb_proc_call_kw(ptr->proc, args, RB_PASS_CALLED_KEYWORDS);
|
||||
@ -1539,22 +1539,22 @@ lazy_init_iterator(RB_BLOCK_CALL_FUNC_ARGLIST(val, m))
|
||||
{
|
||||
VALUE result;
|
||||
if (argc == 1) {
|
||||
VALUE args[2];
|
||||
args[0] = m;
|
||||
args[1] = val;
|
||||
result = rb_yield_values2(2, args);
|
||||
VALUE args[2];
|
||||
args[0] = m;
|
||||
args[1] = val;
|
||||
result = rb_yield_values2(2, args);
|
||||
}
|
||||
else {
|
||||
VALUE args;
|
||||
int len = rb_long2int((long)argc + 1);
|
||||
VALUE *nargv = ALLOCV_N(VALUE, args, len);
|
||||
VALUE args;
|
||||
int len = rb_long2int((long)argc + 1);
|
||||
VALUE *nargv = ALLOCV_N(VALUE, args, len);
|
||||
|
||||
nargv[0] = m;
|
||||
if (argc > 0) {
|
||||
MEMCPY(nargv + 1, argv, VALUE, argc);
|
||||
}
|
||||
result = rb_yield_values2(len, nargv);
|
||||
ALLOCV_END(args);
|
||||
nargv[0] = m;
|
||||
if (argc > 0) {
|
||||
MEMCPY(nargv + 1, argv, VALUE, argc);
|
||||
}
|
||||
result = rb_yield_values2(len, nargv);
|
||||
ALLOCV_END(args);
|
||||
}
|
||||
if (result == Qundef) rb_iter_break();
|
||||
return Qnil;
|
||||
@ -1590,7 +1590,7 @@ lazy_init_yielder(RB_BLOCK_CALL_FUNC_ARGLIST(_, m))
|
||||
struct MEMO *result;
|
||||
|
||||
result = MEMO_NEW(m, rb_enum_values_pack(argc, argv),
|
||||
argc > 1 ? LAZY_MEMO_PACKED : 0);
|
||||
argc > 1 ? LAZY_MEMO_PACKED : 0);
|
||||
return lazy_yielder_result(result, yielder, procs_array, memos, 0);
|
||||
}
|
||||
|
||||
@ -1615,19 +1615,19 @@ lazy_yielder_result(struct MEMO *result, VALUE yielder, VALUE procs_array, VALUE
|
||||
int cont = 1;
|
||||
|
||||
for (; i < RARRAY_LEN(procs_array); i++) {
|
||||
VALUE proc = RARRAY_AREF(procs_array, i);
|
||||
struct proc_entry *entry = proc_entry_ptr(proc);
|
||||
if (!(*entry->fn->proc)(proc, result, memos, i)) {
|
||||
cont = 0;
|
||||
break;
|
||||
}
|
||||
VALUE proc = RARRAY_AREF(procs_array, i);
|
||||
struct proc_entry *entry = proc_entry_ptr(proc);
|
||||
if (!(*entry->fn->proc)(proc, result, memos, i)) {
|
||||
cont = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (cont) {
|
||||
rb_funcall2(yielder, idLTLT, 1, &(result->memo_value));
|
||||
rb_funcall2(yielder, idLTLT, 1, &(result->memo_value));
|
||||
}
|
||||
if (LAZY_MEMO_BREAK_P(result)) {
|
||||
rb_iter_break();
|
||||
rb_iter_break();
|
||||
}
|
||||
return result->memo_value;
|
||||
}
|
||||
@ -1639,7 +1639,7 @@ lazy_init_block(RB_BLOCK_CALL_FUNC_ARGLIST(val, m))
|
||||
|
||||
rb_ivar_set(val, id_memo, rb_ary_new2(RARRAY_LEN(procs)));
|
||||
rb_block_call(RARRAY_AREF(m, 0), id_each, 0, 0,
|
||||
lazy_init_yielder, rb_ary_new3(2, val, procs));
|
||||
lazy_init_yielder, rb_ary_new3(2, val, procs));
|
||||
return Qnil;
|
||||
}
|
||||
|
||||
@ -1652,17 +1652,17 @@ lazy_generator_init(VALUE enumerator, VALUE procs)
|
||||
struct enumerator *e = enumerator_ptr(enumerator);
|
||||
|
||||
if (RARRAY_LEN(procs) > 0) {
|
||||
struct generator *old_gen_ptr = generator_ptr(e->obj);
|
||||
obj = old_gen_ptr->obj;
|
||||
struct generator *old_gen_ptr = generator_ptr(e->obj);
|
||||
obj = old_gen_ptr->obj;
|
||||
}
|
||||
else {
|
||||
obj = enumerator;
|
||||
obj = enumerator;
|
||||
}
|
||||
|
||||
generator = generator_allocate(rb_cGenerator);
|
||||
|
||||
rb_block_call(generator, id_initialize, 0, 0,
|
||||
lazy_init_block, rb_ary_new3(2, obj, procs));
|
||||
lazy_init_block, rb_ary_new3(2, obj, procs));
|
||||
|
||||
gen_ptr = generator_ptr(generator);
|
||||
gen_ptr->obj = obj;
|
||||
@ -1767,11 +1767,11 @@ lazy_initialize(int argc, VALUE *argv, VALUE self)
|
||||
|
||||
rb_check_arity(argc, 1, 2);
|
||||
if (!rb_block_given_p()) {
|
||||
rb_raise(rb_eArgError, "tried to call lazy new without a block");
|
||||
rb_raise(rb_eArgError, "tried to call lazy new without a block");
|
||||
}
|
||||
obj = argv[0];
|
||||
if (argc > 1) {
|
||||
size = argv[1];
|
||||
size = argv[1];
|
||||
}
|
||||
generator = generator_allocate(rb_cGenerator);
|
||||
rb_block_call(generator, id_initialize, 0, 0, lazy_init_block_i, obj);
|
||||
@ -1801,11 +1801,11 @@ lazy_set_args(VALUE lazy, VALUE args)
|
||||
ID id = rb_frame_this_func();
|
||||
rb_ivar_set(lazy, id_method, ID2SYM(id));
|
||||
if (NIL_P(args)) {
|
||||
/* Qfalse indicates that the arguments are empty */
|
||||
rb_ivar_set(lazy, id_arguments, Qfalse);
|
||||
/* Qfalse indicates that the arguments are empty */
|
||||
rb_ivar_set(lazy, id_arguments, Qfalse);
|
||||
}
|
||||
else {
|
||||
rb_ivar_set(lazy, id_arguments, args);
|
||||
rb_ivar_set(lazy, id_arguments, args);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1822,7 +1822,7 @@ lazy_set_method(VALUE lazy, VALUE args, rb_enumerator_size_func *size_fn)
|
||||
|
||||
static VALUE
|
||||
lazy_add_method(VALUE obj, int argc, VALUE *argv, VALUE args, VALUE memo,
|
||||
const lazyenum_funcs *fn)
|
||||
const lazyenum_funcs *fn)
|
||||
{
|
||||
struct enumerator *new_e;
|
||||
VALUE new_obj;
|
||||
@ -1831,9 +1831,9 @@ lazy_add_method(VALUE obj, int argc, VALUE *argv, VALUE args, VALUE memo,
|
||||
struct enumerator *e = enumerator_ptr(obj);
|
||||
struct proc_entry *entry;
|
||||
VALUE entry_obj = TypedData_Make_Struct(rb_cObject, struct proc_entry,
|
||||
&proc_entry_data_type, entry);
|
||||
&proc_entry_data_type, entry);
|
||||
if (rb_block_given_p()) {
|
||||
entry->proc = rb_block_proc();
|
||||
entry->proc = rb_block_proc();
|
||||
}
|
||||
entry->fn = fn;
|
||||
entry->memo = args;
|
||||
@ -1850,11 +1850,11 @@ lazy_add_method(VALUE obj, int argc, VALUE *argv, VALUE args, VALUE memo,
|
||||
new_e->procs = new_procs;
|
||||
|
||||
if (argc > 0) {
|
||||
new_e->meth = rb_to_id(*argv++);
|
||||
--argc;
|
||||
new_e->meth = rb_to_id(*argv++);
|
||||
--argc;
|
||||
}
|
||||
else {
|
||||
new_e->meth = id_each;
|
||||
new_e->meth = id_each;
|
||||
}
|
||||
new_e->args = rb_ary_new4(argc, argv);
|
||||
return new_obj;
|
||||
@ -1934,15 +1934,15 @@ lazy_to_enum(int argc, VALUE *argv, VALUE self)
|
||||
VALUE lazy, meth = sym_each, super_meth;
|
||||
|
||||
if (argc > 0) {
|
||||
--argc;
|
||||
meth = *argv++;
|
||||
--argc;
|
||||
meth = *argv++;
|
||||
}
|
||||
if (RTEST((super_meth = rb_hash_aref(lazy_use_super_method, meth)))) {
|
||||
meth = super_meth;
|
||||
}
|
||||
lazy = lazy_to_enum_i(self, meth, argc, argv, 0, rb_keyword_given_p());
|
||||
if (rb_block_given_p()) {
|
||||
enumerator_ptr(lazy)->size = rb_block_proc();
|
||||
enumerator_ptr(lazy)->size = rb_block_proc();
|
||||
}
|
||||
return lazy;
|
||||
}
|
||||
@ -1981,9 +1981,9 @@ lazyenum_yield_values(VALUE proc_entry, struct MEMO *result)
|
||||
int argc = 1;
|
||||
const VALUE *argv = &result->memo_value;
|
||||
if (LAZY_MEMO_PACKED_P(result)) {
|
||||
const VALUE args = *argv;
|
||||
argc = RARRAY_LENINT(args);
|
||||
argv = RARRAY_CONST_PTR(args);
|
||||
const VALUE args = *argv;
|
||||
argc = RARRAY_LENINT(args);
|
||||
argv = RARRAY_CONST_PTR(args);
|
||||
}
|
||||
return rb_proc_call_with_block(entry->proc, argc, argv, Qnil);
|
||||
}
|
||||
@ -2024,7 +2024,7 @@ static VALUE
|
||||
lazy_map(VALUE obj)
|
||||
{
|
||||
if (!rb_block_given_p()) {
|
||||
rb_raise(rb_eArgError, "tried to call lazy map without a block");
|
||||
rb_raise(rb_eArgError, "tried to call lazy map without a block");
|
||||
}
|
||||
|
||||
return lazy_add_method(obj, 0, 0, Qnil, Qnil, &lazy_map_funcs);
|
||||
@ -2109,7 +2109,7 @@ static VALUE
|
||||
lazy_flat_map(VALUE obj)
|
||||
{
|
||||
if (!rb_block_given_p()) {
|
||||
rb_raise(rb_eArgError, "tried to call lazy flat_map without a block");
|
||||
rb_raise(rb_eArgError, "tried to call lazy flat_map without a block");
|
||||
}
|
||||
|
||||
return lazy_add_method(obj, 0, 0, Qnil, Qnil, &lazy_flat_map_funcs);
|
||||
@ -2139,7 +2139,7 @@ static VALUE
|
||||
lazy_select(VALUE obj)
|
||||
{
|
||||
if (!rb_block_given_p()) {
|
||||
rb_raise(rb_eArgError, "tried to call lazy select without a block");
|
||||
rb_raise(rb_eArgError, "tried to call lazy select without a block");
|
||||
}
|
||||
|
||||
return lazy_add_method(obj, 0, 0, Qnil, Qnil, &lazy_select_funcs);
|
||||
@ -2202,7 +2202,7 @@ static VALUE
|
||||
lazy_reject(VALUE obj)
|
||||
{
|
||||
if (!rb_block_given_p()) {
|
||||
rb_raise(rb_eArgError, "tried to call lazy reject without a block");
|
||||
rb_raise(rb_eArgError, "tried to call lazy reject without a block");
|
||||
}
|
||||
|
||||
return lazy_add_method(obj, 0, 0, Qnil, Qnil, &lazy_reject_funcs);
|
||||
@ -2251,7 +2251,7 @@ static VALUE
|
||||
lazy_grep(VALUE obj, VALUE pattern)
|
||||
{
|
||||
const lazyenum_funcs *const funcs = rb_block_given_p() ?
|
||||
&lazy_grep_iter_funcs : &lazy_grep_funcs;
|
||||
&lazy_grep_iter_funcs : &lazy_grep_funcs;
|
||||
return lazy_add_method(obj, 0, 0, pattern, rb_ary_new3(1, pattern), funcs);
|
||||
}
|
||||
|
||||
@ -2325,7 +2325,7 @@ lazy_zip_arrays_func(VALUE proc_entry, struct MEMO *result, VALUE memos, long me
|
||||
ary = rb_ary_new2(RARRAY_LEN(arrays) + 1);
|
||||
rb_ary_push(ary, result->memo_value);
|
||||
for (i = 0; i < RARRAY_LEN(arrays); i++) {
|
||||
rb_ary_push(ary, rb_ary_entry(RARRAY_AREF(arrays, i), count));
|
||||
rb_ary_push(ary, rb_ary_entry(RARRAY_AREF(arrays, i), count));
|
||||
}
|
||||
LAZY_MEMO_SET_VALUE(result, ary);
|
||||
LAZY_MEMO_SET_PACKED(result);
|
||||
@ -2343,19 +2343,19 @@ lazy_zip_func(VALUE proc_entry, struct MEMO *result, VALUE memos, long memo_inde
|
||||
long i;
|
||||
|
||||
if (NIL_P(arg)) {
|
||||
arg = rb_ary_new2(RARRAY_LEN(zip_args));
|
||||
for (i = 0; i < RARRAY_LEN(zip_args); i++) {
|
||||
rb_ary_push(arg, rb_funcall(RARRAY_AREF(zip_args, i), id_to_enum, 0));
|
||||
}
|
||||
rb_ary_store(memos, memo_index, arg);
|
||||
arg = rb_ary_new2(RARRAY_LEN(zip_args));
|
||||
for (i = 0; i < RARRAY_LEN(zip_args); i++) {
|
||||
rb_ary_push(arg, rb_funcall(RARRAY_AREF(zip_args, i), id_to_enum, 0));
|
||||
}
|
||||
rb_ary_store(memos, memo_index, arg);
|
||||
}
|
||||
|
||||
ary = rb_ary_new2(RARRAY_LEN(arg) + 1);
|
||||
rb_ary_push(ary, result->memo_value);
|
||||
for (i = 0; i < RARRAY_LEN(arg); i++) {
|
||||
v = rb_rescue2(call_next, RARRAY_AREF(arg, i), next_stopped, 0,
|
||||
rb_eStopIteration, (VALUE)0);
|
||||
rb_ary_push(ary, v);
|
||||
v = rb_rescue2(call_next, RARRAY_AREF(arg, i), next_stopped, 0,
|
||||
rb_eStopIteration, (VALUE)0);
|
||||
rb_ary_push(ary, v);
|
||||
}
|
||||
LAZY_MEMO_SET_VALUE(result, ary);
|
||||
LAZY_MEMO_SET_PACKED(result);
|
||||
@ -2383,24 +2383,24 @@ lazy_zip(int argc, VALUE *argv, VALUE obj)
|
||||
const lazyenum_funcs *funcs = &lazy_zip_funcs[1];
|
||||
|
||||
if (rb_block_given_p()) {
|
||||
return rb_call_super(argc, argv);
|
||||
return rb_call_super(argc, argv);
|
||||
}
|
||||
|
||||
ary = rb_ary_new2(argc);
|
||||
for (i = 0; i < argc; i++) {
|
||||
v = rb_check_array_type(argv[i]);
|
||||
if (NIL_P(v)) {
|
||||
for (; i < argc; i++) {
|
||||
if (!rb_respond_to(argv[i], id_each)) {
|
||||
rb_raise(rb_eTypeError, "wrong argument type %"PRIsVALUE" (must respond to :each)",
|
||||
rb_obj_class(argv[i]));
|
||||
}
|
||||
}
|
||||
ary = rb_ary_new4(argc, argv);
|
||||
funcs = &lazy_zip_funcs[0];
|
||||
break;
|
||||
}
|
||||
rb_ary_push(ary, v);
|
||||
v = rb_check_array_type(argv[i]);
|
||||
if (NIL_P(v)) {
|
||||
for (; i < argc; i++) {
|
||||
if (!rb_respond_to(argv[i], id_each)) {
|
||||
rb_raise(rb_eTypeError, "wrong argument type %"PRIsVALUE" (must respond to :each)",
|
||||
rb_obj_class(argv[i]));
|
||||
}
|
||||
}
|
||||
ary = rb_ary_new4(argc, argv);
|
||||
funcs = &lazy_zip_funcs[0];
|
||||
break;
|
||||
}
|
||||
rb_ary_push(ary, v);
|
||||
}
|
||||
|
||||
return lazy_add_method(obj, 0, 0, ary, ary, funcs);
|
||||
@ -2414,16 +2414,16 @@ lazy_take_proc(VALUE proc_entry, struct MEMO *result, VALUE memos, long memo_ind
|
||||
VALUE memo = rb_ary_entry(memos, memo_index);
|
||||
|
||||
if (NIL_P(memo)) {
|
||||
memo = entry->memo;
|
||||
memo = entry->memo;
|
||||
}
|
||||
|
||||
remain = NUM2LONG(memo);
|
||||
if (remain == 0) {
|
||||
LAZY_MEMO_SET_BREAK(result);
|
||||
LAZY_MEMO_SET_BREAK(result);
|
||||
}
|
||||
else {
|
||||
if (--remain == 0) LAZY_MEMO_SET_BREAK(result);
|
||||
rb_ary_store(memos, memo_index, LONG2NUM(remain));
|
||||
if (--remain == 0) LAZY_MEMO_SET_BREAK(result);
|
||||
rb_ary_store(memos, memo_index, LONG2NUM(remain));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
@ -2433,7 +2433,7 @@ lazy_take_size(VALUE entry, VALUE receiver)
|
||||
{
|
||||
long len = NUM2LONG(RARRAY_AREF(rb_ivar_get(entry, id_arguments), 0));
|
||||
if (NIL_P(receiver) || (FIXNUM_P(receiver) && FIX2LONG(receiver) < len))
|
||||
return receiver;
|
||||
return receiver;
|
||||
return LONG2NUM(len);
|
||||
}
|
||||
|
||||
@ -2456,7 +2456,7 @@ lazy_take(VALUE obj, VALUE n)
|
||||
VALUE argv[2];
|
||||
|
||||
if (len < 0) {
|
||||
rb_raise(rb_eArgError, "attempt to take negative size");
|
||||
rb_raise(rb_eArgError, "attempt to take negative size");
|
||||
}
|
||||
|
||||
if (len == 0) {
|
||||
@ -2473,8 +2473,8 @@ lazy_take_while_proc(VALUE proc_entry, struct MEMO *result, VALUE memos, long me
|
||||
{
|
||||
VALUE take = lazyenum_yield_values(proc_entry, result);
|
||||
if (!RTEST(take)) {
|
||||
LAZY_MEMO_SET_BREAK(result);
|
||||
return 0;
|
||||
LAZY_MEMO_SET_BREAK(result);
|
||||
return 0;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
@ -2494,7 +2494,7 @@ static VALUE
|
||||
lazy_take_while(VALUE obj)
|
||||
{
|
||||
if (!rb_block_given_p()) {
|
||||
rb_raise(rb_eArgError, "tried to call lazy take_while without a block");
|
||||
rb_raise(rb_eArgError, "tried to call lazy take_while without a block");
|
||||
}
|
||||
|
||||
return lazy_add_method(obj, 0, 0, Qnil, Qnil, &lazy_take_while_funcs);
|
||||
@ -2505,10 +2505,10 @@ lazy_drop_size(VALUE proc_entry, VALUE receiver)
|
||||
{
|
||||
long len = NUM2LONG(RARRAY_AREF(rb_ivar_get(proc_entry, id_arguments), 0));
|
||||
if (NIL_P(receiver))
|
||||
return receiver;
|
||||
return receiver;
|
||||
if (FIXNUM_P(receiver)) {
|
||||
len = FIX2LONG(receiver) - len;
|
||||
return LONG2FIX(len < 0 ? 0 : len);
|
||||
len = FIX2LONG(receiver) - len;
|
||||
return LONG2FIX(len < 0 ? 0 : len);
|
||||
}
|
||||
return rb_funcall(receiver, '-', 1, LONG2NUM(len));
|
||||
}
|
||||
@ -2521,13 +2521,13 @@ lazy_drop_proc(VALUE proc_entry, struct MEMO *result, VALUE memos, long memo_ind
|
||||
VALUE memo = rb_ary_entry(memos, memo_index);
|
||||
|
||||
if (NIL_P(memo)) {
|
||||
memo = entry->memo;
|
||||
memo = entry->memo;
|
||||
}
|
||||
remain = NUM2LONG(memo);
|
||||
if (remain > 0) {
|
||||
--remain;
|
||||
rb_ary_store(memos, memo_index, LONG2NUM(remain));
|
||||
return 0;
|
||||
--remain;
|
||||
rb_ary_store(memos, memo_index, LONG2NUM(remain));
|
||||
return 0;
|
||||
}
|
||||
|
||||
return result;
|
||||
@ -2553,7 +2553,7 @@ lazy_drop(VALUE obj, VALUE n)
|
||||
argv[1] = n;
|
||||
|
||||
if (len < 0) {
|
||||
rb_raise(rb_eArgError, "attempt to drop negative size");
|
||||
rb_raise(rb_eArgError, "attempt to drop negative size");
|
||||
}
|
||||
|
||||
return lazy_add_method(obj, 2, argv, n, rb_ary_new3(1, n), &lazy_drop_funcs);
|
||||
@ -2566,13 +2566,13 @@ lazy_drop_while_proc(VALUE proc_entry, struct MEMO* result, VALUE memos, long me
|
||||
VALUE memo = rb_ary_entry(memos, memo_index);
|
||||
|
||||
if (NIL_P(memo)) {
|
||||
memo = entry->memo;
|
||||
memo = entry->memo;
|
||||
}
|
||||
|
||||
if (!RTEST(memo)) {
|
||||
VALUE drop = lazyenum_yield_values(proc_entry, result);
|
||||
if (RTEST(drop)) return 0;
|
||||
rb_ary_store(memos, memo_index, Qtrue);
|
||||
VALUE drop = lazyenum_yield_values(proc_entry, result);
|
||||
if (RTEST(drop)) return 0;
|
||||
rb_ary_store(memos, memo_index, Qtrue);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
@ -2592,7 +2592,7 @@ static VALUE
|
||||
lazy_drop_while(VALUE obj)
|
||||
{
|
||||
if (!rb_block_given_p()) {
|
||||
rb_raise(rb_eArgError, "tried to call lazy drop_while without a block");
|
||||
rb_raise(rb_eArgError, "tried to call lazy drop_while without a block");
|
||||
}
|
||||
|
||||
return lazy_add_method(obj, 0, 0, Qfalse, Qnil, &lazy_drop_while_funcs);
|
||||
|
354
eval_error.c
354
eval_error.c
@ -10,8 +10,8 @@
|
||||
#ifdef HAVE_BUILTIN___BUILTIN_CONSTANT_P
|
||||
#define warn_print(x) RB_GNUC_EXTENSION_BLOCK( \
|
||||
(__builtin_constant_p(x)) ? \
|
||||
rb_write_error2((x), (long)strlen(x)) : \
|
||||
rb_write_error(x) \
|
||||
rb_write_error2((x), (long)strlen(x)) : \
|
||||
rb_write_error(x) \
|
||||
)
|
||||
#else
|
||||
#define warn_print(x) rb_write_error(x)
|
||||
@ -29,7 +29,7 @@ error_pos(const VALUE str)
|
||||
{
|
||||
VALUE pos = error_pos_str();
|
||||
if (!NIL_P(pos)) {
|
||||
write_warn_str(str, pos);
|
||||
write_warn_str(str, pos);
|
||||
}
|
||||
}
|
||||
|
||||
@ -40,18 +40,18 @@ error_pos_str(void)
|
||||
VALUE sourcefile = rb_source_location(&sourceline);
|
||||
|
||||
if (!NIL_P(sourcefile)) {
|
||||
ID caller_name;
|
||||
if (sourceline == 0) {
|
||||
return rb_sprintf("%"PRIsVALUE": ", sourcefile);
|
||||
}
|
||||
else if ((caller_name = rb_frame_callee()) != 0) {
|
||||
return rb_sprintf("%"PRIsVALUE":%d:in `%"PRIsVALUE"': ",
|
||||
sourcefile, sourceline,
|
||||
rb_id2str(caller_name));
|
||||
}
|
||||
else {
|
||||
return rb_sprintf("%"PRIsVALUE":%d: ", sourcefile, sourceline);
|
||||
}
|
||||
ID caller_name;
|
||||
if (sourceline == 0) {
|
||||
return rb_sprintf("%"PRIsVALUE": ", sourcefile);
|
||||
}
|
||||
else if ((caller_name = rb_frame_callee()) != 0) {
|
||||
return rb_sprintf("%"PRIsVALUE":%d:in `%"PRIsVALUE"': ",
|
||||
sourcefile, sourceline,
|
||||
rb_id2str(caller_name));
|
||||
}
|
||||
else {
|
||||
return rb_sprintf("%"PRIsVALUE":%d: ", sourcefile, sourceline);
|
||||
}
|
||||
}
|
||||
return Qnil;
|
||||
}
|
||||
@ -62,13 +62,13 @@ set_backtrace(VALUE info, VALUE bt)
|
||||
ID set_backtrace = rb_intern("set_backtrace");
|
||||
|
||||
if (rb_backtrace_p(bt)) {
|
||||
if (rb_method_basic_definition_p(CLASS_OF(info), set_backtrace)) {
|
||||
rb_exc_set_backtrace(info, bt);
|
||||
return;
|
||||
}
|
||||
else {
|
||||
bt = rb_backtrace_to_str_ary(bt);
|
||||
}
|
||||
if (rb_method_basic_definition_p(CLASS_OF(info), set_backtrace)) {
|
||||
rb_exc_set_backtrace(info, bt);
|
||||
return;
|
||||
}
|
||||
else {
|
||||
bt = rb_backtrace_to_str_ary(bt);
|
||||
}
|
||||
}
|
||||
rb_check_funcall(info, set_backtrace, 1, &bt);
|
||||
}
|
||||
@ -106,24 +106,24 @@ print_errinfo(const VALUE eclass, const VALUE errat, const VALUE emesg, const VA
|
||||
}
|
||||
|
||||
if (eclass == rb_eRuntimeError && elen == 0) {
|
||||
if (highlight) write_warn(str, underline);
|
||||
write_warn(str, "unhandled exception");
|
||||
if (highlight) write_warn(str, reset);
|
||||
write_warn2(str, "\n", 1);
|
||||
if (highlight) write_warn(str, underline);
|
||||
write_warn(str, "unhandled exception");
|
||||
if (highlight) write_warn(str, reset);
|
||||
write_warn2(str, "\n", 1);
|
||||
}
|
||||
else {
|
||||
VALUE epath;
|
||||
VALUE epath;
|
||||
|
||||
epath = rb_class_name(eclass);
|
||||
if (elen == 0) {
|
||||
if (highlight) write_warn(str, underline);
|
||||
write_warn_str(str, epath);
|
||||
if (highlight) write_warn(str, reset);
|
||||
write_warn(str, "\n");
|
||||
}
|
||||
else {
|
||||
write_warn_str(str, emesg);
|
||||
write_warn(str, "\n");
|
||||
epath = rb_class_name(eclass);
|
||||
if (elen == 0) {
|
||||
if (highlight) write_warn(str, underline);
|
||||
write_warn_str(str, epath);
|
||||
if (highlight) write_warn(str, reset);
|
||||
write_warn(str, "\n");
|
||||
}
|
||||
else {
|
||||
write_warn_str(str, emesg);
|
||||
write_warn(str, "\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -141,73 +141,73 @@ rb_decorate_message(const VALUE eclass, const VALUE emesg, int highlight)
|
||||
elen = RSTRING_LEN(emesg);
|
||||
}
|
||||
if (eclass == rb_eRuntimeError && elen == 0) {
|
||||
if (highlight) write_warn(str, underline);
|
||||
write_warn(str, "unhandled exception");
|
||||
if (highlight) write_warn(str, reset);
|
||||
if (highlight) write_warn(str, underline);
|
||||
write_warn(str, "unhandled exception");
|
||||
if (highlight) write_warn(str, reset);
|
||||
}
|
||||
else {
|
||||
VALUE epath;
|
||||
VALUE epath;
|
||||
|
||||
epath = rb_class_name(eclass);
|
||||
if (elen == 0) {
|
||||
if (highlight) write_warn(str, underline);
|
||||
write_warn_str(str, epath);
|
||||
if (highlight) write_warn(str, reset);
|
||||
}
|
||||
else {
|
||||
epath = rb_class_name(eclass);
|
||||
if (elen == 0) {
|
||||
if (highlight) write_warn(str, underline);
|
||||
write_warn_str(str, epath);
|
||||
if (highlight) write_warn(str, reset);
|
||||
}
|
||||
else {
|
||||
/* emesg is a String instance */
|
||||
const char *tail = 0;
|
||||
const char *tail = 0;
|
||||
|
||||
if (highlight) write_warn(str, bold);
|
||||
if (RSTRING_PTR(epath)[0] == '#')
|
||||
epath = 0;
|
||||
if ((tail = memchr(einfo, '\n', elen)) != 0) {
|
||||
if (RSTRING_PTR(epath)[0] == '#')
|
||||
epath = 0;
|
||||
if ((tail = memchr(einfo, '\n', elen)) != 0) {
|
||||
write_warn2(str, einfo, tail - einfo);
|
||||
tail++; /* skip newline */
|
||||
}
|
||||
else {
|
||||
tail++; /* skip newline */
|
||||
}
|
||||
else {
|
||||
write_warn_str(str, emesg);
|
||||
}
|
||||
if (epath) {
|
||||
write_warn(str, " (");
|
||||
if (highlight) write_warn(str, underline);
|
||||
}
|
||||
if (epath) {
|
||||
write_warn(str, " (");
|
||||
if (highlight) write_warn(str, underline);
|
||||
write_warn_str(str, epath);
|
||||
if (highlight) {
|
||||
write_warn(str, reset);
|
||||
write_warn(str, bold);
|
||||
}
|
||||
write_warn2(str, ")", 1);
|
||||
if (highlight) write_warn(str, reset);
|
||||
}
|
||||
if (tail && einfo+elen > tail) {
|
||||
if (!highlight) {
|
||||
if (highlight) {
|
||||
write_warn(str, reset);
|
||||
write_warn(str, bold);
|
||||
}
|
||||
write_warn2(str, ")", 1);
|
||||
if (highlight) write_warn(str, reset);
|
||||
}
|
||||
if (tail && einfo+elen > tail) {
|
||||
if (!highlight) {
|
||||
write_warn2(str, "\n", 1);
|
||||
write_warn2(str, tail, einfo+elen-tail);
|
||||
}
|
||||
else {
|
||||
elen -= tail - einfo;
|
||||
einfo = tail;
|
||||
}
|
||||
else {
|
||||
elen -= tail - einfo;
|
||||
einfo = tail;
|
||||
write_warn2(str, "\n", 1);
|
||||
while (elen > 0) {
|
||||
tail = memchr(einfo, '\n', elen);
|
||||
if (!tail || tail > einfo) {
|
||||
write_warn(str, bold);
|
||||
while (elen > 0) {
|
||||
tail = memchr(einfo, '\n', elen);
|
||||
if (!tail || tail > einfo) {
|
||||
write_warn(str, bold);
|
||||
write_warn2(str, einfo, tail ? tail-einfo : elen);
|
||||
write_warn(str, reset);
|
||||
if (!tail) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
elen -= tail - einfo;
|
||||
einfo = tail;
|
||||
do ++tail; while (tail < einfo+elen && *tail == '\n');
|
||||
write_warn(str, reset);
|
||||
if (!tail) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
elen -= tail - einfo;
|
||||
einfo = tail;
|
||||
do ++tail; while (tail < einfo+elen && *tail == '\n');
|
||||
write_warn2(str, einfo, tail-einfo);
|
||||
elen -= tail - einfo;
|
||||
einfo = tail;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
elen -= tail - einfo;
|
||||
einfo = tail;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return str;
|
||||
@ -217,13 +217,13 @@ static void
|
||||
print_backtrace(const VALUE eclass, const VALUE errat, const VALUE str, int reverse, long backtrace_limit)
|
||||
{
|
||||
if (!NIL_P(errat)) {
|
||||
long i;
|
||||
long len = RARRAY_LEN(errat);
|
||||
const int threshold = 1000000000;
|
||||
long i;
|
||||
long len = RARRAY_LEN(errat);
|
||||
const int threshold = 1000000000;
|
||||
int width = (len <= 1) ? INT_MIN : ((int)log10((double)(len > threshold ?
|
||||
((len - 1) / threshold) :
|
||||
len - 1)) +
|
||||
(len < threshold ? 0 : 9) + 1);
|
||||
((len - 1) / threshold) :
|
||||
len - 1)) +
|
||||
(len < threshold ? 0 : 9) + 1);
|
||||
|
||||
long skip_start = -1, skip_len = 0;
|
||||
|
||||
@ -244,19 +244,19 @@ print_backtrace(const VALUE eclass, const VALUE errat, const VALUE str, int reve
|
||||
skip_len = len - skip_start;
|
||||
}
|
||||
|
||||
for (i = 1; i < len; i++) {
|
||||
if (i == skip_start) {
|
||||
write_warn_str(str, rb_sprintf("\t ... %ld levels...\n", skip_len));
|
||||
i += skip_len;
|
||||
for (i = 1; i < len; i++) {
|
||||
if (i == skip_start) {
|
||||
write_warn_str(str, rb_sprintf("\t ... %ld levels...\n", skip_len));
|
||||
i += skip_len;
|
||||
if (i >= len) break;
|
||||
}
|
||||
VALUE line = RARRAY_AREF(errat, reverse ? len - i : i);
|
||||
if (RB_TYPE_P(line, T_STRING)) {
|
||||
VALUE bt = rb_str_new_cstr("\t");
|
||||
if (reverse) rb_str_catf(bt, "%*ld: ", width, len - i);
|
||||
write_warn_str(str, rb_str_catf(bt, "from %"PRIsVALUE"\n", line));
|
||||
}
|
||||
}
|
||||
}
|
||||
VALUE line = RARRAY_AREF(errat, reverse ? len - i : i);
|
||||
if (RB_TYPE_P(line, T_STRING)) {
|
||||
VALUE bt = rb_str_new_cstr("\t");
|
||||
if (reverse) rb_str_catf(bt, "%*ld: ", width, len - i);
|
||||
write_warn_str(str, rb_str_catf(bt, "from %"PRIsVALUE"\n", line));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -304,36 +304,36 @@ rb_error_write(VALUE errinfo, VALUE emesg, VALUE errat, VALUE str, VALUE opt, VA
|
||||
long backtrace_limit = rb_backtrace_length_limit;
|
||||
|
||||
if (NIL_P(errinfo))
|
||||
return;
|
||||
return;
|
||||
|
||||
if (errat == Qundef) {
|
||||
errat = Qnil;
|
||||
errat = Qnil;
|
||||
}
|
||||
eclass = CLASS_OF(errinfo);
|
||||
if (reverse) {
|
||||
static const char traceback[] = "Traceback "
|
||||
"(most recent call last):\n";
|
||||
const int bold_part = rb_strlen_lit("Traceback");
|
||||
char buff[sizeof(traceback)+sizeof(bold)+sizeof(reset)-2], *p = buff;
|
||||
const char *msg = traceback;
|
||||
long len = sizeof(traceback) - 1;
|
||||
if (RTEST(highlight)) {
|
||||
static const char traceback[] = "Traceback "
|
||||
"(most recent call last):\n";
|
||||
const int bold_part = rb_strlen_lit("Traceback");
|
||||
char buff[sizeof(traceback)+sizeof(bold)+sizeof(reset)-2], *p = buff;
|
||||
const char *msg = traceback;
|
||||
long len = sizeof(traceback) - 1;
|
||||
if (RTEST(highlight)) {
|
||||
#define APPEND(s, l) (memcpy(p, s, l), p += (l))
|
||||
APPEND(bold, sizeof(bold)-1);
|
||||
APPEND(traceback, bold_part);
|
||||
APPEND(reset, sizeof(reset)-1);
|
||||
APPEND(traceback + bold_part, sizeof(traceback)-bold_part-1);
|
||||
APPEND(bold, sizeof(bold)-1);
|
||||
APPEND(traceback, bold_part);
|
||||
APPEND(reset, sizeof(reset)-1);
|
||||
APPEND(traceback + bold_part, sizeof(traceback)-bold_part-1);
|
||||
#undef APPEND
|
||||
len = p - (msg = buff);
|
||||
}
|
||||
write_warn2(str, msg, len);
|
||||
len = p - (msg = buff);
|
||||
}
|
||||
write_warn2(str, msg, len);
|
||||
show_cause(errinfo, str, opt, highlight, reverse, backtrace_limit, &shown_causes);
|
||||
print_backtrace(eclass, errat, str, TRUE, backtrace_limit);
|
||||
print_errinfo(eclass, errat, emesg, str, RTEST(highlight));
|
||||
print_backtrace(eclass, errat, str, TRUE, backtrace_limit);
|
||||
print_errinfo(eclass, errat, emesg, str, RTEST(highlight));
|
||||
}
|
||||
else {
|
||||
print_errinfo(eclass, errat, emesg, str, RTEST(highlight));
|
||||
print_backtrace(eclass, errat, str, FALSE, backtrace_limit);
|
||||
print_errinfo(eclass, errat, emesg, str, RTEST(highlight));
|
||||
print_backtrace(eclass, errat, str, FALSE, backtrace_limit);
|
||||
show_cause(errinfo, str, opt, highlight, reverse, backtrace_limit, &shown_causes);
|
||||
}
|
||||
}
|
||||
@ -351,16 +351,16 @@ rb_ec_error_print(rb_execution_context_t * volatile ec, volatile VALUE errinfo)
|
||||
rb_hash_aset(opt, ID2SYM(rb_intern_const("highlight")), highlight);
|
||||
|
||||
if (NIL_P(errinfo))
|
||||
return;
|
||||
return;
|
||||
rb_ec_raised_clear(ec);
|
||||
|
||||
EC_PUSH_TAG(ec);
|
||||
if (EC_EXEC_TAG() == TAG_NONE) {
|
||||
errat = rb_get_backtrace(errinfo);
|
||||
errat = rb_get_backtrace(errinfo);
|
||||
}
|
||||
if (emesg == Qundef) {
|
||||
emesg = Qnil;
|
||||
emesg = rb_get_detailed_message(errinfo, opt);
|
||||
emesg = Qnil;
|
||||
emesg = rb_get_detailed_message(errinfo, opt);
|
||||
}
|
||||
|
||||
if (!written) {
|
||||
@ -375,9 +375,9 @@ rb_ec_error_print(rb_execution_context_t * volatile ec, volatile VALUE errinfo)
|
||||
|
||||
#define undef_mesg_for(v, k) rb_fstring_lit("undefined"v" method `%1$s' for "k" `%2$s'")
|
||||
#define undef_mesg(v) ( \
|
||||
is_mod ? \
|
||||
undef_mesg_for(v, "module") : \
|
||||
undef_mesg_for(v, "class"))
|
||||
is_mod ? \
|
||||
undef_mesg_for(v, "module") : \
|
||||
undef_mesg_for(v, "class"))
|
||||
|
||||
void
|
||||
rb_print_undef(VALUE klass, ID id, rb_method_visibility_t visi)
|
||||
@ -403,9 +403,9 @@ rb_print_undef_str(VALUE klass, VALUE name)
|
||||
|
||||
#define inaccessible_mesg_for(v, k) rb_fstring_lit("method `%1$s' for "k" `%2$s' is "v)
|
||||
#define inaccessible_mesg(v) ( \
|
||||
is_mod ? \
|
||||
inaccessible_mesg_for(v, "module") : \
|
||||
inaccessible_mesg_for(v, "class"))
|
||||
is_mod ? \
|
||||
inaccessible_mesg_for(v, "module") : \
|
||||
inaccessible_mesg_for(v, "class"))
|
||||
|
||||
void
|
||||
rb_print_inaccessible(VALUE klass, ID id, rb_method_visibility_t visi)
|
||||
@ -438,61 +438,61 @@ error_handle(rb_execution_context_t *ec, int ex)
|
||||
int status = EXIT_FAILURE;
|
||||
|
||||
if (rb_ec_set_raised(ec))
|
||||
return EXIT_FAILURE;
|
||||
return EXIT_FAILURE;
|
||||
switch (ex & TAG_MASK) {
|
||||
case 0:
|
||||
status = EXIT_SUCCESS;
|
||||
break;
|
||||
status = EXIT_SUCCESS;
|
||||
break;
|
||||
|
||||
case TAG_RETURN:
|
||||
error_pos(Qnil);
|
||||
warn_print("unexpected return\n");
|
||||
break;
|
||||
error_pos(Qnil);
|
||||
warn_print("unexpected return\n");
|
||||
break;
|
||||
case TAG_NEXT:
|
||||
error_pos(Qnil);
|
||||
warn_print("unexpected next\n");
|
||||
break;
|
||||
error_pos(Qnil);
|
||||
warn_print("unexpected next\n");
|
||||
break;
|
||||
case TAG_BREAK:
|
||||
error_pos(Qnil);
|
||||
warn_print("unexpected break\n");
|
||||
break;
|
||||
error_pos(Qnil);
|
||||
warn_print("unexpected break\n");
|
||||
break;
|
||||
case TAG_REDO:
|
||||
error_pos(Qnil);
|
||||
warn_print("unexpected redo\n");
|
||||
break;
|
||||
error_pos(Qnil);
|
||||
warn_print("unexpected redo\n");
|
||||
break;
|
||||
case TAG_RETRY:
|
||||
error_pos(Qnil);
|
||||
warn_print("retry outside of rescue clause\n");
|
||||
break;
|
||||
error_pos(Qnil);
|
||||
warn_print("retry outside of rescue clause\n");
|
||||
break;
|
||||
case TAG_THROW:
|
||||
/* TODO: fix me */
|
||||
error_pos(Qnil);
|
||||
warn_print("unexpected throw\n");
|
||||
break;
|
||||
/* TODO: fix me */
|
||||
error_pos(Qnil);
|
||||
warn_print("unexpected throw\n");
|
||||
break;
|
||||
case TAG_RAISE: {
|
||||
VALUE errinfo = ec->errinfo;
|
||||
if (rb_obj_is_kind_of(errinfo, rb_eSystemExit)) {
|
||||
status = sysexit_status(errinfo);
|
||||
}
|
||||
else if (rb_obj_is_instance_of(errinfo, rb_eSignal) &&
|
||||
rb_ivar_get(errinfo, id_signo) != INT2FIX(SIGSEGV)) {
|
||||
/* no message when exiting by signal */
|
||||
}
|
||||
VALUE errinfo = ec->errinfo;
|
||||
if (rb_obj_is_kind_of(errinfo, rb_eSystemExit)) {
|
||||
status = sysexit_status(errinfo);
|
||||
}
|
||||
else if (rb_obj_is_instance_of(errinfo, rb_eSignal) &&
|
||||
rb_ivar_get(errinfo, id_signo) != INT2FIX(SIGSEGV)) {
|
||||
/* no message when exiting by signal */
|
||||
}
|
||||
else if (rb_obj_is_kind_of(errinfo, rb_eSystemCallError) &&
|
||||
FIXNUM_P(rb_attr_get(errinfo, id_signo))) {
|
||||
/* no message when exiting by error to be mapped to signal */
|
||||
/* no message when exiting by error to be mapped to signal */
|
||||
}
|
||||
else {
|
||||
rb_ec_error_print(ec, errinfo);
|
||||
}
|
||||
break;
|
||||
else {
|
||||
rb_ec_error_print(ec, errinfo);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case TAG_FATAL:
|
||||
error_print(ec);
|
||||
break;
|
||||
error_print(ec);
|
||||
break;
|
||||
default:
|
||||
unknown_longjmp_status(ex);
|
||||
break;
|
||||
unknown_longjmp_status(ex);
|
||||
break;
|
||||
}
|
||||
rb_ec_reset_raised(ec);
|
||||
return status;
|
||||
|
@ -329,9 +329,9 @@ static inline void
|
||||
translit_char(char *p, int from, int to)
|
||||
{
|
||||
while (*p) {
|
||||
if ((unsigned char)*p == from)
|
||||
*p = to;
|
||||
p = CharNext(p);
|
||||
if ((unsigned char)*p == from)
|
||||
*p = to;
|
||||
p = CharNext(p);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
36
eval_jump.c
36
eval_jump.c
@ -40,7 +40,7 @@ rb_f_at_exit(VALUE _)
|
||||
VALUE proc;
|
||||
|
||||
if (!rb_block_given_p()) {
|
||||
rb_raise(rb_eArgError, "called without a block");
|
||||
rb_raise(rb_eArgError, "called without a block");
|
||||
}
|
||||
proc = rb_block_proc();
|
||||
rb_set_end_proc(rb_call_end_proc, proc);
|
||||
@ -63,10 +63,10 @@ rb_set_end_proc(void (*func)(VALUE), VALUE data)
|
||||
rb_thread_t *th = GET_THREAD();
|
||||
|
||||
if (th->top_wrapper) {
|
||||
list = &ephemeral_end_procs;
|
||||
list = &ephemeral_end_procs;
|
||||
}
|
||||
else {
|
||||
list = &end_procs;
|
||||
list = &end_procs;
|
||||
}
|
||||
link->next = *list;
|
||||
link->func = func;
|
||||
@ -81,13 +81,13 @@ rb_mark_end_proc(void)
|
||||
|
||||
link = end_procs;
|
||||
while (link) {
|
||||
rb_gc_mark(link->data);
|
||||
link = link->next;
|
||||
rb_gc_mark(link->data);
|
||||
link = link->next;
|
||||
}
|
||||
link = ephemeral_end_procs;
|
||||
while (link) {
|
||||
rb_gc_mark(link->data);
|
||||
link = link->next;
|
||||
rb_gc_mark(link->data);
|
||||
link = link->next;
|
||||
}
|
||||
}
|
||||
|
||||
@ -99,11 +99,11 @@ exec_end_procs_chain(struct end_proc_data *volatile *procs, VALUE *errp)
|
||||
VALUE errinfo = *errp;
|
||||
|
||||
while ((link = *procs) != 0) {
|
||||
*procs = link->next;
|
||||
endproc = *link;
|
||||
xfree(link);
|
||||
(*endproc.func) (endproc.data);
|
||||
*errp = errinfo;
|
||||
*procs = link->next;
|
||||
endproc = *link;
|
||||
xfree(link);
|
||||
(*endproc.func) (endproc.data);
|
||||
*errp = errinfo;
|
||||
}
|
||||
}
|
||||
|
||||
@ -116,15 +116,15 @@ rb_ec_exec_end_proc(rb_execution_context_t * ec)
|
||||
EC_PUSH_TAG(ec);
|
||||
if ((state = EC_EXEC_TAG()) == TAG_NONE) {
|
||||
again:
|
||||
exec_end_procs_chain(&ephemeral_end_procs, &ec->errinfo);
|
||||
exec_end_procs_chain(&end_procs, &ec->errinfo);
|
||||
exec_end_procs_chain(&ephemeral_end_procs, &ec->errinfo);
|
||||
exec_end_procs_chain(&end_procs, &ec->errinfo);
|
||||
}
|
||||
else {
|
||||
EC_TMPPOP_TAG();
|
||||
EC_TMPPOP_TAG();
|
||||
error_handle(ec, state);
|
||||
if (!NIL_P(ec->errinfo)) errinfo = ec->errinfo;
|
||||
EC_REPUSH_TAG();
|
||||
goto again;
|
||||
if (!NIL_P(ec->errinfo)) errinfo = ec->errinfo;
|
||||
EC_REPUSH_TAG();
|
||||
goto again;
|
||||
}
|
||||
EC_POP_TAG();
|
||||
|
||||
|
@ -8,13 +8,13 @@ callback(const rb_debug_inspector_t *dbg_context, void *data)
|
||||
long i, len = RARRAY_LEN(locs);
|
||||
VALUE binds = rb_ary_new();
|
||||
for (i = 0; i < len; ++i) {
|
||||
VALUE entry = rb_ary_new();
|
||||
rb_ary_push(binds, entry);
|
||||
rb_ary_push(entry, rb_debug_inspector_frame_self_get(dbg_context, i));
|
||||
rb_ary_push(entry, rb_debug_inspector_frame_binding_get(dbg_context, i));
|
||||
rb_ary_push(entry, rb_debug_inspector_frame_class_get(dbg_context, i));
|
||||
rb_ary_push(entry, rb_debug_inspector_frame_iseq_get(dbg_context, i));
|
||||
rb_ary_push(entry, rb_ary_entry(locs, i));
|
||||
VALUE entry = rb_ary_new();
|
||||
rb_ary_push(binds, entry);
|
||||
rb_ary_push(entry, rb_debug_inspector_frame_self_get(dbg_context, i));
|
||||
rb_ary_push(entry, rb_debug_inspector_frame_binding_get(dbg_context, i));
|
||||
rb_ary_push(entry, rb_debug_inspector_frame_class_get(dbg_context, i));
|
||||
rb_ary_push(entry, rb_debug_inspector_frame_iseq_get(dbg_context, i));
|
||||
rb_ary_push(entry, rb_ary_entry(locs, i));
|
||||
}
|
||||
return binds;
|
||||
}
|
||||
|
@ -18,19 +18,19 @@ profile_frames(VALUE self, VALUE start_v, VALUE num_v)
|
||||
collected_size = rb_profile_frames(start, buff_size, buff, lines);
|
||||
|
||||
for (i=0; i<collected_size; i++) {
|
||||
VALUE ary = rb_ary_new();
|
||||
rb_ary_push(ary, rb_profile_frame_path(buff[i]));
|
||||
rb_ary_push(ary, rb_profile_frame_absolute_path(buff[i]));
|
||||
rb_ary_push(ary, rb_profile_frame_label(buff[i]));
|
||||
rb_ary_push(ary, rb_profile_frame_base_label(buff[i]));
|
||||
rb_ary_push(ary, rb_profile_frame_full_label(buff[i]));
|
||||
rb_ary_push(ary, rb_profile_frame_first_lineno(buff[i]));
|
||||
rb_ary_push(ary, rb_profile_frame_classpath(buff[i]));
|
||||
rb_ary_push(ary, rb_profile_frame_singleton_method_p(buff[i]));
|
||||
rb_ary_push(ary, rb_profile_frame_method_name(buff[i]));
|
||||
rb_ary_push(ary, rb_profile_frame_qualified_method_name(buff[i]));
|
||||
VALUE ary = rb_ary_new();
|
||||
rb_ary_push(ary, rb_profile_frame_path(buff[i]));
|
||||
rb_ary_push(ary, rb_profile_frame_absolute_path(buff[i]));
|
||||
rb_ary_push(ary, rb_profile_frame_label(buff[i]));
|
||||
rb_ary_push(ary, rb_profile_frame_base_label(buff[i]));
|
||||
rb_ary_push(ary, rb_profile_frame_full_label(buff[i]));
|
||||
rb_ary_push(ary, rb_profile_frame_first_lineno(buff[i]));
|
||||
rb_ary_push(ary, rb_profile_frame_classpath(buff[i]));
|
||||
rb_ary_push(ary, rb_profile_frame_singleton_method_p(buff[i]));
|
||||
rb_ary_push(ary, rb_profile_frame_method_name(buff[i]));
|
||||
rb_ary_push(ary, rb_profile_frame_qualified_method_name(buff[i]));
|
||||
|
||||
rb_ary_push(result, ary);
|
||||
rb_ary_push(result, ary);
|
||||
}
|
||||
|
||||
return result;
|
||||
|
@ -54,24 +54,24 @@ get_fsname(VALUE self, VALUE str)
|
||||
FilePathValue(str);
|
||||
str = rb_str_encode_ospath(str);
|
||||
if (STATFS(StringValueCStr(str), &st) == -1) {
|
||||
rb_sys_fail_str(str);
|
||||
rb_sys_fail_str(str);
|
||||
}
|
||||
# ifdef HAVE_STRUCT_STATFS_T_F_FSTYPENAME
|
||||
if (st.f_fstypename[0])
|
||||
return CSTR(st.f_fstypename);
|
||||
return CSTR(st.f_fstypename);
|
||||
# endif
|
||||
# ifdef HAVE_STRUCT_STATFS_T_F_TYPE
|
||||
switch (st.f_type) {
|
||||
case 0x9123683E: /* BTRFS_SUPER_MAGIC */
|
||||
return CSTR("btrfs");
|
||||
return CSTR("btrfs");
|
||||
case 0x7461636f: /* OCFS2_SUPER_MAGIC */
|
||||
return CSTR("ocfs");
|
||||
return CSTR("ocfs");
|
||||
case 0xEF53: /* EXT2_SUPER_MAGIC EXT3_SUPER_MAGIC EXT4_SUPER_MAGIC */
|
||||
return CSTR("ext4");
|
||||
return CSTR("ext4");
|
||||
case 0x58465342: /* XFS_SUPER_MAGIC */
|
||||
return CSTR("xfs");
|
||||
return CSTR("xfs");
|
||||
case 0x01021994: /* TMPFS_MAGIC */
|
||||
return CSTR("tmpfs");
|
||||
return CSTR("tmpfs");
|
||||
}
|
||||
# endif
|
||||
#endif
|
||||
|
@ -47,17 +47,17 @@ Init_funcall(void)
|
||||
VALUE cRelay = rb_define_module_under(cTestFuncall, "Relay");
|
||||
|
||||
rb_define_singleton_method(cRelay,
|
||||
"with_funcall2",
|
||||
with_funcall2,
|
||||
-1);
|
||||
"with_funcall2",
|
||||
with_funcall2,
|
||||
-1);
|
||||
rb_define_singleton_method(cRelay,
|
||||
"with_funcall_passing_block_kw",
|
||||
with_funcall_passing_block_kw,
|
||||
-1);
|
||||
rb_define_singleton_method(cRelay,
|
||||
"with_funcall_passing_block",
|
||||
with_funcall_passing_block,
|
||||
-1);
|
||||
"with_funcall_passing_block",
|
||||
with_funcall_passing_block,
|
||||
-1);
|
||||
rb_define_singleton_method(cRelay,
|
||||
"with_funcallv_public_kw",
|
||||
with_funcallv_public_kw,
|
||||
|
@ -17,7 +17,7 @@ thread_runnable_sleep(VALUE thread, VALUE timeout)
|
||||
struct timeval timeval;
|
||||
|
||||
if (NIL_P(timeout)) {
|
||||
rb_raise(rb_eArgError, "timeout must be non nil");
|
||||
rb_raise(rb_eArgError, "timeout must be non nil");
|
||||
}
|
||||
|
||||
timeval = rb_time_interval(timeout);
|
||||
|
@ -34,7 +34,7 @@ read_status(VALUE self)
|
||||
taskinfo.virtual_size = 0;
|
||||
taskinfo.resident_size = 0;
|
||||
error = task_info(mach_task_self(), flavor,
|
||||
(task_info_t)&taskinfo, &out_count);
|
||||
(task_info_t)&taskinfo, &out_count);
|
||||
if (error != KERN_SUCCESS) return Qnil;
|
||||
#ifndef ULL2NUM
|
||||
/* "long long" does not exist here, use size_t instead. */
|
||||
@ -50,7 +50,7 @@ read_status(VALUE self)
|
||||
PROCESS_MEMORY_COUNTERS c;
|
||||
c.cb = sizeof(c);
|
||||
if (!GetProcessMemoryInfo(GetCurrentProcess(), &c, c.cb))
|
||||
return Qnil;
|
||||
return Qnil;
|
||||
size = SIZET2NUM(c.PagefileUsage);
|
||||
rss = SIZET2NUM(c.WorkingSetSize);
|
||||
peak = SIZET2NUM(c.PeakWorkingSetSize);
|
||||
@ -68,13 +68,13 @@ Init_memory_status(void)
|
||||
{
|
||||
VALUE mMemory = rb_define_module("Memory");
|
||||
cMemoryStatus =
|
||||
rb_struct_define_under(mMemory, "Status", "size",
|
||||
rb_struct_define_under(mMemory, "Status", "size",
|
||||
#ifdef HAVE_RSS
|
||||
"rss",
|
||||
"rss",
|
||||
#endif
|
||||
#ifdef HAVE_PEAK
|
||||
"peak",
|
||||
"peak",
|
||||
#endif
|
||||
(char *)NULL);
|
||||
(char *)NULL);
|
||||
rb_define_method(cMemoryStatus, "_update", read_status, 0);
|
||||
}
|
||||
|
@ -25,7 +25,7 @@ uint_to_str(char *p, char *e, unsigned int x)
|
||||
char *e0 = e;
|
||||
if (e <= p) return p;
|
||||
do {
|
||||
*--e = x % 10 + '0';
|
||||
*--e = x % 10 + '0';
|
||||
} while ((x /= 10) != 0 && e > p);
|
||||
memmove(p, e, e0 - e);
|
||||
return p + (e0 - e);
|
||||
@ -44,48 +44,48 @@ printf_test_call(int argc, VALUE *argv, VALUE self)
|
||||
if (RSTRING_LEN(type) != 1) rb_raise(rb_eArgError, "wrong length(%ld)", RSTRING_LEN(type));
|
||||
switch (cnv = RSTRING_PTR(type)[0]) {
|
||||
case 'd': case 'x': case 'o': case 'X':
|
||||
n = NUM2INT(num);
|
||||
break;
|
||||
n = NUM2INT(num);
|
||||
break;
|
||||
case 's':
|
||||
s = StringValueCStr(num);
|
||||
break;
|
||||
s = StringValueCStr(num);
|
||||
break;
|
||||
default: rb_raise(rb_eArgError, "wrong conversion(%c)", cnv);
|
||||
}
|
||||
*p++ = '%';
|
||||
if (!NIL_P(opt)) {
|
||||
VALUE v;
|
||||
Check_Type(opt, T_HASH);
|
||||
if (RTEST(rb_hash_aref(opt, ID2SYM(rb_intern("space"))))) {
|
||||
*p++ = ' ';
|
||||
}
|
||||
if (RTEST(rb_hash_aref(opt, ID2SYM(rb_intern("hash"))))) {
|
||||
*p++ = '#';
|
||||
}
|
||||
if (RTEST(rb_hash_aref(opt, ID2SYM(rb_intern("plus"))))) {
|
||||
*p++ = '+';
|
||||
}
|
||||
if (RTEST(rb_hash_aref(opt, ID2SYM(rb_intern("minus"))))) {
|
||||
*p++ = '-';
|
||||
}
|
||||
if (RTEST(rb_hash_aref(opt, ID2SYM(rb_intern("zero"))))) {
|
||||
*p++ = '0';
|
||||
}
|
||||
if (!NIL_P(v = rb_hash_aref(opt, ID2SYM(rb_intern("width"))))) {
|
||||
p = uint_to_str(p, format + sizeof(format), NUM2UINT(v));
|
||||
}
|
||||
if (!NIL_P(v = rb_hash_aref(opt, ID2SYM(rb_intern("prec"))))) {
|
||||
*p++ = '.';
|
||||
if (FIXNUM_P(v))
|
||||
p = uint_to_str(p, format + sizeof(format), NUM2UINT(v));
|
||||
}
|
||||
VALUE v;
|
||||
Check_Type(opt, T_HASH);
|
||||
if (RTEST(rb_hash_aref(opt, ID2SYM(rb_intern("space"))))) {
|
||||
*p++ = ' ';
|
||||
}
|
||||
if (RTEST(rb_hash_aref(opt, ID2SYM(rb_intern("hash"))))) {
|
||||
*p++ = '#';
|
||||
}
|
||||
if (RTEST(rb_hash_aref(opt, ID2SYM(rb_intern("plus"))))) {
|
||||
*p++ = '+';
|
||||
}
|
||||
if (RTEST(rb_hash_aref(opt, ID2SYM(rb_intern("minus"))))) {
|
||||
*p++ = '-';
|
||||
}
|
||||
if (RTEST(rb_hash_aref(opt, ID2SYM(rb_intern("zero"))))) {
|
||||
*p++ = '0';
|
||||
}
|
||||
if (!NIL_P(v = rb_hash_aref(opt, ID2SYM(rb_intern("width"))))) {
|
||||
p = uint_to_str(p, format + sizeof(format), NUM2UINT(v));
|
||||
}
|
||||
if (!NIL_P(v = rb_hash_aref(opt, ID2SYM(rb_intern("prec"))))) {
|
||||
*p++ = '.';
|
||||
if (FIXNUM_P(v))
|
||||
p = uint_to_str(p, format + sizeof(format), NUM2UINT(v));
|
||||
}
|
||||
}
|
||||
*p++ = cnv;
|
||||
*p++ = '\0';
|
||||
if (cnv == 's') {
|
||||
result = rb_enc_sprintf(rb_usascii_encoding(), format, s);
|
||||
result = rb_enc_sprintf(rb_usascii_encoding(), format, s);
|
||||
}
|
||||
else {
|
||||
result = rb_enc_sprintf(rb_usascii_encoding(), format, n);
|
||||
result = rb_enc_sprintf(rb_usascii_encoding(), format, n);
|
||||
}
|
||||
return rb_assoc_new(result, rb_usascii_str_new_cstr(format));
|
||||
}
|
||||
|
@ -9,7 +9,7 @@ bug_proc_call_super(RB_BLOCK_CALL_FUNC_ARGLIST(yieldarg, procarg))
|
||||
args[1] = procarg;
|
||||
ret = rb_call_super(2, args);
|
||||
if (!NIL_P(blockarg)) {
|
||||
ret = rb_proc_call(blockarg, ret);
|
||||
ret = rb_proc_call(blockarg, ret);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
@ -12,22 +12,22 @@ static void
|
||||
force_unpack_check(struct checker *c, st_data_t key, st_data_t val)
|
||||
{
|
||||
if (c->nr == 0) {
|
||||
st_data_t i;
|
||||
st_data_t i;
|
||||
|
||||
if (c->tbl->bins != NULL) rb_bug("should be packed\n");
|
||||
if (c->tbl->bins != NULL) rb_bug("should be packed\n");
|
||||
|
||||
/* force unpacking during iteration: */
|
||||
for (i = 1; i < expect_size; i++)
|
||||
st_add_direct(c->tbl, i, i);
|
||||
/* force unpacking during iteration: */
|
||||
for (i = 1; i < expect_size; i++)
|
||||
st_add_direct(c->tbl, i, i);
|
||||
|
||||
if (c->tbl->bins == NULL) rb_bug("should be unpacked\n");
|
||||
if (c->tbl->bins == NULL) rb_bug("should be unpacked\n");
|
||||
}
|
||||
|
||||
if (key != c->nr) {
|
||||
rb_bug("unexpected key: %"PRIuVALUE" (expected %"PRIuVALUE")\n", (VALUE)key, (VALUE)c->nr);
|
||||
rb_bug("unexpected key: %"PRIuVALUE" (expected %"PRIuVALUE")\n", (VALUE)key, (VALUE)c->nr);
|
||||
}
|
||||
if (val != c->nr) {
|
||||
rb_bug("unexpected val: %"PRIuVALUE" (expected %"PRIuVALUE")\n", (VALUE)val, (VALUE)c->nr);
|
||||
rb_bug("unexpected val: %"PRIuVALUE" (expected %"PRIuVALUE")\n", (VALUE)val, (VALUE)c->nr);
|
||||
}
|
||||
|
||||
c->nr++;
|
||||
@ -39,34 +39,34 @@ unp_fec_i(st_data_t key, st_data_t val, st_data_t args, int error)
|
||||
struct checker *c = (struct checker *)args;
|
||||
|
||||
if (error) {
|
||||
if (c->test == ID2SYM(rb_intern("delete2")))
|
||||
return ST_STOP;
|
||||
if (c->test == ID2SYM(rb_intern("delete2")))
|
||||
return ST_STOP;
|
||||
|
||||
rb_bug("unexpected error");
|
||||
rb_bug("unexpected error");
|
||||
}
|
||||
|
||||
force_unpack_check(c, key, val);
|
||||
|
||||
if (c->test == ID2SYM(rb_intern("check"))) {
|
||||
return ST_CHECK;
|
||||
return ST_CHECK;
|
||||
}
|
||||
if (c->test == ID2SYM(rb_intern("delete1"))) {
|
||||
if (c->nr == 1) return ST_DELETE;
|
||||
return ST_CHECK;
|
||||
if (c->nr == 1) return ST_DELETE;
|
||||
return ST_CHECK;
|
||||
}
|
||||
if (c->test == ID2SYM(rb_intern("delete2"))) {
|
||||
if (c->nr == 1) {
|
||||
st_data_t k = 0;
|
||||
st_data_t v;
|
||||
if (c->nr == 1) {
|
||||
st_data_t k = 0;
|
||||
st_data_t v;
|
||||
|
||||
if (!st_delete(c->tbl, &k, &v)) {
|
||||
rb_bug("failed to delete\n");
|
||||
}
|
||||
if (v != 0) {
|
||||
rb_bug("unexpected value deleted: %"PRIuVALUE" (expected 0)", (VALUE)v);
|
||||
}
|
||||
}
|
||||
return ST_CHECK;
|
||||
if (!st_delete(c->tbl, &k, &v)) {
|
||||
rb_bug("failed to delete\n");
|
||||
}
|
||||
if (v != 0) {
|
||||
rb_bug("unexpected value deleted: %"PRIuVALUE" (expected 0)", (VALUE)v);
|
||||
}
|
||||
}
|
||||
return ST_CHECK;
|
||||
}
|
||||
|
||||
rb_raise(rb_eArgError, "unexpected arg: %+"PRIsVALUE, c->test);
|
||||
@ -89,13 +89,13 @@ unp_fec(VALUE self, VALUE test)
|
||||
st_foreach_check(tbl, unp_fec_i, (st_data_t)&c, -1);
|
||||
|
||||
if (c.test == ID2SYM(rb_intern("delete2"))) {
|
||||
if (c.nr != 1) {
|
||||
rb_bug("mismatched iteration: %"PRIuVALUE" (expected 1)\n", (VALUE)c.nr);
|
||||
}
|
||||
if (c.nr != 1) {
|
||||
rb_bug("mismatched iteration: %"PRIuVALUE" (expected 1)\n", (VALUE)c.nr);
|
||||
}
|
||||
}
|
||||
else if (c.nr != expect_size) {
|
||||
rb_bug("mismatched iteration: %"PRIuVALUE" (expected %"PRIuVALUE")\n",
|
||||
(VALUE)c.nr, (VALUE)expect_size);
|
||||
rb_bug("mismatched iteration: %"PRIuVALUE" (expected %"PRIuVALUE")\n",
|
||||
(VALUE)c.nr, (VALUE)expect_size);
|
||||
}
|
||||
|
||||
if (tbl->bins == NULL) rb_bug("should be unpacked\n");
|
||||
@ -112,22 +112,22 @@ unp_fe_i(st_data_t key, st_data_t val, st_data_t args)
|
||||
|
||||
force_unpack_check(c, key, val);
|
||||
if (c->test == ID2SYM(rb_intern("unpacked"))) {
|
||||
return ST_CONTINUE;
|
||||
return ST_CONTINUE;
|
||||
}
|
||||
else if (c->test == ID2SYM(rb_intern("unpack_delete"))) {
|
||||
if (c->nr == 1) {
|
||||
st_data_t k = 0;
|
||||
st_data_t v;
|
||||
if (c->nr == 1) {
|
||||
st_data_t k = 0;
|
||||
st_data_t v;
|
||||
|
||||
if (!st_delete(c->tbl, &k, &v)) {
|
||||
rb_bug("failed to delete\n");
|
||||
}
|
||||
if (v != 0) {
|
||||
rb_bug("unexpected value deleted: %"PRIuVALUE" (expected 0)", (VALUE)v);
|
||||
}
|
||||
return ST_CONTINUE;
|
||||
}
|
||||
rb_bug("should never get here\n");
|
||||
if (!st_delete(c->tbl, &k, &v)) {
|
||||
rb_bug("failed to delete\n");
|
||||
}
|
||||
if (v != 0) {
|
||||
rb_bug("unexpected value deleted: %"PRIuVALUE" (expected 0)", (VALUE)v);
|
||||
}
|
||||
return ST_CONTINUE;
|
||||
}
|
||||
rb_bug("should never get here\n");
|
||||
}
|
||||
|
||||
rb_raise(rb_eArgError, "unexpected arg: %+"PRIsVALUE, c->test);
|
||||
@ -150,13 +150,13 @@ unp_fe(VALUE self, VALUE test)
|
||||
st_foreach(tbl, unp_fe_i, (st_data_t)&c);
|
||||
|
||||
if (c.test == ID2SYM(rb_intern("unpack_delete"))) {
|
||||
if (c.nr != 1) {
|
||||
rb_bug("mismatched iteration: %"PRIuVALUE" (expected 1)\n", (VALUE)c.nr);
|
||||
}
|
||||
if (c.nr != 1) {
|
||||
rb_bug("mismatched iteration: %"PRIuVALUE" (expected 1)\n", (VALUE)c.nr);
|
||||
}
|
||||
}
|
||||
else if (c.nr != expect_size) {
|
||||
rb_bug("mismatched iteration: %"PRIuVALUE" (expected %"PRIuVALUE"o)\n",
|
||||
(VALUE)c.nr, (VALUE)expect_size);
|
||||
rb_bug("mismatched iteration: %"PRIuVALUE" (expected %"PRIuVALUE"o)\n",
|
||||
(VALUE)c.nr, (VALUE)expect_size);
|
||||
}
|
||||
|
||||
if (tbl->bins == NULL) rb_bug("should be unpacked\n");
|
||||
|
@ -42,7 +42,7 @@ numhash_aref(VALUE self, VALUE key)
|
||||
st_table *tbl = (st_table *)Check_TypedStruct(self, &numhash_type);
|
||||
if (!SPECIAL_CONST_P(key)) rb_raise(rb_eArgError, "not a special const");
|
||||
if (st_lookup(tbl, (st_data_t)key, &data))
|
||||
return (VALUE)data;
|
||||
return (VALUE)data;
|
||||
return Qnil;
|
||||
}
|
||||
|
||||
@ -79,12 +79,12 @@ update_func(st_data_t *key, st_data_t *value, st_data_t arg, int existing)
|
||||
VALUE ret = rb_yield_values(existing ? 2 : 1, (VALUE)*key, (VALUE)*value);
|
||||
switch (ret) {
|
||||
case Qfalse:
|
||||
return ST_STOP;
|
||||
return ST_STOP;
|
||||
case Qnil:
|
||||
return ST_DELETE;
|
||||
return ST_DELETE;
|
||||
default:
|
||||
*value = ret;
|
||||
return ST_CONTINUE;
|
||||
*value = ret;
|
||||
return ST_CONTINUE;
|
||||
}
|
||||
}
|
||||
|
||||
@ -93,9 +93,9 @@ numhash_update(VALUE self, VALUE key)
|
||||
{
|
||||
st_table *table = (st_table *)Check_TypedStruct(self, &numhash_type);
|
||||
if (st_update(table, (st_data_t)key, update_func, 0))
|
||||
return Qtrue;
|
||||
return Qtrue;
|
||||
else
|
||||
return Qfalse;
|
||||
return Qfalse;
|
||||
}
|
||||
|
||||
#if SIZEOF_LONG == SIZEOF_VOIDP
|
||||
@ -117,7 +117,7 @@ numhash_delete_safe(VALUE self, VALUE key)
|
||||
st_table *table = (st_table *)Check_TypedStruct(self, &numhash_type);
|
||||
st_data_t val, k = (st_data_t)key;
|
||||
if (st_delete_safe(table, &k, &val, (st_data_t)self)) {
|
||||
return val;
|
||||
return val;
|
||||
}
|
||||
return Qnil;
|
||||
}
|
||||
|
@ -7,12 +7,12 @@ update_func(st_data_t *key, st_data_t *value, st_data_t arg, int existing)
|
||||
VALUE ret = rb_yield_values(existing ? 2 : 1, (VALUE)*key, (VALUE)*value);
|
||||
switch (ret) {
|
||||
case Qfalse:
|
||||
return ST_STOP;
|
||||
return ST_STOP;
|
||||
case Qnil:
|
||||
return ST_DELETE;
|
||||
return ST_DELETE;
|
||||
default:
|
||||
*value = ret;
|
||||
return ST_CONTINUE;
|
||||
*value = ret;
|
||||
return ST_CONTINUE;
|
||||
}
|
||||
}
|
||||
|
||||
@ -20,9 +20,9 @@ static VALUE
|
||||
test_st_update(VALUE self, VALUE key)
|
||||
{
|
||||
if (st_update(RHASH_TBL(self), (st_data_t)key, update_func, 0))
|
||||
return Qtrue;
|
||||
return Qtrue;
|
||||
else
|
||||
return Qfalse;
|
||||
return Qfalse;
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -8,13 +8,13 @@ coderange_int2sym(int coderange)
|
||||
{
|
||||
switch (coderange) {
|
||||
case ENC_CODERANGE_7BIT:
|
||||
return sym_7bit;
|
||||
return sym_7bit;
|
||||
case ENC_CODERANGE_VALID:
|
||||
return sym_valid;
|
||||
return sym_valid;
|
||||
case ENC_CODERANGE_UNKNOWN:
|
||||
return sym_unknown;
|
||||
return sym_unknown;
|
||||
case ENC_CODERANGE_BROKEN:
|
||||
return sym_broken;
|
||||
return sym_broken;
|
||||
}
|
||||
rb_bug("wrong condition of coderange");
|
||||
UNREACHABLE_RETURN(Qnil);
|
||||
|
@ -42,11 +42,11 @@ bug_str_cstr_term_char(VALUE str)
|
||||
len = rb_enc_mbminlen(enc);
|
||||
c = rb_enc_precise_mbclen(s, s + len, enc);
|
||||
if (!MBCLEN_CHARFOUND_P(c)) {
|
||||
c = (unsigned char)*s;
|
||||
c = (unsigned char)*s;
|
||||
}
|
||||
else {
|
||||
c = rb_enc_mbc_to_codepoint(s, s + len, enc);
|
||||
if (!c) return Qnil;
|
||||
c = rb_enc_mbc_to_codepoint(s, s + len, enc);
|
||||
if (!c) return Qnil;
|
||||
}
|
||||
return rb_enc_uint_chr((unsigned int)c, enc);
|
||||
}
|
||||
@ -65,14 +65,14 @@ bug_str_unterminated_substring(VALUE str, VALUE vbeg, VALUE vlen)
|
||||
#if USE_RVARGC
|
||||
RSTRING(str)->as.embed.len = (short)len;
|
||||
#else
|
||||
RSTRING(str)->basic.flags &= ~RSTRING_EMBED_LEN_MASK;
|
||||
RSTRING(str)->basic.flags |= len << RSTRING_EMBED_LEN_SHIFT;
|
||||
RSTRING(str)->basic.flags &= ~RSTRING_EMBED_LEN_MASK;
|
||||
RSTRING(str)->basic.flags |= len << RSTRING_EMBED_LEN_SHIFT;
|
||||
#endif
|
||||
memmove(RSTRING(str)->as.embed.ary, RSTRING(str)->as.embed.ary + beg, len);
|
||||
}
|
||||
else {
|
||||
RSTRING(str)->as.heap.ptr += beg;
|
||||
RSTRING(str)->as.heap.len = len;
|
||||
RSTRING(str)->as.heap.ptr += beg;
|
||||
RSTRING(str)->as.heap.len = len;
|
||||
}
|
||||
return str;
|
||||
}
|
||||
@ -104,7 +104,7 @@ bug_str_s_cstr_term_char(VALUE self, VALUE str)
|
||||
const int term_fill_len = (termlen);\
|
||||
*term_fill_ptr = '\0';\
|
||||
if (UNLIKELY(term_fill_len > 1))\
|
||||
memset(term_fill_ptr, 0, term_fill_len);\
|
||||
memset(term_fill_ptr, 0, term_fill_len);\
|
||||
} while (0)
|
||||
|
||||
static VALUE
|
||||
|
@ -35,22 +35,22 @@ bug_str_qsort_bang(int argc, VALUE *argv, VALUE str)
|
||||
rb_scan_args(argc, argv, "03", &beg, &len, &size);
|
||||
l = RSTRING_LEN(str);
|
||||
if (!NIL_P(beg) && (b = NUM2INT(beg)) < 0 && (b += l) < 0) {
|
||||
rb_raise(rb_eArgError, "out of bounds");
|
||||
rb_raise(rb_eArgError, "out of bounds");
|
||||
}
|
||||
if (!NIL_P(size) && (s = NUM2INT(size)) < 0) {
|
||||
rb_raise(rb_eArgError, "negative size");
|
||||
rb_raise(rb_eArgError, "negative size");
|
||||
}
|
||||
if (NIL_P(len) ||
|
||||
(((n = NUM2INT(len)) < 0) ?
|
||||
(rb_raise(rb_eArgError, "negative length"), 0) :
|
||||
(b + n * s > l))) {
|
||||
n = (l - b) / s;
|
||||
(((n = NUM2INT(len)) < 0) ?
|
||||
(rb_raise(rb_eArgError, "negative length"), 0) :
|
||||
(b + n * s > l))) {
|
||||
n = (l - b) / s;
|
||||
}
|
||||
rb_str_modify(str);
|
||||
d.enc = rb_enc_get(str);
|
||||
d.elsize = s;
|
||||
ruby_qsort(RSTRING_PTR(str) + b, n, s,
|
||||
rb_block_given_p() ? cmp_1 : cmp_2, &d);
|
||||
rb_block_given_p() ? cmp_1 : cmp_2, &d);
|
||||
return str;
|
||||
}
|
||||
|
||||
|
@ -6,7 +6,7 @@ bug_struct_get(VALUE obj, VALUE name)
|
||||
ID id = rb_check_id(&name);
|
||||
|
||||
if (!id) {
|
||||
rb_name_error_str(name, "`%"PRIsVALUE"' is not a struct member", name);
|
||||
rb_name_error_str(name, "`%"PRIsVALUE"' is not a struct member", name);
|
||||
}
|
||||
return rb_struct_getmember(obj, id);
|
||||
}
|
||||
|
@ -2,12 +2,12 @@
|
||||
|
||||
#ifdef HAVE_RB_IS_CONST_NAME
|
||||
# define get_symbol_type(type, t, name) do { \
|
||||
ID id = rb_check_id(&name); \
|
||||
t = (id ? rb_is_##type##_id(id) : rb_is_##type##_name(name)); \
|
||||
ID id = rb_check_id(&name); \
|
||||
t = (id ? rb_is_##type##_id(id) : rb_is_##type##_name(name)); \
|
||||
} while (0)
|
||||
#else
|
||||
# define get_symbol_type(type, t, name) do { \
|
||||
t = rb_is_##type##_id(rb_to_id(name)); \
|
||||
t = rb_is_##type##_id(rb_to_id(name)); \
|
||||
} while (0)
|
||||
#endif
|
||||
|
||||
|
@ -28,12 +28,12 @@ static void
|
||||
gc_start_end_i(VALUE tpval, void *data)
|
||||
{
|
||||
if (0) {
|
||||
rb_trace_arg_t *tparg = rb_tracearg_from_tracepoint(tpval);
|
||||
fprintf(stderr, "trace: %s\n", rb_tracearg_event_flag(tparg) == RUBY_INTERNAL_EVENT_GC_START ? "gc_start" : "gc_end");
|
||||
rb_trace_arg_t *tparg = rb_tracearg_from_tracepoint(tpval);
|
||||
fprintf(stderr, "trace: %s\n", rb_tracearg_event_flag(tparg) == RUBY_INTERNAL_EVENT_GC_START ? "gc_start" : "gc_end");
|
||||
}
|
||||
|
||||
if (invoking == 0) {
|
||||
rb_postponed_job_register(0, invoke_proc, data);
|
||||
rb_postponed_job_register(0, invoke_proc, data);
|
||||
}
|
||||
}
|
||||
|
||||
@ -45,19 +45,19 @@ set_gc_hook(VALUE module, VALUE proc, rb_event_flag_t event, const char *tp_str,
|
||||
|
||||
/* disable previous keys */
|
||||
if (rb_ivar_defined(module, tp_key) != 0 &&
|
||||
RTEST(tpval = rb_ivar_get(module, tp_key))) {
|
||||
rb_tracepoint_disable(tpval);
|
||||
rb_ivar_set(module, tp_key, Qnil);
|
||||
RTEST(tpval = rb_ivar_get(module, tp_key))) {
|
||||
rb_tracepoint_disable(tpval);
|
||||
rb_ivar_set(module, tp_key, Qnil);
|
||||
}
|
||||
|
||||
if (RTEST(proc)) {
|
||||
if (!rb_obj_is_proc(proc)) {
|
||||
rb_raise(rb_eTypeError, "trace_func needs to be Proc");
|
||||
}
|
||||
if (!rb_obj_is_proc(proc)) {
|
||||
rb_raise(rb_eTypeError, "trace_func needs to be Proc");
|
||||
}
|
||||
|
||||
tpval = rb_tracepoint_new(0, event, gc_start_end_i, (void *)proc);
|
||||
rb_ivar_set(module, tp_key, tpval);
|
||||
rb_tracepoint_enable(tpval);
|
||||
tpval = rb_tracepoint_new(0, event, gc_start_end_i, (void *)proc);
|
||||
rb_ivar_set(module, tp_key, tpval);
|
||||
rb_tracepoint_enable(tpval);
|
||||
}
|
||||
|
||||
return proc;
|
||||
@ -67,7 +67,7 @@ static VALUE
|
||||
set_after_gc_start(VALUE module, VALUE proc)
|
||||
{
|
||||
return set_gc_hook(module, proc, RUBY_INTERNAL_EVENT_GC_START,
|
||||
"__set_after_gc_start_tpval__", "__set_after_gc_start_proc__");
|
||||
"__set_after_gc_start_tpval__", "__set_after_gc_start_proc__");
|
||||
}
|
||||
|
||||
static VALUE
|
||||
|
@ -21,35 +21,35 @@ tracepoint_track_objspace_events_i(VALUE tpval, void *data)
|
||||
|
||||
switch (rb_tracearg_event_flag(tparg)) {
|
||||
case RUBY_INTERNAL_EVENT_NEWOBJ:
|
||||
{
|
||||
VALUE obj = rb_tracearg_object(tparg);
|
||||
if (track->objects_count < objects_max)
|
||||
track->objects[track->objects_count++] = obj;
|
||||
track->newobj_count++;
|
||||
break;
|
||||
}
|
||||
{
|
||||
VALUE obj = rb_tracearg_object(tparg);
|
||||
if (track->objects_count < objects_max)
|
||||
track->objects[track->objects_count++] = obj;
|
||||
track->newobj_count++;
|
||||
break;
|
||||
}
|
||||
case RUBY_INTERNAL_EVENT_FREEOBJ:
|
||||
{
|
||||
track->free_count++;
|
||||
break;
|
||||
}
|
||||
{
|
||||
track->free_count++;
|
||||
break;
|
||||
}
|
||||
case RUBY_INTERNAL_EVENT_GC_START:
|
||||
{
|
||||
track->gc_start_count++;
|
||||
break;
|
||||
}
|
||||
{
|
||||
track->gc_start_count++;
|
||||
break;
|
||||
}
|
||||
case RUBY_INTERNAL_EVENT_GC_END_MARK:
|
||||
{
|
||||
track->gc_end_mark_count++;
|
||||
break;
|
||||
}
|
||||
{
|
||||
track->gc_end_mark_count++;
|
||||
break;
|
||||
}
|
||||
case RUBY_INTERNAL_EVENT_GC_END_SWEEP:
|
||||
{
|
||||
track->gc_end_sweep_count++;
|
||||
break;
|
||||
}
|
||||
{
|
||||
track->gc_end_sweep_count++;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
rb_raise(rb_eRuntimeError, "unknown event");
|
||||
rb_raise(rb_eRuntimeError, "unknown event");
|
||||
}
|
||||
}
|
||||
|
||||
@ -58,9 +58,9 @@ tracepoint_track_objspace_events(VALUE self)
|
||||
{
|
||||
struct tracepoint_track track = {0, 0, 0, 0, 0,};
|
||||
VALUE tpval = rb_tracepoint_new(0, RUBY_INTERNAL_EVENT_NEWOBJ | RUBY_INTERNAL_EVENT_FREEOBJ |
|
||||
RUBY_INTERNAL_EVENT_GC_START | RUBY_INTERNAL_EVENT_GC_END_MARK |
|
||||
RUBY_INTERNAL_EVENT_GC_END_SWEEP,
|
||||
tracepoint_track_objspace_events_i, &track);
|
||||
RUBY_INTERNAL_EVENT_GC_START | RUBY_INTERNAL_EVENT_GC_END_MARK |
|
||||
RUBY_INTERNAL_EVENT_GC_END_SWEEP,
|
||||
tracepoint_track_objspace_events_i, &track);
|
||||
VALUE result = rb_ary_new();
|
||||
|
||||
rb_tracepoint_enable(tpval);
|
||||
|
@ -27,7 +27,7 @@ test_make(VALUE klass, VALUE num)
|
||||
unsigned long i, n = NUM2UINT(num);
|
||||
|
||||
for (i = 0; i < n; i++) {
|
||||
test_alloc(klass);
|
||||
test_alloc(klass);
|
||||
}
|
||||
|
||||
return Qnil;
|
||||
|
@ -23,14 +23,14 @@ register_at_exit(VALUE self, VALUE t)
|
||||
{
|
||||
switch (t) {
|
||||
case Qtrue:
|
||||
ruby_vm_at_exit(print_begin);
|
||||
break;
|
||||
ruby_vm_at_exit(print_begin);
|
||||
break;
|
||||
case Qfalse:
|
||||
ruby_vm_at_exit(print_end);
|
||||
break;
|
||||
ruby_vm_at_exit(print_end);
|
||||
break;
|
||||
default:
|
||||
ruby_vm_at_exit(do_nothing);
|
||||
break;
|
||||
ruby_vm_at_exit(do_nothing);
|
||||
break;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
@ -19,13 +19,13 @@ console_info(VALUE klass, VALUE io)
|
||||
CONSOLE_SCREEN_BUFFER_INFO csbi;
|
||||
|
||||
if (!GetConsoleScreenBufferInfo(h, &csbi))
|
||||
rb_syserr_fail(rb_w32_map_errno(GetLastError()), "not console");
|
||||
rb_syserr_fail(rb_w32_map_errno(GetLastError()), "not console");
|
||||
return rb_struct_new(rb_cConsoleScreenBufferInfo,
|
||||
INT2FIX(csbi.dwSize.X),
|
||||
INT2FIX(csbi.dwSize.Y),
|
||||
INT2FIX(csbi.dwCursorPosition.X),
|
||||
INT2FIX(csbi.dwCursorPosition.Y),
|
||||
INT2FIX(csbi.wAttributes));
|
||||
INT2FIX(csbi.dwSize.X),
|
||||
INT2FIX(csbi.dwSize.Y),
|
||||
INT2FIX(csbi.dwCursorPosition.X),
|
||||
INT2FIX(csbi.dwCursorPosition.Y),
|
||||
INT2FIX(csbi.wAttributes));
|
||||
}
|
||||
|
||||
static VALUE
|
||||
@ -44,9 +44,9 @@ void
|
||||
Init_attribute(VALUE m)
|
||||
{
|
||||
rb_cConsoleScreenBufferInfo = rb_struct_define_under(m, "ConsoleScreenBufferInfo",
|
||||
"size_x", "size_y",
|
||||
"cur_x", "cur_y",
|
||||
"attr", NULL);
|
||||
"size_x", "size_y",
|
||||
"cur_x", "cur_y",
|
||||
"attr", NULL);
|
||||
rb_define_singleton_method(m, "console_info", console_info, 1);
|
||||
rb_define_singleton_method(m, "console_attribute", console_set_attribute, 2);
|
||||
|
||||
|
@ -37,11 +37,11 @@ test_fdset(VALUE self)
|
||||
FD_ZERO(&set);
|
||||
|
||||
for (i = 0; i < FD_SETSIZE * 2; i++) {
|
||||
int sd = socket(AF_INET, SOCK_DGRAM, 0);
|
||||
FD_SET(sd, &set);
|
||||
if (set.fd_count > FD_SETSIZE) {
|
||||
return Qfalse;
|
||||
}
|
||||
int sd = socket(AF_INET, SOCK_DGRAM, 0);
|
||||
FD_SET(sd, &set);
|
||||
if (set.fd_count > FD_SETSIZE) {
|
||||
return Qfalse;
|
||||
}
|
||||
}
|
||||
return Qtrue;
|
||||
}
|
||||
|
@ -37,7 +37,7 @@ escaped_length(VALUE str)
|
||||
{
|
||||
const long len = RSTRING_LEN(str);
|
||||
if (len >= LONG_MAX / HTML_ESCAPE_MAX_LEN) {
|
||||
ruby_malloc_size_overflow(len, HTML_ESCAPE_MAX_LEN);
|
||||
ruby_malloc_size_overflow(len, HTML_ESCAPE_MAX_LEN);
|
||||
}
|
||||
return len * HTML_ESCAPE_MAX_LEN;
|
||||
}
|
||||
@ -81,8 +81,8 @@ optimized_unescape_html(VALUE str)
|
||||
enum {UNICODE_MAX = 0x10ffff};
|
||||
rb_encoding *enc = rb_enc_get(str);
|
||||
unsigned long charlimit = (strcasecmp(rb_enc_name(enc), "UTF-8") == 0 ? UNICODE_MAX :
|
||||
strcasecmp(rb_enc_name(enc), "ISO-8859-1") == 0 ? 256 :
|
||||
128);
|
||||
strcasecmp(rb_enc_name(enc), "ISO-8859-1") == 0 ? 256 :
|
||||
128);
|
||||
long i, len, beg = 0;
|
||||
size_t clen, plen;
|
||||
int overflow;
|
||||
@ -94,89 +94,89 @@ optimized_unescape_html(VALUE str)
|
||||
cstr = RSTRING_PTR(str);
|
||||
|
||||
for (i = 0; i < len; i++) {
|
||||
unsigned long cc;
|
||||
char c = cstr[i];
|
||||
if (c != '&') continue;
|
||||
plen = i - beg;
|
||||
if (++i >= len) break;
|
||||
c = (unsigned char)cstr[i];
|
||||
unsigned long cc;
|
||||
char c = cstr[i];
|
||||
if (c != '&') continue;
|
||||
plen = i - beg;
|
||||
if (++i >= len) break;
|
||||
c = (unsigned char)cstr[i];
|
||||
#define MATCH(s) (len - i >= (int)rb_strlen_lit(s) && \
|
||||
memcmp(&cstr[i], s, rb_strlen_lit(s)) == 0 && \
|
||||
(i += rb_strlen_lit(s) - 1, 1))
|
||||
switch (c) {
|
||||
case 'a':
|
||||
++i;
|
||||
if (MATCH("pos;")) {
|
||||
c = '\'';
|
||||
}
|
||||
else if (MATCH("mp;")) {
|
||||
c = '&';
|
||||
}
|
||||
else continue;
|
||||
break;
|
||||
case 'q':
|
||||
++i;
|
||||
if (MATCH("uot;")) {
|
||||
c = '"';
|
||||
}
|
||||
else continue;
|
||||
break;
|
||||
case 'g':
|
||||
++i;
|
||||
if (MATCH("t;")) {
|
||||
c = '>';
|
||||
}
|
||||
else continue;
|
||||
break;
|
||||
case 'l':
|
||||
++i;
|
||||
if (MATCH("t;")) {
|
||||
c = '<';
|
||||
}
|
||||
else continue;
|
||||
break;
|
||||
case '#':
|
||||
if (len - ++i >= 2 && ISDIGIT(cstr[i])) {
|
||||
cc = ruby_scan_digits(&cstr[i], len-i, 10, &clen, &overflow);
|
||||
}
|
||||
else if ((cstr[i] == 'x' || cstr[i] == 'X') && len - ++i >= 2 && ISXDIGIT(cstr[i])) {
|
||||
cc = ruby_scan_digits(&cstr[i], len-i, 16, &clen, &overflow);
|
||||
}
|
||||
else continue;
|
||||
i += clen;
|
||||
if (overflow || cc >= charlimit || cstr[i] != ';') continue;
|
||||
if (!dest) {
|
||||
dest = rb_str_buf_new(len);
|
||||
}
|
||||
rb_str_cat(dest, cstr + beg, plen);
|
||||
if (charlimit > 256) {
|
||||
rb_str_cat(dest, buf, rb_enc_mbcput((OnigCodePoint)cc, buf, enc));
|
||||
}
|
||||
else {
|
||||
c = (unsigned char)cc;
|
||||
rb_str_cat(dest, &c, 1);
|
||||
}
|
||||
beg = i + 1;
|
||||
continue;
|
||||
default:
|
||||
--i;
|
||||
continue;
|
||||
}
|
||||
if (!dest) {
|
||||
dest = rb_str_buf_new(len);
|
||||
}
|
||||
rb_str_cat(dest, cstr + beg, plen);
|
||||
rb_str_cat(dest, &c, 1);
|
||||
beg = i + 1;
|
||||
memcmp(&cstr[i], s, rb_strlen_lit(s)) == 0 && \
|
||||
(i += rb_strlen_lit(s) - 1, 1))
|
||||
switch (c) {
|
||||
case 'a':
|
||||
++i;
|
||||
if (MATCH("pos;")) {
|
||||
c = '\'';
|
||||
}
|
||||
else if (MATCH("mp;")) {
|
||||
c = '&';
|
||||
}
|
||||
else continue;
|
||||
break;
|
||||
case 'q':
|
||||
++i;
|
||||
if (MATCH("uot;")) {
|
||||
c = '"';
|
||||
}
|
||||
else continue;
|
||||
break;
|
||||
case 'g':
|
||||
++i;
|
||||
if (MATCH("t;")) {
|
||||
c = '>';
|
||||
}
|
||||
else continue;
|
||||
break;
|
||||
case 'l':
|
||||
++i;
|
||||
if (MATCH("t;")) {
|
||||
c = '<';
|
||||
}
|
||||
else continue;
|
||||
break;
|
||||
case '#':
|
||||
if (len - ++i >= 2 && ISDIGIT(cstr[i])) {
|
||||
cc = ruby_scan_digits(&cstr[i], len-i, 10, &clen, &overflow);
|
||||
}
|
||||
else if ((cstr[i] == 'x' || cstr[i] == 'X') && len - ++i >= 2 && ISXDIGIT(cstr[i])) {
|
||||
cc = ruby_scan_digits(&cstr[i], len-i, 16, &clen, &overflow);
|
||||
}
|
||||
else continue;
|
||||
i += clen;
|
||||
if (overflow || cc >= charlimit || cstr[i] != ';') continue;
|
||||
if (!dest) {
|
||||
dest = rb_str_buf_new(len);
|
||||
}
|
||||
rb_str_cat(dest, cstr + beg, plen);
|
||||
if (charlimit > 256) {
|
||||
rb_str_cat(dest, buf, rb_enc_mbcput((OnigCodePoint)cc, buf, enc));
|
||||
}
|
||||
else {
|
||||
c = (unsigned char)cc;
|
||||
rb_str_cat(dest, &c, 1);
|
||||
}
|
||||
beg = i + 1;
|
||||
continue;
|
||||
default:
|
||||
--i;
|
||||
continue;
|
||||
}
|
||||
if (!dest) {
|
||||
dest = rb_str_buf_new(len);
|
||||
}
|
||||
rb_str_cat(dest, cstr + beg, plen);
|
||||
rb_str_cat(dest, &c, 1);
|
||||
beg = i + 1;
|
||||
}
|
||||
|
||||
if (dest) {
|
||||
rb_str_cat(dest, cstr + beg, len - beg);
|
||||
preserve_original_state(str, dest);
|
||||
return dest;
|
||||
rb_str_cat(dest, cstr + beg, len - beg);
|
||||
preserve_original_state(str, dest);
|
||||
return dest;
|
||||
}
|
||||
else {
|
||||
return rb_str_dup(str);
|
||||
return rb_str_dup(str);
|
||||
}
|
||||
}
|
||||
|
||||
@ -211,33 +211,33 @@ optimized_escape(VALUE str)
|
||||
cstr = RSTRING_PTR(str);
|
||||
|
||||
for (i = 0; i < len; ++i) {
|
||||
const unsigned char c = (unsigned char)cstr[i];
|
||||
if (!url_unreserved_char(c)) {
|
||||
if (!dest) {
|
||||
dest = rb_str_buf_new(len);
|
||||
}
|
||||
const unsigned char c = (unsigned char)cstr[i];
|
||||
if (!url_unreserved_char(c)) {
|
||||
if (!dest) {
|
||||
dest = rb_str_buf_new(len);
|
||||
}
|
||||
|
||||
rb_str_cat(dest, cstr + beg, i - beg);
|
||||
beg = i + 1;
|
||||
rb_str_cat(dest, cstr + beg, i - beg);
|
||||
beg = i + 1;
|
||||
|
||||
if (c == ' ') {
|
||||
rb_str_cat_cstr(dest, "+");
|
||||
}
|
||||
else {
|
||||
buf[1] = upper_hexdigits[(c >> 4) & 0xf];
|
||||
buf[2] = upper_hexdigits[c & 0xf];
|
||||
rb_str_cat(dest, buf, 3);
|
||||
}
|
||||
}
|
||||
if (c == ' ') {
|
||||
rb_str_cat_cstr(dest, "+");
|
||||
}
|
||||
else {
|
||||
buf[1] = upper_hexdigits[(c >> 4) & 0xf];
|
||||
buf[2] = upper_hexdigits[c & 0xf];
|
||||
rb_str_cat(dest, buf, 3);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (dest) {
|
||||
rb_str_cat(dest, cstr + beg, len - beg);
|
||||
preserve_original_state(str, dest);
|
||||
return dest;
|
||||
rb_str_cat(dest, cstr + beg, len - beg);
|
||||
preserve_original_state(str, dest);
|
||||
return dest;
|
||||
}
|
||||
else {
|
||||
return rb_str_dup(str);
|
||||
return rb_str_dup(str);
|
||||
}
|
||||
}
|
||||
|
||||
@ -254,52 +254,52 @@ optimized_unescape(VALUE str, VALUE encoding)
|
||||
cstr = RSTRING_PTR(str);
|
||||
|
||||
for (i = 0; i < len; ++i) {
|
||||
char buf[1];
|
||||
const char c = cstr[i];
|
||||
int clen = 0;
|
||||
if (c == '%') {
|
||||
if (i + 3 > len) break;
|
||||
if (!ISXDIGIT(cstr[i+1])) continue;
|
||||
if (!ISXDIGIT(cstr[i+2])) continue;
|
||||
buf[0] = ((char_to_number(cstr[i+1]) << 4)
|
||||
| char_to_number(cstr[i+2]));
|
||||
clen = 2;
|
||||
}
|
||||
else if (c == '+') {
|
||||
buf[0] = ' ';
|
||||
}
|
||||
else {
|
||||
continue;
|
||||
}
|
||||
char buf[1];
|
||||
const char c = cstr[i];
|
||||
int clen = 0;
|
||||
if (c == '%') {
|
||||
if (i + 3 > len) break;
|
||||
if (!ISXDIGIT(cstr[i+1])) continue;
|
||||
if (!ISXDIGIT(cstr[i+2])) continue;
|
||||
buf[0] = ((char_to_number(cstr[i+1]) << 4)
|
||||
| char_to_number(cstr[i+2]));
|
||||
clen = 2;
|
||||
}
|
||||
else if (c == '+') {
|
||||
buf[0] = ' ';
|
||||
}
|
||||
else {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!dest) {
|
||||
dest = rb_str_buf_new(len);
|
||||
}
|
||||
if (!dest) {
|
||||
dest = rb_str_buf_new(len);
|
||||
}
|
||||
|
||||
rb_str_cat(dest, cstr + beg, i - beg);
|
||||
i += clen;
|
||||
beg = i + 1;
|
||||
rb_str_cat(dest, cstr + beg, i - beg);
|
||||
i += clen;
|
||||
beg = i + 1;
|
||||
|
||||
rb_str_cat(dest, buf, 1);
|
||||
rb_str_cat(dest, buf, 1);
|
||||
}
|
||||
|
||||
if (dest) {
|
||||
rb_str_cat(dest, cstr + beg, len - beg);
|
||||
preserve_original_state(str, dest);
|
||||
cr = ENC_CODERANGE_UNKNOWN;
|
||||
rb_str_cat(dest, cstr + beg, len - beg);
|
||||
preserve_original_state(str, dest);
|
||||
cr = ENC_CODERANGE_UNKNOWN;
|
||||
}
|
||||
else {
|
||||
dest = rb_str_dup(str);
|
||||
cr = ENC_CODERANGE(str);
|
||||
dest = rb_str_dup(str);
|
||||
cr = ENC_CODERANGE(str);
|
||||
}
|
||||
origenc = rb_enc_get_index(str);
|
||||
if (origenc != encidx) {
|
||||
rb_enc_associate_index(dest, encidx);
|
||||
if (!ENC_CODERANGE_CLEAN_P(rb_enc_str_coderange(dest))) {
|
||||
rb_enc_associate_index(dest, origenc);
|
||||
if (cr != ENC_CODERANGE_UNKNOWN)
|
||||
ENC_CODERANGE_SET(dest, cr);
|
||||
}
|
||||
rb_enc_associate_index(dest, encidx);
|
||||
if (!ENC_CODERANGE_CLEAN_P(rb_enc_str_coderange(dest))) {
|
||||
rb_enc_associate_index(dest, origenc);
|
||||
if (cr != ENC_CODERANGE_UNKNOWN)
|
||||
ENC_CODERANGE_SET(dest, cr);
|
||||
}
|
||||
}
|
||||
return dest;
|
||||
}
|
||||
@ -317,10 +317,10 @@ cgiesc_escape_html(VALUE self, VALUE str)
|
||||
StringValue(str);
|
||||
|
||||
if (rb_enc_str_asciicompat_p(str)) {
|
||||
return optimized_escape_html(str);
|
||||
return optimized_escape_html(str);
|
||||
}
|
||||
else {
|
||||
return rb_call_super(1, &str);
|
||||
return rb_call_super(1, &str);
|
||||
}
|
||||
}
|
||||
|
||||
@ -337,10 +337,10 @@ cgiesc_unescape_html(VALUE self, VALUE str)
|
||||
StringValue(str);
|
||||
|
||||
if (rb_enc_str_asciicompat_p(str)) {
|
||||
return optimized_unescape_html(str);
|
||||
return optimized_unescape_html(str);
|
||||
}
|
||||
else {
|
||||
return rb_call_super(1, &str);
|
||||
return rb_call_super(1, &str);
|
||||
}
|
||||
}
|
||||
|
||||
@ -357,10 +357,10 @@ cgiesc_escape(VALUE self, VALUE str)
|
||||
StringValue(str);
|
||||
|
||||
if (rb_enc_str_asciicompat_p(str)) {
|
||||
return optimized_escape(str);
|
||||
return optimized_escape(str);
|
||||
}
|
||||
else {
|
||||
return rb_call_super(1, &str);
|
||||
return rb_call_super(1, &str);
|
||||
}
|
||||
}
|
||||
|
||||
@ -368,7 +368,7 @@ static VALUE
|
||||
accept_charset(int argc, VALUE *argv, VALUE self)
|
||||
{
|
||||
if (argc > 0)
|
||||
return argv[0];
|
||||
return argv[0];
|
||||
return rb_cvar_get(CLASS_OF(self), id_accept_charset);
|
||||
}
|
||||
|
||||
@ -387,11 +387,11 @@ cgiesc_unescape(int argc, VALUE *argv, VALUE self)
|
||||
StringValue(str);
|
||||
|
||||
if (rb_enc_str_asciicompat_p(str)) {
|
||||
VALUE enc = accept_charset(argc-1, argv+1, self);
|
||||
return optimized_unescape(str, enc);
|
||||
VALUE enc = accept_charset(argc-1, argv+1, self);
|
||||
return optimized_unescape(str, enc);
|
||||
}
|
||||
else {
|
||||
return rb_call_super(argc, argv);
|
||||
return rb_call_super(argc, argv);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -44,27 +44,27 @@ rb_coverage_setup(int argc, VALUE *argv, VALUE klass)
|
||||
int mode;
|
||||
|
||||
if (current_state != IDLE) {
|
||||
rb_raise(rb_eRuntimeError, "coverage measurement is already setup");
|
||||
rb_raise(rb_eRuntimeError, "coverage measurement is already setup");
|
||||
}
|
||||
|
||||
rb_scan_args(argc, argv, "01", &opt);
|
||||
|
||||
if (argc == 0) {
|
||||
mode = 0; /* compatible mode */
|
||||
mode = 0; /* compatible mode */
|
||||
}
|
||||
else if (opt == ID2SYM(rb_intern("all"))) {
|
||||
mode = COVERAGE_TARGET_LINES | COVERAGE_TARGET_BRANCHES | COVERAGE_TARGET_METHODS;
|
||||
mode = COVERAGE_TARGET_LINES | COVERAGE_TARGET_BRANCHES | COVERAGE_TARGET_METHODS;
|
||||
}
|
||||
else {
|
||||
mode = 0;
|
||||
opt = rb_convert_type(opt, T_HASH, "Hash", "to_hash");
|
||||
mode = 0;
|
||||
opt = rb_convert_type(opt, T_HASH, "Hash", "to_hash");
|
||||
|
||||
if (RTEST(rb_hash_lookup(opt, ID2SYM(rb_intern("lines")))))
|
||||
mode |= COVERAGE_TARGET_LINES;
|
||||
if (RTEST(rb_hash_lookup(opt, ID2SYM(rb_intern("branches")))))
|
||||
mode |= COVERAGE_TARGET_BRANCHES;
|
||||
if (RTEST(rb_hash_lookup(opt, ID2SYM(rb_intern("methods")))))
|
||||
mode |= COVERAGE_TARGET_METHODS;
|
||||
if (RTEST(rb_hash_lookup(opt, ID2SYM(rb_intern("lines")))))
|
||||
mode |= COVERAGE_TARGET_LINES;
|
||||
if (RTEST(rb_hash_lookup(opt, ID2SYM(rb_intern("branches")))))
|
||||
mode |= COVERAGE_TARGET_BRANCHES;
|
||||
if (RTEST(rb_hash_lookup(opt, ID2SYM(rb_intern("methods")))))
|
||||
mode |= COVERAGE_TARGET_METHODS;
|
||||
if (RTEST(rb_hash_lookup(opt, ID2SYM(rb_intern("oneshot_lines"))))) {
|
||||
if (mode & COVERAGE_TARGET_LINES)
|
||||
rb_raise(rb_eRuntimeError, "cannot enable lines and oneshot_lines simultaneously");
|
||||
@ -77,20 +77,20 @@ rb_coverage_setup(int argc, VALUE *argv, VALUE klass)
|
||||
me2counter = rb_ident_hash_new();
|
||||
}
|
||||
else {
|
||||
me2counter = Qnil;
|
||||
me2counter = Qnil;
|
||||
}
|
||||
|
||||
coverages = rb_get_coverages();
|
||||
if (!RTEST(coverages)) {
|
||||
coverages = rb_hash_new();
|
||||
rb_obj_hide(coverages);
|
||||
current_mode = mode;
|
||||
if (mode == 0) mode = COVERAGE_TARGET_LINES;
|
||||
rb_set_coverages(coverages, mode, me2counter);
|
||||
coverages = rb_hash_new();
|
||||
rb_obj_hide(coverages);
|
||||
current_mode = mode;
|
||||
if (mode == 0) mode = COVERAGE_TARGET_LINES;
|
||||
rb_set_coverages(coverages, mode, me2counter);
|
||||
current_state = SUSPENDED;
|
||||
}
|
||||
else if (current_mode != mode) {
|
||||
rb_raise(rb_eRuntimeError, "cannot change the measuring target during coverage measurement");
|
||||
rb_raise(rb_eRuntimeError, "cannot change the measuring target during coverage measurement");
|
||||
}
|
||||
|
||||
|
||||
@ -112,10 +112,10 @@ VALUE
|
||||
rb_coverage_resume(VALUE klass)
|
||||
{
|
||||
if (current_state == IDLE) {
|
||||
rb_raise(rb_eRuntimeError, "coverage measurement is not set up yet");
|
||||
rb_raise(rb_eRuntimeError, "coverage measurement is not set up yet");
|
||||
}
|
||||
if (current_state == RUNNING) {
|
||||
rb_raise(rb_eRuntimeError, "coverage measurement is already running");
|
||||
rb_raise(rb_eRuntimeError, "coverage measurement is already running");
|
||||
}
|
||||
rb_resume_coverages();
|
||||
current_state = RUNNING;
|
||||
@ -218,45 +218,45 @@ method_coverage_i(void *vstart, void *vend, size_t stride, void *data)
|
||||
void *poisoned = asan_poisoned_object_p(v);
|
||||
asan_unpoison_object(v, false);
|
||||
|
||||
if (RB_TYPE_P(v, T_IMEMO) && imemo_type(v) == imemo_ment) {
|
||||
const rb_method_entry_t *me = (rb_method_entry_t *) v;
|
||||
VALUE path, first_lineno, first_column, last_lineno, last_column;
|
||||
VALUE data[5], ncoverage, methods;
|
||||
VALUE methods_id = ID2SYM(rb_intern("methods"));
|
||||
VALUE klass;
|
||||
const rb_method_entry_t *me2 = rb_resolve_me_location(me, data);
|
||||
if (me != me2) continue;
|
||||
klass = me->owner;
|
||||
if (RB_TYPE_P(klass, T_ICLASS)) {
|
||||
rb_bug("T_ICLASS");
|
||||
}
|
||||
path = data[0];
|
||||
first_lineno = data[1];
|
||||
first_column = data[2];
|
||||
last_lineno = data[3];
|
||||
last_column = data[4];
|
||||
if (FIX2LONG(first_lineno) <= 0) continue;
|
||||
ncoverage = rb_hash_aref(ncoverages, path);
|
||||
if (NIL_P(ncoverage)) continue;
|
||||
methods = rb_hash_aref(ncoverage, methods_id);
|
||||
if (RB_TYPE_P(v, T_IMEMO) && imemo_type(v) == imemo_ment) {
|
||||
const rb_method_entry_t *me = (rb_method_entry_t *) v;
|
||||
VALUE path, first_lineno, first_column, last_lineno, last_column;
|
||||
VALUE data[5], ncoverage, methods;
|
||||
VALUE methods_id = ID2SYM(rb_intern("methods"));
|
||||
VALUE klass;
|
||||
const rb_method_entry_t *me2 = rb_resolve_me_location(me, data);
|
||||
if (me != me2) continue;
|
||||
klass = me->owner;
|
||||
if (RB_TYPE_P(klass, T_ICLASS)) {
|
||||
rb_bug("T_ICLASS");
|
||||
}
|
||||
path = data[0];
|
||||
first_lineno = data[1];
|
||||
first_column = data[2];
|
||||
last_lineno = data[3];
|
||||
last_column = data[4];
|
||||
if (FIX2LONG(first_lineno) <= 0) continue;
|
||||
ncoverage = rb_hash_aref(ncoverages, path);
|
||||
if (NIL_P(ncoverage)) continue;
|
||||
methods = rb_hash_aref(ncoverage, methods_id);
|
||||
|
||||
{
|
||||
VALUE method_id = ID2SYM(me->def->original_id);
|
||||
VALUE rcount = rb_hash_aref(me2counter, (VALUE) me);
|
||||
VALUE key = rb_ary_new_from_args(6, klass, method_id, first_lineno, first_column, last_lineno, last_column);
|
||||
VALUE rcount2 = rb_hash_aref(methods, key);
|
||||
{
|
||||
VALUE method_id = ID2SYM(me->def->original_id);
|
||||
VALUE rcount = rb_hash_aref(me2counter, (VALUE) me);
|
||||
VALUE key = rb_ary_new_from_args(6, klass, method_id, first_lineno, first_column, last_lineno, last_column);
|
||||
VALUE rcount2 = rb_hash_aref(methods, key);
|
||||
|
||||
if (NIL_P(rcount)) rcount = LONG2FIX(0);
|
||||
if (NIL_P(rcount2)) rcount2 = LONG2FIX(0);
|
||||
if (!POSFIXABLE(FIX2LONG(rcount) + FIX2LONG(rcount2))) {
|
||||
rcount = LONG2FIX(FIXNUM_MAX);
|
||||
}
|
||||
else {
|
||||
rcount = LONG2FIX(FIX2LONG(rcount) + FIX2LONG(rcount2));
|
||||
}
|
||||
rb_hash_aset(methods, key, rcount);
|
||||
}
|
||||
}
|
||||
if (NIL_P(rcount)) rcount = LONG2FIX(0);
|
||||
if (NIL_P(rcount2)) rcount2 = LONG2FIX(0);
|
||||
if (!POSFIXABLE(FIX2LONG(rcount) + FIX2LONG(rcount2))) {
|
||||
rcount = LONG2FIX(FIXNUM_MAX);
|
||||
}
|
||||
else {
|
||||
rcount = LONG2FIX(FIX2LONG(rcount) + FIX2LONG(rcount2));
|
||||
}
|
||||
rb_hash_aset(methods, key, rcount);
|
||||
}
|
||||
}
|
||||
|
||||
if (poisoned) {
|
||||
asan_poison_object(v);
|
||||
@ -272,32 +272,32 @@ coverage_peek_result_i(st_data_t key, st_data_t val, st_data_t h)
|
||||
VALUE coverage = (VALUE)val;
|
||||
VALUE coverages = (VALUE)h;
|
||||
if (current_mode == 0) {
|
||||
/* compatible mode */
|
||||
VALUE lines = rb_ary_dup(RARRAY_AREF(coverage, COVERAGE_INDEX_LINES));
|
||||
rb_ary_freeze(lines);
|
||||
coverage = lines;
|
||||
/* compatible mode */
|
||||
VALUE lines = rb_ary_dup(RARRAY_AREF(coverage, COVERAGE_INDEX_LINES));
|
||||
rb_ary_freeze(lines);
|
||||
coverage = lines;
|
||||
}
|
||||
else {
|
||||
VALUE h = rb_hash_new();
|
||||
VALUE h = rb_hash_new();
|
||||
|
||||
if (current_mode & COVERAGE_TARGET_LINES) {
|
||||
VALUE lines = RARRAY_AREF(coverage, COVERAGE_INDEX_LINES);
|
||||
if (current_mode & COVERAGE_TARGET_LINES) {
|
||||
VALUE lines = RARRAY_AREF(coverage, COVERAGE_INDEX_LINES);
|
||||
const char *kw = (current_mode & COVERAGE_TARGET_ONESHOT_LINES) ? "oneshot_lines" : "lines";
|
||||
lines = rb_ary_dup(lines);
|
||||
rb_ary_freeze(lines);
|
||||
lines = rb_ary_dup(lines);
|
||||
rb_ary_freeze(lines);
|
||||
rb_hash_aset(h, ID2SYM(rb_intern(kw)), lines);
|
||||
}
|
||||
}
|
||||
|
||||
if (current_mode & COVERAGE_TARGET_BRANCHES) {
|
||||
VALUE branches = RARRAY_AREF(coverage, COVERAGE_INDEX_BRANCHES);
|
||||
rb_hash_aset(h, ID2SYM(rb_intern("branches")), branch_coverage(branches));
|
||||
}
|
||||
if (current_mode & COVERAGE_TARGET_BRANCHES) {
|
||||
VALUE branches = RARRAY_AREF(coverage, COVERAGE_INDEX_BRANCHES);
|
||||
rb_hash_aset(h, ID2SYM(rb_intern("branches")), branch_coverage(branches));
|
||||
}
|
||||
|
||||
if (current_mode & COVERAGE_TARGET_METHODS) {
|
||||
rb_hash_aset(h, ID2SYM(rb_intern("methods")), rb_hash_new());
|
||||
}
|
||||
if (current_mode & COVERAGE_TARGET_METHODS) {
|
||||
rb_hash_aset(h, ID2SYM(rb_intern("methods")), rb_hash_new());
|
||||
}
|
||||
|
||||
coverage = h;
|
||||
coverage = h;
|
||||
}
|
||||
|
||||
rb_hash_aset(coverages, path, coverage);
|
||||
@ -322,13 +322,13 @@ rb_coverage_peek_result(VALUE klass)
|
||||
VALUE coverages = rb_get_coverages();
|
||||
VALUE ncoverages = rb_hash_new();
|
||||
if (!RTEST(coverages)) {
|
||||
rb_raise(rb_eRuntimeError, "coverage measurement is not enabled");
|
||||
rb_raise(rb_eRuntimeError, "coverage measurement is not enabled");
|
||||
}
|
||||
OBJ_WB_UNPROTECT(coverages);
|
||||
st_foreach(RHASH_TBL_RAW(coverages), coverage_peek_result_i, ncoverages);
|
||||
|
||||
if (current_mode & COVERAGE_TARGET_METHODS) {
|
||||
rb_objspace_each_objects(method_coverage_i, &ncoverages);
|
||||
rb_objspace_each_objects(method_coverage_i, &ncoverages);
|
||||
}
|
||||
|
||||
rb_hash_freeze(ncoverages);
|
||||
@ -354,7 +354,7 @@ VALUE
|
||||
rb_coverage_suspend(VALUE klass)
|
||||
{
|
||||
if (current_state != RUNNING) {
|
||||
rb_raise(rb_eRuntimeError, "coverage measurement is not running");
|
||||
rb_raise(rb_eRuntimeError, "coverage measurement is not running");
|
||||
}
|
||||
rb_suspend_coverages();
|
||||
current_state = SUSPENDED;
|
||||
@ -377,7 +377,7 @@ rb_coverage_result(int argc, VALUE *argv, VALUE klass)
|
||||
int stop = 1, clear = 1;
|
||||
|
||||
if (current_state == IDLE) {
|
||||
rb_raise(rb_eRuntimeError, "coverage measurement is not enabled");
|
||||
rb_raise(rb_eRuntimeError, "coverage measurement is not enabled");
|
||||
}
|
||||
|
||||
rb_scan_args(argc, argv, "01", &opt);
|
||||
|
@ -37,7 +37,7 @@ bubblebabble_str_new(VALUE str_digest)
|
||||
digest_len = RSTRING_LEN(str_digest);
|
||||
|
||||
if ((LONG_MAX - 2) / 3 < (digest_len | 1)) {
|
||||
rb_raise(rb_eRuntimeError, "digest string too long");
|
||||
rb_raise(rb_eRuntimeError, "digest string too long");
|
||||
}
|
||||
|
||||
str = rb_str_new(0, (digest_len | 1) * 3 + 2);
|
||||
|
@ -154,7 +154,7 @@ static void
|
||||
rb_digest_instance_method_unimpl(VALUE self, const char *method)
|
||||
{
|
||||
rb_raise(rb_eRuntimeError, "%s does not implement %s()",
|
||||
rb_obj_classname(self), method);
|
||||
rb_obj_classname(self), method);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -383,8 +383,8 @@ rb_digest_instance_equal(VALUE self, VALUE other)
|
||||
StringValue(str2);
|
||||
|
||||
if (RSTRING_LEN(str1) == RSTRING_LEN(str2) &&
|
||||
rb_str_cmp(str1, str2) == 0) {
|
||||
return Qtrue;
|
||||
rb_str_cmp(str1, str2) == 0) {
|
||||
return Qtrue;
|
||||
}
|
||||
return Qfalse;
|
||||
}
|
||||
@ -602,7 +602,7 @@ static inline void
|
||||
algo_init(const rb_digest_metadata_t *algo, void *pctx)
|
||||
{
|
||||
if (algo->init_func(pctx) != 1) {
|
||||
rb_raise(rb_eRuntimeError, "Digest initialization failed.");
|
||||
rb_raise(rb_eRuntimeError, "Digest initialization failed.");
|
||||
}
|
||||
}
|
||||
|
||||
@ -614,7 +614,7 @@ rb_digest_base_alloc(VALUE klass)
|
||||
void *pctx;
|
||||
|
||||
if (klass == rb_cDigest_Base) {
|
||||
rb_raise(rb_eNotImpError, "Digest::Base is an abstract class");
|
||||
rb_raise(rb_eNotImpError, "Digest::Base is an abstract class");
|
||||
}
|
||||
|
||||
algo = get_digest_base_metadata(klass);
|
||||
@ -639,7 +639,7 @@ rb_digest_base_copy(VALUE copy, VALUE obj)
|
||||
|
||||
algo = get_digest_obj_metadata(copy);
|
||||
if (algo != get_digest_obj_metadata(obj))
|
||||
rb_raise(rb_eTypeError, "different algorithms");
|
||||
rb_raise(rb_eTypeError, "different algorithms");
|
||||
|
||||
TypedData_Get_Struct(obj, void, &digest_type, pctx1);
|
||||
TypedData_Get_Struct(copy, void, &digest_type, pctx2);
|
||||
|
@ -38,7 +38,7 @@ rb_digest_##name##_update(void *ctx, unsigned char *ptr, size_t size) \
|
||||
const unsigned int stride = 16384; \
|
||||
\
|
||||
for (; size > stride; size -= stride, ptr += stride) { \
|
||||
name##_Update(ctx, ptr, stride); \
|
||||
name##_Update(ctx, ptr, stride); \
|
||||
} \
|
||||
if (size > 0) name##_Update(ctx, ptr, size); \
|
||||
}
|
||||
|
@ -34,8 +34,8 @@
|
||||
that follows (in reverse chronological order):
|
||||
|
||||
2000-07-03 lpd Patched to eliminate warnings about "constant is
|
||||
unsigned in ANSI C, signed in traditional";
|
||||
made test program self-checking.
|
||||
unsigned in ANSI C, signed in traditional";
|
||||
made test program self-checking.
|
||||
1999-11-04 lpd Edited comments slightly for automatic TOC extraction.
|
||||
1999-10-18 lpd Fixed typo in header comment (ansi2knr rather than md5).
|
||||
1999-05-03 lpd Original version.
|
||||
@ -64,32 +64,32 @@ int
|
||||
main(void)
|
||||
{
|
||||
static const char *const test[7*2] = {
|
||||
"", "d41d8cd98f00b204e9800998ecf8427e",
|
||||
"a", "0cc175b9c0f1b6a831c399e269772661",
|
||||
"abc", "900150983cd24fb0d6963f7d28e17f72",
|
||||
"message digest", "f96b697d7cb7938d525a2f31aaf161d0",
|
||||
"abcdefghijklmnopqrstuvwxyz", "c3fcd3d76192e4007dfb496cca67e13b",
|
||||
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
|
||||
"d174ab98d277d9f5a5611c2c9f419d9f",
|
||||
"12345678901234567890123456789012345678901234567890123456789012345678901234567890", "57edf4a22be3c955ac49da2e2107b67a"
|
||||
"", "d41d8cd98f00b204e9800998ecf8427e",
|
||||
"a", "0cc175b9c0f1b6a831c399e269772661",
|
||||
"abc", "900150983cd24fb0d6963f7d28e17f72",
|
||||
"message digest", "f96b697d7cb7938d525a2f31aaf161d0",
|
||||
"abcdefghijklmnopqrstuvwxyz", "c3fcd3d76192e4007dfb496cca67e13b",
|
||||
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
|
||||
"d174ab98d277d9f5a5611c2c9f419d9f",
|
||||
"12345678901234567890123456789012345678901234567890123456789012345678901234567890", "57edf4a22be3c955ac49da2e2107b67a"
|
||||
};
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 7*2; i += 2) {
|
||||
MD5_CTX state;
|
||||
uint8_t digest[16];
|
||||
char hex_output[16*2 + 1];
|
||||
int di;
|
||||
MD5_CTX state;
|
||||
uint8_t digest[16];
|
||||
char hex_output[16*2 + 1];
|
||||
int di;
|
||||
|
||||
MD5_Init(&state);
|
||||
MD5_Update(&state, (const uint8_t *)test[i], strlen(test[i]));
|
||||
MD5_Final(digest, &state);
|
||||
printf("MD5 (\"%s\") = ", test[i]);
|
||||
for (di = 0; di < 16; ++di)
|
||||
sprintf(hex_output + di * 2, "%02x", digest[di]);
|
||||
puts(hex_output);
|
||||
if (strcmp(hex_output, test[i + 1]))
|
||||
printf("**** ERROR, should be: %s\n", test[i + 1]);
|
||||
MD5_Init(&state);
|
||||
MD5_Update(&state, (const uint8_t *)test[i], strlen(test[i]));
|
||||
MD5_Final(digest, &state);
|
||||
printf("MD5 (\"%s\") = ", test[i]);
|
||||
for (di = 0; di < 16; ++di)
|
||||
sprintf(hex_output + di * 2, "%02x", digest[di]);
|
||||
puts(hex_output);
|
||||
if (strcmp(hex_output, test[i + 1]))
|
||||
printf("**** ERROR, should be: %s\n", test[i + 1]);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@ -106,18 +106,18 @@ main(void)
|
||||
{
|
||||
int i;
|
||||
for (i = 1; i <= 64; ++i) {
|
||||
unsigned long v = (unsigned long)(4294967296.0 * fabs(sin((double)i)));
|
||||
unsigned long v = (unsigned long)(4294967296.0 * fabs(sin((double)i)));
|
||||
|
||||
/*
|
||||
* The following nonsense is only to avoid compiler warnings about
|
||||
* "integer constant is unsigned in ANSI C, signed with -traditional".
|
||||
*/
|
||||
if (v >> 31) {
|
||||
printf("#define T%d /* 0x%08lx */ (T_MASK ^ 0x%08lx)\n", i,
|
||||
v, (unsigned long)(unsigned int)(~v));
|
||||
} else {
|
||||
printf("#define T%d 0x%08lx\n", i, v);
|
||||
}
|
||||
/*
|
||||
* The following nonsense is only to avoid compiler warnings about
|
||||
* "integer constant is unsigned in ANSI C, signed with -traditional".
|
||||
*/
|
||||
if (v >> 31) {
|
||||
printf("#define T%d /* 0x%08lx */ (T_MASK ^ 0x%08lx)\n", i,
|
||||
v, (unsigned long)(unsigned int)(~v));
|
||||
} else {
|
||||
printf("#define T%d 0x%08lx\n", i, v);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@ -199,8 +199,8 @@ static void
|
||||
md5_process(MD5_CTX *pms, const uint8_t *data /*[64]*/)
|
||||
{
|
||||
uint32_t
|
||||
a = pms->state[0], b = pms->state[1],
|
||||
c = pms->state[2], d = pms->state[3];
|
||||
a = pms->state[0], b = pms->state[1],
|
||||
c = pms->state[2], d = pms->state[3];
|
||||
uint32_t t;
|
||||
|
||||
#ifdef WORDS_BIGENDIAN
|
||||
@ -214,7 +214,7 @@ md5_process(MD5_CTX *pms, const uint8_t *data /*[64]*/)
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 16; ++i, xp += 4)
|
||||
X[i] = xp[0] + (xp[1] << 8) + (xp[2] << 16) + (xp[3] << 24);
|
||||
X[i] = xp[0] + (xp[1] << 8) + (xp[2] << 16) + (xp[3] << 24);
|
||||
|
||||
#else
|
||||
|
||||
@ -226,12 +226,12 @@ md5_process(MD5_CTX *pms, const uint8_t *data /*[64]*/)
|
||||
const uint32_t *X;
|
||||
|
||||
if (!(((uintptr_t)data) & 3)) {
|
||||
/* data are properly aligned */
|
||||
X = (const uint32_t *)data;
|
||||
/* data are properly aligned */
|
||||
X = (const uint32_t *)data;
|
||||
} else {
|
||||
/* not aligned */
|
||||
memcpy(xbuf, data, 64);
|
||||
X = xbuf;
|
||||
/* not aligned */
|
||||
memcpy(xbuf, data, 64);
|
||||
X = xbuf;
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -370,55 +370,55 @@ MD5_Update(MD5_CTX *pms, const uint8_t *data, size_t nbytes)
|
||||
uint32_t nbits = (uint32_t)(nbytes << 3);
|
||||
|
||||
if (nbytes == 0)
|
||||
return;
|
||||
return;
|
||||
|
||||
/* Update the message length. */
|
||||
pms->count[1] += nbytes >> 29;
|
||||
pms->count[0] += nbits;
|
||||
if (pms->count[0] < nbits)
|
||||
pms->count[1]++;
|
||||
pms->count[1]++;
|
||||
|
||||
/* Process an initial partial block. */
|
||||
if (offset) {
|
||||
size_t copy = (offset + nbytes > 64 ? 64 - offset : nbytes);
|
||||
size_t copy = (offset + nbytes > 64 ? 64 - offset : nbytes);
|
||||
|
||||
memcpy(pms->buffer + offset, p, copy);
|
||||
if (offset + copy < 64)
|
||||
return;
|
||||
p += copy;
|
||||
left -= copy;
|
||||
md5_process(pms, pms->buffer);
|
||||
memcpy(pms->buffer + offset, p, copy);
|
||||
if (offset + copy < 64)
|
||||
return;
|
||||
p += copy;
|
||||
left -= copy;
|
||||
md5_process(pms, pms->buffer);
|
||||
}
|
||||
|
||||
/* Process full blocks. */
|
||||
for (; left >= 64; p += 64, left -= 64)
|
||||
md5_process(pms, p);
|
||||
md5_process(pms, p);
|
||||
|
||||
/* Process a final partial block. */
|
||||
if (left)
|
||||
memcpy(pms->buffer, p, left);
|
||||
memcpy(pms->buffer, p, left);
|
||||
}
|
||||
|
||||
int
|
||||
MD5_Finish(MD5_CTX *pms, uint8_t *digest)
|
||||
{
|
||||
static const uint8_t pad[64] = {
|
||||
0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
||||
0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
||||
};
|
||||
uint8_t data[8];
|
||||
size_t i;
|
||||
|
||||
/* Save the length before padding. */
|
||||
for (i = 0; i < 8; ++i)
|
||||
data[i] = (uint8_t)(pms->count[i >> 2] >> ((i & 3) << 3));
|
||||
data[i] = (uint8_t)(pms->count[i >> 2] >> ((i & 3) << 3));
|
||||
/* Pad to 56 bytes mod 64. */
|
||||
MD5_Update(pms, pad, ((55 - (pms->count[0] >> 3)) & 63) + 1);
|
||||
/* Append the length. */
|
||||
MD5_Update(pms, data, 8);
|
||||
for (i = 0; i < 16; ++i)
|
||||
digest[i] = (uint8_t)(pms->state[i >> 2] >> ((i & 3) << 3));
|
||||
digest[i] = (uint8_t)(pms->state[i >> 2] >> ((i & 3) << 3));
|
||||
return 1;
|
||||
}
|
||||
|
@ -34,8 +34,8 @@
|
||||
|
||||
1999-11-04 lpd Edited comments slightly for automatic TOC extraction.
|
||||
1999-10-18 lpd Fixed typo in header comment (ansi2knr rather than md5);
|
||||
added conditionalization for C++ compilation from Martin
|
||||
Purschke <purschke@bnl.gov>.
|
||||
added conditionalization for C++ compilation from Martin
|
||||
Purschke <purschke@bnl.gov>.
|
||||
1999-05-03 lpd Original version.
|
||||
*/
|
||||
|
||||
|
@ -128,17 +128,17 @@ int
|
||||
RMD160_Init(RMD160_CTX *context)
|
||||
{
|
||||
|
||||
_DIAGASSERT(context != NULL);
|
||||
_DIAGASSERT(context != NULL);
|
||||
|
||||
/* ripemd-160 initialization constants */
|
||||
context->state[0] = 0x67452301U;
|
||||
context->state[1] = 0xefcdab89U;
|
||||
context->state[2] = 0x98badcfeU;
|
||||
context->state[3] = 0x10325476U;
|
||||
context->state[4] = 0xc3d2e1f0U;
|
||||
context->length[0] = context->length[1] = 0;
|
||||
context->buflen = 0;
|
||||
return 1;
|
||||
/* ripemd-160 initialization constants */
|
||||
context->state[0] = 0x67452301U;
|
||||
context->state[1] = 0xefcdab89U;
|
||||
context->state[2] = 0x98badcfeU;
|
||||
context->state[3] = 0x10325476U;
|
||||
context->state[4] = 0xc3d2e1f0U;
|
||||
context->length[0] = context->length[1] = 0;
|
||||
context->buflen = 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
/********************************************************************/
|
||||
@ -146,205 +146,205 @@ RMD160_Init(RMD160_CTX *context)
|
||||
void
|
||||
RMD160_Transform(uint32_t state[5], const uint32_t block[16])
|
||||
{
|
||||
uint32_t aa, bb, cc, dd, ee;
|
||||
uint32_t aaa, bbb, ccc, ddd, eee;
|
||||
uint32_t aa, bb, cc, dd, ee;
|
||||
uint32_t aaa, bbb, ccc, ddd, eee;
|
||||
|
||||
_DIAGASSERT(state != NULL);
|
||||
_DIAGASSERT(block != NULL);
|
||||
_DIAGASSERT(state != NULL);
|
||||
_DIAGASSERT(block != NULL);
|
||||
|
||||
aa = aaa = state[0];
|
||||
bb = bbb = state[1];
|
||||
cc = ccc = state[2];
|
||||
dd = ddd = state[3];
|
||||
ee = eee = state[4];
|
||||
aa = aaa = state[0];
|
||||
bb = bbb = state[1];
|
||||
cc = ccc = state[2];
|
||||
dd = ddd = state[3];
|
||||
ee = eee = state[4];
|
||||
|
||||
/* round 1 */
|
||||
FF(aa, bb, cc, dd, ee, block[ 0], 11);
|
||||
FF(ee, aa, bb, cc, dd, block[ 1], 14);
|
||||
FF(dd, ee, aa, bb, cc, block[ 2], 15);
|
||||
FF(cc, dd, ee, aa, bb, block[ 3], 12);
|
||||
FF(bb, cc, dd, ee, aa, block[ 4], 5);
|
||||
FF(aa, bb, cc, dd, ee, block[ 5], 8);
|
||||
FF(ee, aa, bb, cc, dd, block[ 6], 7);
|
||||
FF(dd, ee, aa, bb, cc, block[ 7], 9);
|
||||
FF(cc, dd, ee, aa, bb, block[ 8], 11);
|
||||
FF(bb, cc, dd, ee, aa, block[ 9], 13);
|
||||
FF(aa, bb, cc, dd, ee, block[10], 14);
|
||||
FF(ee, aa, bb, cc, dd, block[11], 15);
|
||||
FF(dd, ee, aa, bb, cc, block[12], 6);
|
||||
FF(cc, dd, ee, aa, bb, block[13], 7);
|
||||
FF(bb, cc, dd, ee, aa, block[14], 9);
|
||||
FF(aa, bb, cc, dd, ee, block[15], 8);
|
||||
/* round 1 */
|
||||
FF(aa, bb, cc, dd, ee, block[ 0], 11);
|
||||
FF(ee, aa, bb, cc, dd, block[ 1], 14);
|
||||
FF(dd, ee, aa, bb, cc, block[ 2], 15);
|
||||
FF(cc, dd, ee, aa, bb, block[ 3], 12);
|
||||
FF(bb, cc, dd, ee, aa, block[ 4], 5);
|
||||
FF(aa, bb, cc, dd, ee, block[ 5], 8);
|
||||
FF(ee, aa, bb, cc, dd, block[ 6], 7);
|
||||
FF(dd, ee, aa, bb, cc, block[ 7], 9);
|
||||
FF(cc, dd, ee, aa, bb, block[ 8], 11);
|
||||
FF(bb, cc, dd, ee, aa, block[ 9], 13);
|
||||
FF(aa, bb, cc, dd, ee, block[10], 14);
|
||||
FF(ee, aa, bb, cc, dd, block[11], 15);
|
||||
FF(dd, ee, aa, bb, cc, block[12], 6);
|
||||
FF(cc, dd, ee, aa, bb, block[13], 7);
|
||||
FF(bb, cc, dd, ee, aa, block[14], 9);
|
||||
FF(aa, bb, cc, dd, ee, block[15], 8);
|
||||
|
||||
/* round 2 */
|
||||
GG(ee, aa, bb, cc, dd, block[ 7], 7);
|
||||
GG(dd, ee, aa, bb, cc, block[ 4], 6);
|
||||
GG(cc, dd, ee, aa, bb, block[13], 8);
|
||||
GG(bb, cc, dd, ee, aa, block[ 1], 13);
|
||||
GG(aa, bb, cc, dd, ee, block[10], 11);
|
||||
GG(ee, aa, bb, cc, dd, block[ 6], 9);
|
||||
GG(dd, ee, aa, bb, cc, block[15], 7);
|
||||
GG(cc, dd, ee, aa, bb, block[ 3], 15);
|
||||
GG(bb, cc, dd, ee, aa, block[12], 7);
|
||||
GG(aa, bb, cc, dd, ee, block[ 0], 12);
|
||||
GG(ee, aa, bb, cc, dd, block[ 9], 15);
|
||||
GG(dd, ee, aa, bb, cc, block[ 5], 9);
|
||||
GG(cc, dd, ee, aa, bb, block[ 2], 11);
|
||||
GG(bb, cc, dd, ee, aa, block[14], 7);
|
||||
GG(aa, bb, cc, dd, ee, block[11], 13);
|
||||
GG(ee, aa, bb, cc, dd, block[ 8], 12);
|
||||
/* round 2 */
|
||||
GG(ee, aa, bb, cc, dd, block[ 7], 7);
|
||||
GG(dd, ee, aa, bb, cc, block[ 4], 6);
|
||||
GG(cc, dd, ee, aa, bb, block[13], 8);
|
||||
GG(bb, cc, dd, ee, aa, block[ 1], 13);
|
||||
GG(aa, bb, cc, dd, ee, block[10], 11);
|
||||
GG(ee, aa, bb, cc, dd, block[ 6], 9);
|
||||
GG(dd, ee, aa, bb, cc, block[15], 7);
|
||||
GG(cc, dd, ee, aa, bb, block[ 3], 15);
|
||||
GG(bb, cc, dd, ee, aa, block[12], 7);
|
||||
GG(aa, bb, cc, dd, ee, block[ 0], 12);
|
||||
GG(ee, aa, bb, cc, dd, block[ 9], 15);
|
||||
GG(dd, ee, aa, bb, cc, block[ 5], 9);
|
||||
GG(cc, dd, ee, aa, bb, block[ 2], 11);
|
||||
GG(bb, cc, dd, ee, aa, block[14], 7);
|
||||
GG(aa, bb, cc, dd, ee, block[11], 13);
|
||||
GG(ee, aa, bb, cc, dd, block[ 8], 12);
|
||||
|
||||
/* round 3 */
|
||||
HH(dd, ee, aa, bb, cc, block[ 3], 11);
|
||||
HH(cc, dd, ee, aa, bb, block[10], 13);
|
||||
HH(bb, cc, dd, ee, aa, block[14], 6);
|
||||
HH(aa, bb, cc, dd, ee, block[ 4], 7);
|
||||
HH(ee, aa, bb, cc, dd, block[ 9], 14);
|
||||
HH(dd, ee, aa, bb, cc, block[15], 9);
|
||||
HH(cc, dd, ee, aa, bb, block[ 8], 13);
|
||||
HH(bb, cc, dd, ee, aa, block[ 1], 15);
|
||||
HH(aa, bb, cc, dd, ee, block[ 2], 14);
|
||||
HH(ee, aa, bb, cc, dd, block[ 7], 8);
|
||||
HH(dd, ee, aa, bb, cc, block[ 0], 13);
|
||||
HH(cc, dd, ee, aa, bb, block[ 6], 6);
|
||||
HH(bb, cc, dd, ee, aa, block[13], 5);
|
||||
HH(aa, bb, cc, dd, ee, block[11], 12);
|
||||
HH(ee, aa, bb, cc, dd, block[ 5], 7);
|
||||
HH(dd, ee, aa, bb, cc, block[12], 5);
|
||||
/* round 3 */
|
||||
HH(dd, ee, aa, bb, cc, block[ 3], 11);
|
||||
HH(cc, dd, ee, aa, bb, block[10], 13);
|
||||
HH(bb, cc, dd, ee, aa, block[14], 6);
|
||||
HH(aa, bb, cc, dd, ee, block[ 4], 7);
|
||||
HH(ee, aa, bb, cc, dd, block[ 9], 14);
|
||||
HH(dd, ee, aa, bb, cc, block[15], 9);
|
||||
HH(cc, dd, ee, aa, bb, block[ 8], 13);
|
||||
HH(bb, cc, dd, ee, aa, block[ 1], 15);
|
||||
HH(aa, bb, cc, dd, ee, block[ 2], 14);
|
||||
HH(ee, aa, bb, cc, dd, block[ 7], 8);
|
||||
HH(dd, ee, aa, bb, cc, block[ 0], 13);
|
||||
HH(cc, dd, ee, aa, bb, block[ 6], 6);
|
||||
HH(bb, cc, dd, ee, aa, block[13], 5);
|
||||
HH(aa, bb, cc, dd, ee, block[11], 12);
|
||||
HH(ee, aa, bb, cc, dd, block[ 5], 7);
|
||||
HH(dd, ee, aa, bb, cc, block[12], 5);
|
||||
|
||||
/* round 4 */
|
||||
II(cc, dd, ee, aa, bb, block[ 1], 11);
|
||||
II(bb, cc, dd, ee, aa, block[ 9], 12);
|
||||
II(aa, bb, cc, dd, ee, block[11], 14);
|
||||
II(ee, aa, bb, cc, dd, block[10], 15);
|
||||
II(dd, ee, aa, bb, cc, block[ 0], 14);
|
||||
II(cc, dd, ee, aa, bb, block[ 8], 15);
|
||||
II(bb, cc, dd, ee, aa, block[12], 9);
|
||||
II(aa, bb, cc, dd, ee, block[ 4], 8);
|
||||
II(ee, aa, bb, cc, dd, block[13], 9);
|
||||
II(dd, ee, aa, bb, cc, block[ 3], 14);
|
||||
II(cc, dd, ee, aa, bb, block[ 7], 5);
|
||||
II(bb, cc, dd, ee, aa, block[15], 6);
|
||||
II(aa, bb, cc, dd, ee, block[14], 8);
|
||||
II(ee, aa, bb, cc, dd, block[ 5], 6);
|
||||
II(dd, ee, aa, bb, cc, block[ 6], 5);
|
||||
II(cc, dd, ee, aa, bb, block[ 2], 12);
|
||||
/* round 4 */
|
||||
II(cc, dd, ee, aa, bb, block[ 1], 11);
|
||||
II(bb, cc, dd, ee, aa, block[ 9], 12);
|
||||
II(aa, bb, cc, dd, ee, block[11], 14);
|
||||
II(ee, aa, bb, cc, dd, block[10], 15);
|
||||
II(dd, ee, aa, bb, cc, block[ 0], 14);
|
||||
II(cc, dd, ee, aa, bb, block[ 8], 15);
|
||||
II(bb, cc, dd, ee, aa, block[12], 9);
|
||||
II(aa, bb, cc, dd, ee, block[ 4], 8);
|
||||
II(ee, aa, bb, cc, dd, block[13], 9);
|
||||
II(dd, ee, aa, bb, cc, block[ 3], 14);
|
||||
II(cc, dd, ee, aa, bb, block[ 7], 5);
|
||||
II(bb, cc, dd, ee, aa, block[15], 6);
|
||||
II(aa, bb, cc, dd, ee, block[14], 8);
|
||||
II(ee, aa, bb, cc, dd, block[ 5], 6);
|
||||
II(dd, ee, aa, bb, cc, block[ 6], 5);
|
||||
II(cc, dd, ee, aa, bb, block[ 2], 12);
|
||||
|
||||
/* round 5 */
|
||||
JJ(bb, cc, dd, ee, aa, block[ 4], 9);
|
||||
JJ(aa, bb, cc, dd, ee, block[ 0], 15);
|
||||
JJ(ee, aa, bb, cc, dd, block[ 5], 5);
|
||||
JJ(dd, ee, aa, bb, cc, block[ 9], 11);
|
||||
JJ(cc, dd, ee, aa, bb, block[ 7], 6);
|
||||
JJ(bb, cc, dd, ee, aa, block[12], 8);
|
||||
JJ(aa, bb, cc, dd, ee, block[ 2], 13);
|
||||
JJ(ee, aa, bb, cc, dd, block[10], 12);
|
||||
JJ(dd, ee, aa, bb, cc, block[14], 5);
|
||||
JJ(cc, dd, ee, aa, bb, block[ 1], 12);
|
||||
JJ(bb, cc, dd, ee, aa, block[ 3], 13);
|
||||
JJ(aa, bb, cc, dd, ee, block[ 8], 14);
|
||||
JJ(ee, aa, bb, cc, dd, block[11], 11);
|
||||
JJ(dd, ee, aa, bb, cc, block[ 6], 8);
|
||||
JJ(cc, dd, ee, aa, bb, block[15], 5);
|
||||
JJ(bb, cc, dd, ee, aa, block[13], 6);
|
||||
/* round 5 */
|
||||
JJ(bb, cc, dd, ee, aa, block[ 4], 9);
|
||||
JJ(aa, bb, cc, dd, ee, block[ 0], 15);
|
||||
JJ(ee, aa, bb, cc, dd, block[ 5], 5);
|
||||
JJ(dd, ee, aa, bb, cc, block[ 9], 11);
|
||||
JJ(cc, dd, ee, aa, bb, block[ 7], 6);
|
||||
JJ(bb, cc, dd, ee, aa, block[12], 8);
|
||||
JJ(aa, bb, cc, dd, ee, block[ 2], 13);
|
||||
JJ(ee, aa, bb, cc, dd, block[10], 12);
|
||||
JJ(dd, ee, aa, bb, cc, block[14], 5);
|
||||
JJ(cc, dd, ee, aa, bb, block[ 1], 12);
|
||||
JJ(bb, cc, dd, ee, aa, block[ 3], 13);
|
||||
JJ(aa, bb, cc, dd, ee, block[ 8], 14);
|
||||
JJ(ee, aa, bb, cc, dd, block[11], 11);
|
||||
JJ(dd, ee, aa, bb, cc, block[ 6], 8);
|
||||
JJ(cc, dd, ee, aa, bb, block[15], 5);
|
||||
JJ(bb, cc, dd, ee, aa, block[13], 6);
|
||||
|
||||
/* parallel round 1 */
|
||||
JJJ(aaa, bbb, ccc, ddd, eee, block[ 5], 8);
|
||||
JJJ(eee, aaa, bbb, ccc, ddd, block[14], 9);
|
||||
JJJ(ddd, eee, aaa, bbb, ccc, block[ 7], 9);
|
||||
JJJ(ccc, ddd, eee, aaa, bbb, block[ 0], 11);
|
||||
JJJ(bbb, ccc, ddd, eee, aaa, block[ 9], 13);
|
||||
JJJ(aaa, bbb, ccc, ddd, eee, block[ 2], 15);
|
||||
JJJ(eee, aaa, bbb, ccc, ddd, block[11], 15);
|
||||
JJJ(ddd, eee, aaa, bbb, ccc, block[ 4], 5);
|
||||
JJJ(ccc, ddd, eee, aaa, bbb, block[13], 7);
|
||||
JJJ(bbb, ccc, ddd, eee, aaa, block[ 6], 7);
|
||||
JJJ(aaa, bbb, ccc, ddd, eee, block[15], 8);
|
||||
JJJ(eee, aaa, bbb, ccc, ddd, block[ 8], 11);
|
||||
JJJ(ddd, eee, aaa, bbb, ccc, block[ 1], 14);
|
||||
JJJ(ccc, ddd, eee, aaa, bbb, block[10], 14);
|
||||
JJJ(bbb, ccc, ddd, eee, aaa, block[ 3], 12);
|
||||
JJJ(aaa, bbb, ccc, ddd, eee, block[12], 6);
|
||||
/* parallel round 1 */
|
||||
JJJ(aaa, bbb, ccc, ddd, eee, block[ 5], 8);
|
||||
JJJ(eee, aaa, bbb, ccc, ddd, block[14], 9);
|
||||
JJJ(ddd, eee, aaa, bbb, ccc, block[ 7], 9);
|
||||
JJJ(ccc, ddd, eee, aaa, bbb, block[ 0], 11);
|
||||
JJJ(bbb, ccc, ddd, eee, aaa, block[ 9], 13);
|
||||
JJJ(aaa, bbb, ccc, ddd, eee, block[ 2], 15);
|
||||
JJJ(eee, aaa, bbb, ccc, ddd, block[11], 15);
|
||||
JJJ(ddd, eee, aaa, bbb, ccc, block[ 4], 5);
|
||||
JJJ(ccc, ddd, eee, aaa, bbb, block[13], 7);
|
||||
JJJ(bbb, ccc, ddd, eee, aaa, block[ 6], 7);
|
||||
JJJ(aaa, bbb, ccc, ddd, eee, block[15], 8);
|
||||
JJJ(eee, aaa, bbb, ccc, ddd, block[ 8], 11);
|
||||
JJJ(ddd, eee, aaa, bbb, ccc, block[ 1], 14);
|
||||
JJJ(ccc, ddd, eee, aaa, bbb, block[10], 14);
|
||||
JJJ(bbb, ccc, ddd, eee, aaa, block[ 3], 12);
|
||||
JJJ(aaa, bbb, ccc, ddd, eee, block[12], 6);
|
||||
|
||||
/* parallel round 2 */
|
||||
III(eee, aaa, bbb, ccc, ddd, block[ 6], 9);
|
||||
III(ddd, eee, aaa, bbb, ccc, block[11], 13);
|
||||
III(ccc, ddd, eee, aaa, bbb, block[ 3], 15);
|
||||
III(bbb, ccc, ddd, eee, aaa, block[ 7], 7);
|
||||
III(aaa, bbb, ccc, ddd, eee, block[ 0], 12);
|
||||
III(eee, aaa, bbb, ccc, ddd, block[13], 8);
|
||||
III(ddd, eee, aaa, bbb, ccc, block[ 5], 9);
|
||||
III(ccc, ddd, eee, aaa, bbb, block[10], 11);
|
||||
III(bbb, ccc, ddd, eee, aaa, block[14], 7);
|
||||
III(aaa, bbb, ccc, ddd, eee, block[15], 7);
|
||||
III(eee, aaa, bbb, ccc, ddd, block[ 8], 12);
|
||||
III(ddd, eee, aaa, bbb, ccc, block[12], 7);
|
||||
III(ccc, ddd, eee, aaa, bbb, block[ 4], 6);
|
||||
III(bbb, ccc, ddd, eee, aaa, block[ 9], 15);
|
||||
III(aaa, bbb, ccc, ddd, eee, block[ 1], 13);
|
||||
III(eee, aaa, bbb, ccc, ddd, block[ 2], 11);
|
||||
/* parallel round 2 */
|
||||
III(eee, aaa, bbb, ccc, ddd, block[ 6], 9);
|
||||
III(ddd, eee, aaa, bbb, ccc, block[11], 13);
|
||||
III(ccc, ddd, eee, aaa, bbb, block[ 3], 15);
|
||||
III(bbb, ccc, ddd, eee, aaa, block[ 7], 7);
|
||||
III(aaa, bbb, ccc, ddd, eee, block[ 0], 12);
|
||||
III(eee, aaa, bbb, ccc, ddd, block[13], 8);
|
||||
III(ddd, eee, aaa, bbb, ccc, block[ 5], 9);
|
||||
III(ccc, ddd, eee, aaa, bbb, block[10], 11);
|
||||
III(bbb, ccc, ddd, eee, aaa, block[14], 7);
|
||||
III(aaa, bbb, ccc, ddd, eee, block[15], 7);
|
||||
III(eee, aaa, bbb, ccc, ddd, block[ 8], 12);
|
||||
III(ddd, eee, aaa, bbb, ccc, block[12], 7);
|
||||
III(ccc, ddd, eee, aaa, bbb, block[ 4], 6);
|
||||
III(bbb, ccc, ddd, eee, aaa, block[ 9], 15);
|
||||
III(aaa, bbb, ccc, ddd, eee, block[ 1], 13);
|
||||
III(eee, aaa, bbb, ccc, ddd, block[ 2], 11);
|
||||
|
||||
/* parallel round 3 */
|
||||
HHH(ddd, eee, aaa, bbb, ccc, block[15], 9);
|
||||
HHH(ccc, ddd, eee, aaa, bbb, block[ 5], 7);
|
||||
HHH(bbb, ccc, ddd, eee, aaa, block[ 1], 15);
|
||||
HHH(aaa, bbb, ccc, ddd, eee, block[ 3], 11);
|
||||
HHH(eee, aaa, bbb, ccc, ddd, block[ 7], 8);
|
||||
HHH(ddd, eee, aaa, bbb, ccc, block[14], 6);
|
||||
HHH(ccc, ddd, eee, aaa, bbb, block[ 6], 6);
|
||||
HHH(bbb, ccc, ddd, eee, aaa, block[ 9], 14);
|
||||
HHH(aaa, bbb, ccc, ddd, eee, block[11], 12);
|
||||
HHH(eee, aaa, bbb, ccc, ddd, block[ 8], 13);
|
||||
HHH(ddd, eee, aaa, bbb, ccc, block[12], 5);
|
||||
HHH(ccc, ddd, eee, aaa, bbb, block[ 2], 14);
|
||||
HHH(bbb, ccc, ddd, eee, aaa, block[10], 13);
|
||||
HHH(aaa, bbb, ccc, ddd, eee, block[ 0], 13);
|
||||
HHH(eee, aaa, bbb, ccc, ddd, block[ 4], 7);
|
||||
HHH(ddd, eee, aaa, bbb, ccc, block[13], 5);
|
||||
/* parallel round 3 */
|
||||
HHH(ddd, eee, aaa, bbb, ccc, block[15], 9);
|
||||
HHH(ccc, ddd, eee, aaa, bbb, block[ 5], 7);
|
||||
HHH(bbb, ccc, ddd, eee, aaa, block[ 1], 15);
|
||||
HHH(aaa, bbb, ccc, ddd, eee, block[ 3], 11);
|
||||
HHH(eee, aaa, bbb, ccc, ddd, block[ 7], 8);
|
||||
HHH(ddd, eee, aaa, bbb, ccc, block[14], 6);
|
||||
HHH(ccc, ddd, eee, aaa, bbb, block[ 6], 6);
|
||||
HHH(bbb, ccc, ddd, eee, aaa, block[ 9], 14);
|
||||
HHH(aaa, bbb, ccc, ddd, eee, block[11], 12);
|
||||
HHH(eee, aaa, bbb, ccc, ddd, block[ 8], 13);
|
||||
HHH(ddd, eee, aaa, bbb, ccc, block[12], 5);
|
||||
HHH(ccc, ddd, eee, aaa, bbb, block[ 2], 14);
|
||||
HHH(bbb, ccc, ddd, eee, aaa, block[10], 13);
|
||||
HHH(aaa, bbb, ccc, ddd, eee, block[ 0], 13);
|
||||
HHH(eee, aaa, bbb, ccc, ddd, block[ 4], 7);
|
||||
HHH(ddd, eee, aaa, bbb, ccc, block[13], 5);
|
||||
|
||||
/* parallel round 4 */
|
||||
GGG(ccc, ddd, eee, aaa, bbb, block[ 8], 15);
|
||||
GGG(bbb, ccc, ddd, eee, aaa, block[ 6], 5);
|
||||
GGG(aaa, bbb, ccc, ddd, eee, block[ 4], 8);
|
||||
GGG(eee, aaa, bbb, ccc, ddd, block[ 1], 11);
|
||||
GGG(ddd, eee, aaa, bbb, ccc, block[ 3], 14);
|
||||
GGG(ccc, ddd, eee, aaa, bbb, block[11], 14);
|
||||
GGG(bbb, ccc, ddd, eee, aaa, block[15], 6);
|
||||
GGG(aaa, bbb, ccc, ddd, eee, block[ 0], 14);
|
||||
GGG(eee, aaa, bbb, ccc, ddd, block[ 5], 6);
|
||||
GGG(ddd, eee, aaa, bbb, ccc, block[12], 9);
|
||||
GGG(ccc, ddd, eee, aaa, bbb, block[ 2], 12);
|
||||
GGG(bbb, ccc, ddd, eee, aaa, block[13], 9);
|
||||
GGG(aaa, bbb, ccc, ddd, eee, block[ 9], 12);
|
||||
GGG(eee, aaa, bbb, ccc, ddd, block[ 7], 5);
|
||||
GGG(ddd, eee, aaa, bbb, ccc, block[10], 15);
|
||||
GGG(ccc, ddd, eee, aaa, bbb, block[14], 8);
|
||||
/* parallel round 4 */
|
||||
GGG(ccc, ddd, eee, aaa, bbb, block[ 8], 15);
|
||||
GGG(bbb, ccc, ddd, eee, aaa, block[ 6], 5);
|
||||
GGG(aaa, bbb, ccc, ddd, eee, block[ 4], 8);
|
||||
GGG(eee, aaa, bbb, ccc, ddd, block[ 1], 11);
|
||||
GGG(ddd, eee, aaa, bbb, ccc, block[ 3], 14);
|
||||
GGG(ccc, ddd, eee, aaa, bbb, block[11], 14);
|
||||
GGG(bbb, ccc, ddd, eee, aaa, block[15], 6);
|
||||
GGG(aaa, bbb, ccc, ddd, eee, block[ 0], 14);
|
||||
GGG(eee, aaa, bbb, ccc, ddd, block[ 5], 6);
|
||||
GGG(ddd, eee, aaa, bbb, ccc, block[12], 9);
|
||||
GGG(ccc, ddd, eee, aaa, bbb, block[ 2], 12);
|
||||
GGG(bbb, ccc, ddd, eee, aaa, block[13], 9);
|
||||
GGG(aaa, bbb, ccc, ddd, eee, block[ 9], 12);
|
||||
GGG(eee, aaa, bbb, ccc, ddd, block[ 7], 5);
|
||||
GGG(ddd, eee, aaa, bbb, ccc, block[10], 15);
|
||||
GGG(ccc, ddd, eee, aaa, bbb, block[14], 8);
|
||||
|
||||
/* parallel round 5 */
|
||||
FFF(bbb, ccc, ddd, eee, aaa, block[12] , 8);
|
||||
FFF(aaa, bbb, ccc, ddd, eee, block[15] , 5);
|
||||
FFF(eee, aaa, bbb, ccc, ddd, block[10] , 12);
|
||||
FFF(ddd, eee, aaa, bbb, ccc, block[ 4] , 9);
|
||||
FFF(ccc, ddd, eee, aaa, bbb, block[ 1] , 12);
|
||||
FFF(bbb, ccc, ddd, eee, aaa, block[ 5] , 5);
|
||||
FFF(aaa, bbb, ccc, ddd, eee, block[ 8] , 14);
|
||||
FFF(eee, aaa, bbb, ccc, ddd, block[ 7] , 6);
|
||||
FFF(ddd, eee, aaa, bbb, ccc, block[ 6] , 8);
|
||||
FFF(ccc, ddd, eee, aaa, bbb, block[ 2] , 13);
|
||||
FFF(bbb, ccc, ddd, eee, aaa, block[13] , 6);
|
||||
FFF(aaa, bbb, ccc, ddd, eee, block[14] , 5);
|
||||
FFF(eee, aaa, bbb, ccc, ddd, block[ 0] , 15);
|
||||
FFF(ddd, eee, aaa, bbb, ccc, block[ 3] , 13);
|
||||
FFF(ccc, ddd, eee, aaa, bbb, block[ 9] , 11);
|
||||
FFF(bbb, ccc, ddd, eee, aaa, block[11] , 11);
|
||||
/* parallel round 5 */
|
||||
FFF(bbb, ccc, ddd, eee, aaa, block[12] , 8);
|
||||
FFF(aaa, bbb, ccc, ddd, eee, block[15] , 5);
|
||||
FFF(eee, aaa, bbb, ccc, ddd, block[10] , 12);
|
||||
FFF(ddd, eee, aaa, bbb, ccc, block[ 4] , 9);
|
||||
FFF(ccc, ddd, eee, aaa, bbb, block[ 1] , 12);
|
||||
FFF(bbb, ccc, ddd, eee, aaa, block[ 5] , 5);
|
||||
FFF(aaa, bbb, ccc, ddd, eee, block[ 8] , 14);
|
||||
FFF(eee, aaa, bbb, ccc, ddd, block[ 7] , 6);
|
||||
FFF(ddd, eee, aaa, bbb, ccc, block[ 6] , 8);
|
||||
FFF(ccc, ddd, eee, aaa, bbb, block[ 2] , 13);
|
||||
FFF(bbb, ccc, ddd, eee, aaa, block[13] , 6);
|
||||
FFF(aaa, bbb, ccc, ddd, eee, block[14] , 5);
|
||||
FFF(eee, aaa, bbb, ccc, ddd, block[ 0] , 15);
|
||||
FFF(ddd, eee, aaa, bbb, ccc, block[ 3] , 13);
|
||||
FFF(ccc, ddd, eee, aaa, bbb, block[ 9] , 11);
|
||||
FFF(bbb, ccc, ddd, eee, aaa, block[11] , 11);
|
||||
|
||||
/* combine results */
|
||||
ddd += cc + state[1]; /* final result for state[0] */
|
||||
state[1] = state[2] + dd + eee;
|
||||
state[2] = state[3] + ee + aaa;
|
||||
state[3] = state[4] + aa + bbb;
|
||||
state[4] = state[0] + bb + ccc;
|
||||
state[0] = ddd;
|
||||
/* combine results */
|
||||
ddd += cc + state[1]; /* final result for state[0] */
|
||||
state[1] = state[2] + dd + eee;
|
||||
state[2] = state[3] + ee + aaa;
|
||||
state[3] = state[4] + aa + bbb;
|
||||
state[4] = state[0] + bb + ccc;
|
||||
state[0] = ddd;
|
||||
}
|
||||
|
||||
/********************************************************************/
|
||||
@ -352,26 +352,26 @@ RMD160_Transform(uint32_t state[5], const uint32_t block[16])
|
||||
void
|
||||
RMD160_Update(RMD160_CTX *context, const uint8_t *data, size_t nbytes)
|
||||
{
|
||||
uint32_t X[16];
|
||||
uint32_t ofs = 0;
|
||||
uint32_t i;
|
||||
uint32_t X[16];
|
||||
uint32_t ofs = 0;
|
||||
uint32_t i;
|
||||
#ifdef WORDS_BIGENDIAN
|
||||
uint32_t j;
|
||||
uint32_t j;
|
||||
#endif
|
||||
|
||||
_DIAGASSERT(context != NULL);
|
||||
_DIAGASSERT(data != NULL);
|
||||
_DIAGASSERT(context != NULL);
|
||||
_DIAGASSERT(data != NULL);
|
||||
|
||||
/* update length[] */
|
||||
/* update length[] */
|
||||
#if SIZEOF_SIZE_T * CHAR_BIT > 32
|
||||
context->length[1] += (uint32_t)((context->length[0] + nbytes) >> 32);
|
||||
context->length[1] += (uint32_t)((context->length[0] + nbytes) >> 32);
|
||||
#else
|
||||
if (context->length[0] + nbytes < context->length[0])
|
||||
context->length[1]++; /* overflow to msb of length */
|
||||
if (context->length[0] + nbytes < context->length[0])
|
||||
context->length[1]++; /* overflow to msb of length */
|
||||
#endif
|
||||
context->length[0] += (uint32_t)nbytes;
|
||||
context->length[0] += (uint32_t)nbytes;
|
||||
|
||||
(void)memset(X, 0, sizeof(X));
|
||||
(void)memset(X, 0, sizeof(X));
|
||||
|
||||
if ( context->buflen + nbytes < 64 )
|
||||
{
|
||||
@ -416,48 +416,48 @@ RMD160_Update(RMD160_CTX *context, const uint8_t *data, size_t nbytes)
|
||||
int
|
||||
RMD160_Finish(RMD160_CTX *context, uint8_t digest[20])
|
||||
{
|
||||
uint32_t i;
|
||||
uint32_t X[16];
|
||||
uint32_t i;
|
||||
uint32_t X[16];
|
||||
#ifdef WORDS_BIGENDIAN
|
||||
uint32_t j;
|
||||
uint32_t j;
|
||||
#endif
|
||||
|
||||
_DIAGASSERT(digest != NULL);
|
||||
_DIAGASSERT(context != NULL);
|
||||
_DIAGASSERT(digest != NULL);
|
||||
_DIAGASSERT(context != NULL);
|
||||
|
||||
/* append the bit m_n == 1 */
|
||||
context->bbuffer[context->buflen] = (uint8_t)'\200';
|
||||
/* append the bit m_n == 1 */
|
||||
context->bbuffer[context->buflen] = (uint8_t)'\200';
|
||||
|
||||
(void)memset(context->bbuffer + context->buflen + 1, 0,
|
||||
63 - context->buflen);
|
||||
(void)memset(context->bbuffer + context->buflen + 1, 0,
|
||||
63 - context->buflen);
|
||||
#ifndef WORDS_BIGENDIAN
|
||||
(void)memcpy(X, context->bbuffer, sizeof(X));
|
||||
(void)memcpy(X, context->bbuffer, sizeof(X));
|
||||
#else
|
||||
for (j=0; j < 16; j++)
|
||||
X[j] = BYTES_TO_DWORD(context->bbuffer + (4 * j));
|
||||
for (j=0; j < 16; j++)
|
||||
X[j] = BYTES_TO_DWORD(context->bbuffer + (4 * j));
|
||||
#endif
|
||||
if ((context->buflen) > 55) {
|
||||
/* length goes to next block */
|
||||
RMD160_Transform(context->state, X);
|
||||
(void)memset(X, 0, sizeof(X));
|
||||
}
|
||||
if ((context->buflen) > 55) {
|
||||
/* length goes to next block */
|
||||
RMD160_Transform(context->state, X);
|
||||
(void)memset(X, 0, sizeof(X));
|
||||
}
|
||||
|
||||
/* append length in bits */
|
||||
X[14] = context->length[0] << 3;
|
||||
X[15] = (context->length[0] >> 29) |
|
||||
(context->length[1] << 3);
|
||||
RMD160_Transform(context->state, X);
|
||||
/* append length in bits */
|
||||
X[14] = context->length[0] << 3;
|
||||
X[15] = (context->length[0] >> 29) |
|
||||
(context->length[1] << 3);
|
||||
RMD160_Transform(context->state, X);
|
||||
|
||||
if (digest != NULL) {
|
||||
for (i = 0; i < 20; i += 4) {
|
||||
/* extracts the 8 least significant bits. */
|
||||
digest[i] = context->state[i>>2];
|
||||
digest[i + 1] = (context->state[i>>2] >> 8);
|
||||
digest[i + 2] = (context->state[i>>2] >> 16);
|
||||
digest[i + 3] = (context->state[i>>2] >> 24);
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
if (digest != NULL) {
|
||||
for (i = 0; i < 20; i += 4) {
|
||||
/* extracts the 8 least significant bits. */
|
||||
digest[i] = context->state[i>>2];
|
||||
digest[i + 1] = (context->state[i>>2] >> 8);
|
||||
digest[i + 2] = (context->state[i>>2] >> 16);
|
||||
digest[i + 3] = (context->state[i>>2] >> 24);
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
/************************ end of file rmd160.c **********************/
|
||||
|
@ -29,10 +29,10 @@
|
||||
#include "../defs.h"
|
||||
|
||||
typedef struct {
|
||||
uint32_t state[5]; /* state (ABCDE) */
|
||||
uint32_t length[2]; /* number of bits */
|
||||
uint8_t bbuffer[64]; /* overflow buffer */
|
||||
uint32_t buflen; /* number of chars in bbuffer */
|
||||
uint32_t state[5]; /* state (ABCDE) */
|
||||
uint32_t length[2]; /* number of bits */
|
||||
uint8_t bbuffer[64]; /* overflow buffer */
|
||||
uint32_t buflen; /* number of chars in bbuffer */
|
||||
} RMD160_CTX;
|
||||
|
||||
#ifdef RUBY
|
||||
|
@ -227,16 +227,16 @@ void SHA1_Update(SHA1_CTX *context, const uint8_t *data, size_t len)
|
||||
|
||||
j = context->count[0];
|
||||
if ((context->count[0] += len << 3) < j)
|
||||
context->count[1] += (len>>29)+1;
|
||||
context->count[1] += (len>>29)+1;
|
||||
j = (j >> 3) & 63;
|
||||
if ((j + len) > 63) {
|
||||
(void)memcpy(&context->buffer[j], data, (i = 64-j));
|
||||
SHA1_Transform(context->state, context->buffer);
|
||||
for ( ; i + 63 < len; i += 64)
|
||||
SHA1_Transform(context->state, &data[i]);
|
||||
j = 0;
|
||||
(void)memcpy(&context->buffer[j], data, (i = 64-j));
|
||||
SHA1_Transform(context->state, context->buffer);
|
||||
for ( ; i + 63 < len; i += 64)
|
||||
SHA1_Transform(context->state, &data[i]);
|
||||
j = 0;
|
||||
} else {
|
||||
i = 0;
|
||||
i = 0;
|
||||
}
|
||||
(void)memcpy(&context->buffer[j], &data[i], len - i);
|
||||
}
|
||||
@ -254,18 +254,18 @@ int SHA1_Finish(SHA1_CTX* context, uint8_t digest[20])
|
||||
_DIAGASSERT(context != 0);
|
||||
|
||||
for (i = 0; i < 8; i++) {
|
||||
finalcount[i] = (uint8_t)((context->count[(i >= 4 ? 0 : 1)]
|
||||
>> ((3-(i & 3)) * 8) ) & 255); /* Endian independent */
|
||||
finalcount[i] = (uint8_t)((context->count[(i >= 4 ? 0 : 1)]
|
||||
>> ((3-(i & 3)) * 8) ) & 255); /* Endian independent */
|
||||
}
|
||||
SHA1_Update(context, (const uint8_t *)"\200", 1);
|
||||
while ((context->count[0] & 504) != 448)
|
||||
SHA1_Update(context, (const uint8_t *)"\0", 1);
|
||||
SHA1_Update(context, (const uint8_t *)"\0", 1);
|
||||
SHA1_Update(context, finalcount, 8); /* Should cause a SHA1_Transform() */
|
||||
|
||||
if (digest) {
|
||||
for (i = 0; i < 20; i++)
|
||||
digest[i] = (uint8_t)
|
||||
((context->state[i>>2] >> ((3-(i & 3)) * 8) ) & 255);
|
||||
for (i = 0; i < 20; i++)
|
||||
digest[i] = (uint8_t)
|
||||
((context->state[i>>2] >> ((3-(i & 3)) * 8) ) & 255);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
@ -14,9 +14,9 @@
|
||||
#include "../defs.h"
|
||||
|
||||
typedef struct {
|
||||
uint32_t state[5];
|
||||
uint32_t count[2];
|
||||
uint8_t buffer[64];
|
||||
uint32_t state[5];
|
||||
uint32_t count[2];
|
||||
uint8_t buffer[64];
|
||||
} SHA1_CTX;
|
||||
|
||||
#ifdef RUBY
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -120,14 +120,14 @@ typedef unsigned long long uint64_t; /* 8-bytes (64-bits) */
|
||||
* cc -DSHA2_USE_INTTYPES_H ...
|
||||
*/
|
||||
typedef struct _SHA256_CTX {
|
||||
uint32_t state[8];
|
||||
uint64_t bitcount;
|
||||
uint8_t buffer[SHA256_BLOCK_LENGTH];
|
||||
uint32_t state[8];
|
||||
uint64_t bitcount;
|
||||
uint8_t buffer[SHA256_BLOCK_LENGTH];
|
||||
} SHA256_CTX;
|
||||
typedef struct _SHA512_CTX {
|
||||
uint64_t state[8];
|
||||
uint64_t bitcount[2];
|
||||
uint8_t buffer[SHA512_BLOCK_LENGTH];
|
||||
uint64_t state[8];
|
||||
uint64_t bitcount[2];
|
||||
uint8_t buffer[SHA512_BLOCK_LENGTH];
|
||||
} SHA512_CTX;
|
||||
|
||||
typedef SHA512_CTX SHA384_CTX;
|
||||
|
@ -47,7 +47,7 @@ Init_sha2(void)
|
||||
cDigest_SHA##bitlen = rb_define_class_under(mDigest, "SHA" #bitlen, cDigest_Base); \
|
||||
\
|
||||
rb_ivar_set(cDigest_SHA##bitlen, id_metadata, \
|
||||
rb_digest_make_metadata(&sha##bitlen));
|
||||
rb_digest_make_metadata(&sha##bitlen));
|
||||
|
||||
FOREACH_BITLEN(DEFINE_ALGO_CLASS)
|
||||
}
|
||||
|
@ -42,7 +42,7 @@ rb_io_nonblock_p(VALUE io)
|
||||
rb_io_t *fptr;
|
||||
GetOpenFile(io, fptr);
|
||||
if (get_fcntl_flags(fptr->fd) & O_NONBLOCK)
|
||||
return Qtrue;
|
||||
return Qtrue;
|
||||
return Qfalse;
|
||||
}
|
||||
#else
|
||||
@ -54,21 +54,21 @@ static void
|
||||
set_fcntl_flags(int fd, int f)
|
||||
{
|
||||
if (fcntl(fd, F_SETFL, f) == -1)
|
||||
rb_sys_fail(0);
|
||||
rb_sys_fail(0);
|
||||
}
|
||||
|
||||
static int
|
||||
io_nonblock_set(int fd, int f, int nb)
|
||||
{
|
||||
if (nb) {
|
||||
if ((f & O_NONBLOCK) != 0)
|
||||
return 0;
|
||||
f |= O_NONBLOCK;
|
||||
if ((f & O_NONBLOCK) != 0)
|
||||
return 0;
|
||||
f |= O_NONBLOCK;
|
||||
}
|
||||
else {
|
||||
if ((f & O_NONBLOCK) == 0)
|
||||
return 0;
|
||||
f &= ~O_NONBLOCK;
|
||||
if ((f & O_NONBLOCK) == 0)
|
||||
return 0;
|
||||
f &= ~O_NONBLOCK;
|
||||
}
|
||||
set_fcntl_flags(fd, f);
|
||||
return 1;
|
||||
@ -127,9 +127,9 @@ rb_io_nonblock_set(VALUE io, VALUE nb)
|
||||
rb_io_t *fptr;
|
||||
GetOpenFile(io, fptr);
|
||||
if (RTEST(nb))
|
||||
rb_io_set_nonblock(fptr);
|
||||
rb_io_set_nonblock(fptr);
|
||||
else
|
||||
io_nonblock_set(fptr->fd, get_fcntl_flags(fptr->fd), RTEST(nb));
|
||||
io_nonblock_set(fptr->fd, get_fcntl_flags(fptr->fd), RTEST(nb));
|
||||
return io;
|
||||
}
|
||||
|
||||
@ -160,15 +160,15 @@ rb_io_nonblock_block(int argc, VALUE *argv, VALUE io)
|
||||
|
||||
GetOpenFile(io, fptr);
|
||||
if (argc > 0) {
|
||||
VALUE v;
|
||||
rb_scan_args(argc, argv, "01", &v);
|
||||
nb = RTEST(v);
|
||||
VALUE v;
|
||||
rb_scan_args(argc, argv, "01", &v);
|
||||
nb = RTEST(v);
|
||||
}
|
||||
f = get_fcntl_flags(fptr->fd);
|
||||
restore[0] = fptr->fd;
|
||||
restore[1] = f;
|
||||
if (!io_nonblock_set(fptr->fd, f, nb))
|
||||
return rb_yield(io);
|
||||
return rb_yield(io);
|
||||
return rb_ensure(rb_yield, io, io_nonblock_restore, (VALUE)restore);
|
||||
}
|
||||
#else
|
||||
|
@ -47,11 +47,11 @@ get_timeout(int argc, VALUE *argv, struct timeval *timerec)
|
||||
VALUE timeout = Qnil;
|
||||
rb_check_arity(argc, 0, 1);
|
||||
if (!argc || NIL_P(timeout = argv[0])) {
|
||||
return NULL;
|
||||
return NULL;
|
||||
}
|
||||
else {
|
||||
*timerec = rb_time_interval(timeout);
|
||||
return timerec;
|
||||
*timerec = rb_time_interval(timeout);
|
||||
return timerec;
|
||||
}
|
||||
}
|
||||
|
||||
@ -60,7 +60,7 @@ wait_for_single_fd(rb_io_t *fptr, int events, struct timeval *tv)
|
||||
{
|
||||
int i = rb_wait_for_single_fd(fptr->fd, events, tv);
|
||||
if (i < 0)
|
||||
rb_sys_fail(0);
|
||||
rb_sys_fail(0);
|
||||
rb_io_check_closed(fptr);
|
||||
return (i & events);
|
||||
}
|
||||
@ -180,7 +180,7 @@ io_wait_readable(int argc, VALUE *argv, VALUE io)
|
||||
|
||||
#ifndef HAVE_RB_IO_WAIT
|
||||
if (wait_for_single_fd(fptr, RB_WAITFD_IN, tv)) {
|
||||
return io;
|
||||
return io;
|
||||
}
|
||||
return Qnil;
|
||||
#else
|
||||
@ -216,7 +216,7 @@ io_wait_writable(int argc, VALUE *argv, VALUE io)
|
||||
#ifndef HAVE_RB_IO_WAIT
|
||||
tv = get_timeout(argc, argv, &timerec);
|
||||
if (wait_for_single_fd(fptr, RB_WAITFD_OUT, tv)) {
|
||||
return io;
|
||||
return io;
|
||||
}
|
||||
return Qnil;
|
||||
#else
|
||||
@ -260,31 +260,31 @@ static int
|
||||
wait_mode_sym(VALUE mode)
|
||||
{
|
||||
if (mode == ID2SYM(rb_intern("r"))) {
|
||||
return RB_WAITFD_IN;
|
||||
return RB_WAITFD_IN;
|
||||
}
|
||||
if (mode == ID2SYM(rb_intern("read"))) {
|
||||
return RB_WAITFD_IN;
|
||||
return RB_WAITFD_IN;
|
||||
}
|
||||
if (mode == ID2SYM(rb_intern("readable"))) {
|
||||
return RB_WAITFD_IN;
|
||||
return RB_WAITFD_IN;
|
||||
}
|
||||
if (mode == ID2SYM(rb_intern("w"))) {
|
||||
return RB_WAITFD_OUT;
|
||||
return RB_WAITFD_OUT;
|
||||
}
|
||||
if (mode == ID2SYM(rb_intern("write"))) {
|
||||
return RB_WAITFD_OUT;
|
||||
return RB_WAITFD_OUT;
|
||||
}
|
||||
if (mode == ID2SYM(rb_intern("writable"))) {
|
||||
return RB_WAITFD_OUT;
|
||||
return RB_WAITFD_OUT;
|
||||
}
|
||||
if (mode == ID2SYM(rb_intern("rw"))) {
|
||||
return RB_WAITFD_IN|RB_WAITFD_OUT;
|
||||
return RB_WAITFD_IN|RB_WAITFD_OUT;
|
||||
}
|
||||
if (mode == ID2SYM(rb_intern("read_write"))) {
|
||||
return RB_WAITFD_IN|RB_WAITFD_OUT;
|
||||
return RB_WAITFD_IN|RB_WAITFD_OUT;
|
||||
}
|
||||
if (mode == ID2SYM(rb_intern("readable_writable"))) {
|
||||
return RB_WAITFD_IN|RB_WAITFD_OUT;
|
||||
return RB_WAITFD_IN|RB_WAITFD_OUT;
|
||||
}
|
||||
rb_raise(rb_eArgError, "unsupported mode: %"PRIsVALUE, mode);
|
||||
return 0;
|
||||
@ -333,20 +333,20 @@ io_wait(int argc, VALUE *argv, VALUE io)
|
||||
|
||||
GetOpenFile(io, fptr);
|
||||
for (i = 0; i < argc; ++i) {
|
||||
if (SYMBOL_P(argv[i])) {
|
||||
event |= wait_mode_sym(argv[i]);
|
||||
}
|
||||
else {
|
||||
*(tv = &timerec) = rb_time_interval(argv[i]);
|
||||
}
|
||||
if (SYMBOL_P(argv[i])) {
|
||||
event |= wait_mode_sym(argv[i]);
|
||||
}
|
||||
else {
|
||||
*(tv = &timerec) = rb_time_interval(argv[i]);
|
||||
}
|
||||
}
|
||||
/* rb_time_interval() and might_mode() might convert the argument */
|
||||
rb_io_check_closed(fptr);
|
||||
if (!event) event = RB_WAITFD_IN;
|
||||
if ((event & RB_WAITFD_IN) && rb_io_read_pending(fptr))
|
||||
return Qtrue;
|
||||
return Qtrue;
|
||||
if (wait_for_single_fd(fptr, event, tv))
|
||||
return io;
|
||||
return io;
|
||||
return Qnil;
|
||||
#else
|
||||
VALUE timeout = Qundef;
|
||||
|
@ -65,11 +65,11 @@ rb_encoding* rb_nkf_enc_get(const char *name)
|
||||
{
|
||||
int idx = rb_enc_find_index(name);
|
||||
if (idx < 0) {
|
||||
nkf_encoding *nkf_enc = nkf_enc_find(name);
|
||||
idx = rb_enc_find_index(nkf_enc_name(nkf_enc_to_base_encoding(nkf_enc)));
|
||||
if (idx < 0) {
|
||||
idx = rb_define_dummy_encoding(name);
|
||||
}
|
||||
nkf_encoding *nkf_enc = nkf_enc_find(name);
|
||||
idx = rb_enc_find_index(nkf_enc_name(nkf_enc_to_base_encoding(nkf_enc)));
|
||||
if (idx < 0) {
|
||||
idx = rb_define_dummy_encoding(name);
|
||||
}
|
||||
}
|
||||
return rb_enc_from_index(idx);
|
||||
}
|
||||
@ -83,40 +83,40 @@ int nkf_split_options(const char *arg)
|
||||
int is_single_quoted = FALSE;
|
||||
int is_double_quoted = FALSE;
|
||||
for(i = 0; arg[i]; i++){
|
||||
if(j == 255){
|
||||
return -1;
|
||||
}else if(is_single_quoted){
|
||||
if(arg[i] == '\''){
|
||||
is_single_quoted = FALSE;
|
||||
}else{
|
||||
option[j++] = arg[i];
|
||||
}
|
||||
}else if(is_escaped){
|
||||
is_escaped = FALSE;
|
||||
option[j++] = arg[i];
|
||||
}else if(arg[i] == '\\'){
|
||||
is_escaped = TRUE;
|
||||
}else if(is_double_quoted){
|
||||
if(arg[i] == '"'){
|
||||
is_double_quoted = FALSE;
|
||||
}else{
|
||||
option[j++] = arg[i];
|
||||
}
|
||||
}else if(arg[i] == '\''){
|
||||
is_single_quoted = TRUE;
|
||||
}else if(arg[i] == '"'){
|
||||
is_double_quoted = TRUE;
|
||||
}else if(arg[i] == ' '){
|
||||
option[j] = '\0';
|
||||
options(option);
|
||||
j = 0;
|
||||
}else{
|
||||
option[j++] = arg[i];
|
||||
}
|
||||
if(j == 255){
|
||||
return -1;
|
||||
}else if(is_single_quoted){
|
||||
if(arg[i] == '\''){
|
||||
is_single_quoted = FALSE;
|
||||
}else{
|
||||
option[j++] = arg[i];
|
||||
}
|
||||
}else if(is_escaped){
|
||||
is_escaped = FALSE;
|
||||
option[j++] = arg[i];
|
||||
}else if(arg[i] == '\\'){
|
||||
is_escaped = TRUE;
|
||||
}else if(is_double_quoted){
|
||||
if(arg[i] == '"'){
|
||||
is_double_quoted = FALSE;
|
||||
}else{
|
||||
option[j++] = arg[i];
|
||||
}
|
||||
}else if(arg[i] == '\''){
|
||||
is_single_quoted = TRUE;
|
||||
}else if(arg[i] == '"'){
|
||||
is_double_quoted = TRUE;
|
||||
}else if(arg[i] == ' '){
|
||||
option[j] = '\0';
|
||||
options(option);
|
||||
j = 0;
|
||||
}else{
|
||||
option[j++] = arg[i];
|
||||
}
|
||||
}
|
||||
if(j){
|
||||
option[j] = '\0';
|
||||
options(option);
|
||||
option[j] = '\0';
|
||||
options(option);
|
||||
}
|
||||
return count;
|
||||
}
|
||||
@ -170,9 +170,9 @@ rb_nkf_convert(VALUE obj, VALUE opt, VALUE src)
|
||||
rb_str_set_len(tmp, output_ctr);
|
||||
|
||||
if (mimeout_f)
|
||||
rb_enc_associate(tmp, rb_usascii_encoding());
|
||||
rb_enc_associate(tmp, rb_usascii_encoding());
|
||||
else
|
||||
rb_enc_associate(tmp, rb_nkf_enc_get(nkf_enc_name(output_encoding)));
|
||||
rb_enc_associate(tmp, rb_nkf_enc_get(nkf_enc_name(output_encoding)));
|
||||
|
||||
return tmp;
|
||||
}
|
||||
|
@ -31,24 +31,24 @@ static const char *
|
||||
make_unique_str(st_table *tbl, const char *str, long len)
|
||||
{
|
||||
if (!str) {
|
||||
return NULL;
|
||||
return NULL;
|
||||
}
|
||||
else {
|
||||
st_data_t n;
|
||||
char *result;
|
||||
st_data_t n;
|
||||
char *result;
|
||||
|
||||
if (st_lookup(tbl, (st_data_t)str, &n)) {
|
||||
st_insert(tbl, (st_data_t)str, n+1);
|
||||
st_get_key(tbl, (st_data_t)str, &n);
|
||||
result = (char *)n;
|
||||
}
|
||||
else {
|
||||
result = (char *)ruby_xmalloc(len+1);
|
||||
strncpy(result, str, len);
|
||||
result[len] = 0;
|
||||
st_add_direct(tbl, (st_data_t)result, 1);
|
||||
}
|
||||
return result;
|
||||
if (st_lookup(tbl, (st_data_t)str, &n)) {
|
||||
st_insert(tbl, (st_data_t)str, n+1);
|
||||
st_get_key(tbl, (st_data_t)str, &n);
|
||||
result = (char *)n;
|
||||
}
|
||||
else {
|
||||
result = (char *)ruby_xmalloc(len+1);
|
||||
strncpy(result, str, len);
|
||||
result[len] = 0;
|
||||
st_add_direct(tbl, (st_data_t)result, 1);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
@ -56,17 +56,17 @@ static void
|
||||
delete_unique_str(st_table *tbl, const char *str)
|
||||
{
|
||||
if (str) {
|
||||
st_data_t n;
|
||||
st_data_t n;
|
||||
|
||||
st_lookup(tbl, (st_data_t)str, &n);
|
||||
if (n == 1) {
|
||||
n = (st_data_t)str;
|
||||
st_delete(tbl, &n, 0);
|
||||
ruby_xfree((char *)n);
|
||||
}
|
||||
else {
|
||||
st_insert(tbl, (st_data_t)str, n-1);
|
||||
}
|
||||
st_lookup(tbl, (st_data_t)str, &n);
|
||||
if (n == 1) {
|
||||
n = (st_data_t)str;
|
||||
st_delete(tbl, &n, 0);
|
||||
ruby_xfree((char *)n);
|
||||
}
|
||||
else {
|
||||
st_insert(tbl, (st_data_t)str, n-1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -87,18 +87,18 @@ newobj_i(VALUE tpval, void *data)
|
||||
st_data_t v;
|
||||
|
||||
if (st_lookup(arg->object_table, (st_data_t)obj, &v)) {
|
||||
info = (struct allocation_info *)v;
|
||||
if (arg->keep_remains) {
|
||||
if (info->living) {
|
||||
/* do nothing. there is possibility to keep living if FREEOBJ events while suppressing tracing */
|
||||
}
|
||||
}
|
||||
/* reuse info */
|
||||
delete_unique_str(arg->str_table, info->path);
|
||||
delete_unique_str(arg->str_table, info->class_path);
|
||||
info = (struct allocation_info *)v;
|
||||
if (arg->keep_remains) {
|
||||
if (info->living) {
|
||||
/* do nothing. there is possibility to keep living if FREEOBJ events while suppressing tracing */
|
||||
}
|
||||
}
|
||||
/* reuse info */
|
||||
delete_unique_str(arg->str_table, info->path);
|
||||
delete_unique_str(arg->str_table, info->class_path);
|
||||
}
|
||||
else {
|
||||
info = (struct allocation_info *)ruby_xmalloc(sizeof(struct allocation_info));
|
||||
info = (struct allocation_info *)ruby_xmalloc(sizeof(struct allocation_info));
|
||||
}
|
||||
info->living = 1;
|
||||
info->flags = RBASIC(obj)->flags;
|
||||
@ -122,18 +122,18 @@ freeobj_i(VALUE tpval, void *data)
|
||||
struct allocation_info *info;
|
||||
|
||||
if (arg->keep_remains) {
|
||||
if (st_lookup(arg->object_table, obj, &v)) {
|
||||
info = (struct allocation_info *)v;
|
||||
info->living = 0;
|
||||
}
|
||||
if (st_lookup(arg->object_table, obj, &v)) {
|
||||
info = (struct allocation_info *)v;
|
||||
info->living = 0;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (st_delete(arg->object_table, &obj, &v)) {
|
||||
info = (struct allocation_info *)v;
|
||||
delete_unique_str(arg->str_table, info->path);
|
||||
delete_unique_str(arg->str_table, info->class_path);
|
||||
ruby_xfree(info);
|
||||
}
|
||||
if (st_delete(arg->object_table, &obj, &v)) {
|
||||
info = (struct allocation_info *)v;
|
||||
delete_unique_str(arg->str_table, info->path);
|
||||
delete_unique_str(arg->str_table, info->class_path);
|
||||
ruby_xfree(info);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -236,12 +236,12 @@ get_traceobj_arg(void)
|
||||
VALUE obj = TypedData_Make_Struct(rb_cObject, struct traceobj_arg, &allocation_info_tracer_type, tmp_trace_arg);
|
||||
traceobj_arg = obj;
|
||||
rb_gc_register_mark_object(traceobj_arg);
|
||||
tmp_trace_arg->running = 0;
|
||||
tmp_trace_arg->keep_remains = tmp_keep_remains;
|
||||
tmp_trace_arg->newobj_trace = 0;
|
||||
tmp_trace_arg->freeobj_trace = 0;
|
||||
tmp_trace_arg->object_table = st_init_numtable();
|
||||
tmp_trace_arg->str_table = st_init_strtable();
|
||||
tmp_trace_arg->running = 0;
|
||||
tmp_trace_arg->keep_remains = tmp_keep_remains;
|
||||
tmp_trace_arg->newobj_trace = 0;
|
||||
tmp_trace_arg->freeobj_trace = 0;
|
||||
tmp_trace_arg->object_table = st_init_numtable();
|
||||
tmp_trace_arg->str_table = st_init_strtable();
|
||||
}
|
||||
return tmp_trace_arg;
|
||||
}
|
||||
@ -258,15 +258,15 @@ trace_object_allocations_start(VALUE self)
|
||||
struct traceobj_arg *arg = get_traceobj_arg();
|
||||
|
||||
if (arg->running++ > 0) {
|
||||
/* do nothing */
|
||||
/* do nothing */
|
||||
}
|
||||
else {
|
||||
if (arg->newobj_trace == 0) {
|
||||
arg->newobj_trace = rb_tracepoint_new(0, RUBY_INTERNAL_EVENT_NEWOBJ, newobj_i, arg);
|
||||
arg->freeobj_trace = rb_tracepoint_new(0, RUBY_INTERNAL_EVENT_FREEOBJ, freeobj_i, arg);
|
||||
}
|
||||
rb_tracepoint_enable(arg->newobj_trace);
|
||||
rb_tracepoint_enable(arg->freeobj_trace);
|
||||
if (arg->newobj_trace == 0) {
|
||||
arg->newobj_trace = rb_tracepoint_new(0, RUBY_INTERNAL_EVENT_NEWOBJ, newobj_i, arg);
|
||||
arg->freeobj_trace = rb_tracepoint_new(0, RUBY_INTERNAL_EVENT_FREEOBJ, freeobj_i, arg);
|
||||
}
|
||||
rb_tracepoint_enable(arg->newobj_trace);
|
||||
rb_tracepoint_enable(arg->freeobj_trace);
|
||||
}
|
||||
|
||||
return Qnil;
|
||||
@ -287,7 +287,7 @@ trace_object_allocations_stop(VALUE self)
|
||||
struct traceobj_arg *arg = get_traceobj_arg();
|
||||
|
||||
if (arg->running > 0) {
|
||||
arg->running--;
|
||||
arg->running--;
|
||||
}
|
||||
|
||||
if (arg->running == 0) {
|
||||
@ -374,8 +374,8 @@ object_allocations_reporter_i(st_data_t key, st_data_t val, st_data_t ptr)
|
||||
else fprintf(out, "C: %p", (void *)info->klass);
|
||||
fprintf(out, "@%s:%lu", info->path ? info->path : "", info->line);
|
||||
if (!NIL_P(info->mid)) {
|
||||
VALUE m = rb_sym2str(info->mid);
|
||||
fprintf(out, " (%s)", RSTRING_PTR(m));
|
||||
VALUE m = rb_sym2str(info->mid);
|
||||
fprintf(out, " (%s)", RSTRING_PTR(m));
|
||||
}
|
||||
fprintf(out, ")\n");
|
||||
|
||||
@ -387,7 +387,7 @@ object_allocations_reporter(FILE *out, void *ptr)
|
||||
{
|
||||
fprintf(out, "== object_allocations_reporter: START\n");
|
||||
if (tmp_trace_arg) {
|
||||
st_foreach(tmp_trace_arg->object_table, object_allocations_reporter_i, (st_data_t)out);
|
||||
st_foreach(tmp_trace_arg->object_table, object_allocations_reporter_i, (st_data_t)out);
|
||||
}
|
||||
fprintf(out, "== object_allocations_reporter: END\n");
|
||||
}
|
||||
@ -397,8 +397,8 @@ trace_object_allocations_debug_start(VALUE self)
|
||||
{
|
||||
tmp_keep_remains = 1;
|
||||
if (object_allocations_reporter_registered == 0) {
|
||||
object_allocations_reporter_registered = 1;
|
||||
rb_bug_reporter_add(object_allocations_reporter, 0);
|
||||
object_allocations_reporter_registered = 1;
|
||||
rb_bug_reporter_add(object_allocations_reporter, 0);
|
||||
}
|
||||
|
||||
return trace_object_allocations_start(self);
|
||||
@ -408,10 +408,10 @@ static struct allocation_info *
|
||||
lookup_allocation_info(VALUE obj)
|
||||
{
|
||||
if (tmp_trace_arg) {
|
||||
st_data_t info;
|
||||
if (st_lookup(tmp_trace_arg->object_table, obj, &info)) {
|
||||
return (struct allocation_info *)info;
|
||||
}
|
||||
st_data_t info;
|
||||
if (st_lookup(tmp_trace_arg->object_table, obj, &info)) {
|
||||
return (struct allocation_info *)info;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
@ -435,10 +435,10 @@ allocation_sourcefile(VALUE self, VALUE obj)
|
||||
struct allocation_info *info = lookup_allocation_info(obj);
|
||||
|
||||
if (info && info->path) {
|
||||
return rb_str_new2(info->path);
|
||||
return rb_str_new2(info->path);
|
||||
}
|
||||
else {
|
||||
return Qnil;
|
||||
return Qnil;
|
||||
}
|
||||
}
|
||||
|
||||
@ -455,10 +455,10 @@ allocation_sourceline(VALUE self, VALUE obj)
|
||||
struct allocation_info *info = lookup_allocation_info(obj);
|
||||
|
||||
if (info) {
|
||||
return INT2FIX(info->line);
|
||||
return INT2FIX(info->line);
|
||||
}
|
||||
else {
|
||||
return Qnil;
|
||||
return Qnil;
|
||||
}
|
||||
}
|
||||
|
||||
@ -486,10 +486,10 @@ allocation_class_path(VALUE self, VALUE obj)
|
||||
struct allocation_info *info = lookup_allocation_info(obj);
|
||||
|
||||
if (info && info->class_path) {
|
||||
return rb_str_new2(info->class_path);
|
||||
return rb_str_new2(info->class_path);
|
||||
}
|
||||
else {
|
||||
return Qnil;
|
||||
return Qnil;
|
||||
}
|
||||
}
|
||||
|
||||
@ -518,10 +518,10 @@ allocation_method_id(VALUE self, VALUE obj)
|
||||
{
|
||||
struct allocation_info *info = lookup_allocation_info(obj);
|
||||
if (info) {
|
||||
return info->mid;
|
||||
return info->mid;
|
||||
}
|
||||
else {
|
||||
return Qnil;
|
||||
return Qnil;
|
||||
}
|
||||
}
|
||||
|
||||
@ -550,10 +550,10 @@ allocation_generation(VALUE self, VALUE obj)
|
||||
{
|
||||
struct allocation_info *info = lookup_allocation_info(obj);
|
||||
if (info) {
|
||||
return SIZET2NUM(info->generation);
|
||||
return SIZET2NUM(info->generation);
|
||||
}
|
||||
else {
|
||||
return Qnil;
|
||||
return Qnil;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -140,7 +140,7 @@ memsize_of_all_m(int argc, VALUE *argv, VALUE self)
|
||||
struct total_data data = {0, 0};
|
||||
|
||||
if (argc > 0) {
|
||||
rb_scan_args(argc, argv, "01", &data.klass);
|
||||
rb_scan_args(argc, argv, "01", &data.klass);
|
||||
}
|
||||
|
||||
each_object_with_flags(total_i, &data);
|
||||
@ -190,33 +190,33 @@ type2sym(enum ruby_value_type i)
|
||||
VALUE type;
|
||||
switch (i) {
|
||||
#define CASE_TYPE(t) case t: type = ID2SYM(rb_intern(#t)); break;
|
||||
CASE_TYPE(T_NONE);
|
||||
CASE_TYPE(T_OBJECT);
|
||||
CASE_TYPE(T_CLASS);
|
||||
CASE_TYPE(T_MODULE);
|
||||
CASE_TYPE(T_FLOAT);
|
||||
CASE_TYPE(T_STRING);
|
||||
CASE_TYPE(T_REGEXP);
|
||||
CASE_TYPE(T_ARRAY);
|
||||
CASE_TYPE(T_HASH);
|
||||
CASE_TYPE(T_STRUCT);
|
||||
CASE_TYPE(T_BIGNUM);
|
||||
CASE_TYPE(T_FILE);
|
||||
CASE_TYPE(T_DATA);
|
||||
CASE_TYPE(T_MATCH);
|
||||
CASE_TYPE(T_COMPLEX);
|
||||
CASE_TYPE(T_RATIONAL);
|
||||
CASE_TYPE(T_NIL);
|
||||
CASE_TYPE(T_TRUE);
|
||||
CASE_TYPE(T_FALSE);
|
||||
CASE_TYPE(T_SYMBOL);
|
||||
CASE_TYPE(T_FIXNUM);
|
||||
CASE_TYPE(T_UNDEF);
|
||||
CASE_TYPE(T_IMEMO);
|
||||
CASE_TYPE(T_NODE);
|
||||
CASE_TYPE(T_ICLASS);
|
||||
CASE_TYPE(T_NONE);
|
||||
CASE_TYPE(T_OBJECT);
|
||||
CASE_TYPE(T_CLASS);
|
||||
CASE_TYPE(T_MODULE);
|
||||
CASE_TYPE(T_FLOAT);
|
||||
CASE_TYPE(T_STRING);
|
||||
CASE_TYPE(T_REGEXP);
|
||||
CASE_TYPE(T_ARRAY);
|
||||
CASE_TYPE(T_HASH);
|
||||
CASE_TYPE(T_STRUCT);
|
||||
CASE_TYPE(T_BIGNUM);
|
||||
CASE_TYPE(T_FILE);
|
||||
CASE_TYPE(T_DATA);
|
||||
CASE_TYPE(T_MATCH);
|
||||
CASE_TYPE(T_COMPLEX);
|
||||
CASE_TYPE(T_RATIONAL);
|
||||
CASE_TYPE(T_NIL);
|
||||
CASE_TYPE(T_TRUE);
|
||||
CASE_TYPE(T_FALSE);
|
||||
CASE_TYPE(T_SYMBOL);
|
||||
CASE_TYPE(T_FIXNUM);
|
||||
CASE_TYPE(T_UNDEF);
|
||||
CASE_TYPE(T_IMEMO);
|
||||
CASE_TYPE(T_NODE);
|
||||
CASE_TYPE(T_ICLASS);
|
||||
CASE_TYPE(T_MOVED);
|
||||
CASE_TYPE(T_ZOMBIE);
|
||||
CASE_TYPE(T_ZOMBIE);
|
||||
#undef CASE_TYPE
|
||||
default: rb_bug("type2sym: unknown type (%d)", i);
|
||||
}
|
||||
@ -255,17 +255,17 @@ count_objects_size(int argc, VALUE *argv, VALUE os)
|
||||
VALUE hash = setup_hash(argc, argv);
|
||||
|
||||
for (i = 0; i <= T_MASK; i++) {
|
||||
counts[i] = 0;
|
||||
counts[i] = 0;
|
||||
}
|
||||
|
||||
each_object_with_flags(cos_i, &counts[0]);
|
||||
|
||||
for (i = 0; i <= T_MASK; i++) {
|
||||
if (counts[i]) {
|
||||
VALUE type = type2sym(i);
|
||||
total += counts[i];
|
||||
rb_hash_aset(hash, type, SIZET2NUM(counts[i]));
|
||||
}
|
||||
if (counts[i]) {
|
||||
VALUE type = type2sym(i);
|
||||
total += counts[i];
|
||||
rb_hash_aset(hash, type, SIZET2NUM(counts[i]));
|
||||
}
|
||||
}
|
||||
rb_hash_aset(hash, ID2SYM(rb_intern("TOTAL")), SIZET2NUM(total));
|
||||
return hash;
|
||||
@ -379,127 +379,127 @@ count_nodes(int argc, VALUE *argv, VALUE os)
|
||||
VALUE hash = setup_hash(argc, argv);
|
||||
|
||||
for (i = 0; i <= NODE_LAST; i++) {
|
||||
nodes[i] = 0;
|
||||
nodes[i] = 0;
|
||||
}
|
||||
|
||||
each_object_with_flags(cn_i, &nodes[0]);
|
||||
|
||||
for (i=0; i<NODE_LAST; i++) {
|
||||
if (nodes[i] != 0) {
|
||||
VALUE node;
|
||||
switch (i) {
|
||||
if (nodes[i] != 0) {
|
||||
VALUE node;
|
||||
switch (i) {
|
||||
#define COUNT_NODE(n) case n: node = ID2SYM(rb_intern(#n)); goto set
|
||||
COUNT_NODE(NODE_SCOPE);
|
||||
COUNT_NODE(NODE_BLOCK);
|
||||
COUNT_NODE(NODE_IF);
|
||||
COUNT_NODE(NODE_UNLESS);
|
||||
COUNT_NODE(NODE_CASE);
|
||||
COUNT_NODE(NODE_CASE2);
|
||||
COUNT_NODE(NODE_CASE3);
|
||||
COUNT_NODE(NODE_WHEN);
|
||||
COUNT_NODE(NODE_IN);
|
||||
COUNT_NODE(NODE_WHILE);
|
||||
COUNT_NODE(NODE_UNTIL);
|
||||
COUNT_NODE(NODE_ITER);
|
||||
COUNT_NODE(NODE_FOR);
|
||||
COUNT_NODE(NODE_FOR_MASGN);
|
||||
COUNT_NODE(NODE_BREAK);
|
||||
COUNT_NODE(NODE_NEXT);
|
||||
COUNT_NODE(NODE_REDO);
|
||||
COUNT_NODE(NODE_RETRY);
|
||||
COUNT_NODE(NODE_BEGIN);
|
||||
COUNT_NODE(NODE_RESCUE);
|
||||
COUNT_NODE(NODE_RESBODY);
|
||||
COUNT_NODE(NODE_ENSURE);
|
||||
COUNT_NODE(NODE_AND);
|
||||
COUNT_NODE(NODE_OR);
|
||||
COUNT_NODE(NODE_MASGN);
|
||||
COUNT_NODE(NODE_LASGN);
|
||||
COUNT_NODE(NODE_DASGN);
|
||||
COUNT_NODE(NODE_GASGN);
|
||||
COUNT_NODE(NODE_IASGN);
|
||||
COUNT_NODE(NODE_CDECL);
|
||||
COUNT_NODE(NODE_CVASGN);
|
||||
COUNT_NODE(NODE_OP_ASGN1);
|
||||
COUNT_NODE(NODE_OP_ASGN2);
|
||||
COUNT_NODE(NODE_OP_ASGN_AND);
|
||||
COUNT_NODE(NODE_OP_ASGN_OR);
|
||||
COUNT_NODE(NODE_OP_CDECL);
|
||||
COUNT_NODE(NODE_CALL);
|
||||
COUNT_NODE(NODE_OPCALL);
|
||||
COUNT_NODE(NODE_FCALL);
|
||||
COUNT_NODE(NODE_VCALL);
|
||||
COUNT_NODE(NODE_QCALL);
|
||||
COUNT_NODE(NODE_SUPER);
|
||||
COUNT_NODE(NODE_ZSUPER);
|
||||
COUNT_NODE(NODE_LIST);
|
||||
COUNT_NODE(NODE_ZLIST);
|
||||
COUNT_NODE(NODE_VALUES);
|
||||
COUNT_NODE(NODE_HASH);
|
||||
COUNT_NODE(NODE_RETURN);
|
||||
COUNT_NODE(NODE_YIELD);
|
||||
COUNT_NODE(NODE_LVAR);
|
||||
COUNT_NODE(NODE_DVAR);
|
||||
COUNT_NODE(NODE_GVAR);
|
||||
COUNT_NODE(NODE_IVAR);
|
||||
COUNT_NODE(NODE_CONST);
|
||||
COUNT_NODE(NODE_CVAR);
|
||||
COUNT_NODE(NODE_NTH_REF);
|
||||
COUNT_NODE(NODE_BACK_REF);
|
||||
COUNT_NODE(NODE_MATCH);
|
||||
COUNT_NODE(NODE_MATCH2);
|
||||
COUNT_NODE(NODE_MATCH3);
|
||||
COUNT_NODE(NODE_LIT);
|
||||
COUNT_NODE(NODE_STR);
|
||||
COUNT_NODE(NODE_DSTR);
|
||||
COUNT_NODE(NODE_XSTR);
|
||||
COUNT_NODE(NODE_DXSTR);
|
||||
COUNT_NODE(NODE_EVSTR);
|
||||
COUNT_NODE(NODE_DREGX);
|
||||
COUNT_NODE(NODE_ONCE);
|
||||
COUNT_NODE(NODE_ARGS);
|
||||
COUNT_NODE(NODE_ARGS_AUX);
|
||||
COUNT_NODE(NODE_OPT_ARG);
|
||||
COUNT_NODE(NODE_KW_ARG);
|
||||
COUNT_NODE(NODE_POSTARG);
|
||||
COUNT_NODE(NODE_ARGSCAT);
|
||||
COUNT_NODE(NODE_ARGSPUSH);
|
||||
COUNT_NODE(NODE_SPLAT);
|
||||
COUNT_NODE(NODE_BLOCK_PASS);
|
||||
COUNT_NODE(NODE_DEFN);
|
||||
COUNT_NODE(NODE_DEFS);
|
||||
COUNT_NODE(NODE_ALIAS);
|
||||
COUNT_NODE(NODE_VALIAS);
|
||||
COUNT_NODE(NODE_UNDEF);
|
||||
COUNT_NODE(NODE_CLASS);
|
||||
COUNT_NODE(NODE_MODULE);
|
||||
COUNT_NODE(NODE_SCLASS);
|
||||
COUNT_NODE(NODE_COLON2);
|
||||
COUNT_NODE(NODE_COLON3);
|
||||
COUNT_NODE(NODE_DOT2);
|
||||
COUNT_NODE(NODE_DOT3);
|
||||
COUNT_NODE(NODE_FLIP2);
|
||||
COUNT_NODE(NODE_FLIP3);
|
||||
COUNT_NODE(NODE_SELF);
|
||||
COUNT_NODE(NODE_NIL);
|
||||
COUNT_NODE(NODE_TRUE);
|
||||
COUNT_NODE(NODE_FALSE);
|
||||
COUNT_NODE(NODE_ERRINFO);
|
||||
COUNT_NODE(NODE_DEFINED);
|
||||
COUNT_NODE(NODE_POSTEXE);
|
||||
COUNT_NODE(NODE_DSYM);
|
||||
COUNT_NODE(NODE_ATTRASGN);
|
||||
COUNT_NODE(NODE_LAMBDA);
|
||||
COUNT_NODE(NODE_ARYPTN);
|
||||
COUNT_NODE(NODE_FNDPTN);
|
||||
COUNT_NODE(NODE_HSHPTN);
|
||||
COUNT_NODE(NODE_SCOPE);
|
||||
COUNT_NODE(NODE_BLOCK);
|
||||
COUNT_NODE(NODE_IF);
|
||||
COUNT_NODE(NODE_UNLESS);
|
||||
COUNT_NODE(NODE_CASE);
|
||||
COUNT_NODE(NODE_CASE2);
|
||||
COUNT_NODE(NODE_CASE3);
|
||||
COUNT_NODE(NODE_WHEN);
|
||||
COUNT_NODE(NODE_IN);
|
||||
COUNT_NODE(NODE_WHILE);
|
||||
COUNT_NODE(NODE_UNTIL);
|
||||
COUNT_NODE(NODE_ITER);
|
||||
COUNT_NODE(NODE_FOR);
|
||||
COUNT_NODE(NODE_FOR_MASGN);
|
||||
COUNT_NODE(NODE_BREAK);
|
||||
COUNT_NODE(NODE_NEXT);
|
||||
COUNT_NODE(NODE_REDO);
|
||||
COUNT_NODE(NODE_RETRY);
|
||||
COUNT_NODE(NODE_BEGIN);
|
||||
COUNT_NODE(NODE_RESCUE);
|
||||
COUNT_NODE(NODE_RESBODY);
|
||||
COUNT_NODE(NODE_ENSURE);
|
||||
COUNT_NODE(NODE_AND);
|
||||
COUNT_NODE(NODE_OR);
|
||||
COUNT_NODE(NODE_MASGN);
|
||||
COUNT_NODE(NODE_LASGN);
|
||||
COUNT_NODE(NODE_DASGN);
|
||||
COUNT_NODE(NODE_GASGN);
|
||||
COUNT_NODE(NODE_IASGN);
|
||||
COUNT_NODE(NODE_CDECL);
|
||||
COUNT_NODE(NODE_CVASGN);
|
||||
COUNT_NODE(NODE_OP_ASGN1);
|
||||
COUNT_NODE(NODE_OP_ASGN2);
|
||||
COUNT_NODE(NODE_OP_ASGN_AND);
|
||||
COUNT_NODE(NODE_OP_ASGN_OR);
|
||||
COUNT_NODE(NODE_OP_CDECL);
|
||||
COUNT_NODE(NODE_CALL);
|
||||
COUNT_NODE(NODE_OPCALL);
|
||||
COUNT_NODE(NODE_FCALL);
|
||||
COUNT_NODE(NODE_VCALL);
|
||||
COUNT_NODE(NODE_QCALL);
|
||||
COUNT_NODE(NODE_SUPER);
|
||||
COUNT_NODE(NODE_ZSUPER);
|
||||
COUNT_NODE(NODE_LIST);
|
||||
COUNT_NODE(NODE_ZLIST);
|
||||
COUNT_NODE(NODE_VALUES);
|
||||
COUNT_NODE(NODE_HASH);
|
||||
COUNT_NODE(NODE_RETURN);
|
||||
COUNT_NODE(NODE_YIELD);
|
||||
COUNT_NODE(NODE_LVAR);
|
||||
COUNT_NODE(NODE_DVAR);
|
||||
COUNT_NODE(NODE_GVAR);
|
||||
COUNT_NODE(NODE_IVAR);
|
||||
COUNT_NODE(NODE_CONST);
|
||||
COUNT_NODE(NODE_CVAR);
|
||||
COUNT_NODE(NODE_NTH_REF);
|
||||
COUNT_NODE(NODE_BACK_REF);
|
||||
COUNT_NODE(NODE_MATCH);
|
||||
COUNT_NODE(NODE_MATCH2);
|
||||
COUNT_NODE(NODE_MATCH3);
|
||||
COUNT_NODE(NODE_LIT);
|
||||
COUNT_NODE(NODE_STR);
|
||||
COUNT_NODE(NODE_DSTR);
|
||||
COUNT_NODE(NODE_XSTR);
|
||||
COUNT_NODE(NODE_DXSTR);
|
||||
COUNT_NODE(NODE_EVSTR);
|
||||
COUNT_NODE(NODE_DREGX);
|
||||
COUNT_NODE(NODE_ONCE);
|
||||
COUNT_NODE(NODE_ARGS);
|
||||
COUNT_NODE(NODE_ARGS_AUX);
|
||||
COUNT_NODE(NODE_OPT_ARG);
|
||||
COUNT_NODE(NODE_KW_ARG);
|
||||
COUNT_NODE(NODE_POSTARG);
|
||||
COUNT_NODE(NODE_ARGSCAT);
|
||||
COUNT_NODE(NODE_ARGSPUSH);
|
||||
COUNT_NODE(NODE_SPLAT);
|
||||
COUNT_NODE(NODE_BLOCK_PASS);
|
||||
COUNT_NODE(NODE_DEFN);
|
||||
COUNT_NODE(NODE_DEFS);
|
||||
COUNT_NODE(NODE_ALIAS);
|
||||
COUNT_NODE(NODE_VALIAS);
|
||||
COUNT_NODE(NODE_UNDEF);
|
||||
COUNT_NODE(NODE_CLASS);
|
||||
COUNT_NODE(NODE_MODULE);
|
||||
COUNT_NODE(NODE_SCLASS);
|
||||
COUNT_NODE(NODE_COLON2);
|
||||
COUNT_NODE(NODE_COLON3);
|
||||
COUNT_NODE(NODE_DOT2);
|
||||
COUNT_NODE(NODE_DOT3);
|
||||
COUNT_NODE(NODE_FLIP2);
|
||||
COUNT_NODE(NODE_FLIP3);
|
||||
COUNT_NODE(NODE_SELF);
|
||||
COUNT_NODE(NODE_NIL);
|
||||
COUNT_NODE(NODE_TRUE);
|
||||
COUNT_NODE(NODE_FALSE);
|
||||
COUNT_NODE(NODE_ERRINFO);
|
||||
COUNT_NODE(NODE_DEFINED);
|
||||
COUNT_NODE(NODE_POSTEXE);
|
||||
COUNT_NODE(NODE_DSYM);
|
||||
COUNT_NODE(NODE_ATTRASGN);
|
||||
COUNT_NODE(NODE_LAMBDA);
|
||||
COUNT_NODE(NODE_ARYPTN);
|
||||
COUNT_NODE(NODE_FNDPTN);
|
||||
COUNT_NODE(NODE_HSHPTN);
|
||||
#undef COUNT_NODE
|
||||
case NODE_LAST: break;
|
||||
}
|
||||
UNREACHABLE;
|
||||
set:
|
||||
rb_hash_aset(hash, node, SIZET2NUM(nodes[i]));
|
||||
}
|
||||
case NODE_LAST: break;
|
||||
}
|
||||
UNREACHABLE;
|
||||
set:
|
||||
rb_hash_aset(hash, node, SIZET2NUM(nodes[i]));
|
||||
}
|
||||
}
|
||||
return hash;
|
||||
}
|
||||
@ -817,26 +817,26 @@ reachable_object_from_root_i(const char *category, VALUE obj, void *ptr)
|
||||
VALUE category_objects;
|
||||
|
||||
if (category == data->last_category) {
|
||||
category_str = data->last_category_str;
|
||||
category_objects = data->last_category_objects;
|
||||
category_str = data->last_category_str;
|
||||
category_objects = data->last_category_objects;
|
||||
}
|
||||
else {
|
||||
data->last_category = category;
|
||||
category_str = data->last_category_str = rb_str_new2(category);
|
||||
category_objects = data->last_category_objects = rb_ident_hash_new();
|
||||
if (!NIL_P(rb_hash_lookup(data->categories, category_str))) {
|
||||
rb_bug("reachable_object_from_root_i: category should insert at once");
|
||||
}
|
||||
rb_hash_aset(data->categories, category_str, category_objects);
|
||||
data->last_category = category;
|
||||
category_str = data->last_category_str = rb_str_new2(category);
|
||||
category_objects = data->last_category_objects = rb_ident_hash_new();
|
||||
if (!NIL_P(rb_hash_lookup(data->categories, category_str))) {
|
||||
rb_bug("reachable_object_from_root_i: category should insert at once");
|
||||
}
|
||||
rb_hash_aset(data->categories, category_str, category_objects);
|
||||
}
|
||||
|
||||
if (rb_objspace_markable_object_p(obj) &&
|
||||
obj != data->categories &&
|
||||
obj != data->last_category_objects) {
|
||||
if (rb_objspace_internal_object_p(obj)) {
|
||||
obj = iow_newobj(obj);
|
||||
}
|
||||
rb_hash_aset(category_objects, obj, obj);
|
||||
obj != data->categories &&
|
||||
obj != data->last_category_objects) {
|
||||
if (rb_objspace_internal_object_p(obj)) {
|
||||
obj = iow_newobj(obj);
|
||||
}
|
||||
rb_hash_aset(category_objects, obj, obj);
|
||||
}
|
||||
}
|
||||
|
||||
@ -872,14 +872,14 @@ static VALUE
|
||||
wrap_klass_iow(VALUE klass)
|
||||
{
|
||||
if (!RTEST(klass)) {
|
||||
return Qnil;
|
||||
return Qnil;
|
||||
}
|
||||
else if (RB_TYPE_P(klass, T_ICLASS) ||
|
||||
CLASS_OF(klass) == Qfalse /* hidden object */) {
|
||||
return iow_newobj(klass);
|
||||
return iow_newobj(klass);
|
||||
}
|
||||
else {
|
||||
return klass;
|
||||
return klass;
|
||||
}
|
||||
}
|
||||
|
||||
@ -898,7 +898,7 @@ objspace_internal_class_of(VALUE self, VALUE obj)
|
||||
VALUE klass;
|
||||
|
||||
if (rb_typeddata_is_kind_of(obj, &iow_data_type)) {
|
||||
obj = (VALUE)DATA_PTR(obj);
|
||||
obj = (VALUE)DATA_PTR(obj);
|
||||
}
|
||||
|
||||
if (RB_TYPE_P(obj, T_IMEMO)) {
|
||||
@ -925,17 +925,17 @@ objspace_internal_super_of(VALUE self, VALUE obj)
|
||||
VALUE super;
|
||||
|
||||
if (rb_typeddata_is_kind_of(obj, &iow_data_type)) {
|
||||
obj = (VALUE)DATA_PTR(obj);
|
||||
obj = (VALUE)DATA_PTR(obj);
|
||||
}
|
||||
|
||||
switch (OBJ_BUILTIN_TYPE(obj)) {
|
||||
case T_MODULE:
|
||||
case T_CLASS:
|
||||
case T_ICLASS:
|
||||
super = RCLASS_SUPER(obj);
|
||||
break;
|
||||
super = RCLASS_SUPER(obj);
|
||||
break;
|
||||
default:
|
||||
rb_raise(rb_eArgError, "class or module is expected");
|
||||
rb_raise(rb_eArgError, "class or module is expected");
|
||||
}
|
||||
|
||||
return wrap_klass_iow(super);
|
||||
|
@ -235,32 +235,32 @@ obj_type(VALUE obj)
|
||||
{
|
||||
switch (BUILTIN_TYPE(obj)) {
|
||||
#define CASE_TYPE(type) case T_##type: return #type
|
||||
CASE_TYPE(NONE);
|
||||
CASE_TYPE(NIL);
|
||||
CASE_TYPE(OBJECT);
|
||||
CASE_TYPE(CLASS);
|
||||
CASE_TYPE(ICLASS);
|
||||
CASE_TYPE(MODULE);
|
||||
CASE_TYPE(FLOAT);
|
||||
CASE_TYPE(STRING);
|
||||
CASE_TYPE(REGEXP);
|
||||
CASE_TYPE(ARRAY);
|
||||
CASE_TYPE(HASH);
|
||||
CASE_TYPE(STRUCT);
|
||||
CASE_TYPE(BIGNUM);
|
||||
CASE_TYPE(FILE);
|
||||
CASE_TYPE(FIXNUM);
|
||||
CASE_TYPE(TRUE);
|
||||
CASE_TYPE(FALSE);
|
||||
CASE_TYPE(DATA);
|
||||
CASE_TYPE(MATCH);
|
||||
CASE_TYPE(SYMBOL);
|
||||
CASE_TYPE(RATIONAL);
|
||||
CASE_TYPE(COMPLEX);
|
||||
CASE_TYPE(IMEMO);
|
||||
CASE_TYPE(UNDEF);
|
||||
CASE_TYPE(NODE);
|
||||
CASE_TYPE(ZOMBIE);
|
||||
CASE_TYPE(NONE);
|
||||
CASE_TYPE(NIL);
|
||||
CASE_TYPE(OBJECT);
|
||||
CASE_TYPE(CLASS);
|
||||
CASE_TYPE(ICLASS);
|
||||
CASE_TYPE(MODULE);
|
||||
CASE_TYPE(FLOAT);
|
||||
CASE_TYPE(STRING);
|
||||
CASE_TYPE(REGEXP);
|
||||
CASE_TYPE(ARRAY);
|
||||
CASE_TYPE(HASH);
|
||||
CASE_TYPE(STRUCT);
|
||||
CASE_TYPE(BIGNUM);
|
||||
CASE_TYPE(FILE);
|
||||
CASE_TYPE(FIXNUM);
|
||||
CASE_TYPE(TRUE);
|
||||
CASE_TYPE(FALSE);
|
||||
CASE_TYPE(DATA);
|
||||
CASE_TYPE(MATCH);
|
||||
CASE_TYPE(SYMBOL);
|
||||
CASE_TYPE(RATIONAL);
|
||||
CASE_TYPE(COMPLEX);
|
||||
CASE_TYPE(IMEMO);
|
||||
CASE_TYPE(UNDEF);
|
||||
CASE_TYPE(NODE);
|
||||
CASE_TYPE(ZOMBIE);
|
||||
#undef CASE_TYPE
|
||||
default: break;
|
||||
}
|
||||
@ -583,8 +583,8 @@ heap_i(void *vstart, void *vend, size_t stride, void *data)
|
||||
asan_unpoison_object(v, false);
|
||||
dc->cur_page_slot_size = stride;
|
||||
|
||||
if (dc->full_heap || RBASIC(v)->flags)
|
||||
dump_object(v, dc);
|
||||
if (dc->full_heap || RBASIC(v)->flags)
|
||||
dump_object(v, dc);
|
||||
|
||||
if (ptr) {
|
||||
asan_poison_object(v);
|
||||
|
@ -1226,7 +1226,7 @@ path_entries(VALUE self)
|
||||
ary = rb_funcall(rb_cDir, id_entries, 1, str);
|
||||
ary = rb_convert_type(ary, T_ARRAY, "Array", "to_ary");
|
||||
for (i = 0; i < RARRAY_LEN(ary); i++) {
|
||||
VALUE elt = RARRAY_AREF(ary, i);
|
||||
VALUE elt = RARRAY_AREF(ary, i);
|
||||
elt = rb_class_new_instance(1, &elt, klass);
|
||||
rb_ary_store(ary, i, elt);
|
||||
}
|
||||
|
134
ext/pty/pty.c
134
ext/pty/pty.c
@ -107,8 +107,8 @@ chfunc(void *data, char *errbuf, size_t errbuf_len)
|
||||
int slave = carg->slave;
|
||||
|
||||
#define ERROR_EXIT(str) do { \
|
||||
strlcpy(errbuf, (str), errbuf_len); \
|
||||
return -1; \
|
||||
strlcpy(errbuf, (str), errbuf_len); \
|
||||
return -1; \
|
||||
} while (0)
|
||||
|
||||
/*
|
||||
@ -166,7 +166,7 @@ chfunc(void *data, char *errbuf, size_t errbuf_len)
|
||||
|
||||
static void
|
||||
establishShell(int argc, VALUE *argv, struct pty_info *info,
|
||||
char SlaveName[DEVICELEN])
|
||||
char SlaveName[DEVICELEN])
|
||||
{
|
||||
int master, slave, status = 0;
|
||||
rb_pid_t pid;
|
||||
@ -176,22 +176,22 @@ establishShell(int argc, VALUE *argv, struct pty_info *info,
|
||||
char errbuf[32];
|
||||
|
||||
if (argc == 0) {
|
||||
const char *shellname = "/bin/sh";
|
||||
const char *shellname = "/bin/sh";
|
||||
|
||||
if ((p = getenv("SHELL")) != NULL) {
|
||||
shellname = p;
|
||||
}
|
||||
else {
|
||||
if ((p = getenv("SHELL")) != NULL) {
|
||||
shellname = p;
|
||||
}
|
||||
else {
|
||||
#if defined HAVE_PWD_H
|
||||
const char *username = getenv("USER");
|
||||
struct passwd *pwent = getpwnam(username ? username : getlogin());
|
||||
if (pwent && pwent->pw_shell)
|
||||
shellname = pwent->pw_shell;
|
||||
const char *username = getenv("USER");
|
||||
struct passwd *pwent = getpwnam(username ? username : getlogin());
|
||||
if (pwent && pwent->pw_shell)
|
||||
shellname = pwent->pw_shell;
|
||||
#endif
|
||||
}
|
||||
v = rb_str_new2(shellname);
|
||||
argc = 1;
|
||||
argv = &v;
|
||||
}
|
||||
v = rb_str_new2(shellname);
|
||||
argc = 1;
|
||||
argv = &v;
|
||||
}
|
||||
|
||||
carg.execarg_obj = rb_execarg_new(argc, argv, 1, 0);
|
||||
@ -207,13 +207,13 @@ establishShell(int argc, VALUE *argv, struct pty_info *info,
|
||||
pid = rb_fork_async_signal_safe(&status, chfunc, &carg, Qnil, errbuf, sizeof(errbuf));
|
||||
|
||||
if (pid < 0) {
|
||||
int e = errno;
|
||||
close(master);
|
||||
close(slave);
|
||||
int e = errno;
|
||||
close(master);
|
||||
close(slave);
|
||||
rb_execarg_parent_end(carg.execarg_obj);
|
||||
errno = e;
|
||||
if (status) rb_jump_tag(status);
|
||||
rb_sys_fail(errbuf[0] ? errbuf : "fork failed");
|
||||
errno = e;
|
||||
if (status) rb_jump_tag(status);
|
||||
rb_sys_fail(errbuf[0] ? errbuf : "fork failed");
|
||||
}
|
||||
|
||||
close(slave);
|
||||
@ -268,14 +268,14 @@ get_device_once(int *master, int *slave, char SlaveName[DEVICELEN], int nomesg,
|
||||
rb_fd_fix_cloexec(masterfd);
|
||||
#else
|
||||
{
|
||||
int flags = O_RDWR|O_NOCTTY;
|
||||
int flags = O_RDWR|O_NOCTTY;
|
||||
# if defined(O_CLOEXEC)
|
||||
/* glibc posix_openpt() in GNU/Linux calls open("/dev/ptmx", flags) internally.
|
||||
* So version dependency on GNU/Linux is the same as O_CLOEXEC with open().
|
||||
* O_CLOEXEC is available since Linux 2.6.23. Linux 2.6.18 silently ignore it. */
|
||||
flags |= O_CLOEXEC;
|
||||
/* glibc posix_openpt() in GNU/Linux calls open("/dev/ptmx", flags) internally.
|
||||
* So version dependency on GNU/Linux is the same as O_CLOEXEC with open().
|
||||
* O_CLOEXEC is available since Linux 2.6.23. Linux 2.6.18 silently ignore it. */
|
||||
flags |= O_CLOEXEC;
|
||||
# endif
|
||||
if ((masterfd = posix_openpt(flags)) == -1) goto error;
|
||||
if ((masterfd = posix_openpt(flags)) == -1) goto error;
|
||||
}
|
||||
rb_fd_fix_cloexec(masterfd);
|
||||
if (rb_grantpt(masterfd) == -1) goto error;
|
||||
@ -310,15 +310,15 @@ get_device_once(int *master, int *slave, char SlaveName[DEVICELEN], int nomesg,
|
||||
* or the same interface function.
|
||||
*/
|
||||
if (openpty(master, slave, SlaveName,
|
||||
(struct termios *)0, (struct winsize *)0) == -1) {
|
||||
if (!fail) return -1;
|
||||
rb_raise(rb_eRuntimeError, "openpty() failed");
|
||||
(struct termios *)0, (struct winsize *)0) == -1) {
|
||||
if (!fail) return -1;
|
||||
rb_raise(rb_eRuntimeError, "openpty() failed");
|
||||
}
|
||||
rb_fd_fix_cloexec(*master);
|
||||
rb_fd_fix_cloexec(*slave);
|
||||
if (no_mesg(SlaveName, nomesg) == -1) {
|
||||
if (!fail) return -1;
|
||||
rb_raise(rb_eRuntimeError, "can't chmod slave pty");
|
||||
if (!fail) return -1;
|
||||
rb_raise(rb_eRuntimeError, "can't chmod slave pty");
|
||||
}
|
||||
|
||||
return 0;
|
||||
@ -329,8 +329,8 @@ get_device_once(int *master, int *slave, char SlaveName[DEVICELEN], int nomesg,
|
||||
mode_t mode = nomesg ? 0600 : 0622;
|
||||
|
||||
if (!(name = _getpty(master, O_RDWR, mode, 0))) {
|
||||
if (!fail) return -1;
|
||||
rb_raise(rb_eRuntimeError, "_getpty() failed");
|
||||
if (!fail) return -1;
|
||||
rb_raise(rb_eRuntimeError, "_getpty() failed");
|
||||
}
|
||||
rb_fd_fix_cloexec(*master);
|
||||
|
||||
@ -386,42 +386,42 @@ get_device_once(int *master, int *slave, char SlaveName[DEVICELEN], int nomesg,
|
||||
char MasterName[DEVICELEN];
|
||||
|
||||
#define HEX1(c) \
|
||||
c"0",c"1",c"2",c"3",c"4",c"5",c"6",c"7", \
|
||||
c"8",c"9",c"a",c"b",c"c",c"d",c"e",c"f"
|
||||
c"0",c"1",c"2",c"3",c"4",c"5",c"6",c"7", \
|
||||
c"8",c"9",c"a",c"b",c"c",c"d",c"e",c"f"
|
||||
|
||||
#if defined(_IBMESA) /* AIX/ESA */
|
||||
static const char MasterDevice[] = "/dev/ptyp%s";
|
||||
static const char SlaveDevice[] = "/dev/ttyp%s";
|
||||
static const char deviceNo[][3] = {
|
||||
HEX1("0"), HEX1("1"), HEX1("2"), HEX1("3"),
|
||||
HEX1("4"), HEX1("5"), HEX1("6"), HEX1("7"),
|
||||
HEX1("8"), HEX1("9"), HEX1("a"), HEX1("b"),
|
||||
HEX1("c"), HEX1("d"), HEX1("e"), HEX1("f"),
|
||||
HEX1("0"), HEX1("1"), HEX1("2"), HEX1("3"),
|
||||
HEX1("4"), HEX1("5"), HEX1("6"), HEX1("7"),
|
||||
HEX1("8"), HEX1("9"), HEX1("a"), HEX1("b"),
|
||||
HEX1("c"), HEX1("d"), HEX1("e"), HEX1("f"),
|
||||
};
|
||||
#else /* 4.2BSD */
|
||||
static const char MasterDevice[] = "/dev/pty%s";
|
||||
static const char SlaveDevice[] = "/dev/tty%s";
|
||||
static const char deviceNo[][3] = {
|
||||
HEX1("p"), HEX1("q"), HEX1("r"), HEX1("s"),
|
||||
HEX1("p"), HEX1("q"), HEX1("r"), HEX1("s"),
|
||||
};
|
||||
#endif
|
||||
#undef HEX1
|
||||
for (i = 0; i < numberof(deviceNo); i++) {
|
||||
const char *const devno = deviceNo[i];
|
||||
snprintf(MasterName, sizeof MasterName, MasterDevice, devno);
|
||||
if ((masterfd = rb_cloexec_open(MasterName,O_RDWR,0)) >= 0) {
|
||||
const char *const devno = deviceNo[i];
|
||||
snprintf(MasterName, sizeof MasterName, MasterDevice, devno);
|
||||
if ((masterfd = rb_cloexec_open(MasterName,O_RDWR,0)) >= 0) {
|
||||
rb_update_max_fd(masterfd);
|
||||
*master = masterfd;
|
||||
snprintf(SlaveName, DEVICELEN, SlaveDevice, devno);
|
||||
if ((slavefd = rb_cloexec_open(SlaveName,O_RDWR,0)) >= 0) {
|
||||
*master = masterfd;
|
||||
snprintf(SlaveName, DEVICELEN, SlaveDevice, devno);
|
||||
if ((slavefd = rb_cloexec_open(SlaveName,O_RDWR,0)) >= 0) {
|
||||
rb_update_max_fd(slavefd);
|
||||
*slave = slavefd;
|
||||
if (chown(SlaveName, getuid(), getgid()) != 0) goto error;
|
||||
if (chmod(SlaveName, nomesg ? 0600 : 0622) != 0) goto error;
|
||||
return 0;
|
||||
}
|
||||
close(masterfd);
|
||||
}
|
||||
*slave = slavefd;
|
||||
if (chown(SlaveName, getuid(), getgid()) != 0) goto error;
|
||||
if (chmod(SlaveName, nomesg ? 0600 : 0622) != 0) goto error;
|
||||
return 0;
|
||||
}
|
||||
close(masterfd);
|
||||
}
|
||||
}
|
||||
error:
|
||||
if (slavefd != -1) close(slavefd);
|
||||
@ -435,8 +435,8 @@ static void
|
||||
getDevice(int *master, int *slave, char SlaveName[DEVICELEN], int nomesg)
|
||||
{
|
||||
if (get_device_once(master, slave, SlaveName, nomesg, 0)) {
|
||||
rb_gc();
|
||||
get_device_once(master, slave, SlaveName, nomesg, 1);
|
||||
rb_gc();
|
||||
get_device_once(master, slave, SlaveName, nomesg, 1);
|
||||
}
|
||||
}
|
||||
|
||||
@ -519,7 +519,7 @@ pty_open(VALUE klass)
|
||||
|
||||
assoc = rb_assoc_new(master_io, slave_file);
|
||||
if (rb_block_given_p()) {
|
||||
return rb_ensure(rb_yield, assoc, pty_close_pty, assoc);
|
||||
return rb_ensure(rb_yield, assoc, pty_close_pty, assoc);
|
||||
}
|
||||
return assoc;
|
||||
}
|
||||
@ -531,7 +531,7 @@ pty_detach_process(VALUE v)
|
||||
#ifdef WNOHANG
|
||||
int st;
|
||||
if (rb_waitpid(info->child_pid, &st, WNOHANG) <= 0)
|
||||
return Qnil;
|
||||
return Qnil;
|
||||
#endif
|
||||
rb_detach_process(info->child_pid);
|
||||
return Qnil;
|
||||
@ -604,8 +604,8 @@ pty_getpty(int argc, VALUE *argv, VALUE self)
|
||||
rb_ary_store(res,2,PIDT2NUM(info.child_pid));
|
||||
|
||||
if (rb_block_given_p()) {
|
||||
rb_ensure(rb_yield, res, pty_detach_process, (VALUE)&info);
|
||||
return Qnil;
|
||||
rb_ensure(rb_yield, res, pty_detach_process, (VALUE)&info);
|
||||
return Qnil;
|
||||
}
|
||||
return res;
|
||||
}
|
||||
@ -625,13 +625,13 @@ raise_from_check(rb_pid_t pid, int status)
|
||||
---->> Either IF_STOPPED or WIFSTOPPED is needed <<----
|
||||
#endif /* WIFSTOPPED | IF_STOPPED */
|
||||
if (WIFSTOPPED(status)) { /* suspend */
|
||||
state = "stopped";
|
||||
state = "stopped";
|
||||
}
|
||||
else if (kill(pid, 0) == 0) {
|
||||
state = "changed";
|
||||
state = "changed";
|
||||
}
|
||||
else {
|
||||
state = "exited";
|
||||
state = "exited";
|
||||
}
|
||||
msg = rb_sprintf("pty - %s: %ld", state, (long)pid);
|
||||
exc = rb_exc_new_str(eChildExited, msg);
|
||||
@ -664,12 +664,12 @@ pty_check(int argc, VALUE *argv, VALUE self)
|
||||
int status;
|
||||
const int flag =
|
||||
#ifdef WNOHANG
|
||||
WNOHANG|
|
||||
WNOHANG|
|
||||
#endif
|
||||
#ifdef WUNTRACED
|
||||
WUNTRACED|
|
||||
WUNTRACED|
|
||||
#endif
|
||||
0;
|
||||
0;
|
||||
|
||||
rb_scan_args(argc, argv, "11", &pid, &exc);
|
||||
cpid = rb_waitpid(NUM2PIDT(pid), &status, flag);
|
||||
|
@ -376,8 +376,8 @@ prepare_readline(void)
|
||||
{
|
||||
static int initialized = 0;
|
||||
if (!initialized) {
|
||||
rl_initialize();
|
||||
initialized = 1;
|
||||
rl_initialize();
|
||||
initialized = 1;
|
||||
}
|
||||
|
||||
if (readline_instream) {
|
||||
|
@ -129,14 +129,14 @@
|
||||
|
||||
#ifndef HAVE_TYPE_STRUCT_ADDRINFO
|
||||
struct addrinfo {
|
||||
int ai_flags; /* AI_PASSIVE, AI_CANONNAME */
|
||||
int ai_family; /* PF_xxx */
|
||||
int ai_socktype; /* SOCK_xxx */
|
||||
int ai_protocol; /* 0 or IPPROTO_xxx for IPv4 and IPv6 */
|
||||
size_t ai_addrlen; /* length of ai_addr */
|
||||
char *ai_canonname; /* canonical name for hostname */
|
||||
struct sockaddr *ai_addr; /* binary address */
|
||||
struct addrinfo *ai_next; /* next structure in linked list */
|
||||
int ai_flags; /* AI_PASSIVE, AI_CANONNAME */
|
||||
int ai_family; /* PF_xxx */
|
||||
int ai_socktype; /* SOCK_xxx */
|
||||
int ai_protocol; /* 0 or IPPROTO_xxx for IPv4 and IPv6 */
|
||||
size_t ai_addrlen; /* length of ai_addr */
|
||||
char *ai_canonname; /* canonical name for hostname */
|
||||
struct sockaddr *ai_addr; /* binary address */
|
||||
struct addrinfo *ai_next; /* next structure in linked list */
|
||||
};
|
||||
#endif
|
||||
|
||||
@ -158,18 +158,18 @@ struct addrinfo {
|
||||
#endif
|
||||
|
||||
extern int getaddrinfo __P((
|
||||
const char *hostname, const char *servname,
|
||||
const struct addrinfo *hints,
|
||||
struct addrinfo **res));
|
||||
const char *hostname, const char *servname,
|
||||
const struct addrinfo *hints,
|
||||
struct addrinfo **res));
|
||||
|
||||
extern int getnameinfo __P((
|
||||
const struct sockaddr *sa,
|
||||
socklen_t salen,
|
||||
char *host,
|
||||
socklen_t hostlen,
|
||||
char *serv,
|
||||
socklen_t servlen,
|
||||
int flags));
|
||||
const struct sockaddr *sa,
|
||||
socklen_t salen,
|
||||
char *host,
|
||||
socklen_t hostlen,
|
||||
char *serv,
|
||||
socklen_t servlen,
|
||||
int flags));
|
||||
|
||||
extern void freehostent __P((struct hostent *));
|
||||
extern void freeaddrinfo __P((struct addrinfo *));
|
||||
|
@ -333,11 +333,11 @@ ancillary_timestamp(VALUE self)
|
||||
if (level == SOL_SOCKET && type == SCM_BINTIME &&
|
||||
RSTRING_LEN(data) == sizeof(struct bintime)) {
|
||||
struct bintime bt;
|
||||
VALUE d, timev;
|
||||
VALUE d, timev;
|
||||
memcpy((char*)&bt, RSTRING_PTR(data), sizeof(bt));
|
||||
d = ULL2NUM(0x100000000ULL);
|
||||
d = mul(d,d);
|
||||
timev = add(TIMET2NUM(bt.sec), quo(ULL2NUM(bt.frac), d));
|
||||
d = ULL2NUM(0x100000000ULL);
|
||||
d = mul(d,d);
|
||||
timev = add(TIMET2NUM(bt.sec), quo(ULL2NUM(bt.frac), d));
|
||||
result = rb_time_num_new(timev, Qnil);
|
||||
}
|
||||
# endif
|
||||
@ -697,7 +697,7 @@ anc_inspect_passcred_credentials(int level, int type, VALUE data, VALUE ret)
|
||||
struct ucred cred;
|
||||
memcpy(&cred, RSTRING_PTR(data), sizeof(struct ucred));
|
||||
rb_str_catf(ret, " pid=%u uid=%u gid=%u", cred.pid, cred.uid, cred.gid);
|
||||
rb_str_cat2(ret, " (ucred)");
|
||||
rb_str_cat2(ret, " (ucred)");
|
||||
return 1;
|
||||
}
|
||||
else {
|
||||
@ -712,7 +712,7 @@ static int
|
||||
anc_inspect_socket_creds(int level, int type, VALUE data, VALUE ret)
|
||||
{
|
||||
if (level != SOL_SOCKET && type != SCM_CREDS)
|
||||
return 0;
|
||||
return 0;
|
||||
|
||||
/*
|
||||
* FreeBSD has struct cmsgcred and struct sockcred.
|
||||
@ -727,46 +727,46 @@ anc_inspect_socket_creds(int level, int type, VALUE data, VALUE ret)
|
||||
|
||||
#if defined(HAVE_TYPE_STRUCT_CMSGCRED) /* FreeBSD */
|
||||
if (RSTRING_LEN(data) == sizeof(struct cmsgcred)) {
|
||||
struct cmsgcred cred;
|
||||
struct cmsgcred cred;
|
||||
memcpy(&cred, RSTRING_PTR(data), sizeof(struct cmsgcred));
|
||||
rb_str_catf(ret, " pid=%u", cred.cmcred_pid);
|
||||
rb_str_catf(ret, " uid=%u", cred.cmcred_uid);
|
||||
rb_str_catf(ret, " euid=%u", cred.cmcred_euid);
|
||||
rb_str_catf(ret, " gid=%u", cred.cmcred_gid);
|
||||
if (cred.cmcred_ngroups) {
|
||||
int i;
|
||||
const char *sep = " groups=";
|
||||
for (i = 0; i < cred.cmcred_ngroups; i++) {
|
||||
rb_str_catf(ret, "%s%u", sep, cred.cmcred_groups[i]);
|
||||
sep = ",";
|
||||
}
|
||||
}
|
||||
rb_str_cat2(ret, " (cmsgcred)");
|
||||
if (cred.cmcred_ngroups) {
|
||||
int i;
|
||||
const char *sep = " groups=";
|
||||
for (i = 0; i < cred.cmcred_ngroups; i++) {
|
||||
rb_str_catf(ret, "%s%u", sep, cred.cmcred_groups[i]);
|
||||
sep = ",";
|
||||
}
|
||||
}
|
||||
rb_str_cat2(ret, " (cmsgcred)");
|
||||
return 1;
|
||||
}
|
||||
#endif
|
||||
#if defined(HAVE_TYPE_STRUCT_SOCKCRED) /* FreeBSD, NetBSD */
|
||||
if ((size_t)RSTRING_LEN(data) >= SOCKCREDSIZE(0)) {
|
||||
struct sockcred cred0, *cred;
|
||||
struct sockcred cred0, *cred;
|
||||
memcpy(&cred0, RSTRING_PTR(data), SOCKCREDSIZE(0));
|
||||
if ((size_t)RSTRING_LEN(data) == SOCKCREDSIZE(cred0.sc_ngroups)) {
|
||||
cred = (struct sockcred *)ALLOCA_N(char, SOCKCREDSIZE(cred0.sc_ngroups));
|
||||
memcpy(cred, RSTRING_PTR(data), SOCKCREDSIZE(cred0.sc_ngroups));
|
||||
rb_str_catf(ret, " uid=%u", cred->sc_uid);
|
||||
rb_str_catf(ret, " euid=%u", cred->sc_euid);
|
||||
rb_str_catf(ret, " gid=%u", cred->sc_gid);
|
||||
rb_str_catf(ret, " egid=%u", cred->sc_egid);
|
||||
if (cred0.sc_ngroups) {
|
||||
int i;
|
||||
const char *sep = " groups=";
|
||||
for (i = 0; i < cred0.sc_ngroups; i++) {
|
||||
rb_str_catf(ret, "%s%u", sep, cred->sc_groups[i]);
|
||||
sep = ",";
|
||||
}
|
||||
}
|
||||
rb_str_cat2(ret, " (sockcred)");
|
||||
return 1;
|
||||
}
|
||||
if ((size_t)RSTRING_LEN(data) == SOCKCREDSIZE(cred0.sc_ngroups)) {
|
||||
cred = (struct sockcred *)ALLOCA_N(char, SOCKCREDSIZE(cred0.sc_ngroups));
|
||||
memcpy(cred, RSTRING_PTR(data), SOCKCREDSIZE(cred0.sc_ngroups));
|
||||
rb_str_catf(ret, " uid=%u", cred->sc_uid);
|
||||
rb_str_catf(ret, " euid=%u", cred->sc_euid);
|
||||
rb_str_catf(ret, " gid=%u", cred->sc_gid);
|
||||
rb_str_catf(ret, " egid=%u", cred->sc_egid);
|
||||
if (cred0.sc_ngroups) {
|
||||
int i;
|
||||
const char *sep = " groups=";
|
||||
for (i = 0; i < cred0.sc_ngroups; i++) {
|
||||
rb_str_catf(ret, "%s%u", sep, cred->sc_groups[i]);
|
||||
sep = ",";
|
||||
}
|
||||
}
|
||||
rb_str_cat2(ret, " (sockcred)");
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
return 0;
|
||||
@ -906,37 +906,37 @@ inspect_bintime_as_abstime(int level, int optname, VALUE data, VALUE ret)
|
||||
if (RSTRING_LEN(data) == sizeof(struct bintime)) {
|
||||
struct bintime bt;
|
||||
struct tm tm;
|
||||
uint64_t frac_h, frac_l;
|
||||
uint64_t scale_h, scale_l;
|
||||
uint64_t tmp1, tmp2;
|
||||
uint64_t res_h, res_l;
|
||||
uint64_t frac_h, frac_l;
|
||||
uint64_t scale_h, scale_l;
|
||||
uint64_t tmp1, tmp2;
|
||||
uint64_t res_h, res_l;
|
||||
char buf[32];
|
||||
memcpy((char*)&bt, RSTRING_PTR(data), sizeof(bt));
|
||||
LOCALTIME(bt.sec, tm);
|
||||
strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", &tm);
|
||||
|
||||
/* res_h = frac * 10**19 / 2**64 */
|
||||
/* res_h = frac * 10**19 / 2**64 */
|
||||
|
||||
frac_h = bt.frac >> 32;
|
||||
frac_l = bt.frac & 0xffffffff;
|
||||
frac_h = bt.frac >> 32;
|
||||
frac_l = bt.frac & 0xffffffff;
|
||||
|
||||
scale_h = 0x8ac72304; /* 0x8ac7230489e80000 == 10**19 */
|
||||
scale_l = 0x89e80000;
|
||||
scale_h = 0x8ac72304; /* 0x8ac7230489e80000 == 10**19 */
|
||||
scale_l = 0x89e80000;
|
||||
|
||||
res_h = frac_h * scale_h;
|
||||
res_l = frac_l * scale_l;
|
||||
res_h = frac_h * scale_h;
|
||||
res_l = frac_l * scale_l;
|
||||
|
||||
tmp1 = frac_h * scale_l;
|
||||
res_h += tmp1 >> 32;
|
||||
tmp2 = res_l;
|
||||
res_l += tmp1 & 0xffffffff;
|
||||
if (res_l < tmp2) res_h++;
|
||||
tmp1 = frac_h * scale_l;
|
||||
res_h += tmp1 >> 32;
|
||||
tmp2 = res_l;
|
||||
res_l += tmp1 & 0xffffffff;
|
||||
if (res_l < tmp2) res_h++;
|
||||
|
||||
tmp1 = frac_l * scale_h;
|
||||
res_h += tmp1 >> 32;
|
||||
tmp2 = res_l;
|
||||
res_l += tmp1 & 0xffffffff;
|
||||
if (res_l < tmp2) res_h++;
|
||||
tmp1 = frac_l * scale_h;
|
||||
res_h += tmp1 >> 32;
|
||||
tmp2 = res_l;
|
||||
res_l += tmp1 & 0xffffffff;
|
||||
if (res_l < tmp2) res_h++;
|
||||
|
||||
rb_str_catf(ret, " %s.%019"PRIu64, buf, res_h);
|
||||
return 1;
|
||||
@ -1136,8 +1136,8 @@ rb_sendmsg(int fd, const struct msghdr *msg, int flags)
|
||||
|
||||
static VALUE
|
||||
bsock_sendmsg_internal(VALUE sock, VALUE data, VALUE vflags,
|
||||
VALUE dest_sockaddr, VALUE controls, VALUE ex,
|
||||
int nonblock)
|
||||
VALUE dest_sockaddr, VALUE controls, VALUE ex,
|
||||
int nonblock)
|
||||
{
|
||||
rb_io_t *fptr;
|
||||
struct msghdr mh;
|
||||
@ -1160,15 +1160,15 @@ bsock_sendmsg_internal(VALUE sock, VALUE data, VALUE vflags,
|
||||
tmp = rb_str_tmp_frozen_acquire(data);
|
||||
|
||||
if (!RB_TYPE_P(controls, T_ARRAY)) {
|
||||
controls = rb_ary_new();
|
||||
controls = rb_ary_new();
|
||||
}
|
||||
controls_num = RARRAY_LENINT(controls);
|
||||
|
||||
if (controls_num) {
|
||||
#if defined(HAVE_STRUCT_MSGHDR_MSG_CONTROL)
|
||||
int i;
|
||||
size_t last_pad = 0;
|
||||
const VALUE *controls_ptr = RARRAY_CONST_PTR(controls);
|
||||
int i;
|
||||
size_t last_pad = 0;
|
||||
const VALUE *controls_ptr = RARRAY_CONST_PTR(controls);
|
||||
#if defined(__NetBSD__)
|
||||
int last_level = 0;
|
||||
int last_type = 0;
|
||||
@ -1215,9 +1215,9 @@ bsock_sendmsg_internal(VALUE sock, VALUE data, VALUE vflags,
|
||||
last_level = cmh.cmsg_level;
|
||||
last_type = cmh.cmsg_type;
|
||||
#endif
|
||||
last_pad = cspace - cmh.cmsg_len;
|
||||
last_pad = cspace - cmh.cmsg_len;
|
||||
}
|
||||
if (last_pad) {
|
||||
if (last_pad) {
|
||||
/*
|
||||
* This code removes the last padding from msg_controllen.
|
||||
*
|
||||
@ -1242,10 +1242,10 @@ bsock_sendmsg_internal(VALUE sock, VALUE data, VALUE vflags,
|
||||
if (last_level == SOL_SOCKET && last_type == SCM_RIGHTS)
|
||||
rb_str_set_len(controls_str, RSTRING_LEN(controls_str)-last_pad);
|
||||
#endif
|
||||
}
|
||||
RB_GC_GUARD(controls);
|
||||
}
|
||||
RB_GC_GUARD(controls);
|
||||
#else
|
||||
rb_raise(rb_eNotImpError, "control message for sendmsg is unimplemented");
|
||||
rb_raise(rb_eNotImpError, "control message for sendmsg is unimplemented");
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -1256,7 +1256,7 @@ bsock_sendmsg_internal(VALUE sock, VALUE data, VALUE vflags,
|
||||
#endif
|
||||
|
||||
if (!NIL_P(dest_sockaddr))
|
||||
SockAddrStringValue(dest_sockaddr);
|
||||
SockAddrStringValue(dest_sockaddr);
|
||||
|
||||
rb_io_check_closed(fptr);
|
||||
|
||||
@ -1284,20 +1284,20 @@ bsock_sendmsg_internal(VALUE sock, VALUE data, VALUE vflags,
|
||||
ss = rb_sendmsg(fptr->fd, &mh, flags);
|
||||
|
||||
if (ss == -1) {
|
||||
int e;
|
||||
int e;
|
||||
if (!nonblock && rb_io_maybe_wait_writable(errno, fptr->self, Qnil)) {
|
||||
rb_io_check_closed(fptr);
|
||||
goto retry;
|
||||
}
|
||||
e = errno;
|
||||
if (nonblock && (e == EWOULDBLOCK || e == EAGAIN)) {
|
||||
if (ex == Qfalse) {
|
||||
return sym_wait_writable;
|
||||
}
|
||||
rb_readwrite_syserr_fail(RB_IO_WAIT_WRITABLE, e,
|
||||
"sendmsg(2) would block");
|
||||
}
|
||||
rb_syserr_fail(e, "sendmsg(2)");
|
||||
e = errno;
|
||||
if (nonblock && (e == EWOULDBLOCK || e == EAGAIN)) {
|
||||
if (ex == Qfalse) {
|
||||
return sym_wait_writable;
|
||||
}
|
||||
rb_readwrite_syserr_fail(RB_IO_WAIT_WRITABLE, e,
|
||||
"sendmsg(2) would block");
|
||||
}
|
||||
rb_syserr_fail(e, "sendmsg(2)");
|
||||
}
|
||||
#if defined(HAVE_STRUCT_MSGHDR_MSG_CONTROL)
|
||||
RB_GC_GUARD(controls_str);
|
||||
@ -1311,20 +1311,20 @@ bsock_sendmsg_internal(VALUE sock, VALUE data, VALUE vflags,
|
||||
#if defined(HAVE_SENDMSG)
|
||||
VALUE
|
||||
rsock_bsock_sendmsg(VALUE sock, VALUE data, VALUE flags, VALUE dest_sockaddr,
|
||||
VALUE controls)
|
||||
VALUE controls)
|
||||
{
|
||||
return bsock_sendmsg_internal(sock, data, flags, dest_sockaddr, controls,
|
||||
Qtrue, 0);
|
||||
Qtrue, 0);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(HAVE_SENDMSG)
|
||||
VALUE
|
||||
rsock_bsock_sendmsg_nonblock(VALUE sock, VALUE data, VALUE flags,
|
||||
VALUE dest_sockaddr, VALUE controls, VALUE ex)
|
||||
VALUE dest_sockaddr, VALUE controls, VALUE ex)
|
||||
{
|
||||
return bsock_sendmsg_internal(sock, data, flags, dest_sockaddr,
|
||||
controls, ex, 1);
|
||||
controls, ex, 1);
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -1422,12 +1422,12 @@ make_io_for_unix_rights(VALUE ctl, struct cmsghdr *cmh, char *msg_end)
|
||||
{
|
||||
if (cmh->cmsg_level == SOL_SOCKET && cmh->cmsg_type == SCM_RIGHTS) {
|
||||
int *fdp, *end;
|
||||
VALUE ary = rb_ary_new();
|
||||
rb_ivar_set(ctl, rb_intern("unix_rights"), ary);
|
||||
VALUE ary = rb_ary_new();
|
||||
rb_ivar_set(ctl, rb_intern("unix_rights"), ary);
|
||||
fdp = (int *)CMSG_DATA(cmh);
|
||||
end = (int *)((char *)cmh + cmh->cmsg_len);
|
||||
while ((char *)fdp + sizeof(int) <= (char *)end &&
|
||||
(char *)fdp + sizeof(int) <= msg_end) {
|
||||
(char *)fdp + sizeof(int) <= msg_end) {
|
||||
int fd = *fdp;
|
||||
struct stat stbuf;
|
||||
VALUE io;
|
||||
@ -1443,15 +1443,15 @@ make_io_for_unix_rights(VALUE ctl, struct cmsghdr *cmh, char *msg_end)
|
||||
rb_ary_push(ary, io);
|
||||
fdp++;
|
||||
}
|
||||
OBJ_FREEZE(ary);
|
||||
OBJ_FREEZE(ary);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
static VALUE
|
||||
bsock_recvmsg_internal(VALUE sock,
|
||||
VALUE vmaxdatlen, VALUE vflags, VALUE vmaxctllen,
|
||||
VALUE scm_rights, VALUE ex, int nonblock)
|
||||
VALUE vmaxdatlen, VALUE vflags, VALUE vmaxctllen,
|
||||
VALUE scm_rights, VALUE ex, int nonblock)
|
||||
{
|
||||
rb_io_t *fptr;
|
||||
int grow_buffer;
|
||||
@ -1505,28 +1505,28 @@ bsock_recvmsg_internal(VALUE sock,
|
||||
|
||||
#if !defined(HAVE_STRUCT_MSGHDR_MSG_CONTROL)
|
||||
if (grow_buffer) {
|
||||
int socktype;
|
||||
socklen_t optlen = (socklen_t)sizeof(socktype);
|
||||
int socktype;
|
||||
socklen_t optlen = (socklen_t)sizeof(socktype);
|
||||
if (getsockopt(fptr->fd, SOL_SOCKET, SO_TYPE, (void*)&socktype, &optlen) == -1) {
|
||||
rb_sys_fail("getsockopt(SO_TYPE)");
|
||||
}
|
||||
if (socktype == SOCK_STREAM)
|
||||
grow_buffer = 0;
|
||||
rb_sys_fail("getsockopt(SO_TYPE)");
|
||||
}
|
||||
if (socktype == SOCK_STREAM)
|
||||
grow_buffer = 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
retry:
|
||||
if (NIL_P(dat_str))
|
||||
dat_str = rb_str_tmp_new(maxdatlen);
|
||||
dat_str = rb_str_tmp_new(maxdatlen);
|
||||
else
|
||||
rb_str_resize(dat_str, maxdatlen);
|
||||
rb_str_resize(dat_str, maxdatlen);
|
||||
datbuf = RSTRING_PTR(dat_str);
|
||||
|
||||
#if defined(HAVE_STRUCT_MSGHDR_MSG_CONTROL)
|
||||
if (NIL_P(ctl_str))
|
||||
ctl_str = rb_str_tmp_new(maxctllen);
|
||||
ctl_str = rb_str_tmp_new(maxctllen);
|
||||
else
|
||||
rb_str_resize(ctl_str, maxctllen);
|
||||
rb_str_resize(ctl_str, maxctllen);
|
||||
ctlbuf = RSTRING_PTR(ctl_str);
|
||||
#endif
|
||||
|
||||
@ -1556,20 +1556,20 @@ bsock_recvmsg_internal(VALUE sock,
|
||||
ss = rb_recvmsg(fptr->fd, &mh, flags);
|
||||
|
||||
if (ss == -1) {
|
||||
int e;
|
||||
int e;
|
||||
if (!nonblock && rb_io_maybe_wait_readable(errno, fptr->self, Qnil)) {
|
||||
rb_io_check_closed(fptr);
|
||||
goto retry;
|
||||
}
|
||||
e = errno;
|
||||
if (nonblock && (e == EWOULDBLOCK || e == EAGAIN)) {
|
||||
e = errno;
|
||||
if (nonblock && (e == EWOULDBLOCK || e == EAGAIN)) {
|
||||
if (ex == Qfalse) {
|
||||
return sym_wait_readable;
|
||||
}
|
||||
rb_readwrite_syserr_fail(RB_IO_WAIT_READABLE, e, "recvmsg(2) would block");
|
||||
rb_readwrite_syserr_fail(RB_IO_WAIT_READABLE, e, "recvmsg(2) would block");
|
||||
}
|
||||
#if defined(HAVE_STRUCT_MSGHDR_MSG_CONTROL)
|
||||
if (!gc_done && (e == EMFILE || e == EMSGSIZE)) {
|
||||
if (!gc_done && (e == EMFILE || e == EMSGSIZE)) {
|
||||
/*
|
||||
* When SCM_RIGHTS hit the file descriptors limit:
|
||||
* - Linux 2.6.18 causes success with MSG_CTRUNC
|
||||
@ -1579,24 +1579,24 @@ bsock_recvmsg_internal(VALUE sock,
|
||||
gc_and_retry:
|
||||
rb_gc();
|
||||
gc_done = 1;
|
||||
goto retry;
|
||||
goto retry;
|
||||
}
|
||||
#else
|
||||
if (NIL_P(vmaxdatlen) && grow_buffer && e == EMSGSIZE)
|
||||
ss = (ssize_t)iov.iov_len;
|
||||
else
|
||||
if (NIL_P(vmaxdatlen) && grow_buffer && e == EMSGSIZE)
|
||||
ss = (ssize_t)iov.iov_len;
|
||||
else
|
||||
#endif
|
||||
rb_syserr_fail(e, "recvmsg(2)");
|
||||
rb_syserr_fail(e, "recvmsg(2)");
|
||||
}
|
||||
|
||||
if (grow_buffer) {
|
||||
int grown = 0;
|
||||
if (NIL_P(vmaxdatlen) && ss != -1 && ss == (ssize_t)iov.iov_len) {
|
||||
int grown = 0;
|
||||
if (NIL_P(vmaxdatlen) && ss != -1 && ss == (ssize_t)iov.iov_len) {
|
||||
if (SIZE_MAX/2 < maxdatlen)
|
||||
rb_raise(rb_eArgError, "max data length too big");
|
||||
maxdatlen *= 2;
|
||||
grown = 1;
|
||||
}
|
||||
maxdatlen *= 2;
|
||||
grown = 1;
|
||||
}
|
||||
#if defined(HAVE_STRUCT_MSGHDR_MSG_CONTROL)
|
||||
if (NIL_P(vmaxctllen) && (mh.msg_flags & MSG_CTRUNC)) {
|
||||
#define BIG_ENOUGH_SPACE 65536
|
||||
@ -1605,9 +1605,9 @@ bsock_recvmsg_internal(VALUE sock,
|
||||
/* there are big space bug truncated.
|
||||
* file descriptors limit? */
|
||||
if (!gc_done) {
|
||||
rsock_discard_cmsg_resource(&mh, (flags & MSG_PEEK) != 0);
|
||||
rsock_discard_cmsg_resource(&mh, (flags & MSG_PEEK) != 0);
|
||||
goto gc_and_retry;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (SIZE_MAX/2 < maxctllen)
|
||||
@ -1616,13 +1616,13 @@ bsock_recvmsg_internal(VALUE sock,
|
||||
grown = 1;
|
||||
}
|
||||
#undef BIG_ENOUGH_SPACE
|
||||
}
|
||||
}
|
||||
#endif
|
||||
if (grown) {
|
||||
if (grown) {
|
||||
rsock_discard_cmsg_resource(&mh, (flags & MSG_PEEK) != 0);
|
||||
goto retry;
|
||||
}
|
||||
else {
|
||||
goto retry;
|
||||
}
|
||||
else {
|
||||
grow_buffer = 0;
|
||||
if (flags != orig_flags) {
|
||||
rsock_discard_cmsg_resource(&mh, (flags & MSG_PEEK) != 0);
|
||||
@ -1636,31 +1636,31 @@ bsock_recvmsg_internal(VALUE sock,
|
||||
dat_str = rb_str_new(datbuf, ss);
|
||||
else {
|
||||
rb_str_resize(dat_str, ss);
|
||||
rb_obj_reveal(dat_str, rb_cString);
|
||||
rb_obj_reveal(dat_str, rb_cString);
|
||||
}
|
||||
|
||||
ret = rb_ary_new3(3, dat_str,
|
||||
rsock_io_socket_addrinfo(sock, mh.msg_name, mh.msg_namelen),
|
||||
#if defined(HAVE_STRUCT_MSGHDR_MSG_CONTROL)
|
||||
INT2NUM(mh.msg_flags)
|
||||
INT2NUM(mh.msg_flags)
|
||||
#else
|
||||
Qnil
|
||||
Qnil
|
||||
#endif
|
||||
);
|
||||
);
|
||||
|
||||
#if defined(HAVE_STRUCT_MSGHDR_MSG_CONTROL)
|
||||
family = rsock_getfamily(fptr);
|
||||
if (mh.msg_controllen) {
|
||||
char *msg_end = (char *)mh.msg_control + mh.msg_controllen;
|
||||
char *msg_end = (char *)mh.msg_control + mh.msg_controllen;
|
||||
for (cmh = CMSG_FIRSTHDR(&mh); cmh != NULL; cmh = CMSG_NXTHDR(&mh, cmh)) {
|
||||
VALUE ctl;
|
||||
char *ctl_end;
|
||||
char *ctl_end;
|
||||
size_t clen;
|
||||
if (cmh->cmsg_len == 0) {
|
||||
rb_raise(rb_eTypeError, "invalid control message (cmsg_len == 0)");
|
||||
}
|
||||
ctl_end = (char*)cmh + cmh->cmsg_len;
|
||||
clen = (ctl_end <= msg_end ? ctl_end : msg_end) - (char*)CMSG_DATA(cmh);
|
||||
clen = (ctl_end <= msg_end ? ctl_end : msg_end) - (char*)CMSG_DATA(cmh);
|
||||
ctl = ancdata_new(family, cmh->cmsg_level, cmh->cmsg_type, rb_str_new((char*)CMSG_DATA(cmh), clen));
|
||||
if (request_scm_rights)
|
||||
make_io_for_unix_rights(ctl, cmh, msg_end);
|
||||
@ -1679,7 +1679,7 @@ bsock_recvmsg_internal(VALUE sock,
|
||||
#if defined(HAVE_RECVMSG)
|
||||
VALUE
|
||||
rsock_bsock_recvmsg(VALUE sock, VALUE dlen, VALUE flags, VALUE clen,
|
||||
VALUE scm_rights)
|
||||
VALUE scm_rights)
|
||||
{
|
||||
VALUE ex = Qtrue;
|
||||
return bsock_recvmsg_internal(sock, dlen, flags, clen, scm_rights, ex, 0);
|
||||
@ -1689,7 +1689,7 @@ rsock_bsock_recvmsg(VALUE sock, VALUE dlen, VALUE flags, VALUE clen,
|
||||
#if defined(HAVE_RECVMSG)
|
||||
VALUE
|
||||
rsock_bsock_recvmsg_nonblock(VALUE sock, VALUE dlen, VALUE flags, VALUE clen,
|
||||
VALUE scm_rights, VALUE ex)
|
||||
VALUE scm_rights, VALUE ex)
|
||||
{
|
||||
return bsock_recvmsg_internal(sock, dlen, flags, clen, scm_rights, ex, 1);
|
||||
}
|
||||
|
@ -94,16 +94,16 @@ bsock_shutdown(int argc, VALUE *argv, VALUE sock)
|
||||
|
||||
rb_scan_args(argc, argv, "01", &howto);
|
||||
if (howto == Qnil)
|
||||
how = SHUT_RDWR;
|
||||
how = SHUT_RDWR;
|
||||
else {
|
||||
how = rsock_shutdown_how_arg(howto);
|
||||
how = rsock_shutdown_how_arg(howto);
|
||||
if (how != SHUT_WR && how != SHUT_RD && how != SHUT_RDWR) {
|
||||
rb_raise(rb_eArgError, "`how' should be either :SHUT_RD, :SHUT_WR, :SHUT_RDWR");
|
||||
}
|
||||
rb_raise(rb_eArgError, "`how' should be either :SHUT_RD, :SHUT_WR, :SHUT_RDWR");
|
||||
}
|
||||
}
|
||||
GetOpenFile(sock, fptr);
|
||||
if (shutdown(fptr->fd, how) == -1)
|
||||
rb_sys_fail("shutdown(2)");
|
||||
rb_sys_fail("shutdown(2)");
|
||||
|
||||
return INT2FIX(0);
|
||||
}
|
||||
@ -126,7 +126,7 @@ bsock_close_read(VALUE sock)
|
||||
GetOpenFile(sock, fptr);
|
||||
shutdown(fptr->fd, 0);
|
||||
if (!(fptr->mode & FMODE_WRITABLE)) {
|
||||
return rb_io_close(sock);
|
||||
return rb_io_close(sock);
|
||||
}
|
||||
fptr->mode &= ~FMODE_READABLE;
|
||||
|
||||
@ -155,7 +155,7 @@ bsock_close_write(VALUE sock)
|
||||
|
||||
GetOpenFile(sock, fptr);
|
||||
if (!(fptr->mode & FMODE_READABLE)) {
|
||||
return rb_io_close(sock);
|
||||
return rb_io_close(sock);
|
||||
}
|
||||
shutdown(fptr->fd, 1);
|
||||
fptr->mode &= ~FMODE_WRITABLE;
|
||||
@ -246,21 +246,21 @@ bsock_setsockopt(int argc, VALUE *argv, VALUE sock)
|
||||
|
||||
switch (TYPE(val)) {
|
||||
case T_FIXNUM:
|
||||
i = FIX2INT(val);
|
||||
goto numval;
|
||||
i = FIX2INT(val);
|
||||
goto numval;
|
||||
case T_FALSE:
|
||||
i = 0;
|
||||
goto numval;
|
||||
i = 0;
|
||||
goto numval;
|
||||
case T_TRUE:
|
||||
i = 1;
|
||||
i = 1;
|
||||
numval:
|
||||
v = (char*)&i; vlen = (int)sizeof(i);
|
||||
break;
|
||||
v = (char*)&i; vlen = (int)sizeof(i);
|
||||
break;
|
||||
default:
|
||||
StringValue(val);
|
||||
v = RSTRING_PTR(val);
|
||||
vlen = RSTRING_SOCKLEN(val);
|
||||
break;
|
||||
StringValue(val);
|
||||
v = RSTRING_PTR(val);
|
||||
vlen = RSTRING_SOCKLEN(val);
|
||||
break;
|
||||
}
|
||||
|
||||
rb_io_check_closed(fptr);
|
||||
@ -357,7 +357,7 @@ bsock_getsockopt(VALUE sock, VALUE lev, VALUE optname)
|
||||
rb_io_check_closed(fptr);
|
||||
|
||||
if (getsockopt(fptr->fd, level, option, buf, &len) < 0)
|
||||
rsock_sys_fail_path("getsockopt(2)", fptr->pathv);
|
||||
rsock_sys_fail_path("getsockopt(2)", fptr->pathv);
|
||||
|
||||
return rsock_sockopt_new(family, level, option, rb_str_new(buf, len));
|
||||
}
|
||||
@ -385,7 +385,7 @@ bsock_getsockname(VALUE sock)
|
||||
|
||||
GetOpenFile(sock, fptr);
|
||||
if (getsockname(fptr->fd, &buf.addr, &len) < 0)
|
||||
rb_sys_fail("getsockname(2)");
|
||||
rb_sys_fail("getsockname(2)");
|
||||
if (len0 < len) len = len0;
|
||||
return rb_str_new((char*)&buf, len);
|
||||
}
|
||||
@ -416,7 +416,7 @@ bsock_getpeername(VALUE sock)
|
||||
|
||||
GetOpenFile(sock, fptr);
|
||||
if (getpeername(fptr->fd, &buf.addr, &len) < 0)
|
||||
rb_sys_fail("getpeername(2)");
|
||||
rb_sys_fail("getpeername(2)");
|
||||
if (len0 < len) len = len0;
|
||||
return rb_str_new((char*)&buf, len);
|
||||
}
|
||||
@ -453,7 +453,7 @@ bsock_getpeereid(VALUE self)
|
||||
gid_t egid;
|
||||
GetOpenFile(self, fptr);
|
||||
if (getpeereid(fptr->fd, &euid, &egid) == -1)
|
||||
rb_sys_fail("getpeereid(3)");
|
||||
rb_sys_fail("getpeereid(3)");
|
||||
return rb_assoc_new(UIDT2NUM(euid), GIDT2NUM(egid));
|
||||
#elif defined(SO_PEERCRED) /* GNU/Linux */
|
||||
rb_io_t *fptr;
|
||||
@ -461,7 +461,7 @@ bsock_getpeereid(VALUE self)
|
||||
socklen_t len = sizeof(cred);
|
||||
GetOpenFile(self, fptr);
|
||||
if (getsockopt(fptr->fd, SOL_SOCKET, SO_PEERCRED, &cred, &len) == -1)
|
||||
rb_sys_fail("getsockopt(SO_PEERCRED)");
|
||||
rb_sys_fail("getsockopt(SO_PEERCRED)");
|
||||
return rb_assoc_new(UIDT2NUM(cred.uid), GIDT2NUM(cred.gid));
|
||||
#elif defined(HAVE_GETPEERUCRED) /* Solaris */
|
||||
rb_io_t *fptr;
|
||||
@ -469,7 +469,7 @@ bsock_getpeereid(VALUE self)
|
||||
VALUE ret;
|
||||
GetOpenFile(self, fptr);
|
||||
if (getpeerucred(fptr->fd, &uc) == -1)
|
||||
rb_sys_fail("getpeerucred(3C)");
|
||||
rb_sys_fail("getpeerucred(3C)");
|
||||
ret = rb_assoc_new(UIDT2NUM(ucred_geteuid(uc)), GIDT2NUM(ucred_getegid(uc)));
|
||||
ucred_free(uc);
|
||||
return ret;
|
||||
@ -506,7 +506,7 @@ bsock_local_address(VALUE sock)
|
||||
|
||||
GetOpenFile(sock, fptr);
|
||||
if (getsockname(fptr->fd, &buf.addr, &len) < 0)
|
||||
rb_sys_fail("getsockname(2)");
|
||||
rb_sys_fail("getsockname(2)");
|
||||
if (len0 < len) len = len0;
|
||||
return rsock_fd_socket_addrinfo(fptr->fd, &buf.addr, len);
|
||||
}
|
||||
@ -540,7 +540,7 @@ bsock_remote_address(VALUE sock)
|
||||
|
||||
GetOpenFile(sock, fptr);
|
||||
if (getpeername(fptr->fd, &buf.addr, &len) < 0)
|
||||
rb_sys_fail("getpeername(2)");
|
||||
rb_sys_fail("getpeername(2)");
|
||||
if (len0 < len) len = len0;
|
||||
return rsock_fd_socket_addrinfo(fptr->fd, &buf.addr, len);
|
||||
}
|
||||
@ -656,10 +656,10 @@ bsock_do_not_reverse_lookup_set(VALUE sock, VALUE state)
|
||||
|
||||
GetOpenFile(sock, fptr);
|
||||
if (RTEST(state)) {
|
||||
fptr->mode |= FMODE_NOREVLOOKUP;
|
||||
fptr->mode |= FMODE_NOREVLOOKUP;
|
||||
}
|
||||
else {
|
||||
fptr->mode &= ~FMODE_NOREVLOOKUP;
|
||||
fptr->mode &= ~FMODE_NOREVLOOKUP;
|
||||
}
|
||||
return sock;
|
||||
}
|
||||
@ -747,9 +747,9 @@ rsock_init_basicsocket(void)
|
||||
rb_undef_method(rb_cBasicSocket, "initialize");
|
||||
|
||||
rb_define_singleton_method(rb_cBasicSocket, "do_not_reverse_lookup",
|
||||
bsock_do_not_rev_lookup, 0);
|
||||
bsock_do_not_rev_lookup, 0);
|
||||
rb_define_singleton_method(rb_cBasicSocket, "do_not_reverse_lookup=",
|
||||
bsock_do_not_rev_lookup_set, 1);
|
||||
bsock_do_not_rev_lookup_set, 1);
|
||||
rb_define_singleton_method(rb_cBasicSocket, "for_fd", bsock_s_for_fd, 1);
|
||||
|
||||
rb_define_method(rb_cBasicSocket, "close_read", bsock_close_read, 0);
|
||||
@ -770,23 +770,23 @@ rsock_init_basicsocket(void)
|
||||
|
||||
/* for ext/socket/lib/socket.rb use only: */
|
||||
rb_define_private_method(rb_cBasicSocket,
|
||||
"__recv_nonblock", bsock_recv_nonblock, 4);
|
||||
"__recv_nonblock", bsock_recv_nonblock, 4);
|
||||
|
||||
#if MSG_DONTWAIT_RELIABLE
|
||||
rb_define_private_method(rb_cBasicSocket,
|
||||
"__read_nonblock", rsock_read_nonblock, 3);
|
||||
"__read_nonblock", rsock_read_nonblock, 3);
|
||||
rb_define_private_method(rb_cBasicSocket,
|
||||
"__write_nonblock", rsock_write_nonblock, 2);
|
||||
"__write_nonblock", rsock_write_nonblock, 2);
|
||||
#endif
|
||||
|
||||
/* in ancdata.c */
|
||||
rb_define_private_method(rb_cBasicSocket, "__sendmsg",
|
||||
rsock_bsock_sendmsg, 4);
|
||||
rsock_bsock_sendmsg, 4);
|
||||
rb_define_private_method(rb_cBasicSocket, "__sendmsg_nonblock",
|
||||
rsock_bsock_sendmsg_nonblock, 5);
|
||||
rsock_bsock_sendmsg_nonblock, 5);
|
||||
rb_define_private_method(rb_cBasicSocket, "__recvmsg",
|
||||
rsock_bsock_recvmsg, 4);
|
||||
rsock_bsock_recvmsg, 4);
|
||||
rb_define_private_method(rb_cBasicSocket, "__recvmsg_nonblock",
|
||||
rsock_bsock_recvmsg_nonblock, 5);
|
||||
rsock_bsock_recvmsg_nonblock, 5);
|
||||
|
||||
}
|
||||
|
@ -26,14 +26,14 @@ constant_arg(VALUE arg, int (*str_to_int)(const char*, long, int*), const char *
|
||||
goto str;
|
||||
}
|
||||
else if (!NIL_P(tmp = rb_check_string_type(arg))) {
|
||||
arg = tmp;
|
||||
arg = tmp;
|
||||
str:
|
||||
ptr = RSTRING_PTR(arg);
|
||||
if (str_to_int(ptr, RSTRING_LEN(arg), &ret) == -1)
|
||||
rb_raise(rb_eSocket, "%s: %s", errmsg, ptr);
|
||||
rb_raise(rb_eSocket, "%s: %s", errmsg, ptr);
|
||||
}
|
||||
else {
|
||||
ret = NUM2INT(arg);
|
||||
ret = NUM2INT(arg);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
@ -98,42 +98,42 @@ static struct in6_addr faith_prefix = IN6ADDR_ANY_INIT;
|
||||
|
||||
static const char in_addrany[] = { 0, 0, 0, 0 };
|
||||
static const char in6_addrany[] = {
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
||||
};
|
||||
static const char in_loopback[] = { 127, 0, 0, 1 };
|
||||
static const char in6_loopback[] = {
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1
|
||||
};
|
||||
|
||||
struct sockinet {
|
||||
u_char si_len;
|
||||
u_char si_family;
|
||||
u_short si_port;
|
||||
u_char si_len;
|
||||
u_char si_family;
|
||||
u_short si_port;
|
||||
};
|
||||
|
||||
static const struct afd {
|
||||
int a_af;
|
||||
int a_addrlen;
|
||||
int a_socklen;
|
||||
int a_off;
|
||||
const char *a_addrany;
|
||||
const char *a_loopback;
|
||||
int a_af;
|
||||
int a_addrlen;
|
||||
int a_socklen;
|
||||
int a_off;
|
||||
const char *a_addrany;
|
||||
const char *a_loopback;
|
||||
} afdl [] = {
|
||||
#ifdef INET6
|
||||
#define N_INET6 0
|
||||
{PF_INET6, sizeof(struct in6_addr),
|
||||
sizeof(struct sockaddr_in6),
|
||||
offsetof(struct sockaddr_in6, sin6_addr),
|
||||
in6_addrany, in6_loopback},
|
||||
{PF_INET6, sizeof(struct in6_addr),
|
||||
sizeof(struct sockaddr_in6),
|
||||
offsetof(struct sockaddr_in6, sin6_addr),
|
||||
in6_addrany, in6_loopback},
|
||||
#define N_INET 1
|
||||
#else
|
||||
#define N_INET 0
|
||||
#endif
|
||||
{PF_INET, sizeof(struct in_addr),
|
||||
sizeof(struct sockaddr_in),
|
||||
offsetof(struct sockaddr_in, sin_addr),
|
||||
in_addrany, in_loopback},
|
||||
{0, 0, 0, 0, NULL, NULL},
|
||||
{PF_INET, sizeof(struct in_addr),
|
||||
sizeof(struct sockaddr_in),
|
||||
offsetof(struct sockaddr_in, sin_addr),
|
||||
in_addrany, in_loopback},
|
||||
{0, 0, 0, 0, NULL, NULL},
|
||||
};
|
||||
|
||||
#ifdef INET6
|
||||
@ -143,58 +143,58 @@ static const struct afd {
|
||||
#endif
|
||||
|
||||
static int get_name __P((const char *, const struct afd *,
|
||||
struct addrinfo **, char *, struct addrinfo *,
|
||||
int));
|
||||
struct addrinfo **, char *, struct addrinfo *,
|
||||
int));
|
||||
static int get_addr __P((const char *, int, struct addrinfo **,
|
||||
struct addrinfo *, int));
|
||||
struct addrinfo *, int));
|
||||
static int str_isnumber __P((const char *));
|
||||
|
||||
#ifndef HAVE_GAI_STRERROR
|
||||
static const char *const ai_errlist[] = {
|
||||
"success.",
|
||||
"address family for hostname not supported.", /* EAI_ADDRFAMILY */
|
||||
"temporary failure in name resolution.", /* EAI_AGAIN */
|
||||
"invalid value for ai_flags.", /* EAI_BADFLAGS */
|
||||
"non-recoverable failure in name resolution.", /* EAI_FAIL */
|
||||
"ai_family not supported.", /* EAI_FAMILY */
|
||||
"memory allocation failure.", /* EAI_MEMORY */
|
||||
"no address associated with hostname.", /* EAI_NODATA */
|
||||
"hostname nor servname provided, or not known.",/* EAI_NONAME */
|
||||
"servname not supported for ai_socktype.", /* EAI_SERVICE */
|
||||
"ai_socktype not supported.", /* EAI_SOCKTYPE */
|
||||
"system error returned in errno.", /* EAI_SYSTEM */
|
||||
"invalid value for hints.", /* EAI_BADHINTS */
|
||||
"resolved protocol is unknown.", /* EAI_PROTOCOL */
|
||||
"unknown error.", /* EAI_MAX */
|
||||
"success.",
|
||||
"address family for hostname not supported.", /* EAI_ADDRFAMILY */
|
||||
"temporary failure in name resolution.", /* EAI_AGAIN */
|
||||
"invalid value for ai_flags.", /* EAI_BADFLAGS */
|
||||
"non-recoverable failure in name resolution.", /* EAI_FAIL */
|
||||
"ai_family not supported.", /* EAI_FAMILY */
|
||||
"memory allocation failure.", /* EAI_MEMORY */
|
||||
"no address associated with hostname.", /* EAI_NODATA */
|
||||
"hostname nor servname provided, or not known.",/* EAI_NONAME */
|
||||
"servname not supported for ai_socktype.", /* EAI_SERVICE */
|
||||
"ai_socktype not supported.", /* EAI_SOCKTYPE */
|
||||
"system error returned in errno.", /* EAI_SYSTEM */
|
||||
"invalid value for hints.", /* EAI_BADHINTS */
|
||||
"resolved protocol is unknown.", /* EAI_PROTOCOL */
|
||||
"unknown error.", /* EAI_MAX */
|
||||
};
|
||||
#endif
|
||||
|
||||
#define GET_CANONNAME(ai, str) \
|
||||
if (pai->ai_flags & AI_CANONNAME) {\
|
||||
if (((ai)->ai_canonname = (char *)malloc(strlen(str) + 1)) != NULL) {\
|
||||
strcpy((ai)->ai_canonname, (str));\
|
||||
} else {\
|
||||
error = EAI_MEMORY;\
|
||||
goto free;\
|
||||
}\
|
||||
if (((ai)->ai_canonname = (char *)malloc(strlen(str) + 1)) != NULL) {\
|
||||
strcpy((ai)->ai_canonname, (str));\
|
||||
} else {\
|
||||
error = EAI_MEMORY;\
|
||||
goto free;\
|
||||
}\
|
||||
}
|
||||
|
||||
#define GET_AI(ai, afd, addr, port) {\
|
||||
char *p;\
|
||||
if (((ai) = (struct addrinfo *)malloc(sizeof(struct addrinfo) +\
|
||||
((afd)->a_socklen)))\
|
||||
== NULL) {\
|
||||
error = EAI_MEMORY;\
|
||||
goto free;\
|
||||
}\
|
||||
memcpy((ai), pai, sizeof(struct addrinfo));\
|
||||
(ai)->ai_addr = (struct sockaddr *)((ai) + 1);\
|
||||
(ai)->ai_family = (afd)->a_af;\
|
||||
(ai)->ai_addrlen = (afd)->a_socklen;\
|
||||
INIT_SOCKADDR((ai)->ai_addr, (afd)->a_af, (afd)->a_socklen);\
|
||||
((struct sockinet *)(ai)->ai_addr)->si_port = (port);\
|
||||
p = (char *)((ai)->ai_addr);\
|
||||
memcpy(p + (afd)->a_off, (addr), (afd)->a_addrlen);\
|
||||
char *p;\
|
||||
if (((ai) = (struct addrinfo *)malloc(sizeof(struct addrinfo) +\
|
||||
((afd)->a_socklen)))\
|
||||
== NULL) {\
|
||||
error = EAI_MEMORY;\
|
||||
goto free;\
|
||||
}\
|
||||
memcpy((ai), pai, sizeof(struct addrinfo));\
|
||||
(ai)->ai_addr = (struct sockaddr *)((ai) + 1);\
|
||||
(ai)->ai_family = (afd)->a_af;\
|
||||
(ai)->ai_addrlen = (afd)->a_socklen;\
|
||||
INIT_SOCKADDR((ai)->ai_addr, (afd)->a_af, (afd)->a_socklen);\
|
||||
((struct sockinet *)(ai)->ai_addr)->si_port = (port);\
|
||||
p = (char *)((ai)->ai_addr);\
|
||||
memcpy(p + (afd)->a_off, (addr), (afd)->a_addrlen);\
|
||||
}
|
||||
|
||||
#define ERR(err) { error = (err); goto bad; }
|
||||
@ -206,36 +206,36 @@ const
|
||||
char *
|
||||
gai_strerror(int ecode)
|
||||
{
|
||||
if (ecode < 0 || ecode > EAI_MAX)
|
||||
ecode = EAI_MAX;
|
||||
return (char *)ai_errlist[ecode];
|
||||
if (ecode < 0 || ecode > EAI_MAX)
|
||||
ecode = EAI_MAX;
|
||||
return (char *)ai_errlist[ecode];
|
||||
}
|
||||
#endif
|
||||
|
||||
void
|
||||
freeaddrinfo(struct addrinfo *ai)
|
||||
{
|
||||
struct addrinfo *next;
|
||||
struct addrinfo *next;
|
||||
|
||||
do {
|
||||
next = ai->ai_next;
|
||||
if (ai->ai_canonname)
|
||||
free(ai->ai_canonname);
|
||||
/* no need to free(ai->ai_addr) */
|
||||
free(ai);
|
||||
} while ((ai = next) != NULL);
|
||||
do {
|
||||
next = ai->ai_next;
|
||||
if (ai->ai_canonname)
|
||||
free(ai->ai_canonname);
|
||||
/* no need to free(ai->ai_addr) */
|
||||
free(ai);
|
||||
} while ((ai = next) != NULL);
|
||||
}
|
||||
|
||||
static int
|
||||
str_isnumber(const char *p)
|
||||
{
|
||||
char *q = (char *)p;
|
||||
while (*q) {
|
||||
if (! isdigit(*q))
|
||||
return NO;
|
||||
q++;
|
||||
}
|
||||
return YES;
|
||||
char *q = (char *)p;
|
||||
while (*q) {
|
||||
if (! isdigit(*q))
|
||||
return NO;
|
||||
q++;
|
||||
}
|
||||
return YES;
|
||||
}
|
||||
|
||||
#ifndef HAVE_INET_PTON
|
||||
@ -243,435 +243,435 @@ str_isnumber(const char *p)
|
||||
static int
|
||||
inet_pton(int af, const char *hostname, void *pton)
|
||||
{
|
||||
struct in_addr in;
|
||||
struct in_addr in;
|
||||
|
||||
#ifdef HAVE_INET_ATON
|
||||
if (!inet_aton(hostname, &in))
|
||||
return 0;
|
||||
if (!inet_aton(hostname, &in))
|
||||
return 0;
|
||||
#else
|
||||
int d1, d2, d3, d4;
|
||||
char ch;
|
||||
int d1, d2, d3, d4;
|
||||
char ch;
|
||||
|
||||
if (sscanf(hostname, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
|
||||
0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
|
||||
0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
|
||||
in.s_addr = htonl(
|
||||
((long) d1 << 24) | ((long) d2 << 16) |
|
||||
((long) d3 << 8) | ((long) d4 << 0));
|
||||
}
|
||||
else {
|
||||
return 0;
|
||||
}
|
||||
if (sscanf(hostname, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
|
||||
0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
|
||||
0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
|
||||
in.s_addr = htonl(
|
||||
((long) d1 << 24) | ((long) d2 << 16) |
|
||||
((long) d3 << 8) | ((long) d4 << 0));
|
||||
}
|
||||
else {
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
memcpy(pton, &in, sizeof(in));
|
||||
return 1;
|
||||
memcpy(pton, &in, sizeof(in));
|
||||
return 1;
|
||||
}
|
||||
#endif
|
||||
|
||||
int
|
||||
getaddrinfo(const char *hostname, const char *servname, const struct addrinfo *hints, struct addrinfo **res)
|
||||
{
|
||||
struct addrinfo sentinel;
|
||||
struct addrinfo *top = NULL;
|
||||
struct addrinfo *cur;
|
||||
int i, error = 0;
|
||||
char pton[PTON_MAX];
|
||||
struct addrinfo ai;
|
||||
struct addrinfo *pai;
|
||||
u_short port;
|
||||
struct addrinfo sentinel;
|
||||
struct addrinfo *top = NULL;
|
||||
struct addrinfo *cur;
|
||||
int i, error = 0;
|
||||
char pton[PTON_MAX];
|
||||
struct addrinfo ai;
|
||||
struct addrinfo *pai;
|
||||
u_short port;
|
||||
|
||||
#ifdef FAITH
|
||||
static int firsttime = 1;
|
||||
static int firsttime = 1;
|
||||
|
||||
if (firsttime) {
|
||||
/* translator hack */
|
||||
{
|
||||
char *q = getenv("GAI");
|
||||
if (q && inet_pton(AF_INET6, q, &faith_prefix) == 1)
|
||||
translate = YES;
|
||||
}
|
||||
firsttime = 0;
|
||||
}
|
||||
if (firsttime) {
|
||||
/* translator hack */
|
||||
{
|
||||
char *q = getenv("GAI");
|
||||
if (q && inet_pton(AF_INET6, q, &faith_prefix) == 1)
|
||||
translate = YES;
|
||||
}
|
||||
firsttime = 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* initialize file static vars */
|
||||
sentinel.ai_next = NULL;
|
||||
cur = &sentinel;
|
||||
pai = &ai;
|
||||
pai->ai_flags = 0;
|
||||
pai->ai_family = PF_UNSPEC;
|
||||
pai->ai_socktype = ANY;
|
||||
pai->ai_protocol = ANY;
|
||||
pai->ai_addrlen = 0;
|
||||
pai->ai_canonname = NULL;
|
||||
pai->ai_addr = NULL;
|
||||
pai->ai_next = NULL;
|
||||
port = ANY;
|
||||
/* initialize file static vars */
|
||||
sentinel.ai_next = NULL;
|
||||
cur = &sentinel;
|
||||
pai = &ai;
|
||||
pai->ai_flags = 0;
|
||||
pai->ai_family = PF_UNSPEC;
|
||||
pai->ai_socktype = ANY;
|
||||
pai->ai_protocol = ANY;
|
||||
pai->ai_addrlen = 0;
|
||||
pai->ai_canonname = NULL;
|
||||
pai->ai_addr = NULL;
|
||||
pai->ai_next = NULL;
|
||||
port = ANY;
|
||||
|
||||
if (hostname == NULL && servname == NULL)
|
||||
return EAI_NONAME;
|
||||
if (hints) {
|
||||
/* error check for hints */
|
||||
if (hints->ai_addrlen || hints->ai_canonname ||
|
||||
hints->ai_addr || hints->ai_next)
|
||||
ERR(EAI_BADHINTS); /* xxx */
|
||||
if (hints->ai_flags & ~AI_MASK)
|
||||
ERR(EAI_BADFLAGS);
|
||||
switch (hints->ai_family) {
|
||||
case PF_UNSPEC:
|
||||
case PF_INET:
|
||||
if (hostname == NULL && servname == NULL)
|
||||
return EAI_NONAME;
|
||||
if (hints) {
|
||||
/* error check for hints */
|
||||
if (hints->ai_addrlen || hints->ai_canonname ||
|
||||
hints->ai_addr || hints->ai_next)
|
||||
ERR(EAI_BADHINTS); /* xxx */
|
||||
if (hints->ai_flags & ~AI_MASK)
|
||||
ERR(EAI_BADFLAGS);
|
||||
switch (hints->ai_family) {
|
||||
case PF_UNSPEC:
|
||||
case PF_INET:
|
||||
#ifdef INET6
|
||||
case PF_INET6:
|
||||
case PF_INET6:
|
||||
#endif
|
||||
break;
|
||||
default:
|
||||
ERR(EAI_FAMILY);
|
||||
}
|
||||
memcpy(pai, hints, sizeof(*pai));
|
||||
switch (pai->ai_socktype) {
|
||||
case ANY:
|
||||
switch (pai->ai_protocol) {
|
||||
case ANY:
|
||||
break;
|
||||
case IPPROTO_UDP:
|
||||
pai->ai_socktype = SOCK_DGRAM;
|
||||
break;
|
||||
case IPPROTO_TCP:
|
||||
pai->ai_socktype = SOCK_STREAM;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
default:
|
||||
ERR(EAI_FAMILY);
|
||||
}
|
||||
memcpy(pai, hints, sizeof(*pai));
|
||||
switch (pai->ai_socktype) {
|
||||
case ANY:
|
||||
switch (pai->ai_protocol) {
|
||||
case ANY:
|
||||
break;
|
||||
case IPPROTO_UDP:
|
||||
pai->ai_socktype = SOCK_DGRAM;
|
||||
break;
|
||||
case IPPROTO_TCP:
|
||||
pai->ai_socktype = SOCK_STREAM;
|
||||
break;
|
||||
default:
|
||||
#if defined(SOCK_RAW)
|
||||
pai->ai_socktype = SOCK_RAW;
|
||||
pai->ai_socktype = SOCK_RAW;
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
break;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
#if defined(SOCK_RAW)
|
||||
case SOCK_RAW:
|
||||
break;
|
||||
case SOCK_RAW:
|
||||
break;
|
||||
#endif
|
||||
case SOCK_DGRAM:
|
||||
if (pai->ai_protocol != IPPROTO_UDP &&
|
||||
pai->ai_protocol != ANY)
|
||||
ERR(EAI_BADHINTS); /*xxx*/
|
||||
pai->ai_protocol = IPPROTO_UDP;
|
||||
break;
|
||||
case SOCK_STREAM:
|
||||
if (pai->ai_protocol != IPPROTO_TCP &&
|
||||
pai->ai_protocol != ANY)
|
||||
ERR(EAI_BADHINTS); /*xxx*/
|
||||
pai->ai_protocol = IPPROTO_TCP;
|
||||
break;
|
||||
default:
|
||||
ERR(EAI_SOCKTYPE);
|
||||
break;
|
||||
}
|
||||
}
|
||||
case SOCK_DGRAM:
|
||||
if (pai->ai_protocol != IPPROTO_UDP &&
|
||||
pai->ai_protocol != ANY)
|
||||
ERR(EAI_BADHINTS); /*xxx*/
|
||||
pai->ai_protocol = IPPROTO_UDP;
|
||||
break;
|
||||
case SOCK_STREAM:
|
||||
if (pai->ai_protocol != IPPROTO_TCP &&
|
||||
pai->ai_protocol != ANY)
|
||||
ERR(EAI_BADHINTS); /*xxx*/
|
||||
pai->ai_protocol = IPPROTO_TCP;
|
||||
break;
|
||||
default:
|
||||
ERR(EAI_SOCKTYPE);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* service port
|
||||
*/
|
||||
if (servname) {
|
||||
if (str_isnumber(servname)) {
|
||||
if (pai->ai_socktype == ANY) {
|
||||
/* caller accept *ANY* socktype */
|
||||
pai->ai_socktype = SOCK_DGRAM;
|
||||
pai->ai_protocol = IPPROTO_UDP;
|
||||
}
|
||||
port = htons((unsigned short)atoi(servname));
|
||||
/*
|
||||
* service port
|
||||
*/
|
||||
if (servname) {
|
||||
if (str_isnumber(servname)) {
|
||||
if (pai->ai_socktype == ANY) {
|
||||
/* caller accept *ANY* socktype */
|
||||
pai->ai_socktype = SOCK_DGRAM;
|
||||
pai->ai_protocol = IPPROTO_UDP;
|
||||
}
|
||||
port = htons((unsigned short)atoi(servname));
|
||||
} else if (pai->ai_flags & AI_NUMERICSERV) {
|
||||
ERR(EAI_NONAME);
|
||||
} else {
|
||||
struct servent *sp;
|
||||
const char *proto;
|
||||
} else {
|
||||
struct servent *sp;
|
||||
const char *proto;
|
||||
|
||||
proto = NULL;
|
||||
switch (pai->ai_socktype) {
|
||||
case ANY:
|
||||
proto = NULL;
|
||||
break;
|
||||
case SOCK_DGRAM:
|
||||
proto = "udp";
|
||||
break;
|
||||
case SOCK_STREAM:
|
||||
proto = "tcp";
|
||||
break;
|
||||
default:
|
||||
fprintf(stderr, "panic!\n");
|
||||
break;
|
||||
}
|
||||
if ((sp = getservbyname((char*)servname, proto)) == NULL)
|
||||
ERR(EAI_SERVICE);
|
||||
port = sp->s_port;
|
||||
if (pai->ai_socktype == ANY)
|
||||
if (strcmp(sp->s_proto, "udp") == 0) {
|
||||
pai->ai_socktype = SOCK_DGRAM;
|
||||
pai->ai_protocol = IPPROTO_UDP;
|
||||
} else if (strcmp(sp->s_proto, "tcp") == 0) {
|
||||
pai->ai_socktype = SOCK_STREAM;
|
||||
pai->ai_protocol = IPPROTO_TCP;
|
||||
} else
|
||||
ERR(EAI_PROTOCOL); /*xxx*/
|
||||
}
|
||||
}
|
||||
proto = NULL;
|
||||
switch (pai->ai_socktype) {
|
||||
case ANY:
|
||||
proto = NULL;
|
||||
break;
|
||||
case SOCK_DGRAM:
|
||||
proto = "udp";
|
||||
break;
|
||||
case SOCK_STREAM:
|
||||
proto = "tcp";
|
||||
break;
|
||||
default:
|
||||
fprintf(stderr, "panic!\n");
|
||||
break;
|
||||
}
|
||||
if ((sp = getservbyname((char*)servname, proto)) == NULL)
|
||||
ERR(EAI_SERVICE);
|
||||
port = sp->s_port;
|
||||
if (pai->ai_socktype == ANY)
|
||||
if (strcmp(sp->s_proto, "udp") == 0) {
|
||||
pai->ai_socktype = SOCK_DGRAM;
|
||||
pai->ai_protocol = IPPROTO_UDP;
|
||||
} else if (strcmp(sp->s_proto, "tcp") == 0) {
|
||||
pai->ai_socktype = SOCK_STREAM;
|
||||
pai->ai_protocol = IPPROTO_TCP;
|
||||
} else
|
||||
ERR(EAI_PROTOCOL); /*xxx*/
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* hostname == NULL.
|
||||
* passive socket -> anyaddr (0.0.0.0 or ::)
|
||||
* non-passive socket -> localhost (127.0.0.1 or ::1)
|
||||
*/
|
||||
if (hostname == NULL) {
|
||||
const struct afd *afd;
|
||||
int s;
|
||||
/*
|
||||
* hostname == NULL.
|
||||
* passive socket -> anyaddr (0.0.0.0 or ::)
|
||||
* non-passive socket -> localhost (127.0.0.1 or ::1)
|
||||
*/
|
||||
if (hostname == NULL) {
|
||||
const struct afd *afd;
|
||||
int s;
|
||||
|
||||
for (afd = &afdl[0]; afd->a_af; afd++) {
|
||||
if (!(pai->ai_family == PF_UNSPEC
|
||||
|| pai->ai_family == afd->a_af)) {
|
||||
continue;
|
||||
}
|
||||
for (afd = &afdl[0]; afd->a_af; afd++) {
|
||||
if (!(pai->ai_family == PF_UNSPEC
|
||||
|| pai->ai_family == afd->a_af)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
/*
|
||||
* filter out AFs that are not supported by the kernel
|
||||
* XXX errno?
|
||||
*/
|
||||
s = socket(afd->a_af, SOCK_DGRAM, 0);
|
||||
if (s < 0)
|
||||
continue;
|
||||
/*
|
||||
* filter out AFs that are not supported by the kernel
|
||||
* XXX errno?
|
||||
*/
|
||||
s = socket(afd->a_af, SOCK_DGRAM, 0);
|
||||
if (s < 0)
|
||||
continue;
|
||||
|
||||
close(s);
|
||||
close(s);
|
||||
|
||||
if (pai->ai_flags & AI_PASSIVE) {
|
||||
GET_AI(cur->ai_next, afd, afd->a_addrany, port);
|
||||
/* xxx meaningless?
|
||||
* GET_CANONNAME(cur->ai_next, "anyaddr");
|
||||
*/
|
||||
} else {
|
||||
GET_AI(cur->ai_next, afd, afd->a_loopback,
|
||||
port);
|
||||
/* xxx meaningless?
|
||||
* GET_CANONNAME(cur->ai_next, "localhost");
|
||||
*/
|
||||
}
|
||||
cur = cur->ai_next;
|
||||
}
|
||||
top = sentinel.ai_next;
|
||||
if (top)
|
||||
goto good;
|
||||
else
|
||||
ERR(EAI_FAMILY);
|
||||
}
|
||||
if (pai->ai_flags & AI_PASSIVE) {
|
||||
GET_AI(cur->ai_next, afd, afd->a_addrany, port);
|
||||
/* xxx meaningless?
|
||||
* GET_CANONNAME(cur->ai_next, "anyaddr");
|
||||
*/
|
||||
} else {
|
||||
GET_AI(cur->ai_next, afd, afd->a_loopback,
|
||||
port);
|
||||
/* xxx meaningless?
|
||||
* GET_CANONNAME(cur->ai_next, "localhost");
|
||||
*/
|
||||
}
|
||||
cur = cur->ai_next;
|
||||
}
|
||||
top = sentinel.ai_next;
|
||||
if (top)
|
||||
goto good;
|
||||
else
|
||||
ERR(EAI_FAMILY);
|
||||
}
|
||||
|
||||
/* hostname as numeric name */
|
||||
for (i = 0; afdl[i].a_af; i++) {
|
||||
if (inet_pton(afdl[i].a_af, hostname, pton)) {
|
||||
u_long v4a;
|
||||
/* hostname as numeric name */
|
||||
for (i = 0; afdl[i].a_af; i++) {
|
||||
if (inet_pton(afdl[i].a_af, hostname, pton)) {
|
||||
u_long v4a;
|
||||
#ifdef INET6
|
||||
u_char pfx;
|
||||
u_char pfx;
|
||||
#endif
|
||||
|
||||
switch (afdl[i].a_af) {
|
||||
case AF_INET:
|
||||
v4a = ((struct in_addr *)pton)->s_addr;
|
||||
if (IN_MULTICAST(v4a) || IN_EXPERIMENTAL(v4a))
|
||||
pai->ai_flags &= ~AI_CANONNAME;
|
||||
v4a >>= IN_CLASSA_NSHIFT;
|
||||
if (v4a == 0 || v4a == IN_LOOPBACKNET)
|
||||
pai->ai_flags &= ~AI_CANONNAME;
|
||||
break;
|
||||
switch (afdl[i].a_af) {
|
||||
case AF_INET:
|
||||
v4a = ((struct in_addr *)pton)->s_addr;
|
||||
if (IN_MULTICAST(v4a) || IN_EXPERIMENTAL(v4a))
|
||||
pai->ai_flags &= ~AI_CANONNAME;
|
||||
v4a >>= IN_CLASSA_NSHIFT;
|
||||
if (v4a == 0 || v4a == IN_LOOPBACKNET)
|
||||
pai->ai_flags &= ~AI_CANONNAME;
|
||||
break;
|
||||
#ifdef INET6
|
||||
case AF_INET6:
|
||||
pfx = ((struct in6_addr *)pton)->s6_addr[0];
|
||||
if (pfx == 0 || pfx == 0xfe || pfx == 0xff)
|
||||
pai->ai_flags &= ~AI_CANONNAME;
|
||||
break;
|
||||
case AF_INET6:
|
||||
pfx = ((struct in6_addr *)pton)->s6_addr[0];
|
||||
if (pfx == 0 || pfx == 0xfe || pfx == 0xff)
|
||||
pai->ai_flags &= ~AI_CANONNAME;
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
if (pai->ai_family == afdl[i].a_af ||
|
||||
pai->ai_family == PF_UNSPEC) {
|
||||
if (! (pai->ai_flags & AI_CANONNAME)) {
|
||||
GET_AI(top, &afdl[i], pton, port);
|
||||
goto good;
|
||||
}
|
||||
/*
|
||||
* if AI_CANONNAME and if reverse lookup
|
||||
* fail, return ai anyway to pacify
|
||||
* calling application.
|
||||
*
|
||||
* XXX getaddrinfo() is a name->address
|
||||
* translation function, and it looks strange
|
||||
* that we do addr->name translation here.
|
||||
*/
|
||||
get_name(pton, &afdl[i], &top, pton, pai, port);
|
||||
goto good;
|
||||
} else
|
||||
ERR(EAI_FAMILY); /*xxx*/
|
||||
}
|
||||
}
|
||||
if (pai->ai_family == afdl[i].a_af ||
|
||||
pai->ai_family == PF_UNSPEC) {
|
||||
if (! (pai->ai_flags & AI_CANONNAME)) {
|
||||
GET_AI(top, &afdl[i], pton, port);
|
||||
goto good;
|
||||
}
|
||||
/*
|
||||
* if AI_CANONNAME and if reverse lookup
|
||||
* fail, return ai anyway to pacify
|
||||
* calling application.
|
||||
*
|
||||
* XXX getaddrinfo() is a name->address
|
||||
* translation function, and it looks strange
|
||||
* that we do addr->name translation here.
|
||||
*/
|
||||
get_name(pton, &afdl[i], &top, pton, pai, port);
|
||||
goto good;
|
||||
} else
|
||||
ERR(EAI_FAMILY); /*xxx*/
|
||||
}
|
||||
}
|
||||
|
||||
if (pai->ai_flags & AI_NUMERICHOST)
|
||||
ERR(EAI_NONAME);
|
||||
if (pai->ai_flags & AI_NUMERICHOST)
|
||||
ERR(EAI_NONAME);
|
||||
|
||||
/* hostname as alphabetical name */
|
||||
error = get_addr(hostname, pai->ai_family, &top, pai, port);
|
||||
if (error == 0) {
|
||||
if (top) {
|
||||
/* hostname as alphabetical name */
|
||||
error = get_addr(hostname, pai->ai_family, &top, pai, port);
|
||||
if (error == 0) {
|
||||
if (top) {
|
||||
good:
|
||||
*res = top;
|
||||
return SUCCESS;
|
||||
} else
|
||||
error = EAI_FAIL;
|
||||
}
|
||||
*res = top;
|
||||
return SUCCESS;
|
||||
} else
|
||||
error = EAI_FAIL;
|
||||
}
|
||||
free:
|
||||
if (top)
|
||||
freeaddrinfo(top);
|
||||
if (top)
|
||||
freeaddrinfo(top);
|
||||
bad:
|
||||
*res = NULL;
|
||||
return error;
|
||||
*res = NULL;
|
||||
return error;
|
||||
}
|
||||
|
||||
static int
|
||||
get_name(const char *addr, const struct afd *afd, struct addrinfo **res, char *numaddr, struct addrinfo *pai, int port0)
|
||||
{
|
||||
u_short port = port0 & 0xffff;
|
||||
struct hostent *hp;
|
||||
struct addrinfo *cur;
|
||||
int error = 0;
|
||||
u_short port = port0 & 0xffff;
|
||||
struct hostent *hp;
|
||||
struct addrinfo *cur;
|
||||
int error = 0;
|
||||
#ifdef INET6
|
||||
int h_error;
|
||||
int h_error;
|
||||
#endif
|
||||
|
||||
#ifdef INET6
|
||||
hp = getipnodebyaddr(addr, afd->a_addrlen, afd->a_af, &h_error);
|
||||
hp = getipnodebyaddr(addr, afd->a_addrlen, afd->a_af, &h_error);
|
||||
#else
|
||||
hp = gethostbyaddr((char*)addr, afd->a_addrlen, AF_INET);
|
||||
hp = gethostbyaddr((char*)addr, afd->a_addrlen, AF_INET);
|
||||
#endif
|
||||
if (hp && hp->h_name && hp->h_name[0] && hp->h_addr_list[0]) {
|
||||
GET_AI(cur, afd, hp->h_addr_list[0], port);
|
||||
GET_CANONNAME(cur, hp->h_name);
|
||||
} else
|
||||
GET_AI(cur, afd, numaddr, port);
|
||||
if (hp && hp->h_name && hp->h_name[0] && hp->h_addr_list[0]) {
|
||||
GET_AI(cur, afd, hp->h_addr_list[0], port);
|
||||
GET_CANONNAME(cur, hp->h_name);
|
||||
} else
|
||||
GET_AI(cur, afd, numaddr, port);
|
||||
|
||||
#ifdef INET6
|
||||
if (hp)
|
||||
freehostent(hp);
|
||||
if (hp)
|
||||
freehostent(hp);
|
||||
#endif
|
||||
*res = cur;
|
||||
return SUCCESS;
|
||||
*res = cur;
|
||||
return SUCCESS;
|
||||
free:
|
||||
if (cur)
|
||||
freeaddrinfo(cur);
|
||||
if (cur)
|
||||
freeaddrinfo(cur);
|
||||
#ifdef INET6
|
||||
if (hp)
|
||||
freehostent(hp);
|
||||
if (hp)
|
||||
freehostent(hp);
|
||||
#endif
|
||||
/* bad: */
|
||||
*res = NULL;
|
||||
return error;
|
||||
*res = NULL;
|
||||
return error;
|
||||
}
|
||||
|
||||
static int
|
||||
get_addr(const char *hostname, int af, struct addrinfo **res, struct addrinfo *pai, int port0)
|
||||
{
|
||||
u_short port = port0 & 0xffff;
|
||||
struct addrinfo sentinel;
|
||||
struct hostent *hp;
|
||||
struct addrinfo *top, *cur;
|
||||
const struct afd *afd;
|
||||
int i, error = 0, h_error;
|
||||
char *ap;
|
||||
u_short port = port0 & 0xffff;
|
||||
struct addrinfo sentinel;
|
||||
struct hostent *hp;
|
||||
struct addrinfo *top, *cur;
|
||||
const struct afd *afd;
|
||||
int i, error = 0, h_error;
|
||||
char *ap;
|
||||
|
||||
top = NULL;
|
||||
sentinel.ai_next = NULL;
|
||||
cur = &sentinel;
|
||||
top = NULL;
|
||||
sentinel.ai_next = NULL;
|
||||
cur = &sentinel;
|
||||
#ifdef INET6
|
||||
if (af == AF_UNSPEC) {
|
||||
hp = getipnodebyname(hostname, AF_INET6,
|
||||
AI_ADDRCONFIG|AI_ALL|AI_V4MAPPED, &h_error);
|
||||
} else
|
||||
hp = getipnodebyname(hostname, af, AI_ADDRCONFIG, &h_error);
|
||||
if (af == AF_UNSPEC) {
|
||||
hp = getipnodebyname(hostname, AF_INET6,
|
||||
AI_ADDRCONFIG|AI_ALL|AI_V4MAPPED, &h_error);
|
||||
} else
|
||||
hp = getipnodebyname(hostname, af, AI_ADDRCONFIG, &h_error);
|
||||
#else
|
||||
if (strlen(hostname) >= NI_MAXHOST) ERR(EAI_NODATA);
|
||||
hp = gethostbyname((char*)hostname);
|
||||
h_error = h_errno;
|
||||
if (strlen(hostname) >= NI_MAXHOST) ERR(EAI_NODATA);
|
||||
hp = gethostbyname((char*)hostname);
|
||||
h_error = h_errno;
|
||||
#endif
|
||||
if (hp == NULL) {
|
||||
switch (h_error) {
|
||||
case HOST_NOT_FOUND:
|
||||
case NO_DATA:
|
||||
error = EAI_NODATA;
|
||||
break;
|
||||
case TRY_AGAIN:
|
||||
error = EAI_AGAIN;
|
||||
break;
|
||||
case NO_RECOVERY:
|
||||
default:
|
||||
error = EAI_FAIL;
|
||||
break;
|
||||
}
|
||||
goto bad;
|
||||
}
|
||||
if (hp == NULL) {
|
||||
switch (h_error) {
|
||||
case HOST_NOT_FOUND:
|
||||
case NO_DATA:
|
||||
error = EAI_NODATA;
|
||||
break;
|
||||
case TRY_AGAIN:
|
||||
error = EAI_AGAIN;
|
||||
break;
|
||||
case NO_RECOVERY:
|
||||
default:
|
||||
error = EAI_FAIL;
|
||||
break;
|
||||
}
|
||||
goto bad;
|
||||
}
|
||||
|
||||
if ((hp->h_name == NULL) || (hp->h_name[0] == 0) ||
|
||||
(hp->h_addr_list[0] == NULL))
|
||||
ERR(EAI_FAIL);
|
||||
if ((hp->h_name == NULL) || (hp->h_name[0] == 0) ||
|
||||
(hp->h_addr_list[0] == NULL))
|
||||
ERR(EAI_FAIL);
|
||||
|
||||
for (i = 0; (ap = hp->h_addr_list[i]) != NULL; i++) {
|
||||
switch (af) {
|
||||
for (i = 0; (ap = hp->h_addr_list[i]) != NULL; i++) {
|
||||
switch (af) {
|
||||
#ifdef INET6
|
||||
case AF_INET6:
|
||||
afd = &afdl[N_INET6];
|
||||
break;
|
||||
case AF_INET6:
|
||||
afd = &afdl[N_INET6];
|
||||
break;
|
||||
#endif
|
||||
#ifndef INET6
|
||||
default: /* AF_UNSPEC */
|
||||
default: /* AF_UNSPEC */
|
||||
#endif
|
||||
case AF_INET:
|
||||
afd = &afdl[N_INET];
|
||||
break;
|
||||
case AF_INET:
|
||||
afd = &afdl[N_INET];
|
||||
break;
|
||||
#ifdef INET6
|
||||
default: /* AF_UNSPEC */
|
||||
if (IN6_IS_ADDR_V4MAPPED((struct in6_addr *)ap)) {
|
||||
ap += sizeof(struct in6_addr) -
|
||||
sizeof(struct in_addr);
|
||||
afd = &afdl[N_INET];
|
||||
} else
|
||||
afd = &afdl[N_INET6];
|
||||
break;
|
||||
default: /* AF_UNSPEC */
|
||||
if (IN6_IS_ADDR_V4MAPPED((struct in6_addr *)ap)) {
|
||||
ap += sizeof(struct in6_addr) -
|
||||
sizeof(struct in_addr);
|
||||
afd = &afdl[N_INET];
|
||||
} else
|
||||
afd = &afdl[N_INET6];
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
#ifdef FAITH
|
||||
if (translate && afd->a_af == AF_INET) {
|
||||
struct in6_addr *in6;
|
||||
if (translate && afd->a_af == AF_INET) {
|
||||
struct in6_addr *in6;
|
||||
|
||||
GET_AI(cur->ai_next, &afdl[N_INET6], ap, port);
|
||||
in6 = &((struct sockaddr_in6 *)cur->ai_next->ai_addr)->sin6_addr;
|
||||
memcpy(&in6->s6_addr, &faith_prefix,
|
||||
sizeof(struct in6_addr) - sizeof(struct in_addr));
|
||||
memcpy(&in6->s6_addr + sizeof(struct in_addr), ap,
|
||||
sizeof(struct in_addr));
|
||||
} else
|
||||
GET_AI(cur->ai_next, &afdl[N_INET6], ap, port);
|
||||
in6 = &((struct sockaddr_in6 *)cur->ai_next->ai_addr)->sin6_addr;
|
||||
memcpy(&in6->s6_addr, &faith_prefix,
|
||||
sizeof(struct in6_addr) - sizeof(struct in_addr));
|
||||
memcpy(&in6->s6_addr + sizeof(struct in_addr), ap,
|
||||
sizeof(struct in_addr));
|
||||
} else
|
||||
#endif /* FAITH */
|
||||
GET_AI(cur->ai_next, afd, ap, port);
|
||||
if (cur == &sentinel) {
|
||||
top = cur->ai_next;
|
||||
GET_CANONNAME(top, hp->h_name);
|
||||
}
|
||||
cur = cur->ai_next;
|
||||
}
|
||||
GET_AI(cur->ai_next, afd, ap, port);
|
||||
if (cur == &sentinel) {
|
||||
top = cur->ai_next;
|
||||
GET_CANONNAME(top, hp->h_name);
|
||||
}
|
||||
cur = cur->ai_next;
|
||||
}
|
||||
#ifdef INET6
|
||||
freehostent(hp);
|
||||
freehostent(hp);
|
||||
#endif
|
||||
*res = top;
|
||||
return SUCCESS;
|
||||
*res = top;
|
||||
return SUCCESS;
|
||||
free:
|
||||
if (top)
|
||||
freeaddrinfo(top);
|
||||
if (top)
|
||||
freeaddrinfo(top);
|
||||
#ifdef INET6
|
||||
if (hp)
|
||||
freehostent(hp);
|
||||
if (hp)
|
||||
freehostent(hp);
|
||||
#endif
|
||||
bad:
|
||||
*res = NULL;
|
||||
return error;
|
||||
*res = NULL;
|
||||
return error;
|
||||
}
|
||||
|
@ -84,30 +84,30 @@ typedef int socklen_t;
|
||||
#define NO 0
|
||||
|
||||
struct sockinet {
|
||||
u_char si_len;
|
||||
u_char si_family;
|
||||
u_short si_port;
|
||||
u_char si_len;
|
||||
u_char si_family;
|
||||
u_short si_port;
|
||||
};
|
||||
|
||||
static struct afd {
|
||||
int a_af;
|
||||
int a_addrlen;
|
||||
int a_socklen;
|
||||
int a_off;
|
||||
int a_af;
|
||||
int a_addrlen;
|
||||
int a_socklen;
|
||||
int a_off;
|
||||
} afdl [] = {
|
||||
#ifdef INET6
|
||||
#define N_INET6 0
|
||||
{PF_INET6, sizeof(struct in6_addr),
|
||||
sizeof(struct sockaddr_in6),
|
||||
offsetof(struct sockaddr_in6, sin6_addr)},
|
||||
{PF_INET6, sizeof(struct in6_addr),
|
||||
sizeof(struct sockaddr_in6),
|
||||
offsetof(struct sockaddr_in6, sin6_addr)},
|
||||
#define N_INET 1
|
||||
#else
|
||||
#define N_INET 0
|
||||
#endif
|
||||
{PF_INET, sizeof(struct in_addr),
|
||||
sizeof(struct sockaddr_in),
|
||||
offsetof(struct sockaddr_in, sin_addr)},
|
||||
{0, 0, 0, 0},
|
||||
{PF_INET, sizeof(struct in_addr),
|
||||
sizeof(struct sockaddr_in),
|
||||
offsetof(struct sockaddr_in, sin_addr)},
|
||||
{0, 0, 0, 0},
|
||||
};
|
||||
|
||||
#define ENI_NOSOCKET 0
|
||||
@ -121,123 +121,123 @@ static struct afd {
|
||||
int
|
||||
getnameinfo(const struct sockaddr *sa, socklen_t salen, char *host, socklen_t hostlen, char *serv, socklen_t servlen, int flags)
|
||||
{
|
||||
struct afd *afd;
|
||||
struct hostent *hp;
|
||||
u_short port;
|
||||
int family, len, i;
|
||||
char *addr, *p;
|
||||
u_long v4a;
|
||||
struct afd *afd;
|
||||
struct hostent *hp;
|
||||
u_short port;
|
||||
int family, len, i;
|
||||
char *addr, *p;
|
||||
u_long v4a;
|
||||
#ifdef INET6
|
||||
u_char pfx;
|
||||
u_char pfx;
|
||||
#endif
|
||||
int h_error;
|
||||
char numserv[512];
|
||||
char numaddr[512];
|
||||
int h_error;
|
||||
char numserv[512];
|
||||
char numaddr[512];
|
||||
|
||||
if (sa == NULL)
|
||||
return ENI_NOSOCKET;
|
||||
if (sa == NULL)
|
||||
return ENI_NOSOCKET;
|
||||
|
||||
if (!VALIDATE_SOCKLEN(sa, salen)) return ENI_SALEN;
|
||||
if (!VALIDATE_SOCKLEN(sa, salen)) return ENI_SALEN;
|
||||
len = salen;
|
||||
|
||||
family = sa->sa_family;
|
||||
for (i = 0; afdl[i].a_af; i++)
|
||||
if (afdl[i].a_af == family) {
|
||||
afd = &afdl[i];
|
||||
goto found;
|
||||
}
|
||||
return ENI_FAMILY;
|
||||
family = sa->sa_family;
|
||||
for (i = 0; afdl[i].a_af; i++)
|
||||
if (afdl[i].a_af == family) {
|
||||
afd = &afdl[i];
|
||||
goto found;
|
||||
}
|
||||
return ENI_FAMILY;
|
||||
|
||||
found:
|
||||
if (len != afd->a_socklen) return ENI_SALEN;
|
||||
if (len != afd->a_socklen) return ENI_SALEN;
|
||||
|
||||
port = ((struct sockinet *)sa)->si_port; /* network byte order */
|
||||
addr = (char *)sa + afd->a_off;
|
||||
port = ((struct sockinet *)sa)->si_port; /* network byte order */
|
||||
addr = (char *)sa + afd->a_off;
|
||||
|
||||
if (serv == NULL || servlen == 0) {
|
||||
/* what we should do? */
|
||||
} else if (flags & NI_NUMERICSERV) {
|
||||
snprintf(numserv, sizeof(numserv), "%d", ntohs(port));
|
||||
if (strlen(numserv) + 1 > servlen)
|
||||
return ENI_MEMORY;
|
||||
strcpy(serv, numserv);
|
||||
} else {
|
||||
if (serv == NULL || servlen == 0) {
|
||||
/* what we should do? */
|
||||
} else if (flags & NI_NUMERICSERV) {
|
||||
snprintf(numserv, sizeof(numserv), "%d", ntohs(port));
|
||||
if (strlen(numserv) + 1 > servlen)
|
||||
return ENI_MEMORY;
|
||||
strcpy(serv, numserv);
|
||||
} else {
|
||||
#if defined(HAVE_GETSERVBYPORT)
|
||||
struct servent *sp = getservbyport(port, (flags & NI_DGRAM) ? "udp" : "tcp");
|
||||
if (sp) {
|
||||
if (strlen(sp->s_name) + 1 > servlen)
|
||||
return ENI_MEMORY;
|
||||
strcpy(serv, sp->s_name);
|
||||
} else
|
||||
return ENI_NOSERVNAME;
|
||||
struct servent *sp = getservbyport(port, (flags & NI_DGRAM) ? "udp" : "tcp");
|
||||
if (sp) {
|
||||
if (strlen(sp->s_name) + 1 > servlen)
|
||||
return ENI_MEMORY;
|
||||
strcpy(serv, sp->s_name);
|
||||
} else
|
||||
return ENI_NOSERVNAME;
|
||||
#else
|
||||
return ENI_NOSERVNAME;
|
||||
return ENI_NOSERVNAME;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
switch (sa->sa_family) {
|
||||
case AF_INET:
|
||||
v4a = ntohl(((struct sockaddr_in *)sa)->sin_addr.s_addr);
|
||||
if (IN_MULTICAST(v4a) || IN_EXPERIMENTAL(v4a))
|
||||
flags |= NI_NUMERICHOST;
|
||||
v4a >>= IN_CLASSA_NSHIFT;
|
||||
if (v4a == 0)
|
||||
flags |= NI_NUMERICHOST;
|
||||
break;
|
||||
switch (sa->sa_family) {
|
||||
case AF_INET:
|
||||
v4a = ntohl(((struct sockaddr_in *)sa)->sin_addr.s_addr);
|
||||
if (IN_MULTICAST(v4a) || IN_EXPERIMENTAL(v4a))
|
||||
flags |= NI_NUMERICHOST;
|
||||
v4a >>= IN_CLASSA_NSHIFT;
|
||||
if (v4a == 0)
|
||||
flags |= NI_NUMERICHOST;
|
||||
break;
|
||||
#ifdef INET6
|
||||
case AF_INET6:
|
||||
case AF_INET6:
|
||||
#ifdef HAVE_ADDR8
|
||||
pfx = ((struct sockaddr_in6 *)sa)->sin6_addr.s6_addr8[0];
|
||||
pfx = ((struct sockaddr_in6 *)sa)->sin6_addr.s6_addr8[0];
|
||||
#else
|
||||
pfx = ((struct sockaddr_in6 *)sa)->sin6_addr.s6_addr[0];
|
||||
pfx = ((struct sockaddr_in6 *)sa)->sin6_addr.s6_addr[0];
|
||||
#endif
|
||||
if (pfx == 0 || pfx == 0xfe || pfx == 0xff)
|
||||
flags |= NI_NUMERICHOST;
|
||||
break;
|
||||
if (pfx == 0 || pfx == 0xfe || pfx == 0xff)
|
||||
flags |= NI_NUMERICHOST;
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
if (host == NULL || hostlen == 0) {
|
||||
/* what should we do? */
|
||||
} else if (flags & NI_NUMERICHOST) {
|
||||
if (inet_ntop(afd->a_af, addr, numaddr, sizeof(numaddr))
|
||||
== NULL)
|
||||
return ENI_SYSTEM;
|
||||
if (strlen(numaddr) > hostlen)
|
||||
return ENI_MEMORY;
|
||||
strcpy(host, numaddr);
|
||||
} else {
|
||||
}
|
||||
if (host == NULL || hostlen == 0) {
|
||||
/* what should we do? */
|
||||
} else if (flags & NI_NUMERICHOST) {
|
||||
if (inet_ntop(afd->a_af, addr, numaddr, sizeof(numaddr))
|
||||
== NULL)
|
||||
return ENI_SYSTEM;
|
||||
if (strlen(numaddr) > hostlen)
|
||||
return ENI_MEMORY;
|
||||
strcpy(host, numaddr);
|
||||
} else {
|
||||
#ifdef INET6
|
||||
hp = getipnodebyaddr(addr, afd->a_addrlen, afd->a_af, &h_error);
|
||||
hp = getipnodebyaddr(addr, afd->a_addrlen, afd->a_af, &h_error);
|
||||
#else
|
||||
hp = gethostbyaddr(addr, afd->a_addrlen, afd->a_af);
|
||||
h_error = h_errno;
|
||||
hp = gethostbyaddr(addr, afd->a_addrlen, afd->a_af);
|
||||
h_error = h_errno;
|
||||
#endif
|
||||
|
||||
if (hp) {
|
||||
if (flags & NI_NOFQDN) {
|
||||
p = strchr(hp->h_name, '.');
|
||||
if (p) *p = '\0';
|
||||
}
|
||||
if (strlen(hp->h_name) + 1 > hostlen) {
|
||||
if (hp) {
|
||||
if (flags & NI_NOFQDN) {
|
||||
p = strchr(hp->h_name, '.');
|
||||
if (p) *p = '\0';
|
||||
}
|
||||
if (strlen(hp->h_name) + 1 > hostlen) {
|
||||
#ifdef INET6
|
||||
freehostent(hp);
|
||||
freehostent(hp);
|
||||
#endif
|
||||
return ENI_MEMORY;
|
||||
}
|
||||
strcpy(host, hp->h_name);
|
||||
return ENI_MEMORY;
|
||||
}
|
||||
strcpy(host, hp->h_name);
|
||||
#ifdef INET6
|
||||
freehostent(hp);
|
||||
freehostent(hp);
|
||||
#endif
|
||||
} else {
|
||||
if (flags & NI_NAMEREQD)
|
||||
return ENI_NOHOSTNAME;
|
||||
if (inet_ntop(afd->a_af, addr, numaddr, sizeof(numaddr))
|
||||
== NULL)
|
||||
return ENI_NOHOSTNAME;
|
||||
if (strlen(numaddr) > hostlen)
|
||||
return ENI_MEMORY;
|
||||
strcpy(host, numaddr);
|
||||
}
|
||||
}
|
||||
return SUCCESS;
|
||||
} else {
|
||||
if (flags & NI_NAMEREQD)
|
||||
return ENI_NOHOSTNAME;
|
||||
if (inet_ntop(afd->a_af, addr, numaddr, sizeof(numaddr))
|
||||
== NULL)
|
||||
return ENI_NOHOSTNAME;
|
||||
if (strlen(numaddr) > hostlen)
|
||||
return ENI_MEMORY;
|
||||
strcpy(host, numaddr);
|
||||
}
|
||||
}
|
||||
return SUCCESS;
|
||||
}
|
||||
|
@ -104,7 +104,7 @@ rsock_getifaddrs(void)
|
||||
rb_sys_fail("getifaddrs");
|
||||
|
||||
if (!ifaddrs) {
|
||||
return rb_ary_new();
|
||||
return rb_ary_new();
|
||||
}
|
||||
|
||||
numifaddrs = 0;
|
||||
@ -128,9 +128,9 @@ rsock_getifaddrs(void)
|
||||
result = rb_ary_new2(numifaddrs);
|
||||
rb_ary_push(result, addr);
|
||||
for (i = 1; i < numifaddrs; i++) {
|
||||
addr = TypedData_Wrap_Struct(rb_cSockIfaddr, &ifaddr_type, &root->ary[i]);
|
||||
root->refcount++;
|
||||
rb_ary_push(result, addr);
|
||||
addr = TypedData_Wrap_Struct(rb_cSockIfaddr, &ifaddr_type, &root->ary[i]);
|
||||
root->refcount++;
|
||||
rb_ary_push(result, addr);
|
||||
}
|
||||
|
||||
return result;
|
||||
|
@ -41,7 +41,7 @@ rsock_raise_socket_error(const char *reason, int error)
|
||||
#ifdef EAI_SYSTEM
|
||||
int e;
|
||||
if (error == EAI_SYSTEM && (e = errno) != 0)
|
||||
rb_syserr_fail(e, reason);
|
||||
rb_syserr_fail(e, reason);
|
||||
#endif
|
||||
#ifdef _WIN32
|
||||
rb_encoding *enc = rb_default_internal_encoding();
|
||||
@ -71,7 +71,7 @@ rsock_init_sock(VALUE sock, int fd)
|
||||
fp->mode = FMODE_READWRITE|FMODE_DUPLEX;
|
||||
rb_io_ascii8bit_binmode(sock);
|
||||
if (rsock_do_not_reverse_lookup) {
|
||||
fp->mode |= FMODE_NOREVLOOKUP;
|
||||
fp->mode |= FMODE_NOREVLOOKUP;
|
||||
}
|
||||
rb_io_synchronized(fp);
|
||||
|
||||
@ -85,7 +85,7 @@ rsock_sendto_blocking(void *data)
|
||||
VALUE mesg = arg->mesg;
|
||||
ssize_t ret;
|
||||
do_write_retry(sendto(arg->fd, RSTRING_PTR(mesg), RSTRING_LEN(mesg),
|
||||
arg->flags, arg->to, arg->tolen));
|
||||
arg->flags, arg->to, arg->tolen));
|
||||
return (VALUE)ret;
|
||||
}
|
||||
|
||||
@ -96,7 +96,7 @@ rsock_send_blocking(void *data)
|
||||
VALUE mesg = arg->mesg;
|
||||
ssize_t ret;
|
||||
do_write_retry(send(arg->fd, RSTRING_PTR(mesg), RSTRING_LEN(mesg),
|
||||
arg->flags));
|
||||
arg->flags));
|
||||
return (VALUE)ret;
|
||||
}
|
||||
|
||||
@ -132,9 +132,9 @@ rsock_strbuf(VALUE str, long buflen)
|
||||
StringValue(str);
|
||||
len = RSTRING_LEN(str);
|
||||
if (len >= buflen) {
|
||||
rb_str_modify(str);
|
||||
rb_str_modify(str);
|
||||
} else {
|
||||
rb_str_modify_expand(str, buflen - len);
|
||||
rb_str_modify_expand(str, buflen - len);
|
||||
}
|
||||
return str;
|
||||
}
|
||||
@ -197,32 +197,32 @@ rsock_s_recvfrom(VALUE socket, int argc, VALUE *argv, enum sock_recv_type from)
|
||||
rb_str_set_len(str, slen);
|
||||
switch (from) {
|
||||
case RECV_RECV:
|
||||
return str;
|
||||
return str;
|
||||
case RECV_IP:
|
||||
#if 0
|
||||
if (arg.alen != sizeof(struct sockaddr_in)) {
|
||||
rb_raise(rb_eTypeError, "sockaddr size differs - should not happen");
|
||||
}
|
||||
if (arg.alen != sizeof(struct sockaddr_in)) {
|
||||
rb_raise(rb_eTypeError, "sockaddr size differs - should not happen");
|
||||
}
|
||||
#endif
|
||||
if (arg.alen && arg.alen != sizeof(arg.buf)) /* OSX doesn't return a from result for connection-oriented sockets */
|
||||
return rb_assoc_new(str, rsock_ipaddr(&arg.buf.addr, arg.alen, fptr->mode & FMODE_NOREVLOOKUP));
|
||||
else
|
||||
return rb_assoc_new(str, Qnil);
|
||||
if (arg.alen && arg.alen != sizeof(arg.buf)) /* OSX doesn't return a from result for connection-oriented sockets */
|
||||
return rb_assoc_new(str, rsock_ipaddr(&arg.buf.addr, arg.alen, fptr->mode & FMODE_NOREVLOOKUP));
|
||||
else
|
||||
return rb_assoc_new(str, Qnil);
|
||||
|
||||
#ifdef HAVE_SYS_UN_H
|
||||
case RECV_UNIX:
|
||||
return rb_assoc_new(str, rsock_unixaddr(&arg.buf.un, arg.alen));
|
||||
#endif
|
||||
case RECV_SOCKET:
|
||||
return rb_assoc_new(str, rsock_io_socket_addrinfo(socket, &arg.buf.addr, arg.alen));
|
||||
return rb_assoc_new(str, rsock_io_socket_addrinfo(socket, &arg.buf.addr, arg.alen));
|
||||
default:
|
||||
rb_bug("rsock_s_recvfrom called with bad value");
|
||||
rb_bug("rsock_s_recvfrom called with bad value");
|
||||
}
|
||||
}
|
||||
|
||||
VALUE
|
||||
rsock_s_recvfrom_nonblock(VALUE sock, VALUE len, VALUE flg, VALUE str,
|
||||
VALUE ex, enum sock_recv_type from)
|
||||
VALUE ex, enum sock_recv_type from)
|
||||
{
|
||||
rb_io_t *fptr;
|
||||
union_sockaddr buf;
|
||||
@ -245,14 +245,14 @@ rsock_s_recvfrom_nonblock(VALUE sock, VALUE len, VALUE flg, VALUE str,
|
||||
|
||||
GetOpenFile(sock, fptr);
|
||||
if (rb_io_read_pending(fptr)) {
|
||||
rb_raise(rb_eIOError, "recvfrom for buffered IO");
|
||||
rb_raise(rb_eIOError, "recvfrom for buffered IO");
|
||||
}
|
||||
fd = fptr->fd;
|
||||
|
||||
rb_io_check_closed(fptr);
|
||||
|
||||
if (!MSG_DONTWAIT_RELIABLE)
|
||||
rb_io_set_nonblock(fptr);
|
||||
rb_io_set_nonblock(fptr);
|
||||
|
||||
len0 = alen;
|
||||
slen = recvfrom(fd, RSTRING_PTR(str), buflen, flags, &buf.addr, &alen);
|
||||
@ -260,20 +260,20 @@ rsock_s_recvfrom_nonblock(VALUE sock, VALUE len, VALUE flg, VALUE str,
|
||||
alen = len0;
|
||||
|
||||
if (slen < 0) {
|
||||
int e = errno;
|
||||
switch (e) {
|
||||
case EAGAIN:
|
||||
int e = errno;
|
||||
switch (e) {
|
||||
case EAGAIN:
|
||||
#if defined(EWOULDBLOCK) && EWOULDBLOCK != EAGAIN
|
||||
case EWOULDBLOCK:
|
||||
case EWOULDBLOCK:
|
||||
#endif
|
||||
if (ex == Qfalse)
|
||||
return sym_wait_readable;
|
||||
return sym_wait_readable;
|
||||
rb_readwrite_syserr_fail(RB_IO_WAIT_READABLE, e, "recvfrom(2) would block");
|
||||
}
|
||||
rb_syserr_fail(e, "recvfrom(2)");
|
||||
}
|
||||
rb_syserr_fail(e, "recvfrom(2)");
|
||||
}
|
||||
if (slen != RSTRING_LEN(str)) {
|
||||
rb_str_set_len(str, slen);
|
||||
rb_str_set_len(str, slen);
|
||||
}
|
||||
switch (from) {
|
||||
case RECV_RECV:
|
||||
@ -324,31 +324,31 @@ rsock_read_nonblock(VALUE sock, VALUE length, VALUE buf, VALUE ex)
|
||||
GetOpenFile(sock, fptr);
|
||||
|
||||
if (len == 0) {
|
||||
rb_str_set_len(str, 0);
|
||||
return str;
|
||||
rb_str_set_len(str, 0);
|
||||
return str;
|
||||
}
|
||||
|
||||
ptr = RSTRING_PTR(str);
|
||||
n = read_buffered_data(ptr, len, fptr);
|
||||
if (n <= 0) {
|
||||
n = (long)recv(fptr->fd, ptr, len, MSG_DONTWAIT);
|
||||
if (n < 0) {
|
||||
int e = errno;
|
||||
if ((e == EWOULDBLOCK || e == EAGAIN)) {
|
||||
if (ex == Qfalse) return sym_wait_readable;
|
||||
rb_readwrite_syserr_fail(RB_IO_WAIT_READABLE,
|
||||
e, "read would block");
|
||||
}
|
||||
rb_syserr_fail_path(e, fptr->pathv);
|
||||
}
|
||||
n = (long)recv(fptr->fd, ptr, len, MSG_DONTWAIT);
|
||||
if (n < 0) {
|
||||
int e = errno;
|
||||
if ((e == EWOULDBLOCK || e == EAGAIN)) {
|
||||
if (ex == Qfalse) return sym_wait_readable;
|
||||
rb_readwrite_syserr_fail(RB_IO_WAIT_READABLE,
|
||||
e, "read would block");
|
||||
}
|
||||
rb_syserr_fail_path(e, fptr->pathv);
|
||||
}
|
||||
}
|
||||
if (n != RSTRING_LEN(str)) {
|
||||
rb_str_modify(str);
|
||||
rb_str_set_len(str, n);
|
||||
rb_str_modify(str);
|
||||
rb_str_set_len(str, n);
|
||||
}
|
||||
if (n == 0) {
|
||||
if (ex == Qfalse) return Qnil;
|
||||
rb_eof_error();
|
||||
if (ex == Qfalse) return Qnil;
|
||||
rb_eof_error();
|
||||
}
|
||||
|
||||
return str;
|
||||
@ -362,7 +362,7 @@ rsock_write_nonblock(VALUE sock, VALUE str, VALUE ex)
|
||||
long n;
|
||||
|
||||
if (!RB_TYPE_P(str, T_STRING))
|
||||
str = rb_obj_as_string(str);
|
||||
str = rb_obj_as_string(str);
|
||||
|
||||
sock = rb_io_get_write_io(sock);
|
||||
GetOpenFile(sock, fptr);
|
||||
@ -374,7 +374,7 @@ rsock_write_nonblock(VALUE sock, VALUE str, VALUE ex)
|
||||
* are not userspace-buffered in Ruby by default.
|
||||
*/
|
||||
if (fptr->wbuf.len > 0) {
|
||||
rb_io_flush(sock);
|
||||
rb_io_flush(sock);
|
||||
}
|
||||
|
||||
#ifdef __APPLE__
|
||||
@ -382,19 +382,19 @@ rsock_write_nonblock(VALUE sock, VALUE str, VALUE ex)
|
||||
#endif
|
||||
n = (long)send(fptr->fd, RSTRING_PTR(str), RSTRING_LEN(str), MSG_DONTWAIT);
|
||||
if (n < 0) {
|
||||
int e = errno;
|
||||
int e = errno;
|
||||
|
||||
#ifdef __APPLE__
|
||||
if (e == EPROTOTYPE) {
|
||||
goto again;
|
||||
}
|
||||
if (e == EPROTOTYPE) {
|
||||
goto again;
|
||||
}
|
||||
#endif
|
||||
if (e == EWOULDBLOCK || e == EAGAIN) {
|
||||
if (ex == Qfalse) return sym_wait_writable;
|
||||
rb_readwrite_syserr_fail(RB_IO_WAIT_WRITABLE, e,
|
||||
"write would block");
|
||||
}
|
||||
rb_syserr_fail_path(e, fptr->pathv);
|
||||
if (e == EWOULDBLOCK || e == EAGAIN) {
|
||||
if (ex == Qfalse) return sym_wait_writable;
|
||||
rb_readwrite_syserr_fail(RB_IO_WAIT_WRITABLE, e,
|
||||
"write would block");
|
||||
}
|
||||
rb_syserr_fail_path(e, fptr->pathv);
|
||||
}
|
||||
|
||||
return LONG2FIX(n);
|
||||
@ -497,11 +497,11 @@ wait_connectable(int fd, struct timeval *timeout)
|
||||
* interrupted connect()
|
||||
*/
|
||||
|
||||
/* when the connection timed out, no errno is set and revents is 0. */
|
||||
if (timeout && revents == 0) {
|
||||
errno = ETIMEDOUT;
|
||||
return -1;
|
||||
}
|
||||
/* when the connection timed out, no errno is set and revents is 0. */
|
||||
if (timeout && revents == 0) {
|
||||
errno = ETIMEDOUT;
|
||||
return -1;
|
||||
}
|
||||
case EINTR:
|
||||
#ifdef ERESTART
|
||||
case ERESTART:
|
||||
@ -516,7 +516,7 @@ wait_connectable(int fd, struct timeval *timeout)
|
||||
#ifdef EISCONN
|
||||
case EISCONN:
|
||||
#endif
|
||||
return 0; /* success */
|
||||
return 0; /* success */
|
||||
default:
|
||||
/* likely (but not limited to): ECONNREFUSED, ETIMEDOUT, EHOSTUNREACH */
|
||||
errno = sockerr;
|
||||
@ -634,27 +634,27 @@ cloexec_accept(int socket, struct sockaddr *address, socklen_t *address_len)
|
||||
|
||||
VALUE
|
||||
rsock_s_accept_nonblock(VALUE klass, VALUE ex, rb_io_t *fptr,
|
||||
struct sockaddr *sockaddr, socklen_t *len)
|
||||
struct sockaddr *sockaddr, socklen_t *len)
|
||||
{
|
||||
int fd2;
|
||||
|
||||
rb_io_set_nonblock(fptr);
|
||||
fd2 = cloexec_accept(fptr->fd, (struct sockaddr*)sockaddr, len);
|
||||
if (fd2 < 0) {
|
||||
int e = errno;
|
||||
switch (e) {
|
||||
case EAGAIN:
|
||||
int e = errno;
|
||||
switch (e) {
|
||||
case EAGAIN:
|
||||
#if defined(EWOULDBLOCK) && EWOULDBLOCK != EAGAIN
|
||||
case EWOULDBLOCK:
|
||||
case EWOULDBLOCK:
|
||||
#endif
|
||||
case ECONNABORTED:
|
||||
case ECONNABORTED:
|
||||
#if defined EPROTO
|
||||
case EPROTO:
|
||||
case EPROTO:
|
||||
#endif
|
||||
if (ex == Qfalse)
|
||||
return sym_wait_readable;
|
||||
return sym_wait_readable;
|
||||
rb_readwrite_syserr_fail(RB_IO_WAIT_READABLE, e, "accept(2) would block");
|
||||
}
|
||||
}
|
||||
rb_syserr_fail(e, "accept(2)");
|
||||
}
|
||||
rb_update_max_fd(fd2);
|
||||
@ -730,11 +730,11 @@ rsock_getfamily(rb_io_t *fptr)
|
||||
if (cached) {
|
||||
switch (cached) {
|
||||
#ifdef AF_UNIX
|
||||
case FMODE_UNIX: return AF_UNIX;
|
||||
case FMODE_UNIX: return AF_UNIX;
|
||||
#endif
|
||||
case FMODE_INET: return AF_INET;
|
||||
case FMODE_INET6: return AF_INET6;
|
||||
}
|
||||
case FMODE_INET: return AF_INET;
|
||||
case FMODE_INET6: return AF_INET6;
|
||||
}
|
||||
}
|
||||
|
||||
ss.addr.sa_family = AF_UNSPEC;
|
||||
|
@ -14,8 +14,8 @@ struct inetsock_arg
|
||||
{
|
||||
VALUE sock;
|
||||
struct {
|
||||
VALUE host, serv;
|
||||
struct rb_addrinfo *res;
|
||||
VALUE host, serv;
|
||||
struct rb_addrinfo *res;
|
||||
} remote, local;
|
||||
int type;
|
||||
int fd;
|
||||
@ -28,15 +28,15 @@ inetsock_cleanup(VALUE v)
|
||||
{
|
||||
struct inetsock_arg *arg = (void *)v;
|
||||
if (arg->remote.res) {
|
||||
rb_freeaddrinfo(arg->remote.res);
|
||||
arg->remote.res = 0;
|
||||
rb_freeaddrinfo(arg->remote.res);
|
||||
arg->remote.res = 0;
|
||||
}
|
||||
if (arg->local.res) {
|
||||
rb_freeaddrinfo(arg->local.res);
|
||||
arg->local.res = 0;
|
||||
rb_freeaddrinfo(arg->local.res);
|
||||
arg->local.res = 0;
|
||||
}
|
||||
if (arg->fd >= 0) {
|
||||
close(arg->fd);
|
||||
close(arg->fd);
|
||||
}
|
||||
return Qnil;
|
||||
}
|
||||
@ -61,8 +61,8 @@ init_inetsock_internal(VALUE v)
|
||||
}
|
||||
|
||||
arg->remote.res = rsock_addrinfo(arg->remote.host, arg->remote.serv,
|
||||
family, SOCK_STREAM,
|
||||
(type == INET_SERVER) ? AI_PASSIVE : 0);
|
||||
family, SOCK_STREAM,
|
||||
(type == INET_SERVER) ? AI_PASSIVE : 0);
|
||||
|
||||
|
||||
/*
|
||||
@ -70,15 +70,15 @@ init_inetsock_internal(VALUE v)
|
||||
*/
|
||||
|
||||
if (type != INET_SERVER && (!NIL_P(arg->local.host) || !NIL_P(arg->local.serv))) {
|
||||
arg->local.res = rsock_addrinfo(arg->local.host, arg->local.serv,
|
||||
family, SOCK_STREAM, 0);
|
||||
arg->local.res = rsock_addrinfo(arg->local.host, arg->local.serv,
|
||||
family, SOCK_STREAM, 0);
|
||||
}
|
||||
|
||||
arg->fd = fd = -1;
|
||||
for (res = arg->remote.res->ai; res; res = res->ai_next) {
|
||||
#if !defined(INET6) && defined(AF_INET6)
|
||||
if (res->ai_family == AF_INET6)
|
||||
continue;
|
||||
if (res->ai_family == AF_INET6)
|
||||
continue;
|
||||
#endif
|
||||
lres = NULL;
|
||||
if (arg->local.res) {
|
||||
@ -94,73 +94,73 @@ init_inetsock_internal(VALUE v)
|
||||
lres = arg->local.res->ai;
|
||||
}
|
||||
}
|
||||
status = rsock_socket(res->ai_family,res->ai_socktype,res->ai_protocol);
|
||||
syscall = "socket(2)";
|
||||
fd = status;
|
||||
if (fd < 0) {
|
||||
error = errno;
|
||||
continue;
|
||||
}
|
||||
arg->fd = fd;
|
||||
if (type == INET_SERVER) {
|
||||
status = rsock_socket(res->ai_family,res->ai_socktype,res->ai_protocol);
|
||||
syscall = "socket(2)";
|
||||
fd = status;
|
||||
if (fd < 0) {
|
||||
error = errno;
|
||||
continue;
|
||||
}
|
||||
arg->fd = fd;
|
||||
if (type == INET_SERVER) {
|
||||
#if !defined(_WIN32) && !defined(__CYGWIN__)
|
||||
status = 1;
|
||||
setsockopt(fd, SOL_SOCKET, SO_REUSEADDR,
|
||||
(char*)&status, (socklen_t)sizeof(status));
|
||||
status = 1;
|
||||
setsockopt(fd, SOL_SOCKET, SO_REUSEADDR,
|
||||
(char*)&status, (socklen_t)sizeof(status));
|
||||
#endif
|
||||
status = bind(fd, res->ai_addr, res->ai_addrlen);
|
||||
syscall = "bind(2)";
|
||||
}
|
||||
else {
|
||||
if (lres) {
|
||||
status = bind(fd, res->ai_addr, res->ai_addrlen);
|
||||
syscall = "bind(2)";
|
||||
}
|
||||
else {
|
||||
if (lres) {
|
||||
#if !defined(_WIN32) && !defined(__CYGWIN__)
|
||||
status = 1;
|
||||
setsockopt(fd, SOL_SOCKET, SO_REUSEADDR,
|
||||
(char*)&status, (socklen_t)sizeof(status));
|
||||
#endif
|
||||
status = bind(fd, lres->ai_addr, lres->ai_addrlen);
|
||||
local = status;
|
||||
syscall = "bind(2)";
|
||||
}
|
||||
status = bind(fd, lres->ai_addr, lres->ai_addrlen);
|
||||
local = status;
|
||||
syscall = "bind(2)";
|
||||
}
|
||||
|
||||
if (status >= 0) {
|
||||
status = rsock_connect(fd, res->ai_addr, res->ai_addrlen,
|
||||
(type == INET_SOCKS), tv);
|
||||
syscall = "connect(2)";
|
||||
}
|
||||
}
|
||||
if (status >= 0) {
|
||||
status = rsock_connect(fd, res->ai_addr, res->ai_addrlen,
|
||||
(type == INET_SOCKS), tv);
|
||||
syscall = "connect(2)";
|
||||
}
|
||||
}
|
||||
|
||||
if (status < 0) {
|
||||
error = errno;
|
||||
close(fd);
|
||||
arg->fd = fd = -1;
|
||||
continue;
|
||||
} else
|
||||
break;
|
||||
if (status < 0) {
|
||||
error = errno;
|
||||
close(fd);
|
||||
arg->fd = fd = -1;
|
||||
continue;
|
||||
} else
|
||||
break;
|
||||
}
|
||||
if (status < 0) {
|
||||
VALUE host, port;
|
||||
VALUE host, port;
|
||||
|
||||
if (local < 0) {
|
||||
host = arg->local.host;
|
||||
port = arg->local.serv;
|
||||
} else {
|
||||
host = arg->remote.host;
|
||||
port = arg->remote.serv;
|
||||
}
|
||||
if (local < 0) {
|
||||
host = arg->local.host;
|
||||
port = arg->local.serv;
|
||||
} else {
|
||||
host = arg->remote.host;
|
||||
port = arg->remote.serv;
|
||||
}
|
||||
|
||||
rsock_syserr_fail_host_port(error, syscall, host, port);
|
||||
rsock_syserr_fail_host_port(error, syscall, host, port);
|
||||
}
|
||||
|
||||
arg->fd = -1;
|
||||
|
||||
if (type == INET_SERVER) {
|
||||
status = listen(fd, SOMAXCONN);
|
||||
if (status < 0) {
|
||||
error = errno;
|
||||
close(fd);
|
||||
rb_syserr_fail(error, "listen(2)");
|
||||
}
|
||||
status = listen(fd, SOMAXCONN);
|
||||
if (status < 0) {
|
||||
error = errno;
|
||||
close(fd);
|
||||
rb_syserr_fail(error, "listen(2)");
|
||||
}
|
||||
}
|
||||
|
||||
/* create new instance */
|
||||
@ -169,8 +169,8 @@ init_inetsock_internal(VALUE v)
|
||||
|
||||
VALUE
|
||||
rsock_init_inetsock(VALUE sock, VALUE remote_host, VALUE remote_serv,
|
||||
VALUE local_host, VALUE local_serv, int type,
|
||||
VALUE resolv_timeout, VALUE connect_timeout)
|
||||
VALUE local_host, VALUE local_serv, int type,
|
||||
VALUE resolv_timeout, VALUE connect_timeout)
|
||||
{
|
||||
struct inetsock_arg arg;
|
||||
arg.sock = sock;
|
||||
@ -185,7 +185,7 @@ rsock_init_inetsock(VALUE sock, VALUE remote_host, VALUE remote_serv,
|
||||
arg.resolv_timeout = resolv_timeout;
|
||||
arg.connect_timeout = connect_timeout;
|
||||
return rb_ensure(init_inetsock_internal, (VALUE)&arg,
|
||||
inetsock_cleanup, (VALUE)&arg);
|
||||
inetsock_cleanup, (VALUE)&arg);
|
||||
}
|
||||
|
||||
static ID id_numeric, id_hostname;
|
||||
@ -201,11 +201,11 @@ rsock_revlookup_flag(VALUE revlookup, int *norevlookup)
|
||||
case Qfalse: return_norevlookup(1);
|
||||
case Qnil: break;
|
||||
default:
|
||||
Check_Type(revlookup, T_SYMBOL);
|
||||
id = SYM2ID(revlookup);
|
||||
if (id == id_numeric) return_norevlookup(1);
|
||||
if (id == id_hostname) return_norevlookup(0);
|
||||
rb_raise(rb_eArgError, "invalid reverse_lookup flag: :%s", rb_id2name(id));
|
||||
Check_Type(revlookup, T_SYMBOL);
|
||||
id = SYM2ID(revlookup);
|
||||
if (id == id_numeric) return_norevlookup(1);
|
||||
if (id == id_hostname) return_norevlookup(0);
|
||||
rb_raise(rb_eArgError, "invalid reverse_lookup flag: :%s", rb_id2name(id));
|
||||
}
|
||||
return 0;
|
||||
#undef return_norevlookup
|
||||
@ -226,24 +226,24 @@ ip_inspect(VALUE sock)
|
||||
socklen_t len = (socklen_t)sizeof addr;
|
||||
ID id;
|
||||
if (fptr && fptr->fd >= 0 &&
|
||||
getsockname(fptr->fd, &addr.addr, &len) >= 0 &&
|
||||
(id = rsock_intern_family(addr.addr.sa_family)) != 0) {
|
||||
VALUE family = rb_id2str(id);
|
||||
char hbuf[1024], pbuf[1024];
|
||||
long slen = RSTRING_LEN(str);
|
||||
const char last = (slen > 1 && RSTRING_PTR(str)[slen - 1] == '>') ?
|
||||
(--slen, '>') : 0;
|
||||
str = rb_str_subseq(str, 0, slen);
|
||||
rb_str_cat_cstr(str, ", ");
|
||||
rb_str_append(str, family);
|
||||
if (!rb_getnameinfo(&addr.addr, len, hbuf, sizeof(hbuf),
|
||||
pbuf, sizeof(pbuf), NI_NUMERICHOST | NI_NUMERICSERV)) {
|
||||
rb_str_cat_cstr(str, ", ");
|
||||
rb_str_cat_cstr(str, hbuf);
|
||||
rb_str_cat_cstr(str, ", ");
|
||||
rb_str_cat_cstr(str, pbuf);
|
||||
}
|
||||
if (last) rb_str_cat(str, &last, 1);
|
||||
getsockname(fptr->fd, &addr.addr, &len) >= 0 &&
|
||||
(id = rsock_intern_family(addr.addr.sa_family)) != 0) {
|
||||
VALUE family = rb_id2str(id);
|
||||
char hbuf[1024], pbuf[1024];
|
||||
long slen = RSTRING_LEN(str);
|
||||
const char last = (slen > 1 && RSTRING_PTR(str)[slen - 1] == '>') ?
|
||||
(--slen, '>') : 0;
|
||||
str = rb_str_subseq(str, 0, slen);
|
||||
rb_str_cat_cstr(str, ", ");
|
||||
rb_str_append(str, family);
|
||||
if (!rb_getnameinfo(&addr.addr, len, hbuf, sizeof(hbuf),
|
||||
pbuf, sizeof(pbuf), NI_NUMERICHOST | NI_NUMERICSERV)) {
|
||||
rb_str_cat_cstr(str, ", ");
|
||||
rb_str_cat_cstr(str, hbuf);
|
||||
rb_str_cat_cstr(str, ", ");
|
||||
rb_str_cat_cstr(str, pbuf);
|
||||
}
|
||||
if (last) rb_str_cat(str, &last, 1);
|
||||
}
|
||||
return str;
|
||||
}
|
||||
@ -282,9 +282,9 @@ ip_addr(int argc, VALUE *argv, VALUE sock)
|
||||
GetOpenFile(sock, fptr);
|
||||
|
||||
if (argc < 1 || !rsock_revlookup_flag(argv[0], &norevlookup))
|
||||
norevlookup = fptr->mode & FMODE_NOREVLOOKUP;
|
||||
norevlookup = fptr->mode & FMODE_NOREVLOOKUP;
|
||||
if (getsockname(fptr->fd, &addr.addr, &len) < 0)
|
||||
rb_sys_fail("getsockname(2)");
|
||||
rb_sys_fail("getsockname(2)");
|
||||
return rsock_ipaddr(&addr.addr, len, norevlookup);
|
||||
}
|
||||
|
||||
@ -323,9 +323,9 @@ ip_peeraddr(int argc, VALUE *argv, VALUE sock)
|
||||
GetOpenFile(sock, fptr);
|
||||
|
||||
if (argc < 1 || !rsock_revlookup_flag(argv[0], &norevlookup))
|
||||
norevlookup = fptr->mode & FMODE_NOREVLOOKUP;
|
||||
norevlookup = fptr->mode & FMODE_NOREVLOOKUP;
|
||||
if (getpeername(fptr->fd, &addr.addr, &len) < 0)
|
||||
rb_sys_fail("getpeername(2)");
|
||||
rb_sys_fail("getpeername(2)");
|
||||
return rsock_ipaddr(&addr.addr, len, norevlookup);
|
||||
}
|
||||
|
||||
|
@ -31,7 +31,7 @@ VALUE rb_cSockOpt;
|
||||
((len) == (size) ? \
|
||||
(void)0 : \
|
||||
rb_raise(rb_eTypeError, "size differ. expected as "#size"=%d but %ld", \
|
||||
(int)size, (long)(len)))
|
||||
(int)size, (long)(len)))
|
||||
|
||||
static VALUE
|
||||
sockopt_pack_byte(VALUE value)
|
||||
@ -309,7 +309,7 @@ sockopt_bool(VALUE self)
|
||||
StringValue(data);
|
||||
len = RSTRING_LEN(data);
|
||||
if (len == 1) {
|
||||
return *RSTRING_PTR(data) == 0 ? Qfalse : Qtrue;
|
||||
return *RSTRING_PTR(data) == 0 ? Qfalse : Qtrue;
|
||||
}
|
||||
check_size(len, sizeof(int));
|
||||
memcpy((char*)&i, RSTRING_PTR(data), len);
|
||||
@ -420,7 +420,7 @@ sockopt_ipv4_multicast_loop(VALUE self)
|
||||
|
||||
#if defined(IPPROTO_IP) && defined(IP_MULTICAST_LOOP)
|
||||
if (family == AF_INET && level == IPPROTO_IP && optname == IP_MULTICAST_LOOP) {
|
||||
return XCAT(sockopt_,TYPE_IP_MULTICAST_LOOP)(self);
|
||||
return XCAT(sockopt_,TYPE_IP_MULTICAST_LOOP)(self);
|
||||
}
|
||||
#endif
|
||||
rb_raise(rb_eTypeError, "ipv4_multicast_loop socket option expected");
|
||||
@ -471,7 +471,7 @@ sockopt_ipv4_multicast_ttl(VALUE self)
|
||||
|
||||
#if defined(IPPROTO_IP) && defined(IP_MULTICAST_TTL)
|
||||
if (family == AF_INET && level == IPPROTO_IP && optname == IP_MULTICAST_TTL) {
|
||||
return XCAT(sockopt_,TYPE_IP_MULTICAST_TTL)(self);
|
||||
return XCAT(sockopt_,TYPE_IP_MULTICAST_TTL)(self);
|
||||
}
|
||||
#endif
|
||||
rb_raise(rb_eTypeError, "ipv4_multicast_ttl socket option expected");
|
||||
@ -657,8 +657,8 @@ inet_ntop(int af, const void *addr, char *numaddr, size_t numaddr_len)
|
||||
#else
|
||||
unsigned long x = ntohl(*(unsigned long*)addr);
|
||||
snprintf(numaddr, numaddr_len, "%d.%d.%d.%d",
|
||||
(int) (x>>24) & 0xff, (int) (x>>16) & 0xff,
|
||||
(int) (x>> 8) & 0xff, (int) (x>> 0) & 0xff);
|
||||
(int) (x>>24) & 0xff, (int) (x>>16) & 0xff,
|
||||
(int) (x>> 8) & 0xff, (int) (x>> 0) & 0xff);
|
||||
#endif
|
||||
return numaddr;
|
||||
}
|
||||
@ -1059,16 +1059,16 @@ inspect_tcp_info(int level, int optname, VALUE data, VALUE ret)
|
||||
rb_str_catf(ret, " fackets=%u", s.tcpi_fackets);
|
||||
#endif
|
||||
#ifdef HAVE_STRUCT_TCP_INFO_TCPI_LAST_DATA_SENT
|
||||
inspect_tcpi_last_data_sent(ret, s.tcpi_last_data_sent);
|
||||
inspect_tcpi_last_data_sent(ret, s.tcpi_last_data_sent);
|
||||
#endif
|
||||
#ifdef HAVE_STRUCT_TCP_INFO_TCPI_LAST_ACK_SENT
|
||||
inspect_tcpi_last_ack_sent(ret, s.tcpi_last_ack_sent);
|
||||
inspect_tcpi_last_ack_sent(ret, s.tcpi_last_ack_sent);
|
||||
#endif
|
||||
#ifdef HAVE_STRUCT_TCP_INFO_TCPI_LAST_DATA_RECV
|
||||
inspect_tcpi_last_data_recv(ret, s.tcpi_last_data_recv);
|
||||
inspect_tcpi_last_data_recv(ret, s.tcpi_last_data_recv);
|
||||
#endif
|
||||
#ifdef HAVE_STRUCT_TCP_INFO_TCPI_LAST_ACK_RECV
|
||||
inspect_tcpi_last_ack_recv(ret, s.tcpi_last_ack_recv);
|
||||
inspect_tcpi_last_ack_recv(ret, s.tcpi_last_ack_recv);
|
||||
#endif
|
||||
#ifdef HAVE_STRUCT_TCP_INFO_TCPI_PMTU
|
||||
rb_str_catf(ret, " pmtu=%u", s.tcpi_pmtu);
|
||||
@ -1077,10 +1077,10 @@ inspect_tcp_info(int level, int optname, VALUE data, VALUE ret)
|
||||
rb_str_catf(ret, " rcv_ssthresh=%u", s.tcpi_rcv_ssthresh);
|
||||
#endif
|
||||
#ifdef HAVE_STRUCT_TCP_INFO_TCPI_RTT
|
||||
inspect_tcpi_rtt(ret, s.tcpi_rtt);
|
||||
inspect_tcpi_rtt(ret, s.tcpi_rtt);
|
||||
#endif
|
||||
#ifdef HAVE_STRUCT_TCP_INFO_TCPI_RTTVAR
|
||||
inspect_tcpi_rttvar(ret, s.tcpi_rttvar);
|
||||
inspect_tcpi_rttvar(ret, s.tcpi_rttvar);
|
||||
#endif
|
||||
#ifdef HAVE_STRUCT_TCP_INFO_TCPI_SND_SSTHRESH
|
||||
rb_str_catf(ret, " snd_ssthresh=%u", s.tcpi_snd_ssthresh);
|
||||
@ -1150,7 +1150,7 @@ inspect_peercred(int level, int optname, VALUE data, VALUE ret)
|
||||
RUBY_SOCK_PEERCRED cred;
|
||||
memcpy(&cred, RSTRING_PTR(data), sizeof(RUBY_SOCK_PEERCRED));
|
||||
rb_str_catf(ret, " pid=%u euid=%u egid=%u",
|
||||
(unsigned)cred.pid, (unsigned)cred.uid, (unsigned)cred.gid);
|
||||
(unsigned)cred.pid, (unsigned)cred.uid, (unsigned)cred.gid);
|
||||
rb_str_cat2(ret, " (ucred)");
|
||||
return 1;
|
||||
}
|
||||
@ -1171,14 +1171,14 @@ inspect_local_peercred(int level, int optname, VALUE data, VALUE ret)
|
||||
return 0;
|
||||
rb_str_catf(ret, " version=%u", cred.cr_version);
|
||||
rb_str_catf(ret, " euid=%u", cred.cr_uid);
|
||||
if (cred.cr_ngroups) {
|
||||
int i;
|
||||
const char *sep = " groups=";
|
||||
for (i = 0; i < cred.cr_ngroups; i++) {
|
||||
rb_str_catf(ret, "%s%u", sep, cred.cr_groups[i]);
|
||||
sep = ",";
|
||||
}
|
||||
}
|
||||
if (cred.cr_ngroups) {
|
||||
int i;
|
||||
const char *sep = " groups=";
|
||||
for (i = 0; i < cred.cr_ngroups; i++) {
|
||||
rb_str_catf(ret, "%s%u", sep, cred.cr_groups[i]);
|
||||
sep = ",";
|
||||
}
|
||||
}
|
||||
rb_str_cat2(ret, " (xucred)");
|
||||
return 1;
|
||||
}
|
||||
@ -1216,42 +1216,42 @@ sockopt_inspect(VALUE self)
|
||||
|
||||
family_id = rsock_intern_family_noprefix(family);
|
||||
if (family_id)
|
||||
rb_str_catf(ret, " %s", rb_id2name(family_id));
|
||||
rb_str_catf(ret, " %s", rb_id2name(family_id));
|
||||
else
|
||||
rb_str_catf(ret, " family:%d", family);
|
||||
|
||||
if (level == SOL_SOCKET) {
|
||||
rb_str_cat2(ret, " SOCKET");
|
||||
|
||||
optname_id = rsock_intern_so_optname(optname);
|
||||
if (optname_id)
|
||||
rb_str_catf(ret, " %s", rb_id2name(optname_id));
|
||||
else
|
||||
rb_str_catf(ret, " optname:%d", optname);
|
||||
optname_id = rsock_intern_so_optname(optname);
|
||||
if (optname_id)
|
||||
rb_str_catf(ret, " %s", rb_id2name(optname_id));
|
||||
else
|
||||
rb_str_catf(ret, " optname:%d", optname);
|
||||
}
|
||||
#ifdef HAVE_SYS_UN_H
|
||||
else if (family == AF_UNIX) {
|
||||
rb_str_catf(ret, " level:%d", level);
|
||||
rb_str_catf(ret, " level:%d", level);
|
||||
|
||||
optname_id = rsock_intern_local_optname(optname);
|
||||
if (optname_id)
|
||||
rb_str_catf(ret, " %s", rb_id2name(optname_id));
|
||||
else
|
||||
rb_str_catf(ret, " optname:%d", optname);
|
||||
optname_id = rsock_intern_local_optname(optname);
|
||||
if (optname_id)
|
||||
rb_str_catf(ret, " %s", rb_id2name(optname_id));
|
||||
else
|
||||
rb_str_catf(ret, " optname:%d", optname);
|
||||
}
|
||||
#endif
|
||||
else if (IS_IP_FAMILY(family)) {
|
||||
level_id = rsock_intern_iplevel(level);
|
||||
if (level_id)
|
||||
rb_str_catf(ret, " %s", rb_id2name(level_id));
|
||||
else
|
||||
rb_str_catf(ret, " level:%d", level);
|
||||
level_id = rsock_intern_iplevel(level);
|
||||
if (level_id)
|
||||
rb_str_catf(ret, " %s", rb_id2name(level_id));
|
||||
else
|
||||
rb_str_catf(ret, " level:%d", level);
|
||||
|
||||
v = optname_to_sym(level, optname);
|
||||
if (SYMBOL_P(v))
|
||||
rb_str_catf(ret, " %"PRIsVALUE, rb_sym2str(v));
|
||||
else
|
||||
rb_str_catf(ret, " optname:%d", optname);
|
||||
v = optname_to_sym(level, optname);
|
||||
if (SYMBOL_P(v))
|
||||
rb_str_catf(ret, " %"PRIsVALUE, rb_sym2str(v));
|
||||
else
|
||||
rb_str_catf(ret, " optname:%d", optname);
|
||||
}
|
||||
else {
|
||||
rb_str_catf(ret, " level:%d", level);
|
||||
|
@ -24,28 +24,28 @@ static const int lookup_order_table[] = {
|
||||
|
||||
static int
|
||||
ruby_getaddrinfo(const char *nodename, const char *servname,
|
||||
const struct addrinfo *hints, struct addrinfo **res)
|
||||
const struct addrinfo *hints, struct addrinfo **res)
|
||||
{
|
||||
struct addrinfo tmp_hints;
|
||||
int i, af, error;
|
||||
|
||||
if (hints->ai_family != PF_UNSPEC) {
|
||||
return getaddrinfo(nodename, servname, hints, res);
|
||||
return getaddrinfo(nodename, servname, hints, res);
|
||||
}
|
||||
|
||||
for (i = 0; i < LOOKUP_ORDERS; i++) {
|
||||
af = lookup_order_table[i];
|
||||
MEMCPY(&tmp_hints, hints, struct addrinfo, 1);
|
||||
tmp_hints.ai_family = af;
|
||||
error = getaddrinfo(nodename, servname, &tmp_hints, res);
|
||||
if (error) {
|
||||
if (tmp_hints.ai_family == PF_UNSPEC) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
else {
|
||||
break;
|
||||
}
|
||||
af = lookup_order_table[i];
|
||||
MEMCPY(&tmp_hints, hints, struct addrinfo, 1);
|
||||
tmp_hints.ai_family = af;
|
||||
error = getaddrinfo(nodename, servname, &tmp_hints, res);
|
||||
if (error) {
|
||||
if (tmp_hints.ai_family == PF_UNSPEC) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return error;
|
||||
@ -56,17 +56,17 @@ ruby_getaddrinfo(const char *nodename, const char *servname,
|
||||
#if defined(_AIX)
|
||||
static int
|
||||
ruby_getaddrinfo__aix(const char *nodename, const char *servname,
|
||||
const struct addrinfo *hints, struct addrinfo **res)
|
||||
const struct addrinfo *hints, struct addrinfo **res)
|
||||
{
|
||||
int error = getaddrinfo(nodename, servname, hints, res);
|
||||
struct addrinfo *r;
|
||||
if (error)
|
||||
return error;
|
||||
return error;
|
||||
for (r = *res; r != NULL; r = r->ai_next) {
|
||||
if (r->ai_addr->sa_family == 0)
|
||||
r->ai_addr->sa_family = r->ai_family;
|
||||
if (r->ai_addr->sa_len == 0)
|
||||
r->ai_addr->sa_len = r->ai_addrlen;
|
||||
if (r->ai_addr->sa_family == 0)
|
||||
r->ai_addr->sa_family = r->ai_family;
|
||||
if (r->ai_addr->sa_len == 0)
|
||||
r->ai_addr->sa_len = r->ai_addrlen;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@ -74,21 +74,21 @@ ruby_getaddrinfo__aix(const char *nodename, const char *servname,
|
||||
#define getaddrinfo(node,serv,hints,res) ruby_getaddrinfo__aix((node),(serv),(hints),(res))
|
||||
static int
|
||||
ruby_getnameinfo__aix(const struct sockaddr *sa, size_t salen,
|
||||
char *host, size_t hostlen,
|
||||
char *serv, size_t servlen, int flags)
|
||||
char *host, size_t hostlen,
|
||||
char *serv, size_t servlen, int flags)
|
||||
{
|
||||
struct sockaddr_in6 *sa6;
|
||||
u_int32_t *a6;
|
||||
|
||||
if (sa->sa_family == AF_INET6) {
|
||||
sa6 = (struct sockaddr_in6 *)sa;
|
||||
a6 = sa6->sin6_addr.u6_addr.u6_addr32;
|
||||
sa6 = (struct sockaddr_in6 *)sa;
|
||||
a6 = sa6->sin6_addr.u6_addr.u6_addr32;
|
||||
|
||||
if (a6[0] == 0 && a6[1] == 0 && a6[2] == 0 && a6[3] == 0) {
|
||||
strncpy(host, "::", hostlen);
|
||||
snprintf(serv, servlen, "%d", sa6->sin6_port);
|
||||
return 0;
|
||||
}
|
||||
if (a6[0] == 0 && a6[1] == 0 && a6[2] == 0 && a6[3] == 0) {
|
||||
strncpy(host, "::", hostlen);
|
||||
snprintf(serv, servlen, "%d", sa6->sin6_port);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return getnameinfo(sa, salen, host, hostlen, serv, servlen, flags);
|
||||
}
|
||||
@ -102,7 +102,7 @@ static int str_is_number(const char *);
|
||||
#if defined(__APPLE__)
|
||||
static int
|
||||
ruby_getaddrinfo__darwin(const char *nodename, const char *servname,
|
||||
const struct addrinfo *hints, struct addrinfo **res)
|
||||
const struct addrinfo *hints, struct addrinfo **res)
|
||||
{
|
||||
/* fix [ruby-core:29427] */
|
||||
const char *tmp_servname;
|
||||
@ -112,12 +112,12 @@ ruby_getaddrinfo__darwin(const char *nodename, const char *servname,
|
||||
tmp_servname = servname;
|
||||
MEMCPY(&tmp_hints, hints, struct addrinfo, 1);
|
||||
if (nodename && servname) {
|
||||
if (str_is_number(tmp_servname) && atoi(servname) == 0) {
|
||||
tmp_servname = NULL;
|
||||
if (str_is_number(tmp_servname) && atoi(servname) == 0) {
|
||||
tmp_servname = NULL;
|
||||
#ifdef AI_NUMERICSERV
|
||||
if (tmp_hints.ai_flags) tmp_hints.ai_flags &= ~AI_NUMERICSERV;
|
||||
if (tmp_hints.ai_flags) tmp_hints.ai_flags &= ~AI_NUMERICSERV;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
error = getaddrinfo(nodename, tmp_servname, &tmp_hints, res);
|
||||
@ -193,7 +193,7 @@ nogvl_getaddrinfo(void *arg)
|
||||
* it cause getaddrinfo to return EAI_SYSTEM/ENOENT. [ruby-list:49420]
|
||||
*/
|
||||
if (ret == EAI_SYSTEM && errno == ENOENT)
|
||||
ret = EAI_NONAME;
|
||||
ret = EAI_NONAME;
|
||||
#endif
|
||||
return (void *)(VALUE)ret;
|
||||
}
|
||||
@ -212,15 +212,15 @@ numeric_getaddrinfo(const char *node, const char *service,
|
||||
int port;
|
||||
|
||||
if (node && parse_numeric_port(service, &port)) {
|
||||
static const struct {
|
||||
int socktype;
|
||||
int protocol;
|
||||
} list[] = {
|
||||
{ SOCK_STREAM, IPPROTO_TCP },
|
||||
{ SOCK_DGRAM, IPPROTO_UDP },
|
||||
{ SOCK_RAW, 0 }
|
||||
};
|
||||
struct addrinfo *ai = NULL;
|
||||
static const struct {
|
||||
int socktype;
|
||||
int protocol;
|
||||
} list[] = {
|
||||
{ SOCK_STREAM, IPPROTO_TCP },
|
||||
{ SOCK_DGRAM, IPPROTO_UDP },
|
||||
{ SOCK_RAW, 0 }
|
||||
};
|
||||
struct addrinfo *ai = NULL;
|
||||
int hint_family = hints ? hints->ai_family : PF_UNSPEC;
|
||||
int hint_socktype = hints ? hints->ai_socktype : 0;
|
||||
int hint_protocol = hints ? hints->ai_protocol : 0;
|
||||
@ -319,9 +319,9 @@ nogvl_getnameinfo(void *arg)
|
||||
{
|
||||
struct getnameinfo_arg *ptr = arg;
|
||||
return (void *)(VALUE)getnameinfo(ptr->sa, ptr->salen,
|
||||
ptr->host, (socklen_t)ptr->hostlen,
|
||||
ptr->serv, (socklen_t)ptr->servlen,
|
||||
ptr->flags);
|
||||
ptr->host, (socklen_t)ptr->hostlen,
|
||||
ptr->serv, (socklen_t)ptr->servlen,
|
||||
ptr->flags);
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -587,7 +587,7 @@ rsock_fd_family(int fd)
|
||||
|
||||
if (fd < 0 || getsockname(fd, &sa, &sa_len) != 0 ||
|
||||
(size_t)sa_len < offsetof(struct sockaddr, sa_family) + sizeof(sa.sa_family)) {
|
||||
return AF_UNSPEC;
|
||||
return AF_UNSPEC;
|
||||
}
|
||||
return sa.sa_family;
|
||||
}
|
||||
@ -677,19 +677,19 @@ rsock_unix_sockaddr_len(VALUE path)
|
||||
{
|
||||
#ifdef __linux__
|
||||
if (RSTRING_LEN(path) == 0) {
|
||||
/* autobind; see unix(7) for details. */
|
||||
return (socklen_t) sizeof(sa_family_t);
|
||||
/* autobind; see unix(7) for details. */
|
||||
return (socklen_t) sizeof(sa_family_t);
|
||||
}
|
||||
else if (RSTRING_PTR(path)[0] == '\0') {
|
||||
/* abstract namespace; see unix(7) for details. */
|
||||
/* abstract namespace; see unix(7) for details. */
|
||||
if (SOCKLEN_MAX - offsetof(struct sockaddr_un, sun_path) < (size_t)RSTRING_LEN(path))
|
||||
rb_raise(rb_eArgError, "Linux abstract socket too long");
|
||||
return (socklen_t) offsetof(struct sockaddr_un, sun_path) +
|
||||
RSTRING_SOCKLEN(path);
|
||||
return (socklen_t) offsetof(struct sockaddr_un, sun_path) +
|
||||
RSTRING_SOCKLEN(path);
|
||||
}
|
||||
else {
|
||||
#endif
|
||||
return (socklen_t) sizeof(struct sockaddr_un);
|
||||
return (socklen_t) sizeof(struct sockaddr_un);
|
||||
#ifdef __linux__
|
||||
}
|
||||
#endif
|
||||
@ -727,7 +727,7 @@ make_hostent_internal(VALUE v)
|
||||
rb_ary_push(ary, rb_str_new2(hostp));
|
||||
|
||||
if (addr->ai_canonname && strlen(addr->ai_canonname) < NI_MAXHOST &&
|
||||
(h = gethostbyname(addr->ai_canonname))) {
|
||||
(h = gethostbyname(addr->ai_canonname))) {
|
||||
names = rb_ary_new();
|
||||
if (h->h_aliases != NULL) {
|
||||
for (pch = h->h_aliases; *pch; pch++) {
|
||||
@ -875,19 +875,19 @@ call_getaddrinfo(VALUE node, VALUE service,
|
||||
hints.ai_family = NIL_P(family) ? PF_UNSPEC : rsock_family_arg(family);
|
||||
|
||||
if (!NIL_P(socktype)) {
|
||||
hints.ai_socktype = rsock_socktype_arg(socktype);
|
||||
hints.ai_socktype = rsock_socktype_arg(socktype);
|
||||
}
|
||||
if (!NIL_P(protocol)) {
|
||||
hints.ai_protocol = NUM2INT(protocol);
|
||||
hints.ai_protocol = NUM2INT(protocol);
|
||||
}
|
||||
if (!NIL_P(flags)) {
|
||||
hints.ai_flags = NUM2INT(flags);
|
||||
hints.ai_flags = NUM2INT(flags);
|
||||
}
|
||||
|
||||
res = rsock_getaddrinfo(node, service, &hints, socktype_hack);
|
||||
|
||||
if (res == NULL)
|
||||
rb_raise(rb_eSocket, "host not found");
|
||||
rb_raise(rb_eSocket, "host not found");
|
||||
return res;
|
||||
}
|
||||
|
||||
@ -1037,7 +1037,7 @@ init_unix_addrinfo(rb_addrinfo_t *rai, VALUE path, int socktype)
|
||||
|
||||
len = rsock_unix_sockaddr_len(path);
|
||||
init_addrinfo(rai, (struct sockaddr *)&un, len,
|
||||
PF_UNIX, socktype, 0, Qnil, Qnil);
|
||||
PF_UNIX, socktype, 0, Qnil, Qnil);
|
||||
}
|
||||
|
||||
static long
|
||||
@ -1119,7 +1119,7 @@ addrinfo_initialize(int argc, VALUE *argv, VALUE self)
|
||||
int af;
|
||||
StringValue(afamily);
|
||||
if (rsock_family_to_int(RSTRING_PTR(afamily), RSTRING_LEN(afamily), &af) == -1)
|
||||
rb_raise(rb_eSocket, "unknown address family: %s", StringValueCStr(afamily));
|
||||
rb_raise(rb_eSocket, "unknown address family: %s", StringValueCStr(afamily));
|
||||
switch (af) {
|
||||
case AF_INET: /* ["AF_INET", 46102, "localhost.localdomain", "127.0.0.1"] */
|
||||
#ifdef INET6
|
||||
@ -1209,45 +1209,45 @@ rsock_inspect_sockaddr(struct sockaddr *sockaddr_arg, socklen_t socklen, VALUE r
|
||||
else {
|
||||
switch (sockaddr->addr.sa_family) {
|
||||
case AF_UNSPEC:
|
||||
{
|
||||
rb_str_cat2(ret, "UNSPEC");
|
||||
{
|
||||
rb_str_cat2(ret, "UNSPEC");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
case AF_INET:
|
||||
{
|
||||
struct sockaddr_in *addr;
|
||||
int port;
|
||||
addr = &sockaddr->in;
|
||||
if ((socklen_t)(((char*)&addr->sin_addr)-(char*)addr+0+1) <= socklen)
|
||||
rb_str_catf(ret, "%d", ((unsigned char*)&addr->sin_addr)[0]);
|
||||
else
|
||||
rb_str_cat2(ret, "?");
|
||||
if ((socklen_t)(((char*)&addr->sin_addr)-(char*)addr+1+1) <= socklen)
|
||||
rb_str_catf(ret, ".%d", ((unsigned char*)&addr->sin_addr)[1]);
|
||||
else
|
||||
rb_str_cat2(ret, ".?");
|
||||
if ((socklen_t)(((char*)&addr->sin_addr)-(char*)addr+2+1) <= socklen)
|
||||
rb_str_catf(ret, ".%d", ((unsigned char*)&addr->sin_addr)[2]);
|
||||
else
|
||||
rb_str_cat2(ret, ".?");
|
||||
if ((socklen_t)(((char*)&addr->sin_addr)-(char*)addr+3+1) <= socklen)
|
||||
rb_str_catf(ret, ".%d", ((unsigned char*)&addr->sin_addr)[3]);
|
||||
else
|
||||
rb_str_cat2(ret, ".?");
|
||||
addr = &sockaddr->in;
|
||||
if ((socklen_t)(((char*)&addr->sin_addr)-(char*)addr+0+1) <= socklen)
|
||||
rb_str_catf(ret, "%d", ((unsigned char*)&addr->sin_addr)[0]);
|
||||
else
|
||||
rb_str_cat2(ret, "?");
|
||||
if ((socklen_t)(((char*)&addr->sin_addr)-(char*)addr+1+1) <= socklen)
|
||||
rb_str_catf(ret, ".%d", ((unsigned char*)&addr->sin_addr)[1]);
|
||||
else
|
||||
rb_str_cat2(ret, ".?");
|
||||
if ((socklen_t)(((char*)&addr->sin_addr)-(char*)addr+2+1) <= socklen)
|
||||
rb_str_catf(ret, ".%d", ((unsigned char*)&addr->sin_addr)[2]);
|
||||
else
|
||||
rb_str_cat2(ret, ".?");
|
||||
if ((socklen_t)(((char*)&addr->sin_addr)-(char*)addr+3+1) <= socklen)
|
||||
rb_str_catf(ret, ".%d", ((unsigned char*)&addr->sin_addr)[3]);
|
||||
else
|
||||
rb_str_cat2(ret, ".?");
|
||||
|
||||
if ((socklen_t)(((char*)&addr->sin_port)-(char*)addr+(int)sizeof(addr->sin_port)) < socklen) {
|
||||
port = ntohs(addr->sin_port);
|
||||
if (port)
|
||||
rb_str_catf(ret, ":%d", port);
|
||||
}
|
||||
else {
|
||||
rb_str_cat2(ret, ":?");
|
||||
}
|
||||
if ((socklen_t)sizeof(struct sockaddr_in) != socklen)
|
||||
rb_str_catf(ret, " (%d bytes for %d bytes sockaddr_in)",
|
||||
(int)socklen,
|
||||
(int)sizeof(struct sockaddr_in));
|
||||
if ((socklen_t)(((char*)&addr->sin_port)-(char*)addr+(int)sizeof(addr->sin_port)) < socklen) {
|
||||
port = ntohs(addr->sin_port);
|
||||
if (port)
|
||||
rb_str_catf(ret, ":%d", port);
|
||||
}
|
||||
else {
|
||||
rb_str_cat2(ret, ":?");
|
||||
}
|
||||
if ((socklen_t)sizeof(struct sockaddr_in) != socklen)
|
||||
rb_str_catf(ret, " (%d bytes for %d bytes sockaddr_in)",
|
||||
(int)socklen,
|
||||
(int)sizeof(struct sockaddr_in));
|
||||
break;
|
||||
}
|
||||
|
||||
@ -1398,20 +1398,20 @@ rsock_inspect_sockaddr(struct sockaddr *sockaddr_arg, socklen_t socklen, VALUE r
|
||||
#endif
|
||||
|
||||
#if defined(AF_LINK) && defined(HAVE_TYPE_STRUCT_SOCKADDR_DL)
|
||||
/* AF_LINK is defined in 4.4BSD derivations since Net2.
|
||||
link_ntoa is also defined at Net2.
|
||||
/* AF_LINK is defined in 4.4BSD derivations since Net2.
|
||||
link_ntoa is also defined at Net2.
|
||||
However Debian GNU/kFreeBSD defines AF_LINK but
|
||||
don't have link_ntoa. */
|
||||
case AF_LINK:
|
||||
{
|
||||
/*
|
||||
* Simple implementation using link_ntoa():
|
||||
* This doesn't work on Debian GNU/kFreeBSD 6.0.7 (squeeze).
|
||||
{
|
||||
/*
|
||||
* Simple implementation using link_ntoa():
|
||||
* This doesn't work on Debian GNU/kFreeBSD 6.0.7 (squeeze).
|
||||
* Also, the format is bit different.
|
||||
*
|
||||
* rb_str_catf(ret, "LINK %s", link_ntoa(&sockaddr->dl));
|
||||
* break;
|
||||
*/
|
||||
*
|
||||
* rb_str_catf(ret, "LINK %s", link_ntoa(&sockaddr->dl));
|
||||
* break;
|
||||
*/
|
||||
struct sockaddr_dl *addr = &sockaddr->dl;
|
||||
char *np = NULL, *ap = NULL, *endp;
|
||||
int nlen = 0, alen = 0;
|
||||
@ -1438,14 +1438,14 @@ rsock_inspect_sockaddr(struct sockaddr *sockaddr_arg, socklen_t socklen, VALUE r
|
||||
alen = (int)(endp - ap);
|
||||
}
|
||||
|
||||
CATSEP;
|
||||
CATSEP;
|
||||
if (np)
|
||||
rb_str_catf(ret, "%.*s", nlen, np);
|
||||
else
|
||||
rb_str_cat2(ret, "?");
|
||||
|
||||
if (ap && 0 < alen) {
|
||||
CATSEP;
|
||||
CATSEP;
|
||||
for (i = 0; i < alen; i++)
|
||||
rb_str_catf(ret, "%s%02x", i == 0 ? "" : ":", (unsigned char)ap[i]);
|
||||
}
|
||||
@ -1456,10 +1456,10 @@ rsock_inspect_sockaddr(struct sockaddr *sockaddr_arg, socklen_t socklen, VALUE r
|
||||
/* longer length is possible behavior because struct sockaddr_dl has "minimum work area, can be larger" as the last field.
|
||||
* cf. Net2:/usr/src/sys/net/if_dl.h. */
|
||||
socklen < (socklen_t)(offsetof(struct sockaddr_dl, sdl_data) + addr->sdl_nlen + addr->sdl_alen + addr->sdl_slen)) {
|
||||
CATSEP;
|
||||
CATSEP;
|
||||
rb_str_catf(ret, "(%d bytes for %d bytes sockaddr_dl)",
|
||||
(int)socklen, (int)sizeof(struct sockaddr_dl));
|
||||
}
|
||||
}
|
||||
|
||||
rb_str_cat2(ret, "]");
|
||||
#undef CATSEP
|
||||
@ -2009,7 +2009,7 @@ addrinfo_ip_unpack(VALUE self)
|
||||
VALUE ret, portstr;
|
||||
|
||||
if (!IS_IP_FAMILY(family))
|
||||
rb_raise(rb_eSocket, "need IPv4 or IPv6 address");
|
||||
rb_raise(rb_eSocket, "need IPv4 or IPv6 address");
|
||||
|
||||
vflags = INT2NUM(NI_NUMERICHOST|NI_NUMERICSERV);
|
||||
ret = addrinfo_getnameinfo(1, &vflags, self);
|
||||
@ -2036,7 +2036,7 @@ addrinfo_ip_address(VALUE self)
|
||||
VALUE ret;
|
||||
|
||||
if (!IS_IP_FAMILY(family))
|
||||
rb_raise(rb_eSocket, "need IPv4 or IPv6 address");
|
||||
rb_raise(rb_eSocket, "need IPv4 or IPv6 address");
|
||||
|
||||
vflags = INT2NUM(NI_NUMERICHOST|NI_NUMERICSERV);
|
||||
ret = addrinfo_getnameinfo(1, &vflags, self);
|
||||
@ -2062,9 +2062,9 @@ addrinfo_ip_port(VALUE self)
|
||||
if (!IS_IP_FAMILY(family)) {
|
||||
bad_family:
|
||||
#ifdef AF_INET6
|
||||
rb_raise(rb_eSocket, "need IPv4 or IPv6 address");
|
||||
rb_raise(rb_eSocket, "need IPv4 or IPv6 address");
|
||||
#else
|
||||
rb_raise(rb_eSocket, "need IPv4 address");
|
||||
rb_raise(rb_eSocket, "need IPv4 address");
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -2084,7 +2084,7 @@ addrinfo_ip_port(VALUE self)
|
||||
#endif
|
||||
|
||||
default:
|
||||
goto bad_family;
|
||||
goto bad_family;
|
||||
}
|
||||
|
||||
return INT2NUM(port);
|
||||
@ -2362,7 +2362,7 @@ addrinfo_unix_path(VALUE self)
|
||||
long n;
|
||||
|
||||
if (family != AF_UNIX)
|
||||
rb_raise(rb_eSocket, "need AF_UNIX address");
|
||||
rb_raise(rb_eSocket, "need AF_UNIX address");
|
||||
|
||||
addr = &rai->addr.un;
|
||||
|
||||
@ -2429,10 +2429,10 @@ addrinfo_s_getaddrinfo(int argc, VALUE *argv, VALUE self)
|
||||
VALUE node, service, family, socktype, protocol, flags, opts, timeout;
|
||||
|
||||
rb_scan_args(argc, argv, "24:", &node, &service, &family, &socktype,
|
||||
&protocol, &flags, &opts);
|
||||
&protocol, &flags, &opts);
|
||||
rb_get_kwargs(opts, &id_timeout, 0, 1, &timeout);
|
||||
if (timeout == Qundef) {
|
||||
timeout = Qnil;
|
||||
timeout = Qnil;
|
||||
}
|
||||
|
||||
return addrinfo_list_new(node, service, family, socktype, protocol, flags, timeout);
|
||||
|
@ -368,23 +368,23 @@ enum sock_recv_type {
|
||||
};
|
||||
|
||||
VALUE rsock_s_recvfrom_nonblock(VALUE sock, VALUE len, VALUE flg, VALUE str,
|
||||
VALUE ex, enum sock_recv_type from);
|
||||
VALUE ex, enum sock_recv_type from);
|
||||
VALUE rsock_s_recvfrom(VALUE sock, int argc, VALUE *argv, enum sock_recv_type from);
|
||||
|
||||
int rsock_connect(int fd, const struct sockaddr *sockaddr, int len, int socks, struct timeval *timeout);
|
||||
|
||||
VALUE rsock_s_accept(VALUE klass, VALUE io, struct sockaddr *sockaddr, socklen_t *len);
|
||||
VALUE rsock_s_accept_nonblock(VALUE klass, VALUE ex, rb_io_t *fptr,
|
||||
struct sockaddr *sockaddr, socklen_t *len);
|
||||
struct sockaddr *sockaddr, socklen_t *len);
|
||||
VALUE rsock_sock_listen(VALUE sock, VALUE log);
|
||||
|
||||
VALUE rsock_sockopt_new(int family, int level, int optname, VALUE data);
|
||||
|
||||
#if defined(HAVE_SENDMSG)
|
||||
VALUE rsock_bsock_sendmsg(VALUE sock, VALUE data, VALUE flags,
|
||||
VALUE dest_sockaddr, VALUE controls);
|
||||
VALUE dest_sockaddr, VALUE controls);
|
||||
VALUE rsock_bsock_sendmsg_nonblock(VALUE sock, VALUE data, VALUE flags,
|
||||
VALUE dest_sockaddr, VALUE controls, VALUE ex);
|
||||
VALUE dest_sockaddr, VALUE controls, VALUE ex);
|
||||
#else
|
||||
#define rsock_bsock_sendmsg rb_f_notimplement
|
||||
#define rsock_bsock_sendmsg_nonblock rb_f_notimplement
|
||||
@ -392,9 +392,9 @@ VALUE rsock_bsock_sendmsg_nonblock(VALUE sock, VALUE data, VALUE flags,
|
||||
|
||||
#if defined(HAVE_RECVMSG)
|
||||
VALUE rsock_bsock_recvmsg(VALUE sock, VALUE dlen, VALUE clen, VALUE flags,
|
||||
VALUE scm_rights);
|
||||
VALUE scm_rights);
|
||||
VALUE rsock_bsock_recvmsg_nonblock(VALUE sock, VALUE dlen, VALUE clen,
|
||||
VALUE flags, VALUE scm_rights, VALUE ex);
|
||||
VALUE flags, VALUE scm_rights, VALUE ex);
|
||||
ssize_t rsock_recvmsg(int socket, struct msghdr *message, int flags);
|
||||
#else
|
||||
#define rsock_bsock_recvmsg rb_f_notimplement
|
||||
|
@ -26,7 +26,7 @@ rsock_syserr_fail_host_port(int err, const char *mesg, VALUE host, VALUE port)
|
||||
VALUE message;
|
||||
|
||||
message = rb_sprintf("%s for %+"PRIsVALUE" port % "PRIsVALUE"",
|
||||
mesg, host, port);
|
||||
mesg, host, port);
|
||||
|
||||
rb_syserr_fail_str(err, message);
|
||||
}
|
||||
@ -43,11 +43,11 @@ rsock_syserr_fail_path(int err, const char *mesg, VALUE path)
|
||||
VALUE message;
|
||||
|
||||
if (RB_TYPE_P(path, T_STRING)) {
|
||||
message = rb_sprintf("%s for % "PRIsVALUE"", mesg, path);
|
||||
rb_syserr_fail_str(err, message);
|
||||
message = rb_sprintf("%s for % "PRIsVALUE"", mesg, path);
|
||||
rb_syserr_fail_str(err, message);
|
||||
}
|
||||
else {
|
||||
rb_syserr_fail(err, mesg);
|
||||
rb_syserr_fail(err, mesg);
|
||||
}
|
||||
}
|
||||
|
||||
@ -96,12 +96,12 @@ rsock_syserr_fail_raddrinfo_or_sockaddr(int err, const char *mesg, VALUE addr, V
|
||||
if (NIL_P(rai)) {
|
||||
StringValue(addr);
|
||||
|
||||
rsock_syserr_fail_sockaddr(err, mesg,
|
||||
rsock_syserr_fail_sockaddr(err, mesg,
|
||||
(struct sockaddr *)RSTRING_PTR(addr),
|
||||
(socklen_t)RSTRING_LEN(addr)); /* overflow should be checked already */
|
||||
}
|
||||
else
|
||||
rsock_syserr_fail_raddrinfo(err, mesg, rai);
|
||||
rsock_syserr_fail_raddrinfo(err, mesg, rai);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -256,7 +256,7 @@ rsock_sock_s_socketpair(int argc, VALUE *argv, VALUE klass)
|
||||
p = NUM2INT(protocol);
|
||||
ret = rsock_socketpair(d, t, p, sp);
|
||||
if (ret < 0) {
|
||||
rb_sys_fail("socketpair(2)");
|
||||
rb_sys_fail("socketpair(2)");
|
||||
}
|
||||
|
||||
s1 = rsock_init_sock(rb_obj_alloc(klass), sp[0]);
|
||||
@ -395,7 +395,7 @@ sock_connect(VALUE sock, VALUE addr)
|
||||
fd = fptr->fd;
|
||||
n = rsock_connect(fd, (struct sockaddr*)RSTRING_PTR(addr), RSTRING_SOCKLEN(addr), 0, NULL);
|
||||
if (n < 0) {
|
||||
rsock_sys_fail_raddrinfo_or_sockaddr("connect(2)", addr, rai);
|
||||
rsock_sys_fail_raddrinfo_or_sockaddr("connect(2)", addr, rai);
|
||||
}
|
||||
|
||||
return INT2FIX(n);
|
||||
@ -415,19 +415,19 @@ sock_connect_nonblock(VALUE sock, VALUE addr, VALUE ex)
|
||||
rb_io_set_nonblock(fptr);
|
||||
n = connect(fptr->fd, (struct sockaddr*)RSTRING_PTR(addr), RSTRING_SOCKLEN(addr));
|
||||
if (n < 0) {
|
||||
int e = errno;
|
||||
if (e == EINPROGRESS) {
|
||||
int e = errno;
|
||||
if (e == EINPROGRESS) {
|
||||
if (ex == Qfalse) {
|
||||
return sym_wait_writable;
|
||||
}
|
||||
rb_readwrite_syserr_fail(RB_IO_WAIT_WRITABLE, e, "connect(2) would block");
|
||||
}
|
||||
if (e == EISCONN) {
|
||||
}
|
||||
if (e == EISCONN) {
|
||||
if (ex == Qfalse) {
|
||||
return INT2FIX(0);
|
||||
}
|
||||
}
|
||||
rsock_syserr_fail_raddrinfo_or_sockaddr(e, "connect(2)", addr, rai);
|
||||
}
|
||||
rsock_syserr_fail_raddrinfo_or_sockaddr(e, "connect(2)", addr, rai);
|
||||
}
|
||||
|
||||
return INT2FIX(n);
|
||||
@ -528,7 +528,7 @@ sock_bind(VALUE sock, VALUE addr)
|
||||
SockAddrStringValueWithAddrinfo(addr, rai);
|
||||
GetOpenFile(sock, fptr);
|
||||
if (bind(fptr->fd, (struct sockaddr*)RSTRING_PTR(addr), RSTRING_SOCKLEN(addr)) < 0)
|
||||
rsock_sys_fail_raddrinfo_or_sockaddr("bind(2)", addr, rai);
|
||||
rsock_sys_fail_raddrinfo_or_sockaddr("bind(2)", addr, rai);
|
||||
|
||||
return INT2FIX(0);
|
||||
}
|
||||
@ -612,7 +612,7 @@ rsock_sock_listen(VALUE sock, VALUE log)
|
||||
backlog = NUM2INT(log);
|
||||
GetOpenFile(sock, fptr);
|
||||
if (listen(fptr->fd, backlog) < 0)
|
||||
rb_sys_fail("listen(2)");
|
||||
rb_sys_fail("listen(2)");
|
||||
|
||||
return INT2FIX(0);
|
||||
}
|
||||
@ -774,7 +774,7 @@ sock_accept_nonblock(VALUE sock, VALUE ex)
|
||||
sock2 = rsock_s_accept_nonblock(rb_cSocket, ex, fptr, addr, &len);
|
||||
|
||||
if (SYMBOL_P(sock2)) /* :wait_readable */
|
||||
return sock2;
|
||||
return sock2;
|
||||
return rb_assoc_new(sock2, rsock_io_socket_addrinfo(sock2, &buf.addr, len));
|
||||
}
|
||||
|
||||
@ -855,19 +855,19 @@ sock_gethostname(VALUE obj)
|
||||
|
||||
name = rb_str_new(0, len);
|
||||
while (gethostname(RSTRING_PTR(name), len) < 0) {
|
||||
int e = errno;
|
||||
switch (e) {
|
||||
case ENAMETOOLONG:
|
||||
int e = errno;
|
||||
switch (e) {
|
||||
case ENAMETOOLONG:
|
||||
#ifdef __linux__
|
||||
case EINVAL:
|
||||
/* glibc before version 2.1 uses EINVAL instead of ENAMETOOLONG */
|
||||
case EINVAL:
|
||||
/* glibc before version 2.1 uses EINVAL instead of ENAMETOOLONG */
|
||||
#endif
|
||||
break;
|
||||
default:
|
||||
rb_syserr_fail(e, "gethostname(3)");
|
||||
}
|
||||
rb_str_modify_expand(name, len);
|
||||
len += len;
|
||||
break;
|
||||
default:
|
||||
rb_syserr_fail(e, "gethostname(3)");
|
||||
}
|
||||
rb_str_modify_expand(name, len);
|
||||
len += len;
|
||||
}
|
||||
rb_str_resize(name, strlen(RSTRING_PTR(name)));
|
||||
return name;
|
||||
@ -897,18 +897,18 @@ make_addrinfo(struct rb_addrinfo *res0, int norevlookup)
|
||||
struct addrinfo *res;
|
||||
|
||||
if (res0 == NULL) {
|
||||
rb_raise(rb_eSocket, "host not found");
|
||||
rb_raise(rb_eSocket, "host not found");
|
||||
}
|
||||
base = rb_ary_new();
|
||||
for (res = res0->ai; res; res = res->ai_next) {
|
||||
ary = rsock_ipaddr(res->ai_addr, res->ai_addrlen, norevlookup);
|
||||
if (res->ai_canonname) {
|
||||
RARRAY_ASET(ary, 2, rb_str_new2(res->ai_canonname));
|
||||
}
|
||||
rb_ary_push(ary, INT2FIX(res->ai_family));
|
||||
rb_ary_push(ary, INT2FIX(res->ai_socktype));
|
||||
rb_ary_push(ary, INT2FIX(res->ai_protocol));
|
||||
rb_ary_push(base, ary);
|
||||
ary = rsock_ipaddr(res->ai_addr, res->ai_addrlen, norevlookup);
|
||||
if (res->ai_canonname) {
|
||||
RARRAY_ASET(ary, 2, rb_str_new2(res->ai_canonname));
|
||||
}
|
||||
rb_ary_push(ary, INT2FIX(res->ai_family));
|
||||
rb_ary_push(ary, INT2FIX(res->ai_socktype));
|
||||
rb_ary_push(ary, INT2FIX(res->ai_protocol));
|
||||
rb_ary_push(base, ary);
|
||||
}
|
||||
return base;
|
||||
}
|
||||
@ -920,18 +920,18 @@ sock_sockaddr(struct sockaddr *addr, socklen_t len)
|
||||
|
||||
switch (addr->sa_family) {
|
||||
case AF_INET:
|
||||
ptr = (char*)&((struct sockaddr_in*)addr)->sin_addr.s_addr;
|
||||
len = (socklen_t)sizeof(((struct sockaddr_in*)addr)->sin_addr.s_addr);
|
||||
break;
|
||||
ptr = (char*)&((struct sockaddr_in*)addr)->sin_addr.s_addr;
|
||||
len = (socklen_t)sizeof(((struct sockaddr_in*)addr)->sin_addr.s_addr);
|
||||
break;
|
||||
#ifdef AF_INET6
|
||||
case AF_INET6:
|
||||
ptr = (char*)&((struct sockaddr_in6*)addr)->sin6_addr.s6_addr;
|
||||
len = (socklen_t)sizeof(((struct sockaddr_in6*)addr)->sin6_addr.s6_addr);
|
||||
break;
|
||||
ptr = (char*)&((struct sockaddr_in6*)addr)->sin6_addr.s6_addr;
|
||||
len = (socklen_t)sizeof(((struct sockaddr_in6*)addr)->sin6_addr.s6_addr);
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
rb_raise(rb_eSocket, "unknown socket family:%d", addr->sa_family);
|
||||
break;
|
||||
break;
|
||||
}
|
||||
return rb_str_new(ptr, len);
|
||||
}
|
||||
@ -961,7 +961,7 @@ sock_s_gethostbyname(VALUE obj, VALUE host)
|
||||
{
|
||||
rb_warn("Socket.gethostbyname is deprecated; use Addrinfo.getaddrinfo instead.");
|
||||
struct rb_addrinfo *res =
|
||||
rsock_addrinfo(host, Qnil, AF_UNSPEC, SOCK_STREAM, AI_CANONNAME);
|
||||
rsock_addrinfo(host, Qnil, AF_UNSPEC, SOCK_STREAM, AI_CANONNAME);
|
||||
return rsock_make_hostent(host, res, sock_sockaddr);
|
||||
}
|
||||
|
||||
@ -1004,20 +1004,20 @@ sock_s_gethostbyaddr(int argc, VALUE *argv, VALUE _)
|
||||
rb_scan_args(argc, argv, "11", &addr, &family);
|
||||
StringValue(addr);
|
||||
if (!NIL_P(family)) {
|
||||
t = rsock_family_arg(family);
|
||||
t = rsock_family_arg(family);
|
||||
}
|
||||
#ifdef AF_INET6
|
||||
else if (RSTRING_LEN(addr) == 16) {
|
||||
t = AF_INET6;
|
||||
t = AF_INET6;
|
||||
}
|
||||
#endif
|
||||
h = gethostbyaddr(RSTRING_PTR(addr), RSTRING_SOCKLEN(addr), t);
|
||||
if (h == NULL) {
|
||||
#ifdef HAVE_HSTRERROR
|
||||
extern int h_errno;
|
||||
rb_raise(rb_eSocket, "%s", (char*)hstrerror(h_errno));
|
||||
extern int h_errno;
|
||||
rb_raise(rb_eSocket, "%s", (char*)hstrerror(h_errno));
|
||||
#else
|
||||
rb_raise(rb_eSocket, "host not found");
|
||||
rb_raise(rb_eSocket, "host not found");
|
||||
#endif
|
||||
}
|
||||
ary = rb_ary_new();
|
||||
@ -1025,14 +1025,14 @@ sock_s_gethostbyaddr(int argc, VALUE *argv, VALUE _)
|
||||
names = rb_ary_new();
|
||||
rb_ary_push(ary, names);
|
||||
if (h->h_aliases != NULL) {
|
||||
for (pch = h->h_aliases; *pch; pch++) {
|
||||
rb_ary_push(names, rb_str_new2(*pch));
|
||||
}
|
||||
for (pch = h->h_aliases; *pch; pch++) {
|
||||
rb_ary_push(names, rb_str_new2(*pch));
|
||||
}
|
||||
}
|
||||
rb_ary_push(ary, INT2NUM(h->h_addrtype));
|
||||
#ifdef h_addr
|
||||
for (pch = h->h_addr_list; *pch; pch++) {
|
||||
rb_ary_push(ary, rb_str_new(*pch, h->h_length));
|
||||
rb_ary_push(ary, rb_str_new(*pch, h->h_length));
|
||||
}
|
||||
#else
|
||||
rb_ary_push(ary, rb_str_new(h->h_addr, h->h_length));
|
||||
@ -1069,15 +1069,15 @@ sock_s_getservbyname(int argc, VALUE *argv, VALUE _)
|
||||
if (!NIL_P(proto)) protoname = StringValueCStr(proto);
|
||||
sp = getservbyname(servicename, protoname);
|
||||
if (sp) {
|
||||
port = ntohs(sp->s_port);
|
||||
port = ntohs(sp->s_port);
|
||||
}
|
||||
else {
|
||||
char *end;
|
||||
char *end;
|
||||
|
||||
port = STRTOUL(servicename, &end, 0);
|
||||
if (*end != '\0') {
|
||||
rb_raise(rb_eSocket, "no such service %s/%s", servicename, protoname);
|
||||
}
|
||||
port = STRTOUL(servicename, &end, 0);
|
||||
if (*end != '\0') {
|
||||
rb_raise(rb_eSocket, "no such service %s/%s", servicename, protoname);
|
||||
}
|
||||
}
|
||||
return INT2FIX(port);
|
||||
}
|
||||
@ -1106,14 +1106,14 @@ sock_s_getservbyport(int argc, VALUE *argv, VALUE _)
|
||||
rb_scan_args(argc, argv, "11", &port, &proto);
|
||||
portnum = NUM2LONG(port);
|
||||
if (portnum != (uint16_t)portnum) {
|
||||
const char *s = portnum > 0 ? "big" : "small";
|
||||
rb_raise(rb_eRangeError, "integer %ld too %s to convert into `int16_t'", portnum, s);
|
||||
const char *s = portnum > 0 ? "big" : "small";
|
||||
rb_raise(rb_eRangeError, "integer %ld too %s to convert into `int16_t'", portnum, s);
|
||||
}
|
||||
if (!NIL_P(proto)) protoname = StringValueCStr(proto);
|
||||
|
||||
sp = getservbyport((int)htons((uint16_t)portnum), protoname);
|
||||
if (!sp) {
|
||||
rb_raise(rb_eSocket, "no such service for port %d/%s", (int)portnum, protoname);
|
||||
rb_raise(rb_eSocket, "no such service for port %d/%s", (int)portnum, protoname);
|
||||
}
|
||||
return rb_str_new2(sp->s_name);
|
||||
}
|
||||
@ -1167,16 +1167,16 @@ sock_s_getaddrinfo(int argc, VALUE *argv, VALUE _)
|
||||
hints.ai_family = NIL_P(family) ? PF_UNSPEC : rsock_family_arg(family);
|
||||
|
||||
if (!NIL_P(socktype)) {
|
||||
hints.ai_socktype = rsock_socktype_arg(socktype);
|
||||
hints.ai_socktype = rsock_socktype_arg(socktype);
|
||||
}
|
||||
if (!NIL_P(protocol)) {
|
||||
hints.ai_protocol = NUM2INT(protocol);
|
||||
hints.ai_protocol = NUM2INT(protocol);
|
||||
}
|
||||
if (!NIL_P(flags)) {
|
||||
hints.ai_flags = NUM2INT(flags);
|
||||
hints.ai_flags = NUM2INT(flags);
|
||||
}
|
||||
if (NIL_P(revlookup) || !rsock_revlookup_flag(revlookup, &norevlookup)) {
|
||||
norevlookup = rsock_do_not_reverse_lookup;
|
||||
norevlookup = rsock_do_not_reverse_lookup;
|
||||
}
|
||||
|
||||
res = rsock_getaddrinfo(host, port, &hints, 0);
|
||||
@ -1226,82 +1226,82 @@ sock_s_getnameinfo(int argc, VALUE *argv, VALUE _)
|
||||
|
||||
fl = 0;
|
||||
if (!NIL_P(flags)) {
|
||||
fl = NUM2INT(flags);
|
||||
fl = NUM2INT(flags);
|
||||
}
|
||||
tmp = rb_check_sockaddr_string_type(sa);
|
||||
if (!NIL_P(tmp)) {
|
||||
sa = tmp;
|
||||
if (sizeof(ss) < (size_t)RSTRING_LEN(sa)) {
|
||||
rb_raise(rb_eTypeError, "sockaddr length too big");
|
||||
}
|
||||
memcpy(&ss, RSTRING_PTR(sa), RSTRING_LEN(sa));
|
||||
sa = tmp;
|
||||
if (sizeof(ss) < (size_t)RSTRING_LEN(sa)) {
|
||||
rb_raise(rb_eTypeError, "sockaddr length too big");
|
||||
}
|
||||
memcpy(&ss, RSTRING_PTR(sa), RSTRING_LEN(sa));
|
||||
if (!VALIDATE_SOCKLEN(&ss.addr, RSTRING_LEN(sa))) {
|
||||
rb_raise(rb_eTypeError, "sockaddr size differs - should not happen");
|
||||
}
|
||||
sap = &ss.addr;
|
||||
rb_raise(rb_eTypeError, "sockaddr size differs - should not happen");
|
||||
}
|
||||
sap = &ss.addr;
|
||||
salen = RSTRING_SOCKLEN(sa);
|
||||
goto call_nameinfo;
|
||||
goto call_nameinfo;
|
||||
}
|
||||
tmp = rb_check_array_type(sa);
|
||||
if (!NIL_P(tmp)) {
|
||||
sa = tmp;
|
||||
MEMZERO(&hints, struct addrinfo, 1);
|
||||
if (RARRAY_LEN(sa) == 3) {
|
||||
af = RARRAY_AREF(sa, 0);
|
||||
port = RARRAY_AREF(sa, 1);
|
||||
host = RARRAY_AREF(sa, 2);
|
||||
}
|
||||
else if (RARRAY_LEN(sa) >= 4) {
|
||||
af = RARRAY_AREF(sa, 0);
|
||||
port = RARRAY_AREF(sa, 1);
|
||||
host = RARRAY_AREF(sa, 3);
|
||||
if (NIL_P(host)) {
|
||||
host = RARRAY_AREF(sa, 2);
|
||||
}
|
||||
else {
|
||||
/*
|
||||
* 4th element holds numeric form, don't resolve.
|
||||
* see rsock_ipaddr().
|
||||
*/
|
||||
sa = tmp;
|
||||
MEMZERO(&hints, struct addrinfo, 1);
|
||||
if (RARRAY_LEN(sa) == 3) {
|
||||
af = RARRAY_AREF(sa, 0);
|
||||
port = RARRAY_AREF(sa, 1);
|
||||
host = RARRAY_AREF(sa, 2);
|
||||
}
|
||||
else if (RARRAY_LEN(sa) >= 4) {
|
||||
af = RARRAY_AREF(sa, 0);
|
||||
port = RARRAY_AREF(sa, 1);
|
||||
host = RARRAY_AREF(sa, 3);
|
||||
if (NIL_P(host)) {
|
||||
host = RARRAY_AREF(sa, 2);
|
||||
}
|
||||
else {
|
||||
/*
|
||||
* 4th element holds numeric form, don't resolve.
|
||||
* see rsock_ipaddr().
|
||||
*/
|
||||
#ifdef AI_NUMERICHOST /* AIX 4.3.3 doesn't have AI_NUMERICHOST. */
|
||||
hints.ai_flags |= AI_NUMERICHOST;
|
||||
hints.ai_flags |= AI_NUMERICHOST;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
else {
|
||||
rb_raise(rb_eArgError, "array size should be 3 or 4, %ld given",
|
||||
RARRAY_LEN(sa));
|
||||
}
|
||||
hints.ai_socktype = (fl & NI_DGRAM) ? SOCK_DGRAM : SOCK_STREAM;
|
||||
/* af */
|
||||
}
|
||||
}
|
||||
else {
|
||||
rb_raise(rb_eArgError, "array size should be 3 or 4, %ld given",
|
||||
RARRAY_LEN(sa));
|
||||
}
|
||||
hints.ai_socktype = (fl & NI_DGRAM) ? SOCK_DGRAM : SOCK_STREAM;
|
||||
/* af */
|
||||
hints.ai_family = NIL_P(af) ? PF_UNSPEC : rsock_family_arg(af);
|
||||
res = rsock_getaddrinfo(host, port, &hints, 0);
|
||||
sap = res->ai->ai_addr;
|
||||
res = rsock_getaddrinfo(host, port, &hints, 0);
|
||||
sap = res->ai->ai_addr;
|
||||
salen = res->ai->ai_addrlen;
|
||||
}
|
||||
else {
|
||||
rb_raise(rb_eTypeError, "expecting String or Array");
|
||||
rb_raise(rb_eTypeError, "expecting String or Array");
|
||||
}
|
||||
|
||||
call_nameinfo:
|
||||
error = rb_getnameinfo(sap, salen, hbuf, sizeof(hbuf),
|
||||
pbuf, sizeof(pbuf), fl);
|
||||
pbuf, sizeof(pbuf), fl);
|
||||
if (error) goto error_exit_name;
|
||||
if (res) {
|
||||
for (r = res->ai->ai_next; r; r = r->ai_next) {
|
||||
char hbuf2[1024], pbuf2[1024];
|
||||
for (r = res->ai->ai_next; r; r = r->ai_next) {
|
||||
char hbuf2[1024], pbuf2[1024];
|
||||
|
||||
sap = r->ai_addr;
|
||||
sap = r->ai_addr;
|
||||
salen = r->ai_addrlen;
|
||||
error = rb_getnameinfo(sap, salen, hbuf2, sizeof(hbuf2),
|
||||
pbuf2, sizeof(pbuf2), fl);
|
||||
if (error) goto error_exit_name;
|
||||
if (strcmp(hbuf, hbuf2) != 0|| strcmp(pbuf, pbuf2) != 0) {
|
||||
rb_freeaddrinfo(res);
|
||||
rb_raise(rb_eSocket, "sockaddr resolved to multiple nodename");
|
||||
}
|
||||
}
|
||||
rb_freeaddrinfo(res);
|
||||
error = rb_getnameinfo(sap, salen, hbuf2, sizeof(hbuf2),
|
||||
pbuf2, sizeof(pbuf2), fl);
|
||||
if (error) goto error_exit_name;
|
||||
if (strcmp(hbuf, hbuf2) != 0|| strcmp(pbuf, pbuf2) != 0) {
|
||||
rb_freeaddrinfo(res);
|
||||
rb_raise(rb_eSocket, "sockaddr resolved to multiple nodename");
|
||||
}
|
||||
}
|
||||
rb_freeaddrinfo(res);
|
||||
}
|
||||
return rb_assoc_new(rb_str_new2(hbuf), rb_str_new2(pbuf));
|
||||
|
||||
@ -1437,8 +1437,8 @@ sock_s_unpack_sockaddr_un(VALUE self, VALUE addr)
|
||||
rb_raise(rb_eArgError, "not an AF_UNIX sockaddr");
|
||||
}
|
||||
if (sizeof(struct sockaddr_un) < (size_t)RSTRING_LEN(addr)) {
|
||||
rb_raise(rb_eTypeError, "too long sockaddr_un - %ld longer than %d",
|
||||
RSTRING_LEN(addr), (int)sizeof(struct sockaddr_un));
|
||||
rb_raise(rb_eTypeError, "too long sockaddr_un - %ld longer than %d",
|
||||
RSTRING_LEN(addr), (int)sizeof(struct sockaddr_un));
|
||||
}
|
||||
path = rsock_unixpath_str(sockaddr, RSTRING_SOCKLEN(addr));
|
||||
return path;
|
||||
@ -1502,19 +1502,19 @@ sockaddr_obj(struct sockaddr *addr, socklen_t len)
|
||||
|
||||
#if defined(__KAME__) && defined(AF_INET6)
|
||||
if (addr->sa_family == AF_INET6) {
|
||||
/* KAME uses the 2nd 16bit word of link local IPv6 address as interface index internally */
|
||||
/* KAME uses the 2nd 16bit word of link local IPv6 address as interface index internally */
|
||||
/* http://orange.kame.net/dev/cvsweb.cgi/kame/IMPLEMENTATION */
|
||||
/* convert fe80:1::1 to fe80::1%1 */
|
||||
/* convert fe80:1::1 to fe80::1%1 */
|
||||
len = (socklen_t)sizeof(struct sockaddr_in6);
|
||||
memcpy(&addr6, addr, len);
|
||||
addr = (struct sockaddr *)&addr6;
|
||||
if (IN6_IS_ADDR_LINKLOCAL(&addr6.sin6_addr) &&
|
||||
addr6.sin6_scope_id == 0 &&
|
||||
(addr6.sin6_addr.s6_addr[2] || addr6.sin6_addr.s6_addr[3])) {
|
||||
addr6.sin6_scope_id = (addr6.sin6_addr.s6_addr[2] << 8) | addr6.sin6_addr.s6_addr[3];
|
||||
addr6.sin6_addr.s6_addr[2] = 0;
|
||||
addr6.sin6_addr.s6_addr[3] = 0;
|
||||
}
|
||||
memcpy(&addr6, addr, len);
|
||||
addr = (struct sockaddr *)&addr6;
|
||||
if (IN6_IS_ADDR_LINKLOCAL(&addr6.sin6_addr) &&
|
||||
addr6.sin6_scope_id == 0 &&
|
||||
(addr6.sin6_addr.s6_addr[2] || addr6.sin6_addr.s6_addr[3])) {
|
||||
addr6.sin6_scope_id = (addr6.sin6_addr.s6_addr[2] << 8) | addr6.sin6_addr.s6_addr[3];
|
||||
addr6.sin6_addr.s6_addr[2] = 0;
|
||||
addr6.sin6_addr.s6_addr[3] = 0;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -1612,8 +1612,8 @@ socket_s_ip_address_list(VALUE self)
|
||||
|
||||
ret = ioctl(fd, SIOCGLIFNUM, &ln);
|
||||
if (ret == -1) {
|
||||
reason = "SIOCGLIFNUM";
|
||||
goto finish;
|
||||
reason = "SIOCGLIFNUM";
|
||||
goto finish;
|
||||
}
|
||||
|
||||
memset(&lc, 0, sizeof(lc));
|
||||
@ -1624,13 +1624,13 @@ socket_s_ip_address_list(VALUE self)
|
||||
|
||||
ret = ioctl(fd, SIOCGLIFCONF, &lc);
|
||||
if (ret == -1) {
|
||||
reason = "SIOCGLIFCONF";
|
||||
goto finish;
|
||||
reason = "SIOCGLIFCONF";
|
||||
goto finish;
|
||||
}
|
||||
|
||||
list = rb_ary_new();
|
||||
for (i = 0; i < ln.lifn_count; i++) {
|
||||
struct lifreq *req = &lc.lifc_req[i];
|
||||
struct lifreq *req = &lc.lifc_req[i];
|
||||
if (IS_IP_FAMILY(req->lifr_addr.ss_family)) {
|
||||
if (req->lifr_addr.ss_family == AF_INET6 &&
|
||||
IN6_IS_ADDR_LINKLOCAL(&((struct sockaddr_in6 *)(&req->lifr_addr))->sin6_addr) &&
|
||||
@ -1651,13 +1651,13 @@ socket_s_ip_address_list(VALUE self)
|
||||
finish:
|
||||
save_errno = errno;
|
||||
if (lc.lifc_buf != NULL)
|
||||
xfree(lc.lifc_req);
|
||||
xfree(lc.lifc_req);
|
||||
if (fd != -1)
|
||||
close(fd);
|
||||
close(fd);
|
||||
errno = save_errno;
|
||||
|
||||
if (reason)
|
||||
rb_syserr_fail(save_errno, reason);
|
||||
rb_syserr_fail(save_errno, reason);
|
||||
return list;
|
||||
|
||||
#elif defined(SIOCGIFCONF)
|
||||
@ -1695,17 +1695,17 @@ socket_s_ip_address_list(VALUE self)
|
||||
/* fprintf(stderr, "conf.ifc_len: %d\n", conf.ifc_len); */
|
||||
|
||||
if (bufsize - EXTRA_SPACE < conf.ifc_len) {
|
||||
if (bufsize < conf.ifc_len) {
|
||||
/* NetBSD returns required size for all interfaces. */
|
||||
bufsize = conf.ifc_len + EXTRA_SPACE;
|
||||
}
|
||||
else {
|
||||
bufsize = bufsize << 1;
|
||||
}
|
||||
if (buf == initbuf)
|
||||
buf = NULL;
|
||||
buf = xrealloc(buf, bufsize);
|
||||
goto retry;
|
||||
if (bufsize < conf.ifc_len) {
|
||||
/* NetBSD returns required size for all interfaces. */
|
||||
bufsize = conf.ifc_len + EXTRA_SPACE;
|
||||
}
|
||||
else {
|
||||
bufsize = bufsize << 1;
|
||||
}
|
||||
if (buf == initbuf)
|
||||
buf = NULL;
|
||||
buf = xrealloc(buf, bufsize);
|
||||
goto retry;
|
||||
}
|
||||
|
||||
close(fd);
|
||||
@ -1714,10 +1714,10 @@ socket_s_ip_address_list(VALUE self)
|
||||
list = rb_ary_new();
|
||||
req = conf.ifc_req;
|
||||
while ((char*)req < (char*)conf.ifc_req + conf.ifc_len) {
|
||||
struct sockaddr *addr = &req->ifr_addr;
|
||||
struct sockaddr *addr = &req->ifr_addr;
|
||||
if (IS_IP_FAMILY(addr->sa_family)) {
|
||||
rb_ary_push(list, sockaddr_obj(addr, sockaddr_len(addr)));
|
||||
}
|
||||
rb_ary_push(list, sockaddr_obj(addr, sockaddr_len(addr)));
|
||||
}
|
||||
#ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
|
||||
# ifndef _SIZEOF_ADDR_IFREQ
|
||||
# define _SIZEOF_ADDR_IFREQ(r) \
|
||||
@ -1726,9 +1726,9 @@ socket_s_ip_address_list(VALUE self)
|
||||
(r).ifr_addr.sa_len - sizeof(struct sockaddr) : \
|
||||
0))
|
||||
# endif
|
||||
req = (struct ifreq *)((char*)req + _SIZEOF_ADDR_IFREQ(*req));
|
||||
req = (struct ifreq *)((char*)req + _SIZEOF_ADDR_IFREQ(*req));
|
||||
#else
|
||||
req = (struct ifreq *)((char*)req + sizeof(struct ifreq));
|
||||
req = (struct ifreq *)((char*)req + sizeof(struct ifreq));
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -1738,57 +1738,57 @@ socket_s_ip_address_list(VALUE self)
|
||||
if (buf != initbuf)
|
||||
xfree(buf);
|
||||
if (fd != -1)
|
||||
close(fd);
|
||||
close(fd);
|
||||
errno = save_errno;
|
||||
|
||||
if (reason)
|
||||
rb_syserr_fail(save_errno, reason);
|
||||
rb_syserr_fail(save_errno, reason);
|
||||
return list;
|
||||
|
||||
#undef EXTRA_SPACE
|
||||
#elif defined(_WIN32)
|
||||
typedef struct ip_adapter_unicast_address_st {
|
||||
unsigned LONG_LONG dummy0;
|
||||
struct ip_adapter_unicast_address_st *Next;
|
||||
struct {
|
||||
struct sockaddr *lpSockaddr;
|
||||
int iSockaddrLength;
|
||||
} Address;
|
||||
int dummy1;
|
||||
int dummy2;
|
||||
int dummy3;
|
||||
long dummy4;
|
||||
long dummy5;
|
||||
long dummy6;
|
||||
unsigned LONG_LONG dummy0;
|
||||
struct ip_adapter_unicast_address_st *Next;
|
||||
struct {
|
||||
struct sockaddr *lpSockaddr;
|
||||
int iSockaddrLength;
|
||||
} Address;
|
||||
int dummy1;
|
||||
int dummy2;
|
||||
int dummy3;
|
||||
long dummy4;
|
||||
long dummy5;
|
||||
long dummy6;
|
||||
} ip_adapter_unicast_address_t;
|
||||
typedef struct ip_adapter_anycast_address_st {
|
||||
unsigned LONG_LONG dummy0;
|
||||
struct ip_adapter_anycast_address_st *Next;
|
||||
struct {
|
||||
struct sockaddr *lpSockaddr;
|
||||
int iSockaddrLength;
|
||||
} Address;
|
||||
unsigned LONG_LONG dummy0;
|
||||
struct ip_adapter_anycast_address_st *Next;
|
||||
struct {
|
||||
struct sockaddr *lpSockaddr;
|
||||
int iSockaddrLength;
|
||||
} Address;
|
||||
} ip_adapter_anycast_address_t;
|
||||
typedef struct ip_adapter_addresses_st {
|
||||
unsigned LONG_LONG dummy0;
|
||||
struct ip_adapter_addresses_st *Next;
|
||||
void *dummy1;
|
||||
ip_adapter_unicast_address_t *FirstUnicastAddress;
|
||||
ip_adapter_anycast_address_t *FirstAnycastAddress;
|
||||
void *dummy2;
|
||||
void *dummy3;
|
||||
void *dummy4;
|
||||
void *dummy5;
|
||||
void *dummy6;
|
||||
BYTE dummy7[8];
|
||||
DWORD dummy8;
|
||||
DWORD dummy9;
|
||||
DWORD dummy10;
|
||||
DWORD IfType;
|
||||
int OperStatus;
|
||||
DWORD dummy12;
|
||||
DWORD dummy13[16];
|
||||
void *dummy14;
|
||||
unsigned LONG_LONG dummy0;
|
||||
struct ip_adapter_addresses_st *Next;
|
||||
void *dummy1;
|
||||
ip_adapter_unicast_address_t *FirstUnicastAddress;
|
||||
ip_adapter_anycast_address_t *FirstAnycastAddress;
|
||||
void *dummy2;
|
||||
void *dummy3;
|
||||
void *dummy4;
|
||||
void *dummy5;
|
||||
void *dummy6;
|
||||
BYTE dummy7[8];
|
||||
DWORD dummy8;
|
||||
DWORD dummy9;
|
||||
DWORD dummy10;
|
||||
DWORD IfType;
|
||||
int OperStatus;
|
||||
DWORD dummy12;
|
||||
DWORD dummy13[16];
|
||||
void *dummy14;
|
||||
} ip_adapter_addresses_t;
|
||||
typedef ULONG (WINAPI *GetAdaptersAddresses_t)(ULONG, ULONG, PVOID, ip_adapter_addresses_t *, PULONG);
|
||||
HMODULE h;
|
||||
@ -1800,49 +1800,49 @@ socket_s_ip_address_list(VALUE self)
|
||||
|
||||
h = LoadLibrary("iphlpapi.dll");
|
||||
if (!h)
|
||||
rb_notimplement();
|
||||
rb_notimplement();
|
||||
pGetAdaptersAddresses = (GetAdaptersAddresses_t)GetProcAddress(h, "GetAdaptersAddresses");
|
||||
if (!pGetAdaptersAddresses) {
|
||||
FreeLibrary(h);
|
||||
rb_notimplement();
|
||||
FreeLibrary(h);
|
||||
rb_notimplement();
|
||||
}
|
||||
|
||||
ret = pGetAdaptersAddresses(AF_UNSPEC, 0, NULL, NULL, &len);
|
||||
if (ret != ERROR_SUCCESS && ret != ERROR_BUFFER_OVERFLOW) {
|
||||
errno = rb_w32_map_errno(ret);
|
||||
FreeLibrary(h);
|
||||
rb_sys_fail("GetAdaptersAddresses");
|
||||
errno = rb_w32_map_errno(ret);
|
||||
FreeLibrary(h);
|
||||
rb_sys_fail("GetAdaptersAddresses");
|
||||
}
|
||||
adapters = (ip_adapter_addresses_t *)ALLOCA_N(BYTE, len);
|
||||
ret = pGetAdaptersAddresses(AF_UNSPEC, 0, NULL, adapters, &len);
|
||||
if (ret != ERROR_SUCCESS) {
|
||||
errno = rb_w32_map_errno(ret);
|
||||
FreeLibrary(h);
|
||||
rb_sys_fail("GetAdaptersAddresses");
|
||||
errno = rb_w32_map_errno(ret);
|
||||
FreeLibrary(h);
|
||||
rb_sys_fail("GetAdaptersAddresses");
|
||||
}
|
||||
|
||||
list = rb_ary_new();
|
||||
for (; adapters; adapters = adapters->Next) {
|
||||
ip_adapter_unicast_address_t *uni;
|
||||
ip_adapter_anycast_address_t *any;
|
||||
if (adapters->OperStatus != 1) /* 1 means IfOperStatusUp */
|
||||
continue;
|
||||
for (uni = adapters->FirstUnicastAddress; uni; uni = uni->Next) {
|
||||
ip_adapter_unicast_address_t *uni;
|
||||
ip_adapter_anycast_address_t *any;
|
||||
if (adapters->OperStatus != 1) /* 1 means IfOperStatusUp */
|
||||
continue;
|
||||
for (uni = adapters->FirstUnicastAddress; uni; uni = uni->Next) {
|
||||
#ifndef INET6
|
||||
if (uni->Address.lpSockaddr->sa_family == AF_INET)
|
||||
if (uni->Address.lpSockaddr->sa_family == AF_INET)
|
||||
#else
|
||||
if (IS_IP_FAMILY(uni->Address.lpSockaddr->sa_family))
|
||||
if (IS_IP_FAMILY(uni->Address.lpSockaddr->sa_family))
|
||||
#endif
|
||||
rb_ary_push(list, sockaddr_obj(uni->Address.lpSockaddr, uni->Address.iSockaddrLength));
|
||||
}
|
||||
for (any = adapters->FirstAnycastAddress; any; any = any->Next) {
|
||||
rb_ary_push(list, sockaddr_obj(uni->Address.lpSockaddr, uni->Address.iSockaddrLength));
|
||||
}
|
||||
for (any = adapters->FirstAnycastAddress; any; any = any->Next) {
|
||||
#ifndef INET6
|
||||
if (any->Address.lpSockaddr->sa_family == AF_INET)
|
||||
if (any->Address.lpSockaddr->sa_family == AF_INET)
|
||||
#else
|
||||
if (IS_IP_FAMILY(any->Address.lpSockaddr->sa_family))
|
||||
if (IS_IP_FAMILY(any->Address.lpSockaddr->sa_family))
|
||||
#endif
|
||||
rb_ary_push(list, sockaddr_obj(any->Address.lpSockaddr, any->Address.iSockaddrLength));
|
||||
}
|
||||
rb_ary_push(list, sockaddr_obj(any->Address.lpSockaddr, any->Address.iSockaddrLength));
|
||||
}
|
||||
}
|
||||
|
||||
FreeLibrary(h);
|
||||
@ -1986,7 +1986,7 @@ Init_socket(void)
|
||||
|
||||
/* for ext/socket/lib/socket.rb use only: */
|
||||
rb_define_private_method(rb_cSocket,
|
||||
"__connect_nonblock", sock_connect_nonblock, 2);
|
||||
"__connect_nonblock", sock_connect_nonblock, 2);
|
||||
|
||||
rb_define_method(rb_cSocket, "bind", sock_bind, 1);
|
||||
rb_define_method(rb_cSocket, "listen", rsock_sock_listen, 1);
|
||||
@ -1994,7 +1994,7 @@ Init_socket(void)
|
||||
|
||||
/* for ext/socket/lib/socket.rb use only: */
|
||||
rb_define_private_method(rb_cSocket,
|
||||
"__accept_nonblock", sock_accept_nonblock, 1);
|
||||
"__accept_nonblock", sock_accept_nonblock, 1);
|
||||
|
||||
rb_define_method(rb_cSocket, "sysaccept", sock_sysaccept, 0);
|
||||
|
||||
@ -2002,7 +2002,7 @@ Init_socket(void)
|
||||
|
||||
/* for ext/socket/lib/socket.rb use only: */
|
||||
rb_define_private_method(rb_cSocket,
|
||||
"__recvfrom_nonblock", sock_recvfrom_nonblock, 4);
|
||||
"__recvfrom_nonblock", sock_recvfrom_nonblock, 4);
|
||||
|
||||
rb_define_singleton_method(rb_cSocket, "socketpair", rsock_sock_s_socketpair, -1);
|
||||
rb_define_singleton_method(rb_cSocket, "pair", rsock_sock_s_socketpair, -1);
|
||||
|
@ -30,8 +30,8 @@ socks_init(VALUE sock, VALUE host, VALUE port)
|
||||
static int init = 0;
|
||||
|
||||
if (init == 0) {
|
||||
SOCKSinit("ruby");
|
||||
init = 1;
|
||||
SOCKSinit("ruby");
|
||||
init = 1;
|
||||
}
|
||||
|
||||
return rsock_init_inetsock(sock, host, port, Qnil, Qnil, INET_SOCKS, Qnil, Qnil);
|
||||
|
@ -133,7 +133,7 @@ rsock_init_tcpserver(void)
|
||||
rb_cTCPServer = rb_define_class("TCPServer", rb_cTCPSocket);
|
||||
rb_define_method(rb_cTCPServer, "accept", tcp_accept, 0);
|
||||
rb_define_private_method(rb_cTCPServer,
|
||||
"__accept_nonblock", tcp_accept_nonblock, 1);
|
||||
"__accept_nonblock", tcp_accept_nonblock, 1);
|
||||
rb_define_method(rb_cTCPServer, "sysaccept", tcp_sysaccept, 0);
|
||||
rb_define_method(rb_cTCPServer, "initialize", tcp_svr_init, -1);
|
||||
rb_define_method(rb_cTCPServer, "listen", rsock_sock_listen, 1); /* in socket.c */
|
||||
|
@ -32,22 +32,22 @@ tcp_init(int argc, VALUE *argv, VALUE sock)
|
||||
VALUE connect_timeout = Qnil;
|
||||
|
||||
if (!keyword_ids[0]) {
|
||||
CONST_ID(keyword_ids[0], "resolv_timeout");
|
||||
CONST_ID(keyword_ids[1], "connect_timeout");
|
||||
CONST_ID(keyword_ids[0], "resolv_timeout");
|
||||
CONST_ID(keyword_ids[1], "connect_timeout");
|
||||
}
|
||||
|
||||
rb_scan_args(argc, argv, "22:", &remote_host, &remote_serv,
|
||||
&local_host, &local_serv, &opt);
|
||||
&local_host, &local_serv, &opt);
|
||||
|
||||
if (!NIL_P(opt)) {
|
||||
rb_get_kwargs(opt, keyword_ids, 0, 2, kwargs);
|
||||
if (kwargs[0] != Qundef) { resolv_timeout = kwargs[0]; }
|
||||
if (kwargs[1] != Qundef) { connect_timeout = kwargs[1]; }
|
||||
rb_get_kwargs(opt, keyword_ids, 0, 2, kwargs);
|
||||
if (kwargs[0] != Qundef) { resolv_timeout = kwargs[0]; }
|
||||
if (kwargs[1] != Qundef) { connect_timeout = kwargs[1]; }
|
||||
}
|
||||
|
||||
return rsock_init_inetsock(sock, remote_host, remote_serv,
|
||||
local_host, local_serv, INET_CLIENT,
|
||||
resolv_timeout, connect_timeout);
|
||||
local_host, local_serv, INET_CLIENT,
|
||||
resolv_timeout, connect_timeout);
|
||||
}
|
||||
|
||||
static VALUE
|
||||
@ -80,7 +80,7 @@ tcp_s_gethostbyname(VALUE obj, VALUE host)
|
||||
{
|
||||
rb_warn("TCPSocket.gethostbyname is deprecated; use Addrinfo.getaddrinfo instead.");
|
||||
struct rb_addrinfo *res =
|
||||
rsock_addrinfo(host, Qnil, AF_UNSPEC, SOCK_STREAM, AI_CANONNAME);
|
||||
rsock_addrinfo(host, Qnil, AF_UNSPEC, SOCK_STREAM, AI_CANONNAME);
|
||||
return rsock_make_hostent(host, res, tcp_sockaddr);
|
||||
}
|
||||
|
||||
|
@ -33,11 +33,11 @@ udp_init(int argc, VALUE *argv, VALUE sock)
|
||||
int fd;
|
||||
|
||||
if (rb_scan_args(argc, argv, "01", &arg) == 1) {
|
||||
family = rsock_family_arg(arg);
|
||||
family = rsock_family_arg(arg);
|
||||
}
|
||||
fd = rsock_socket(family, SOCK_DGRAM, 0);
|
||||
if (fd < 0) {
|
||||
rb_sys_fail("socket(2) - udp");
|
||||
rb_sys_fail("socket(2) - udp");
|
||||
}
|
||||
|
||||
return rsock_init_sock(sock, fd);
|
||||
@ -60,9 +60,9 @@ udp_connect_internal(VALUE v)
|
||||
rb_io_check_closed(fptr = arg->fptr);
|
||||
fd = fptr->fd;
|
||||
for (res = arg->res->ai; res; res = res->ai_next) {
|
||||
if (rsock_connect(fd, res->ai_addr, res->ai_addrlen, 0, NULL) >= 0) {
|
||||
return Qtrue;
|
||||
}
|
||||
if (rsock_connect(fd, res->ai_addr, res->ai_addrlen, 0, NULL) >= 0) {
|
||||
return Qtrue;
|
||||
}
|
||||
}
|
||||
return Qfalse;
|
||||
}
|
||||
@ -92,7 +92,7 @@ udp_connect(VALUE sock, VALUE host, VALUE port)
|
||||
GetOpenFile(sock, arg.fptr);
|
||||
arg.res = rsock_addrinfo(host, port, rsock_fd_family(arg.fptr->fd), SOCK_DGRAM, 0);
|
||||
ret = rb_ensure(udp_connect_internal, (VALUE)&arg,
|
||||
rsock_freeaddrinfo, (VALUE)arg.res);
|
||||
rsock_freeaddrinfo, (VALUE)arg.res);
|
||||
if (!ret) rsock_sys_fail_host_port("connect(2)", host, port);
|
||||
return INT2FIX(0);
|
||||
}
|
||||
@ -108,10 +108,10 @@ udp_bind_internal(VALUE v)
|
||||
rb_io_check_closed(fptr = arg->fptr);
|
||||
fd = fptr->fd;
|
||||
for (res = arg->res->ai; res; res = res->ai_next) {
|
||||
if (bind(fd, res->ai_addr, res->ai_addrlen) < 0) {
|
||||
continue;
|
||||
}
|
||||
return Qtrue;
|
||||
if (bind(fd, res->ai_addr, res->ai_addrlen) < 0) {
|
||||
continue;
|
||||
}
|
||||
return Qtrue;
|
||||
}
|
||||
return Qfalse;
|
||||
}
|
||||
@ -137,7 +137,7 @@ udp_bind(VALUE sock, VALUE host, VALUE port)
|
||||
GetOpenFile(sock, arg.fptr);
|
||||
arg.res = rsock_addrinfo(host, port, rsock_fd_family(arg.fptr->fd), SOCK_DGRAM, 0);
|
||||
ret = rb_ensure(udp_bind_internal, (VALUE)&arg,
|
||||
rsock_freeaddrinfo, (VALUE)arg.res);
|
||||
rsock_freeaddrinfo, (VALUE)arg.res);
|
||||
if (!ret) rsock_sys_fail_host_port("bind(2)", host, port);
|
||||
return INT2FIX(0);
|
||||
}
|
||||
@ -207,7 +207,7 @@ udp_send(int argc, VALUE *argv, VALUE sock)
|
||||
VALUE ret;
|
||||
|
||||
if (argc == 2 || argc == 3) {
|
||||
return rsock_bsock_send(argc, argv, sock);
|
||||
return rsock_bsock_send(argc, argv, sock);
|
||||
}
|
||||
rb_scan_args(argc, argv, "4", &arg.sarg.mesg, &flags, &host, &port);
|
||||
|
||||
@ -217,7 +217,7 @@ udp_send(int argc, VALUE *argv, VALUE sock)
|
||||
arg.sarg.flags = NUM2INT(flags);
|
||||
arg.res = rsock_addrinfo(host, port, rsock_fd_family(arg.fptr->fd), SOCK_DGRAM, 0);
|
||||
ret = rb_ensure(udp_send_internal, (VALUE)&arg,
|
||||
rsock_freeaddrinfo, (VALUE)arg.res);
|
||||
rsock_freeaddrinfo, (VALUE)arg.res);
|
||||
if (!ret) rsock_sys_fail_host_port("sendto(2)", host, port);
|
||||
return ret;
|
||||
}
|
||||
@ -246,5 +246,5 @@ rsock_init_udpsocket(void)
|
||||
|
||||
/* for ext/socket/lib/socket.rb use only: */
|
||||
rb_define_private_method(rb_cUDPSocket,
|
||||
"__recvfrom_nonblock", udp_recvfrom_nonblock, 4);
|
||||
"__recvfrom_nonblock", udp_recvfrom_nonblock, 4);
|
||||
}
|
||||
|
@ -66,7 +66,7 @@ unix_accept_nonblock(VALUE sock, VALUE ex)
|
||||
GetOpenFile(sock, fptr);
|
||||
fromlen = (socklen_t)sizeof(from);
|
||||
return rsock_s_accept_nonblock(rb_cUNIXSocket, ex, fptr,
|
||||
(struct sockaddr *)&from, &fromlen);
|
||||
(struct sockaddr *)&from, &fromlen);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -113,7 +113,7 @@ rsock_init_unixserver(void)
|
||||
rb_define_method(rb_cUNIXServer, "accept", unix_accept, 0);
|
||||
|
||||
rb_define_private_method(rb_cUNIXServer,
|
||||
"__accept_nonblock", unix_accept_nonblock, 1);
|
||||
"__accept_nonblock", unix_accept_nonblock, 1);
|
||||
|
||||
rb_define_method(rb_cUNIXServer, "sysaccept", unix_sysaccept, 0);
|
||||
rb_define_method(rb_cUNIXServer, "listen", rsock_sock_listen, 1); /* in socket.c */
|
||||
|
@ -22,7 +22,7 @@ unixsock_connect_internal(VALUE a)
|
||||
{
|
||||
struct unixsock_arg *arg = (struct unixsock_arg *)a;
|
||||
return (VALUE)rsock_connect(arg->fd, (struct sockaddr*)arg->sockaddr,
|
||||
arg->sockaddrlen, 0, NULL);
|
||||
arg->sockaddrlen, 0, NULL);
|
||||
}
|
||||
|
||||
static VALUE
|
||||
@ -66,42 +66,42 @@ rsock_init_unixsock(VALUE sock, VALUE path, int server)
|
||||
|
||||
fd = rsock_socket(AF_UNIX, SOCK_STREAM, 0);
|
||||
if (fd < 0) {
|
||||
rsock_sys_fail_path("socket(2)", path);
|
||||
rsock_sys_fail_path("socket(2)", path);
|
||||
}
|
||||
|
||||
if (server) {
|
||||
status = bind(fd, (struct sockaddr*)&sockaddr, sockaddrlen);
|
||||
}
|
||||
else {
|
||||
int prot;
|
||||
struct unixsock_arg arg;
|
||||
arg.sockaddr = &sockaddr;
|
||||
arg.sockaddrlen = sockaddrlen;
|
||||
arg.fd = fd;
|
||||
int prot;
|
||||
struct unixsock_arg arg;
|
||||
arg.sockaddr = &sockaddr;
|
||||
arg.sockaddrlen = sockaddrlen;
|
||||
arg.fd = fd;
|
||||
status = (int)rb_protect(unixsock_connect_internal, (VALUE)&arg, &prot);
|
||||
if (prot) {
|
||||
close(fd);
|
||||
rb_jump_tag(prot);
|
||||
}
|
||||
if (prot) {
|
||||
close(fd);
|
||||
rb_jump_tag(prot);
|
||||
}
|
||||
}
|
||||
|
||||
if (status < 0) {
|
||||
int e = errno;
|
||||
close(fd);
|
||||
rsock_syserr_fail_path(e, "connect(2)", path);
|
||||
int e = errno;
|
||||
close(fd);
|
||||
rsock_syserr_fail_path(e, "connect(2)", path);
|
||||
}
|
||||
|
||||
if (server) {
|
||||
if (listen(fd, SOMAXCONN) < 0) {
|
||||
int e = errno;
|
||||
close(fd);
|
||||
rsock_syserr_fail_path(e, "listen(2)", path);
|
||||
}
|
||||
if (listen(fd, SOMAXCONN) < 0) {
|
||||
int e = errno;
|
||||
close(fd);
|
||||
rsock_syserr_fail_path(e, "listen(2)", path);
|
||||
}
|
||||
}
|
||||
|
||||
rsock_init_sock(sock, fd);
|
||||
if (server) {
|
||||
GetOpenFile(sock, fptr);
|
||||
GetOpenFile(sock, fptr);
|
||||
fptr->pathv = rb_str_new_frozen(path);
|
||||
}
|
||||
|
||||
@ -143,13 +143,13 @@ unix_path(VALUE sock)
|
||||
|
||||
GetOpenFile(sock, fptr);
|
||||
if (NIL_P(fptr->pathv)) {
|
||||
struct sockaddr_un addr;
|
||||
socklen_t len = (socklen_t)sizeof(addr);
|
||||
socklen_t len0 = len;
|
||||
if (getsockname(fptr->fd, (struct sockaddr*)&addr, &len) < 0)
|
||||
struct sockaddr_un addr;
|
||||
socklen_t len = (socklen_t)sizeof(addr);
|
||||
socklen_t len0 = len;
|
||||
if (getsockname(fptr->fd, (struct sockaddr*)&addr, &len) < 0)
|
||||
rsock_sys_fail_path("getsockname(2)", fptr->pathv);
|
||||
if (len0 < len) len = len0;
|
||||
fptr->pathv = rb_obj_freeze(rsock_unixpath_str(&addr, len));
|
||||
fptr->pathv = rb_obj_freeze(rsock_unixpath_str(&addr, len));
|
||||
}
|
||||
return rb_str_dup(fptr->pathv);
|
||||
}
|
||||
@ -240,21 +240,21 @@ unix_send_io(VALUE sock, VALUE val)
|
||||
|
||||
#if FD_PASSING_BY_MSG_CONTROL
|
||||
union {
|
||||
struct cmsghdr hdr;
|
||||
char pad[sizeof(struct cmsghdr)+8+sizeof(int)+8];
|
||||
struct cmsghdr hdr;
|
||||
char pad[sizeof(struct cmsghdr)+8+sizeof(int)+8];
|
||||
} cmsg;
|
||||
#endif
|
||||
|
||||
if (rb_obj_is_kind_of(val, rb_cIO)) {
|
||||
rb_io_t *valfptr;
|
||||
GetOpenFile(val, valfptr);
|
||||
fd = valfptr->fd;
|
||||
GetOpenFile(val, valfptr);
|
||||
fd = valfptr->fd;
|
||||
}
|
||||
else if (FIXNUM_P(val)) {
|
||||
fd = FIX2INT(val);
|
||||
}
|
||||
else {
|
||||
rb_raise(rb_eTypeError, "neither IO nor file descriptor");
|
||||
rb_raise(rb_eTypeError, "neither IO nor file descriptor");
|
||||
}
|
||||
|
||||
GetOpenFile(sock, fptr);
|
||||
@ -285,8 +285,8 @@ unix_send_io(VALUE sock, VALUE val)
|
||||
|
||||
arg.fd = fptr->fd;
|
||||
while ((int)BLOCKING_REGION_FD(sendmsg_blocking, &arg) == -1) {
|
||||
if (!rb_io_wait_writable(arg.fd))
|
||||
rsock_sys_fail_path("sendmsg(2)", fptr->pathv);
|
||||
if (!rb_io_wait_writable(arg.fd))
|
||||
rsock_sys_fail_path("sendmsg(2)", fptr->pathv);
|
||||
}
|
||||
|
||||
return Qnil;
|
||||
@ -348,16 +348,16 @@ unix_recv_io(int argc, VALUE *argv, VALUE sock)
|
||||
int fd;
|
||||
#if FD_PASSING_BY_MSG_CONTROL
|
||||
union {
|
||||
struct cmsghdr hdr;
|
||||
char pad[sizeof(struct cmsghdr)+8+sizeof(int)+8];
|
||||
struct cmsghdr hdr;
|
||||
char pad[sizeof(struct cmsghdr)+8+sizeof(int)+8];
|
||||
} cmsg;
|
||||
#endif
|
||||
|
||||
rb_scan_args(argc, argv, "02", &klass, &mode);
|
||||
if (argc == 0)
|
||||
klass = rb_cIO;
|
||||
klass = rb_cIO;
|
||||
if (argc <= 1)
|
||||
mode = Qnil;
|
||||
mode = Qnil;
|
||||
|
||||
retry:
|
||||
GetOpenFile(sock, fptr);
|
||||
@ -400,8 +400,8 @@ retry:
|
||||
rb_gc_for_fd(e);
|
||||
goto retry;
|
||||
}
|
||||
if (!rb_io_wait_readable(arg.fd))
|
||||
rsock_syserr_fail_path(e, "recvmsg(2)", fptr->pathv);
|
||||
if (!rb_io_wait_readable(arg.fd))
|
||||
rsock_syserr_fail_path(e, "recvmsg(2)", fptr->pathv);
|
||||
}
|
||||
|
||||
#if FD_PASSING_BY_MSG_CONTROL
|
||||
@ -412,41 +412,41 @@ retry:
|
||||
rb_gc_for_fd(EMFILE);
|
||||
goto retry;
|
||||
}
|
||||
rb_raise(rb_eSocket,
|
||||
"file descriptor was not passed (msg_controllen=%d smaller than sizeof(struct cmsghdr)=%d)",
|
||||
(int)arg.msg.msg_controllen, (int)sizeof(struct cmsghdr));
|
||||
rb_raise(rb_eSocket,
|
||||
"file descriptor was not passed (msg_controllen=%d smaller than sizeof(struct cmsghdr)=%d)",
|
||||
(int)arg.msg.msg_controllen, (int)sizeof(struct cmsghdr));
|
||||
}
|
||||
if (cmsg.hdr.cmsg_level != SOL_SOCKET) {
|
||||
rb_raise(rb_eSocket,
|
||||
"file descriptor was not passed (cmsg_level=%d, %d expected)",
|
||||
cmsg.hdr.cmsg_level, SOL_SOCKET);
|
||||
rb_raise(rb_eSocket,
|
||||
"file descriptor was not passed (cmsg_level=%d, %d expected)",
|
||||
cmsg.hdr.cmsg_level, SOL_SOCKET);
|
||||
}
|
||||
if (cmsg.hdr.cmsg_type != SCM_RIGHTS) {
|
||||
rb_raise(rb_eSocket,
|
||||
"file descriptor was not passed (cmsg_type=%d, %d expected)",
|
||||
cmsg.hdr.cmsg_type, SCM_RIGHTS);
|
||||
rb_raise(rb_eSocket,
|
||||
"file descriptor was not passed (cmsg_type=%d, %d expected)",
|
||||
cmsg.hdr.cmsg_type, SCM_RIGHTS);
|
||||
}
|
||||
if (arg.msg.msg_controllen < (socklen_t)CMSG_LEN(sizeof(int))) {
|
||||
rb_raise(rb_eSocket,
|
||||
"file descriptor was not passed (msg_controllen=%d smaller than CMSG_LEN(sizeof(int))=%d)",
|
||||
(int)arg.msg.msg_controllen, (int)CMSG_LEN(sizeof(int)));
|
||||
rb_raise(rb_eSocket,
|
||||
"file descriptor was not passed (msg_controllen=%d smaller than CMSG_LEN(sizeof(int))=%d)",
|
||||
(int)arg.msg.msg_controllen, (int)CMSG_LEN(sizeof(int)));
|
||||
}
|
||||
if ((socklen_t)CMSG_SPACE(sizeof(int)) < arg.msg.msg_controllen) {
|
||||
rb_raise(rb_eSocket,
|
||||
"file descriptor was not passed (msg_controllen=%d bigger than CMSG_SPACE(sizeof(int))=%d)",
|
||||
(int)arg.msg.msg_controllen, (int)CMSG_SPACE(sizeof(int)));
|
||||
rb_raise(rb_eSocket,
|
||||
"file descriptor was not passed (msg_controllen=%d bigger than CMSG_SPACE(sizeof(int))=%d)",
|
||||
(int)arg.msg.msg_controllen, (int)CMSG_SPACE(sizeof(int)));
|
||||
}
|
||||
if (cmsg.hdr.cmsg_len != CMSG_LEN(sizeof(int))) {
|
||||
rsock_discard_cmsg_resource(&arg.msg, 0);
|
||||
rb_raise(rb_eSocket,
|
||||
"file descriptor was not passed (cmsg_len=%d, %d expected)",
|
||||
(int)cmsg.hdr.cmsg_len, (int)CMSG_LEN(sizeof(int)));
|
||||
rsock_discard_cmsg_resource(&arg.msg, 0);
|
||||
rb_raise(rb_eSocket,
|
||||
"file descriptor was not passed (cmsg_len=%d, %d expected)",
|
||||
(int)cmsg.hdr.cmsg_len, (int)CMSG_LEN(sizeof(int)));
|
||||
}
|
||||
#else
|
||||
if (arg.msg.msg_accrightslen != sizeof(fd)) {
|
||||
rb_raise(rb_eSocket,
|
||||
"file descriptor was not passed (accrightslen=%d, %d expected)",
|
||||
arg.msg.msg_accrightslen, (int)sizeof(fd));
|
||||
rb_raise(rb_eSocket,
|
||||
"file descriptor was not passed (accrightslen=%d, %d expected)",
|
||||
arg.msg.msg_accrightslen, (int)sizeof(fd));
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -458,15 +458,15 @@ retry:
|
||||
rb_maygvl_fd_fix_cloexec(fd);
|
||||
|
||||
if (klass == Qnil)
|
||||
return INT2FIX(fd);
|
||||
return INT2FIX(fd);
|
||||
else {
|
||||
ID for_fd;
|
||||
int ff_argc;
|
||||
VALUE ff_argv[2];
|
||||
CONST_ID(for_fd, "for_fd");
|
||||
ff_argc = mode == Qnil ? 1 : 2;
|
||||
ff_argv[0] = INT2FIX(fd);
|
||||
ff_argv[1] = mode;
|
||||
ID for_fd;
|
||||
int ff_argc;
|
||||
VALUE ff_argv[2];
|
||||
CONST_ID(for_fd, "for_fd");
|
||||
ff_argc = mode == Qnil ? 1 : 2;
|
||||
ff_argv[0] = INT2FIX(fd);
|
||||
ff_argv[1] = mode;
|
||||
return rb_funcallv(klass, for_fd, ff_argc, ff_argv);
|
||||
}
|
||||
}
|
||||
@ -556,9 +556,9 @@ unix_s_socketpair(int argc, VALUE *argv, VALUE klass)
|
||||
domain = INT2FIX(PF_UNIX);
|
||||
rb_scan_args(argc, argv, "02", &type, &protocol);
|
||||
if (argc == 0)
|
||||
type = INT2FIX(SOCK_STREAM);
|
||||
type = INT2FIX(SOCK_STREAM);
|
||||
if (argc <= 1)
|
||||
protocol = INT2FIX(0);
|
||||
protocol = INT2FIX(0);
|
||||
|
||||
args[0] = domain;
|
||||
args[1] = type;
|
||||
|
@ -165,15 +165,15 @@ static VALUE mSyslog_open(int argc, VALUE *argv, VALUE self)
|
||||
syslog_ident = strdup(ident_ptr);
|
||||
|
||||
if (NIL_P(opt)) {
|
||||
syslog_options = LOG_PID | LOG_CONS;
|
||||
syslog_options = LOG_PID | LOG_CONS;
|
||||
} else {
|
||||
syslog_options = NUM2INT(opt);
|
||||
syslog_options = NUM2INT(opt);
|
||||
}
|
||||
|
||||
if (NIL_P(fac)) {
|
||||
syslog_facility = LOG_USER;
|
||||
syslog_facility = LOG_USER;
|
||||
} else {
|
||||
syslog_facility = NUM2INT(fac);
|
||||
syslog_facility = NUM2INT(fac);
|
||||
}
|
||||
|
||||
openlog(syslog_ident, syslog_options, syslog_facility);
|
||||
@ -307,7 +307,7 @@ static VALUE mSyslog_log(int argc, VALUE *argv, VALUE self)
|
||||
pri = *argv++;
|
||||
|
||||
if (!FIXNUM_P(pri)) {
|
||||
rb_raise(rb_eTypeError, "type mismatch: %"PRIsVALUE" given", rb_obj_class(pri));
|
||||
rb_raise(rb_eTypeError, "type mismatch: %"PRIsVALUE" given", rb_obj_class(pri));
|
||||
}
|
||||
|
||||
syslog_write(FIX2INT(pri), argc, argv);
|
||||
@ -322,14 +322,14 @@ static VALUE mSyslog_inspect(VALUE self)
|
||||
Check_Type(self, T_MODULE);
|
||||
|
||||
if (!syslog_opened)
|
||||
return rb_sprintf("<#%"PRIsVALUE": opened=false>", self);
|
||||
return rb_sprintf("<#%"PRIsVALUE": opened=false>", self);
|
||||
|
||||
return rb_sprintf("<#%"PRIsVALUE": opened=true, ident=\"%s\", options=%d, facility=%d, mask=%d>",
|
||||
self,
|
||||
syslog_ident,
|
||||
syslog_options,
|
||||
syslog_facility,
|
||||
syslog_mask);
|
||||
self,
|
||||
syslog_ident,
|
||||
syslog_options,
|
||||
syslog_facility,
|
||||
syslog_mask);
|
||||
}
|
||||
|
||||
/* Returns self, for backward compatibility.
|
||||
|
@ -29,19 +29,19 @@ get_dns_server_list(VALUE self)
|
||||
|
||||
ret = GetNetworkParams(NULL, &buflen);
|
||||
if (ret != NO_ERROR && ret != ERROR_BUFFER_OVERFLOW) {
|
||||
w32error_raise(ret);
|
||||
w32error_raise(ret);
|
||||
}
|
||||
fixedinfo = ALLOCV(buf, buflen);
|
||||
ret = GetNetworkParams(fixedinfo, &buflen);
|
||||
if (ret == NO_ERROR) {
|
||||
const IP_ADDR_STRING *ipaddr = &fixedinfo->DnsServerList;
|
||||
nameservers = rb_ary_new();
|
||||
do {
|
||||
const char *s = ipaddr->IpAddress.String;
|
||||
if (!*s) continue;
|
||||
if (strcmp(s, "0.0.0.0") == 0) continue;
|
||||
rb_ary_push(nameservers, rb_str_new_cstr(s));
|
||||
} while ((ipaddr = ipaddr->Next) != NULL);
|
||||
const IP_ADDR_STRING *ipaddr = &fixedinfo->DnsServerList;
|
||||
nameservers = rb_ary_new();
|
||||
do {
|
||||
const char *s = ipaddr->IpAddress.String;
|
||||
if (!*s) continue;
|
||||
if (strcmp(s, "0.0.0.0") == 0) continue;
|
||||
rb_ary_push(nameservers, rb_str_new_cstr(s));
|
||||
} while ((ipaddr = ipaddr->Next) != NULL);
|
||||
}
|
||||
ALLOCV_END(buf);
|
||||
if (ret != NO_ERROR) w32error_raise(ret);
|
||||
|
@ -454,12 +454,12 @@ vtdate2rbtime(double date)
|
||||
double sec;
|
||||
VariantTimeToSystemTime(date, &st);
|
||||
v = rb_funcall(rb_cTime, rb_intern("new"), 6,
|
||||
RB_INT2FIX(st.wYear),
|
||||
RB_INT2FIX(st.wMonth),
|
||||
RB_INT2FIX(st.wDay),
|
||||
RB_INT2FIX(st.wHour),
|
||||
RB_INT2FIX(st.wMinute),
|
||||
RB_INT2FIX(st.wSecond));
|
||||
RB_INT2FIX(st.wYear),
|
||||
RB_INT2FIX(st.wMonth),
|
||||
RB_INT2FIX(st.wDay),
|
||||
RB_INT2FIX(st.wHour),
|
||||
RB_INT2FIX(st.wMinute),
|
||||
RB_INT2FIX(st.wSecond));
|
||||
st.wYear = RB_FIX2INT(rb_funcall(v, rb_intern("year"), 0));
|
||||
st.wMonth = RB_FIX2INT(rb_funcall(v, rb_intern("month"), 0));
|
||||
st.wDay = RB_FIX2INT(rb_funcall(v, rb_intern("mday"), 0));
|
||||
@ -568,16 +568,16 @@ load_conv_function51932(void)
|
||||
void *p;
|
||||
if (!pIMultiLanguage) {
|
||||
#if defined(HAVE_TYPE_IMULTILANGUAGE2)
|
||||
hr = CoCreateInstance(&CLSID_CMultiLanguage, NULL, CLSCTX_INPROC_SERVER,
|
||||
&IID_IMultiLanguage2, &p);
|
||||
hr = CoCreateInstance(&CLSID_CMultiLanguage, NULL, CLSCTX_INPROC_SERVER,
|
||||
&IID_IMultiLanguage2, &p);
|
||||
#elif defined(HAVE_TYPE_IMULTILANGUAGE)
|
||||
hr = CoCreateInstance(&CLSID_CMultiLanguage, NULL, CLSCTX_INPROC_SERVER,
|
||||
&IID_IMultiLanguage, &p);
|
||||
hr = CoCreateInstance(&CLSID_CMultiLanguage, NULL, CLSCTX_INPROC_SERVER,
|
||||
&IID_IMultiLanguage, &p);
|
||||
#endif
|
||||
if (FAILED(hr)) {
|
||||
failed_load_conv51932();
|
||||
}
|
||||
pIMultiLanguage = p;
|
||||
if (FAILED(hr)) {
|
||||
failed_load_conv51932();
|
||||
}
|
||||
pIMultiLanguage = p;
|
||||
}
|
||||
}
|
||||
#define need_conv_function51932() (load_conv_function51932(), 1)
|
||||
@ -624,7 +624,7 @@ ole_init_cp(void)
|
||||
rb_encoding *encdef;
|
||||
encdef = rb_default_internal_encoding();
|
||||
if (!encdef) {
|
||||
encdef = rb_default_external_encoding();
|
||||
encdef = rb_default_external_encoding();
|
||||
}
|
||||
cp = ole_encoding2cp(encdef);
|
||||
set_ole_codepage(cp);
|
||||
@ -650,38 +650,38 @@ ole_cp2encoding(UINT cp)
|
||||
int idx;
|
||||
|
||||
if (!code_page_installed(cp)) {
|
||||
switch(cp) {
|
||||
case CP_ACP:
|
||||
cp = GetACP();
|
||||
break;
|
||||
case CP_OEMCP:
|
||||
cp = GetOEMCP();
|
||||
break;
|
||||
case CP_MACCP:
|
||||
case CP_THREAD_ACP:
|
||||
if (!pGetCPInfoEx) {
|
||||
pGetCPInfoEx = (BOOL (*)(UINT, DWORD, struct myCPINFOEX *))
|
||||
GetProcAddress(GetModuleHandle("kernel32"), "GetCPInfoEx");
|
||||
if (!pGetCPInfoEx) {
|
||||
pGetCPInfoEx = (void*)-1;
|
||||
}
|
||||
}
|
||||
buf = ALLOCA_N(struct myCPINFOEX, 1);
|
||||
ZeroMemory(buf, sizeof(struct myCPINFOEX));
|
||||
if (pGetCPInfoEx == (void*)-1 || !pGetCPInfoEx(cp, 0, buf)) {
|
||||
rb_raise(eWIN32OLERuntimeError, "cannot map codepage to encoding.");
|
||||
break; /* never reach here */
|
||||
}
|
||||
cp = buf->CodePage;
|
||||
break;
|
||||
case CP_SYMBOL:
|
||||
case CP_UTF7:
|
||||
case CP_UTF8:
|
||||
break;
|
||||
case 51932:
|
||||
load_conv_function51932();
|
||||
break;
|
||||
default:
|
||||
switch(cp) {
|
||||
case CP_ACP:
|
||||
cp = GetACP();
|
||||
break;
|
||||
case CP_OEMCP:
|
||||
cp = GetOEMCP();
|
||||
break;
|
||||
case CP_MACCP:
|
||||
case CP_THREAD_ACP:
|
||||
if (!pGetCPInfoEx) {
|
||||
pGetCPInfoEx = (BOOL (*)(UINT, DWORD, struct myCPINFOEX *))
|
||||
GetProcAddress(GetModuleHandle("kernel32"), "GetCPInfoEx");
|
||||
if (!pGetCPInfoEx) {
|
||||
pGetCPInfoEx = (void*)-1;
|
||||
}
|
||||
}
|
||||
buf = ALLOCA_N(struct myCPINFOEX, 1);
|
||||
ZeroMemory(buf, sizeof(struct myCPINFOEX));
|
||||
if (pGetCPInfoEx == (void*)-1 || !pGetCPInfoEx(cp, 0, buf)) {
|
||||
rb_raise(eWIN32OLERuntimeError, "cannot map codepage to encoding.");
|
||||
break; /* never reach here */
|
||||
}
|
||||
cp = buf->CodePage;
|
||||
break;
|
||||
case CP_SYMBOL:
|
||||
case CP_UTF7:
|
||||
case CP_UTF8:
|
||||
break;
|
||||
case 51932:
|
||||
load_conv_function51932();
|
||||
break;
|
||||
default:
|
||||
rb_raise(eWIN32OLERuntimeError, "codepage should be WIN32OLE::CP_ACP, WIN32OLE::CP_OEMCP, WIN32OLE::CP_MACCP, WIN32OLE::CP_THREAD_ACP, WIN32OLE::CP_SYMBOL, WIN32OLE::CP_UTF7, WIN32OLE::CP_UTF8, or installed codepage.");
|
||||
break;
|
||||
}
|
||||
@ -690,7 +690,7 @@ ole_cp2encoding(UINT cp)
|
||||
enc_name = rb_sprintf("CP%d", cp);
|
||||
idx = rb_enc_find_index(enc_cstr = StringValueCStr(enc_name));
|
||||
if (idx < 0)
|
||||
idx = rb_define_dummy_encoding(enc_cstr);
|
||||
idx = rb_define_dummy_encoding(enc_cstr);
|
||||
return rb_enc_from_index(idx);
|
||||
}
|
||||
|
||||
@ -700,14 +700,14 @@ ole_ml_wc2mb_conv0(LPWSTR pw, LPSTR pm, UINT *size)
|
||||
{
|
||||
DWORD dw = 0;
|
||||
return pIMultiLanguage->lpVtbl->ConvertStringFromUnicode(pIMultiLanguage,
|
||||
&dw, cWIN32OLE_cp, pw, NULL, pm, size);
|
||||
&dw, cWIN32OLE_cp, pw, NULL, pm, size);
|
||||
}
|
||||
#define ole_ml_wc2mb_conv(pw, pm, size, onfailure) do { \
|
||||
HRESULT hr = ole_ml_wc2mb_conv0(pw, pm, &size); \
|
||||
if (FAILED(hr)) { \
|
||||
onfailure; \
|
||||
ole_raise(hr, eWIN32OLERuntimeError, "fail to convert Unicode to CP%d", cWIN32OLE_cp); \
|
||||
} \
|
||||
HRESULT hr = ole_ml_wc2mb_conv0(pw, pm, &size); \
|
||||
if (FAILED(hr)) { \
|
||||
onfailure; \
|
||||
ole_raise(hr, eWIN32OLERuntimeError, "fail to convert Unicode to CP%d", cWIN32OLE_cp); \
|
||||
} \
|
||||
} while (0)
|
||||
#endif
|
||||
|
||||
@ -720,11 +720,11 @@ ole_wc2mb_alloc(LPWSTR pw, char *(alloc)(UINT size, void *arg), void *arg)
|
||||
UINT size = 0;
|
||||
if (conv_51932(cWIN32OLE_cp)) {
|
||||
#ifndef pIMultiLanguage
|
||||
ole_ml_wc2mb_conv(pw, NULL, size, {});
|
||||
pm = alloc(size, arg);
|
||||
if (size) ole_ml_wc2mb_conv(pw, pm, size, xfree(pm));
|
||||
pm[size] = '\0';
|
||||
return pm;
|
||||
ole_ml_wc2mb_conv(pw, NULL, size, {});
|
||||
pm = alloc(size, arg);
|
||||
if (size) ole_ml_wc2mb_conv(pw, pm, size, xfree(pm));
|
||||
pm[size] = '\0';
|
||||
return pm;
|
||||
#endif
|
||||
}
|
||||
size = ole_wc2mb_conv(pw, NULL, 0);
|
||||
@ -816,8 +816,8 @@ ole_initialize(void)
|
||||
HRESULT hr;
|
||||
|
||||
if(!g_uninitialize_hooked) {
|
||||
rb_add_event_hook(ole_uninitialize_hook, RUBY_EVENT_THREAD_END, Qnil);
|
||||
g_uninitialize_hooked = TRUE;
|
||||
rb_add_event_hook(ole_uninitialize_hook, RUBY_EVENT_THREAD_END, Qnil);
|
||||
g_uninitialize_hooked = TRUE;
|
||||
}
|
||||
|
||||
if(g_ole_initialized == FALSE) {
|
||||
@ -911,21 +911,21 @@ ole_mb2wc(char *pm, int len, UINT cp)
|
||||
|
||||
if (conv_51932(cp)) {
|
||||
#ifndef pIMultiLanguage
|
||||
DWORD dw = 0;
|
||||
UINT n = len;
|
||||
HRESULT hr = pIMultiLanguage->lpVtbl->ConvertStringToUnicode(pIMultiLanguage,
|
||||
&dw, cp, pm, &n, NULL, &size);
|
||||
if (FAILED(hr)) {
|
||||
DWORD dw = 0;
|
||||
UINT n = len;
|
||||
HRESULT hr = pIMultiLanguage->lpVtbl->ConvertStringToUnicode(pIMultiLanguage,
|
||||
&dw, cp, pm, &n, NULL, &size);
|
||||
if (FAILED(hr)) {
|
||||
ole_raise(hr, eWIN32OLERuntimeError, "fail to convert CP%d to Unicode", cp);
|
||||
}
|
||||
pw = SysAllocStringLen(NULL, size);
|
||||
n = len;
|
||||
hr = pIMultiLanguage->lpVtbl->ConvertStringToUnicode(pIMultiLanguage,
|
||||
&dw, cp, pm, &n, pw, &size);
|
||||
if (FAILED(hr)) {
|
||||
}
|
||||
pw = SysAllocStringLen(NULL, size);
|
||||
n = len;
|
||||
hr = pIMultiLanguage->lpVtbl->ConvertStringToUnicode(pIMultiLanguage,
|
||||
&dw, cp, pm, &n, pw, &size);
|
||||
if (FAILED(hr)) {
|
||||
ole_raise(hr, eWIN32OLERuntimeError, "fail to convert CP%d to Unicode", cp);
|
||||
}
|
||||
return pw;
|
||||
}
|
||||
return pw;
|
||||
#endif
|
||||
}
|
||||
size = MultiByteToWideChar(cp, 0, pm, len, NULL, 0);
|
||||
@ -1737,11 +1737,11 @@ reg_get_val(HKEY hkey, const char *subkey)
|
||||
if (err == ERROR_SUCCESS) {
|
||||
pbuf[size] = '\0';
|
||||
if (dwtype == REG_EXPAND_SZ) {
|
||||
char* pbuf2 = (char *)pbuf;
|
||||
DWORD len = ExpandEnvironmentStrings(pbuf2, NULL, 0);
|
||||
pbuf = ALLOC_N(char, len + 1);
|
||||
ExpandEnvironmentStrings(pbuf2, pbuf, len + 1);
|
||||
free(pbuf2);
|
||||
char* pbuf2 = (char *)pbuf;
|
||||
DWORD len = ExpandEnvironmentStrings(pbuf2, NULL, 0);
|
||||
pbuf = ALLOC_N(char, len + 1);
|
||||
ExpandEnvironmentStrings(pbuf2, pbuf, len + 1);
|
||||
free(pbuf2);
|
||||
}
|
||||
val = rb_str_new2((char *)pbuf);
|
||||
}
|
||||
@ -2555,7 +2555,7 @@ hash2named_arg(VALUE key, VALUE val, VALUE pop)
|
||||
rb_raise(rb_eTypeError, "wrong argument type (expected String or Symbol)");
|
||||
}
|
||||
if (RB_TYPE_P(key, T_SYMBOL)) {
|
||||
key = rb_sym2str(key);
|
||||
key = rb_sym2str(key);
|
||||
}
|
||||
|
||||
/* pNamedArgs[0] is <method name>, so "index + 1" */
|
||||
@ -2619,10 +2619,10 @@ ole_invoke(int argc, VALUE *argv, VALUE self, USHORT wFlags, BOOL is_bracket)
|
||||
|
||||
rb_scan_args(argc, argv, "1*", &cmd, ¶mS);
|
||||
if(!RB_TYPE_P(cmd, T_STRING) && !RB_TYPE_P(cmd, T_SYMBOL) && !is_bracket) {
|
||||
rb_raise(rb_eTypeError, "method is wrong type (expected String or Symbol)");
|
||||
rb_raise(rb_eTypeError, "method is wrong type (expected String or Symbol)");
|
||||
}
|
||||
if (RB_TYPE_P(cmd, T_SYMBOL)) {
|
||||
cmd = rb_sym2str(cmd);
|
||||
cmd = rb_sym2str(cmd);
|
||||
}
|
||||
pole = oledata_get_struct(self);
|
||||
if(!pole->pDispatch) {
|
||||
@ -2631,7 +2631,7 @@ ole_invoke(int argc, VALUE *argv, VALUE self, USHORT wFlags, BOOL is_bracket)
|
||||
if (is_bracket) {
|
||||
DispID = DISPID_VALUE;
|
||||
argc += 1;
|
||||
rb_ary_unshift(paramS, cmd);
|
||||
rb_ary_unshift(paramS, cmd);
|
||||
} else {
|
||||
wcmdname = ole_vstr2wc(cmd);
|
||||
hr = pole->pDispatch->lpVtbl->GetIDsOfNames( pole->pDispatch, &IID_NULL,
|
||||
@ -3639,7 +3639,7 @@ fole_respond_to(VALUE self, VALUE method)
|
||||
pole = oledata_get_struct(self);
|
||||
wcmdname = ole_vstr2wc(method);
|
||||
hr = pole->pDispatch->lpVtbl->GetIDsOfNames( pole->pDispatch, &IID_NULL,
|
||||
&wcmdname, 1, cWIN32OLE_lcid, &DispID);
|
||||
&wcmdname, 1, cWIN32OLE_lcid, &DispID);
|
||||
SysFreeString(wcmdname);
|
||||
return SUCCEEDED(hr) ? Qtrue : Qfalse;
|
||||
}
|
||||
|
@ -200,7 +200,7 @@ STDMETHODIMP EVENTSINK_Invoke(
|
||||
}
|
||||
outargv = Qnil;
|
||||
if (is_outarg == Qtrue) {
|
||||
outargv = rb_ary_new();
|
||||
outargv = rb_ary_new();
|
||||
rb_ary_push(args, outargv);
|
||||
}
|
||||
|
||||
@ -413,15 +413,15 @@ hash2ptr_dispparams(VALUE hash, ITypeInfo *pTypeInfo, DISPID dispid, DISPPARAMS
|
||||
bstrs, pdispparams->cArgs + 1,
|
||||
&len);
|
||||
if (FAILED(hr))
|
||||
return;
|
||||
return;
|
||||
|
||||
for (i = 0; i < len - 1; i++) {
|
||||
key = WC2VSTR(bstrs[i + 1]);
|
||||
key = WC2VSTR(bstrs[i + 1]);
|
||||
val = rb_hash_aref(hash, RB_UINT2NUM(i));
|
||||
if (val == Qnil)
|
||||
val = rb_hash_aref(hash, key);
|
||||
if (val == Qnil)
|
||||
val = rb_hash_aref(hash, rb_str_intern(key));
|
||||
if (val == Qnil)
|
||||
val = rb_hash_aref(hash, key);
|
||||
if (val == Qnil)
|
||||
val = rb_hash_aref(hash, rb_str_intern(key));
|
||||
pvar = &pdispparams->rgvarg[pdispparams->cArgs-i-1];
|
||||
ole_val2ptr_variant(val, pvar);
|
||||
}
|
||||
@ -433,7 +433,7 @@ hash2result(VALUE hash)
|
||||
VALUE ret = Qnil;
|
||||
ret = rb_hash_aref(hash, rb_str_new2("return"));
|
||||
if (ret == Qnil)
|
||||
ret = rb_hash_aref(hash, rb_str_intern(rb_str_new2("return")));
|
||||
ret = rb_hash_aref(hash, rb_str_intern(rb_str_new2("return")));
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -610,7 +610,7 @@ find_coclass(
|
||||
|
||||
hr = pTypeInfo->lpVtbl->GetContainingTypeLib(pTypeInfo, &pTypeLib, NULL);
|
||||
if (FAILED(hr)) {
|
||||
return hr;
|
||||
return hr;
|
||||
}
|
||||
count = pTypeLib->lpVtbl->GetTypeInfoCount(pTypeLib);
|
||||
for (i = 0; i < count && !found; i++) {
|
||||
|
@ -285,7 +285,7 @@ oletypelib_get_libattr(ITypeLib *pTypeLib, TLIBATTR **ppTLibAttr)
|
||||
hr = pTypeLib->lpVtbl->GetLibAttr(pTypeLib, ppTLibAttr);
|
||||
if (FAILED(hr)) {
|
||||
ole_raise(hr, eWIN32OLERuntimeError,
|
||||
"failed to get library attribute(TLIBATTR) from ITypeLib");
|
||||
"failed to get library attribute(TLIBATTR) from ITypeLib");
|
||||
}
|
||||
}
|
||||
|
||||
@ -588,13 +588,13 @@ foletypelib_path(VALUE self)
|
||||
pTypeLib = itypelib(self);
|
||||
oletypelib_get_libattr(pTypeLib, &pTLibAttr);
|
||||
hr = QueryPathOfRegTypeLib(&pTLibAttr->guid,
|
||||
pTLibAttr->wMajorVerNum,
|
||||
pTLibAttr->wMinorVerNum,
|
||||
lcid,
|
||||
&bstr);
|
||||
pTLibAttr->wMajorVerNum,
|
||||
pTLibAttr->wMinorVerNum,
|
||||
lcid,
|
||||
&bstr);
|
||||
if (FAILED(hr)) {
|
||||
pTypeLib->lpVtbl->ReleaseTLibAttr(pTypeLib, pTLibAttr);
|
||||
ole_raise(hr, eWIN32OLERuntimeError, "failed to QueryPathOfRegTypeTypeLib");
|
||||
pTypeLib->lpVtbl->ReleaseTLibAttr(pTypeLib, pTLibAttr);
|
||||
ole_raise(hr, eWIN32OLERuntimeError, "failed to QueryPathOfRegTypeTypeLib");
|
||||
}
|
||||
|
||||
pTypeLib->lpVtbl->ReleaseTLibAttr(pTypeLib, pTLibAttr);
|
||||
@ -722,7 +722,7 @@ typelib_file_from_typelib(VALUE ole)
|
||||
if (ver == Qnil)
|
||||
break;
|
||||
err = reg_open_vkey(hclsid, ver, &hversion);
|
||||
if (err != ERROR_SUCCESS || fver > atof(StringValuePtr(ver)))
|
||||
if (err != ERROR_SUCCESS || fver > atof(StringValuePtr(ver)))
|
||||
continue;
|
||||
fver = atof(StringValuePtr(ver));
|
||||
typelib = reg_get_val(hversion, NULL);
|
||||
|
16
gc.h
16
gc.h
@ -20,9 +20,9 @@ NOINLINE(void rb_gc_set_stack_end(VALUE **stack_end_p));
|
||||
|
||||
#define RB_GC_SAVE_MACHINE_CONTEXT(th) \
|
||||
do { \
|
||||
FLUSH_REGISTER_WINDOWS; \
|
||||
setjmp((th)->ec->machine.regs); \
|
||||
SET_MACHINE_STACK_END(&(th)->ec->machine.stack_end); \
|
||||
FLUSH_REGISTER_WINDOWS; \
|
||||
setjmp((th)->ec->machine.regs); \
|
||||
SET_MACHINE_STACK_END(&(th)->ec->machine.stack_end); \
|
||||
} while (0)
|
||||
|
||||
/* for GC debug */
|
||||
@ -44,13 +44,13 @@ static inline void
|
||||
rb_gc_debug_body(const char *mode, const char *msg, int st, void *ptr)
|
||||
{
|
||||
if (st == 0) {
|
||||
ruby_gc_debug_indent--;
|
||||
ruby_gc_debug_indent--;
|
||||
}
|
||||
rb_gc_debug_indent();
|
||||
ruby_debug_printf("%s: %s %s (%p)\n", mode, st ? "->" : "<-", msg, ptr);
|
||||
|
||||
if (st) {
|
||||
ruby_gc_debug_indent++;
|
||||
ruby_gc_debug_indent++;
|
||||
}
|
||||
|
||||
fflush(stdout);
|
||||
@ -88,9 +88,9 @@ rb_gc_debug_body(const char *mode, const char *msg, int st, void *ptr)
|
||||
RUBY_EXTERN int ruby_stack_grow_direction;
|
||||
int ruby_get_stack_grow_direction(volatile VALUE *addr);
|
||||
# define stack_growup_p(x) ( \
|
||||
(ruby_stack_grow_direction ? \
|
||||
ruby_stack_grow_direction : \
|
||||
ruby_get_stack_grow_direction(x)) > 0)
|
||||
(ruby_stack_grow_direction ? \
|
||||
ruby_stack_grow_direction : \
|
||||
ruby_get_stack_grow_direction(x)) > 0)
|
||||
# define STACK_UPPER(x, a, b) (stack_growup_p(x) ? (a) : (b))
|
||||
#endif
|
||||
|
||||
|
32
goruby.c
32
goruby.c
@ -37,21 +37,21 @@ goruby_options(int argc, char **argv)
|
||||
void *ret;
|
||||
|
||||
if ((isatty(0) && isatty(1) && isatty(2)) && (pipe(rw) == 0)) {
|
||||
ssize_t n;
|
||||
infd = dup(0);
|
||||
if (infd < 0) {
|
||||
close(rw[0]);
|
||||
close(rw[1]);
|
||||
goto no_irb;
|
||||
}
|
||||
dup2(rw[0], 0);
|
||||
close(rw[0]);
|
||||
n = write(rw[1], cmd, sizeof(cmd) - 1);
|
||||
close(rw[1]);
|
||||
ret = n > 0 ? ruby_options(argc, argv) : NULL;
|
||||
dup2(infd, 0);
|
||||
close(infd);
|
||||
return ret;
|
||||
ssize_t n;
|
||||
infd = dup(0);
|
||||
if (infd < 0) {
|
||||
close(rw[0]);
|
||||
close(rw[1]);
|
||||
goto no_irb;
|
||||
}
|
||||
dup2(rw[0], 0);
|
||||
close(rw[0]);
|
||||
n = write(rw[1], cmd, sizeof(cmd) - 1);
|
||||
close(rw[1]);
|
||||
ret = n > 0 ? ruby_options(argc, argv) : NULL;
|
||||
dup2(infd, 0);
|
||||
close(infd);
|
||||
return ret;
|
||||
}
|
||||
no_irb:
|
||||
return ruby_options(argc, argv);
|
||||
@ -62,7 +62,7 @@ goruby_run_node(void *arg)
|
||||
{
|
||||
int state;
|
||||
if (NIL_P(rb_protect(init_golf, Qtrue, &state))) {
|
||||
return state == EXIT_SUCCESS ? EXIT_FAILURE : state;
|
||||
return state == EXIT_SUCCESS ? EXIT_FAILURE : state;
|
||||
}
|
||||
return ruby_run_node(arg);
|
||||
}
|
||||
|
134
id_table.c
134
id_table.c
@ -85,9 +85,9 @@ rb_id_table_init(struct rb_id_table *tbl, int capa)
|
||||
{
|
||||
MEMZERO(tbl, struct rb_id_table, 1);
|
||||
if (capa > 0) {
|
||||
capa = round_capa(capa);
|
||||
tbl->capa = (int)capa;
|
||||
tbl->items = ZALLOC_N(item_t, capa);
|
||||
capa = round_capa(capa);
|
||||
tbl->capa = (int)capa;
|
||||
tbl->items = ZALLOC_N(item_t, capa);
|
||||
}
|
||||
return tbl;
|
||||
}
|
||||
@ -130,16 +130,16 @@ static int
|
||||
hash_table_index(struct rb_id_table* tbl, id_key_t key)
|
||||
{
|
||||
if (tbl->capa > 0) {
|
||||
int mask = tbl->capa - 1;
|
||||
int ix = key & mask;
|
||||
int d = 1;
|
||||
while (key != ITEM_GET_KEY(tbl, ix)) {
|
||||
if (!ITEM_COLLIDED(tbl, ix))
|
||||
return -1;
|
||||
ix = (ix + d) & mask;
|
||||
d++;
|
||||
}
|
||||
return ix;
|
||||
int mask = tbl->capa - 1;
|
||||
int ix = key & mask;
|
||||
int d = 1;
|
||||
while (key != ITEM_GET_KEY(tbl, ix)) {
|
||||
if (!ITEM_COLLIDED(tbl, ix))
|
||||
return -1;
|
||||
ix = (ix + d) & mask;
|
||||
d++;
|
||||
}
|
||||
return ix;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
@ -152,13 +152,13 @@ hash_table_raw_insert(struct rb_id_table *tbl, id_key_t key, VALUE val)
|
||||
int d = 1;
|
||||
assert(key != 0);
|
||||
while (ITEM_KEY_ISSET(tbl, ix)) {
|
||||
ITEM_SET_COLLIDED(tbl, ix);
|
||||
ix = (ix + d) & mask;
|
||||
d++;
|
||||
ITEM_SET_COLLIDED(tbl, ix);
|
||||
ix = (ix + d) & mask;
|
||||
d++;
|
||||
}
|
||||
tbl->num++;
|
||||
if (!ITEM_COLLIDED(tbl, ix)) {
|
||||
tbl->used++;
|
||||
tbl->used++;
|
||||
}
|
||||
ITEM_SET_KEY(tbl, ix, key);
|
||||
tbl->items[ix].val = val;
|
||||
@ -168,16 +168,16 @@ static int
|
||||
hash_delete_index(struct rb_id_table *tbl, int ix)
|
||||
{
|
||||
if (ix >= 0) {
|
||||
if (!ITEM_COLLIDED(tbl, ix)) {
|
||||
tbl->used--;
|
||||
}
|
||||
tbl->num--;
|
||||
ITEM_SET_KEY(tbl, ix, 0);
|
||||
tbl->items[ix].val = 0;
|
||||
return TRUE;
|
||||
if (!ITEM_COLLIDED(tbl, ix)) {
|
||||
tbl->used--;
|
||||
}
|
||||
tbl->num--;
|
||||
ITEM_SET_KEY(tbl, ix, 0);
|
||||
tbl->items[ix].val = 0;
|
||||
return TRUE;
|
||||
}
|
||||
else {
|
||||
return FALSE;
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
@ -185,24 +185,24 @@ static void
|
||||
hash_table_extend(struct rb_id_table* tbl)
|
||||
{
|
||||
if (tbl->used + (tbl->used >> 1) >= tbl->capa) {
|
||||
int new_cap = round_capa(tbl->num + (tbl->num >> 1));
|
||||
int i;
|
||||
item_t* old;
|
||||
struct rb_id_table tmp_tbl = {0, 0, 0};
|
||||
if (new_cap < tbl->capa) {
|
||||
new_cap = round_capa(tbl->used + (tbl->used >> 1));
|
||||
}
|
||||
tmp_tbl.capa = new_cap;
|
||||
tmp_tbl.items = ZALLOC_N(item_t, new_cap);
|
||||
for (i = 0; i < tbl->capa; i++) {
|
||||
id_key_t key = ITEM_GET_KEY(tbl, i);
|
||||
if (key != 0) {
|
||||
hash_table_raw_insert(&tmp_tbl, key, tbl->items[i].val);
|
||||
}
|
||||
}
|
||||
old = tbl->items;
|
||||
*tbl = tmp_tbl;
|
||||
xfree(old);
|
||||
int new_cap = round_capa(tbl->num + (tbl->num >> 1));
|
||||
int i;
|
||||
item_t* old;
|
||||
struct rb_id_table tmp_tbl = {0, 0, 0};
|
||||
if (new_cap < tbl->capa) {
|
||||
new_cap = round_capa(tbl->used + (tbl->used >> 1));
|
||||
}
|
||||
tmp_tbl.capa = new_cap;
|
||||
tmp_tbl.items = ZALLOC_N(item_t, new_cap);
|
||||
for (i = 0; i < tbl->capa; i++) {
|
||||
id_key_t key = ITEM_GET_KEY(tbl, i);
|
||||
if (key != 0) {
|
||||
hash_table_raw_insert(&tmp_tbl, key, tbl->items[i].val);
|
||||
}
|
||||
}
|
||||
old = tbl->items;
|
||||
*tbl = tmp_tbl;
|
||||
xfree(old);
|
||||
}
|
||||
}
|
||||
|
||||
@ -216,9 +216,9 @@ hash_table_show(struct rb_id_table *tbl)
|
||||
|
||||
fprintf(stderr, "tbl: %p (capa: %d, num: %d, used: %d)\n", tbl, tbl->capa, tbl->num, tbl->used);
|
||||
for (i=0; i<capa; i++) {
|
||||
if (ITEM_KEY_ISSET(tbl, i)) {
|
||||
fprintf(stderr, " -> [%d] %s %d\n", i, rb_id2name(key2id(keys[i])), (int)keys[i]);
|
||||
}
|
||||
if (ITEM_KEY_ISSET(tbl, i)) {
|
||||
fprintf(stderr, " -> [%d] %s %d\n", i, rb_id2name(key2id(keys[i])), (int)keys[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@ -231,10 +231,10 @@ rb_id_table_lookup(struct rb_id_table *tbl, ID id, VALUE *valp)
|
||||
|
||||
if (index >= 0) {
|
||||
*valp = tbl->items[index].val;
|
||||
return TRUE;
|
||||
return TRUE;
|
||||
}
|
||||
else {
|
||||
return FALSE;
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
@ -244,11 +244,11 @@ rb_id_table_insert_key(struct rb_id_table *tbl, const id_key_t key, const VALUE
|
||||
const int index = hash_table_index(tbl, key);
|
||||
|
||||
if (index >= 0) {
|
||||
tbl->items[index].val = val;
|
||||
tbl->items[index].val = val;
|
||||
}
|
||||
else {
|
||||
hash_table_extend(tbl);
|
||||
hash_table_raw_insert(tbl, key, val);
|
||||
hash_table_extend(tbl);
|
||||
hash_table_raw_insert(tbl, key, val);
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
@ -273,16 +273,16 @@ rb_id_table_foreach(struct rb_id_table *tbl, rb_id_table_foreach_func_t *func, v
|
||||
int i, capa = tbl->capa;
|
||||
|
||||
for (i=0; i<capa; i++) {
|
||||
if (ITEM_KEY_ISSET(tbl, i)) {
|
||||
const id_key_t key = ITEM_GET_KEY(tbl, i);
|
||||
enum rb_id_table_iterator_result ret = (*func)(key2id(key), tbl->items[i].val, data);
|
||||
assert(key != 0);
|
||||
if (ITEM_KEY_ISSET(tbl, i)) {
|
||||
const id_key_t key = ITEM_GET_KEY(tbl, i);
|
||||
enum rb_id_table_iterator_result ret = (*func)(key2id(key), tbl->items[i].val, data);
|
||||
assert(key != 0);
|
||||
|
||||
if (ret == ID_TABLE_DELETE)
|
||||
hash_delete_index(tbl, i);
|
||||
else if (ret == ID_TABLE_STOP)
|
||||
return;
|
||||
}
|
||||
if (ret == ID_TABLE_DELETE)
|
||||
hash_delete_index(tbl, i);
|
||||
else if (ret == ID_TABLE_STOP)
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -292,14 +292,14 @@ rb_id_table_foreach_values(struct rb_id_table *tbl, rb_id_table_foreach_values_f
|
||||
int i, capa = tbl->capa;
|
||||
|
||||
for (i=0; i<capa; i++) {
|
||||
if (ITEM_KEY_ISSET(tbl, i)) {
|
||||
enum rb_id_table_iterator_result ret = (*func)(tbl->items[i].val, data);
|
||||
if (ITEM_KEY_ISSET(tbl, i)) {
|
||||
enum rb_id_table_iterator_result ret = (*func)(tbl->items[i].val, data);
|
||||
|
||||
if (ret == ID_TABLE_DELETE)
|
||||
hash_delete_index(tbl, i);
|
||||
else if (ret == ID_TABLE_STOP)
|
||||
return;
|
||||
}
|
||||
if (ret == ID_TABLE_DELETE)
|
||||
hash_delete_index(tbl, i);
|
||||
else if (ret == ID_TABLE_STOP)
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -108,7 +108,7 @@ VALUE rb_get_path_no_checksafe(VALUE);
|
||||
# define rb_varargs_argc_check_runtime(argc, vargc) \
|
||||
(((argc) <= (vargc)) ? (argc) : \
|
||||
(rb_fatal("argc(%d) exceeds actual arguments(%d)", \
|
||||
argc, vargc), 0))
|
||||
argc, vargc), 0))
|
||||
# define rb_varargs_argc_valid_p(argc, vargc) \
|
||||
((argc) == 0 ? (vargc) <= 1 : /* [ruby-core:85266] [Bug #14425] */ \
|
||||
(argc) == (vargc))
|
||||
@ -117,16 +117,16 @@ VALUE rb_get_path_no_checksafe(VALUE);
|
||||
ERRORFUNC((" argument length doesn't match"), int rb_varargs_bad_length(int,int));
|
||||
# else
|
||||
# define rb_varargs_bad_length(argc, vargc) \
|
||||
((argc)/rb_varargs_argc_valid_p(argc, vargc))
|
||||
((argc)/rb_varargs_argc_valid_p(argc, vargc))
|
||||
# endif
|
||||
# define rb_varargs_argc_check(argc, vargc) \
|
||||
__builtin_choose_expr(__builtin_constant_p(argc), \
|
||||
(rb_varargs_argc_valid_p(argc, vargc) ? (argc) : \
|
||||
rb_varargs_bad_length(argc, vargc)), \
|
||||
rb_varargs_argc_check_runtime(argc, vargc))
|
||||
(rb_varargs_argc_valid_p(argc, vargc) ? (argc) : \
|
||||
rb_varargs_bad_length(argc, vargc)), \
|
||||
rb_varargs_argc_check_runtime(argc, vargc))
|
||||
# else
|
||||
# define rb_varargs_argc_check(argc, vargc) \
|
||||
rb_varargs_argc_check_runtime(argc, vargc)
|
||||
rb_varargs_argc_check_runtime(argc, vargc)
|
||||
# endif
|
||||
#endif
|
||||
/** @endcond */
|
||||
@ -277,24 +277,24 @@ int ruby_vsnprintf(char *str, size_t n, char const *fmt, va_list ap);
|
||||
#elif defined(__GNUC__) && defined(HAVE_VA_ARGS_MACRO) && defined(__OPTIMIZE__)
|
||||
# define rb_yield_values(argc, ...) \
|
||||
__extension__({ \
|
||||
const int rb_yield_values_argc = (argc); \
|
||||
const VALUE rb_yield_values_args[] = {__VA_ARGS__}; \
|
||||
const int rb_yield_values_nargs = \
|
||||
(int)(sizeof(rb_yield_values_args) / sizeof(VALUE)); \
|
||||
rb_yield_values2( \
|
||||
rb_varargs_argc_check(rb_yield_values_argc, rb_yield_values_nargs), \
|
||||
rb_yield_values_nargs ? rb_yield_values_args : NULL); \
|
||||
const int rb_yield_values_argc = (argc); \
|
||||
const VALUE rb_yield_values_args[] = {__VA_ARGS__}; \
|
||||
const int rb_yield_values_nargs = \
|
||||
(int)(sizeof(rb_yield_values_args) / sizeof(VALUE)); \
|
||||
rb_yield_values2( \
|
||||
rb_varargs_argc_check(rb_yield_values_argc, rb_yield_values_nargs), \
|
||||
rb_yield_values_nargs ? rb_yield_values_args : NULL); \
|
||||
})
|
||||
|
||||
# define rb_funcall(recv, mid, argc, ...) \
|
||||
__extension__({ \
|
||||
const int rb_funcall_argc = (argc); \
|
||||
const VALUE rb_funcall_args[] = {__VA_ARGS__}; \
|
||||
const int rb_funcall_nargs = \
|
||||
(int)(sizeof(rb_funcall_args) / sizeof(VALUE)); \
|
||||
const int rb_funcall_argc = (argc); \
|
||||
const VALUE rb_funcall_args[] = {__VA_ARGS__}; \
|
||||
const int rb_funcall_nargs = \
|
||||
(int)(sizeof(rb_funcall_args) / sizeof(VALUE)); \
|
||||
rb_funcallv(recv, mid, \
|
||||
rb_varargs_argc_check(rb_funcall_argc, rb_funcall_nargs), \
|
||||
rb_funcall_nargs ? rb_funcall_args : NULL); \
|
||||
rb_varargs_argc_check(rb_funcall_argc, rb_funcall_nargs), \
|
||||
rb_funcall_nargs ? rb_funcall_args : NULL); \
|
||||
})
|
||||
#endif
|
||||
/** @endcond */
|
||||
|
@ -128,7 +128,7 @@ RBIMPL_ATTR_NONNULL((1))
|
||||
* your code to see if it is actually worth releasing the GVL.
|
||||
*/
|
||||
void *rb_thread_call_without_gvl(void *(*func)(void *), void *data1,
|
||||
rb_unblock_function_t *ubf, void *data2);
|
||||
rb_unblock_function_t *ubf, void *data2);
|
||||
|
||||
RBIMPL_ATTR_NONNULL((1))
|
||||
/**
|
||||
@ -152,7 +152,7 @@ RBIMPL_ATTR_NONNULL((1))
|
||||
* @return What `func` returned, or 0 in case `func` did not return.
|
||||
*/
|
||||
void *rb_thread_call_without_gvl2(void *(*func)(void *), void *data1,
|
||||
rb_unblock_function_t *ubf, void *data2);
|
||||
rb_unblock_function_t *ubf, void *data2);
|
||||
|
||||
/*
|
||||
* XXX: unstable/unapproved - out-of-tree code should NOT not depend
|
||||
|
@ -124,7 +124,7 @@ unsigned long ruby_scan_hex(const char *str, size_t len, size_t *ret);
|
||||
# define ruby_qsort qsort_r
|
||||
#else
|
||||
void ruby_qsort(void *, const size_t, const size_t,
|
||||
int (*)(const void *, const void *, void *), void *);
|
||||
int (*)(const void *, const void *, void *), void *);
|
||||
#endif
|
||||
|
||||
RBIMPL_ATTR_NONNULL((1))
|
||||
|
@ -702,10 +702,10 @@ extern char *rb_w32_strerror(int);
|
||||
#endif
|
||||
|
||||
struct tms {
|
||||
long tms_utime;
|
||||
long tms_stime;
|
||||
long tms_cutime;
|
||||
long tms_cstime;
|
||||
long tms_utime;
|
||||
long tms_stime;
|
||||
long tms_cutime;
|
||||
long tms_cstime;
|
||||
};
|
||||
|
||||
int rb_w32_times(struct tms *);
|
||||
|
106
insns.def
106
insns.def
@ -109,14 +109,14 @@ getblockparam
|
||||
VM_ASSERT(VM_ENV_LOCAL_P(ep));
|
||||
|
||||
if (!VM_ENV_FLAGS(ep, VM_FRAME_FLAG_MODIFIED_BLOCK_PARAM)) {
|
||||
val = rb_vm_bh_to_procval(ec, VM_ENV_BLOCK_HANDLER(ep));
|
||||
vm_env_write(ep, -(int)idx, val);
|
||||
VM_ENV_FLAGS_SET(ep, VM_FRAME_FLAG_MODIFIED_BLOCK_PARAM);
|
||||
val = rb_vm_bh_to_procval(ec, VM_ENV_BLOCK_HANDLER(ep));
|
||||
vm_env_write(ep, -(int)idx, val);
|
||||
VM_ENV_FLAGS_SET(ep, VM_FRAME_FLAG_MODIFIED_BLOCK_PARAM);
|
||||
}
|
||||
else {
|
||||
val = *(ep - idx);
|
||||
RB_DEBUG_COUNTER_INC(lvar_get);
|
||||
(void)RB_DEBUG_COUNTER_INC_IF(lvar_get_dynamic, level > 0);
|
||||
val = *(ep - idx);
|
||||
RB_DEBUG_COUNTER_INC(lvar_get);
|
||||
(void)RB_DEBUG_COUNTER_INC_IF(lvar_get_dynamic, level > 0);
|
||||
}
|
||||
}
|
||||
|
||||
@ -150,35 +150,35 @@ getblockparamproxy
|
||||
VM_ASSERT(VM_ENV_LOCAL_P(ep));
|
||||
|
||||
if (!VM_ENV_FLAGS(ep, VM_FRAME_FLAG_MODIFIED_BLOCK_PARAM)) {
|
||||
VALUE block_handler = VM_ENV_BLOCK_HANDLER(ep);
|
||||
VALUE block_handler = VM_ENV_BLOCK_HANDLER(ep);
|
||||
|
||||
if (block_handler) {
|
||||
switch (vm_block_handler_type(block_handler)) {
|
||||
case block_handler_type_iseq:
|
||||
case block_handler_type_ifunc:
|
||||
val = rb_block_param_proxy;
|
||||
break;
|
||||
case block_handler_type_symbol:
|
||||
val = rb_sym_to_proc(VM_BH_TO_SYMBOL(block_handler));
|
||||
goto INSN_LABEL(set);
|
||||
case block_handler_type_proc:
|
||||
val = VM_BH_TO_PROC(block_handler);
|
||||
goto INSN_LABEL(set);
|
||||
default:
|
||||
VM_UNREACHABLE(getblockparamproxy);
|
||||
}
|
||||
}
|
||||
else {
|
||||
val = Qnil;
|
||||
INSN_LABEL(set):
|
||||
vm_env_write(ep, -(int)idx, val);
|
||||
VM_ENV_FLAGS_SET(ep, VM_FRAME_FLAG_MODIFIED_BLOCK_PARAM);
|
||||
}
|
||||
if (block_handler) {
|
||||
switch (vm_block_handler_type(block_handler)) {
|
||||
case block_handler_type_iseq:
|
||||
case block_handler_type_ifunc:
|
||||
val = rb_block_param_proxy;
|
||||
break;
|
||||
case block_handler_type_symbol:
|
||||
val = rb_sym_to_proc(VM_BH_TO_SYMBOL(block_handler));
|
||||
goto INSN_LABEL(set);
|
||||
case block_handler_type_proc:
|
||||
val = VM_BH_TO_PROC(block_handler);
|
||||
goto INSN_LABEL(set);
|
||||
default:
|
||||
VM_UNREACHABLE(getblockparamproxy);
|
||||
}
|
||||
}
|
||||
else {
|
||||
val = Qnil;
|
||||
INSN_LABEL(set):
|
||||
vm_env_write(ep, -(int)idx, val);
|
||||
VM_ENV_FLAGS_SET(ep, VM_FRAME_FLAG_MODIFIED_BLOCK_PARAM);
|
||||
}
|
||||
}
|
||||
else {
|
||||
val = *(ep - idx);
|
||||
RB_DEBUG_COUNTER_INC(lvar_get);
|
||||
(void)RB_DEBUG_COUNTER_INC_IF(lvar_get_dynamic, level > 0);
|
||||
val = *(ep - idx);
|
||||
RB_DEBUG_COUNTER_INC(lvar_get);
|
||||
(void)RB_DEBUG_COUNTER_INC_IF(lvar_get_dynamic, level > 0);
|
||||
}
|
||||
}
|
||||
|
||||
@ -715,8 +715,8 @@ defineclass
|
||||
|
||||
/* enter scope */
|
||||
vm_push_frame(ec, class_iseq, VM_FRAME_MAGIC_CLASS | VM_ENV_FLAG_LOCAL, klass,
|
||||
GET_BLOCK_HANDLER(),
|
||||
(VALUE)vm_cref_push(ec, klass, NULL, FALSE, FALSE),
|
||||
GET_BLOCK_HANDLER(),
|
||||
(VALUE)vm_cref_push(ec, klass, NULL, FALSE, FALSE),
|
||||
ISEQ_BODY(class_iseq)->iseq_encoded, GET_SP(),
|
||||
ISEQ_BODY(class_iseq)->local_table_size,
|
||||
ISEQ_BODY(class_iseq)->stack_max);
|
||||
@ -920,19 +920,19 @@ leave
|
||||
const VALUE *const bp = vm_base_ptr(GET_CFP());
|
||||
if (GET_SP() != bp) {
|
||||
vm_stack_consistency_error(ec, GET_CFP(), bp);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (vm_pop_frame(ec, GET_CFP(), GET_EP())) {
|
||||
#if OPT_CALL_THREADED_CODE
|
||||
rb_ec_thread_ptr(ec)->retval = val;
|
||||
return 0;
|
||||
rb_ec_thread_ptr(ec)->retval = val;
|
||||
return 0;
|
||||
#else
|
||||
return val;
|
||||
return val;
|
||||
#endif
|
||||
}
|
||||
else {
|
||||
RESTORE_REGS();
|
||||
RESTORE_REGS();
|
||||
}
|
||||
}
|
||||
|
||||
@ -981,8 +981,8 @@ branchif
|
||||
// attr bool leaf = leafness_of_check_ints; /* has rb_threadptr_execute_interrupts() */
|
||||
{
|
||||
if (RTEST(val)) {
|
||||
RUBY_VM_CHECK_INTS(ec);
|
||||
JUMP(dst);
|
||||
RUBY_VM_CHECK_INTS(ec);
|
||||
JUMP(dst);
|
||||
}
|
||||
}
|
||||
|
||||
@ -996,8 +996,8 @@ branchunless
|
||||
// attr bool leaf = leafness_of_check_ints; /* has rb_threadptr_execute_interrupts() */
|
||||
{
|
||||
if (!RTEST(val)) {
|
||||
RUBY_VM_CHECK_INTS(ec);
|
||||
JUMP(dst);
|
||||
RUBY_VM_CHECK_INTS(ec);
|
||||
JUMP(dst);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1011,8 +1011,8 @@ branchnil
|
||||
// attr bool leaf = leafness_of_check_ints; /* has rb_threadptr_execute_interrupts() */
|
||||
{
|
||||
if (NIL_P(val)) {
|
||||
RUBY_VM_CHECK_INTS(ec);
|
||||
JUMP(dst);
|
||||
RUBY_VM_CHECK_INTS(ec);
|
||||
JUMP(dst);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1081,7 +1081,7 @@ opt_case_dispatch
|
||||
OFFSET dst = vm_case_dispatch(hash, else_offset, key);
|
||||
|
||||
if (dst) {
|
||||
JUMP(dst);
|
||||
JUMP(dst);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1340,12 +1340,12 @@ opt_aset_with
|
||||
VALUE tmp = vm_opt_aset_with(recv, key, val);
|
||||
|
||||
if (tmp != Qundef) {
|
||||
val = tmp;
|
||||
val = tmp;
|
||||
}
|
||||
else {
|
||||
#ifndef MJIT_HEADER
|
||||
TOPN(0) = rb_str_resurrect(key);
|
||||
PUSH(val);
|
||||
TOPN(0) = rb_str_resurrect(key);
|
||||
PUSH(val);
|
||||
#endif
|
||||
CALL_SIMPLE_METHOD();
|
||||
}
|
||||
@ -1364,7 +1364,7 @@ opt_aref_with
|
||||
|
||||
if (val == Qundef) {
|
||||
#ifndef MJIT_HEADER
|
||||
PUSH(rb_str_resurrect(key));
|
||||
PUSH(rb_str_resurrect(key));
|
||||
#endif
|
||||
CALL_SIMPLE_METHOD();
|
||||
}
|
||||
@ -1467,9 +1467,9 @@ opt_call_c_function
|
||||
reg_cfp = (funcptr)(ec, reg_cfp);
|
||||
|
||||
if (reg_cfp == 0) {
|
||||
VALUE err = ec->errinfo;
|
||||
ec->errinfo = Qnil;
|
||||
THROW_EXCEPTION(err);
|
||||
VALUE err = ec->errinfo;
|
||||
ec->errinfo = Qnil;
|
||||
THROW_EXCEPTION(err);
|
||||
}
|
||||
|
||||
RESTORE_REGS();
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user