1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

*** empty log message ***

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/RUBY@11 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
matz 1998-01-16 12:19:22 +00:00
parent f12baed5df
commit fd1d8cdc09
78 changed files with 7894 additions and 7806 deletions

397
object.c
View file

@ -18,7 +18,7 @@ VALUE mKernel;
VALUE cObject;
VALUE cModule;
VALUE cClass;
VALUE cFixnum;
extern VALUE cFixnum;
VALUE cData;
static VALUE cNilClass;
@ -72,14 +72,19 @@ static VALUE
obj_id(obj)
VALUE obj;
{
return obj | FIXNUM_FLAG;
return INT2NUM((int)obj);
}
static VALUE
obj_type(obj)
struct RBasic *obj;
VALUE obj;
{
return rb_class_path(CLASS_OF(obj));
VALUE cl = CLASS_OF(obj);
if (FL_TEST(cl, FL_SINGLETON)) {
cl = RCLASS(cl)->super;
}
return cl;
}
static VALUE
@ -91,13 +96,13 @@ obj_clone(obj)
if (TYPE(obj) != T_OBJECT) {
TypeError("can't clone %s", rb_class2name(CLASS_OF(obj)));
}
clone = obj_alloc(RBASIC(obj)->class);
CLONESETUP(clone,obj);
if (ROBJECT(obj)->iv_tbl) {
ROBJECT(clone)->iv_tbl = st_copy(ROBJECT(obj)->iv_tbl);
}
RBASIC(clone)->class = singleton_class_clone(RBASIC(obj)->class);
RBASIC(clone)->flags = RBASIC(obj)->flags;
}
return clone;
}
@ -130,15 +135,15 @@ static int
inspect_i(id, value, str)
ID id;
VALUE value;
struct RString *str;
VALUE str;
{
VALUE str2;
char *ivname;
/* need not to show internal data */
if (CLASS_OF(value) == 0) return ST_CONTINUE;
if (str->ptr[0] == '-') {
str->ptr[0] = '#';
if (RSTRING(str)->ptr[0] == '-') {
RSTRING(str)->ptr[0] = '#';
str_cat(str, ": ", 2);
}
else {
@ -160,17 +165,18 @@ inspect_i(id, value, str)
static VALUE
obj_inspect(obj)
struct RObject *obj;
VALUE obj;
{
if (TYPE(obj) == T_OBJECT
&& obj->iv_tbl && obj->iv_tbl->num_entries > 0) {
&& ROBJECT(obj)->iv_tbl
&& ROBJECT(obj)->iv_tbl->num_entries > 0) {
VALUE str;
char *b;
str = str_new2("-<");
b = rb_class2name(CLASS_OF(obj));
str_cat(str, b, strlen(b));
st_foreach(obj->iv_tbl, inspect_i, str);
st_foreach(ROBJECT(obj)->iv_tbl, inspect_i, str);
str_cat(str, ">", 1);
return str;
@ -182,7 +188,7 @@ VALUE
obj_is_instance_of(obj, c)
VALUE obj, c;
{
struct RClass *class = (struct RClass*)CLASS_OF(obj);
VALUE cl;
switch (TYPE(c)) {
case T_MODULE:
@ -205,10 +211,11 @@ obj_is_instance_of(obj, c)
TypeError("class or module required");
}
while (FL_TEST(class, FL_SINGLETON)) {
class = class->super;
cl = CLASS_OF(obj);
while (FL_TEST(cl, FL_SINGLETON)) {
cl = RCLASS(cl)->super;
}
if (c == (VALUE)class) return TRUE;
if (c == cl) return TRUE;
return FALSE;
}
@ -216,7 +223,7 @@ VALUE
obj_is_kind_of(obj, c)
VALUE obj, c;
{
struct RClass *class = (struct RClass*)CLASS_OF(obj);
VALUE cl = CLASS_OF(obj);
switch (TYPE(c)) {
case T_MODULE:
@ -239,28 +246,21 @@ obj_is_kind_of(obj, c)
TypeError("class or module required");
}
while (class) {
if ((VALUE)class == c || RCLASS(class)->m_tbl == RCLASS(c)->m_tbl)
while (cl) {
if (cl == c || RCLASS(cl)->m_tbl == RCLASS(c)->m_tbl)
return TRUE;
class = class->super;
cl = RCLASS(cl)->super;
}
return FALSE;
}
static VALUE
obj_initialize(obj)
obj_dummy(obj)
VALUE obj;
{
return Qnil;
}
static VALUE
obj_s_added(obj, id)
VALUE obj, id;
{
return Qnil;
}
static VALUE
nil_to_s(obj)
VALUE obj;
@ -268,6 +268,13 @@ nil_to_s(obj)
return str_new2("");
}
static VALUE
nil_to_a(obj)
VALUE obj;
{
return ary_new2(0);
}
static VALUE
nil_inspect(obj)
VALUE obj;
@ -279,7 +286,7 @@ static VALUE
nil_type(obj)
VALUE obj;
{
return str_new2("nil");
return cNilClass;
}
static VALUE
@ -311,28 +318,28 @@ static VALUE
true_to_s(obj)
VALUE obj;
{
return str_new2("TRUE");
return str_new2("true");
}
static VALUE
true_type(obj)
VALUE obj;
{
return str_new2("TRUE");
return cTrueClass;
}
static VALUE
false_to_s(obj)
VALUE obj;
{
return str_new2("FALSE");
return str_new2("false");
}
static VALUE
false_type(obj)
VALUE obj;
{
return str_new2("FALSE");
return cFalseClass;
}
static VALUE
@ -362,15 +369,15 @@ obj_alloc(class)
static VALUE
mod_clone(module)
struct RClass *module;
VALUE module;
{
NEWOBJ(clone, struct RClass);
OBJSETUP(clone, CLASS_OF(module), TYPE(module));
clone->super = module->super;
clone->super = RCLASS(module)->super;
clone->iv_tbl = 0;
clone->m_tbl = 0; /* avoid GC crashing */
clone->m_tbl = st_copy(module->m_tbl);
clone->m_tbl = st_copy(RCLASS(module)->m_tbl);
return (VALUE)clone;
}
@ -389,15 +396,89 @@ mod_eqq(mod, arg)
return obj_is_kind_of(arg, mod);
}
static VALUE
mod_le(mod, arg)
VALUE mod, arg;
{
switch (TYPE(arg)) {
case T_MODULE:
case T_CLASS:
break;
default:
TypeError("compared with non class/module");
}
while (mod) {
if (RCLASS(mod)->m_tbl == RCLASS(arg)->m_tbl)
return TRUE;
mod = RCLASS(mod)->super;
}
return FALSE;
}
static VALUE
mod_lt(mod, arg)
VALUE mod, arg;
{
if (mod == arg) return FALSE;
return mod_le(mod, arg);
}
static VALUE
mod_ge(mod, arg)
VALUE mod, arg;
{
switch (TYPE(arg)) {
case T_MODULE:
case T_CLASS:
break;
default:
TypeError("compared with non class/module");
}
return mod_lt(arg, mod);
}
static VALUE
mod_gt(mod, arg)
VALUE mod, arg;
{
if (mod == arg) return FALSE;
return mod_ge(mod, arg);
}
static VALUE
mod_cmp(mod, arg)
VALUE mod, arg;
{
if (mod == arg) return INT2FIX(0);
switch (TYPE(arg)) {
case T_MODULE:
case T_CLASS:
break;
default:
TypeError("<=> requires Class or Module (%s given)",
rb_class2name(CLASS_OF(arg)));
break;
}
if (mod_le(mod, arg)) {
return INT2FIX(-1);
}
return INT2FIX(1);
}
VALUE module_new();
VALUE class_new_instance();
static VALUE
class_s_new(argc, argv, class)
class_s_new(argc, argv)
int argc;
VALUE *argv;
{
VALUE super, cls;
VALUE super, klass;
rb_scan_args(argc, argv, "01", &super);
if (NIL_P(super)) super = cObject;
@ -405,26 +486,33 @@ class_s_new(argc, argv, class)
if (FL_TEST(super, FL_SINGLETON)) {
TypeError("can't make subclass of virtual class");
}
cls = class_new(super);
klass = class_new(super);
/* make metaclass */
RBASIC(cls)->class = singleton_class_new(RBASIC(super)->class);
RBASIC(klass)->class = singleton_class_new(RBASIC(super)->class);
singleton_class_attached(RBASIC(klass)->class, klass);
return cls;
return klass;
}
VALUE mod_name();
VALUE mod_included_modules();
VALUE mod_ancestors();
VALUE class_instance_methods();
VALUE class_private_instance_methods();
static VALUE
class_superclass(class)
struct RClass *class;
class_superclass(cl)
VALUE cl;
{
struct RClass *super = class->super;
VALUE super = RCLASS(cl)->super;
while (TYPE(super) == T_ICLASS) {
super = super->super;
super = RCLASS(super)->super;
}
if (!super) {
return Qnil;
}
return (VALUE)super;
return super;
}
ID
@ -447,10 +535,101 @@ mod_attr(argc, argv, class)
VALUE name, pub;
rb_scan_args(argc, argv, "11", &name, &pub);
rb_define_attr(class, rb_to_id(name), RTEST(pub));
rb_define_attr(class, rb_to_id(name), 1, RTEST(pub));
return Qnil;
}
static VALUE
mod_attr_reader(argc, argv, class)
int argc;
VALUE *argv;
VALUE class;
{
int i;
for (i=0; i<argc; i++) {
rb_define_attr(class, rb_to_id(argv[i]), 1, 0);
}
return Qnil;
}
static VALUE
mod_attr_writer(argc, argv, class)
int argc;
VALUE *argv;
VALUE class;
{
int i;
for (i=0; i<argc; i++) {
rb_define_attr(class, rb_to_id(argv[i]), 0, 1);
}
return Qnil;
}
static VALUE
mod_attr_accessor(argc, argv, class)
int argc;
VALUE *argv;
VALUE class;
{
int i;
for (i=0; i<argc; i++) {
rb_define_attr(class, rb_to_id(argv[i]), 1, 1);
}
return Qnil;
}
VALUE mod_constants();
static VALUE
mod_const_get(mod, name)
VALUE mod, name;
{
return rb_const_get_at(mod, rb_to_id(name));
}
static VALUE
mod_const_set(mod, name, value)
VALUE mod, name, value;
{
rb_const_set(mod, rb_to_id(name), value);
return value;
}
static VALUE
mod_const_defined(mod, name)
VALUE mod, name;
{
return rb_const_defined_at(mod, rb_to_id(name));
}
static VALUE
obj_methods(obj)
VALUE obj;
{
VALUE argv[1];
argv[0] = TRUE;
return class_instance_methods(1, argv, CLASS_OF(obj));
}
VALUE obj_singleton_methods();
static VALUE
obj_private_methods(obj)
VALUE obj;
{
VALUE argv[1];
argv[0] = TRUE;
return class_private_instance_methods(1, argv, CLASS_OF(obj));
}
VALUE obj_instance_variables();
VALUE obj_remove_instance_variable();
static VALUE
f_integer(obj, arg)
VALUE obj, arg;
@ -478,6 +657,13 @@ f_integer(obj, arg)
return INT2NUM(i);
}
VALUE
rb_Integer(val)
VALUE val;
{
return f_integer(Qnil, val);
}
static VALUE
to_flo(val)
VALUE val;
@ -494,12 +680,14 @@ fail_to_flo(val)
double big2dbl();
VALUE
static VALUE
f_float(obj, arg)
VALUE obj, arg;
{
switch (TYPE(arg)) {
case T_FIXNUM:
return float_new((double)FIX2INT(arg));
case T_FLOAT:
return arg;
@ -511,6 +699,21 @@ f_float(obj, arg)
}
}
VALUE
rb_Float(val)
VALUE val;
{
return f_float(Qnil, val);
}
double
num2dbl(val)
VALUE val;
{
VALUE v = rb_Float(val);
return RFLOAT(v)->value;
}
static VALUE
f_string(obj, arg)
VALUE obj, arg;
@ -518,11 +721,37 @@ f_string(obj, arg)
return rb_funcall(arg, rb_intern("to_s"), 0);
}
VALUE
rb_String(val)
VALUE val;
{
return f_string(Qnil, val);
}
static VALUE
f_array(obj, arg)
VALUE obj, arg;
{
return rb_funcall(arg, rb_intern("to_a"), 0);
if (TYPE(arg) == T_ARRAY) return arg;
arg = rb_funcall(arg, rb_intern("to_a"), 0);
if (TYPE(arg) != T_ARRAY) {
TypeError("`to_a' did not return Array");
}
return arg;
}
VALUE
rb_Array(val)
VALUE val;
{
return f_array(Qnil, val);
}
VALUE
rb_to_a(val) /* backward compatibility */
VALUE val;
{
return f_array(Qnil, val);
}
static VALUE
@ -531,7 +760,7 @@ boot_defclass(name, super)
VALUE super;
{
extern st_table *rb_class_tbl;
struct RClass *obj = (struct RClass*)class_new(super);
VALUE obj = class_new(super);
ID id = rb_intern(name);
rb_name_class(obj, id);
@ -551,30 +780,6 @@ rb_class_of(obj)
return RBASIC(obj)->class;
}
int
rb_type(obj)
VALUE obj;
{
if (FIXNUM_P(obj)) return T_FIXNUM;
if (obj == Qnil) return T_NIL;
if (obj == FALSE) return T_FALSE;
if (obj == TRUE) return T_TRUE;
return BUILTIN_TYPE(obj);
}
int
rb_special_const_p(obj)
VALUE obj;
{
if (FIXNUM_P(obj)) return TRUE;
if (obj == Qnil) return TRUE;
if (obj == FALSE) return TRUE;
if (obj == TRUE) return TRUE;
return FALSE;
}
VALUE TopSelf;
void
@ -587,11 +792,15 @@ Init_Object()
cClass = boot_defclass("Class", cModule);
metaclass = RBASIC(cObject)->class = singleton_class_new(cClass);
singleton_class_attached(metaclass, cObject);
metaclass = RBASIC(cModule)->class = singleton_class_new(metaclass);
singleton_class_attached(metaclass, cModule);
metaclass = RBASIC(cClass)->class = singleton_class_new(metaclass);
singleton_class_attached(metaclass, cClass);
mKernel = rb_define_module("Kernel");
rb_include_module(cObject, mKernel);
rb_define_private_method(cClass, "inherited", obj_dummy, 1);
/*
* Ruby's Class Hierarchy Chart
@ -621,6 +830,7 @@ Init_Object()
rb_define_method(mKernel, "==", obj_equal, 1);
rb_define_alias(mKernel, "equal?", "==");
rb_define_alias(mKernel, "===", "==");
rb_define_method(mKernel, "=~", rb_false, 1);
rb_define_method(mKernel, "eql?", obj_equal, 1);
@ -634,6 +844,11 @@ Init_Object()
rb_define_method(mKernel, "to_a", any_to_a, 0);
rb_define_method(mKernel, "to_s", any_to_s, 0);
rb_define_method(mKernel, "inspect", obj_inspect, 0);
rb_define_method(mKernel, "methods", obj_methods, 0);
rb_define_method(mKernel, "singleton_methods", obj_singleton_methods, 0);
rb_define_method(mKernel, "private_methods", obj_private_methods, 0);
rb_define_method(mKernel, "instance_variables", obj_instance_variables, 0);
rb_define_method(mKernel, "remove_instance_variable", obj_remove_instance_variable, 0);
rb_define_method(mKernel, "instance_of?", obj_is_instance_of, 1);
rb_define_method(mKernel, "kind_of?", obj_is_kind_of, 1);
@ -651,27 +866,53 @@ Init_Object()
cNilClass = rb_define_class("NilClass", cObject);
rb_define_method(cNilClass, "type", nil_type, 0);
rb_define_method(cNilClass, "to_s", nil_to_s, 0);
rb_define_method(cNilClass, "to_a", nil_to_a, 0);
rb_define_method(cNilClass, "inspect", nil_inspect, 0);
rb_define_method(cNilClass, "=~", rb_equal, 1);
rb_define_method(cNilClass, "nil?", rb_true, 0);
rb_undef_method(CLASS_OF(cNilClass), "new");
rb_define_global_const("NIL", Qnil);
/* default addition */
rb_define_method(cNilClass, "+", nil_plus, 1);
rb_define_global_function("initialize", obj_initialize, -1);
rb_define_global_function("singleton_method_added", obj_s_added, 1);
rb_define_global_function("initialize", obj_dummy, -1);
rb_define_global_function("singleton_method_added", obj_dummy, 1);
rb_define_method(cModule, "===", mod_eqq, 1);
rb_define_method(cModule, "<=>", mod_cmp, 1);
rb_define_method(cModule, "<", mod_lt, 1);
rb_define_method(cModule, "<=", mod_le, 1);
rb_define_method(cModule, ">", mod_gt, 1);
rb_define_method(cModule, ">=", mod_ge, 1);
rb_define_method(cModule, "clone", mod_clone, 0);
rb_define_method(cModule, "to_s", mod_to_s, 0);
rb_define_method(cModule, "included_modules", mod_included_modules, 0);
rb_define_method(cModule, "name", mod_name, 0);
rb_define_method(cModule, "ancestors", mod_ancestors, 0);
rb_define_private_method(cModule, "attr", mod_attr, -1);
rb_define_private_method(cModule, "attr_reader", mod_attr_reader, -1);
rb_define_private_method(cModule, "attr_writer", mod_attr_writer, -1);
rb_define_private_method(cModule, "attr_accessor", mod_attr_accessor, -1);
rb_define_singleton_method(cModule, "new", module_new, 0);
rb_define_method(cModule, "instance_methods", class_instance_methods, -1);
rb_define_method(cModule, "private_instance_methods", class_private_instance_methods, -1);
rb_define_method(cModule, "constants", mod_constants, 0);
rb_define_method(cModule, "const_get", mod_const_get, 1);
rb_define_method(cModule, "const_set", mod_const_set, 2);
rb_define_method(cModule, "const_defined?", mod_const_defined, 1);
rb_define_private_method(cModule, "method_added", obj_dummy, 1);
rb_define_method(cClass, "new", class_new_instance, -1);
rb_define_method(cClass, "superclass", class_superclass, 0);
rb_define_singleton_method(cClass, "new", class_s_new, -1);
rb_undef_method(cClass, "extend_object");
rb_undef_method(cClass, "append_features");
rb_define_singleton_method(cClass, "new", class_s_new, -1);
cData = rb_define_class("Data", cObject);