path: root/marshal.c
diff options
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2003-11-22 04:00:03 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2003-11-22 04:00:03 +0000
commit6212cfb9c53bd93fda08915f9916a7c3ebace289 (patch)
treed60cd10a685a805d69575e5779eb899e6ba97898 /marshal.c
parent01257196948765da2601c3a6c489f2a55f7319a8 (diff)
* 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 <>. [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 * 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. * $(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:// b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'marshal.c')
1 files changed, 20 insertions, 19 deletions
diff --git a/marshal.c b/marshal.c
index 48d71ba..d998293 100644
--- a/marshal.c
+++ b/marshal.c
@@ -345,14 +345,15 @@ hash_each(key, value, arg)
static void
-w_extended(klass, arg)
+w_extended(klass, arg, check)
VALUE klass;
struct dump_arg *arg;
+ int check;
char *path;
if (FL_TEST(klass, FL_SINGLETON)) {
- if (RCLASS(klass)->m_tbl->num_entries ||
+ if (check && RCLASS(klass)->m_tbl->num_entries ||
(RCLASS(klass)->iv_tbl && RCLASS(klass)->iv_tbl->num_entries > 1)) {
rb_raise(rb_eTypeError, "singleton can't be dumped");
@@ -367,15 +368,16 @@ w_extended(klass, arg)
static void
-w_class(type, obj, arg)
+w_class(type, obj, arg, check)
int type;
VALUE obj;
struct dump_arg *arg;
+ int check;
char *path;
VALUE klass = CLASS_OF(obj);
- w_extended(klass, arg);
+ w_extended(klass, arg, check);
w_byte(type, arg);
path = rb_class2name(klass);
w_unique(path, arg);
@@ -388,7 +390,7 @@ w_uclass(obj, base_klass, arg)
VALUE klass = CLASS_OF(obj);
- w_extended(klass, arg);
+ w_extended(klass, arg, Qtrue);
klass = rb_class_real(klass);
if (klass != base_klass) {
w_byte(TYPE_UCLASS, arg);
@@ -429,6 +431,7 @@ w_object(obj, arg, limit)
struct dump_call_arg c_arg;
st_table *ivtbl = 0;
+ st_data_t num;
if (limit == 0) {
rb_raise(rb_eArgError, "exceed depth limit");
@@ -438,6 +441,12 @@ w_object(obj, arg, limit)
c_arg.limit = limit;
c_arg.arg = arg;
+ if (st_lookup(arg->data, obj, &num)) {
+ w_byte(TYPE_LINK, arg);
+ w_long((long)num, arg);
+ return;
+ }
if (ivtbl = rb_generic_ivar_table(obj)) {
w_byte(TYPE_IVAR, arg);
@@ -468,14 +477,6 @@ w_object(obj, arg, limit)
w_symbol(SYM2ID(obj), arg);
else {
- st_data_t num;
- if (st_lookup(arg->data, obj, &num)) {
- w_byte(TYPE_LINK, arg);
- w_long((long)num, arg);
- return;
- }
if (OBJ_TAINTED(obj)) arg->taint = Qtrue;
st_add_direct(arg->data, obj, arg->data->num_entries);
@@ -483,7 +484,7 @@ w_object(obj, arg, limit)
v = rb_funcall(obj, s_mdump, 0, 0);
- w_class(TYPE_USRMARSHAL, obj, arg);
+ w_class(TYPE_USRMARSHAL, obj, arg, Qfalse);
w_object(v, arg, limit);
if (ivtbl) w_ivar(0, &c_arg);
@@ -498,7 +499,7 @@ w_object(obj, arg, limit)
if (!ivtbl && (ivtbl = rb_generic_ivar_table(v))) {
w_byte(TYPE_IVAR, arg);
- w_class(TYPE_USERDEF, obj, arg);
+ w_class(TYPE_USERDEF, obj, arg, Qfalse);
w_bytes(RSTRING(v)->ptr, RSTRING(v)->len, arg);
if (ivtbl) {
w_ivar(ivtbl, &c_arg);
@@ -614,7 +615,7 @@ w_object(obj, arg, limit)
case T_STRUCT:
- w_class(TYPE_STRUCT, obj, arg);
+ w_class(TYPE_STRUCT, obj, arg, Qtrue);
long len = RSTRUCT(obj)->len;
VALUE mem;
@@ -633,7 +634,7 @@ w_object(obj, arg, limit)
case T_OBJECT:
- w_class(TYPE_OBJECT, obj, arg);
+ w_class(TYPE_OBJECT, obj, arg, Qtrue);
w_ivar(ROBJECT(obj)->iv_tbl, &c_arg);
@@ -641,10 +642,10 @@ w_object(obj, arg, limit)
- w_class(TYPE_DATA, obj, arg);
+ w_class(TYPE_DATA, obj, arg, Qtrue);
if (!rb_respond_to(obj, s_dump_data)) {
- "class %s needs to have instance method `_dump_data'",
+ "no marshal_dump is defined for class %s",
v = rb_funcall(obj, s_dump_data, 0);