00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #include "ruby/ruby.h"
00015 #include "ruby/st.h"
00016 #include "ruby/util.h"
00017 #include "ruby/encoding.h"
00018 #include <stdio.h>
00019 #include <errno.h>
00020 #include <ctype.h>
00021 #include <math.h>
00022 #include <float.h>
00023 #include "constant.h"
00024 #include "internal.h"
00025 #include "id.h"
00026 #include "probes.h"
00027
00028 VALUE rb_cBasicObject;
00029 VALUE rb_mKernel;
00030 VALUE rb_cObject;
00031 VALUE rb_cModule;
00032 VALUE rb_cClass;
00033 VALUE rb_cData;
00034
00035 VALUE rb_cNilClass;
00036 VALUE rb_cTrueClass;
00037 VALUE rb_cFalseClass;
00038
00039 #define id_eq idEq
00040 #define id_eql idEqlP
00041 #define id_match idEqTilde
00042 #define id_inspect idInspect
00043 #define id_init_copy idInitialize_copy
00044 #define id_init_clone idInitialize_clone
00045 #define id_init_dup idInitialize_dup
00046 #define id_const_missing idConst_missing
00047
00048 #define CLASS_OR_MODULE_P(obj) \
00049 (!SPECIAL_CONST_P(obj) && \
00050 (BUILTIN_TYPE(obj) == T_CLASS || BUILTIN_TYPE(obj) == T_MODULE))
00051
00052 VALUE
00053 rb_obj_hide(VALUE obj)
00054 {
00055 if (!SPECIAL_CONST_P(obj)) {
00056 RBASIC_CLEAR_CLASS(obj);
00057 }
00058 return obj;
00059 }
00060
00061 VALUE
00062 rb_obj_reveal(VALUE obj, VALUE klass)
00063 {
00064 if (!SPECIAL_CONST_P(obj)) {
00065 RBASIC_SET_CLASS(obj, klass);
00066 }
00067 return obj;
00068 }
00069
00070 VALUE
00071 rb_obj_setup(VALUE obj, VALUE klass, VALUE type)
00072 {
00073 RBASIC(obj)->flags = type;
00074 RBASIC_SET_CLASS(obj, klass);
00075 if (rb_safe_level() >= 3) FL_SET((obj), FL_TAINT);
00076 return obj;
00077 }
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088 VALUE
00089 rb_equal(VALUE obj1, VALUE obj2)
00090 {
00091 VALUE result;
00092
00093 if (obj1 == obj2) return Qtrue;
00094 result = rb_funcall(obj1, id_eq, 1, obj2);
00095 if (RTEST(result)) return Qtrue;
00096 return Qfalse;
00097 }
00098
00099 int
00100 rb_eql(VALUE obj1, VALUE obj2)
00101 {
00102 return RTEST(rb_funcall(obj1, id_eql, 1, obj2));
00103 }
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141 VALUE
00142 rb_obj_equal(VALUE obj1, VALUE obj2)
00143 {
00144 if (obj1 == obj2) return Qtrue;
00145 return Qfalse;
00146 }
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161 VALUE
00162 rb_obj_hash(VALUE obj)
00163 {
00164 long rb_objid_hash(st_index_t index);
00165 VALUE oid = rb_obj_id(obj);
00166 #if SIZEOF_LONG == SIZEOF_VOIDP
00167 st_index_t index = NUM2LONG(oid);
00168 #elif SIZEOF_LONG_LONG == SIZEOF_VOIDP
00169 st_index_t index = NUM2LL(oid);
00170 #else
00171 # error not supported
00172 #endif
00173 return LONG2FIX(rb_objid_hash(index));
00174 }
00175
00176
00177
00178
00179
00180
00181
00182
00183 VALUE
00184 rb_obj_not(VALUE obj)
00185 {
00186 return RTEST(obj) ? Qfalse : Qtrue;
00187 }
00188
00189
00190
00191
00192
00193
00194
00195
00196 VALUE
00197 rb_obj_not_equal(VALUE obj1, VALUE obj2)
00198 {
00199 VALUE result = rb_funcall(obj1, id_eq, 1, obj2);
00200 return RTEST(result) ? Qfalse : Qtrue;
00201 }
00202
00203 VALUE
00204 rb_class_real(VALUE cl)
00205 {
00206 while (cl &&
00207 ((RBASIC(cl)->flags & FL_SINGLETON) || BUILTIN_TYPE(cl) == T_ICLASS)) {
00208 cl = RCLASS_SUPER(cl);
00209 }
00210 return cl;
00211 }
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225 VALUE
00226 rb_obj_class(VALUE obj)
00227 {
00228 return rb_class_real(CLASS_OF(obj));
00229 }
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248 static VALUE
00249 rb_obj_singleton_class(VALUE obj)
00250 {
00251 return rb_singleton_class(obj);
00252 }
00253
00254 void
00255 rb_obj_copy_ivar(VALUE dest, VALUE obj)
00256 {
00257 if (!(RBASIC(dest)->flags & ROBJECT_EMBED) && ROBJECT_IVPTR(dest)) {
00258 xfree(ROBJECT_IVPTR(dest));
00259 ROBJECT(dest)->as.heap.ivptr = 0;
00260 ROBJECT(dest)->as.heap.numiv = 0;
00261 ROBJECT(dest)->as.heap.iv_index_tbl = 0;
00262 }
00263 if (RBASIC(obj)->flags & ROBJECT_EMBED) {
00264 MEMCPY(ROBJECT(dest)->as.ary, ROBJECT(obj)->as.ary, VALUE, ROBJECT_EMBED_LEN_MAX);
00265 RBASIC(dest)->flags |= ROBJECT_EMBED;
00266 }
00267 else {
00268 long len = ROBJECT(obj)->as.heap.numiv;
00269 VALUE *ptr = 0;
00270 if (len > 0) {
00271 ptr = ALLOC_N(VALUE, len);
00272 MEMCPY(ptr, ROBJECT(obj)->as.heap.ivptr, VALUE, len);
00273 }
00274 ROBJECT(dest)->as.heap.ivptr = ptr;
00275 ROBJECT(dest)->as.heap.numiv = len;
00276 ROBJECT(dest)->as.heap.iv_index_tbl = ROBJECT(obj)->as.heap.iv_index_tbl;
00277 RBASIC(dest)->flags &= ~ROBJECT_EMBED;
00278 }
00279 }
00280
00281 static void
00282 init_copy(VALUE dest, VALUE obj)
00283 {
00284 if (OBJ_FROZEN(dest)) {
00285 rb_raise(rb_eTypeError, "[bug] frozen object (%s) allocated", rb_obj_classname(dest));
00286 }
00287 RBASIC(dest)->flags &= ~(T_MASK|FL_EXIVAR);
00288 RBASIC(dest)->flags |= RBASIC(obj)->flags & (T_MASK|FL_EXIVAR|FL_TAINT);
00289 rb_copy_generic_ivar(dest, obj);
00290 rb_gc_copy_finalizer(dest, obj);
00291 switch (TYPE(obj)) {
00292 case T_OBJECT:
00293 rb_obj_copy_ivar(dest, obj);
00294 break;
00295 case T_CLASS:
00296 case T_MODULE:
00297 if (RCLASS_IV_TBL(dest)) {
00298 st_free_table(RCLASS_IV_TBL(dest));
00299 RCLASS_IV_TBL(dest) = 0;
00300 }
00301 if (RCLASS_CONST_TBL(dest)) {
00302 rb_free_const_table(RCLASS_CONST_TBL(dest));
00303 RCLASS_CONST_TBL(dest) = 0;
00304 }
00305 if (RCLASS_IV_TBL(obj)) {
00306 RCLASS_IV_TBL(dest) = rb_st_copy(dest, RCLASS_IV_TBL(obj));
00307 }
00308 break;
00309 }
00310 }
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336 VALUE
00337 rb_obj_clone(VALUE obj)
00338 {
00339 VALUE clone;
00340 VALUE singleton;
00341
00342 if (rb_special_const_p(obj)) {
00343 rb_raise(rb_eTypeError, "can't clone %s", rb_obj_classname(obj));
00344 }
00345 clone = rb_obj_alloc(rb_obj_class(obj));
00346 RBASIC(clone)->flags &= (FL_TAINT|FL_PROMOTED|FL_WB_PROTECTED);
00347 RBASIC(clone)->flags |= RBASIC(obj)->flags & ~(FL_PROMOTED|FL_FREEZE|FL_FINALIZE|FL_WB_PROTECTED);
00348
00349 singleton = rb_singleton_class_clone_and_attach(obj, clone);
00350 RBASIC_SET_CLASS(clone, singleton);
00351 if (FL_TEST(singleton, FL_SINGLETON)) {
00352 rb_singleton_class_attached(singleton, clone);
00353 }
00354
00355 init_copy(clone, obj);
00356 rb_funcall(clone, id_init_clone, 1, obj);
00357 RBASIC(clone)->flags |= RBASIC(obj)->flags & FL_FREEZE;
00358
00359 return clone;
00360 }
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376
00377
00378
00379
00380
00381
00382
00383
00384
00385
00386
00387
00388
00389
00390
00391
00392
00393
00394
00395
00396
00397
00398
00399
00400
00401
00402
00403
00404
00405 VALUE
00406 rb_obj_dup(VALUE obj)
00407 {
00408 VALUE dup;
00409
00410 if (rb_special_const_p(obj)) {
00411 rb_raise(rb_eTypeError, "can't dup %s", rb_obj_classname(obj));
00412 }
00413 dup = rb_obj_alloc(rb_obj_class(obj));
00414 init_copy(dup, obj);
00415 rb_funcall(dup, id_init_dup, 1, obj);
00416
00417 return dup;
00418 }
00419
00420
00421 VALUE
00422 rb_obj_init_copy(VALUE obj, VALUE orig)
00423 {
00424 if (obj == orig) return obj;
00425 rb_check_frozen(obj);
00426 rb_check_trusted(obj);
00427 if (TYPE(obj) != TYPE(orig) || rb_obj_class(obj) != rb_obj_class(orig)) {
00428 rb_raise(rb_eTypeError, "initialize_copy should take same class object");
00429 }
00430 return obj;
00431 }
00432
00433
00434 VALUE
00435 rb_obj_init_dup_clone(VALUE obj, VALUE orig)
00436 {
00437 rb_funcall(obj, id_init_copy, 1, orig);
00438 return obj;
00439 }
00440
00441
00442
00443
00444
00445
00446
00447
00448
00449
00450
00451 VALUE
00452 rb_any_to_s(VALUE obj)
00453 {
00454 VALUE str;
00455 VALUE cname = rb_class_name(CLASS_OF(obj));
00456
00457 str = rb_sprintf("#<%"PRIsVALUE":%p>", cname, (void*)obj);
00458 OBJ_INFECT(str, obj);
00459
00460 return str;
00461 }
00462
00463
00464
00465
00466
00467
00468
00469 VALUE
00470 rb_inspect(VALUE obj)
00471 {
00472 VALUE str = rb_obj_as_string(rb_funcall(obj, id_inspect, 0, 0));
00473 rb_encoding *ext = rb_default_external_encoding();
00474 if (!rb_enc_asciicompat(ext)) {
00475 if (!rb_enc_str_asciionly_p(str))
00476 rb_raise(rb_eEncCompatError, "inspected result must be ASCII only if default external encoding is ASCII incompatible");
00477 return str;
00478 }
00479 if (rb_enc_get(str) != ext && !rb_enc_str_asciionly_p(str))
00480 rb_raise(rb_eEncCompatError, "inspected result must be ASCII only or use the default external encoding");
00481 return str;
00482 }
00483
00484 static int
00485 inspect_i(st_data_t k, st_data_t v, st_data_t a)
00486 {
00487 ID id = (ID)k;
00488 VALUE value = (VALUE)v;
00489 VALUE str = (VALUE)a;
00490 VALUE str2;
00491 const char *ivname;
00492
00493
00494 if (CLASS_OF(value) == 0) return ST_CONTINUE;
00495 if (!rb_is_instance_id(id)) return ST_CONTINUE;
00496 if (RSTRING_PTR(str)[0] == '-') {
00497 RSTRING_PTR(str)[0] = '#';
00498 rb_str_cat2(str, " ");
00499 }
00500 else {
00501 rb_str_cat2(str, ", ");
00502 }
00503 ivname = rb_id2name(id);
00504 rb_str_cat2(str, ivname);
00505 rb_str_cat2(str, "=");
00506 str2 = rb_inspect(value);
00507 rb_str_append(str, str2);
00508 OBJ_INFECT(str, str2);
00509
00510 return ST_CONTINUE;
00511 }
00512
00513 static VALUE
00514 inspect_obj(VALUE obj, VALUE str, int recur)
00515 {
00516 if (recur) {
00517 rb_str_cat2(str, " ...");
00518 }
00519 else {
00520 rb_ivar_foreach(obj, inspect_i, str);
00521 }
00522 rb_str_cat2(str, ">");
00523 RSTRING_PTR(str)[0] = '#';
00524 OBJ_INFECT(str, obj);
00525
00526 return str;
00527 }
00528
00529
00530
00531
00532
00533
00534
00535
00536
00537
00538
00539
00540
00541
00542
00543
00544
00545
00546
00547
00548
00549
00550
00551
00552
00553
00554
00555
00556
00557
00558
00559
00560
00561
00562
00563 static VALUE
00564 rb_obj_inspect(VALUE obj)
00565 {
00566 if (rb_ivar_count(obj) > 0) {
00567 VALUE str;
00568 VALUE c = rb_class_name(CLASS_OF(obj));
00569
00570 str = rb_sprintf("-<%"PRIsVALUE":%p", c, (void*)obj);
00571 return rb_exec_recursive(inspect_obj, obj, str);
00572 }
00573 else {
00574 return rb_any_to_s(obj);
00575 }
00576 }
00577
00578 static VALUE
00579 class_or_module_required(VALUE c)
00580 {
00581 if (SPECIAL_CONST_P(c)) goto not_class;
00582 switch (BUILTIN_TYPE(c)) {
00583 case T_MODULE:
00584 case T_CLASS:
00585 case T_ICLASS:
00586 break;
00587
00588 default:
00589 not_class:
00590 rb_raise(rb_eTypeError, "class or module required");
00591 }
00592 return c;
00593 }
00594
00595 static VALUE class_search_ancestor(VALUE cl, VALUE c);
00596
00597
00598
00599
00600
00601
00602
00603
00604
00605
00606
00607
00608
00609
00610
00611
00612
00613
00614 VALUE
00615 rb_obj_is_instance_of(VALUE obj, VALUE c)
00616 {
00617 c = class_or_module_required(c);
00618 if (rb_obj_class(obj) == c) return Qtrue;
00619 return Qfalse;
00620 }
00621
00622
00623
00624
00625
00626
00627
00628
00629
00630
00631
00632
00633
00634
00635
00636
00637
00638
00639
00640
00641
00642
00643
00644
00645
00646
00647
00648
00649
00650
00651 VALUE
00652 rb_obj_is_kind_of(VALUE obj, VALUE c)
00653 {
00654 VALUE cl = CLASS_OF(obj);
00655
00656 c = class_or_module_required(c);
00657 return class_search_ancestor(cl, RCLASS_ORIGIN(c)) ? Qtrue : Qfalse;
00658 }
00659
00660 static VALUE
00661 class_search_ancestor(VALUE cl, VALUE c)
00662 {
00663 while (cl) {
00664 if (cl == c || RCLASS_M_TBL_WRAPPER(cl) == RCLASS_M_TBL_WRAPPER(c))
00665 return cl;
00666 cl = RCLASS_SUPER(cl);
00667 }
00668 return 0;
00669 }
00670
00671 VALUE
00672 rb_class_search_ancestor(VALUE cl, VALUE c)
00673 {
00674 cl = class_or_module_required(cl);
00675 c = class_or_module_required(c);
00676 return class_search_ancestor(cl, RCLASS_ORIGIN(c));
00677 }
00678
00679
00680
00681
00682
00683
00684
00685
00686
00687
00688
00689
00690
00691
00692
00693
00694 VALUE
00695 rb_obj_tap(VALUE obj)
00696 {
00697 rb_yield(obj);
00698 return obj;
00699 }
00700
00701
00702
00703
00704
00705
00706
00707
00708
00709
00710
00711
00712
00713
00714
00715
00716
00717
00718
00719
00720
00721
00722
00723
00724
00725
00726
00727
00728
00729
00730
00731
00732
00733
00734
00735
00736
00737
00738
00739
00740
00741
00742
00743
00744
00745
00746
00747
00748
00749
00750
00751
00752
00753
00754
00755
00756
00757
00758
00759
00760
00761
00762
00763
00764
00765
00766
00767
00768
00769
00770
00771
00772
00773
00774
00775
00776
00777
00778
00779
00780
00781
00782
00783
00784
00785
00786
00787
00788
00789
00790
00791
00792
00793
00794
00795
00796
00797
00798
00799
00800
00801
00802
00803
00804
00805
00806
00807
00808
00809
00810
00811
00812
00813
00814
00815
00816
00817
00818
00819
00820
00821
00822
00823
00824
00825
00826
00827
00828
00829
00830
00831
00832
00833
00834
00835
00836
00837
00838
00839
00840
00841
00842
00843
00844
00845
00846
00847
00848
00849
00850
00851
00852
00853
00854
00855
00856
00857
00858
00859
00860
00861
00862
00863
00864
00865
00866
00867
00868
00869
00870
00871
00872
00873
00874
00875
00876
00877
00878
00879
00880
00881
00882
00883
00884
00885
00886
00887
00888
00889
00890
00891
00892
00893
00894
00895
00896
00897
00898
00899
00900
00901
00902
00903
00904
00905
00906
00907
00908
00909
00910
00911
00912
00913
00914
00915
00916
00917
00918
00919
00920
00921
00922
00923
00924
00925
00926
00927
00928
00929 static VALUE
00930 rb_obj_dummy(void)
00931 {
00932 return Qnil;
00933 }
00934
00935
00936
00937
00938
00939
00940
00941
00942
00943
00944 VALUE
00945 rb_obj_tainted(VALUE obj)
00946 {
00947 if (OBJ_TAINTED(obj))
00948 return Qtrue;
00949 return Qfalse;
00950 }
00951
00952
00953
00954
00955
00956
00957
00958
00959
00960
00961
00962
00963
00964
00965
00966
00967
00968
00969
00970
00971
00972 VALUE
00973 rb_obj_taint(VALUE obj)
00974 {
00975 if (!OBJ_TAINTED(obj)) {
00976 rb_check_frozen(obj);
00977 OBJ_TAINT(obj);
00978 }
00979 return obj;
00980 }
00981
00982
00983
00984
00985
00986
00987
00988
00989
00990
00991
00992 VALUE
00993 rb_obj_untaint(VALUE obj)
00994 {
00995 rb_secure(3);
00996 if (OBJ_TAINTED(obj)) {
00997 rb_check_frozen(obj);
00998 FL_UNSET(obj, FL_TAINT);
00999 }
01000 return obj;
01001 }
01002
01003
01004
01005
01006
01007
01008
01009
01010 VALUE
01011 rb_obj_untrusted(VALUE obj)
01012 {
01013 rb_warning("untrusted? is deprecated and its behavior is same as tainted?");
01014 return rb_obj_tainted(obj);
01015 }
01016
01017
01018
01019
01020
01021
01022
01023
01024 VALUE
01025 rb_obj_untrust(VALUE obj)
01026 {
01027 rb_warning("untrust is deprecated and its behavior is same as taint");
01028 return rb_obj_taint(obj);
01029 }
01030
01031
01032
01033
01034
01035
01036
01037
01038
01039 VALUE
01040 rb_obj_trust(VALUE obj)
01041 {
01042 rb_warning("trust is deprecated and its behavior is same as untaint");
01043 return rb_obj_untaint(obj);
01044 }
01045
01046 void
01047 rb_obj_infect(VALUE obj1, VALUE obj2)
01048 {
01049 OBJ_INFECT(obj1, obj2);
01050 }
01051
01052 static st_table *immediate_frozen_tbl = 0;
01053
01054
01055
01056
01057
01058
01059
01060
01061
01062
01063
01064
01065
01066
01067
01068
01069
01070
01071
01072
01073
01074
01075 VALUE
01076 rb_obj_freeze(VALUE obj)
01077 {
01078 if (!OBJ_FROZEN(obj)) {
01079 OBJ_FREEZE(obj);
01080 if (SPECIAL_CONST_P(obj)) {
01081 if (!immediate_frozen_tbl) {
01082 immediate_frozen_tbl = st_init_numtable();
01083 }
01084 st_insert(immediate_frozen_tbl, obj, (st_data_t)Qtrue);
01085 }
01086 }
01087 return obj;
01088 }
01089
01090
01091
01092
01093
01094
01095
01096
01097
01098
01099
01100
01101 VALUE
01102 rb_obj_frozen_p(VALUE obj)
01103 {
01104 if (OBJ_FROZEN(obj)) return Qtrue;
01105 if (SPECIAL_CONST_P(obj)) {
01106 if (!immediate_frozen_tbl) return Qfalse;
01107 if (st_lookup(immediate_frozen_tbl, obj, 0)) return Qtrue;
01108 }
01109 return Qfalse;
01110 }
01111
01112
01113
01114
01115
01116
01117
01118
01119
01120
01121
01122
01123
01124
01125
01126
01127
01128
01129 static VALUE
01130 nil_to_i(VALUE obj)
01131 {
01132 return INT2FIX(0);
01133 }
01134
01135
01136
01137
01138
01139
01140
01141
01142
01143
01144 static VALUE
01145 nil_to_f(VALUE obj)
01146 {
01147 return DBL2NUM(0.0);
01148 }
01149
01150
01151
01152
01153
01154
01155
01156
01157 static VALUE
01158 nil_to_s(VALUE obj)
01159 {
01160 return rb_usascii_str_new(0, 0);
01161 }
01162
01163
01164
01165
01166
01167
01168
01169
01170
01171
01172
01173
01174 static VALUE
01175 nil_to_a(VALUE obj)
01176 {
01177 return rb_ary_new2(0);
01178 }
01179
01180
01181
01182
01183
01184
01185
01186
01187
01188
01189
01190
01191 static VALUE
01192 nil_to_h(VALUE obj)
01193 {
01194 return rb_hash_new();
01195 }
01196
01197
01198
01199
01200
01201
01202
01203
01204 static VALUE
01205 nil_inspect(VALUE obj)
01206 {
01207 return rb_usascii_str_new2("nil");
01208 }
01209
01210
01211
01212
01213
01214
01215
01216
01217
01218
01219
01220
01221
01222
01223
01224
01225
01226
01227 static VALUE
01228 true_to_s(VALUE obj)
01229 {
01230 return rb_usascii_str_new2("true");
01231 }
01232
01233
01234
01235
01236
01237
01238
01239
01240
01241
01242 static VALUE
01243 true_and(VALUE obj, VALUE obj2)
01244 {
01245 return RTEST(obj2)?Qtrue:Qfalse;
01246 }
01247
01248
01249
01250
01251
01252
01253
01254
01255
01256
01257
01258
01259
01260
01261
01262
01263
01264 static VALUE
01265 true_or(VALUE obj, VALUE obj2)
01266 {
01267 return Qtrue;
01268 }
01269
01270
01271
01272
01273
01274
01275
01276
01277
01278
01279
01280 static VALUE
01281 true_xor(VALUE obj, VALUE obj2)
01282 {
01283 return RTEST(obj2)?Qfalse:Qtrue;
01284 }
01285
01286
01287
01288
01289
01290
01291
01292
01293
01294
01295
01296
01297
01298
01299
01300
01301
01302
01303
01304 static VALUE
01305 false_to_s(VALUE obj)
01306 {
01307 return rb_usascii_str_new2("false");
01308 }
01309
01310
01311
01312
01313
01314
01315
01316
01317
01318
01319
01320 static VALUE
01321 false_and(VALUE obj, VALUE obj2)
01322 {
01323 return Qfalse;
01324 }
01325
01326
01327
01328
01329
01330
01331
01332
01333
01334
01335
01336 static VALUE
01337 false_or(VALUE obj, VALUE obj2)
01338 {
01339 return RTEST(obj2)?Qtrue:Qfalse;
01340 }
01341
01342
01343
01344
01345
01346
01347
01348
01349
01350
01351
01352
01353
01354
01355 static VALUE
01356 false_xor(VALUE obj, VALUE obj2)
01357 {
01358 return RTEST(obj2)?Qtrue:Qfalse;
01359 }
01360
01361
01362
01363
01364
01365
01366
01367
01368 static VALUE
01369 rb_true(VALUE obj)
01370 {
01371 return Qtrue;
01372 }
01373
01374
01375
01376
01377
01378
01379
01380
01381
01382
01383 static VALUE
01384 rb_false(VALUE obj)
01385 {
01386 return Qfalse;
01387 }
01388
01389
01390
01391
01392
01393
01394
01395
01396
01397
01398
01399 static VALUE
01400 rb_obj_match(VALUE obj1, VALUE obj2)
01401 {
01402 return Qnil;
01403 }
01404
01405
01406
01407
01408
01409
01410
01411
01412
01413 static VALUE
01414 rb_obj_not_match(VALUE obj1, VALUE obj2)
01415 {
01416 VALUE result = rb_funcall(obj1, id_match, 1, obj2);
01417 return RTEST(result) ? Qfalse : Qtrue;
01418 }
01419
01420
01421
01422
01423
01424
01425
01426
01427
01428
01429
01430
01431
01432
01433
01434
01435
01436
01437
01438
01439 static VALUE
01440 rb_obj_cmp(VALUE obj1, VALUE obj2)
01441 {
01442 if (obj1 == obj2 || rb_equal(obj1, obj2))
01443 return INT2FIX(0);
01444 return Qnil;
01445 }
01446
01447
01448
01449
01450
01451
01452
01453
01454
01455
01456
01457
01458
01459
01460
01461
01462
01463
01464
01465
01466
01467
01468
01469
01470
01471
01472
01473
01474
01475
01476
01477
01478
01479
01480
01481
01482
01483
01484 static VALUE
01485 rb_mod_to_s(VALUE klass)
01486 {
01487 ID id_defined_at;
01488 VALUE refined_class, defined_at;
01489
01490 if (FL_TEST(klass, FL_SINGLETON)) {
01491 VALUE s = rb_usascii_str_new2("#<Class:");
01492 VALUE v = rb_ivar_get(klass, id__attached__);
01493
01494 if (CLASS_OR_MODULE_P(v)) {
01495 rb_str_append(s, rb_inspect(v));
01496 }
01497 else {
01498 rb_str_append(s, rb_any_to_s(v));
01499 }
01500 rb_str_cat2(s, ">");
01501
01502 return s;
01503 }
01504 refined_class = rb_refinement_module_get_refined_class(klass);
01505 if (!NIL_P(refined_class)) {
01506 VALUE s = rb_usascii_str_new2("#<refinement:");
01507
01508 rb_str_concat(s, rb_inspect(refined_class));
01509 rb_str_cat2(s, "@");
01510 CONST_ID(id_defined_at, "__defined_at__");
01511 defined_at = rb_attr_get(klass, id_defined_at);
01512 rb_str_concat(s, rb_inspect(defined_at));
01513 rb_str_cat2(s, ">");
01514 return s;
01515 }
01516 return rb_str_dup(rb_class_name(klass));
01517 }
01518
01519
01520
01521
01522
01523
01524
01525
01526
01527
01528 static VALUE
01529 rb_mod_freeze(VALUE mod)
01530 {
01531 rb_class_name(mod);
01532 return rb_obj_freeze(mod);
01533 }
01534
01535
01536
01537
01538
01539
01540
01541
01542
01543
01544
01545 static VALUE
01546 rb_mod_eqq(VALUE mod, VALUE arg)
01547 {
01548 return rb_obj_is_kind_of(arg, mod);
01549 }
01550
01551
01552
01553
01554
01555
01556
01557
01558
01559
01560
01561
01562
01563 VALUE
01564 rb_class_inherited_p(VALUE mod, VALUE arg)
01565 {
01566 VALUE start = mod;
01567
01568 if (mod == arg) return Qtrue;
01569 if (!CLASS_OR_MODULE_P(arg) && !RB_TYPE_P(arg, T_ICLASS)) {
01570 rb_raise(rb_eTypeError, "compared with non class/module");
01571 }
01572 arg = RCLASS_ORIGIN(arg);
01573 if (class_search_ancestor(mod, arg)) {
01574 return Qtrue;
01575 }
01576
01577 if (class_search_ancestor(arg, start)) {
01578 return Qfalse;
01579 }
01580 return Qnil;
01581 }
01582
01583
01584
01585
01586
01587
01588
01589
01590
01591
01592
01593
01594 static VALUE
01595 rb_mod_lt(VALUE mod, VALUE arg)
01596 {
01597 if (mod == arg) return Qfalse;
01598 return rb_class_inherited_p(mod, arg);
01599 }
01600
01601
01602
01603
01604
01605
01606
01607
01608
01609
01610
01611
01612
01613
01614 static VALUE
01615 rb_mod_ge(VALUE mod, VALUE arg)
01616 {
01617 if (!CLASS_OR_MODULE_P(arg)) {
01618 rb_raise(rb_eTypeError, "compared with non class/module");
01619 }
01620
01621 return rb_class_inherited_p(arg, mod);
01622 }
01623
01624
01625
01626
01627
01628
01629
01630
01631
01632
01633
01634
01635 static VALUE
01636 rb_mod_gt(VALUE mod, VALUE arg)
01637 {
01638 if (mod == arg) return Qfalse;
01639 return rb_mod_ge(mod, arg);
01640 }
01641
01642
01643
01644
01645
01646
01647
01648
01649
01650
01651
01652
01653
01654 static VALUE
01655 rb_mod_cmp(VALUE mod, VALUE arg)
01656 {
01657 VALUE cmp;
01658
01659 if (mod == arg) return INT2FIX(0);
01660 if (!CLASS_OR_MODULE_P(arg)) {
01661 return Qnil;
01662 }
01663
01664 cmp = rb_class_inherited_p(mod, arg);
01665 if (NIL_P(cmp)) return Qnil;
01666 if (cmp) {
01667 return INT2FIX(-1);
01668 }
01669 return INT2FIX(1);
01670 }
01671
01672 static VALUE
01673 rb_module_s_alloc(VALUE klass)
01674 {
01675 VALUE mod = rb_module_new();
01676
01677 RBASIC_SET_CLASS(mod, klass);
01678 return mod;
01679 }
01680
01681 static VALUE
01682 rb_class_s_alloc(VALUE klass)
01683 {
01684 return rb_class_boot(0);
01685 }
01686
01687
01688
01689
01690
01691
01692
01693
01694
01695
01696
01697
01698
01699
01700
01701
01702
01703
01704
01705
01706
01707
01708
01709
01710
01711
01712
01713 static VALUE
01714 rb_mod_initialize(VALUE module)
01715 {
01716 if (rb_block_given_p()) {
01717 rb_mod_module_exec(1, &module, module);
01718 }
01719 return Qnil;
01720 }
01721
01722
01723
01724
01725
01726
01727
01728
01729
01730
01731
01732
01733
01734
01735
01736
01737
01738
01739
01740
01741
01742
01743
01744
01745
01746
01747
01748
01749
01750
01751
01752 static VALUE
01753 rb_class_initialize(int argc, VALUE *argv, VALUE klass)
01754 {
01755 VALUE super;
01756
01757 if (RCLASS_SUPER(klass) != 0 || klass == rb_cBasicObject) {
01758 rb_raise(rb_eTypeError, "already initialized class");
01759 }
01760 if (argc == 0) {
01761 super = rb_cObject;
01762 }
01763 else {
01764 rb_scan_args(argc, argv, "01", &super);
01765 rb_check_inheritable(super);
01766 if (super != rb_cBasicObject && !RCLASS_SUPER(super)) {
01767 rb_raise(rb_eTypeError, "can't inherit uninitialized class");
01768 }
01769 }
01770 RCLASS_SET_SUPER(klass, super);
01771 rb_make_metaclass(klass, RBASIC(super)->klass);
01772 rb_class_inherited(super, klass);
01773 rb_mod_initialize(klass);
01774
01775 return klass;
01776 }
01777
01778
01779
01780
01781
01782
01783
01784
01785
01786
01787
01788
01789
01790
01791
01792
01793
01794
01795
01796
01797
01798
01799
01800 VALUE
01801 rb_obj_alloc(VALUE klass)
01802 {
01803 VALUE obj;
01804 rb_alloc_func_t allocator;
01805
01806 if (RCLASS_SUPER(klass) == 0 && klass != rb_cBasicObject) {
01807 rb_raise(rb_eTypeError, "can't instantiate uninitialized class");
01808 }
01809 if (FL_TEST(klass, FL_SINGLETON)) {
01810 rb_raise(rb_eTypeError, "can't create instance of singleton class");
01811 }
01812 allocator = rb_get_alloc_func(klass);
01813 if (!allocator) {
01814 rb_raise(rb_eTypeError, "allocator undefined for %"PRIsVALUE,
01815 klass);
01816 }
01817
01818 #if !defined(DTRACE_PROBES_DISABLED) || !DTRACE_PROBES_DISABLED
01819 if (RUBY_DTRACE_OBJECT_CREATE_ENABLED()) {
01820 const char * file = rb_sourcefile();
01821 RUBY_DTRACE_OBJECT_CREATE(rb_class2name(klass),
01822 file ? file : "",
01823 rb_sourceline());
01824 }
01825 #endif
01826
01827 obj = (*allocator)(klass);
01828
01829 if (rb_obj_class(obj) != rb_class_real(klass)) {
01830 rb_raise(rb_eTypeError, "wrong instance allocation");
01831 }
01832 return obj;
01833 }
01834
01835 static VALUE
01836 rb_class_allocate_instance(VALUE klass)
01837 {
01838 NEWOBJ_OF(obj, struct RObject, klass, T_OBJECT | (RGENGC_WB_PROTECTED_OBJECT ? FL_WB_PROTECTED : 0));
01839 return (VALUE)obj;
01840 }
01841
01842
01843
01844
01845
01846
01847
01848
01849
01850
01851
01852
01853
01854 VALUE
01855 rb_class_new_instance(int argc, VALUE *argv, VALUE klass)
01856 {
01857 VALUE obj;
01858
01859 obj = rb_obj_alloc(klass);
01860 rb_obj_call_init(obj, argc, argv);
01861
01862 return obj;
01863 }
01864
01865
01866
01867
01868
01869
01870
01871
01872
01873
01874
01875
01876
01877
01878
01879
01880
01881
01882
01883
01884 VALUE
01885 rb_class_superclass(VALUE klass)
01886 {
01887 VALUE super = RCLASS_SUPER(klass);
01888
01889 if (!super) {
01890 if (klass == rb_cBasicObject) return Qnil;
01891 rb_raise(rb_eTypeError, "uninitialized class");
01892 }
01893 while (RB_TYPE_P(super, T_ICLASS)) {
01894 super = RCLASS_SUPER(super);
01895 }
01896 if (!super) {
01897 return Qnil;
01898 }
01899 return super;
01900 }
01901
01902 VALUE
01903 rb_class_get_superclass(VALUE klass)
01904 {
01905 return RCLASS(klass)->super;
01906 }
01907
01908 #define id_for_setter(name, type, message) \
01909 check_setter_id(name, rb_is_##type##_id, rb_is_##type##_name, message)
01910 static ID
01911 check_setter_id(VALUE name, int (*valid_id_p)(ID), int (*valid_name_p)(VALUE),
01912 const char *message)
01913 {
01914 ID id;
01915 if (SYMBOL_P(name)) {
01916 id = SYM2ID(name);
01917 if (!valid_id_p(id)) {
01918 rb_name_error(id, message, QUOTE_ID(id));
01919 }
01920 }
01921 else {
01922 VALUE str = rb_check_string_type(name);
01923 if (NIL_P(str)) {
01924 rb_raise(rb_eTypeError, "%+"PRIsVALUE" is not a symbol or string",
01925 str);
01926 }
01927 if (!valid_name_p(str)) {
01928 rb_name_error_str(str, message, QUOTE(str));
01929 }
01930 id = rb_to_id(str);
01931 }
01932 return id;
01933 }
01934
01935 static int
01936 rb_is_attr_id(ID id)
01937 {
01938 return rb_is_local_id(id) || rb_is_const_id(id);
01939 }
01940
01941 static int
01942 rb_is_attr_name(VALUE name)
01943 {
01944 return rb_is_local_name(name) || rb_is_const_name(name);
01945 }
01946
01947 static const char invalid_attribute_name[] = "invalid attribute name `%"PRIsVALUE"'";
01948
01949 static ID
01950 id_for_attr(VALUE name)
01951 {
01952 return id_for_setter(name, attr, invalid_attribute_name);
01953 }
01954
01955 ID
01956 rb_check_attr_id(ID id)
01957 {
01958 if (!rb_is_attr_id(id)) {
01959 rb_name_error_str(id, invalid_attribute_name, QUOTE_ID(id));
01960 }
01961 return id;
01962 }
01963
01964
01965
01966
01967
01968
01969
01970
01971
01972
01973
01974
01975
01976
01977 static VALUE
01978 rb_mod_attr_reader(int argc, VALUE *argv, VALUE klass)
01979 {
01980 int i;
01981
01982 for (i=0; i<argc; i++) {
01983 rb_attr(klass, id_for_attr(argv[i]), TRUE, FALSE, TRUE);
01984 }
01985 return Qnil;
01986 }
01987
01988 VALUE
01989 rb_mod_attr(int argc, VALUE *argv, VALUE klass)
01990 {
01991 if (argc == 2 && (argv[1] == Qtrue || argv[1] == Qfalse)) {
01992 rb_warning("optional boolean argument is obsoleted");
01993 rb_attr(klass, id_for_attr(argv[0]), 1, RTEST(argv[1]), TRUE);
01994 return Qnil;
01995 }
01996 return rb_mod_attr_reader(argc, argv, klass);
01997 }
01998
01999
02000
02001
02002
02003
02004
02005
02006
02007
02008
02009 static VALUE
02010 rb_mod_attr_writer(int argc, VALUE *argv, VALUE klass)
02011 {
02012 int i;
02013
02014 for (i=0; i<argc; i++) {
02015 rb_attr(klass, id_for_attr(argv[i]), FALSE, TRUE, TRUE);
02016 }
02017 return Qnil;
02018 }
02019
02020
02021
02022
02023
02024
02025
02026
02027
02028
02029
02030
02031
02032
02033
02034
02035
02036
02037 static VALUE
02038 rb_mod_attr_accessor(int argc, VALUE *argv, VALUE klass)
02039 {
02040 int i;
02041
02042 for (i=0; i<argc; i++) {
02043 rb_attr(klass, id_for_attr(argv[i]), TRUE, TRUE, TRUE);
02044 }
02045 return Qnil;
02046 }
02047
02048
02049
02050
02051
02052
02053
02054
02055
02056
02057
02058
02059
02060
02061
02062
02063
02064
02065
02066
02067
02068
02069
02070
02071
02072
02073
02074
02075
02076
02077
02078
02079
02080
02081
02082
02083
02084
02085
02086
02087
02088 static VALUE
02089 rb_mod_const_get(int argc, VALUE *argv, VALUE mod)
02090 {
02091 VALUE name, recur;
02092 rb_encoding *enc;
02093 const char *pbeg, *p, *path, *pend;
02094 ID id;
02095
02096 if (argc == 1) {
02097 name = argv[0];
02098 recur = Qtrue;
02099 }
02100 else {
02101 rb_scan_args(argc, argv, "11", &name, &recur);
02102 }
02103
02104 if (SYMBOL_P(name)) {
02105 id = SYM2ID(name);
02106 if (!rb_is_const_id(id)) goto wrong_id;
02107 return RTEST(recur) ? rb_const_get(mod, id) : rb_const_get_at(mod, id);
02108 }
02109
02110 path = StringValuePtr(name);
02111 enc = rb_enc_get(name);
02112
02113 if (!rb_enc_asciicompat(enc)) {
02114 rb_raise(rb_eArgError, "invalid class path encoding (non ASCII)");
02115 }
02116
02117 pbeg = p = path;
02118 pend = path + RSTRING_LEN(name);
02119
02120 if (p >= pend || !*p) {
02121 wrong_name:
02122 rb_raise(rb_eNameError, "wrong constant name %"PRIsVALUE,
02123 QUOTE(name));
02124 }
02125
02126 if (p + 2 < pend && p[0] == ':' && p[1] == ':') {
02127 mod = rb_cObject;
02128 p += 2;
02129 pbeg = p;
02130 }
02131
02132 while (p < pend) {
02133 VALUE part;
02134 long len, beglen;
02135
02136 while (p < pend && *p != ':') p++;
02137
02138 if (pbeg == p) goto wrong_name;
02139
02140 id = rb_check_id_cstr(pbeg, len = p-pbeg, enc);
02141 beglen = pbeg-path;
02142
02143 if (p < pend && p[0] == ':') {
02144 if (p + 2 >= pend || p[1] != ':') goto wrong_name;
02145 p += 2;
02146 pbeg = p;
02147 }
02148
02149 if (!RB_TYPE_P(mod, T_MODULE) && !RB_TYPE_P(mod, T_CLASS)) {
02150 rb_raise(rb_eTypeError, "%"PRIsVALUE" does not refer to class/module",
02151 QUOTE(name));
02152 }
02153
02154 if (!id) {
02155 part = rb_str_subseq(name, beglen, len);
02156 OBJ_FREEZE(part);
02157 if (!ISUPPER(*pbeg) || !rb_is_const_name(part)) {
02158 rb_name_error_str(part, "wrong constant name %"PRIsVALUE,
02159 QUOTE(part));
02160 }
02161 else if (!rb_method_basic_definition_p(CLASS_OF(mod), id_const_missing)) {
02162 id = rb_intern_str(part);
02163 }
02164 else {
02165 rb_name_error_str(part, "uninitialized constant %"PRIsVALUE"%"PRIsVALUE,
02166 rb_str_subseq(name, 0, beglen),
02167 QUOTE(part));
02168 }
02169 }
02170 if (!rb_is_const_id(id)) {
02171 wrong_id:
02172 rb_name_error(id, "wrong constant name %"PRIsVALUE,
02173 QUOTE_ID(id));
02174 }
02175 mod = RTEST(recur) ? rb_const_get(mod, id) : rb_const_get_at(mod, id);
02176 }
02177
02178 return mod;
02179 }
02180
02181
02182
02183
02184
02185
02186
02187
02188
02189
02190
02191
02192
02193
02194
02195
02196
02197
02198
02199
02200 static VALUE
02201 rb_mod_const_set(VALUE mod, VALUE name, VALUE value)
02202 {
02203 ID id = id_for_setter(name, const, "wrong constant name %"PRIsVALUE);
02204 rb_const_set(mod, id, value);
02205 return value;
02206 }
02207
02208
02209
02210
02211
02212
02213
02214
02215
02216
02217
02218
02219
02220
02221
02222
02223
02224
02225
02226
02227
02228
02229
02230 static VALUE
02231 rb_mod_const_defined(int argc, VALUE *argv, VALUE mod)
02232 {
02233 VALUE name, recur;
02234 rb_encoding *enc;
02235 const char *pbeg, *p, *path, *pend;
02236 ID id;
02237
02238 if (argc == 1) {
02239 name = argv[0];
02240 recur = Qtrue;
02241 }
02242 else {
02243 rb_scan_args(argc, argv, "11", &name, &recur);
02244 }
02245
02246 if (SYMBOL_P(name)) {
02247 id = SYM2ID(name);
02248 if (!rb_is_const_id(id)) goto wrong_id;
02249 return RTEST(recur) ? rb_const_defined(mod, id) : rb_const_defined_at(mod, id);
02250 }
02251
02252 path = StringValuePtr(name);
02253 enc = rb_enc_get(name);
02254
02255 if (!rb_enc_asciicompat(enc)) {
02256 rb_raise(rb_eArgError, "invalid class path encoding (non ASCII)");
02257 }
02258
02259 pbeg = p = path;
02260 pend = path + RSTRING_LEN(name);
02261
02262 if (p >= pend || !*p) {
02263 wrong_name:
02264 rb_raise(rb_eNameError, "wrong constant name %"PRIsVALUE,
02265 QUOTE(name));
02266 }
02267
02268 if (p + 2 < pend && p[0] == ':' && p[1] == ':') {
02269 mod = rb_cObject;
02270 p += 2;
02271 pbeg = p;
02272 }
02273
02274 while (p < pend) {
02275 VALUE part;
02276 long len, beglen;
02277
02278 while (p < pend && *p != ':') p++;
02279
02280 if (pbeg == p) goto wrong_name;
02281
02282 id = rb_check_id_cstr(pbeg, len = p-pbeg, enc);
02283 beglen = pbeg-path;
02284
02285 if (p < pend && p[0] == ':') {
02286 if (p + 2 >= pend || p[1] != ':') goto wrong_name;
02287 p += 2;
02288 pbeg = p;
02289 }
02290
02291 if (!id) {
02292 part = rb_str_subseq(name, beglen, len);
02293 OBJ_FREEZE(part);
02294 if (!ISUPPER(*pbeg) || !rb_is_const_name(part)) {
02295 rb_name_error_str(part, "wrong constant name %"PRIsVALUE,
02296 QUOTE(part));
02297 }
02298 else {
02299 return Qfalse;
02300 }
02301 }
02302 if (!rb_is_const_id(id)) {
02303 wrong_id:
02304 rb_name_error(id, "wrong constant name %"PRIsVALUE,
02305 QUOTE_ID(id));
02306 }
02307 if (RTEST(recur)) {
02308 if (!rb_const_defined(mod, id))
02309 return Qfalse;
02310 mod = rb_const_get(mod, id);
02311 }
02312 else {
02313 if (!rb_const_defined_at(mod, id))
02314 return Qfalse;
02315 mod = rb_const_get_at(mod, id);
02316 }
02317 recur = Qfalse;
02318
02319 if (p < pend && !RB_TYPE_P(mod, T_MODULE) && !RB_TYPE_P(mod, T_CLASS)) {
02320 rb_raise(rb_eTypeError, "%"PRIsVALUE" does not refer to class/module",
02321 QUOTE(name));
02322 }
02323 }
02324
02325 return Qtrue;
02326 }
02327
02328
02329
02330
02331
02332
02333
02334
02335
02336
02337
02338
02339
02340
02341
02342
02343
02344
02345
02346
02347
02348
02349
02350 static VALUE
02351 rb_obj_ivar_get(VALUE obj, VALUE iv)
02352 {
02353 ID id = rb_check_id(&iv);
02354
02355 if (!id) {
02356 if (rb_is_instance_name(iv)) {
02357 return Qnil;
02358 }
02359 else {
02360 rb_name_error_str(iv, "`%"PRIsVALUE"' is not allowed as an instance variable name",
02361 QUOTE(iv));
02362 }
02363 }
02364 if (!rb_is_instance_id(id)) {
02365 rb_name_error(id, "`%"PRIsVALUE"' is not allowed as an instance variable name",
02366 QUOTE_ID(id));
02367 }
02368 return rb_ivar_get(obj, id);
02369 }
02370
02371
02372
02373
02374
02375
02376
02377
02378
02379
02380
02381
02382
02383
02384
02385
02386
02387
02388
02389
02390
02391
02392
02393
02394 static VALUE
02395 rb_obj_ivar_set(VALUE obj, VALUE iv, VALUE val)
02396 {
02397 ID id = id_for_setter(iv, instance, "`%"PRIsVALUE"' is not allowed as an instance variable name");
02398 return rb_ivar_set(obj, id, val);
02399 }
02400
02401
02402
02403
02404
02405
02406
02407
02408
02409
02410
02411
02412
02413
02414
02415
02416
02417
02418
02419
02420
02421 static VALUE
02422 rb_obj_ivar_defined(VALUE obj, VALUE iv)
02423 {
02424 ID id = rb_check_id(&iv);
02425
02426 if (!id) {
02427 if (rb_is_instance_name(iv)) {
02428 return Qfalse;
02429 }
02430 else {
02431 rb_name_error_str(iv, "`%"PRIsVALUE"' is not allowed as an instance variable name",
02432 QUOTE(iv));
02433 }
02434 }
02435 if (!rb_is_instance_id(id)) {
02436 rb_name_error(id, "`%"PRIsVALUE"' is not allowed as an instance variable name",
02437 QUOTE_ID(id));
02438 }
02439 return rb_ivar_defined(obj, id);
02440 }
02441
02442
02443
02444
02445
02446
02447
02448
02449
02450
02451
02452
02453
02454
02455
02456
02457
02458 static VALUE
02459 rb_mod_cvar_get(VALUE obj, VALUE iv)
02460 {
02461 ID id = rb_check_id(&iv);
02462
02463 if (!id) {
02464 if (rb_is_class_name(iv)) {
02465 rb_name_error_str(iv, "uninitialized class variable %"PRIsVALUE" in %"PRIsVALUE"",
02466 iv, rb_class_name(obj));
02467 }
02468 else {
02469 rb_name_error_str(iv, "`%"PRIsVALUE"' is not allowed as a class variable name",
02470 QUOTE(iv));
02471 }
02472 }
02473 if (!rb_is_class_id(id)) {
02474 rb_name_error(id, "`%"PRIsVALUE"' is not allowed as a class variable name",
02475 QUOTE_ID(id));
02476 }
02477 return rb_cvar_get(obj, id);
02478 }
02479
02480
02481
02482
02483
02484
02485
02486
02487
02488
02489
02490
02491
02492
02493
02494
02495
02496
02497
02498
02499
02500 static VALUE
02501 rb_mod_cvar_set(VALUE obj, VALUE iv, VALUE val)
02502 {
02503 ID id = id_for_setter(iv, class, "`%"PRIsVALUE"' is not allowed as a class variable name");
02504 rb_cvar_set(obj, id, val);
02505 return val;
02506 }
02507
02508
02509
02510
02511
02512
02513
02514
02515
02516
02517
02518
02519
02520
02521
02522
02523
02524 static VALUE
02525 rb_mod_cvar_defined(VALUE obj, VALUE iv)
02526 {
02527 ID id = rb_check_id(&iv);
02528
02529 if (!id) {
02530 if (rb_is_class_name(iv)) {
02531 return Qfalse;
02532 }
02533 else {
02534 rb_name_error_str(iv, "`%"PRIsVALUE"' is not allowed as a class variable name",
02535 QUOTE(iv));
02536 }
02537 }
02538 if (!rb_is_class_id(id)) {
02539 rb_name_error(id, "`%"PRIsVALUE"' is not allowed as a class variable name",
02540 QUOTE_ID(id));
02541 }
02542 return rb_cvar_defined(obj, id);
02543 }
02544
02545
02546
02547
02548
02549
02550
02551
02552
02553
02554
02555
02556
02557
02558 static VALUE
02559 rb_mod_singleton_p(VALUE klass)
02560 {
02561 if (RB_TYPE_P(klass, T_CLASS) && FL_TEST(klass, FL_SINGLETON))
02562 return Qtrue;
02563 return Qfalse;
02564 }
02565
02566 static struct conv_method_tbl {
02567 const char *method;
02568 ID id;
02569 } conv_method_names[] = {
02570 {"to_int", 0},
02571 {"to_ary", 0},
02572 {"to_str", 0},
02573 {"to_sym", 0},
02574 {"to_hash", 0},
02575 {"to_proc", 0},
02576 {"to_io", 0},
02577 {"to_a", 0},
02578 {"to_s", 0},
02579 {NULL, 0}
02580 };
02581 #define IMPLICIT_CONVERSIONS 7
02582
02583 static VALUE
02584 convert_type(VALUE val, const char *tname, const char *method, int raise)
02585 {
02586 ID m = 0;
02587 int i;
02588 VALUE r;
02589
02590 for (i=0; conv_method_names[i].method; i++) {
02591 if (conv_method_names[i].method[0] == method[0] &&
02592 strcmp(conv_method_names[i].method, method) == 0) {
02593 m = conv_method_names[i].id;
02594 break;
02595 }
02596 }
02597 if (!m) m = rb_intern(method);
02598 r = rb_check_funcall(val, m, 0, 0);
02599 if (r == Qundef) {
02600 if (raise) {
02601 rb_raise(rb_eTypeError, i < IMPLICIT_CONVERSIONS
02602 ? "no implicit conversion of %s into %s"
02603 : "can't convert %s into %s",
02604 NIL_P(val) ? "nil" :
02605 val == Qtrue ? "true" :
02606 val == Qfalse ? "false" :
02607 rb_obj_classname(val),
02608 tname);
02609 }
02610 return Qnil;
02611 }
02612 return r;
02613 }
02614
02615 VALUE
02616 rb_convert_type(VALUE val, int type, const char *tname, const char *method)
02617 {
02618 VALUE v;
02619
02620 if (TYPE(val) == type) return val;
02621 v = convert_type(val, tname, method, TRUE);
02622 if (TYPE(v) != type) {
02623 const char *cname = rb_obj_classname(val);
02624 rb_raise(rb_eTypeError, "can't convert %s to %s (%s#%s gives %s)",
02625 cname, tname, cname, method, rb_obj_classname(v));
02626 }
02627 return v;
02628 }
02629
02630 VALUE
02631 rb_check_convert_type(VALUE val, int type, const char *tname, const char *method)
02632 {
02633 VALUE v;
02634
02635
02636 if (TYPE(val) == type && type != T_DATA) return val;
02637 v = convert_type(val, tname, method, FALSE);
02638 if (NIL_P(v)) return Qnil;
02639 if (TYPE(v) != type) {
02640 const char *cname = rb_obj_classname(val);
02641 rb_raise(rb_eTypeError, "can't convert %s to %s (%s#%s gives %s)",
02642 cname, tname, cname, method, rb_obj_classname(v));
02643 }
02644 return v;
02645 }
02646
02647
02648 static VALUE
02649 rb_to_integer(VALUE val, const char *method)
02650 {
02651 VALUE v;
02652
02653 if (FIXNUM_P(val)) return val;
02654 if (RB_TYPE_P(val, T_BIGNUM)) return val;
02655 v = convert_type(val, "Integer", method, TRUE);
02656 if (!rb_obj_is_kind_of(v, rb_cInteger)) {
02657 const char *cname = rb_obj_classname(val);
02658 rb_raise(rb_eTypeError, "can't convert %s to Integer (%s#%s gives %s)",
02659 cname, cname, method, rb_obj_classname(v));
02660 }
02661 return v;
02662 }
02663
02664 VALUE
02665 rb_check_to_integer(VALUE val, const char *method)
02666 {
02667 VALUE v;
02668
02669 if (FIXNUM_P(val)) return val;
02670 if (RB_TYPE_P(val, T_BIGNUM)) return val;
02671 v = convert_type(val, "Integer", method, FALSE);
02672 if (!rb_obj_is_kind_of(v, rb_cInteger)) {
02673 return Qnil;
02674 }
02675 return v;
02676 }
02677
02678 VALUE
02679 rb_to_int(VALUE val)
02680 {
02681 return rb_to_integer(val, "to_int");
02682 }
02683
02684 VALUE
02685 rb_check_to_int(VALUE val)
02686 {
02687 return rb_check_to_integer(val, "to_int");
02688 }
02689
02690 static VALUE
02691 rb_convert_to_integer(VALUE val, int base)
02692 {
02693 VALUE tmp;
02694
02695 switch (TYPE(val)) {
02696 case T_FLOAT:
02697 if (base != 0) goto arg_error;
02698 if (RFLOAT_VALUE(val) <= (double)FIXNUM_MAX
02699 && RFLOAT_VALUE(val) >= (double)FIXNUM_MIN) {
02700 break;
02701 }
02702 return rb_dbl2big(RFLOAT_VALUE(val));
02703
02704 case T_FIXNUM:
02705 case T_BIGNUM:
02706 if (base != 0) goto arg_error;
02707 return val;
02708
02709 case T_STRING:
02710 string_conv:
02711 return rb_str_to_inum(val, base, TRUE);
02712
02713 case T_NIL:
02714 if (base != 0) goto arg_error;
02715 rb_raise(rb_eTypeError, "can't convert nil into Integer");
02716 break;
02717
02718 default:
02719 break;
02720 }
02721 if (base != 0) {
02722 tmp = rb_check_string_type(val);
02723 if (!NIL_P(tmp)) goto string_conv;
02724 arg_error:
02725 rb_raise(rb_eArgError, "base specified for non string value");
02726 }
02727 tmp = convert_type(val, "Integer", "to_int", FALSE);
02728 if (NIL_P(tmp)) {
02729 return rb_to_integer(val, "to_i");
02730 }
02731 return tmp;
02732
02733 }
02734
02735 VALUE
02736 rb_Integer(VALUE val)
02737 {
02738 return rb_convert_to_integer(val, 0);
02739 }
02740
02741
02742
02743
02744
02745
02746
02747
02748
02749
02750
02751
02752
02753
02754
02755
02756
02757
02758
02759
02760
02761
02762
02763 static VALUE
02764 rb_f_integer(int argc, VALUE *argv, VALUE obj)
02765 {
02766 VALUE arg = Qnil;
02767 int base = 0;
02768
02769 switch (argc) {
02770 case 2:
02771 base = NUM2INT(argv[1]);
02772 case 1:
02773 arg = argv[0];
02774 break;
02775 default:
02776
02777 rb_scan_args(argc, argv, "11", NULL, NULL);
02778 }
02779 return rb_convert_to_integer(arg, base);
02780 }
02781
02782 double
02783 rb_cstr_to_dbl(const char *p, int badcheck)
02784 {
02785 const char *q;
02786 char *end;
02787 double d;
02788 const char *ellipsis = "";
02789 int w;
02790 enum {max_width = 20};
02791 #define OutOfRange() ((end - p > max_width) ? \
02792 (w = max_width, ellipsis = "...") : \
02793 (w = (int)(end - p), ellipsis = ""))
02794
02795 if (!p) return 0.0;
02796 q = p;
02797 while (ISSPACE(*p)) p++;
02798
02799 if (!badcheck && p[0] == '0' && (p[1] == 'x' || p[1] == 'X')) {
02800 return 0.0;
02801 }
02802
02803 d = strtod(p, &end);
02804 if (errno == ERANGE) {
02805 OutOfRange();
02806 rb_warning("Float %.*s%s out of range", w, p, ellipsis);
02807 errno = 0;
02808 }
02809 if (p == end) {
02810 if (badcheck) {
02811 bad:
02812 rb_invalid_str(q, "Float()");
02813 }
02814 return d;
02815 }
02816 if (*end) {
02817 char buf[DBL_DIG * 4 + 10];
02818 char *n = buf;
02819 char *e = buf + sizeof(buf) - 1;
02820 char prev = 0;
02821
02822 while (p < end && n < e) prev = *n++ = *p++;
02823 while (*p) {
02824 if (*p == '_') {
02825
02826 if (badcheck) {
02827 if (n == buf || !ISDIGIT(prev)) goto bad;
02828 ++p;
02829 if (!ISDIGIT(*p)) goto bad;
02830 }
02831 else {
02832 while (*++p == '_');
02833 continue;
02834 }
02835 }
02836 prev = *p++;
02837 if (n < e) *n++ = prev;
02838 }
02839 *n = '\0';
02840 p = buf;
02841
02842 if (!badcheck && p[0] == '0' && (p[1] == 'x' || p[1] == 'X')) {
02843 return 0.0;
02844 }
02845
02846 d = strtod(p, &end);
02847 if (errno == ERANGE) {
02848 OutOfRange();
02849 rb_warning("Float %.*s%s out of range", w, p, ellipsis);
02850 errno = 0;
02851 }
02852 if (badcheck) {
02853 if (!end || p == end) goto bad;
02854 while (*end && ISSPACE(*end)) end++;
02855 if (*end) goto bad;
02856 }
02857 }
02858 if (errno == ERANGE) {
02859 errno = 0;
02860 OutOfRange();
02861 rb_raise(rb_eArgError, "Float %.*s%s out of range", w, q, ellipsis);
02862 }
02863 return d;
02864 }
02865
02866 double
02867 rb_str_to_dbl(VALUE str, int badcheck)
02868 {
02869 char *s;
02870 long len;
02871 double ret;
02872 VALUE v = 0;
02873
02874 StringValue(str);
02875 s = RSTRING_PTR(str);
02876 len = RSTRING_LEN(str);
02877 if (s) {
02878 if (badcheck && memchr(s, '\0', len)) {
02879 rb_raise(rb_eArgError, "string for Float contains null byte");
02880 }
02881 if (s[len]) {
02882 char *p = ALLOCV(v, len);
02883 MEMCPY(p, s, char, len);
02884 p[len] = '\0';
02885 s = p;
02886 }
02887 }
02888 ret = rb_cstr_to_dbl(s, badcheck);
02889 if (v)
02890 ALLOCV_END(v);
02891 return ret;
02892 }
02893
02894 VALUE
02895 rb_Float(VALUE val)
02896 {
02897 switch (TYPE(val)) {
02898 case T_FIXNUM:
02899 return DBL2NUM((double)FIX2LONG(val));
02900
02901 case T_FLOAT:
02902 return val;
02903
02904 case T_BIGNUM:
02905 return DBL2NUM(rb_big2dbl(val));
02906
02907 case T_STRING:
02908 return DBL2NUM(rb_str_to_dbl(val, TRUE));
02909
02910 case T_NIL:
02911 rb_raise(rb_eTypeError, "can't convert nil into Float");
02912 break;
02913
02914 default:
02915 return rb_convert_type(val, T_FLOAT, "Float", "to_f");
02916 }
02917
02918 UNREACHABLE;
02919 }
02920
02921
02922
02923
02924
02925
02926
02927
02928
02929
02930
02931
02932
02933 static VALUE
02934 rb_f_float(VALUE obj, VALUE arg)
02935 {
02936 return rb_Float(arg);
02937 }
02938
02939 VALUE
02940 rb_to_float(VALUE val)
02941 {
02942 if (RB_TYPE_P(val, T_FLOAT)) return val;
02943 if (!rb_obj_is_kind_of(val, rb_cNumeric)) {
02944 rb_raise(rb_eTypeError, "can't convert %s into Float",
02945 NIL_P(val) ? "nil" :
02946 val == Qtrue ? "true" :
02947 val == Qfalse ? "false" :
02948 rb_obj_classname(val));
02949 }
02950 return rb_convert_type(val, T_FLOAT, "Float", "to_f");
02951 }
02952
02953 VALUE
02954 rb_check_to_float(VALUE val)
02955 {
02956 if (RB_TYPE_P(val, T_FLOAT)) return val;
02957 if (!rb_obj_is_kind_of(val, rb_cNumeric)) {
02958 return Qnil;
02959 }
02960 return rb_check_convert_type(val, T_FLOAT, "Float", "to_f");
02961 }
02962
02963 double
02964 rb_num2dbl(VALUE val)
02965 {
02966 switch (TYPE(val)) {
02967 case T_FLOAT:
02968 return RFLOAT_VALUE(val);
02969
02970 case T_STRING:
02971 rb_raise(rb_eTypeError, "no implicit conversion to float from string");
02972 break;
02973
02974 case T_NIL:
02975 rb_raise(rb_eTypeError, "no implicit conversion to float from nil");
02976 break;
02977
02978 default:
02979 break;
02980 }
02981
02982 return RFLOAT_VALUE(rb_Float(val));
02983 }
02984
02985 VALUE
02986 rb_String(VALUE val)
02987 {
02988 VALUE tmp = rb_check_string_type(val);
02989 if (NIL_P(tmp))
02990 tmp = rb_convert_type(val, T_STRING, "String", "to_s");
02991 return tmp;
02992 }
02993
02994
02995
02996
02997
02998
02999
03000
03001
03002
03003
03004
03005
03006
03007 static VALUE
03008 rb_f_string(VALUE obj, VALUE arg)
03009 {
03010 return rb_String(arg);
03011 }
03012
03013 VALUE
03014 rb_Array(VALUE val)
03015 {
03016 VALUE tmp = rb_check_array_type(val);
03017
03018 if (NIL_P(tmp)) {
03019 tmp = rb_check_convert_type(val, T_ARRAY, "Array", "to_a");
03020 if (NIL_P(tmp)) {
03021 return rb_ary_new3(1, val);
03022 }
03023 }
03024 return tmp;
03025 }
03026
03027
03028
03029
03030
03031
03032
03033
03034
03035
03036
03037
03038 static VALUE
03039 rb_f_array(VALUE obj, VALUE arg)
03040 {
03041 return rb_Array(arg);
03042 }
03043
03044 VALUE
03045 rb_Hash(VALUE val)
03046 {
03047 VALUE tmp;
03048
03049 if (NIL_P(val)) return rb_hash_new();
03050 tmp = rb_check_hash_type(val);
03051 if (NIL_P(tmp)) {
03052 if (RB_TYPE_P(val, T_ARRAY) && RARRAY_LEN(val) == 0)
03053 return rb_hash_new();
03054 rb_raise(rb_eTypeError, "can't convert %s into Hash", rb_obj_classname(val));
03055 }
03056 return tmp;
03057 }
03058
03059
03060
03061
03062
03063
03064
03065
03066
03067
03068
03069
03070
03071
03072
03073 static VALUE
03074 rb_f_hash(VALUE obj, VALUE arg)
03075 {
03076 return rb_Hash(arg);
03077 }
03078
03079
03080
03081
03082
03083
03084
03085
03086
03087
03088
03089
03090
03091
03092
03093
03094
03095
03096
03097
03098
03099
03100
03101
03102
03103
03104
03105
03106
03107
03108
03109
03110
03111
03112
03113
03114
03115
03116
03117
03118
03119
03120
03121
03122
03123
03124
03125
03126
03127
03128
03129
03130
03131
03132
03133
03134
03135
03136
03137
03138
03139
03140
03141
03142
03143
03162
03163
03164
03165
03166
03167
03168
03169
03170
03171
03172
03173
03174
03175
03176
03177
03178
03179
03180
03181
03182
03183
03184
03185
03186
03187
03188
03189
03190
03191
03192
03193
03194
03195
03196
03197
03198
03199
03200
03201
03202
03203
03204
03205
03206
03207
03208
03209
03210
03211
03212
03213
03214
03215
03216
03217
03218
03219
03220
03221
03222
03223
03224
03225
03226
03227
03228
03229
03230
03231
03232
03233
03234 void
03235 Init_Object(void)
03236 {
03237 int i;
03238
03239 Init_class_hierarchy();
03240
03241 #if 0
03242
03243 rb_cBasicObject = rb_define_class("BasicObject", Qnil);
03244 rb_cObject = rb_define_class("Object", rb_cBasicObject);
03245 rb_cModule = rb_define_class("Module", rb_cObject);
03246 rb_cClass = rb_define_class("Class", rb_cModule);
03247 #endif
03248
03249 #undef rb_intern
03250 #define rb_intern(str) rb_intern_const(str)
03251
03252 rb_define_private_method(rb_cBasicObject, "initialize", rb_obj_dummy, 0);
03253 rb_define_alloc_func(rb_cBasicObject, rb_class_allocate_instance);
03254 rb_define_method(rb_cBasicObject, "==", rb_obj_equal, 1);
03255 rb_define_method(rb_cBasicObject, "equal?", rb_obj_equal, 1);
03256 rb_define_method(rb_cBasicObject, "!", rb_obj_not, 0);
03257 rb_define_method(rb_cBasicObject, "!=", rb_obj_not_equal, 1);
03258
03259 rb_define_private_method(rb_cBasicObject, "singleton_method_added", rb_obj_dummy, 1);
03260 rb_define_private_method(rb_cBasicObject, "singleton_method_removed", rb_obj_dummy, 1);
03261 rb_define_private_method(rb_cBasicObject, "singleton_method_undefined", rb_obj_dummy, 1);
03262
03263
03264
03265
03266
03267
03268
03269
03270
03271
03272
03273
03274
03275 rb_mKernel = rb_define_module("Kernel");
03276 rb_include_module(rb_cObject, rb_mKernel);
03277 rb_define_private_method(rb_cClass, "inherited", rb_obj_dummy, 1);
03278 rb_define_private_method(rb_cModule, "included", rb_obj_dummy, 1);
03279 rb_define_private_method(rb_cModule, "extended", rb_obj_dummy, 1);
03280 rb_define_private_method(rb_cModule, "prepended", rb_obj_dummy, 1);
03281 rb_define_private_method(rb_cModule, "method_added", rb_obj_dummy, 1);
03282 rb_define_private_method(rb_cModule, "method_removed", rb_obj_dummy, 1);
03283 rb_define_private_method(rb_cModule, "method_undefined", rb_obj_dummy, 1);
03284
03285 rb_define_method(rb_mKernel, "nil?", rb_false, 0);
03286 rb_define_method(rb_mKernel, "===", rb_equal, 1);
03287 rb_define_method(rb_mKernel, "=~", rb_obj_match, 1);
03288 rb_define_method(rb_mKernel, "!~", rb_obj_not_match, 1);
03289 rb_define_method(rb_mKernel, "eql?", rb_obj_equal, 1);
03290 rb_define_method(rb_mKernel, "hash", rb_obj_hash, 0);
03291 rb_define_method(rb_mKernel, "<=>", rb_obj_cmp, 1);
03292
03293 rb_define_method(rb_mKernel, "class", rb_obj_class, 0);
03294 rb_define_method(rb_mKernel, "singleton_class", rb_obj_singleton_class, 0);
03295 rb_define_method(rb_mKernel, "clone", rb_obj_clone, 0);
03296 rb_define_method(rb_mKernel, "dup", rb_obj_dup, 0);
03297 rb_define_method(rb_mKernel, "initialize_copy", rb_obj_init_copy, 1);
03298 rb_define_method(rb_mKernel, "initialize_dup", rb_obj_init_dup_clone, 1);
03299 rb_define_method(rb_mKernel, "initialize_clone", rb_obj_init_dup_clone, 1);
03300
03301 rb_define_method(rb_mKernel, "taint", rb_obj_taint, 0);
03302 rb_define_method(rb_mKernel, "tainted?", rb_obj_tainted, 0);
03303 rb_define_method(rb_mKernel, "untaint", rb_obj_untaint, 0);
03304 rb_define_method(rb_mKernel, "untrust", rb_obj_untrust, 0);
03305 rb_define_method(rb_mKernel, "untrusted?", rb_obj_untrusted, 0);
03306 rb_define_method(rb_mKernel, "trust", rb_obj_trust, 0);
03307 rb_define_method(rb_mKernel, "freeze", rb_obj_freeze, 0);
03308 rb_define_method(rb_mKernel, "frozen?", rb_obj_frozen_p, 0);
03309
03310 rb_define_method(rb_mKernel, "to_s", rb_any_to_s, 0);
03311 rb_define_method(rb_mKernel, "inspect", rb_obj_inspect, 0);
03312 rb_define_method(rb_mKernel, "methods", rb_obj_methods, -1);
03313 rb_define_method(rb_mKernel, "singleton_methods", rb_obj_singleton_methods, -1);
03314 rb_define_method(rb_mKernel, "protected_methods", rb_obj_protected_methods, -1);
03315 rb_define_method(rb_mKernel, "private_methods", rb_obj_private_methods, -1);
03316 rb_define_method(rb_mKernel, "public_methods", rb_obj_public_methods, -1);
03317 rb_define_method(rb_mKernel, "instance_variables", rb_obj_instance_variables, 0);
03318 rb_define_method(rb_mKernel, "instance_variable_get", rb_obj_ivar_get, 1);
03319 rb_define_method(rb_mKernel, "instance_variable_set", rb_obj_ivar_set, 2);
03320 rb_define_method(rb_mKernel, "instance_variable_defined?", rb_obj_ivar_defined, 1);
03321 rb_define_method(rb_mKernel, "remove_instance_variable",
03322 rb_obj_remove_instance_variable, 1);
03323
03324 rb_define_method(rb_mKernel, "instance_of?", rb_obj_is_instance_of, 1);
03325 rb_define_method(rb_mKernel, "kind_of?", rb_obj_is_kind_of, 1);
03326 rb_define_method(rb_mKernel, "is_a?", rb_obj_is_kind_of, 1);
03327 rb_define_method(rb_mKernel, "tap", rb_obj_tap, 0);
03328
03329 rb_define_global_function("sprintf", rb_f_sprintf, -1);
03330 rb_define_global_function("format", rb_f_sprintf, -1);
03331
03332 rb_define_global_function("Integer", rb_f_integer, -1);
03333 rb_define_global_function("Float", rb_f_float, 1);
03334
03335 rb_define_global_function("String", rb_f_string, 1);
03336 rb_define_global_function("Array", rb_f_array, 1);
03337 rb_define_global_function("Hash", rb_f_hash, 1);
03338
03339 rb_cNilClass = rb_define_class("NilClass", rb_cObject);
03340 rb_define_method(rb_cNilClass, "to_i", nil_to_i, 0);
03341 rb_define_method(rb_cNilClass, "to_f", nil_to_f, 0);
03342 rb_define_method(rb_cNilClass, "to_s", nil_to_s, 0);
03343 rb_define_method(rb_cNilClass, "to_a", nil_to_a, 0);
03344 rb_define_method(rb_cNilClass, "to_h", nil_to_h, 0);
03345 rb_define_method(rb_cNilClass, "inspect", nil_inspect, 0);
03346 rb_define_method(rb_cNilClass, "&", false_and, 1);
03347 rb_define_method(rb_cNilClass, "|", false_or, 1);
03348 rb_define_method(rb_cNilClass, "^", false_xor, 1);
03349
03350 rb_define_method(rb_cNilClass, "nil?", rb_true, 0);
03351 rb_undef_alloc_func(rb_cNilClass);
03352 rb_undef_method(CLASS_OF(rb_cNilClass), "new");
03353
03354
03355
03356 rb_define_global_const("NIL", Qnil);
03357
03358 rb_define_method(rb_cModule, "freeze", rb_mod_freeze, 0);
03359 rb_define_method(rb_cModule, "===", rb_mod_eqq, 1);
03360 rb_define_method(rb_cModule, "==", rb_obj_equal, 1);
03361 rb_define_method(rb_cModule, "<=>", rb_mod_cmp, 1);
03362 rb_define_method(rb_cModule, "<", rb_mod_lt, 1);
03363 rb_define_method(rb_cModule, "<=", rb_class_inherited_p, 1);
03364 rb_define_method(rb_cModule, ">", rb_mod_gt, 1);
03365 rb_define_method(rb_cModule, ">=", rb_mod_ge, 1);
03366 rb_define_method(rb_cModule, "initialize_copy", rb_mod_init_copy, 1);
03367 rb_define_method(rb_cModule, "to_s", rb_mod_to_s, 0);
03368 rb_define_alias(rb_cModule, "inspect", "to_s");
03369 rb_define_method(rb_cModule, "included_modules", rb_mod_included_modules, 0);
03370 rb_define_method(rb_cModule, "include?", rb_mod_include_p, 1);
03371 rb_define_method(rb_cModule, "name", rb_mod_name, 0);
03372 rb_define_method(rb_cModule, "ancestors", rb_mod_ancestors, 0);
03373
03374 rb_define_private_method(rb_cModule, "attr", rb_mod_attr, -1);
03375 rb_define_private_method(rb_cModule, "attr_reader", rb_mod_attr_reader, -1);
03376 rb_define_private_method(rb_cModule, "attr_writer", rb_mod_attr_writer, -1);
03377 rb_define_private_method(rb_cModule, "attr_accessor", rb_mod_attr_accessor, -1);
03378
03379 rb_define_alloc_func(rb_cModule, rb_module_s_alloc);
03380 rb_define_method(rb_cModule, "initialize", rb_mod_initialize, 0);
03381 rb_define_method(rb_cModule, "instance_methods", rb_class_instance_methods, -1);
03382 rb_define_method(rb_cModule, "public_instance_methods",
03383 rb_class_public_instance_methods, -1);
03384 rb_define_method(rb_cModule, "protected_instance_methods",
03385 rb_class_protected_instance_methods, -1);
03386 rb_define_method(rb_cModule, "private_instance_methods",
03387 rb_class_private_instance_methods, -1);
03388
03389 rb_define_method(rb_cModule, "constants", rb_mod_constants, -1);
03390 rb_define_method(rb_cModule, "const_get", rb_mod_const_get, -1);
03391 rb_define_method(rb_cModule, "const_set", rb_mod_const_set, 2);
03392 rb_define_method(rb_cModule, "const_defined?", rb_mod_const_defined, -1);
03393 rb_define_private_method(rb_cModule, "remove_const",
03394 rb_mod_remove_const, 1);
03395 rb_define_method(rb_cModule, "const_missing",
03396 rb_mod_const_missing, 1);
03397 rb_define_method(rb_cModule, "class_variables",
03398 rb_mod_class_variables, -1);
03399 rb_define_method(rb_cModule, "remove_class_variable",
03400 rb_mod_remove_cvar, 1);
03401 rb_define_method(rb_cModule, "class_variable_get", rb_mod_cvar_get, 1);
03402 rb_define_method(rb_cModule, "class_variable_set", rb_mod_cvar_set, 2);
03403 rb_define_method(rb_cModule, "class_variable_defined?", rb_mod_cvar_defined, 1);
03404 rb_define_method(rb_cModule, "public_constant", rb_mod_public_constant, -1);
03405 rb_define_method(rb_cModule, "private_constant", rb_mod_private_constant, -1);
03406 rb_define_method(rb_cModule, "singleton_class?", rb_mod_singleton_p, 0);
03407
03408 rb_define_method(rb_cClass, "allocate", rb_obj_alloc, 0);
03409 rb_define_method(rb_cClass, "new", rb_class_new_instance, -1);
03410 rb_define_method(rb_cClass, "initialize", rb_class_initialize, -1);
03411 rb_define_method(rb_cClass, "superclass", rb_class_superclass, 0);
03412 rb_define_alloc_func(rb_cClass, rb_class_s_alloc);
03413 rb_undef_method(rb_cClass, "extend_object");
03414 rb_undef_method(rb_cClass, "append_features");
03415 rb_undef_method(rb_cClass, "prepend_features");
03416
03417
03418
03419
03420
03421
03422
03423 rb_cData = rb_define_class("Data", rb_cObject);
03424 rb_undef_alloc_func(rb_cData);
03425
03426 rb_cTrueClass = rb_define_class("TrueClass", rb_cObject);
03427 rb_define_method(rb_cTrueClass, "to_s", true_to_s, 0);
03428 rb_define_alias(rb_cTrueClass, "inspect", "to_s");
03429 rb_define_method(rb_cTrueClass, "&", true_and, 1);
03430 rb_define_method(rb_cTrueClass, "|", true_or, 1);
03431 rb_define_method(rb_cTrueClass, "^", true_xor, 1);
03432 rb_undef_alloc_func(rb_cTrueClass);
03433 rb_undef_method(CLASS_OF(rb_cTrueClass), "new");
03434
03435
03436
03437 rb_define_global_const("TRUE", Qtrue);
03438
03439 rb_cFalseClass = rb_define_class("FalseClass", rb_cObject);
03440 rb_define_method(rb_cFalseClass, "to_s", false_to_s, 0);
03441 rb_define_alias(rb_cFalseClass, "inspect", "to_s");
03442 rb_define_method(rb_cFalseClass, "&", false_and, 1);
03443 rb_define_method(rb_cFalseClass, "|", false_or, 1);
03444 rb_define_method(rb_cFalseClass, "^", false_xor, 1);
03445 rb_undef_alloc_func(rb_cFalseClass);
03446 rb_undef_method(CLASS_OF(rb_cFalseClass), "new");
03447
03448
03449
03450 rb_define_global_const("FALSE", Qfalse);
03451
03452 for (i=0; conv_method_names[i].method; i++) {
03453 conv_method_names[i].id = rb_intern(conv_method_names[i].method);
03454 }
03455 }
03456