2000-05-01 05:42:38 -04:00
|
|
|
/**********************************************************************
|
1998-01-16 07:13:05 -05:00
|
|
|
|
|
|
|
variable.c -
|
|
|
|
|
|
|
|
$Author$
|
|
|
|
created at: Tue Apr 19 23:55:15 JST 1994
|
|
|
|
|
* encoding.c: provide basic features for M17N.
* parse.y: encoding aware parsing.
* parse.y (pragma_encoding): encoding specification pragma.
* parse.y (rb_intern3): encoding specified symbols.
* string.c (rb_str_length): length based on characters.
for older behavior, bytesize method added.
* string.c (rb_str_index_m): index based on characters. rindex as
well.
* string.c (succ_char): encoding aware succeeding string.
* string.c (rb_str_reverse): reverse based on characters.
* string.c (rb_str_inspect): encoding aware string description.
* string.c (rb_str_upcase_bang): encoding aware case conversion.
downcase, capitalize, swapcase as well.
* string.c (rb_str_tr_bang): tr based on characters. delete,
squeeze, tr_s, count as well.
* string.c (rb_str_split_m): split based on characters.
* string.c (rb_str_each_line): encoding aware each_line.
* string.c (rb_str_each_char): added. iteration based on
characters.
* string.c (rb_str_strip_bang): encoding aware whitespace
stripping. lstrip, rstrip as well.
* string.c (rb_str_justify): encoding aware justifying (ljust,
rjust, center).
* string.c (str_encoding): get encoding attribute from a string.
* re.c (rb_reg_initialize): encoding aware regular expression
* sprintf.c (rb_str_format): formatting (i.e. length count) based
on characters.
* io.c (rb_io_getc): getc to return one-character string.
for older behavior, getbyte method added.
* ext/stringio/stringio.c (strio_getc): ditto.
* io.c (rb_io_ungetc): allow pushing arbitrary string at the
current reading point.
* ext/stringio/stringio.c (strio_ungetc): ditto.
* ext/strscan/strscan.c: encoding support.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@13261 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-08-24 23:29:39 -04:00
|
|
|
Copyright (C) 1993-2007 Yukihiro Matsumoto
|
2000-05-01 05:42:38 -04:00
|
|
|
Copyright (C) 2000 Network Applied Communication Laboratory, Inc.
|
2000-05-09 00:53:16 -04:00
|
|
|
Copyright (C) 2000 Information-technology Promotion Agency, Japan
|
2000-05-01 05:42:38 -04:00
|
|
|
|
|
|
|
**********************************************************************/
|
1998-01-16 07:13:05 -05:00
|
|
|
|
2007-06-09 23:06:15 -04:00
|
|
|
#include "ruby/ruby.h"
|
|
|
|
#include "ruby/node.h"
|
|
|
|
#include "ruby/st.h"
|
|
|
|
#include "ruby/util.h"
|
1998-01-16 07:13:05 -05:00
|
|
|
|
2006-12-31 10:02:22 -05:00
|
|
|
void rb_vm_change_state(void);
|
2006-07-20 13:36:36 -04:00
|
|
|
st_table *rb_global_tbl;
|
1998-01-16 07:13:05 -05:00
|
|
|
st_table *rb_class_tbl;
|
2003-08-02 01:02:43 -04:00
|
|
|
static ID autoload, classpath, tmp_classpath;
|
1998-01-16 07:13:05 -05:00
|
|
|
|
|
|
|
void
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
Init_var_tables(void)
|
1998-01-16 07:13:05 -05:00
|
|
|
{
|
1999-01-19 23:59:39 -05:00
|
|
|
rb_global_tbl = st_init_numtable();
|
|
|
|
rb_class_tbl = st_init_numtable();
|
2008-06-09 05:25:32 -04:00
|
|
|
CONST_ID(autoload, "__autoload__");
|
|
|
|
CONST_ID(classpath, "__classpath__");
|
|
|
|
CONST_ID(tmp_classpath, "__tmp_classpath__");
|
1998-01-16 07:13:05 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
struct fc_result {
|
|
|
|
ID name;
|
1998-01-16 07:19:22 -05:00
|
|
|
VALUE klass;
|
1998-01-16 07:13:05 -05:00
|
|
|
VALUE path;
|
|
|
|
VALUE track;
|
|
|
|
struct fc_result *prev;
|
|
|
|
};
|
|
|
|
|
2001-06-06 02:42:23 -04:00
|
|
|
static VALUE
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
fc_path(struct fc_result *fc, ID name)
|
2001-06-06 02:42:23 -04:00
|
|
|
{
|
|
|
|
VALUE path, tmp;
|
|
|
|
|
2007-12-24 11:38:44 -05:00
|
|
|
path = rb_str_dup(rb_id2str(name));
|
2001-06-06 02:42:23 -04:00
|
|
|
while (fc) {
|
|
|
|
if (fc->track == rb_cObject) break;
|
2007-09-28 02:21:46 -04:00
|
|
|
if (RCLASS_IV_TBL(fc->track) &&
|
|
|
|
st_lookup(RCLASS_IV_TBL(fc->track), classpath, &tmp)) {
|
2001-06-06 02:42:23 -04:00
|
|
|
tmp = rb_str_dup(tmp);
|
|
|
|
rb_str_cat2(tmp, "::");
|
|
|
|
rb_str_append(tmp, path);
|
2007-06-07 04:21:01 -04:00
|
|
|
path = tmp;
|
|
|
|
break;
|
2001-06-06 02:42:23 -04:00
|
|
|
}
|
2007-12-24 11:38:44 -05:00
|
|
|
tmp = rb_str_dup(rb_id2str(fc->name));
|
2001-06-06 02:42:23 -04:00
|
|
|
rb_str_cat2(tmp, "::");
|
|
|
|
rb_str_append(tmp, path);
|
|
|
|
path = tmp;
|
|
|
|
fc = fc->prev;
|
|
|
|
}
|
2007-06-07 04:21:01 -04:00
|
|
|
OBJ_FREEZE(path);
|
2001-06-06 02:42:23 -04:00
|
|
|
return path;
|
|
|
|
}
|
|
|
|
|
1998-01-16 07:13:05 -05:00
|
|
|
static int
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
fc_i(ID key, VALUE value, struct fc_result *res)
|
1998-01-16 07:13:05 -05:00
|
|
|
{
|
1999-12-14 01:50:43 -05:00
|
|
|
if (!rb_is_const_id(key)) return ST_CONTINUE;
|
1998-01-16 07:13:05 -05:00
|
|
|
|
1998-01-16 07:19:22 -05:00
|
|
|
if (value == res->klass) {
|
2001-06-06 02:42:23 -04:00
|
|
|
res->path = fc_path(res, key);
|
1998-01-16 07:13:05 -05:00
|
|
|
return ST_STOP;
|
|
|
|
}
|
2001-06-06 02:42:23 -04:00
|
|
|
switch (TYPE(value)) {
|
|
|
|
case T_MODULE:
|
|
|
|
case T_CLASS:
|
2007-09-28 02:21:46 -04:00
|
|
|
if (!RCLASS_IV_TBL(value)) return ST_CONTINUE;
|
2001-06-06 02:42:23 -04:00
|
|
|
else {
|
|
|
|
struct fc_result arg;
|
|
|
|
struct fc_result *list;
|
|
|
|
|
|
|
|
list = res;
|
|
|
|
while (list) {
|
|
|
|
if (list->track == value) return ST_CONTINUE;
|
|
|
|
list = list->prev;
|
|
|
|
}
|
|
|
|
|
|
|
|
arg.name = key;
|
|
|
|
arg.path = 0;
|
|
|
|
arg.klass = res->klass;
|
|
|
|
arg.track = value;
|
|
|
|
arg.prev = res;
|
2007-09-28 02:21:46 -04:00
|
|
|
st_foreach(RCLASS_IV_TBL(value), fc_i, (st_data_t)&arg);
|
2001-06-06 02:42:23 -04:00
|
|
|
if (arg.path) {
|
|
|
|
res->path = arg.path;
|
|
|
|
return ST_STOP;
|
|
|
|
}
|
1998-01-16 07:13:05 -05:00
|
|
|
}
|
2001-06-06 02:42:23 -04:00
|
|
|
break;
|
1998-01-16 07:13:05 -05:00
|
|
|
|
2001-06-06 02:42:23 -04:00
|
|
|
default:
|
|
|
|
break;
|
1998-01-16 07:13:05 -05:00
|
|
|
}
|
|
|
|
return ST_CONTINUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static VALUE
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
find_class_path(VALUE klass)
|
1998-01-16 07:13:05 -05:00
|
|
|
{
|
|
|
|
struct fc_result arg;
|
|
|
|
|
|
|
|
arg.name = 0;
|
|
|
|
arg.path = 0;
|
1999-01-19 23:59:39 -05:00
|
|
|
arg.klass = klass;
|
|
|
|
arg.track = rb_cObject;
|
1998-01-16 07:13:05 -05:00
|
|
|
arg.prev = 0;
|
2007-09-28 02:21:46 -04:00
|
|
|
if (RCLASS_IV_TBL(rb_cObject)) {
|
|
|
|
st_foreach_safe(RCLASS_IV_TBL(rb_cObject), fc_i, (st_data_t)&arg);
|
1998-01-16 07:13:05 -05:00
|
|
|
}
|
2001-06-06 02:42:23 -04:00
|
|
|
if (arg.path == 0) {
|
2004-09-29 01:15:33 -04:00
|
|
|
st_foreach_safe(rb_class_tbl, fc_i, (st_data_t)&arg);
|
1998-01-16 07:13:05 -05:00
|
|
|
}
|
2001-06-06 02:42:23 -04:00
|
|
|
if (arg.path) {
|
2007-09-28 02:21:46 -04:00
|
|
|
if (!RCLASS_IV_TBL(klass)) {
|
|
|
|
RCLASS_IV_TBL(klass) = st_init_numtable();
|
* eval.c (ev_const_defined, ev_const_get), variable.c
(rb_const_get_at, rb_const_get, rb_mod_remove_const): use Qundef
as autoload marker. [ruby-dev:18103], [ruby-dev:18184]
* eval.c (rb_mod_autoload, rb_mod_autoload_p): new method;
Module#autoload, Module#autoload?.
* variable.c (rb_autoload, rb_autoload_load, rb_autoload_p):
manage autoload constants per classes/modules.
* variable.c (rb_const_defined_at, rb_const_defined): return false
for autoloading constants.
* class.c (rb_define_class, rb_define_module), eval.c (rb_eval),
variable.c (rb_mod_const_at, rb_const_assign): removed autoload
stuff.
* intern.h: prototypes; rb_autoload, rb_autoload_load,
rb_autoload_p.
* lib/optparse.rb (OptionParser::Switch::PlacedArgument::parse):
do not treat unmatched argument as an option.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3874 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2003-05-28 20:11:11 -04:00
|
|
|
}
|
2007-09-28 02:21:46 -04:00
|
|
|
st_insert(RCLASS_IV_TBL(klass), classpath, arg.path);
|
|
|
|
st_delete(RCLASS_IV_TBL(klass), &tmp_classpath, 0);
|
1998-01-16 07:13:05 -05:00
|
|
|
return arg.path;
|
|
|
|
}
|
|
|
|
return Qnil;
|
|
|
|
}
|
|
|
|
|
|
|
|
static VALUE
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
classname(VALUE klass)
|
1998-01-16 07:13:05 -05:00
|
|
|
{
|
1999-08-13 01:45:20 -04:00
|
|
|
VALUE path = Qnil;
|
1998-01-16 07:13:05 -05:00
|
|
|
|
1999-01-19 23:59:39 -05:00
|
|
|
if (!klass) klass = rb_cObject;
|
2007-09-28 02:21:46 -04:00
|
|
|
if (RCLASS_IV_TBL(klass)) {
|
|
|
|
if (!st_lookup(RCLASS_IV_TBL(klass), classpath, &path)) {
|
2008-06-09 05:25:32 -04:00
|
|
|
ID classid;
|
|
|
|
|
|
|
|
CONST_ID(classid, "__classid__");
|
1999-01-19 23:59:39 -05:00
|
|
|
|
2007-09-28 02:21:46 -04:00
|
|
|
if (!st_lookup(RCLASS_IV_TBL(klass), classid, &path)) {
|
2003-08-02 01:02:43 -04:00
|
|
|
return find_class_path(klass);
|
2003-04-10 04:37:12 -04:00
|
|
|
}
|
2007-12-24 11:38:44 -05:00
|
|
|
path = rb_str_dup(rb_id2str(SYM2ID(path)));
|
2007-06-07 04:21:01 -04:00
|
|
|
OBJ_FREEZE(path);
|
2007-09-28 02:21:46 -04:00
|
|
|
st_insert(RCLASS_IV_TBL(klass), classpath, path);
|
|
|
|
st_delete(RCLASS_IV_TBL(klass), (st_data_t*)&classid, 0);
|
1998-01-16 07:13:05 -05:00
|
|
|
}
|
2003-04-10 04:37:12 -04:00
|
|
|
if (TYPE(path) != T_STRING) {
|
|
|
|
rb_bug("class path is not set properly");
|
1998-01-16 07:13:05 -05:00
|
|
|
}
|
|
|
|
return path;
|
|
|
|
}
|
2003-08-02 01:02:43 -04:00
|
|
|
return find_class_path(klass);
|
1998-01-16 07:13:05 -05:00
|
|
|
}
|
|
|
|
|
2003-12-28 01:33:07 -05:00
|
|
|
/*
|
|
|
|
* call-seq:
|
|
|
|
* mod.name => string
|
|
|
|
*
|
2006-06-21 22:49:28 -04:00
|
|
|
* Returns the name of the module <i>mod</i>. Returns nil for anonymous modules.
|
2003-12-28 01:33:07 -05:00
|
|
|
*/
|
|
|
|
|
1998-01-16 07:13:05 -05:00
|
|
|
VALUE
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
rb_mod_name(VALUE mod)
|
1998-01-16 07:19:22 -05:00
|
|
|
{
|
2002-02-04 03:09:14 -05:00
|
|
|
VALUE path = classname(mod);
|
1998-01-16 07:19:22 -05:00
|
|
|
|
2003-04-10 04:37:12 -04:00
|
|
|
if (!NIL_P(path)) return rb_str_dup(path);
|
2006-06-21 22:49:28 -04:00
|
|
|
return path;
|
1998-01-16 07:19:22 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
VALUE
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
rb_class_path(VALUE klass)
|
1998-01-16 07:13:05 -05:00
|
|
|
{
|
2002-02-04 03:09:14 -05:00
|
|
|
VALUE path = classname(klass);
|
1998-01-16 07:13:05 -05:00
|
|
|
|
2003-04-10 04:37:12 -04:00
|
|
|
if (!NIL_P(path)) return path;
|
2007-09-28 02:21:46 -04:00
|
|
|
if (RCLASS_IV_TBL(klass) && st_lookup(RCLASS_IV_TBL(klass),
|
2003-08-02 01:02:43 -04:00
|
|
|
tmp_classpath, &path)) {
|
|
|
|
return path;
|
|
|
|
}
|
1998-01-16 07:13:05 -05:00
|
|
|
else {
|
* sprintf.c (rb_str_format): allow %c to print one character
string (e.g. ?x).
* lib/tempfile.rb (Tempfile::make_tmpname): put dot between
basename and pid. [ruby-talk:196272]
* parse.y (do_block): remove -> style block.
* parse.y (parser_yylex): remove tLAMBDA_ARG.
* eval.c (rb_call0): binding for the return event hook should have
consistent scope. [ruby-core:07928]
* eval.c (proc_invoke): return behavior should depend whether it
is surrounded by a lambda or a mere block.
* eval.c (formal_assign): handles post splat arguments.
* eval.c (rb_call0): ditto.
* st.c (strhash): use FNV-1a hash.
* parse.y (parser_yylex): removed experimental ';;' terminator.
* eval.c (rb_node_arity): should be aware of post splat arguments.
* eval.c (rb_proc_arity): ditto.
* parse.y (f_args): syntax rule enhanced to support arguments
after the splat.
* parse.y (block_param): ditto for block parameters.
* parse.y (f_post_arg): mandatory formal arguments after the splat
argument.
* parse.y (new_args_gen): generate nodes for mandatory formal
arguments after the splat argument.
* eval.c (rb_eval): dispatch mandatory formal arguments after the
splat argument.
* parse.y (args): allow more than one splat in the argument list.
* parse.y (method_call): allow aref [] to accept all kind of
method argument, including assocs, splat, and block argument.
* eval.c (SETUP_ARGS0): prepare block argument as well.
* lib/mathn.rb (Integer): remove Integer#gcd2. [ruby-core:07931]
* eval.c (error_line): print receivers true/false/nil specially.
* eval.c (rb_proc_yield): handles parameters in yield semantics.
* eval.c (nil_yield): gives LocalJumpError to denote no block
error.
* io.c (rb_io_getc): now takes one-character string.
* string.c (rb_str_hash): use FNV-1a hash from Fowler/Noll/Vo
hashing algorithm.
* string.c (rb_str_aref): str[0] now returns 1 character string,
instead of a fixnum. [Ruby2]
* parse.y (parser_yylex): ?c now returns 1 character string,
instead of a fixnum. [Ruby2]
* string.c (rb_str_aset): no longer support fixnum insertion.
* eval.c (umethod_bind): should not update original class.
[ruby-dev:28636]
* eval.c (ev_const_get): should support constant access from
within instance_eval(). [ruby-dev:28327]
* time.c (time_timeval): should round for usec floating
number. [ruby-core:07896]
* time.c (time_add): ditto.
* dir.c (sys_warning): should not call a vararg function
rb_sys_warning() indirectly. [ruby-core:07886]
* numeric.c (flo_divmod): the first element of Float#divmod should
be an integer. [ruby-dev:28589]
* test/ruby/test_float.rb: add tests for divmod, div, modulo and remainder.
* re.c (rb_reg_initialize): should not allow modifying literal
regexps. frozen check moved from rb_reg_initialize_m as well.
* re.c (rb_reg_initialize): should not modify untainted objects in
safe levels higher than 3.
* re.c (rb_memcmp): type change from char* to const void*.
* dir.c (dir_close): should not close untainted dir stream.
* dir.c (GetDIR): add tainted/frozen check for each dir operation.
* lib/rdoc/parsers/parse_rb.rb (RDoc::RubyParser::parse_symbol_arg):
typo fixed. a patch from Florian Gross <florg at florg.net>.
* eval.c (EXEC_EVENT_HOOK): trace_func may remove itself from
event_hooks. no guarantee for arbitrary hook deletion.
[ruby-dev:28632]
* util.c (ruby_strtod): differ addition to minimize error.
[ruby-dev:28619]
* util.c (ruby_strtod): should not raise ERANGE when the input
string does not have any digits. [ruby-dev:28629]
* eval.c (proc_invoke): should restore old ruby_frame->block.
thanks to ts <decoux at moulon.inra.fr>. [ruby-core:07833]
also fix [ruby-dev:28614] as well.
* signal.c (trap): sig should be less then NSIG. Coverity found
this bug. a patch from Kevin Tew <tewk at tewk.com>.
[ruby-core:07823]
* math.c (math_log2): add new method inspired by
[ruby-talk:191237].
* math.c (math_log): add optional base argument to Math::log().
[ruby-talk:191308]
* ext/syck/emitter.c (syck_scan_scalar): avoid accessing
uninitialized array element. a patch from Pat Eyler
<rubypate at gmail.com>. [ruby-core:07809]
* array.c (rb_ary_fill): initialize local variables first. a
patch from Pat Eyler <rubypate at gmail.com>. [ruby-core:07810]
* ext/syck/yaml2byte.c (syck_yaml2byte_handler): need to free
type_tag. a patch from Pat Eyler <rubypate at gmail.com>.
[ruby-core:07808]
* ext/socket/socket.c (make_hostent_internal): accept ai_family
check from Sam Roberts <sroberts at uniserve.com>.
[ruby-core:07691]
* util.c (ruby_strtod): should not cut off 18 digits for no
reason. [ruby-core:07796]
* array.c (rb_ary_fill): internalize local variable "beg" to
pacify Coverity. [ruby-core:07770]
* pack.c (pack_unpack): now supports CRLF newlines. a patch from
<tommy at tmtm.org>. [ruby-dev:28601]
* applied code clean-up patch from Stefan Huehner
<stefan at huehner.org>. [ruby-core:07764]
* lib/jcode.rb (String::tr_s): should have translated non
squeezing character sequence (i.e. a character) as well. thanks
to Hiroshi Ichikawa <gimite at gimite.ddo.jp> [ruby-list:42090]
* ext/socket/socket.c: document update patch from Sam Roberts
<sroberts at uniserve.com>. [ruby-core:07701]
* lib/mathn.rb (Integer): need not to remove gcd2. a patch from
NARUSE, Yui <naruse at airemix.com>. [ruby-dev:28570]
* parse.y (arg): too much NEW_LIST()
* eval.c (SETUP_ARGS0): remove unnecessary access to nd_alen.
* eval.c (rb_eval): use ARGSCAT for NODE_OP_ASGN1.
[ruby-dev:28585]
* parse.y (arg): use NODE_ARGSCAT for placeholder.
* lib/getoptlong.rb (GetoptLong::get): RDoc update patch from
mathew <meta at pobox.com>. [ruby-core:07738]
* variable.c (rb_const_set): raise error when no target klass is
supplied. [ruby-dev:28582]
* prec.c (prec_prec_f): documentation patch from
<gerardo.santana at gmail.com>. [ruby-core:07689]
* bignum.c (rb_big_pow): second operand may be too big even if
it's a Fixnum. [ruby-talk:187984]
* README.EXT: update symbol description. [ruby-talk:188104]
* COPYING: explicitly note GPLv2. [ruby-talk:187922]
* parse.y: remove some obsolete syntax rules (unparenthesized
method calls in argument list).
* eval.c (rb_call0): insecure calling should be checked for non
NODE_SCOPE method invocations too.
* eval.c (rb_alias): should preserve the current safe level as
well as method definition.
* process.c (rb_f_sleep): remove RDoc description about SIGALRM
which is not valid on the current implementation. [ruby-dev:28464]
Thu Mar 23 21:40:47 2006 K.Kosako <sndgk393 AT ybb.ne.jp>
* eval.c (method_missing): should support argument splat in
super. a bug in combination of super, splat and
method_missing. [ruby-talk:185438]
* configure.in: Solaris SunPro compiler -rapth patch from
<kuwa at labs.fujitsu.com>. [ruby-dev:28443]
* configure.in: remove enable_rpath=no for Solaris.
[ruby-dev:28440]
* ext/win32ole/win32ole.c (ole_val2olevariantdata): change behavior
of converting OLE Variant object with VT_ARRAY|VT_UI1 and Ruby
String object.
* ruby.1: a clarification patch from David Lutterkort
<dlutter at redhat.com>. [ruby-core:7508]
* lib/rdoc/ri/ri_paths.rb (RI::Paths): adding paths from rubygems
directories. a patch from Eric Hodel <drbrain at segment7.net>.
[ruby-core:07423]
* eval.c (rb_clear_cache_by_class): clearing wrong cache.
* ext/extmk.rb: use :remove_destination to install extension libraries
to avoid SEGV. [ruby-dev:28417]
* eval.c (rb_thread_fd_writable): should not re-schedule output
from KILLED thread (must be error printing).
* array.c (rb_ary_flatten_bang): allow specifying recursion
level. [ruby-talk:182170]
* array.c (rb_ary_flatten): ditto.
* gc.c (add_heap): a heap_slots may overflow. a patch from Stefan
Weil <weil at mail.berlios.de>.
* eval.c (rb_call): use separate cache for fcall/vcall
invocation.
* eval.c (rb_eval): NODE_FCALL, NODE_VCALL can call local
functions.
* eval.c (rb_mod_local): a new method to specify newly added
visibility "local".
* eval.c (search_method): search for local methods which are
visible only from the current class.
* class.c (rb_class_local_methods): a method to list local methods.
* object.c (Init_Object): add BasicObject class as a top level
BlankSlate class.
* ruby.h (SYM2ID): should not cast to signed long.
[ruby-core:07414]
* class.c (rb_include_module): allow module duplication.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@10235 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2006-06-09 17:20:17 -04:00
|
|
|
const char *s = "Class";
|
1998-01-16 07:13:05 -05:00
|
|
|
|
2001-10-03 03:19:19 -04:00
|
|
|
if (TYPE(klass) == T_MODULE) {
|
2002-08-28 10:59:01 -04:00
|
|
|
if (rb_obj_class(klass) == rb_cModule) {
|
2001-10-03 03:19:19 -04:00
|
|
|
s = "Module";
|
2002-08-28 10:59:01 -04:00
|
|
|
}
|
|
|
|
else {
|
2001-10-03 03:19:19 -04:00
|
|
|
s = rb_class2name(RBASIC(klass)->klass);
|
2002-08-28 10:59:01 -04:00
|
|
|
}
|
2001-10-03 03:19:19 -04:00
|
|
|
}
|
2006-09-17 21:59:00 -04:00
|
|
|
path = rb_sprintf("#<%s:%p>", s, (void*)klass);
|
2007-06-07 04:21:01 -04:00
|
|
|
OBJ_FREEZE(path);
|
2003-08-02 01:02:43 -04:00
|
|
|
rb_ivar_set(klass, tmp_classpath, path);
|
2002-08-28 10:59:01 -04:00
|
|
|
|
2003-04-10 04:37:12 -04:00
|
|
|
return path;
|
1998-01-16 07:13:05 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
rb_set_class_path(VALUE klass, VALUE under, const char *name)
|
1998-01-16 07:13:05 -05:00
|
|
|
{
|
|
|
|
VALUE str;
|
|
|
|
|
1999-01-19 23:59:39 -05:00
|
|
|
if (under == rb_cObject) {
|
|
|
|
str = rb_str_new2(name);
|
1998-01-16 07:13:05 -05:00
|
|
|
}
|
|
|
|
else {
|
1999-01-19 23:59:39 -05:00
|
|
|
str = rb_str_dup(rb_class_path(under));
|
2000-04-10 01:48:43 -04:00
|
|
|
rb_str_cat2(str, "::");
|
|
|
|
rb_str_cat2(str, name);
|
1998-01-16 07:13:05 -05:00
|
|
|
}
|
2007-06-07 04:21:01 -04:00
|
|
|
OBJ_FREEZE(str);
|
2003-08-02 01:02:43 -04:00
|
|
|
rb_ivar_set(klass, classpath, str);
|
1998-01-16 07:13:05 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
VALUE
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
rb_path2class(const char *path)
|
1998-01-16 07:13:05 -05:00
|
|
|
{
|
2002-09-05 05:42:56 -04:00
|
|
|
const char *pbeg, *p;
|
|
|
|
ID id;
|
|
|
|
VALUE c = rb_cObject;
|
1999-11-29 01:33:02 -05:00
|
|
|
|
1998-01-16 07:13:05 -05:00
|
|
|
if (path[0] == '#') {
|
1999-01-19 23:59:39 -05:00
|
|
|
rb_raise(rb_eArgError, "can't retrieve anonymous class %s", path);
|
1998-01-16 07:13:05 -05:00
|
|
|
}
|
2002-09-05 05:42:56 -04:00
|
|
|
pbeg = p = path;
|
|
|
|
while (*p) {
|
|
|
|
while (*p && *p != ':') p++;
|
2007-06-17 11:56:36 -04:00
|
|
|
id = rb_intern2(pbeg, p-pbeg);
|
2002-09-05 05:42:56 -04:00
|
|
|
if (p[0] == ':') {
|
|
|
|
if (p[1] != ':') goto undefined_class;
|
|
|
|
p += 2;
|
|
|
|
pbeg = p;
|
|
|
|
}
|
|
|
|
if (!rb_const_defined(c, id)) {
|
|
|
|
undefined_class:
|
2008-07-01 06:36:22 -04:00
|
|
|
rb_raise(rb_eArgError, "undefined class/module %.*s", (int)(p-path), path);
|
2002-09-05 05:42:56 -04:00
|
|
|
}
|
|
|
|
c = rb_const_get_at(c, id);
|
|
|
|
switch (TYPE(c)) {
|
|
|
|
case T_MODULE:
|
|
|
|
case T_CLASS:
|
|
|
|
break;
|
|
|
|
default:
|
2002-10-23 04:20:35 -04:00
|
|
|
rb_raise(rb_eTypeError, "%s does not refer class/module", path);
|
2002-09-05 05:42:56 -04:00
|
|
|
}
|
1999-11-29 01:33:02 -05:00
|
|
|
}
|
2002-09-05 05:42:56 -04:00
|
|
|
|
1999-11-29 01:33:02 -05:00
|
|
|
return c;
|
1998-01-16 07:13:05 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
rb_name_class(VALUE klass, ID id)
|
1998-01-16 07:13:05 -05:00
|
|
|
{
|
2000-04-10 01:48:43 -04:00
|
|
|
rb_iv_set(klass, "__classid__", ID2SYM(id));
|
1998-01-16 07:13:05 -05:00
|
|
|
}
|
|
|
|
|
2004-01-19 04:19:31 -05:00
|
|
|
VALUE
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
rb_class_name(VALUE klass)
|
2004-01-19 04:19:31 -05:00
|
|
|
{
|
|
|
|
return rb_class_path(rb_class_real(klass));
|
|
|
|
}
|
|
|
|
|
2008-05-31 05:28:20 -04:00
|
|
|
const char *
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
rb_class2name(VALUE klass)
|
1998-01-16 07:13:05 -05:00
|
|
|
{
|
2006-08-31 06:47:44 -04:00
|
|
|
return RSTRING_PTR(rb_class_name(klass));
|
1998-01-16 07:13:05 -05:00
|
|
|
}
|
|
|
|
|
2008-05-31 05:28:20 -04:00
|
|
|
const char *
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
rb_obj_classname(VALUE obj)
|
2003-01-30 23:00:17 -05:00
|
|
|
{
|
2003-01-30 23:16:51 -05:00
|
|
|
return rb_class2name(CLASS_OF(obj));
|
2003-01-30 23:00:17 -05:00
|
|
|
}
|
|
|
|
|
1998-01-16 07:13:05 -05:00
|
|
|
struct trace_var {
|
1998-01-16 07:19:22 -05:00
|
|
|
int removed;
|
1998-01-16 07:13:05 -05:00
|
|
|
void (*func)();
|
2001-03-18 22:20:24 -05:00
|
|
|
VALUE data;
|
1998-01-16 07:13:05 -05:00
|
|
|
struct trace_var *next;
|
|
|
|
};
|
|
|
|
|
2001-10-22 12:20:14 -04:00
|
|
|
struct global_variable {
|
|
|
|
int counter;
|
1998-01-16 07:13:05 -05:00
|
|
|
void *data;
|
|
|
|
VALUE (*getter)();
|
|
|
|
void (*setter)();
|
|
|
|
void (*marker)();
|
|
|
|
int block_trace;
|
|
|
|
struct trace_var *trace;
|
|
|
|
};
|
|
|
|
|
2001-10-22 12:20:14 -04:00
|
|
|
struct global_entry {
|
|
|
|
struct global_variable *var;
|
|
|
|
ID id;
|
|
|
|
};
|
|
|
|
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
static VALUE undef_getter(ID id);
|
|
|
|
static void undef_setter(VALUE val, ID id, void *data, struct global_variable *var);
|
|
|
|
static void undef_marker(void);
|
1998-01-16 07:13:05 -05:00
|
|
|
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
static VALUE val_getter(ID id, VALUE val);
|
|
|
|
static void val_setter(VALUE val, ID id, void *data, struct global_variable *var);
|
|
|
|
static void val_marker(VALUE data);
|
1998-01-16 07:13:05 -05:00
|
|
|
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
static VALUE var_getter(ID id, VALUE *var);
|
|
|
|
static void var_setter(VALUE val, ID id, VALUE *var);
|
|
|
|
static void var_marker(VALUE *var);
|
1998-01-16 07:13:05 -05:00
|
|
|
|
|
|
|
struct global_entry*
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
rb_global_entry(ID id)
|
1998-01-16 07:13:05 -05:00
|
|
|
{
|
|
|
|
struct global_entry *entry;
|
* variable.c (rb_global_entry, rb_f_untrace_var, rb_alias_variable,
rb_generic_ivar_table, generic_ivar_get, generic_ivar_set,
generic_ivar_defined, generic_ivar_remove, rb_mark_generic_ivar,
rb_free_generic_ivar, rb_copy_generic_ivar,
rb_obj_instance_variables): suppress warnings.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12563 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-06-17 12:12:32 -04:00
|
|
|
st_data_t data;
|
1998-01-16 07:13:05 -05:00
|
|
|
|
* variable.c (rb_global_entry, rb_f_untrace_var, rb_alias_variable,
rb_generic_ivar_table, generic_ivar_get, generic_ivar_set,
generic_ivar_defined, generic_ivar_remove, rb_mark_generic_ivar,
rb_free_generic_ivar, rb_copy_generic_ivar,
rb_obj_instance_variables): suppress warnings.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12563 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-06-17 12:12:32 -04:00
|
|
|
if (!st_lookup(rb_global_tbl, id, &data)) {
|
2001-10-22 12:20:14 -04:00
|
|
|
struct global_variable *var;
|
1998-01-16 07:13:05 -05:00
|
|
|
entry = ALLOC(struct global_entry);
|
2001-10-22 12:20:14 -04:00
|
|
|
var = ALLOC(struct global_variable);
|
1998-01-16 07:13:05 -05:00
|
|
|
entry->id = id;
|
2001-10-22 12:20:14 -04:00
|
|
|
entry->var = var;
|
|
|
|
var->counter = 1;
|
|
|
|
var->data = 0;
|
|
|
|
var->getter = undef_getter;
|
|
|
|
var->setter = undef_setter;
|
|
|
|
var->marker = undef_marker;
|
1998-01-16 07:13:05 -05:00
|
|
|
|
2001-10-22 12:20:14 -04:00
|
|
|
var->block_trace = 0;
|
|
|
|
var->trace = 0;
|
* st.h, st.c: Introduce new conventional typedef's, st_data_t,
st_compare_func_t, st_hash_func_t and st_each_func_t.
* st.h, st.c: Do explicit function declarations and do not rely on
implicit declarations. On such platforms as IA64, int argument
values are NOT automatically promoted to long (64bit) values, so
explicit declarations are mandatory for those functions that
take long values or pointers. This fixes miniruby's coredump on
FreeBSD/IA64.
* class.c, eval.c, gc.c, hash.c, marshal.c, parse.y, variable.c:
Add proper casts to avoid warnings.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3303 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2003-01-06 10:55:43 -05:00
|
|
|
st_add_direct(rb_global_tbl, id, (st_data_t)entry);
|
1998-01-16 07:13:05 -05:00
|
|
|
}
|
* variable.c (rb_global_entry, rb_f_untrace_var, rb_alias_variable,
rb_generic_ivar_table, generic_ivar_get, generic_ivar_set,
generic_ivar_defined, generic_ivar_remove, rb_mark_generic_ivar,
rb_free_generic_ivar, rb_copy_generic_ivar,
rb_obj_instance_variables): suppress warnings.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12563 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-06-17 12:12:32 -04:00
|
|
|
else {
|
|
|
|
entry = (struct global_entry *)data;
|
|
|
|
}
|
1998-01-16 07:13:05 -05:00
|
|
|
return entry;
|
|
|
|
}
|
|
|
|
|
|
|
|
static VALUE
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
undef_getter(ID id)
|
1998-01-16 07:13:05 -05:00
|
|
|
{
|
2002-04-11 06:03:01 -04:00
|
|
|
rb_warning("global variable `%s' not initialized", rb_id2name(id));
|
|
|
|
|
1998-01-16 07:13:05 -05:00
|
|
|
return Qnil;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
undef_setter(VALUE val, ID id, void *data, struct global_variable *var)
|
1998-01-16 07:13:05 -05:00
|
|
|
{
|
2001-10-22 12:20:14 -04:00
|
|
|
var->getter = val_getter;
|
|
|
|
var->setter = val_setter;
|
|
|
|
var->marker = val_marker;
|
1998-01-16 07:13:05 -05:00
|
|
|
|
2001-10-22 12:20:14 -04:00
|
|
|
var->data = (void*)val;
|
1998-01-16 07:13:05 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
undef_marker(void)
|
1998-01-16 07:13:05 -05:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
static VALUE
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
val_getter(ID id, VALUE val)
|
1998-01-16 07:13:05 -05:00
|
|
|
{
|
|
|
|
return val;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
val_setter(VALUE val, ID id, void *data, struct global_variable *var)
|
1998-01-16 07:13:05 -05:00
|
|
|
{
|
2001-10-22 12:20:14 -04:00
|
|
|
var->data = (void*)val;
|
1998-01-16 07:13:05 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
val_marker(VALUE data)
|
1998-01-16 07:13:05 -05:00
|
|
|
{
|
1999-01-19 23:59:39 -05:00
|
|
|
if (data) rb_gc_mark_maybe(data);
|
1998-01-16 07:13:05 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
static VALUE
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
var_getter(ID id, VALUE *var)
|
1998-01-16 07:13:05 -05:00
|
|
|
{
|
2001-11-13 03:19:52 -05:00
|
|
|
if (!var) return Qnil;
|
1998-01-16 07:13:05 -05:00
|
|
|
return *var;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
var_setter(VALUE val, ID id, VALUE *var)
|
1998-01-16 07:13:05 -05:00
|
|
|
{
|
|
|
|
*var = val;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
var_marker(VALUE *var)
|
1998-01-16 07:13:05 -05:00
|
|
|
{
|
1999-01-19 23:59:39 -05:00
|
|
|
if (var) rb_gc_mark_maybe(*var);
|
1998-01-16 07:13:05 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
readonly_setter(VALUE val, ID id, void *var)
|
1998-01-16 07:13:05 -05:00
|
|
|
{
|
2003-05-15 00:20:31 -04:00
|
|
|
rb_name_error(id, "%s is a read-only variable", rb_id2name(id));
|
1998-01-16 07:13:05 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
mark_global_entry(ID key, struct global_entry *entry)
|
1998-01-16 07:13:05 -05:00
|
|
|
{
|
|
|
|
struct trace_var *trace;
|
2001-10-22 12:20:14 -04:00
|
|
|
struct global_variable *var = entry->var;
|
1998-01-16 07:13:05 -05:00
|
|
|
|
2001-10-22 12:20:14 -04:00
|
|
|
(*var->marker)(var->data);
|
|
|
|
trace = var->trace;
|
1998-01-16 07:13:05 -05:00
|
|
|
while (trace) {
|
1999-01-19 23:59:39 -05:00
|
|
|
if (trace->data) rb_gc_mark_maybe(trace->data);
|
1998-01-16 07:13:05 -05:00
|
|
|
trace = trace->next;
|
|
|
|
}
|
|
|
|
return ST_CONTINUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
rb_gc_mark_global_tbl(void)
|
1998-01-16 07:13:05 -05:00
|
|
|
{
|
2007-06-14 04:35:20 -04:00
|
|
|
if (rb_global_tbl)
|
|
|
|
st_foreach_safe(rb_global_tbl, mark_global_entry, 0);
|
1998-01-16 07:13:05 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
static ID
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
global_id(const char *name)
|
1998-01-16 07:13:05 -05:00
|
|
|
{
|
|
|
|
ID id;
|
|
|
|
|
|
|
|
if (name[0] == '$') id = rb_intern(name);
|
|
|
|
else {
|
|
|
|
char *buf = ALLOCA_N(char, strlen(name)+2);
|
|
|
|
buf[0] = '$';
|
|
|
|
strcpy(buf+1, name);
|
|
|
|
id = rb_intern(buf);
|
|
|
|
}
|
|
|
|
return id;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
rb_define_hooked_variable(
|
|
|
|
const char *name,
|
|
|
|
VALUE *var,
|
2005-10-19 22:56:22 -04:00
|
|
|
VALUE (*getter)(ANYARGS),
|
|
|
|
void (*setter)(ANYARGS))
|
1998-01-16 07:13:05 -05:00
|
|
|
{
|
2001-10-22 12:20:14 -04:00
|
|
|
struct global_variable *gvar;
|
2008-05-02 10:57:23 -04:00
|
|
|
ID id;
|
|
|
|
VALUE tmp;
|
|
|
|
|
|
|
|
if (var)
|
|
|
|
tmp = *var;
|
1998-01-16 07:13:05 -05:00
|
|
|
|
2008-05-02 10:57:23 -04:00
|
|
|
id = global_id(name);
|
2001-10-22 12:20:14 -04:00
|
|
|
gvar = rb_global_entry(id)->var;
|
|
|
|
gvar->data = (void*)var;
|
|
|
|
gvar->getter = getter?getter:var_getter;
|
|
|
|
gvar->setter = setter?setter:var_setter;
|
|
|
|
gvar->marker = var_marker;
|
2008-05-02 10:57:23 -04:00
|
|
|
|
|
|
|
RB_GC_GUARD(tmp);
|
1998-01-16 07:13:05 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
rb_define_variable(const char *name, VALUE *var)
|
1998-01-16 07:13:05 -05:00
|
|
|
{
|
|
|
|
rb_define_hooked_variable(name, var, 0, 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
rb_define_readonly_variable(const char *name, VALUE *var)
|
1998-01-16 07:13:05 -05:00
|
|
|
{
|
|
|
|
rb_define_hooked_variable(name, var, 0, readonly_setter);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
rb_define_virtual_variable(
|
|
|
|
const char *name,
|
2005-10-19 22:56:22 -04:00
|
|
|
VALUE (*getter)(ANYARGS),
|
|
|
|
void (*setter)(ANYARGS))
|
1998-01-16 07:13:05 -05:00
|
|
|
{
|
|
|
|
if (!getter) getter = val_getter;
|
|
|
|
if (!setter) setter = readonly_setter;
|
|
|
|
rb_define_hooked_variable(name, 0, getter, setter);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
rb_trace_eval(VALUE cmd, VALUE val)
|
1998-01-16 07:13:05 -05:00
|
|
|
{
|
2001-11-13 03:19:52 -05:00
|
|
|
rb_eval_cmd(cmd, rb_ary_new3(1, val), 0);
|
1998-01-16 07:13:05 -05:00
|
|
|
}
|
|
|
|
|
2003-12-28 22:56:22 -05:00
|
|
|
/*
|
|
|
|
* call-seq:
|
|
|
|
* trace_var(symbol, cmd ) => nil
|
|
|
|
* trace_var(symbol) {|val| block } => nil
|
|
|
|
*
|
|
|
|
* Controls tracing of assignments to global variables. The parameter
|
|
|
|
* +symbol_ identifies the variable (as either a string name or a
|
|
|
|
* symbol identifier). _cmd_ (which may be a string or a
|
|
|
|
* +Proc+ object) or block is executed whenever the variable
|
|
|
|
* is assigned. The block or +Proc+ object receives the
|
|
|
|
* variable's new value as a parameter. Also see
|
|
|
|
* <code>Kernel::untrace_var</code>.
|
|
|
|
*
|
|
|
|
* trace_var :$_, proc {|v| puts "$_ is now '#{v}'" }
|
|
|
|
* $_ = "hello"
|
|
|
|
* $_ = ' there'
|
|
|
|
*
|
|
|
|
* <em>produces:</em>
|
|
|
|
*
|
|
|
|
* $_ is now 'hello'
|
|
|
|
* $_ is now ' there'
|
|
|
|
*/
|
|
|
|
|
1998-01-16 07:13:05 -05:00
|
|
|
VALUE
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
rb_f_trace_var(int argc, VALUE *argv)
|
1998-01-16 07:13:05 -05:00
|
|
|
{
|
|
|
|
VALUE var, cmd;
|
|
|
|
struct global_entry *entry;
|
|
|
|
struct trace_var *trace;
|
|
|
|
|
2001-11-13 03:19:52 -05:00
|
|
|
rb_secure(4);
|
1998-01-16 07:13:05 -05:00
|
|
|
if (rb_scan_args(argc, argv, "11", &var, &cmd) == 1) {
|
2003-06-16 03:14:50 -04:00
|
|
|
cmd = rb_block_proc();
|
1998-01-16 07:13:05 -05:00
|
|
|
}
|
|
|
|
if (NIL_P(cmd)) {
|
1999-01-19 23:59:39 -05:00
|
|
|
return rb_f_untrace_var(argc, argv);
|
1998-01-16 07:13:05 -05:00
|
|
|
}
|
2001-11-13 03:19:52 -05:00
|
|
|
entry = rb_global_entry(rb_to_id(var));
|
|
|
|
if (OBJ_TAINTED(cmd)) {
|
|
|
|
rb_raise(rb_eSecurityError, "Insecure: tainted variable trace");
|
1998-01-16 07:13:05 -05:00
|
|
|
}
|
|
|
|
trace = ALLOC(struct trace_var);
|
2001-10-22 12:20:14 -04:00
|
|
|
trace->next = entry->var->trace;
|
1998-01-16 07:13:05 -05:00
|
|
|
trace->func = rb_trace_eval;
|
2001-03-18 22:20:24 -05:00
|
|
|
trace->data = cmd;
|
1998-01-16 07:19:22 -05:00
|
|
|
trace->removed = 0;
|
2001-10-22 12:20:14 -04:00
|
|
|
entry->var->trace = trace;
|
1998-01-16 07:13:05 -05:00
|
|
|
|
|
|
|
return Qnil;
|
|
|
|
}
|
|
|
|
|
1998-01-16 07:19:22 -05:00
|
|
|
static void
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
remove_trace(struct global_variable *var)
|
1998-01-16 07:19:22 -05:00
|
|
|
{
|
2001-10-22 12:20:14 -04:00
|
|
|
struct trace_var *trace = var->trace;
|
1998-01-16 07:19:22 -05:00
|
|
|
struct trace_var t;
|
|
|
|
struct trace_var *next;
|
|
|
|
|
|
|
|
t.next = trace;
|
|
|
|
trace = &t;
|
|
|
|
while (trace->next) {
|
|
|
|
next = trace->next;
|
|
|
|
if (next->removed) {
|
|
|
|
trace->next = next->next;
|
* array.c, bignum.c, cont.c, dir.c, dln.c, encoding.c, enumerator.c,
enumerator.c (enumerator_allocate), eval_jump.c, file.c, hash.c,
io.c, load.c, pack.c, proc.c, random.c, re.c, ruby.c, st.c,
string.c, thread.c, thread_pthread.c, time.c, util.c, variable.c,
vm.c, gc.c:
allocated memory objects by xmalloc (ruby_xmalloc) should be
freed by xfree (ruby_xfree).
* ext/curses/curses.c, ext/dbm/dbm.c, ext/digest/digest.c,
ext/gdbm/gdbm.c, ext/json/ext/parser/parser.c,
ext/json/ext/parser/unicode.c, ext/openssl/ossl_cipher.c,
ext/openssl/ossl_hmac.c, ext/openssl/ossl_pkey_ec.c,
ext/sdbm/init.c, ext/strscan/strscan.c, ext/zlib/zlib.c:
ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@17017 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2008-06-08 06:01:40 -04:00
|
|
|
xfree(next);
|
1998-01-16 07:19:22 -05:00
|
|
|
}
|
2001-10-21 09:22:54 -04:00
|
|
|
else {
|
|
|
|
trace = next;
|
|
|
|
}
|
1998-01-16 07:19:22 -05:00
|
|
|
}
|
2001-10-22 12:20:14 -04:00
|
|
|
var->trace = t.next;
|
1998-01-16 07:19:22 -05:00
|
|
|
}
|
|
|
|
|
2003-12-28 22:56:22 -05:00
|
|
|
/*
|
|
|
|
* call-seq:
|
|
|
|
* untrace_var(symbol [, cmd] ) => array or nil
|
|
|
|
*
|
|
|
|
* Removes tracing for the specified command on the given global
|
|
|
|
* variable and returns +nil+. If no command is specified,
|
|
|
|
* removes all tracing for that variable and returns an array
|
|
|
|
* containing the commands actually removed.
|
|
|
|
*/
|
|
|
|
|
1998-01-16 07:13:05 -05:00
|
|
|
VALUE
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
rb_f_untrace_var(int argc, VALUE *argv)
|
1998-01-16 07:13:05 -05:00
|
|
|
{
|
|
|
|
VALUE var, cmd;
|
|
|
|
ID id;
|
|
|
|
struct global_entry *entry;
|
|
|
|
struct trace_var *trace;
|
* variable.c (rb_global_entry, rb_f_untrace_var, rb_alias_variable,
rb_generic_ivar_table, generic_ivar_get, generic_ivar_set,
generic_ivar_defined, generic_ivar_remove, rb_mark_generic_ivar,
rb_free_generic_ivar, rb_copy_generic_ivar,
rb_obj_instance_variables): suppress warnings.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12563 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-06-17 12:12:32 -04:00
|
|
|
st_data_t data;
|
1998-01-16 07:13:05 -05:00
|
|
|
|
2008-06-26 04:44:59 -04:00
|
|
|
rb_secure(4);
|
1998-01-16 07:13:05 -05:00
|
|
|
rb_scan_args(argc, argv, "11", &var, &cmd);
|
|
|
|
id = rb_to_id(var);
|
* variable.c (rb_global_entry, rb_f_untrace_var, rb_alias_variable,
rb_generic_ivar_table, generic_ivar_get, generic_ivar_set,
generic_ivar_defined, generic_ivar_remove, rb_mark_generic_ivar,
rb_free_generic_ivar, rb_copy_generic_ivar,
rb_obj_instance_variables): suppress warnings.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12563 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-06-17 12:12:32 -04:00
|
|
|
if (!st_lookup(rb_global_tbl, id, &data)) {
|
2001-07-02 04:46:28 -04:00
|
|
|
rb_name_error(id, "undefined global variable %s", rb_id2name(id));
|
1998-01-16 07:13:05 -05:00
|
|
|
}
|
1999-01-19 23:59:39 -05:00
|
|
|
|
* variable.c (rb_global_entry, rb_f_untrace_var, rb_alias_variable,
rb_generic_ivar_table, generic_ivar_get, generic_ivar_set,
generic_ivar_defined, generic_ivar_remove, rb_mark_generic_ivar,
rb_free_generic_ivar, rb_copy_generic_ivar,
rb_obj_instance_variables): suppress warnings.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12563 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-06-17 12:12:32 -04:00
|
|
|
trace = (entry = (struct global_entry *)data)->var->trace;
|
1998-01-16 07:13:05 -05:00
|
|
|
if (NIL_P(cmd)) {
|
1999-01-19 23:59:39 -05:00
|
|
|
VALUE ary = rb_ary_new();
|
1998-01-16 07:13:05 -05:00
|
|
|
|
|
|
|
while (trace) {
|
|
|
|
struct trace_var *next = trace->next;
|
1999-01-19 23:59:39 -05:00
|
|
|
rb_ary_push(ary, (VALUE)trace->data);
|
1998-01-16 07:19:22 -05:00
|
|
|
trace->removed = 1;
|
1998-01-16 07:13:05 -05:00
|
|
|
trace = next;
|
|
|
|
}
|
|
|
|
|
2001-10-22 12:20:14 -04:00
|
|
|
if (!entry->var->block_trace) remove_trace(entry->var);
|
1998-01-16 07:13:05 -05:00
|
|
|
return ary;
|
|
|
|
}
|
|
|
|
else {
|
1998-01-16 07:19:22 -05:00
|
|
|
while (trace) {
|
2001-03-18 22:20:24 -05:00
|
|
|
if (trace->data == cmd) {
|
1998-01-16 07:19:22 -05:00
|
|
|
trace->removed = 1;
|
2001-10-22 12:20:14 -04:00
|
|
|
if (!entry->var->block_trace) remove_trace(entry->var);
|
1999-01-19 23:59:39 -05:00
|
|
|
return rb_ary_new3(1, cmd);
|
1998-01-16 07:13:05 -05:00
|
|
|
}
|
1998-01-16 07:19:22 -05:00
|
|
|
trace = trace->next;
|
1998-01-16 07:13:05 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return Qnil;
|
|
|
|
}
|
2001-10-17 01:28:02 -04:00
|
|
|
|
1998-01-16 07:13:05 -05:00
|
|
|
VALUE
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
rb_gvar_get(struct global_entry *entry)
|
1998-01-16 07:13:05 -05:00
|
|
|
{
|
2001-10-22 12:20:14 -04:00
|
|
|
struct global_variable *var = entry->var;
|
|
|
|
return (*var->getter)(entry->id, var->data, var);
|
1998-01-16 07:13:05 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
struct trace_data {
|
|
|
|
struct trace_var *trace;
|
|
|
|
VALUE val;
|
|
|
|
};
|
* eval.c (ev_const_defined, ev_const_get), variable.c
(rb_const_get_at, rb_const_get, rb_mod_remove_const): use Qundef
as autoload marker. [ruby-dev:18103], [ruby-dev:18184]
* eval.c (rb_mod_autoload, rb_mod_autoload_p): new method;
Module#autoload, Module#autoload?.
* variable.c (rb_autoload, rb_autoload_load, rb_autoload_p):
manage autoload constants per classes/modules.
* variable.c (rb_const_defined_at, rb_const_defined): return false
for autoloading constants.
* class.c (rb_define_class, rb_define_module), eval.c (rb_eval),
variable.c (rb_mod_const_at, rb_const_assign): removed autoload
stuff.
* intern.h: prototypes; rb_autoload, rb_autoload_load,
rb_autoload_p.
* lib/optparse.rb (OptionParser::Switch::PlacedArgument::parse):
do not treat unmatched argument as an option.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3874 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2003-05-28 20:11:11 -04:00
|
|
|
|
1999-01-19 23:59:39 -05:00
|
|
|
static VALUE
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
trace_ev(struct trace_data *data)
|
1998-01-16 07:13:05 -05:00
|
|
|
{
|
|
|
|
struct trace_var *trace = data->trace;
|
|
|
|
|
|
|
|
while (trace) {
|
|
|
|
(*trace->func)(trace->data, data->val);
|
|
|
|
trace = trace->next;
|
|
|
|
}
|
1999-01-19 23:59:39 -05:00
|
|
|
return Qnil; /* not reached */
|
1998-01-16 07:13:05 -05:00
|
|
|
}
|
|
|
|
|
1999-01-19 23:59:39 -05:00
|
|
|
static VALUE
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
trace_en(struct global_variable *var)
|
1998-01-16 07:13:05 -05:00
|
|
|
{
|
2001-10-22 12:20:14 -04:00
|
|
|
var->block_trace = 0;
|
|
|
|
remove_trace(var);
|
1999-01-19 23:59:39 -05:00
|
|
|
return Qnil; /* not reached */
|
1998-01-16 07:13:05 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
VALUE
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
rb_gvar_set(struct global_entry *entry, VALUE val)
|
1998-01-16 07:13:05 -05:00
|
|
|
{
|
|
|
|
struct trace_data trace;
|
2001-10-22 12:20:14 -04:00
|
|
|
struct global_variable *var = entry->var;
|
1998-01-16 07:13:05 -05:00
|
|
|
|
1999-01-19 23:59:39 -05:00
|
|
|
if (rb_safe_level() >= 4)
|
|
|
|
rb_raise(rb_eSecurityError, "Insecure: can't change global variable value");
|
2001-10-22 12:20:14 -04:00
|
|
|
(*var->setter)(val, entry->id, var->data, var);
|
1998-01-16 07:13:05 -05:00
|
|
|
|
2001-10-22 12:20:14 -04:00
|
|
|
if (var->trace && !var->block_trace) {
|
|
|
|
var->block_trace = 1;
|
|
|
|
trace.trace = var->trace;
|
1998-01-16 07:13:05 -05:00
|
|
|
trace.val = val;
|
2001-10-22 12:20:14 -04:00
|
|
|
rb_ensure(trace_ev, (VALUE)&trace, trace_en, (VALUE)var);
|
1998-01-16 07:13:05 -05:00
|
|
|
}
|
|
|
|
return val;
|
|
|
|
}
|
|
|
|
|
|
|
|
VALUE
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
rb_gv_set(const char *name, VALUE val)
|
1998-01-16 07:13:05 -05:00
|
|
|
{
|
|
|
|
struct global_entry *entry;
|
|
|
|
|
|
|
|
entry = rb_global_entry(global_id(name));
|
|
|
|
return rb_gvar_set(entry, val);
|
|
|
|
}
|
|
|
|
|
1999-11-17 02:30:37 -05:00
|
|
|
VALUE
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
rb_gv_get(const char *name)
|
1999-11-17 02:30:37 -05:00
|
|
|
{
|
|
|
|
struct global_entry *entry;
|
|
|
|
|
|
|
|
entry = rb_global_entry(global_id(name));
|
|
|
|
return rb_gvar_get(entry);
|
|
|
|
}
|
|
|
|
|
1998-01-16 07:13:05 -05:00
|
|
|
VALUE
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
rb_gvar_defined(struct global_entry *entry)
|
1998-01-16 07:13:05 -05:00
|
|
|
{
|
2001-10-22 12:20:14 -04:00
|
|
|
if (entry->var->getter == undef_getter) return Qfalse;
|
1999-01-19 23:59:39 -05:00
|
|
|
return Qtrue;
|
1998-01-16 07:13:05 -05:00
|
|
|
}
|
|
|
|
|
1998-01-16 07:19:22 -05:00
|
|
|
static int
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
gvar_i(ID key, struct global_entry *entry, VALUE ary)
|
1998-01-16 07:19:22 -05:00
|
|
|
{
|
2006-09-04 01:46:47 -04:00
|
|
|
rb_ary_push(ary, ID2SYM(key));
|
1998-01-16 07:19:22 -05:00
|
|
|
return ST_CONTINUE;
|
|
|
|
}
|
|
|
|
|
2003-12-28 22:56:22 -05:00
|
|
|
/*
|
|
|
|
* call-seq:
|
|
|
|
* global_variables => array
|
|
|
|
*
|
|
|
|
* Returns an array of the names of global variables.
|
|
|
|
*
|
2008-03-08 20:04:46 -05:00
|
|
|
* global_variables.grep /std/ #=> [:$stdin, :$stdout, :$stderr]
|
2003-12-28 22:56:22 -05:00
|
|
|
*/
|
|
|
|
|
1998-01-16 07:19:22 -05:00
|
|
|
VALUE
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
rb_f_global_variables(void)
|
1998-01-16 07:19:22 -05:00
|
|
|
{
|
1999-01-19 23:59:39 -05:00
|
|
|
VALUE ary = rb_ary_new();
|
|
|
|
char buf[4];
|
2007-11-25 20:17:17 -05:00
|
|
|
const char *s = "123456789";
|
1998-01-16 07:19:22 -05:00
|
|
|
|
2004-09-29 01:15:33 -04:00
|
|
|
st_foreach_safe(rb_global_tbl, gvar_i, ary);
|
2007-11-25 20:17:17 -05:00
|
|
|
while (*s) {
|
|
|
|
sprintf(buf, "$%c", *s++);
|
|
|
|
rb_ary_push(ary, ID2SYM(rb_intern(buf)));
|
1998-01-16 07:19:22 -05:00
|
|
|
}
|
|
|
|
return ary;
|
|
|
|
}
|
|
|
|
|
1998-01-16 07:13:05 -05:00
|
|
|
void
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
rb_alias_variable(ID name1, ID name2)
|
1998-01-16 07:13:05 -05:00
|
|
|
{
|
|
|
|
struct global_entry *entry1, *entry2;
|
* variable.c (rb_global_entry, rb_f_untrace_var, rb_alias_variable,
rb_generic_ivar_table, generic_ivar_get, generic_ivar_set,
generic_ivar_defined, generic_ivar_remove, rb_mark_generic_ivar,
rb_free_generic_ivar, rb_copy_generic_ivar,
rb_obj_instance_variables): suppress warnings.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12563 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-06-17 12:12:32 -04:00
|
|
|
st_data_t data1;
|
1998-01-16 07:13:05 -05:00
|
|
|
|
2001-05-22 04:28:11 -04:00
|
|
|
if (rb_safe_level() >= 4)
|
|
|
|
rb_raise(rb_eSecurityError, "Insecure: can't alias global variable");
|
1998-01-16 07:13:05 -05:00
|
|
|
|
2001-10-22 12:20:14 -04:00
|
|
|
entry2 = rb_global_entry(name2);
|
* variable.c (rb_global_entry, rb_f_untrace_var, rb_alias_variable,
rb_generic_ivar_table, generic_ivar_get, generic_ivar_set,
generic_ivar_defined, generic_ivar_remove, rb_mark_generic_ivar,
rb_free_generic_ivar, rb_copy_generic_ivar,
rb_obj_instance_variables): suppress warnings.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12563 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-06-17 12:12:32 -04:00
|
|
|
if (!st_lookup(rb_global_tbl, name1, &data1)) {
|
2008-03-10 11:48:35 -04:00
|
|
|
entry1 = ALLOC(struct global_entry);
|
2001-10-22 12:20:14 -04:00
|
|
|
entry1->id = name1;
|
* st.h, st.c: Introduce new conventional typedef's, st_data_t,
st_compare_func_t, st_hash_func_t and st_each_func_t.
* st.h, st.c: Do explicit function declarations and do not rely on
implicit declarations. On such platforms as IA64, int argument
values are NOT automatically promoted to long (64bit) values, so
explicit declarations are mandatory for those functions that
take long values or pointers. This fixes miniruby's coredump on
FreeBSD/IA64.
* class.c, eval.c, gc.c, hash.c, marshal.c, parse.y, variable.c:
Add proper casts to avoid warnings.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3303 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2003-01-06 10:55:43 -05:00
|
|
|
st_add_direct(rb_global_tbl, name1, (st_data_t)entry1);
|
2001-10-22 12:20:14 -04:00
|
|
|
}
|
* variable.c (rb_global_entry, rb_f_untrace_var, rb_alias_variable,
rb_generic_ivar_table, generic_ivar_get, generic_ivar_set,
generic_ivar_defined, generic_ivar_remove, rb_mark_generic_ivar,
rb_free_generic_ivar, rb_copy_generic_ivar,
rb_obj_instance_variables): suppress warnings.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12563 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-06-17 12:12:32 -04:00
|
|
|
else if ((entry1 = (struct global_entry *)data1)->var != entry2->var) {
|
2001-10-22 12:20:14 -04:00
|
|
|
struct global_variable *var = entry1->var;
|
|
|
|
if (var->block_trace) {
|
|
|
|
rb_raise(rb_eRuntimeError, "can't alias in tracer");
|
|
|
|
}
|
|
|
|
var->counter--;
|
|
|
|
if (var->counter == 0) {
|
|
|
|
struct trace_var *trace = var->trace;
|
|
|
|
while (trace) {
|
|
|
|
struct trace_var *next = trace->next;
|
* array.c, bignum.c, cont.c, dir.c, dln.c, encoding.c, enumerator.c,
enumerator.c (enumerator_allocate), eval_jump.c, file.c, hash.c,
io.c, load.c, pack.c, proc.c, random.c, re.c, ruby.c, st.c,
string.c, thread.c, thread_pthread.c, time.c, util.c, variable.c,
vm.c, gc.c:
allocated memory objects by xmalloc (ruby_xmalloc) should be
freed by xfree (ruby_xfree).
* ext/curses/curses.c, ext/dbm/dbm.c, ext/digest/digest.c,
ext/gdbm/gdbm.c, ext/json/ext/parser/parser.c,
ext/json/ext/parser/unicode.c, ext/openssl/ossl_cipher.c,
ext/openssl/ossl_hmac.c, ext/openssl/ossl_pkey_ec.c,
ext/sdbm/init.c, ext/strscan/strscan.c, ext/zlib/zlib.c:
ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@17017 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2008-06-08 06:01:40 -04:00
|
|
|
xfree(trace);
|
2001-10-22 12:20:14 -04:00
|
|
|
trace = next;
|
|
|
|
}
|
* array.c, bignum.c, cont.c, dir.c, dln.c, encoding.c, enumerator.c,
enumerator.c (enumerator_allocate), eval_jump.c, file.c, hash.c,
io.c, load.c, pack.c, proc.c, random.c, re.c, ruby.c, st.c,
string.c, thread.c, thread_pthread.c, time.c, util.c, variable.c,
vm.c, gc.c:
allocated memory objects by xmalloc (ruby_xmalloc) should be
freed by xfree (ruby_xfree).
* ext/curses/curses.c, ext/dbm/dbm.c, ext/digest/digest.c,
ext/gdbm/gdbm.c, ext/json/ext/parser/parser.c,
ext/json/ext/parser/unicode.c, ext/openssl/ossl_cipher.c,
ext/openssl/ossl_hmac.c, ext/openssl/ossl_pkey_ec.c,
ext/sdbm/init.c, ext/strscan/strscan.c, ext/zlib/zlib.c:
ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@17017 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2008-06-08 06:01:40 -04:00
|
|
|
xfree(var);
|
2001-10-22 12:20:14 -04:00
|
|
|
}
|
2001-10-17 01:28:02 -04:00
|
|
|
}
|
2001-10-22 12:20:14 -04:00
|
|
|
else {
|
|
|
|
return;
|
2001-10-17 01:28:02 -04:00
|
|
|
}
|
2001-10-22 12:20:14 -04:00
|
|
|
entry2->var->counter++;
|
|
|
|
entry1->var = entry2->var;
|
1998-01-16 07:13:05 -05:00
|
|
|
}
|
|
|
|
|
1999-01-19 23:59:39 -05:00
|
|
|
static int special_generic_ivar = 0;
|
|
|
|
static st_table *generic_iv_tbl;
|
|
|
|
|
2000-01-04 23:41:21 -05:00
|
|
|
st_table*
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
rb_generic_ivar_table(VALUE obj)
|
2000-01-04 23:41:21 -05:00
|
|
|
{
|
* variable.c (rb_global_entry, rb_f_untrace_var, rb_alias_variable,
rb_generic_ivar_table, generic_ivar_get, generic_ivar_set,
generic_ivar_defined, generic_ivar_remove, rb_mark_generic_ivar,
rb_free_generic_ivar, rb_copy_generic_ivar,
rb_obj_instance_variables): suppress warnings.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12563 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-06-17 12:12:32 -04:00
|
|
|
st_data_t tbl;
|
2000-01-04 23:41:21 -05:00
|
|
|
|
2003-10-09 13:45:53 -04:00
|
|
|
if (!FL_TEST(obj, FL_EXIVAR)) return 0;
|
2000-01-04 23:41:21 -05:00
|
|
|
if (!generic_iv_tbl) return 0;
|
* variable.c (rb_global_entry, rb_f_untrace_var, rb_alias_variable,
rb_generic_ivar_table, generic_ivar_get, generic_ivar_set,
generic_ivar_defined, generic_ivar_remove, rb_mark_generic_ivar,
rb_free_generic_ivar, rb_copy_generic_ivar,
rb_obj_instance_variables): suppress warnings.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12563 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-06-17 12:12:32 -04:00
|
|
|
if (!st_lookup(generic_iv_tbl, obj, &tbl)) return 0;
|
|
|
|
return (st_table *)tbl;
|
2000-01-04 23:41:21 -05:00
|
|
|
}
|
|
|
|
|
1999-01-19 23:59:39 -05:00
|
|
|
static VALUE
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
generic_ivar_get(VALUE obj, ID id, int warn)
|
1999-01-19 23:59:39 -05:00
|
|
|
{
|
* variable.c (rb_global_entry, rb_f_untrace_var, rb_alias_variable,
rb_generic_ivar_table, generic_ivar_get, generic_ivar_set,
generic_ivar_defined, generic_ivar_remove, rb_mark_generic_ivar,
rb_free_generic_ivar, rb_copy_generic_ivar,
rb_obj_instance_variables): suppress warnings.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12563 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-06-17 12:12:32 -04:00
|
|
|
st_data_t tbl;
|
1999-01-19 23:59:39 -05:00
|
|
|
VALUE val;
|
|
|
|
|
2002-12-19 04:20:20 -05:00
|
|
|
if (generic_iv_tbl) {
|
* variable.c (rb_global_entry, rb_f_untrace_var, rb_alias_variable,
rb_generic_ivar_table, generic_ivar_get, generic_ivar_set,
generic_ivar_defined, generic_ivar_remove, rb_mark_generic_ivar,
rb_free_generic_ivar, rb_copy_generic_ivar,
rb_obj_instance_variables): suppress warnings.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12563 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-06-17 12:12:32 -04:00
|
|
|
if (st_lookup(generic_iv_tbl, obj, &tbl)) {
|
|
|
|
if (st_lookup((st_table *)tbl, id, &val)) {
|
|
|
|
return val;
|
|
|
|
}
|
2002-12-19 04:20:20 -05:00
|
|
|
}
|
1999-01-19 23:59:39 -05:00
|
|
|
}
|
2005-05-13 04:56:40 -04:00
|
|
|
if (warn) {
|
|
|
|
rb_warning("instance variable %s not initialized", rb_id2name(id));
|
|
|
|
}
|
1999-01-19 23:59:39 -05:00
|
|
|
return Qnil;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
generic_ivar_set(VALUE obj, ID id, VALUE val)
|
1999-01-19 23:59:39 -05:00
|
|
|
{
|
|
|
|
st_table *tbl;
|
* variable.c (rb_global_entry, rb_f_untrace_var, rb_alias_variable,
rb_generic_ivar_table, generic_ivar_get, generic_ivar_set,
generic_ivar_defined, generic_ivar_remove, rb_mark_generic_ivar,
rb_free_generic_ivar, rb_copy_generic_ivar,
rb_obj_instance_variables): suppress warnings.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12563 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-06-17 12:12:32 -04:00
|
|
|
st_data_t data;
|
1999-01-19 23:59:39 -05:00
|
|
|
|
|
|
|
if (rb_special_const_p(obj)) {
|
2007-12-18 03:28:39 -05:00
|
|
|
if (rb_obj_frozen_p(obj)) rb_error_frozen("object");
|
1999-01-19 23:59:39 -05:00
|
|
|
special_generic_ivar = 1;
|
|
|
|
}
|
|
|
|
if (!generic_iv_tbl) {
|
|
|
|
generic_iv_tbl = st_init_numtable();
|
|
|
|
}
|
* variable.c (rb_global_entry, rb_f_untrace_var, rb_alias_variable,
rb_generic_ivar_table, generic_ivar_get, generic_ivar_set,
generic_ivar_defined, generic_ivar_remove, rb_mark_generic_ivar,
rb_free_generic_ivar, rb_copy_generic_ivar,
rb_obj_instance_variables): suppress warnings.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12563 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-06-17 12:12:32 -04:00
|
|
|
if (!st_lookup(generic_iv_tbl, obj, &data)) {
|
1999-01-19 23:59:39 -05:00
|
|
|
FL_SET(obj, FL_EXIVAR);
|
|
|
|
tbl = st_init_numtable();
|
* st.h, st.c: Introduce new conventional typedef's, st_data_t,
st_compare_func_t, st_hash_func_t and st_each_func_t.
* st.h, st.c: Do explicit function declarations and do not rely on
implicit declarations. On such platforms as IA64, int argument
values are NOT automatically promoted to long (64bit) values, so
explicit declarations are mandatory for those functions that
take long values or pointers. This fixes miniruby's coredump on
FreeBSD/IA64.
* class.c, eval.c, gc.c, hash.c, marshal.c, parse.y, variable.c:
Add proper casts to avoid warnings.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3303 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2003-01-06 10:55:43 -05:00
|
|
|
st_add_direct(generic_iv_tbl, obj, (st_data_t)tbl);
|
1999-01-19 23:59:39 -05:00
|
|
|
st_add_direct(tbl, id, val);
|
|
|
|
return;
|
|
|
|
}
|
* variable.c (rb_global_entry, rb_f_untrace_var, rb_alias_variable,
rb_generic_ivar_table, generic_ivar_get, generic_ivar_set,
generic_ivar_defined, generic_ivar_remove, rb_mark_generic_ivar,
rb_free_generic_ivar, rb_copy_generic_ivar,
rb_obj_instance_variables): suppress warnings.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12563 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-06-17 12:12:32 -04:00
|
|
|
st_insert((st_table *)data, id, val);
|
1999-01-19 23:59:39 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
static VALUE
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
generic_ivar_defined(VALUE obj, ID id)
|
1999-01-19 23:59:39 -05:00
|
|
|
{
|
|
|
|
st_table *tbl;
|
* variable.c (rb_global_entry, rb_f_untrace_var, rb_alias_variable,
rb_generic_ivar_table, generic_ivar_get, generic_ivar_set,
generic_ivar_defined, generic_ivar_remove, rb_mark_generic_ivar,
rb_free_generic_ivar, rb_copy_generic_ivar,
rb_obj_instance_variables): suppress warnings.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12563 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-06-17 12:12:32 -04:00
|
|
|
st_data_t data;
|
1999-01-19 23:59:39 -05:00
|
|
|
VALUE val;
|
|
|
|
|
|
|
|
if (!generic_iv_tbl) return Qfalse;
|
* variable.c (rb_global_entry, rb_f_untrace_var, rb_alias_variable,
rb_generic_ivar_table, generic_ivar_get, generic_ivar_set,
generic_ivar_defined, generic_ivar_remove, rb_mark_generic_ivar,
rb_free_generic_ivar, rb_copy_generic_ivar,
rb_obj_instance_variables): suppress warnings.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12563 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-06-17 12:12:32 -04:00
|
|
|
if (!st_lookup(generic_iv_tbl, obj, &data)) return Qfalse;
|
|
|
|
tbl = (st_table *)data;
|
1999-01-19 23:59:39 -05:00
|
|
|
if (st_lookup(tbl, id, &val)) {
|
|
|
|
return Qtrue;
|
|
|
|
}
|
|
|
|
return Qfalse;
|
|
|
|
}
|
|
|
|
|
2002-04-10 04:45:26 -04:00
|
|
|
static int
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
generic_ivar_remove(VALUE obj, ID id, VALUE *valp)
|
1999-01-19 23:59:39 -05:00
|
|
|
{
|
|
|
|
st_table *tbl;
|
* variable.c (rb_global_entry, rb_f_untrace_var, rb_alias_variable,
rb_generic_ivar_table, generic_ivar_get, generic_ivar_set,
generic_ivar_defined, generic_ivar_remove, rb_mark_generic_ivar,
rb_free_generic_ivar, rb_copy_generic_ivar,
rb_obj_instance_variables): suppress warnings.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12563 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-06-17 12:12:32 -04:00
|
|
|
st_data_t data;
|
2002-04-10 04:45:26 -04:00
|
|
|
int status;
|
1999-01-19 23:59:39 -05:00
|
|
|
|
2002-04-10 04:45:26 -04:00
|
|
|
if (!generic_iv_tbl) return 0;
|
* variable.c (rb_global_entry, rb_f_untrace_var, rb_alias_variable,
rb_generic_ivar_table, generic_ivar_get, generic_ivar_set,
generic_ivar_defined, generic_ivar_remove, rb_mark_generic_ivar,
rb_free_generic_ivar, rb_copy_generic_ivar,
rb_obj_instance_variables): suppress warnings.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12563 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-06-17 12:12:32 -04:00
|
|
|
if (!st_lookup(generic_iv_tbl, obj, &data)) return 0;
|
|
|
|
tbl = (st_table *)data;
|
2002-04-10 04:45:26 -04:00
|
|
|
status = st_delete(tbl, &id, valp);
|
1999-01-19 23:59:39 -05:00
|
|
|
if (tbl->num_entries == 0) {
|
* variable.c (rb_global_entry, rb_f_untrace_var, rb_alias_variable,
rb_generic_ivar_table, generic_ivar_get, generic_ivar_set,
generic_ivar_defined, generic_ivar_remove, rb_mark_generic_ivar,
rb_free_generic_ivar, rb_copy_generic_ivar,
rb_obj_instance_variables): suppress warnings.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12563 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-06-17 12:12:32 -04:00
|
|
|
st_delete(generic_iv_tbl, &obj, &data);
|
|
|
|
st_free_table((st_table *)data);
|
1999-01-19 23:59:39 -05:00
|
|
|
}
|
2002-04-10 04:45:26 -04:00
|
|
|
return status;
|
1999-01-19 23:59:39 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
rb_mark_generic_ivar(VALUE obj)
|
1999-01-19 23:59:39 -05:00
|
|
|
{
|
* variable.c (rb_global_entry, rb_f_untrace_var, rb_alias_variable,
rb_generic_ivar_table, generic_ivar_get, generic_ivar_set,
generic_ivar_defined, generic_ivar_remove, rb_mark_generic_ivar,
rb_free_generic_ivar, rb_copy_generic_ivar,
rb_obj_instance_variables): suppress warnings.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12563 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-06-17 12:12:32 -04:00
|
|
|
st_data_t tbl;
|
1999-01-19 23:59:39 -05:00
|
|
|
|
1999-08-13 01:45:20 -04:00
|
|
|
if (!generic_iv_tbl) return;
|
* variable.c (rb_global_entry, rb_f_untrace_var, rb_alias_variable,
rb_generic_ivar_table, generic_ivar_get, generic_ivar_set,
generic_ivar_defined, generic_ivar_remove, rb_mark_generic_ivar,
rb_free_generic_ivar, rb_copy_generic_ivar,
rb_obj_instance_variables): suppress warnings.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12563 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-06-17 12:12:32 -04:00
|
|
|
if (st_lookup(generic_iv_tbl, obj, &tbl)) {
|
|
|
|
rb_mark_tbl((st_table *)tbl);
|
1999-01-19 23:59:39 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
1999-08-13 01:45:20 -04:00
|
|
|
static int
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
givar_mark_i(ID key, VALUE value)
|
1999-08-13 01:45:20 -04:00
|
|
|
{
|
|
|
|
rb_gc_mark(value);
|
|
|
|
return ST_CONTINUE;
|
|
|
|
}
|
|
|
|
|
1999-01-19 23:59:39 -05:00
|
|
|
static int
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
givar_i(VALUE obj, st_table *tbl)
|
1999-01-19 23:59:39 -05:00
|
|
|
{
|
|
|
|
if (rb_special_const_p(obj)) {
|
2004-09-29 01:15:33 -04:00
|
|
|
st_foreach_safe(tbl, givar_mark_i, 0);
|
1999-01-19 23:59:39 -05:00
|
|
|
}
|
|
|
|
return ST_CONTINUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
rb_mark_generic_ivar_tbl(void)
|
1999-01-19 23:59:39 -05:00
|
|
|
{
|
|
|
|
if (!generic_iv_tbl) return;
|
1999-08-13 01:45:20 -04:00
|
|
|
if (special_generic_ivar == 0) return;
|
2004-09-29 01:15:33 -04:00
|
|
|
st_foreach_safe(generic_iv_tbl, givar_i, 0);
|
1999-01-19 23:59:39 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
rb_free_generic_ivar(VALUE obj)
|
1999-01-19 23:59:39 -05:00
|
|
|
{
|
* variable.c (rb_global_entry, rb_f_untrace_var, rb_alias_variable,
rb_generic_ivar_table, generic_ivar_get, generic_ivar_set,
generic_ivar_defined, generic_ivar_remove, rb_mark_generic_ivar,
rb_free_generic_ivar, rb_copy_generic_ivar,
rb_obj_instance_variables): suppress warnings.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12563 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-06-17 12:12:32 -04:00
|
|
|
st_data_t tbl;
|
1999-01-19 23:59:39 -05:00
|
|
|
|
2004-10-30 02:56:18 -04:00
|
|
|
if (!generic_iv_tbl) return;
|
* variable.c (rb_global_entry, rb_f_untrace_var, rb_alias_variable,
rb_generic_ivar_table, generic_ivar_get, generic_ivar_set,
generic_ivar_defined, generic_ivar_remove, rb_mark_generic_ivar,
rb_free_generic_ivar, rb_copy_generic_ivar,
rb_obj_instance_variables): suppress warnings.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12563 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-06-17 12:12:32 -04:00
|
|
|
if (st_delete(generic_iv_tbl, &obj, &tbl))
|
|
|
|
st_free_table((st_table *)tbl);
|
1999-01-19 23:59:39 -05:00
|
|
|
}
|
|
|
|
|
1999-08-13 01:45:20 -04:00
|
|
|
void
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
rb_copy_generic_ivar(VALUE clone, VALUE obj)
|
1999-08-13 01:45:20 -04:00
|
|
|
{
|
* variable.c (rb_global_entry, rb_f_untrace_var, rb_alias_variable,
rb_generic_ivar_table, generic_ivar_get, generic_ivar_set,
generic_ivar_defined, generic_ivar_remove, rb_mark_generic_ivar,
rb_free_generic_ivar, rb_copy_generic_ivar,
rb_obj_instance_variables): suppress warnings.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12563 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-06-17 12:12:32 -04:00
|
|
|
st_data_t data;
|
1999-08-13 01:45:20 -04:00
|
|
|
|
|
|
|
if (!generic_iv_tbl) return;
|
* configure.in: check struct timespec, clock_gettime, utimensat,
struct stat.st_atim,
struct stat.st_atimespec,
struct stat.st_atimensec,
struct stat.st_mtim,
struct stat.st_mtimespec,
struct stat.st_mtimensec,
struct stat.st_ctim,
struct stat.st_ctimespec,
struct stat.st_ctimensec.
* include/ruby/missing.h: provide struct timespec if not available.
* time.c: support nanosecond-resolution using struct timespec.
* include/ruby/intern.h: provide rb_time_nano_new.
* file.c (utime_internal): use utimensat if available.
(rb_file_s_utime): refactored.
(rb_f_test): use stat_atime, stat_mtime, stat_ctime.
(rb_stat_cmp): check tv_nsec.
(stat_atimespec): new function.
(stat_atime): ditto.
(stat_mtimespec): ditto.
(stat_mtime): ditto.
(stat_ctimespec): ditto.
(stat_ctime): ditto.
(rb_stat_atime): use stat_atime.
(rb_file_s_atime): ditto.
(rb_file_atime): ditto.
(rb_stat_mtime): use stat_mtime.
(rb_file_s_mtime): ditto.
(rb_file_mtime): ditto.
(rb_file_ctime): use stat_ctime.
(rb_file_s_ctime): ditto.
(rb_stat_ctime): ditto.
* variable.c (rb_copy_generic_ivar): clear clone's instance variables
if obj has no instance variable.
* marshal.c (w_object): dump instance variables of generated string
for TYPE_USERDEF, even if original object has instance variables.
* lib/time.rb (Time#xmlschema): use nsec instead of usec.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@13968 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-11-19 04:09:38 -05:00
|
|
|
if (!FL_TEST(obj, FL_EXIVAR)) {
|
|
|
|
clear:
|
|
|
|
if (FL_TEST(clone, FL_EXIVAR)) {
|
|
|
|
rb_free_generic_ivar(clone);
|
|
|
|
FL_UNSET(clone, FL_EXIVAR);
|
|
|
|
}
|
|
|
|
return;
|
|
|
|
}
|
* variable.c (rb_global_entry, rb_f_untrace_var, rb_alias_variable,
rb_generic_ivar_table, generic_ivar_get, generic_ivar_set,
generic_ivar_defined, generic_ivar_remove, rb_mark_generic_ivar,
rb_free_generic_ivar, rb_copy_generic_ivar,
rb_obj_instance_variables): suppress warnings.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12563 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-06-17 12:12:32 -04:00
|
|
|
if (st_lookup(generic_iv_tbl, obj, &data)) {
|
|
|
|
st_table *tbl = (st_table *)data;
|
2002-09-03 01:20:14 -04:00
|
|
|
|
* configure.in: check struct timespec, clock_gettime, utimensat,
struct stat.st_atim,
struct stat.st_atimespec,
struct stat.st_atimensec,
struct stat.st_mtim,
struct stat.st_mtimespec,
struct stat.st_mtimensec,
struct stat.st_ctim,
struct stat.st_ctimespec,
struct stat.st_ctimensec.
* include/ruby/missing.h: provide struct timespec if not available.
* time.c: support nanosecond-resolution using struct timespec.
* include/ruby/intern.h: provide rb_time_nano_new.
* file.c (utime_internal): use utimensat if available.
(rb_file_s_utime): refactored.
(rb_f_test): use stat_atime, stat_mtime, stat_ctime.
(rb_stat_cmp): check tv_nsec.
(stat_atimespec): new function.
(stat_atime): ditto.
(stat_mtimespec): ditto.
(stat_mtime): ditto.
(stat_ctimespec): ditto.
(stat_ctime): ditto.
(rb_stat_atime): use stat_atime.
(rb_file_s_atime): ditto.
(rb_file_atime): ditto.
(rb_stat_mtime): use stat_mtime.
(rb_file_s_mtime): ditto.
(rb_file_mtime): ditto.
(rb_file_ctime): use stat_ctime.
(rb_file_s_ctime): ditto.
(rb_stat_ctime): ditto.
* variable.c (rb_copy_generic_ivar): clear clone's instance variables
if obj has no instance variable.
* marshal.c (w_object): dump instance variables of generated string
for TYPE_USERDEF, even if original object has instance variables.
* lib/time.rb (Time#xmlschema): use nsec instead of usec.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@13968 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-11-19 04:09:38 -05:00
|
|
|
if (tbl->num_entries == 0)
|
|
|
|
goto clear;
|
|
|
|
|
* variable.c (rb_global_entry, rb_f_untrace_var, rb_alias_variable,
rb_generic_ivar_table, generic_ivar_get, generic_ivar_set,
generic_ivar_defined, generic_ivar_remove, rb_mark_generic_ivar,
rb_free_generic_ivar, rb_copy_generic_ivar,
rb_obj_instance_variables): suppress warnings.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12563 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-06-17 12:12:32 -04:00
|
|
|
if (st_lookup(generic_iv_tbl, clone, &data)) {
|
|
|
|
st_free_table((st_table *)data);
|
* st.h, st.c: Introduce new conventional typedef's, st_data_t,
st_compare_func_t, st_hash_func_t and st_each_func_t.
* st.h, st.c: Do explicit function declarations and do not rely on
implicit declarations. On such platforms as IA64, int argument
values are NOT automatically promoted to long (64bit) values, so
explicit declarations are mandatory for those functions that
take long values or pointers. This fixes miniruby's coredump on
FreeBSD/IA64.
* class.c, eval.c, gc.c, hash.c, marshal.c, parse.y, variable.c:
Add proper casts to avoid warnings.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3303 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2003-01-06 10:55:43 -05:00
|
|
|
st_insert(generic_iv_tbl, clone, (st_data_t)st_copy(tbl));
|
2002-09-03 01:20:14 -04:00
|
|
|
}
|
|
|
|
else {
|
* st.h, st.c: Introduce new conventional typedef's, st_data_t,
st_compare_func_t, st_hash_func_t and st_each_func_t.
* st.h, st.c: Do explicit function declarations and do not rely on
implicit declarations. On such platforms as IA64, int argument
values are NOT automatically promoted to long (64bit) values, so
explicit declarations are mandatory for those functions that
take long values or pointers. This fixes miniruby's coredump on
FreeBSD/IA64.
* class.c, eval.c, gc.c, hash.c, marshal.c, parse.y, variable.c:
Add proper casts to avoid warnings.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3303 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2003-01-06 10:55:43 -05:00
|
|
|
st_add_direct(generic_iv_tbl, clone, (st_data_t)st_copy(tbl));
|
2004-05-14 12:39:15 -04:00
|
|
|
FL_SET(clone, FL_EXIVAR);
|
2002-09-03 01:20:14 -04:00
|
|
|
}
|
1999-08-13 01:45:20 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2003-02-18 09:30:17 -05:00
|
|
|
static VALUE
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
ivar_get(VALUE obj, ID id, int warn)
|
1998-01-16 07:13:05 -05:00
|
|
|
{
|
2008-02-13 06:52:46 -05:00
|
|
|
VALUE val, *ptr;
|
|
|
|
struct st_table *iv_index_tbl;
|
|
|
|
long len;
|
2007-09-28 02:21:46 -04:00
|
|
|
st_data_t index;
|
1998-01-16 07:13:05 -05:00
|
|
|
|
|
|
|
switch (TYPE(obj)) {
|
|
|
|
case T_OBJECT:
|
2008-02-25 11:18:18 -05:00
|
|
|
len = ROBJECT_NUMIV(obj);
|
|
|
|
ptr = ROBJECT_IVPTR(obj);
|
2008-02-13 06:52:46 -05:00
|
|
|
iv_index_tbl = ROBJECT_IV_INDEX_TBL(obj);
|
|
|
|
if (!iv_index_tbl) break;
|
|
|
|
if (!st_lookup(iv_index_tbl, id, &index)) break;
|
|
|
|
if (len <= index) break;
|
|
|
|
val = ptr[index];
|
2007-09-28 02:21:46 -04:00
|
|
|
if (val != Qundef)
|
|
|
|
return val;
|
|
|
|
break;
|
1998-01-16 07:13:05 -05:00
|
|
|
case T_CLASS:
|
|
|
|
case T_MODULE:
|
2007-09-28 02:21:46 -04:00
|
|
|
if (RCLASS_IV_TBL(obj) && st_lookup(RCLASS_IV_TBL(obj), id, &val))
|
1998-01-16 07:13:05 -05:00
|
|
|
return val;
|
1999-01-19 23:59:39 -05:00
|
|
|
break;
|
1998-01-16 07:13:05 -05:00
|
|
|
default:
|
1999-01-19 23:59:39 -05:00
|
|
|
if (FL_TEST(obj, FL_EXIVAR) || rb_special_const_p(obj))
|
2005-05-13 04:56:40 -04:00
|
|
|
return generic_ivar_get(obj, id, warn);
|
1998-01-16 07:13:05 -05:00
|
|
|
break;
|
|
|
|
}
|
2005-05-13 04:56:40 -04:00
|
|
|
if (warn) {
|
2003-02-18 09:30:17 -05:00
|
|
|
rb_warning("instance variable %s not initialized", rb_id2name(id));
|
|
|
|
}
|
1998-01-16 07:13:05 -05:00
|
|
|
return Qnil;
|
|
|
|
}
|
|
|
|
|
2003-02-18 09:30:17 -05:00
|
|
|
VALUE
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
rb_ivar_get(VALUE obj, ID id)
|
2003-02-18 09:30:17 -05:00
|
|
|
{
|
|
|
|
return ivar_get(obj, id, Qtrue);
|
|
|
|
}
|
|
|
|
|
|
|
|
VALUE
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
rb_attr_get(VALUE obj, ID id)
|
2003-02-18 09:30:17 -05:00
|
|
|
{
|
|
|
|
return ivar_get(obj, id, Qfalse);
|
|
|
|
}
|
|
|
|
|
1998-01-16 07:13:05 -05:00
|
|
|
VALUE
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
rb_ivar_set(VALUE obj, ID id, VALUE val)
|
1998-01-16 07:13:05 -05:00
|
|
|
{
|
2008-02-13 06:52:46 -05:00
|
|
|
struct st_table *iv_index_tbl;
|
2007-09-28 02:21:46 -04:00
|
|
|
st_data_t index;
|
|
|
|
long i, len;
|
|
|
|
int ivar_extended;
|
|
|
|
|
1999-12-14 01:50:43 -05:00
|
|
|
if (!OBJ_TAINTED(obj) && rb_safe_level() >= 4)
|
1999-08-13 01:45:20 -04:00
|
|
|
rb_raise(rb_eSecurityError, "Insecure: can't modify instance variable");
|
2000-01-31 22:12:21 -05:00
|
|
|
if (OBJ_FROZEN(obj)) rb_error_frozen("object");
|
1998-01-16 07:13:05 -05:00
|
|
|
switch (TYPE(obj)) {
|
|
|
|
case T_OBJECT:
|
2008-02-13 06:52:46 -05:00
|
|
|
iv_index_tbl = ROBJECT_IV_INDEX_TBL(obj);
|
|
|
|
if (!iv_index_tbl) {
|
|
|
|
VALUE klass = rb_obj_class(obj);
|
|
|
|
iv_index_tbl = RCLASS_IV_INDEX_TBL(klass);
|
|
|
|
if (!iv_index_tbl) {
|
|
|
|
iv_index_tbl = RCLASS_IV_INDEX_TBL(klass) = st_init_numtable();
|
|
|
|
}
|
|
|
|
}
|
2007-09-28 02:21:46 -04:00
|
|
|
ivar_extended = 0;
|
2008-02-13 06:52:46 -05:00
|
|
|
if (!st_lookup(iv_index_tbl, id, &index)) {
|
|
|
|
index = iv_index_tbl->num_entries;
|
|
|
|
st_add_direct(iv_index_tbl, id, index);
|
2007-09-28 02:21:46 -04:00
|
|
|
ivar_extended = 1;
|
|
|
|
}
|
2008-02-25 11:18:18 -05:00
|
|
|
len = ROBJECT_NUMIV(obj);
|
2007-09-28 02:21:46 -04:00
|
|
|
if (len <= index) {
|
2008-02-25 11:18:18 -05:00
|
|
|
VALUE *ptr = ROBJECT_IVPTR(obj);
|
2007-09-28 02:21:46 -04:00
|
|
|
if (index < ROBJECT_EMBED_LEN_MAX) {
|
|
|
|
RBASIC(obj)->flags |= ROBJECT_EMBED;
|
|
|
|
ptr = ROBJECT(obj)->as.ary;
|
|
|
|
for (i = 0; i < ROBJECT_EMBED_LEN_MAX; i++) {
|
|
|
|
ptr[i] = Qundef;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
VALUE *newptr;
|
|
|
|
long newsize = (index+1) + (index+1)/4; /* (index+1)*1.25 */
|
|
|
|
if (!ivar_extended &&
|
2008-02-13 06:52:46 -05:00
|
|
|
iv_index_tbl->num_entries < newsize) {
|
|
|
|
newsize = iv_index_tbl->num_entries;
|
2007-09-28 02:21:46 -04:00
|
|
|
}
|
|
|
|
if (RBASIC(obj)->flags & ROBJECT_EMBED) {
|
|
|
|
newptr = ALLOC_N(VALUE, newsize);
|
|
|
|
MEMCPY(newptr, ptr, VALUE, len);
|
|
|
|
RBASIC(obj)->flags &= ~ROBJECT_EMBED;
|
2008-02-25 11:18:18 -05:00
|
|
|
ROBJECT(obj)->as.heap.ivptr = newptr;
|
2007-09-28 02:21:46 -04:00
|
|
|
}
|
|
|
|
else {
|
2008-02-25 11:18:18 -05:00
|
|
|
REALLOC_N(ROBJECT(obj)->as.heap.ivptr, VALUE, newsize);
|
|
|
|
newptr = ROBJECT(obj)->as.heap.ivptr;
|
2007-09-28 02:21:46 -04:00
|
|
|
}
|
|
|
|
for (; len < newsize; len++)
|
|
|
|
newptr[len] = Qundef;
|
2008-02-25 11:18:18 -05:00
|
|
|
ROBJECT(obj)->as.heap.numiv = newsize;
|
2008-02-13 06:52:46 -05:00
|
|
|
ROBJECT(obj)->as.heap.iv_index_tbl = iv_index_tbl;
|
2007-09-28 02:21:46 -04:00
|
|
|
}
|
|
|
|
}
|
2008-02-25 11:18:18 -05:00
|
|
|
ROBJECT_IVPTR(obj)[index] = val;
|
2007-09-28 02:21:46 -04:00
|
|
|
break;
|
1998-01-16 07:13:05 -05:00
|
|
|
case T_CLASS:
|
|
|
|
case T_MODULE:
|
2007-09-28 02:21:46 -04:00
|
|
|
if (!RCLASS_IV_TBL(obj)) RCLASS_IV_TBL(obj) = st_init_numtable();
|
|
|
|
st_insert(RCLASS_IV_TBL(obj), id, val);
|
2007-09-28 21:21:15 -04:00
|
|
|
break;
|
1998-01-16 07:13:05 -05:00
|
|
|
default:
|
1999-01-19 23:59:39 -05:00
|
|
|
generic_ivar_set(obj, id, val);
|
1998-01-16 07:13:05 -05:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
return val;
|
|
|
|
}
|
|
|
|
|
|
|
|
VALUE
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
rb_ivar_defined(VALUE obj, ID id)
|
1998-01-16 07:13:05 -05:00
|
|
|
{
|
2008-02-13 06:52:46 -05:00
|
|
|
VALUE val;
|
|
|
|
struct st_table *iv_index_tbl;
|
2007-09-28 02:21:46 -04:00
|
|
|
st_data_t index;
|
1998-01-16 07:13:05 -05:00
|
|
|
switch (TYPE(obj)) {
|
|
|
|
case T_OBJECT:
|
2008-02-13 06:52:46 -05:00
|
|
|
iv_index_tbl = ROBJECT_IV_INDEX_TBL(obj);
|
|
|
|
if (!iv_index_tbl) break;
|
|
|
|
if (!st_lookup(iv_index_tbl, id, &index)) break;
|
2008-02-25 11:18:18 -05:00
|
|
|
if (ROBJECT_NUMIV(obj) <= index) break;
|
|
|
|
val = ROBJECT_IVPTR(obj)[index];
|
2007-09-28 02:21:46 -04:00
|
|
|
if (val != Qundef)
|
|
|
|
return Qtrue;
|
|
|
|
break;
|
1998-01-16 07:13:05 -05:00
|
|
|
case T_CLASS:
|
|
|
|
case T_MODULE:
|
2007-09-28 02:21:46 -04:00
|
|
|
if (RCLASS_IV_TBL(obj) && st_lookup(RCLASS_IV_TBL(obj), id, 0))
|
1999-01-19 23:59:39 -05:00
|
|
|
return Qtrue;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
if (FL_TEST(obj, FL_EXIVAR) || rb_special_const_p(obj))
|
|
|
|
return generic_ivar_defined(obj, id);
|
1998-01-16 07:13:05 -05:00
|
|
|
break;
|
|
|
|
}
|
1999-01-19 23:59:39 -05:00
|
|
|
return Qfalse;
|
1998-01-16 07:13:05 -05:00
|
|
|
}
|
|
|
|
|
2007-09-28 02:21:46 -04:00
|
|
|
struct obj_ivar_tag {
|
|
|
|
VALUE obj;
|
|
|
|
int (*func)(ID key, VALUE val, st_data_t arg);
|
|
|
|
st_data_t arg;
|
|
|
|
};
|
|
|
|
|
1998-01-16 07:19:22 -05:00
|
|
|
static int
|
2007-09-28 02:21:46 -04:00
|
|
|
obj_ivar_i(ID key, VALUE index, struct obj_ivar_tag *data)
|
|
|
|
{
|
2008-02-25 11:18:18 -05:00
|
|
|
if (index < ROBJECT_NUMIV(data->obj)) {
|
|
|
|
VALUE val = ROBJECT_IVPTR(data->obj)[index];
|
2007-09-28 02:21:46 -04:00
|
|
|
if (val != Qundef) {
|
|
|
|
return (data->func)(key, val, data->arg);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return ST_CONTINUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
obj_ivar_each(VALUE obj, int (*func)(ANYARGS), st_data_t arg)
|
|
|
|
{
|
|
|
|
st_table *tbl;
|
|
|
|
struct obj_ivar_tag data;
|
|
|
|
|
2008-02-13 06:52:46 -05:00
|
|
|
tbl = ROBJECT_IV_INDEX_TBL(obj);
|
2007-09-28 02:21:46 -04:00
|
|
|
if (!tbl)
|
|
|
|
return;
|
|
|
|
|
|
|
|
data.obj = obj;
|
2007-09-29 11:56:50 -04:00
|
|
|
data.func = (int (*)(ID key, VALUE val, st_data_t arg))func;
|
2007-09-28 02:21:46 -04:00
|
|
|
data.arg = arg;
|
|
|
|
|
|
|
|
st_foreach_safe(tbl, obj_ivar_i, (st_data_t)&data);
|
|
|
|
}
|
|
|
|
|
|
|
|
void rb_ivar_foreach(VALUE obj, int (*func)(ANYARGS), st_data_t arg)
|
|
|
|
{
|
|
|
|
switch (TYPE(obj)) {
|
|
|
|
case T_OBJECT:
|
|
|
|
obj_ivar_each(obj, func, arg);
|
|
|
|
break;
|
|
|
|
case T_CLASS:
|
|
|
|
case T_MODULE:
|
|
|
|
if (RCLASS_IV_TBL(obj)) {
|
|
|
|
st_foreach_safe(RCLASS_IV_TBL(obj), func, arg);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
if (!generic_iv_tbl) break;
|
|
|
|
if (FL_TEST(obj, FL_EXIVAR) || rb_special_const_p(obj)) {
|
|
|
|
st_data_t tbl;
|
|
|
|
|
|
|
|
if (st_lookup(generic_iv_tbl, obj, &tbl)) {
|
|
|
|
st_foreach_safe((st_table *)tbl, func, arg);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
ivar_i(ID key, VALUE val, VALUE ary)
|
1998-01-16 07:19:22 -05:00
|
|
|
{
|
* parse.y, compile.c, gc.c, insns.def, intern.h, iseq.c, node.h,
object.c, string.c, variable.c, vm_macro.def: revert private
instance variable feature, which is postponed until next major
release.
* marshal.c: TYPE_SYMBOL2 removed; MARSHAL_MINOR reverted back to
8th version.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11813 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-02-22 21:49:41 -05:00
|
|
|
if (rb_is_instance_id(key)) {
|
2006-09-04 01:46:47 -04:00
|
|
|
rb_ary_push(ary, ID2SYM(key));
|
1998-01-16 07:19:22 -05:00
|
|
|
}
|
|
|
|
return ST_CONTINUE;
|
|
|
|
}
|
|
|
|
|
2003-12-28 01:33:07 -05:00
|
|
|
/*
|
|
|
|
* call-seq:
|
|
|
|
* obj.instance_variables => array
|
|
|
|
*
|
|
|
|
* Returns an array of instance variable names for the receiver. Note
|
|
|
|
* that simply defining an accessor does not create the corresponding
|
|
|
|
* instance variable.
|
|
|
|
*
|
|
|
|
* class Fred
|
|
|
|
* attr_accessor :a1
|
|
|
|
* def initialize
|
|
|
|
* @iv = 3
|
|
|
|
* end
|
|
|
|
* end
|
2008-03-08 20:04:46 -05:00
|
|
|
* Fred.new.instance_variables #=> [:@iv]
|
2003-12-28 01:33:07 -05:00
|
|
|
*/
|
|
|
|
|
1998-01-16 07:19:22 -05:00
|
|
|
VALUE
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
rb_obj_instance_variables(VALUE obj)
|
1998-01-16 07:19:22 -05:00
|
|
|
{
|
1999-12-14 01:50:43 -05:00
|
|
|
VALUE ary;
|
1998-01-16 07:19:22 -05:00
|
|
|
|
1999-12-14 01:50:43 -05:00
|
|
|
ary = rb_ary_new();
|
2007-09-28 02:21:46 -04:00
|
|
|
rb_ivar_foreach(obj, ivar_i, ary);
|
1999-10-04 00:51:08 -04:00
|
|
|
return ary;
|
1998-01-16 07:19:22 -05:00
|
|
|
}
|
|
|
|
|
2003-12-28 01:33:07 -05:00
|
|
|
/*
|
|
|
|
* call-seq:
|
|
|
|
* obj.remove_instance_variable(symbol) => obj
|
|
|
|
*
|
|
|
|
* Removes the named instance variable from <i>obj</i>, returning that
|
|
|
|
* variable's value.
|
|
|
|
*
|
|
|
|
* class Dummy
|
|
|
|
* attr_reader :var
|
|
|
|
* def initialize
|
|
|
|
* @var = 99
|
|
|
|
* end
|
|
|
|
* def remove
|
|
|
|
* remove_instance_variable(:@var)
|
|
|
|
* end
|
|
|
|
* end
|
|
|
|
* d = Dummy.new
|
|
|
|
* d.var #=> 99
|
|
|
|
* d.remove #=> 99
|
|
|
|
* d.var #=> nil
|
|
|
|
*/
|
|
|
|
|
1998-01-16 07:19:22 -05:00
|
|
|
VALUE
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
rb_obj_remove_instance_variable(VALUE obj, VALUE name)
|
1998-01-16 07:19:22 -05:00
|
|
|
{
|
1999-01-19 23:59:39 -05:00
|
|
|
VALUE val = Qnil;
|
1998-01-16 07:19:22 -05:00
|
|
|
ID id = rb_to_id(name);
|
2008-02-13 06:52:46 -05:00
|
|
|
struct st_table *iv_index_tbl;
|
2007-09-28 02:21:46 -04:00
|
|
|
st_data_t index;
|
1998-01-16 07:19:22 -05:00
|
|
|
|
1999-12-14 01:50:43 -05:00
|
|
|
if (!OBJ_TAINTED(obj) && rb_safe_level() >= 4)
|
1999-08-13 01:45:20 -04:00
|
|
|
rb_raise(rb_eSecurityError, "Insecure: can't modify instance variable");
|
2000-01-31 22:12:21 -05:00
|
|
|
if (OBJ_FROZEN(obj)) rb_error_frozen("object");
|
1999-01-19 23:59:39 -05:00
|
|
|
if (!rb_is_instance_id(id)) {
|
2003-04-09 14:33:52 -04:00
|
|
|
rb_name_error(id, "`%s' is not allowed as an instance variable name", rb_id2name(id));
|
1998-01-16 07:19:22 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
switch (TYPE(obj)) {
|
|
|
|
case T_OBJECT:
|
2008-02-13 06:52:46 -05:00
|
|
|
iv_index_tbl = ROBJECT_IV_INDEX_TBL(obj);
|
|
|
|
if (!iv_index_tbl) break;
|
|
|
|
if (!st_lookup(iv_index_tbl, id, &index)) break;
|
2008-02-25 11:18:18 -05:00
|
|
|
if (ROBJECT_NUMIV(obj) <= index) break;
|
|
|
|
val = ROBJECT_IVPTR(obj)[index];
|
2007-09-28 02:21:46 -04:00
|
|
|
if (val != Qundef) {
|
2008-02-25 11:18:18 -05:00
|
|
|
ROBJECT_IVPTR(obj)[index] = Qundef;
|
2007-09-28 02:21:46 -04:00
|
|
|
return val;
|
|
|
|
}
|
|
|
|
break;
|
1998-01-16 07:19:22 -05:00
|
|
|
case T_CLASS:
|
|
|
|
case T_MODULE:
|
2007-09-28 02:21:46 -04:00
|
|
|
if (RCLASS_IV_TBL(obj) && st_delete(RCLASS_IV_TBL(obj), (st_data_t*)&id, &val)) {
|
2002-04-10 04:45:26 -04:00
|
|
|
return val;
|
1998-01-16 07:19:22 -05:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
default:
|
2002-04-10 04:45:26 -04:00
|
|
|
if (FL_TEST(obj, FL_EXIVAR) || rb_special_const_p(obj)) {
|
|
|
|
if (generic_ivar_remove(obj, id, &val)) {
|
|
|
|
return val;
|
|
|
|
}
|
|
|
|
}
|
1998-01-16 07:19:22 -05:00
|
|
|
break;
|
|
|
|
}
|
2002-04-10 04:45:26 -04:00
|
|
|
rb_name_error(id, "instance variable %s not defined", rb_id2name(id));
|
|
|
|
return Qnil; /* not reached */
|
1998-01-16 07:19:22 -05:00
|
|
|
}
|
|
|
|
|
* bignum.c: changed `foo _((boo))' to `foo(boo)`. [ruby-dev:27056]
* defines.h, dir.c, dln.h, enumerator.c, env.h, error.c, eval.c, file.c,
gc.c, hash.c, inits.c, intern.h, io.c, lex.c, marshal.c, missing.h,
node.h, numeric.c, pack.c, process.c, re.h, ruby.c, ruby.h, rubyio.h,
rubysig.h, signal.c, sprintf.c, st.h, string.c, struct.c, time.c,
util.c, util.h, variable.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9155 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-14 02:32:32 -04:00
|
|
|
NORETURN(static void uninitialized_constant(VALUE, ID));
|
* eval.c (ev_const_defined, ev_const_get), variable.c
(rb_const_get_at, rb_const_get, rb_mod_remove_const): use Qundef
as autoload marker. [ruby-dev:18103], [ruby-dev:18184]
* eval.c (rb_mod_autoload, rb_mod_autoload_p): new method;
Module#autoload, Module#autoload?.
* variable.c (rb_autoload, rb_autoload_load, rb_autoload_p):
manage autoload constants per classes/modules.
* variable.c (rb_const_defined_at, rb_const_defined): return false
for autoloading constants.
* class.c (rb_define_class, rb_define_module), eval.c (rb_eval),
variable.c (rb_mod_const_at, rb_const_assign): removed autoload
stuff.
* intern.h: prototypes; rb_autoload, rb_autoload_load,
rb_autoload_p.
* lib/optparse.rb (OptionParser::Switch::PlacedArgument::parse):
do not treat unmatched argument as an option.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3874 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2003-05-28 20:11:11 -04:00
|
|
|
static void
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
uninitialized_constant(VALUE klass, ID id)
|
* eval.c (ev_const_defined, ev_const_get), variable.c
(rb_const_get_at, rb_const_get, rb_mod_remove_const): use Qundef
as autoload marker. [ruby-dev:18103], [ruby-dev:18184]
* eval.c (rb_mod_autoload, rb_mod_autoload_p): new method;
Module#autoload, Module#autoload?.
* variable.c (rb_autoload, rb_autoload_load, rb_autoload_p):
manage autoload constants per classes/modules.
* variable.c (rb_const_defined_at, rb_const_defined): return false
for autoloading constants.
* class.c (rb_define_class, rb_define_module), eval.c (rb_eval),
variable.c (rb_mod_const_at, rb_const_assign): removed autoload
stuff.
* intern.h: prototypes; rb_autoload, rb_autoload_load,
rb_autoload_p.
* lib/optparse.rb (OptionParser::Switch::PlacedArgument::parse):
do not treat unmatched argument as an option.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3874 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2003-05-28 20:11:11 -04:00
|
|
|
{
|
|
|
|
if (klass && klass != rb_cObject)
|
|
|
|
rb_name_error(id, "uninitialized constant %s::%s",
|
2004-01-19 04:19:31 -05:00
|
|
|
rb_class2name(klass),
|
* eval.c (ev_const_defined, ev_const_get), variable.c
(rb_const_get_at, rb_const_get, rb_mod_remove_const): use Qundef
as autoload marker. [ruby-dev:18103], [ruby-dev:18184]
* eval.c (rb_mod_autoload, rb_mod_autoload_p): new method;
Module#autoload, Module#autoload?.
* variable.c (rb_autoload, rb_autoload_load, rb_autoload_p):
manage autoload constants per classes/modules.
* variable.c (rb_const_defined_at, rb_const_defined): return false
for autoloading constants.
* class.c (rb_define_class, rb_define_module), eval.c (rb_eval),
variable.c (rb_mod_const_at, rb_const_assign): removed autoload
stuff.
* intern.h: prototypes; rb_autoload, rb_autoload_load,
rb_autoload_p.
* lib/optparse.rb (OptionParser::Switch::PlacedArgument::parse):
do not treat unmatched argument as an option.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3874 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2003-05-28 20:11:11 -04:00
|
|
|
rb_id2name(id));
|
|
|
|
else {
|
2003-05-29 17:21:23 -04:00
|
|
|
rb_name_error(id, "uninitialized constant %s", rb_id2name(id));
|
* eval.c (ev_const_defined, ev_const_get), variable.c
(rb_const_get_at, rb_const_get, rb_mod_remove_const): use Qundef
as autoload marker. [ruby-dev:18103], [ruby-dev:18184]
* eval.c (rb_mod_autoload, rb_mod_autoload_p): new method;
Module#autoload, Module#autoload?.
* variable.c (rb_autoload, rb_autoload_load, rb_autoload_p):
manage autoload constants per classes/modules.
* variable.c (rb_const_defined_at, rb_const_defined): return false
for autoloading constants.
* class.c (rb_define_class, rb_define_module), eval.c (rb_eval),
variable.c (rb_mod_const_at, rb_const_assign): removed autoload
stuff.
* intern.h: prototypes; rb_autoload, rb_autoload_load,
rb_autoload_p.
* lib/optparse.rb (OptionParser::Switch::PlacedArgument::parse):
do not treat unmatched argument as an option.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3874 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2003-05-28 20:11:11 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2003-07-22 04:42:47 -04:00
|
|
|
static VALUE
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
const_missing(VALUE klass, ID id)
|
2003-07-22 04:42:47 -04:00
|
|
|
{
|
|
|
|
return rb_funcall(klass, rb_intern("const_missing"), 1, ID2SYM(id));
|
|
|
|
}
|
|
|
|
|
2003-12-28 01:33:07 -05:00
|
|
|
|
|
|
|
/*
|
|
|
|
* call-seq:
|
|
|
|
* mod.const_missing(sym) => obj
|
|
|
|
*
|
|
|
|
* Invoked when a reference is made to an undefined constant in
|
|
|
|
* <i>mod</i>. It is passed a symbol for the undefined constant, and
|
|
|
|
* returns a value to be used for that constant. The
|
|
|
|
* following code is a (very bad) example: if reference is made to
|
|
|
|
* an undefined constant, it attempts to load a file whose name is
|
|
|
|
* the lowercase version of the constant (thus class <code>Fred</code> is
|
|
|
|
* assumed to be in file <code>fred.rb</code>). If found, it returns the
|
|
|
|
* value of the loaded class. It therefore implements a perverse
|
|
|
|
* kind of autoload facility.
|
|
|
|
*
|
|
|
|
* def Object.const_missing(name)
|
|
|
|
* @looked_for ||= {}
|
|
|
|
* str_name = name.to_s
|
|
|
|
* raise "Class not found: #{name}" if @looked_for[str_name]
|
|
|
|
* @looked_for[str_name] = 1
|
|
|
|
* file = str_name.downcase
|
|
|
|
* require file
|
|
|
|
* klass = const_get(name)
|
|
|
|
* return klass if klass
|
|
|
|
* raise "Class not found: #{name}"
|
|
|
|
* end
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
2003-07-22 04:42:47 -04:00
|
|
|
VALUE
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
rb_mod_const_missing(VALUE klass, VALUE name)
|
2003-07-22 04:42:47 -04:00
|
|
|
{
|
2006-12-31 10:02:22 -05:00
|
|
|
rb_frame_pop(); /* pop frame for "const_missing" */
|
2003-07-22 04:42:47 -04:00
|
|
|
uninitialized_constant(klass, rb_to_id(name));
|
|
|
|
return Qnil; /* not reached */
|
|
|
|
}
|
|
|
|
|
* eval.c (ev_const_defined, ev_const_get), variable.c
(rb_const_get_at, rb_const_get, rb_mod_remove_const): use Qundef
as autoload marker. [ruby-dev:18103], [ruby-dev:18184]
* eval.c (rb_mod_autoload, rb_mod_autoload_p): new method;
Module#autoload, Module#autoload?.
* variable.c (rb_autoload, rb_autoload_load, rb_autoload_p):
manage autoload constants per classes/modules.
* variable.c (rb_const_defined_at, rb_const_defined): return false
for autoloading constants.
* class.c (rb_define_class, rb_define_module), eval.c (rb_eval),
variable.c (rb_mod_const_at, rb_const_assign): removed autoload
stuff.
* intern.h: prototypes; rb_autoload, rb_autoload_load,
rb_autoload_p.
* lib/optparse.rb (OptionParser::Switch::PlacedArgument::parse):
do not treat unmatched argument as an option.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3874 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2003-05-28 20:11:11 -04:00
|
|
|
static struct st_table *
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
check_autoload_table(VALUE av)
|
* eval.c (ev_const_defined, ev_const_get), variable.c
(rb_const_get_at, rb_const_get, rb_mod_remove_const): use Qundef
as autoload marker. [ruby-dev:18103], [ruby-dev:18184]
* eval.c (rb_mod_autoload, rb_mod_autoload_p): new method;
Module#autoload, Module#autoload?.
* variable.c (rb_autoload, rb_autoload_load, rb_autoload_p):
manage autoload constants per classes/modules.
* variable.c (rb_const_defined_at, rb_const_defined): return false
for autoloading constants.
* class.c (rb_define_class, rb_define_module), eval.c (rb_eval),
variable.c (rb_mod_const_at, rb_const_assign): removed autoload
stuff.
* intern.h: prototypes; rb_autoload, rb_autoload_load,
rb_autoload_p.
* lib/optparse.rb (OptionParser::Switch::PlacedArgument::parse):
do not treat unmatched argument as an option.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3874 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2003-05-28 20:11:11 -04:00
|
|
|
{
|
|
|
|
Check_Type(av, T_DATA);
|
|
|
|
if (RDATA(av)->dmark != (RUBY_DATA_FUNC)rb_mark_tbl ||
|
|
|
|
RDATA(av)->dfree != (RUBY_DATA_FUNC)st_free_table) {
|
2007-09-01 08:56:29 -04:00
|
|
|
VALUE desc = rb_inspect(av);
|
|
|
|
rb_raise(rb_eTypeError, "wrong autoload table: %s", RSTRING_PTR(desc));
|
* eval.c (ev_const_defined, ev_const_get), variable.c
(rb_const_get_at, rb_const_get, rb_mod_remove_const): use Qundef
as autoload marker. [ruby-dev:18103], [ruby-dev:18184]
* eval.c (rb_mod_autoload, rb_mod_autoload_p): new method;
Module#autoload, Module#autoload?.
* variable.c (rb_autoload, rb_autoload_load, rb_autoload_p):
manage autoload constants per classes/modules.
* variable.c (rb_const_defined_at, rb_const_defined): return false
for autoloading constants.
* class.c (rb_define_class, rb_define_module), eval.c (rb_eval),
variable.c (rb_mod_const_at, rb_const_assign): removed autoload
stuff.
* intern.h: prototypes; rb_autoload, rb_autoload_load,
rb_autoload_p.
* lib/optparse.rb (OptionParser::Switch::PlacedArgument::parse):
do not treat unmatched argument as an option.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3874 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2003-05-28 20:11:11 -04:00
|
|
|
}
|
|
|
|
return (struct st_table *)DATA_PTR(av);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
rb_autoload(VALUE mod, ID id, const char *file)
|
* eval.c (ev_const_defined, ev_const_get), variable.c
(rb_const_get_at, rb_const_get, rb_mod_remove_const): use Qundef
as autoload marker. [ruby-dev:18103], [ruby-dev:18184]
* eval.c (rb_mod_autoload, rb_mod_autoload_p): new method;
Module#autoload, Module#autoload?.
* variable.c (rb_autoload, rb_autoload_load, rb_autoload_p):
manage autoload constants per classes/modules.
* variable.c (rb_const_defined_at, rb_const_defined): return false
for autoloading constants.
* class.c (rb_define_class, rb_define_module), eval.c (rb_eval),
variable.c (rb_mod_const_at, rb_const_assign): removed autoload
stuff.
* intern.h: prototypes; rb_autoload, rb_autoload_load,
rb_autoload_p.
* lib/optparse.rb (OptionParser::Switch::PlacedArgument::parse):
do not treat unmatched argument as an option.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3874 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2003-05-28 20:11:11 -04:00
|
|
|
{
|
2003-10-13 10:57:36 -04:00
|
|
|
VALUE av, fn;
|
* eval.c (ev_const_defined, ev_const_get), variable.c
(rb_const_get_at, rb_const_get, rb_mod_remove_const): use Qundef
as autoload marker. [ruby-dev:18103], [ruby-dev:18184]
* eval.c (rb_mod_autoload, rb_mod_autoload_p): new method;
Module#autoload, Module#autoload?.
* variable.c (rb_autoload, rb_autoload_load, rb_autoload_p):
manage autoload constants per classes/modules.
* variable.c (rb_const_defined_at, rb_const_defined): return false
for autoloading constants.
* class.c (rb_define_class, rb_define_module), eval.c (rb_eval),
variable.c (rb_mod_const_at, rb_const_assign): removed autoload
stuff.
* intern.h: prototypes; rb_autoload, rb_autoload_load,
rb_autoload_p.
* lib/optparse.rb (OptionParser::Switch::PlacedArgument::parse):
do not treat unmatched argument as an option.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3874 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2003-05-28 20:11:11 -04:00
|
|
|
struct st_table *tbl;
|
|
|
|
|
|
|
|
if (!rb_is_const_id(id)) {
|
2005-09-23 20:17:43 -04:00
|
|
|
rb_raise(rb_eNameError, "autoload must be constant name: %s", rb_id2name(id));
|
* eval.c (ev_const_defined, ev_const_get), variable.c
(rb_const_get_at, rb_const_get, rb_mod_remove_const): use Qundef
as autoload marker. [ruby-dev:18103], [ruby-dev:18184]
* eval.c (rb_mod_autoload, rb_mod_autoload_p): new method;
Module#autoload, Module#autoload?.
* variable.c (rb_autoload, rb_autoload_load, rb_autoload_p):
manage autoload constants per classes/modules.
* variable.c (rb_const_defined_at, rb_const_defined): return false
for autoloading constants.
* class.c (rb_define_class, rb_define_module), eval.c (rb_eval),
variable.c (rb_mod_const_at, rb_const_assign): removed autoload
stuff.
* intern.h: prototypes; rb_autoload, rb_autoload_load,
rb_autoload_p.
* lib/optparse.rb (OptionParser::Switch::PlacedArgument::parse):
do not treat unmatched argument as an option.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3874 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2003-05-28 20:11:11 -04:00
|
|
|
}
|
|
|
|
if (!file || !*file) {
|
|
|
|
rb_raise(rb_eArgError, "empty file name");
|
|
|
|
}
|
|
|
|
|
2007-09-28 02:21:46 -04:00
|
|
|
if ((tbl = RCLASS_IV_TBL(mod)) && st_lookup(tbl, id, &av) && av != Qundef)
|
* eval.c (ev_const_defined, ev_const_get), variable.c
(rb_const_get_at, rb_const_get, rb_mod_remove_const): use Qundef
as autoload marker. [ruby-dev:18103], [ruby-dev:18184]
* eval.c (rb_mod_autoload, rb_mod_autoload_p): new method;
Module#autoload, Module#autoload?.
* variable.c (rb_autoload, rb_autoload_load, rb_autoload_p):
manage autoload constants per classes/modules.
* variable.c (rb_const_defined_at, rb_const_defined): return false
for autoloading constants.
* class.c (rb_define_class, rb_define_module), eval.c (rb_eval),
variable.c (rb_mod_const_at, rb_const_assign): removed autoload
stuff.
* intern.h: prototypes; rb_autoload, rb_autoload_load,
rb_autoload_p.
* lib/optparse.rb (OptionParser::Switch::PlacedArgument::parse):
do not treat unmatched argument as an option.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3874 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2003-05-28 20:11:11 -04:00
|
|
|
return;
|
|
|
|
|
|
|
|
rb_const_set(mod, id, Qundef);
|
2007-09-28 02:21:46 -04:00
|
|
|
tbl = RCLASS_IV_TBL(mod);
|
* eval.c (ev_const_defined, ev_const_get), variable.c
(rb_const_get_at, rb_const_get, rb_mod_remove_const): use Qundef
as autoload marker. [ruby-dev:18103], [ruby-dev:18184]
* eval.c (rb_mod_autoload, rb_mod_autoload_p): new method;
Module#autoload, Module#autoload?.
* variable.c (rb_autoload, rb_autoload_load, rb_autoload_p):
manage autoload constants per classes/modules.
* variable.c (rb_const_defined_at, rb_const_defined): return false
for autoloading constants.
* class.c (rb_define_class, rb_define_module), eval.c (rb_eval),
variable.c (rb_mod_const_at, rb_const_assign): removed autoload
stuff.
* intern.h: prototypes; rb_autoload, rb_autoload_load,
rb_autoload_p.
* lib/optparse.rb (OptionParser::Switch::PlacedArgument::parse):
do not treat unmatched argument as an option.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3874 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2003-05-28 20:11:11 -04:00
|
|
|
if (st_lookup(tbl, autoload, &av)) {
|
|
|
|
tbl = check_autoload_table(av);
|
|
|
|
}
|
|
|
|
else {
|
* array.c: replace rb_protect_inspect() and rb_inspecting_p() by
rb_exec_recursive() in eval.c.
* eval.c (rb_exec_recursive): new function.
* array.c (rb_ary_join): use rb_exec_recursive().
* array.c (rb_ary_inspect, rb_ary_hash): ditto.
* file.c (rb_file_join): ditto.
* hash.c (rb_hash_inspect, rb_hash_to_s, rb_hash_hash): ditto.
* io.c (rb_io_puts): ditto.
* object.c (rb_obj_inspect): ditto
* struct.c (rb_struct_inspect): ditto.
* lib/set.rb (SortedSet::setup): a hack to shut up warning.
[ruby-talk:132866]
* lib/time.rb (Time::strptime): add new function. inspired by
[ruby-talk:132815].
* lib/parsedate.rb (ParseDate::strptime): ditto.
* regparse.c: move st_*_strend() functions from st.c. fixed some
potential memory leaks.
* exception error messages updated. [ruby-core:04497]
* ext/socket/socket.c (Init_socket): add bunch of Socket
constants. Patch from Sam Roberts <sroberts@uniserve.com>.
[ruby-core:04409]
* array.c (rb_ary_s_create): no need for negative argc check.
[ruby-core:04463]
* array.c (rb_ary_unshift_m): ditto.
* lib/xmlrpc/parser.rb (XMLRPC::FaultException): make it subclass
of StandardError class, not Exception class. [ruby-core:04429]
* parse.y (fcall_gen): lvar(arg) will be evaluated as
lvar.call(arg) when lvar is a defined local variable. [new]
* object.c (rb_class_initialize): call inherited method before
calling initializing block.
* eval.c (rb_thread_start_1): initialize newly pushed frame.
* lib/open3.rb (Open3::popen3): $? should not be EXIT_FAILURE.
fixed: [ruby-core:04444]
* eval.c (is_defined): NODE_IASGN is an assignment.
* ext/readline/readline.c (Readline.readline): use rl_outstream
and rl_instream. [ruby-dev:25699]
* ext/etc/etc.c (Init_etc): sGroup needs HAVE_ST_GR_PASSWD check
[ruby-dev:25675]
* misc/ruby-mode.el: [ruby-core:04415]
* lib/rdoc/generators/html_generator.rb: [ruby-core:04412]
* lib/rdoc/generators/ri_generator.rb: ditto.
* struct.c (make_struct): fixed: [ruby-core:04402]
* ext/curses/curses.c (window_color_set): [ruby-core:04393]
* ext/socket/socket.c (Init_socket): SO_REUSEPORT added.
[ruby-talk:130092]
* object.c: [ruby-doc:818]
* parse.y (open_args): fix too verbose warnings for the space
before argument parentheses. [ruby-dev:25492]
* parse.y (parser_yylex): ditto.
* parse.y (parser_yylex): the first expression in the parentheses
should not be a command. [ruby-dev:25492]
* lib/irb/context.rb (IRB::Context::initialize): [ruby-core:04330]
* object.c (Init_Object): remove Object#type. [ruby-core:04335]
* st.c (st_foreach): report success/failure by return value.
[ruby-Bugs-1396]
* parse.y: forgot to initialize parser struct. [ruby-dev:25492]
* parse.y (parser_yylex): no tLABEL on EXPR_BEG.
[ruby-talk:127711]
* document updates - [ruby-core:04296], [ruby-core:04301],
[ruby-core:04302], [ruby-core:04307]
* dir.c (rb_push_glob): should work for NUL delimited patterns.
* dir.c (rb_glob2): should aware of offset in the pattern.
* string.c (rb_str_new4): should propagate taintedness.
* env.h: rename member names in struct FRAME; last_func -> callee,
orig_func -> this_func, last_class -> this_class.
* struct.c (rb_struct_set): use original method name, not callee
name, to retrieve member slot. [ruby-core:04268]
* time.c (time_strftime): protect from format modification from GC
finalizers.
* object.c (Init_Object): remove rb_obj_id_obsolete()
* eval.c (rb_mod_define_method): incomplete subclass check.
[ruby-dev:25464]
* gc.c (rb_data_object_alloc): klass may be NULL.
[ruby-list:40498]
* bignum.c (rb_big_rand): should return positive random number.
[ruby-dev:25401]
* bignum.c (rb_big_rand): do not use rb_big_modulo to generate
random bignums. [ruby-dev:25396]
* variable.c (rb_autoload): [ruby-dev:25373]
* eval.c (svalue_to_avalue): [ruby-dev:25366]
* string.c (rb_str_justify): [ruby-dev:25367]
* io.c (rb_f_select): [ruby-dev:25312]
* ext/socket/socket.c (sock_s_getservbyport): [ruby-talk:124072]
* struct.c (make_struct): [ruby-dev:25249]
* dir.c (dir_open_dir): new function. [ruby-dev:25242]
* io.c (rb_f_open): add type check for return value from to_open.
* lib/pstore.rb (PStore#transaction): Use the empty content when a
file is not found. [ruby-dev:24561]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@8068 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-03-04 01:47:45 -05:00
|
|
|
av = Data_Wrap_Struct(0, rb_mark_tbl, st_free_table, 0);
|
* eval.c (ev_const_defined, ev_const_get), variable.c
(rb_const_get_at, rb_const_get, rb_mod_remove_const): use Qundef
as autoload marker. [ruby-dev:18103], [ruby-dev:18184]
* eval.c (rb_mod_autoload, rb_mod_autoload_p): new method;
Module#autoload, Module#autoload?.
* variable.c (rb_autoload, rb_autoload_load, rb_autoload_p):
manage autoload constants per classes/modules.
* variable.c (rb_const_defined_at, rb_const_defined): return false
for autoloading constants.
* class.c (rb_define_class, rb_define_module), eval.c (rb_eval),
variable.c (rb_mod_const_at, rb_const_assign): removed autoload
stuff.
* intern.h: prototypes; rb_autoload, rb_autoload_load,
rb_autoload_p.
* lib/optparse.rb (OptionParser::Switch::PlacedArgument::parse):
do not treat unmatched argument as an option.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3874 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2003-05-28 20:11:11 -04:00
|
|
|
st_add_direct(tbl, autoload, av);
|
|
|
|
DATA_PTR(av) = tbl = st_init_numtable();
|
|
|
|
}
|
2003-10-13 10:57:36 -04:00
|
|
|
fn = rb_str_new2(file);
|
|
|
|
FL_UNSET(fn, FL_TAINT);
|
|
|
|
OBJ_FREEZE(fn);
|
2006-12-31 10:02:22 -05:00
|
|
|
st_insert(tbl, id, (st_data_t)rb_node_newnode(NODE_MEMO, fn, rb_safe_level(), 0));
|
* eval.c (ev_const_defined, ev_const_get), variable.c
(rb_const_get_at, rb_const_get, rb_mod_remove_const): use Qundef
as autoload marker. [ruby-dev:18103], [ruby-dev:18184]
* eval.c (rb_mod_autoload, rb_mod_autoload_p): new method;
Module#autoload, Module#autoload?.
* variable.c (rb_autoload, rb_autoload_load, rb_autoload_p):
manage autoload constants per classes/modules.
* variable.c (rb_const_defined_at, rb_const_defined): return false
for autoloading constants.
* class.c (rb_define_class, rb_define_module), eval.c (rb_eval),
variable.c (rb_mod_const_at, rb_const_assign): removed autoload
stuff.
* intern.h: prototypes; rb_autoload, rb_autoload_load,
rb_autoload_p.
* lib/optparse.rb (OptionParser::Switch::PlacedArgument::parse):
do not treat unmatched argument as an option.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3874 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2003-05-28 20:11:11 -04:00
|
|
|
}
|
|
|
|
|
2003-10-13 10:57:36 -04:00
|
|
|
static NODE*
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
autoload_delete(VALUE mod, ID id)
|
* eval.c (ev_const_defined, ev_const_get), variable.c
(rb_const_get_at, rb_const_get, rb_mod_remove_const): use Qundef
as autoload marker. [ruby-dev:18103], [ruby-dev:18184]
* eval.c (rb_mod_autoload, rb_mod_autoload_p): new method;
Module#autoload, Module#autoload?.
* variable.c (rb_autoload, rb_autoload_load, rb_autoload_p):
manage autoload constants per classes/modules.
* variable.c (rb_const_defined_at, rb_const_defined): return false
for autoloading constants.
* class.c (rb_define_class, rb_define_module), eval.c (rb_eval),
variable.c (rb_mod_const_at, rb_const_assign): removed autoload
stuff.
* intern.h: prototypes; rb_autoload, rb_autoload_load,
rb_autoload_p.
* lib/optparse.rb (OptionParser::Switch::PlacedArgument::parse):
do not treat unmatched argument as an option.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3874 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2003-05-28 20:11:11 -04:00
|
|
|
{
|
2003-10-13 10:57:36 -04:00
|
|
|
VALUE val;
|
|
|
|
st_data_t load = 0;
|
* eval.c (ev_const_defined, ev_const_get), variable.c
(rb_const_get_at, rb_const_get, rb_mod_remove_const): use Qundef
as autoload marker. [ruby-dev:18103], [ruby-dev:18184]
* eval.c (rb_mod_autoload, rb_mod_autoload_p): new method;
Module#autoload, Module#autoload?.
* variable.c (rb_autoload, rb_autoload_load, rb_autoload_p):
manage autoload constants per classes/modules.
* variable.c (rb_const_defined_at, rb_const_defined): return false
for autoloading constants.
* class.c (rb_define_class, rb_define_module), eval.c (rb_eval),
variable.c (rb_mod_const_at, rb_const_assign): removed autoload
stuff.
* intern.h: prototypes; rb_autoload, rb_autoload_load,
rb_autoload_p.
* lib/optparse.rb (OptionParser::Switch::PlacedArgument::parse):
do not treat unmatched argument as an option.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3874 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2003-05-28 20:11:11 -04:00
|
|
|
|
2007-09-28 02:21:46 -04:00
|
|
|
st_delete(RCLASS_IV_TBL(mod), (st_data_t*)&id, 0);
|
|
|
|
if (st_lookup(RCLASS_IV_TBL(mod), autoload, &val)) {
|
* eval.c (ev_const_defined, ev_const_get), variable.c
(rb_const_get_at, rb_const_get, rb_mod_remove_const): use Qundef
as autoload marker. [ruby-dev:18103], [ruby-dev:18184]
* eval.c (rb_mod_autoload, rb_mod_autoload_p): new method;
Module#autoload, Module#autoload?.
* variable.c (rb_autoload, rb_autoload_load, rb_autoload_p):
manage autoload constants per classes/modules.
* variable.c (rb_const_defined_at, rb_const_defined): return false
for autoloading constants.
* class.c (rb_define_class, rb_define_module), eval.c (rb_eval),
variable.c (rb_mod_const_at, rb_const_assign): removed autoload
stuff.
* intern.h: prototypes; rb_autoload, rb_autoload_load,
rb_autoload_p.
* lib/optparse.rb (OptionParser::Switch::PlacedArgument::parse):
do not treat unmatched argument as an option.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3874 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2003-05-28 20:11:11 -04:00
|
|
|
struct st_table *tbl = check_autoload_table(val);
|
|
|
|
|
2003-10-13 10:57:36 -04:00
|
|
|
st_delete(tbl, (st_data_t*)&id, &load);
|
* eval.c (ev_const_defined, ev_const_get), variable.c
(rb_const_get_at, rb_const_get, rb_mod_remove_const): use Qundef
as autoload marker. [ruby-dev:18103], [ruby-dev:18184]
* eval.c (rb_mod_autoload, rb_mod_autoload_p): new method;
Module#autoload, Module#autoload?.
* variable.c (rb_autoload, rb_autoload_load, rb_autoload_p):
manage autoload constants per classes/modules.
* variable.c (rb_const_defined_at, rb_const_defined): return false
for autoloading constants.
* class.c (rb_define_class, rb_define_module), eval.c (rb_eval),
variable.c (rb_mod_const_at, rb_const_assign): removed autoload
stuff.
* intern.h: prototypes; rb_autoload, rb_autoload_load,
rb_autoload_p.
* lib/optparse.rb (OptionParser::Switch::PlacedArgument::parse):
do not treat unmatched argument as an option.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3874 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2003-05-28 20:11:11 -04:00
|
|
|
|
2003-06-25 01:28:24 -04:00
|
|
|
if (tbl->num_entries == 0) {
|
* eval.c (ev_const_defined, ev_const_get), variable.c
(rb_const_get_at, rb_const_get, rb_mod_remove_const): use Qundef
as autoload marker. [ruby-dev:18103], [ruby-dev:18184]
* eval.c (rb_mod_autoload, rb_mod_autoload_p): new method;
Module#autoload, Module#autoload?.
* variable.c (rb_autoload, rb_autoload_load, rb_autoload_p):
manage autoload constants per classes/modules.
* variable.c (rb_const_defined_at, rb_const_defined): return false
for autoloading constants.
* class.c (rb_define_class, rb_define_module), eval.c (rb_eval),
variable.c (rb_mod_const_at, rb_const_assign): removed autoload
stuff.
* intern.h: prototypes; rb_autoload, rb_autoload_load,
rb_autoload_p.
* lib/optparse.rb (OptionParser::Switch::PlacedArgument::parse):
do not treat unmatched argument as an option.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3874 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2003-05-28 20:11:11 -04:00
|
|
|
DATA_PTR(val) = 0;
|
|
|
|
st_free_table(tbl);
|
|
|
|
id = autoload;
|
2007-09-28 02:21:46 -04:00
|
|
|
if (st_delete(RCLASS_IV_TBL(mod), (st_data_t*)&id, &val)) {
|
* eval.c (ev_const_defined, ev_const_get), variable.c
(rb_const_get_at, rb_const_get, rb_mod_remove_const): use Qundef
as autoload marker. [ruby-dev:18103], [ruby-dev:18184]
* eval.c (rb_mod_autoload, rb_mod_autoload_p): new method;
Module#autoload, Module#autoload?.
* variable.c (rb_autoload, rb_autoload_load, rb_autoload_p):
manage autoload constants per classes/modules.
* variable.c (rb_const_defined_at, rb_const_defined): return false
for autoloading constants.
* class.c (rb_define_class, rb_define_module), eval.c (rb_eval),
variable.c (rb_mod_const_at, rb_const_assign): removed autoload
stuff.
* intern.h: prototypes; rb_autoload, rb_autoload_load,
rb_autoload_p.
* lib/optparse.rb (OptionParser::Switch::PlacedArgument::parse):
do not treat unmatched argument as an option.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3874 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2003-05-28 20:11:11 -04:00
|
|
|
rb_gc_force_recycle(val);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2003-10-13 10:57:36 -04:00
|
|
|
return (NODE *)load;
|
* eval.c (ev_const_defined, ev_const_get), variable.c
(rb_const_get_at, rb_const_get, rb_mod_remove_const): use Qundef
as autoload marker. [ruby-dev:18103], [ruby-dev:18184]
* eval.c (rb_mod_autoload, rb_mod_autoload_p): new method;
Module#autoload, Module#autoload?.
* variable.c (rb_autoload, rb_autoload_load, rb_autoload_p):
manage autoload constants per classes/modules.
* variable.c (rb_const_defined_at, rb_const_defined): return false
for autoloading constants.
* class.c (rb_define_class, rb_define_module), eval.c (rb_eval),
variable.c (rb_mod_const_at, rb_const_assign): removed autoload
stuff.
* intern.h: prototypes; rb_autoload, rb_autoload_load,
rb_autoload_p.
* lib/optparse.rb (OptionParser::Switch::PlacedArgument::parse):
do not treat unmatched argument as an option.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3874 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2003-05-28 20:11:11 -04:00
|
|
|
}
|
|
|
|
|
2005-09-28 11:58:32 -04:00
|
|
|
VALUE
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
rb_autoload_load(VALUE klass, ID id)
|
* eval.c (ev_const_defined, ev_const_get), variable.c
(rb_const_get_at, rb_const_get, rb_mod_remove_const): use Qundef
as autoload marker. [ruby-dev:18103], [ruby-dev:18184]
* eval.c (rb_mod_autoload, rb_mod_autoload_p): new method;
Module#autoload, Module#autoload?.
* variable.c (rb_autoload, rb_autoload_load, rb_autoload_p):
manage autoload constants per classes/modules.
* variable.c (rb_const_defined_at, rb_const_defined): return false
for autoloading constants.
* class.c (rb_define_class, rb_define_module), eval.c (rb_eval),
variable.c (rb_mod_const_at, rb_const_assign): removed autoload
stuff.
* intern.h: prototypes; rb_autoload, rb_autoload_load,
rb_autoload_p.
* lib/optparse.rb (OptionParser::Switch::PlacedArgument::parse):
do not treat unmatched argument as an option.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3874 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2003-05-28 20:11:11 -04:00
|
|
|
{
|
2003-07-24 14:33:50 -04:00
|
|
|
VALUE file;
|
2003-10-13 10:57:36 -04:00
|
|
|
NODE *load = autoload_delete(klass, id);
|
* eval.c (ev_const_defined, ev_const_get), variable.c
(rb_const_get_at, rb_const_get, rb_mod_remove_const): use Qundef
as autoload marker. [ruby-dev:18103], [ruby-dev:18184]
* eval.c (rb_mod_autoload, rb_mod_autoload_p): new method;
Module#autoload, Module#autoload?.
* variable.c (rb_autoload, rb_autoload_load, rb_autoload_p):
manage autoload constants per classes/modules.
* variable.c (rb_const_defined_at, rb_const_defined): return false
for autoloading constants.
* class.c (rb_define_class, rb_define_module), eval.c (rb_eval),
variable.c (rb_mod_const_at, rb_const_assign): removed autoload
stuff.
* intern.h: prototypes; rb_autoload, rb_autoload_load,
rb_autoload_p.
* lib/optparse.rb (OptionParser::Switch::PlacedArgument::parse):
do not treat unmatched argument as an option.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3874 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2003-05-28 20:11:11 -04:00
|
|
|
|
2008-04-07 14:39:28 -04:00
|
|
|
if (!load || !(file = load->nd_lit)) {
|
2005-09-28 11:58:32 -04:00
|
|
|
return Qfalse;
|
* eval.c (ev_const_defined, ev_const_get), variable.c
(rb_const_get_at, rb_const_get, rb_mod_remove_const): use Qundef
as autoload marker. [ruby-dev:18103], [ruby-dev:18184]
* eval.c (rb_mod_autoload, rb_mod_autoload_p): new method;
Module#autoload, Module#autoload?.
* variable.c (rb_autoload, rb_autoload_load, rb_autoload_p):
manage autoload constants per classes/modules.
* variable.c (rb_const_defined_at, rb_const_defined): return false
for autoloading constants.
* class.c (rb_define_class, rb_define_module), eval.c (rb_eval),
variable.c (rb_mod_const_at, rb_const_assign): removed autoload
stuff.
* intern.h: prototypes; rb_autoload, rb_autoload_load,
rb_autoload_p.
* lib/optparse.rb (OptionParser::Switch::PlacedArgument::parse):
do not treat unmatched argument as an option.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3874 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2003-05-28 20:11:11 -04:00
|
|
|
}
|
2005-09-28 11:58:32 -04:00
|
|
|
return rb_require_safe(file, load->nd_nth);
|
* eval.c (ev_const_defined, ev_const_get), variable.c
(rb_const_get_at, rb_const_get, rb_mod_remove_const): use Qundef
as autoload marker. [ruby-dev:18103], [ruby-dev:18184]
* eval.c (rb_mod_autoload, rb_mod_autoload_p): new method;
Module#autoload, Module#autoload?.
* variable.c (rb_autoload, rb_autoload_load, rb_autoload_p):
manage autoload constants per classes/modules.
* variable.c (rb_const_defined_at, rb_const_defined): return false
for autoloading constants.
* class.c (rb_define_class, rb_define_module), eval.c (rb_eval),
variable.c (rb_mod_const_at, rb_const_assign): removed autoload
stuff.
* intern.h: prototypes; rb_autoload, rb_autoload_load,
rb_autoload_p.
* lib/optparse.rb (OptionParser::Switch::PlacedArgument::parse):
do not treat unmatched argument as an option.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3874 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2003-05-28 20:11:11 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
static VALUE
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
autoload_file(VALUE mod, ID id)
|
* eval.c (ev_const_defined, ev_const_get), variable.c
(rb_const_get_at, rb_const_get, rb_mod_remove_const): use Qundef
as autoload marker. [ruby-dev:18103], [ruby-dev:18184]
* eval.c (rb_mod_autoload, rb_mod_autoload_p): new method;
Module#autoload, Module#autoload?.
* variable.c (rb_autoload, rb_autoload_load, rb_autoload_p):
manage autoload constants per classes/modules.
* variable.c (rb_const_defined_at, rb_const_defined): return false
for autoloading constants.
* class.c (rb_define_class, rb_define_module), eval.c (rb_eval),
variable.c (rb_mod_const_at, rb_const_assign): removed autoload
stuff.
* intern.h: prototypes; rb_autoload, rb_autoload_load,
rb_autoload_p.
* lib/optparse.rb (OptionParser::Switch::PlacedArgument::parse):
do not treat unmatched argument as an option.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3874 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2003-05-28 20:11:11 -04:00
|
|
|
{
|
|
|
|
VALUE val, file;
|
|
|
|
struct st_table *tbl;
|
2003-10-13 10:57:36 -04:00
|
|
|
st_data_t load;
|
* eval.c (ev_const_defined, ev_const_get), variable.c
(rb_const_get_at, rb_const_get, rb_mod_remove_const): use Qundef
as autoload marker. [ruby-dev:18103], [ruby-dev:18184]
* eval.c (rb_mod_autoload, rb_mod_autoload_p): new method;
Module#autoload, Module#autoload?.
* variable.c (rb_autoload, rb_autoload_load, rb_autoload_p):
manage autoload constants per classes/modules.
* variable.c (rb_const_defined_at, rb_const_defined): return false
for autoloading constants.
* class.c (rb_define_class, rb_define_module), eval.c (rb_eval),
variable.c (rb_mod_const_at, rb_const_assign): removed autoload
stuff.
* intern.h: prototypes; rb_autoload, rb_autoload_load,
rb_autoload_p.
* lib/optparse.rb (OptionParser::Switch::PlacedArgument::parse):
do not treat unmatched argument as an option.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3874 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2003-05-28 20:11:11 -04:00
|
|
|
|
2007-09-28 02:21:46 -04:00
|
|
|
if (!st_lookup(RCLASS_IV_TBL(mod), autoload, &val) ||
|
2003-10-13 10:57:36 -04:00
|
|
|
!(tbl = check_autoload_table(val)) || !st_lookup(tbl, id, &load)) {
|
* eval.c (ev_const_defined, ev_const_get), variable.c
(rb_const_get_at, rb_const_get, rb_mod_remove_const): use Qundef
as autoload marker. [ruby-dev:18103], [ruby-dev:18184]
* eval.c (rb_mod_autoload, rb_mod_autoload_p): new method;
Module#autoload, Module#autoload?.
* variable.c (rb_autoload, rb_autoload_load, rb_autoload_p):
manage autoload constants per classes/modules.
* variable.c (rb_const_defined_at, rb_const_defined): return false
for autoloading constants.
* class.c (rb_define_class, rb_define_module), eval.c (rb_eval),
variable.c (rb_mod_const_at, rb_const_assign): removed autoload
stuff.
* intern.h: prototypes; rb_autoload, rb_autoload_load,
rb_autoload_p.
* lib/optparse.rb (OptionParser::Switch::PlacedArgument::parse):
do not treat unmatched argument as an option.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3874 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2003-05-28 20:11:11 -04:00
|
|
|
return Qnil;
|
|
|
|
}
|
2003-10-13 10:57:36 -04:00
|
|
|
file = ((NODE *)load)->nd_lit;
|
* eval.c (ev_const_defined, ev_const_get), variable.c
(rb_const_get_at, rb_const_get, rb_mod_remove_const): use Qundef
as autoload marker. [ruby-dev:18103], [ruby-dev:18184]
* eval.c (rb_mod_autoload, rb_mod_autoload_p): new method;
Module#autoload, Module#autoload?.
* variable.c (rb_autoload, rb_autoload_load, rb_autoload_p):
manage autoload constants per classes/modules.
* variable.c (rb_const_defined_at, rb_const_defined): return false
for autoloading constants.
* class.c (rb_define_class, rb_define_module), eval.c (rb_eval),
variable.c (rb_mod_const_at, rb_const_assign): removed autoload
stuff.
* intern.h: prototypes; rb_autoload, rb_autoload_load,
rb_autoload_p.
* lib/optparse.rb (OptionParser::Switch::PlacedArgument::parse):
do not treat unmatched argument as an option.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3874 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2003-05-28 20:11:11 -04:00
|
|
|
Check_Type(file, T_STRING);
|
2008-04-07 14:39:28 -04:00
|
|
|
if (!RSTRING_PTR(file) || !*RSTRING_PTR(file)) {
|
* eval.c (ev_const_defined, ev_const_get), variable.c
(rb_const_get_at, rb_const_get, rb_mod_remove_const): use Qundef
as autoload marker. [ruby-dev:18103], [ruby-dev:18184]
* eval.c (rb_mod_autoload, rb_mod_autoload_p): new method;
Module#autoload, Module#autoload?.
* variable.c (rb_autoload, rb_autoload_load, rb_autoload_p):
manage autoload constants per classes/modules.
* variable.c (rb_const_defined_at, rb_const_defined): return false
for autoloading constants.
* class.c (rb_define_class, rb_define_module), eval.c (rb_eval),
variable.c (rb_mod_const_at, rb_const_assign): removed autoload
stuff.
* intern.h: prototypes; rb_autoload, rb_autoload_load,
rb_autoload_p.
* lib/optparse.rb (OptionParser::Switch::PlacedArgument::parse):
do not treat unmatched argument as an option.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3874 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2003-05-28 20:11:11 -04:00
|
|
|
rb_raise(rb_eArgError, "empty file name");
|
|
|
|
}
|
2006-08-31 06:47:44 -04:00
|
|
|
if (!rb_provided(RSTRING_PTR(file))) {
|
* eval.c (ev_const_defined, ev_const_get), variable.c
(rb_const_get_at, rb_const_get, rb_mod_remove_const): use Qundef
as autoload marker. [ruby-dev:18103], [ruby-dev:18184]
* eval.c (rb_mod_autoload, rb_mod_autoload_p): new method;
Module#autoload, Module#autoload?.
* variable.c (rb_autoload, rb_autoload_load, rb_autoload_p):
manage autoload constants per classes/modules.
* variable.c (rb_const_defined_at, rb_const_defined): return false
for autoloading constants.
* class.c (rb_define_class, rb_define_module), eval.c (rb_eval),
variable.c (rb_mod_const_at, rb_const_assign): removed autoload
stuff.
* intern.h: prototypes; rb_autoload, rb_autoload_load,
rb_autoload_p.
* lib/optparse.rb (OptionParser::Switch::PlacedArgument::parse):
do not treat unmatched argument as an option.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3874 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2003-05-28 20:11:11 -04:00
|
|
|
return file;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* already loaded but not defined */
|
2003-07-25 01:36:55 -04:00
|
|
|
st_delete(tbl, (st_data_t*)&id, 0);
|
* eval.c (ev_const_defined, ev_const_get), variable.c
(rb_const_get_at, rb_const_get, rb_mod_remove_const): use Qundef
as autoload marker. [ruby-dev:18103], [ruby-dev:18184]
* eval.c (rb_mod_autoload, rb_mod_autoload_p): new method;
Module#autoload, Module#autoload?.
* variable.c (rb_autoload, rb_autoload_load, rb_autoload_p):
manage autoload constants per classes/modules.
* variable.c (rb_const_defined_at, rb_const_defined): return false
for autoloading constants.
* class.c (rb_define_class, rb_define_module), eval.c (rb_eval),
variable.c (rb_mod_const_at, rb_const_assign): removed autoload
stuff.
* intern.h: prototypes; rb_autoload, rb_autoload_load,
rb_autoload_p.
* lib/optparse.rb (OptionParser::Switch::PlacedArgument::parse):
do not treat unmatched argument as an option.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3874 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2003-05-28 20:11:11 -04:00
|
|
|
if (!tbl->num_entries) {
|
|
|
|
DATA_PTR(val) = 0;
|
|
|
|
st_free_table(tbl);
|
|
|
|
id = autoload;
|
2007-09-28 02:21:46 -04:00
|
|
|
if (st_delete(RCLASS_IV_TBL(mod), (st_data_t*)&id, &val)) {
|
* eval.c (ev_const_defined, ev_const_get), variable.c
(rb_const_get_at, rb_const_get, rb_mod_remove_const): use Qundef
as autoload marker. [ruby-dev:18103], [ruby-dev:18184]
* eval.c (rb_mod_autoload, rb_mod_autoload_p): new method;
Module#autoload, Module#autoload?.
* variable.c (rb_autoload, rb_autoload_load, rb_autoload_p):
manage autoload constants per classes/modules.
* variable.c (rb_const_defined_at, rb_const_defined): return false
for autoloading constants.
* class.c (rb_define_class, rb_define_module), eval.c (rb_eval),
variable.c (rb_mod_const_at, rb_const_assign): removed autoload
stuff.
* intern.h: prototypes; rb_autoload, rb_autoload_load,
rb_autoload_p.
* lib/optparse.rb (OptionParser::Switch::PlacedArgument::parse):
do not treat unmatched argument as an option.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3874 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2003-05-28 20:11:11 -04:00
|
|
|
rb_gc_force_recycle(val);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return Qnil;
|
|
|
|
}
|
|
|
|
|
|
|
|
VALUE
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
rb_autoload_p(VALUE mod, ID id)
|
* eval.c (ev_const_defined, ev_const_get), variable.c
(rb_const_get_at, rb_const_get, rb_mod_remove_const): use Qundef
as autoload marker. [ruby-dev:18103], [ruby-dev:18184]
* eval.c (rb_mod_autoload, rb_mod_autoload_p): new method;
Module#autoload, Module#autoload?.
* variable.c (rb_autoload, rb_autoload_load, rb_autoload_p):
manage autoload constants per classes/modules.
* variable.c (rb_const_defined_at, rb_const_defined): return false
for autoloading constants.
* class.c (rb_define_class, rb_define_module), eval.c (rb_eval),
variable.c (rb_mod_const_at, rb_const_assign): removed autoload
stuff.
* intern.h: prototypes; rb_autoload, rb_autoload_load,
rb_autoload_p.
* lib/optparse.rb (OptionParser::Switch::PlacedArgument::parse):
do not treat unmatched argument as an option.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3874 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2003-05-28 20:11:11 -04:00
|
|
|
{
|
2007-09-28 02:21:46 -04:00
|
|
|
struct st_table *tbl = RCLASS_IV_TBL(mod);
|
* eval.c (ev_const_defined, ev_const_get), variable.c
(rb_const_get_at, rb_const_get, rb_mod_remove_const): use Qundef
as autoload marker. [ruby-dev:18103], [ruby-dev:18184]
* eval.c (rb_mod_autoload, rb_mod_autoload_p): new method;
Module#autoload, Module#autoload?.
* variable.c (rb_autoload, rb_autoload_load, rb_autoload_p):
manage autoload constants per classes/modules.
* variable.c (rb_const_defined_at, rb_const_defined): return false
for autoloading constants.
* class.c (rb_define_class, rb_define_module), eval.c (rb_eval),
variable.c (rb_mod_const_at, rb_const_assign): removed autoload
stuff.
* intern.h: prototypes; rb_autoload, rb_autoload_load,
rb_autoload_p.
* lib/optparse.rb (OptionParser::Switch::PlacedArgument::parse):
do not treat unmatched argument as an option.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3874 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2003-05-28 20:11:11 -04:00
|
|
|
VALUE val;
|
|
|
|
|
|
|
|
if (!tbl || !st_lookup(tbl, id, &val) || val != Qundef) {
|
|
|
|
return Qnil;
|
|
|
|
}
|
|
|
|
return autoload_file(mod, id);
|
|
|
|
}
|
|
|
|
|
2003-06-20 03:11:44 -04:00
|
|
|
static VALUE
|
2006-12-31 10:02:22 -05:00
|
|
|
rb_const_get_0(VALUE klass, ID id, int exclude, int recurse)
|
1998-01-16 07:13:05 -05:00
|
|
|
{
|
2001-05-02 00:22:21 -04:00
|
|
|
VALUE value, tmp;
|
2006-12-31 10:02:22 -05:00
|
|
|
int mod_retry = 0;
|
1998-01-16 07:13:05 -05:00
|
|
|
|
1999-01-19 23:59:39 -05:00
|
|
|
tmp = klass;
|
2001-05-02 00:22:21 -04:00
|
|
|
retry:
|
2008-04-07 14:39:28 -04:00
|
|
|
while (RTEST(tmp)) {
|
2007-09-28 02:21:46 -04:00
|
|
|
while (RCLASS_IV_TBL(tmp) && st_lookup(RCLASS_IV_TBL(tmp),id,&value)) {
|
* eval.c (ev_const_defined, ev_const_get), variable.c
(rb_const_get_at, rb_const_get, rb_mod_remove_const): use Qundef
as autoload marker. [ruby-dev:18103], [ruby-dev:18184]
* eval.c (rb_mod_autoload, rb_mod_autoload_p): new method;
Module#autoload, Module#autoload?.
* variable.c (rb_autoload, rb_autoload_load, rb_autoload_p):
manage autoload constants per classes/modules.
* variable.c (rb_const_defined_at, rb_const_defined): return false
for autoloading constants.
* class.c (rb_define_class, rb_define_module), eval.c (rb_eval),
variable.c (rb_mod_const_at, rb_const_assign): removed autoload
stuff.
* intern.h: prototypes; rb_autoload, rb_autoload_load,
rb_autoload_p.
* lib/optparse.rb (OptionParser::Switch::PlacedArgument::parse):
do not treat unmatched argument as an option.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3874 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2003-05-28 20:11:11 -04:00
|
|
|
if (value == Qundef) {
|
2005-09-28 11:58:32 -04:00
|
|
|
if (!RTEST(rb_autoload_load(tmp, id))) break;
|
* eval.c (ev_const_defined, ev_const_get), variable.c
(rb_const_get_at, rb_const_get, rb_mod_remove_const): use Qundef
as autoload marker. [ruby-dev:18103], [ruby-dev:18184]
* eval.c (rb_mod_autoload, rb_mod_autoload_p): new method;
Module#autoload, Module#autoload?.
* variable.c (rb_autoload, rb_autoload_load, rb_autoload_p):
manage autoload constants per classes/modules.
* variable.c (rb_const_defined_at, rb_const_defined): return false
for autoloading constants.
* class.c (rb_define_class, rb_define_module), eval.c (rb_eval),
variable.c (rb_mod_const_at, rb_const_assign): removed autoload
stuff.
* intern.h: prototypes; rb_autoload, rb_autoload_load,
rb_autoload_p.
* lib/optparse.rb (OptionParser::Switch::PlacedArgument::parse):
do not treat unmatched argument as an option.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3874 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2003-05-28 20:11:11 -04:00
|
|
|
continue;
|
|
|
|
}
|
2003-07-09 18:28:42 -04:00
|
|
|
if (exclude && tmp == rb_cObject && klass != rb_cObject) {
|
|
|
|
rb_warn("toplevel constant %s referenced by %s::%s",
|
|
|
|
rb_id2name(id), rb_class2name(klass), rb_id2name(id));
|
|
|
|
}
|
1998-01-16 07:13:05 -05:00
|
|
|
return value;
|
|
|
|
}
|
2006-12-31 10:02:22 -05:00
|
|
|
if (!recurse && klass != rb_cObject) break;
|
2007-09-28 02:21:46 -04:00
|
|
|
tmp = RCLASS_SUPER(tmp);
|
1998-01-16 07:13:05 -05:00
|
|
|
}
|
2006-12-31 10:02:22 -05:00
|
|
|
if (!exclude && !mod_retry && BUILTIN_TYPE(klass) == T_MODULE) {
|
|
|
|
mod_retry = 1;
|
|
|
|
tmp = rb_cObject;
|
|
|
|
goto retry;
|
1998-01-16 07:13:05 -05:00
|
|
|
}
|
2006-12-31 10:02:22 -05:00
|
|
|
|
2003-07-22 04:42:47 -04:00
|
|
|
return const_missing(klass, id);
|
1998-01-16 07:13:05 -05:00
|
|
|
}
|
|
|
|
|
2003-06-20 03:11:44 -04:00
|
|
|
VALUE
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
rb_const_get_from(VALUE klass, ID id)
|
2003-06-20 03:11:44 -04:00
|
|
|
{
|
2006-12-31 10:02:22 -05:00
|
|
|
return rb_const_get_0(klass, id, Qtrue, Qtrue);
|
2003-06-20 03:11:44 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
VALUE
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
rb_const_get(VALUE klass, ID id)
|
2003-06-20 03:11:44 -04:00
|
|
|
{
|
2006-12-31 10:02:22 -05:00
|
|
|
return rb_const_get_0(klass, id, Qfalse, Qtrue);
|
2003-08-28 04:35:43 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
VALUE
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
rb_const_get_at(VALUE klass, ID id)
|
2003-08-28 04:35:43 -04:00
|
|
|
{
|
2006-12-31 10:02:22 -05:00
|
|
|
return rb_const_get_0(klass, id, Qtrue, Qfalse);
|
2003-06-20 03:11:44 -04:00
|
|
|
}
|
|
|
|
|
2003-12-28 01:33:07 -05:00
|
|
|
/*
|
|
|
|
* call-seq:
|
|
|
|
* remove_const(sym) => obj
|
|
|
|
*
|
|
|
|
* Removes the definition of the given constant, returning that
|
|
|
|
* constant's value. Predefined classes and singleton objects (such as
|
|
|
|
* <i>true</i>) cannot be removed.
|
|
|
|
*/
|
|
|
|
|
1999-01-19 23:59:39 -05:00
|
|
|
VALUE
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
rb_mod_remove_const(VALUE mod, VALUE name)
|
1999-01-19 23:59:39 -05:00
|
|
|
{
|
|
|
|
ID id = rb_to_id(name);
|
|
|
|
VALUE val;
|
|
|
|
|
2006-12-31 10:02:22 -05:00
|
|
|
rb_vm_change_state();
|
|
|
|
|
1999-12-14 01:50:43 -05:00
|
|
|
if (!rb_is_const_id(id)) {
|
2003-04-09 14:33:52 -04:00
|
|
|
rb_name_error(id, "`%s' is not allowed as a constant name", rb_id2name(id));
|
1999-01-19 23:59:39 -05:00
|
|
|
}
|
2000-01-31 22:12:21 -05:00
|
|
|
if (!OBJ_TAINTED(mod) && rb_safe_level() >= 4)
|
|
|
|
rb_raise(rb_eSecurityError, "Insecure: can't remove constant");
|
|
|
|
if (OBJ_FROZEN(mod)) rb_error_frozen("class/module");
|
1999-01-19 23:59:39 -05:00
|
|
|
|
2007-09-28 02:21:46 -04:00
|
|
|
if (RCLASS_IV_TBL(mod) && st_delete(RCLASS_IV_TBL(mod), (st_data_t*)&id, &val)) {
|
2003-05-29 17:21:23 -04:00
|
|
|
if (val == Qundef) {
|
|
|
|
autoload_delete(mod, id);
|
|
|
|
val = Qnil;
|
|
|
|
}
|
1999-01-19 23:59:39 -05:00
|
|
|
return val;
|
|
|
|
}
|
1999-12-14 01:50:43 -05:00
|
|
|
if (rb_const_defined_at(mod, id)) {
|
* eval.c (ev_const_defined, ev_const_get), variable.c
(rb_const_get_at, rb_const_get, rb_mod_remove_const): use Qundef
as autoload marker. [ruby-dev:18103], [ruby-dev:18184]
* eval.c (rb_mod_autoload, rb_mod_autoload_p): new method;
Module#autoload, Module#autoload?.
* variable.c (rb_autoload, rb_autoload_load, rb_autoload_p):
manage autoload constants per classes/modules.
* variable.c (rb_const_defined_at, rb_const_defined): return false
for autoloading constants.
* class.c (rb_define_class, rb_define_module), eval.c (rb_eval),
variable.c (rb_mod_const_at, rb_const_assign): removed autoload
stuff.
* intern.h: prototypes; rb_autoload, rb_autoload_load,
rb_autoload_p.
* lib/optparse.rb (OptionParser::Switch::PlacedArgument::parse):
do not treat unmatched argument as an option.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3874 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2003-05-28 20:11:11 -04:00
|
|
|
rb_name_error(id, "cannot remove %s::%s",
|
1999-01-19 23:59:39 -05:00
|
|
|
rb_class2name(mod), rb_id2name(id));
|
|
|
|
}
|
* eval.c (ev_const_defined, ev_const_get), variable.c
(rb_const_get_at, rb_const_get, rb_mod_remove_const): use Qundef
as autoload marker. [ruby-dev:18103], [ruby-dev:18184]
* eval.c (rb_mod_autoload, rb_mod_autoload_p): new method;
Module#autoload, Module#autoload?.
* variable.c (rb_autoload, rb_autoload_load, rb_autoload_p):
manage autoload constants per classes/modules.
* variable.c (rb_const_defined_at, rb_const_defined): return false
for autoloading constants.
* class.c (rb_define_class, rb_define_module), eval.c (rb_eval),
variable.c (rb_mod_const_at, rb_const_assign): removed autoload
stuff.
* intern.h: prototypes; rb_autoload, rb_autoload_load,
rb_autoload_p.
* lib/optparse.rb (OptionParser::Switch::PlacedArgument::parse):
do not treat unmatched argument as an option.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3874 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2003-05-28 20:11:11 -04:00
|
|
|
rb_name_error(id, "constant %s::%s not defined",
|
2001-07-02 04:46:28 -04:00
|
|
|
rb_class2name(mod), rb_id2name(id));
|
1999-01-19 23:59:39 -05:00
|
|
|
return Qnil; /* not reached */
|
|
|
|
}
|
|
|
|
|
1998-01-16 07:19:22 -05:00
|
|
|
static int
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
sv_i(ID key, VALUE value, st_table *tbl)
|
2001-06-05 03:19:39 -04:00
|
|
|
{
|
|
|
|
if (rb_is_const_id(key)) {
|
|
|
|
if (!st_lookup(tbl, key, 0)) {
|
|
|
|
st_insert(tbl, key, key);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return ST_CONTINUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
void*
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
rb_mod_const_at(VALUE mod, void *data)
|
1998-01-16 07:19:22 -05:00
|
|
|
{
|
2001-06-05 03:19:39 -04:00
|
|
|
st_table *tbl = data;
|
|
|
|
if (!tbl) {
|
|
|
|
tbl = st_init_numtable();
|
|
|
|
}
|
2007-09-28 02:21:46 -04:00
|
|
|
if (RCLASS_IV_TBL(mod)) {
|
|
|
|
st_foreach_safe(RCLASS_IV_TBL(mod), sv_i, (st_data_t)tbl);
|
1998-01-16 07:13:05 -05:00
|
|
|
}
|
2001-06-05 03:19:39 -04:00
|
|
|
return tbl;
|
1998-01-16 07:19:22 -05:00
|
|
|
}
|
|
|
|
|
2001-06-05 03:19:39 -04:00
|
|
|
void*
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
rb_mod_const_of(VALUE mod, void *data)
|
1998-01-16 07:19:22 -05:00
|
|
|
{
|
2003-07-03 07:02:53 -04:00
|
|
|
VALUE tmp = mod;
|
1998-01-16 07:19:22 -05:00
|
|
|
for (;;) {
|
2003-07-03 07:02:53 -04:00
|
|
|
data = rb_mod_const_at(tmp, data);
|
2007-09-28 02:21:46 -04:00
|
|
|
tmp = RCLASS_SUPER(tmp);
|
2003-07-03 07:02:53 -04:00
|
|
|
if (!tmp) break;
|
|
|
|
if (tmp == rb_cObject && mod != rb_cObject) break;
|
1998-01-16 07:19:22 -05:00
|
|
|
}
|
2001-06-05 03:19:39 -04:00
|
|
|
return data;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
list_i(ID key, ID value, VALUE ary)
|
2001-06-05 03:19:39 -04:00
|
|
|
{
|
2006-09-04 01:46:47 -04:00
|
|
|
rb_ary_push(ary, ID2SYM(key));
|
2001-06-05 03:19:39 -04:00
|
|
|
return ST_CONTINUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
VALUE
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
rb_const_list(void *data)
|
2001-06-05 03:19:39 -04:00
|
|
|
{
|
|
|
|
st_table *tbl = data;
|
|
|
|
VALUE ary;
|
|
|
|
|
|
|
|
if (!tbl) return rb_ary_new2(0);
|
|
|
|
ary = rb_ary_new2(tbl->num_entries);
|
2004-09-29 01:15:33 -04:00
|
|
|
st_foreach_safe(tbl, list_i, ary);
|
2002-03-20 06:15:19 -05:00
|
|
|
st_free_table(tbl);
|
2001-06-05 03:19:39 -04:00
|
|
|
|
1998-01-16 07:19:22 -05:00
|
|
|
return ary;
|
1998-01-16 07:13:05 -05:00
|
|
|
}
|
|
|
|
|
2003-12-28 01:33:07 -05:00
|
|
|
/*
|
|
|
|
* call-seq:
|
2006-12-04 10:19:33 -05:00
|
|
|
* mod.constants(inherit=true) => array
|
2006-12-31 10:02:22 -05:00
|
|
|
*
|
2003-12-28 01:33:07 -05:00
|
|
|
* Returns an array of the names of the constants accessible in
|
|
|
|
* <i>mod</i>. This includes the names of constants in any included
|
2006-12-04 10:19:33 -05:00
|
|
|
* modules (example at start of section), unless the <i>all</i>
|
|
|
|
* parameter is set to <code>false</code>.
|
|
|
|
*
|
2008-03-26 05:13:54 -04:00
|
|
|
* IO.constants.include?(:SYNC) => true
|
|
|
|
* IO.constants(false).include?(:SYNC) => false
|
2006-12-04 10:19:33 -05:00
|
|
|
*
|
|
|
|
* Also see <code>Module::const_defined?</code>.
|
2003-12-28 01:33:07 -05:00
|
|
|
*/
|
|
|
|
|
1999-11-17 02:30:37 -05:00
|
|
|
VALUE
|
2006-12-04 10:19:33 -05:00
|
|
|
rb_mod_constants(int argc, VALUE *argv, VALUE mod)
|
1999-11-17 02:30:37 -05:00
|
|
|
{
|
2006-12-04 10:19:33 -05:00
|
|
|
VALUE inherit;
|
|
|
|
st_table *tbl;
|
|
|
|
|
|
|
|
if (argc == 0) {
|
|
|
|
inherit = Qtrue;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
rb_scan_args(argc, argv, "01", &inherit);
|
|
|
|
}
|
|
|
|
if (RTEST(inherit)) {
|
|
|
|
tbl = rb_mod_const_of(mod, 0);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
tbl = rb_mod_const_at(mod, 0);
|
|
|
|
}
|
|
|
|
return rb_const_list(tbl);
|
1999-11-17 02:30:37 -05:00
|
|
|
}
|
|
|
|
|
2003-08-29 20:04:02 -04:00
|
|
|
static int
|
2006-12-31 10:02:22 -05:00
|
|
|
rb_const_defined_0(VALUE klass, ID id, int exclude, int recurse)
|
2003-06-20 03:11:44 -04:00
|
|
|
{
|
2003-10-01 23:00:23 -04:00
|
|
|
VALUE value, tmp;
|
2006-12-31 10:02:22 -05:00
|
|
|
int mod_retry = 0;
|
2003-06-20 03:11:44 -04:00
|
|
|
|
2003-10-01 23:00:23 -04:00
|
|
|
tmp = klass;
|
|
|
|
retry:
|
2003-06-20 03:11:44 -04:00
|
|
|
while (tmp) {
|
2007-09-28 02:21:46 -04:00
|
|
|
if (RCLASS_IV_TBL(tmp) && st_lookup(RCLASS_IV_TBL(tmp), id, &value)) {
|
2003-06-20 03:11:44 -04:00
|
|
|
if (value == Qundef && NIL_P(autoload_file(klass, id)))
|
|
|
|
return Qfalse;
|
|
|
|
return Qtrue;
|
|
|
|
}
|
2006-12-31 10:02:22 -05:00
|
|
|
if (!recurse && klass != rb_cObject) break;
|
2007-09-28 02:21:46 -04:00
|
|
|
tmp = RCLASS_SUPER(tmp);
|
2003-06-20 03:11:44 -04:00
|
|
|
}
|
2006-12-31 10:02:22 -05:00
|
|
|
if (!exclude && !mod_retry && BUILTIN_TYPE(klass) == T_MODULE) {
|
|
|
|
mod_retry = 1;
|
|
|
|
tmp = rb_cObject;
|
|
|
|
goto retry;
|
2003-08-29 20:04:02 -04:00
|
|
|
}
|
2003-06-20 03:11:44 -04:00
|
|
|
return Qfalse;
|
|
|
|
}
|
|
|
|
|
1998-01-16 07:13:05 -05:00
|
|
|
int
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
rb_const_defined_from(VALUE klass, ID id)
|
1998-01-16 07:13:05 -05:00
|
|
|
{
|
2006-12-31 10:02:22 -05:00
|
|
|
return rb_const_defined_0(klass, id, Qtrue, Qtrue);
|
2003-08-29 20:04:02 -04:00
|
|
|
}
|
1999-01-19 23:59:39 -05:00
|
|
|
|
2003-08-29 20:04:02 -04:00
|
|
|
int
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
rb_const_defined(VALUE klass, ID id)
|
2003-08-29 20:04:02 -04:00
|
|
|
{
|
2006-12-31 10:02:22 -05:00
|
|
|
return rb_const_defined_0(klass, id, Qfalse, Qtrue);
|
2003-08-29 20:04:02 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
int
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
rb_const_defined_at(VALUE klass, ID id)
|
2003-08-29 20:04:02 -04:00
|
|
|
{
|
2006-12-31 10:02:22 -05:00
|
|
|
return rb_const_defined_0(klass, id, Qtrue, Qfalse);
|
1998-01-16 07:13:05 -05:00
|
|
|
}
|
|
|
|
|
2000-02-18 01:59:36 -05:00
|
|
|
static void
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
mod_av_set(VALUE klass, ID id, VALUE val, int isconst)
|
1998-01-16 07:13:05 -05:00
|
|
|
{
|
* sprintf.c (rb_str_format): allow %c to print one character
string (e.g. ?x).
* lib/tempfile.rb (Tempfile::make_tmpname): put dot between
basename and pid. [ruby-talk:196272]
* parse.y (do_block): remove -> style block.
* parse.y (parser_yylex): remove tLAMBDA_ARG.
* eval.c (rb_call0): binding for the return event hook should have
consistent scope. [ruby-core:07928]
* eval.c (proc_invoke): return behavior should depend whether it
is surrounded by a lambda or a mere block.
* eval.c (formal_assign): handles post splat arguments.
* eval.c (rb_call0): ditto.
* st.c (strhash): use FNV-1a hash.
* parse.y (parser_yylex): removed experimental ';;' terminator.
* eval.c (rb_node_arity): should be aware of post splat arguments.
* eval.c (rb_proc_arity): ditto.
* parse.y (f_args): syntax rule enhanced to support arguments
after the splat.
* parse.y (block_param): ditto for block parameters.
* parse.y (f_post_arg): mandatory formal arguments after the splat
argument.
* parse.y (new_args_gen): generate nodes for mandatory formal
arguments after the splat argument.
* eval.c (rb_eval): dispatch mandatory formal arguments after the
splat argument.
* parse.y (args): allow more than one splat in the argument list.
* parse.y (method_call): allow aref [] to accept all kind of
method argument, including assocs, splat, and block argument.
* eval.c (SETUP_ARGS0): prepare block argument as well.
* lib/mathn.rb (Integer): remove Integer#gcd2. [ruby-core:07931]
* eval.c (error_line): print receivers true/false/nil specially.
* eval.c (rb_proc_yield): handles parameters in yield semantics.
* eval.c (nil_yield): gives LocalJumpError to denote no block
error.
* io.c (rb_io_getc): now takes one-character string.
* string.c (rb_str_hash): use FNV-1a hash from Fowler/Noll/Vo
hashing algorithm.
* string.c (rb_str_aref): str[0] now returns 1 character string,
instead of a fixnum. [Ruby2]
* parse.y (parser_yylex): ?c now returns 1 character string,
instead of a fixnum. [Ruby2]
* string.c (rb_str_aset): no longer support fixnum insertion.
* eval.c (umethod_bind): should not update original class.
[ruby-dev:28636]
* eval.c (ev_const_get): should support constant access from
within instance_eval(). [ruby-dev:28327]
* time.c (time_timeval): should round for usec floating
number. [ruby-core:07896]
* time.c (time_add): ditto.
* dir.c (sys_warning): should not call a vararg function
rb_sys_warning() indirectly. [ruby-core:07886]
* numeric.c (flo_divmod): the first element of Float#divmod should
be an integer. [ruby-dev:28589]
* test/ruby/test_float.rb: add tests for divmod, div, modulo and remainder.
* re.c (rb_reg_initialize): should not allow modifying literal
regexps. frozen check moved from rb_reg_initialize_m as well.
* re.c (rb_reg_initialize): should not modify untainted objects in
safe levels higher than 3.
* re.c (rb_memcmp): type change from char* to const void*.
* dir.c (dir_close): should not close untainted dir stream.
* dir.c (GetDIR): add tainted/frozen check for each dir operation.
* lib/rdoc/parsers/parse_rb.rb (RDoc::RubyParser::parse_symbol_arg):
typo fixed. a patch from Florian Gross <florg at florg.net>.
* eval.c (EXEC_EVENT_HOOK): trace_func may remove itself from
event_hooks. no guarantee for arbitrary hook deletion.
[ruby-dev:28632]
* util.c (ruby_strtod): differ addition to minimize error.
[ruby-dev:28619]
* util.c (ruby_strtod): should not raise ERANGE when the input
string does not have any digits. [ruby-dev:28629]
* eval.c (proc_invoke): should restore old ruby_frame->block.
thanks to ts <decoux at moulon.inra.fr>. [ruby-core:07833]
also fix [ruby-dev:28614] as well.
* signal.c (trap): sig should be less then NSIG. Coverity found
this bug. a patch from Kevin Tew <tewk at tewk.com>.
[ruby-core:07823]
* math.c (math_log2): add new method inspired by
[ruby-talk:191237].
* math.c (math_log): add optional base argument to Math::log().
[ruby-talk:191308]
* ext/syck/emitter.c (syck_scan_scalar): avoid accessing
uninitialized array element. a patch from Pat Eyler
<rubypate at gmail.com>. [ruby-core:07809]
* array.c (rb_ary_fill): initialize local variables first. a
patch from Pat Eyler <rubypate at gmail.com>. [ruby-core:07810]
* ext/syck/yaml2byte.c (syck_yaml2byte_handler): need to free
type_tag. a patch from Pat Eyler <rubypate at gmail.com>.
[ruby-core:07808]
* ext/socket/socket.c (make_hostent_internal): accept ai_family
check from Sam Roberts <sroberts at uniserve.com>.
[ruby-core:07691]
* util.c (ruby_strtod): should not cut off 18 digits for no
reason. [ruby-core:07796]
* array.c (rb_ary_fill): internalize local variable "beg" to
pacify Coverity. [ruby-core:07770]
* pack.c (pack_unpack): now supports CRLF newlines. a patch from
<tommy at tmtm.org>. [ruby-dev:28601]
* applied code clean-up patch from Stefan Huehner
<stefan at huehner.org>. [ruby-core:07764]
* lib/jcode.rb (String::tr_s): should have translated non
squeezing character sequence (i.e. a character) as well. thanks
to Hiroshi Ichikawa <gimite at gimite.ddo.jp> [ruby-list:42090]
* ext/socket/socket.c: document update patch from Sam Roberts
<sroberts at uniserve.com>. [ruby-core:07701]
* lib/mathn.rb (Integer): need not to remove gcd2. a patch from
NARUSE, Yui <naruse at airemix.com>. [ruby-dev:28570]
* parse.y (arg): too much NEW_LIST()
* eval.c (SETUP_ARGS0): remove unnecessary access to nd_alen.
* eval.c (rb_eval): use ARGSCAT for NODE_OP_ASGN1.
[ruby-dev:28585]
* parse.y (arg): use NODE_ARGSCAT for placeholder.
* lib/getoptlong.rb (GetoptLong::get): RDoc update patch from
mathew <meta at pobox.com>. [ruby-core:07738]
* variable.c (rb_const_set): raise error when no target klass is
supplied. [ruby-dev:28582]
* prec.c (prec_prec_f): documentation patch from
<gerardo.santana at gmail.com>. [ruby-core:07689]
* bignum.c (rb_big_pow): second operand may be too big even if
it's a Fixnum. [ruby-talk:187984]
* README.EXT: update symbol description. [ruby-talk:188104]
* COPYING: explicitly note GPLv2. [ruby-talk:187922]
* parse.y: remove some obsolete syntax rules (unparenthesized
method calls in argument list).
* eval.c (rb_call0): insecure calling should be checked for non
NODE_SCOPE method invocations too.
* eval.c (rb_alias): should preserve the current safe level as
well as method definition.
* process.c (rb_f_sleep): remove RDoc description about SIGALRM
which is not valid on the current implementation. [ruby-dev:28464]
Thu Mar 23 21:40:47 2006 K.Kosako <sndgk393 AT ybb.ne.jp>
* eval.c (method_missing): should support argument splat in
super. a bug in combination of super, splat and
method_missing. [ruby-talk:185438]
* configure.in: Solaris SunPro compiler -rapth patch from
<kuwa at labs.fujitsu.com>. [ruby-dev:28443]
* configure.in: remove enable_rpath=no for Solaris.
[ruby-dev:28440]
* ext/win32ole/win32ole.c (ole_val2olevariantdata): change behavior
of converting OLE Variant object with VT_ARRAY|VT_UI1 and Ruby
String object.
* ruby.1: a clarification patch from David Lutterkort
<dlutter at redhat.com>. [ruby-core:7508]
* lib/rdoc/ri/ri_paths.rb (RI::Paths): adding paths from rubygems
directories. a patch from Eric Hodel <drbrain at segment7.net>.
[ruby-core:07423]
* eval.c (rb_clear_cache_by_class): clearing wrong cache.
* ext/extmk.rb: use :remove_destination to install extension libraries
to avoid SEGV. [ruby-dev:28417]
* eval.c (rb_thread_fd_writable): should not re-schedule output
from KILLED thread (must be error printing).
* array.c (rb_ary_flatten_bang): allow specifying recursion
level. [ruby-talk:182170]
* array.c (rb_ary_flatten): ditto.
* gc.c (add_heap): a heap_slots may overflow. a patch from Stefan
Weil <weil at mail.berlios.de>.
* eval.c (rb_call): use separate cache for fcall/vcall
invocation.
* eval.c (rb_eval): NODE_FCALL, NODE_VCALL can call local
functions.
* eval.c (rb_mod_local): a new method to specify newly added
visibility "local".
* eval.c (search_method): search for local methods which are
visible only from the current class.
* class.c (rb_class_local_methods): a method to list local methods.
* object.c (Init_Object): add BasicObject class as a top level
BlankSlate class.
* ruby.h (SYM2ID): should not cast to signed long.
[ruby-core:07414]
* class.c (rb_include_module): allow module duplication.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@10235 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2006-06-09 17:20:17 -04:00
|
|
|
const char *dest = isconst ? "constant" : "class variable";
|
2000-12-08 02:10:38 -05:00
|
|
|
|
1999-12-14 01:50:43 -05:00
|
|
|
if (!OBJ_TAINTED(klass) && rb_safe_level() >= 4)
|
2006-12-31 10:02:22 -05:00
|
|
|
rb_raise(rb_eSecurityError, "Insecure: can't set %s", dest);
|
* gc.c (Init_stack): stack region is far smaller than usual if
pthread is used.
* marshal.c (w_extended): singleton methods should not be checked
when dumping via marshal_dump() or _dump(). [ruby-talk:85909]
* file.c (getcwdofdrv): avoid using getcwd() directly, use
my_getcwd() instead.
* merged NeXT, OpenStep, Rhapsody ports patch from Eric Sunshine
<sunshine@sunshineco.com>. [ruby-core:01596]
* marshal.c (w_object): LINK check earlier than anything else,
i.e. do not dump TYPE_IVAR for already dumped objects.
(ruby-bugs PR#1220)
* eval.c (rb_eval): call "inherited" only when a new class is
generated; not on reopening.
* eval.c (eval): prepend error position in evaluating string to
* configure.in: revived NextStep, OpenStep, and Rhapsody ports which
had become unbuildable; enhanced --enable-fat-binary option so that
it accepts a list of desired architectures (rather than assuming a
fixed list), or defaults to a platform-appropriate list if user does
not provide an explicit list; made the default list of architectures
for MAB (fat binary) more comprehensive; now uses -fno-common even
when building the interpreter (in addition to using it for
extensions), thus allowing the interpreter to be embedded into a
plugin module of an external project (in addition to allowing
embedding directly into an application); added checks for
<netinet/in_systm.h> (needed by `socket' extension) and getcwd(); now
ensures that -I/usr/local/include is employed when extensions'
extconf.rb scripts invoke have_header() since extension checks on
NextStep and OpenStep will fail without it if the desired resource
resides in the /usr/local tree; fixed formatting of --help message.
* Makefile.in: $(LIBRUBY_A) rule now deletes the archive before
invoking $(AR) since `ar' on Apple/NeXT can not "update" MAB archives
(see configure's --enable-fat-binary option); added rule for new
missing/getcwd.c.
* defines.h: fixed endian handling during MAB build (see configure's
--enable-fat-binary option) to ensure that all portions of the
project see the correct WORDS_BIGENDIAN value (some extension modules
were getting the wrong endian setting); added missing constants
GETPGRP_VOID, WNOHANG, WUNTRACED, X_OK, and type pid_t for NextStep
and OpenStep; removed unnecessary and problematic HAVE_SYS_WAIT_H
define in NeXT section.
* dir.c: do not allow NAMLEN() macro to trust dirent::d_namlen on
NextStep since, on some installations, this value always resolves
uselessly to zero.
* dln.c: added error reporting to NextStep extension loader since the
previous behavior of failing silently was not useful; now ensures
that NSLINKMODULE_OPTION_BINDNOW compatibility constant is defined
for OpenStep and Rhapsody; no longer includes <mach-o/dyld.h> twice
on Rhapsody since this header lacks multiple-include protection,
which resulted in "redefinition" compilation errors.
* main.c: also create hard reference to objc_msgSend() on NeXT
platforms (in addition to Apple platforms).
* lib/mkmf.rb: now exports XCFLAGS from configure script to extension
makefiles so that extensions can be built MAB (see configure's
--enable-fat-binary option); also utilize XCFLAGS in cc_command()
(but not cpp_command() because MAB flags are incompatible with
direct invocation of `cpp').
* ext/curses/extconf.rb: now additionally checks for presence of these
curses functions which are not present on NextStep or Openstep:
bkgd(), bkgdset(), color(), curs(), getbkgd(), init(), scrl(), set(),
setscrreg(), wattroff(), wattron(), wattrset(), wbkgd(), wbkgdset(),
wscrl(), wsetscrreg()
* ext/curses/curses.c: added appropriate #ifdef's for additional set of
curses functions now checked by extconf.rb; fixed curses_bkgd() and
window_bkgd() to correctly return boolean result rather than numeric
result; fixed window_getbkgd() to correctly signal an error by
returning nil rather than -1.
* ext/etc/etc.c: setup_passwd() and setup_group() now check for null
pointers before invoking rb_tainted_str_new2() upon fields extracted
from `struct passwd' and `struct group' since null pointers in some
fields are common on NextStep/OpenStep (especially so for the
`pw_comment' field) and rb_tainted_str_new2() throws an exception
when it receives a null pointer.
* ext/pty/pty.c: include "util.h" for strdup()/ruby_strdup() for
platforms such as NextStep and OpenStep which lack strdup().
* ext/socket/getaddrinfo.c: cast first argument of getservbyname(),
gethostbyaddr(), and gethostbyname() from (const char*) to non-const
(char*) for older platforms such as NextStep and OpenStep.
* ext/socket/socket.c: include "util.h" for strdup()/ruby_strdup() for
platforms such as NextStep and OpenStep which lack strdup(); include
<netinet/in_systm.h> if present for NextStep and OpenStep; cast first
argument of gethostbyaddr() and getservbyname() from (const char*) to
non-const (char*) for older platforms.
* ext/syslog/syslog.c: include "util.h" for strdup()/ruby_strdup() for
platforms such as NextStep and OpenStep which lack strdup().
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@5002 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2003-11-21 23:00:03 -05:00
|
|
|
if (OBJ_FROZEN(klass)) {
|
|
|
|
if (BUILTIN_TYPE(klass) == T_MODULE) {
|
|
|
|
rb_error_frozen("module");
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
rb_error_frozen("class");
|
|
|
|
}
|
|
|
|
}
|
2007-09-28 02:21:46 -04:00
|
|
|
if (!RCLASS_IV_TBL(klass)) {
|
|
|
|
RCLASS_IV_TBL(klass) = st_init_numtable();
|
1998-01-16 07:13:05 -05:00
|
|
|
}
|
2001-08-23 02:02:15 -04:00
|
|
|
else if (isconst) {
|
* eval.c (ev_const_defined, ev_const_get), variable.c
(rb_const_get_at, rb_const_get, rb_mod_remove_const): use Qundef
as autoload marker. [ruby-dev:18103], [ruby-dev:18184]
* eval.c (rb_mod_autoload, rb_mod_autoload_p): new method;
Module#autoload, Module#autoload?.
* variable.c (rb_autoload, rb_autoload_load, rb_autoload_p):
manage autoload constants per classes/modules.
* variable.c (rb_const_defined_at, rb_const_defined): return false
for autoloading constants.
* class.c (rb_define_class, rb_define_module), eval.c (rb_eval),
variable.c (rb_mod_const_at, rb_const_assign): removed autoload
stuff.
* intern.h: prototypes; rb_autoload, rb_autoload_load,
rb_autoload_p.
* lib/optparse.rb (OptionParser::Switch::PlacedArgument::parse):
do not treat unmatched argument as an option.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3874 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2003-05-28 20:11:11 -04:00
|
|
|
VALUE value = Qfalse;
|
|
|
|
|
2007-09-28 02:21:46 -04:00
|
|
|
if (st_lookup(RCLASS_IV_TBL(klass), id, &value)) {
|
* eval.c (ev_const_defined, ev_const_get), variable.c
(rb_const_get_at, rb_const_get, rb_mod_remove_const): use Qundef
as autoload marker. [ruby-dev:18103], [ruby-dev:18184]
* eval.c (rb_mod_autoload, rb_mod_autoload_p): new method;
Module#autoload, Module#autoload?.
* variable.c (rb_autoload, rb_autoload_load, rb_autoload_p):
manage autoload constants per classes/modules.
* variable.c (rb_const_defined_at, rb_const_defined): return false
for autoloading constants.
* class.c (rb_define_class, rb_define_module), eval.c (rb_eval),
variable.c (rb_mod_const_at, rb_const_assign): removed autoload
stuff.
* intern.h: prototypes; rb_autoload, rb_autoload_load,
rb_autoload_p.
* lib/optparse.rb (OptionParser::Switch::PlacedArgument::parse):
do not treat unmatched argument as an option.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3874 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2003-05-28 20:11:11 -04:00
|
|
|
if (value == Qundef)
|
2006-12-31 10:02:22 -05:00
|
|
|
autoload_delete(klass, id);
|
* eval.c (ev_const_defined, ev_const_get), variable.c
(rb_const_get_at, rb_const_get, rb_mod_remove_const): use Qundef
as autoload marker. [ruby-dev:18103], [ruby-dev:18184]
* eval.c (rb_mod_autoload, rb_mod_autoload_p): new method;
Module#autoload, Module#autoload?.
* variable.c (rb_autoload, rb_autoload_load, rb_autoload_p):
manage autoload constants per classes/modules.
* variable.c (rb_const_defined_at, rb_const_defined): return false
for autoloading constants.
* class.c (rb_define_class, rb_define_module), eval.c (rb_eval),
variable.c (rb_mod_const_at, rb_const_assign): removed autoload
stuff.
* intern.h: prototypes; rb_autoload, rb_autoload_load,
rb_autoload_p.
* lib/optparse.rb (OptionParser::Switch::PlacedArgument::parse):
do not treat unmatched argument as an option.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3874 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2003-05-28 20:11:11 -04:00
|
|
|
else
|
2006-12-31 10:02:22 -05:00
|
|
|
rb_warn("already initialized %s %s", dest, rb_id2name(id));
|
2001-08-23 02:02:15 -04:00
|
|
|
}
|
2000-01-31 22:12:21 -05:00
|
|
|
}
|
1998-01-16 07:13:05 -05:00
|
|
|
|
2006-12-31 10:02:22 -05:00
|
|
|
if(isconst){
|
|
|
|
rb_vm_change_state();
|
|
|
|
}
|
2007-09-28 02:21:46 -04:00
|
|
|
st_insert(RCLASS_IV_TBL(klass), id, val);
|
1998-01-16 07:13:05 -05:00
|
|
|
}
|
2000-12-08 02:10:38 -05:00
|
|
|
|
2000-02-18 01:59:36 -05:00
|
|
|
void
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
rb_const_set(VALUE klass, ID id, VALUE val)
|
2000-02-18 01:59:36 -05:00
|
|
|
{
|
* sprintf.c (rb_str_format): allow %c to print one character
string (e.g. ?x).
* lib/tempfile.rb (Tempfile::make_tmpname): put dot between
basename and pid. [ruby-talk:196272]
* parse.y (do_block): remove -> style block.
* parse.y (parser_yylex): remove tLAMBDA_ARG.
* eval.c (rb_call0): binding for the return event hook should have
consistent scope. [ruby-core:07928]
* eval.c (proc_invoke): return behavior should depend whether it
is surrounded by a lambda or a mere block.
* eval.c (formal_assign): handles post splat arguments.
* eval.c (rb_call0): ditto.
* st.c (strhash): use FNV-1a hash.
* parse.y (parser_yylex): removed experimental ';;' terminator.
* eval.c (rb_node_arity): should be aware of post splat arguments.
* eval.c (rb_proc_arity): ditto.
* parse.y (f_args): syntax rule enhanced to support arguments
after the splat.
* parse.y (block_param): ditto for block parameters.
* parse.y (f_post_arg): mandatory formal arguments after the splat
argument.
* parse.y (new_args_gen): generate nodes for mandatory formal
arguments after the splat argument.
* eval.c (rb_eval): dispatch mandatory formal arguments after the
splat argument.
* parse.y (args): allow more than one splat in the argument list.
* parse.y (method_call): allow aref [] to accept all kind of
method argument, including assocs, splat, and block argument.
* eval.c (SETUP_ARGS0): prepare block argument as well.
* lib/mathn.rb (Integer): remove Integer#gcd2. [ruby-core:07931]
* eval.c (error_line): print receivers true/false/nil specially.
* eval.c (rb_proc_yield): handles parameters in yield semantics.
* eval.c (nil_yield): gives LocalJumpError to denote no block
error.
* io.c (rb_io_getc): now takes one-character string.
* string.c (rb_str_hash): use FNV-1a hash from Fowler/Noll/Vo
hashing algorithm.
* string.c (rb_str_aref): str[0] now returns 1 character string,
instead of a fixnum. [Ruby2]
* parse.y (parser_yylex): ?c now returns 1 character string,
instead of a fixnum. [Ruby2]
* string.c (rb_str_aset): no longer support fixnum insertion.
* eval.c (umethod_bind): should not update original class.
[ruby-dev:28636]
* eval.c (ev_const_get): should support constant access from
within instance_eval(). [ruby-dev:28327]
* time.c (time_timeval): should round for usec floating
number. [ruby-core:07896]
* time.c (time_add): ditto.
* dir.c (sys_warning): should not call a vararg function
rb_sys_warning() indirectly. [ruby-core:07886]
* numeric.c (flo_divmod): the first element of Float#divmod should
be an integer. [ruby-dev:28589]
* test/ruby/test_float.rb: add tests for divmod, div, modulo and remainder.
* re.c (rb_reg_initialize): should not allow modifying literal
regexps. frozen check moved from rb_reg_initialize_m as well.
* re.c (rb_reg_initialize): should not modify untainted objects in
safe levels higher than 3.
* re.c (rb_memcmp): type change from char* to const void*.
* dir.c (dir_close): should not close untainted dir stream.
* dir.c (GetDIR): add tainted/frozen check for each dir operation.
* lib/rdoc/parsers/parse_rb.rb (RDoc::RubyParser::parse_symbol_arg):
typo fixed. a patch from Florian Gross <florg at florg.net>.
* eval.c (EXEC_EVENT_HOOK): trace_func may remove itself from
event_hooks. no guarantee for arbitrary hook deletion.
[ruby-dev:28632]
* util.c (ruby_strtod): differ addition to minimize error.
[ruby-dev:28619]
* util.c (ruby_strtod): should not raise ERANGE when the input
string does not have any digits. [ruby-dev:28629]
* eval.c (proc_invoke): should restore old ruby_frame->block.
thanks to ts <decoux at moulon.inra.fr>. [ruby-core:07833]
also fix [ruby-dev:28614] as well.
* signal.c (trap): sig should be less then NSIG. Coverity found
this bug. a patch from Kevin Tew <tewk at tewk.com>.
[ruby-core:07823]
* math.c (math_log2): add new method inspired by
[ruby-talk:191237].
* math.c (math_log): add optional base argument to Math::log().
[ruby-talk:191308]
* ext/syck/emitter.c (syck_scan_scalar): avoid accessing
uninitialized array element. a patch from Pat Eyler
<rubypate at gmail.com>. [ruby-core:07809]
* array.c (rb_ary_fill): initialize local variables first. a
patch from Pat Eyler <rubypate at gmail.com>. [ruby-core:07810]
* ext/syck/yaml2byte.c (syck_yaml2byte_handler): need to free
type_tag. a patch from Pat Eyler <rubypate at gmail.com>.
[ruby-core:07808]
* ext/socket/socket.c (make_hostent_internal): accept ai_family
check from Sam Roberts <sroberts at uniserve.com>.
[ruby-core:07691]
* util.c (ruby_strtod): should not cut off 18 digits for no
reason. [ruby-core:07796]
* array.c (rb_ary_fill): internalize local variable "beg" to
pacify Coverity. [ruby-core:07770]
* pack.c (pack_unpack): now supports CRLF newlines. a patch from
<tommy at tmtm.org>. [ruby-dev:28601]
* applied code clean-up patch from Stefan Huehner
<stefan at huehner.org>. [ruby-core:07764]
* lib/jcode.rb (String::tr_s): should have translated non
squeezing character sequence (i.e. a character) as well. thanks
to Hiroshi Ichikawa <gimite at gimite.ddo.jp> [ruby-list:42090]
* ext/socket/socket.c: document update patch from Sam Roberts
<sroberts at uniserve.com>. [ruby-core:07701]
* lib/mathn.rb (Integer): need not to remove gcd2. a patch from
NARUSE, Yui <naruse at airemix.com>. [ruby-dev:28570]
* parse.y (arg): too much NEW_LIST()
* eval.c (SETUP_ARGS0): remove unnecessary access to nd_alen.
* eval.c (rb_eval): use ARGSCAT for NODE_OP_ASGN1.
[ruby-dev:28585]
* parse.y (arg): use NODE_ARGSCAT for placeholder.
* lib/getoptlong.rb (GetoptLong::get): RDoc update patch from
mathew <meta at pobox.com>. [ruby-core:07738]
* variable.c (rb_const_set): raise error when no target klass is
supplied. [ruby-dev:28582]
* prec.c (prec_prec_f): documentation patch from
<gerardo.santana at gmail.com>. [ruby-core:07689]
* bignum.c (rb_big_pow): second operand may be too big even if
it's a Fixnum. [ruby-talk:187984]
* README.EXT: update symbol description. [ruby-talk:188104]
* COPYING: explicitly note GPLv2. [ruby-talk:187922]
* parse.y: remove some obsolete syntax rules (unparenthesized
method calls in argument list).
* eval.c (rb_call0): insecure calling should be checked for non
NODE_SCOPE method invocations too.
* eval.c (rb_alias): should preserve the current safe level as
well as method definition.
* process.c (rb_f_sleep): remove RDoc description about SIGALRM
which is not valid on the current implementation. [ruby-dev:28464]
Thu Mar 23 21:40:47 2006 K.Kosako <sndgk393 AT ybb.ne.jp>
* eval.c (method_missing): should support argument splat in
super. a bug in combination of super, splat and
method_missing. [ruby-talk:185438]
* configure.in: Solaris SunPro compiler -rapth patch from
<kuwa at labs.fujitsu.com>. [ruby-dev:28443]
* configure.in: remove enable_rpath=no for Solaris.
[ruby-dev:28440]
* ext/win32ole/win32ole.c (ole_val2olevariantdata): change behavior
of converting OLE Variant object with VT_ARRAY|VT_UI1 and Ruby
String object.
* ruby.1: a clarification patch from David Lutterkort
<dlutter at redhat.com>. [ruby-core:7508]
* lib/rdoc/ri/ri_paths.rb (RI::Paths): adding paths from rubygems
directories. a patch from Eric Hodel <drbrain at segment7.net>.
[ruby-core:07423]
* eval.c (rb_clear_cache_by_class): clearing wrong cache.
* ext/extmk.rb: use :remove_destination to install extension libraries
to avoid SEGV. [ruby-dev:28417]
* eval.c (rb_thread_fd_writable): should not re-schedule output
from KILLED thread (must be error printing).
* array.c (rb_ary_flatten_bang): allow specifying recursion
level. [ruby-talk:182170]
* array.c (rb_ary_flatten): ditto.
* gc.c (add_heap): a heap_slots may overflow. a patch from Stefan
Weil <weil at mail.berlios.de>.
* eval.c (rb_call): use separate cache for fcall/vcall
invocation.
* eval.c (rb_eval): NODE_FCALL, NODE_VCALL can call local
functions.
* eval.c (rb_mod_local): a new method to specify newly added
visibility "local".
* eval.c (search_method): search for local methods which are
visible only from the current class.
* class.c (rb_class_local_methods): a method to list local methods.
* object.c (Init_Object): add BasicObject class as a top level
BlankSlate class.
* ruby.h (SYM2ID): should not cast to signed long.
[ruby-core:07414]
* class.c (rb_include_module): allow module duplication.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@10235 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2006-06-09 17:20:17 -04:00
|
|
|
if (NIL_P(klass)) {
|
|
|
|
rb_raise(rb_eTypeError, "no class/module to define constant %s",
|
|
|
|
rb_id2name(id));
|
|
|
|
}
|
2000-12-08 02:10:38 -05:00
|
|
|
mod_av_set(klass, id, val, Qtrue);
|
2000-02-18 01:59:36 -05:00
|
|
|
}
|
1998-01-16 07:13:05 -05:00
|
|
|
|
|
|
|
void
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
rb_define_const(VALUE klass, const char *name, VALUE val)
|
1998-01-16 07:13:05 -05:00
|
|
|
{
|
|
|
|
ID id = rb_intern(name);
|
1999-01-19 23:59:39 -05:00
|
|
|
|
2003-07-24 01:18:47 -04:00
|
|
|
if (!rb_is_const_id(id)) {
|
2006-12-10 21:49:37 -05:00
|
|
|
rb_warn("rb_define_const: invalid name `%s' for constant", name);
|
2003-07-24 01:18:47 -04:00
|
|
|
}
|
1999-01-19 23:59:39 -05:00
|
|
|
if (klass == rb_cObject) {
|
|
|
|
rb_secure(4);
|
|
|
|
}
|
1999-12-14 01:50:43 -05:00
|
|
|
rb_const_set(klass, id, val);
|
1998-01-16 07:13:05 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
rb_define_global_const(const char *name, VALUE val)
|
1998-01-16 07:13:05 -05:00
|
|
|
{
|
1999-01-19 23:59:39 -05:00
|
|
|
rb_define_const(rb_cObject, name, val);
|
1998-01-16 07:13:05 -05:00
|
|
|
}
|
|
|
|
|
2007-10-03 02:48:06 -04:00
|
|
|
static VALUE
|
2007-12-24 04:25:27 -05:00
|
|
|
original_module(VALUE c)
|
2007-10-03 02:48:06 -04:00
|
|
|
{
|
|
|
|
if (TYPE(c) == T_ICLASS)
|
|
|
|
return RBASIC(c)->klass;
|
|
|
|
return c;
|
|
|
|
}
|
|
|
|
|
2007-02-02 04:47:55 -05:00
|
|
|
#define CVAR_LOOKUP(v,r) do {\
|
2007-09-28 02:21:46 -04:00
|
|
|
if (RCLASS_IV_TBL(klass) && st_lookup(RCLASS_IV_TBL(klass),id,(v))) {\
|
2007-10-03 02:48:06 -04:00
|
|
|
r;\
|
2007-02-02 04:47:55 -05:00
|
|
|
}\
|
|
|
|
if (FL_TEST(klass, FL_SINGLETON) ) {\
|
|
|
|
VALUE obj = rb_iv_get(klass, "__attached__");\
|
|
|
|
switch (TYPE(obj)) {\
|
|
|
|
case T_MODULE:\
|
|
|
|
case T_CLASS:\
|
|
|
|
klass = obj;\
|
|
|
|
break;\
|
|
|
|
default:\
|
2007-09-28 02:21:46 -04:00
|
|
|
klass = RCLASS_SUPER(klass);\
|
2007-02-02 04:47:55 -05:00
|
|
|
break;\
|
|
|
|
}\
|
|
|
|
}\
|
|
|
|
else {\
|
2007-09-28 02:21:46 -04:00
|
|
|
klass = RCLASS_SUPER(klass);\
|
2007-02-02 04:47:55 -05:00
|
|
|
}\
|
|
|
|
while (klass) {\
|
2007-09-28 02:21:46 -04:00
|
|
|
if (RCLASS_IV_TBL(klass) && st_lookup(RCLASS_IV_TBL(klass),id,(v))) {\
|
2007-10-03 02:48:06 -04:00
|
|
|
r;\
|
2007-02-02 04:47:55 -05:00
|
|
|
}\
|
2007-09-28 02:21:46 -04:00
|
|
|
klass = RCLASS_SUPER(klass);\
|
2007-02-02 04:47:55 -05:00
|
|
|
}\
|
|
|
|
} while(0)
|
|
|
|
|
2007-11-09 03:14:42 -05:00
|
|
|
void
|
|
|
|
rb_cvar_set(VALUE klass, ID id, VALUE val)
|
|
|
|
{
|
|
|
|
VALUE tmp, front = 0, target = 0;
|
|
|
|
|
|
|
|
tmp = klass;
|
|
|
|
CVAR_LOOKUP(0, {if (!front) front = klass; target = klass;});
|
|
|
|
if (target) {
|
|
|
|
if (front && target != front) {
|
|
|
|
ID did = id;
|
|
|
|
|
|
|
|
if (RTEST(ruby_verbose)) {
|
|
|
|
rb_warning("class variable %s of %s is overtaken by %s",
|
|
|
|
rb_id2name(id), rb_class2name(original_module(front)),
|
|
|
|
rb_class2name(original_module(target)));
|
|
|
|
}
|
|
|
|
if (BUILTIN_TYPE(front) == T_CLASS) {
|
|
|
|
st_delete(RCLASS_IV_TBL(front),&did,0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
target = tmp;
|
|
|
|
}
|
|
|
|
mod_av_set(target, id, val, Qfalse);
|
|
|
|
}
|
|
|
|
|
2000-02-18 01:59:36 -05:00
|
|
|
VALUE
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
rb_cvar_get(VALUE klass, ID id)
|
2000-02-18 01:59:36 -05:00
|
|
|
{
|
2007-10-03 02:48:06 -04:00
|
|
|
VALUE value, tmp, front = 0, target = 0;
|
2000-02-18 01:59:36 -05:00
|
|
|
|
2007-02-02 04:47:55 -05:00
|
|
|
tmp = klass;
|
2007-10-03 02:48:06 -04:00
|
|
|
CVAR_LOOKUP(&value, {if (!front) front = klass; target = klass;});
|
|
|
|
if (!target) {
|
|
|
|
rb_name_error(id,"uninitialized class variable %s in %s",
|
|
|
|
rb_id2name(id), rb_class2name(tmp));
|
|
|
|
}
|
|
|
|
if (front && target != front) {
|
|
|
|
ID did = id;
|
|
|
|
|
|
|
|
if (RTEST(ruby_verbose)) {
|
|
|
|
rb_warning("class variable %s of %s is overtaken by %s",
|
|
|
|
rb_id2name(id), rb_class2name(original_module(front)),
|
|
|
|
rb_class2name(original_module(target)));
|
|
|
|
}
|
|
|
|
if (BUILTIN_TYPE(front) == T_CLASS) {
|
|
|
|
st_delete(RCLASS_IV_TBL(front),&did,0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return value;
|
2000-02-18 01:59:36 -05:00
|
|
|
}
|
|
|
|
|
2000-12-08 02:10:38 -05:00
|
|
|
VALUE
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
rb_cvar_defined(VALUE klass, ID id)
|
2000-02-18 01:59:36 -05:00
|
|
|
{
|
2007-02-02 04:47:55 -05:00
|
|
|
if (!klass) return Qfalse;
|
2007-10-03 02:48:06 -04:00
|
|
|
CVAR_LOOKUP(0,return Qtrue);
|
2000-02-18 01:59:36 -05:00
|
|
|
return Qfalse;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
rb_cv_set(VALUE klass, const char *name, VALUE val)
|
2000-03-23 03:37:35 -05:00
|
|
|
{
|
2001-05-02 00:22:21 -04:00
|
|
|
ID id = rb_intern(name);
|
|
|
|
if (!rb_is_class_id(id)) {
|
2001-07-02 04:46:28 -04:00
|
|
|
rb_name_error(id, "wrong class variable name %s", name);
|
2001-05-02 00:22:21 -04:00
|
|
|
}
|
2007-02-02 04:41:47 -05:00
|
|
|
rb_cvar_set(klass, id, val);
|
2000-03-23 03:37:35 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
VALUE
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
rb_cv_get(VALUE klass, const char *name)
|
2000-03-23 03:37:35 -05:00
|
|
|
{
|
2001-05-02 00:22:21 -04:00
|
|
|
ID id = rb_intern(name);
|
|
|
|
if (!rb_is_class_id(id)) {
|
2001-07-02 04:46:28 -04:00
|
|
|
rb_name_error(id, "wrong class variable name %s", name);
|
2001-05-02 00:22:21 -04:00
|
|
|
}
|
|
|
|
return rb_cvar_get(klass, id);
|
2000-03-23 03:37:35 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
rb_define_class_variable(VALUE klass, const char *name, VALUE val)
|
2000-02-18 01:59:36 -05:00
|
|
|
{
|
|
|
|
ID id = rb_intern(name);
|
|
|
|
|
2000-03-23 03:37:35 -05:00
|
|
|
if (!rb_is_class_id(id)) {
|
2001-07-02 04:46:28 -04:00
|
|
|
rb_name_error(id, "wrong class variable name %s", name);
|
2000-02-18 01:59:36 -05:00
|
|
|
}
|
2007-02-02 04:41:47 -05:00
|
|
|
rb_cvar_set(klass, id, val);
|
2000-02-18 01:59:36 -05:00
|
|
|
}
|
|
|
|
|
2000-09-15 02:00:30 -04:00
|
|
|
static int
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
cv_i(ID key, VALUE value, VALUE ary)
|
2000-09-15 02:00:30 -04:00
|
|
|
{
|
|
|
|
if (rb_is_class_id(key)) {
|
2006-09-04 01:46:47 -04:00
|
|
|
VALUE kval = ID2SYM(key);
|
2000-09-15 02:00:30 -04:00
|
|
|
if (!rb_ary_includes(ary, kval)) {
|
|
|
|
rb_ary_push(ary, kval);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return ST_CONTINUE;
|
|
|
|
}
|
|
|
|
|
2003-12-28 01:33:07 -05:00
|
|
|
/*
|
|
|
|
* call-seq:
|
|
|
|
* mod.class_variables => array
|
|
|
|
*
|
2004-06-26 02:17:20 -04:00
|
|
|
* Returns an array of the names of class variables in <i>mod</i>.
|
2003-12-28 01:33:07 -05:00
|
|
|
*
|
|
|
|
* class One
|
|
|
|
* @@var1 = 1
|
|
|
|
* end
|
|
|
|
* class Two < One
|
|
|
|
* @@var2 = 2
|
|
|
|
* end
|
2008-03-08 20:04:46 -05:00
|
|
|
* One.class_variables #=> [:@@var1]
|
|
|
|
* Two.class_variables #=> [:@@var2]
|
2003-12-28 01:33:07 -05:00
|
|
|
*/
|
|
|
|
|
2000-09-15 02:00:30 -04:00
|
|
|
VALUE
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
rb_mod_class_variables(VALUE obj)
|
2000-09-15 02:00:30 -04:00
|
|
|
{
|
|
|
|
VALUE ary = rb_ary_new();
|
|
|
|
|
2007-09-28 02:21:46 -04:00
|
|
|
if (RCLASS_IV_TBL(obj)) {
|
|
|
|
st_foreach_safe(RCLASS_IV_TBL(obj), cv_i, ary);
|
2000-09-15 02:00:30 -04:00
|
|
|
}
|
|
|
|
return ary;
|
|
|
|
}
|
|
|
|
|
2003-12-28 01:33:07 -05:00
|
|
|
/*
|
|
|
|
* call-seq:
|
|
|
|
* remove_class_variable(sym) => obj
|
|
|
|
*
|
|
|
|
* Removes the definition of the <i>sym</i>, returning that
|
|
|
|
* constant's value.
|
|
|
|
*
|
|
|
|
* class Dummy
|
|
|
|
* @@var = 99
|
|
|
|
* puts @@var
|
|
|
|
* remove_class_variable(:@@var)
|
|
|
|
* puts(defined? @@var)
|
|
|
|
* end
|
|
|
|
*
|
|
|
|
* <em>produces:</em>
|
|
|
|
*
|
|
|
|
* 99
|
|
|
|
* nil
|
|
|
|
*/
|
|
|
|
|
2000-12-08 02:10:38 -05:00
|
|
|
VALUE
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
rb_mod_remove_cvar(VALUE mod, VALUE name)
|
2000-12-08 02:10:38 -05:00
|
|
|
{
|
|
|
|
ID id = rb_to_id(name);
|
|
|
|
VALUE val;
|
|
|
|
|
|
|
|
if (!rb_is_class_id(id)) {
|
2002-01-16 04:25:59 -05:00
|
|
|
rb_name_error(id, "wrong class variable name %s", rb_id2name(id));
|
2000-12-08 02:10:38 -05:00
|
|
|
}
|
|
|
|
if (!OBJ_TAINTED(mod) && rb_safe_level() >= 4)
|
|
|
|
rb_raise(rb_eSecurityError, "Insecure: can't remove class variable");
|
|
|
|
if (OBJ_FROZEN(mod)) rb_error_frozen("class/module");
|
|
|
|
|
2007-09-28 02:21:46 -04:00
|
|
|
if (RCLASS_IV_TBL(mod) && st_delete(RCLASS_IV_TBL(mod), (st_data_t*)&id, &val)) {
|
2000-12-08 02:10:38 -05:00
|
|
|
return val;
|
|
|
|
}
|
|
|
|
if (rb_cvar_defined(mod, id)) {
|
* eval.c (ev_const_defined, ev_const_get), variable.c
(rb_const_get_at, rb_const_get, rb_mod_remove_const): use Qundef
as autoload marker. [ruby-dev:18103], [ruby-dev:18184]
* eval.c (rb_mod_autoload, rb_mod_autoload_p): new method;
Module#autoload, Module#autoload?.
* variable.c (rb_autoload, rb_autoload_load, rb_autoload_p):
manage autoload constants per classes/modules.
* variable.c (rb_const_defined_at, rb_const_defined): return false
for autoloading constants.
* class.c (rb_define_class, rb_define_module), eval.c (rb_eval),
variable.c (rb_mod_const_at, rb_const_assign): removed autoload
stuff.
* intern.h: prototypes; rb_autoload, rb_autoload_load,
rb_autoload_p.
* lib/optparse.rb (OptionParser::Switch::PlacedArgument::parse):
do not treat unmatched argument as an option.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3874 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2003-05-28 20:11:11 -04:00
|
|
|
rb_name_error(id, "cannot remove %s for %s",
|
2000-12-08 02:10:38 -05:00
|
|
|
rb_id2name(id), rb_class2name(mod));
|
|
|
|
}
|
2001-07-02 04:46:28 -04:00
|
|
|
rb_name_error(id, "class variable %s not defined for %s",
|
|
|
|
rb_id2name(id), rb_class2name(mod));
|
2000-12-08 02:10:38 -05:00
|
|
|
return Qnil; /* not reached */
|
|
|
|
}
|
|
|
|
|
1998-01-16 07:13:05 -05:00
|
|
|
VALUE
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
rb_iv_get(VALUE obj, const char *name)
|
1998-01-16 07:13:05 -05:00
|
|
|
{
|
|
|
|
ID id = rb_intern(name);
|
|
|
|
|
|
|
|
return rb_ivar_get(obj, id);
|
|
|
|
}
|
|
|
|
|
|
|
|
VALUE
|
* array.c: moved to ANSI function style from K&R function style.
(used protoize on windows, so still K&R remains on #ifdef part of
other platforms. And `foo _((boo))' stuff is still there)
[ruby-dev:26975]
* bignum.c, class.c, compar.c, dir.c, dln.c, dmyext.c, enum.c,
enumerator.c, error.c, eval.c, file.c, gc.c, hash.c, inits.c,
io.c, main.c, marshal.c, math.c, numeric.c, object.c, pack.c,
prec.c, process.c, random.c, range.c, re.c, regcomp.c, regenc.c,
regerror.c, regexec.c, regparse.c, regparse.h, ruby.c, signal.c,
sprintf.c, st.c, string.c, struct.c, time.c, util.h, variable.c,
version.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-12 06:44:21 -04:00
|
|
|
rb_iv_set(VALUE obj, const char *name, VALUE val)
|
1998-01-16 07:13:05 -05:00
|
|
|
{
|
|
|
|
ID id = rb_intern(name);
|
|
|
|
|
|
|
|
return rb_ivar_set(obj, id, val);
|
|
|
|
}
|