2000-05-01 13:42:38 +04:00
|
|
|
/**********************************************************************
|
1998-01-16 15:19:09 +03:00
|
|
|
|
|
|
|
marshal.c -
|
|
|
|
|
|
|
|
$Author$
|
|
|
|
$Date$
|
|
|
|
created at: Thu Apr 27 16:30:01 JST 1995
|
|
|
|
|
2003-01-16 10:34:03 +03:00
|
|
|
Copyright (C) 1993-2003 Yukihiro Matsumoto
|
2000-05-01 13:42:38 +04:00
|
|
|
|
|
|
|
**********************************************************************/
|
1998-01-16 15:19:09 +03:00
|
|
|
|
|
|
|
#include "ruby.h"
|
1999-01-20 07:59:39 +03:00
|
|
|
#include "rubyio.h"
|
1998-01-16 15:19:09 +03:00
|
|
|
#include "st.h"
|
2002-05-14 10:22:31 +04:00
|
|
|
#include "util.h"
|
1999-08-13 09:45:20 +04:00
|
|
|
|
2003-01-15 09:29:05 +03:00
|
|
|
#include <math.h>
|
2003-04-20 19:11:20 +04:00
|
|
|
#ifdef HAVE_FLOAT_H
|
|
|
|
#include <float.h>
|
|
|
|
#endif
|
2003-12-22 11:23:55 +03:00
|
|
|
#ifdef HAVE_IEEEFP_H
|
|
|
|
#include <ieeefp.h>
|
|
|
|
#endif
|
2003-01-15 09:29:05 +03:00
|
|
|
|
2001-08-29 10:28:51 +04:00
|
|
|
#define BITSPERSHORT (2*CHAR_BIT)
|
2000-10-31 11:37:47 +03:00
|
|
|
#define SHORTMASK ((1<<BITSPERSHORT)-1)
|
|
|
|
#define SHORTDN(x) RSHIFT(x,BITSPERSHORT)
|
|
|
|
|
|
|
|
#if SIZEOF_SHORT == SIZEOF_BDIGITS
|
|
|
|
#define SHORTLEN(x) (x)
|
|
|
|
#else
|
|
|
|
static int
|
|
|
|
shortlen(len, ds)
|
|
|
|
long len;
|
|
|
|
BDIGIT *ds;
|
|
|
|
{
|
|
|
|
BDIGIT num;
|
|
|
|
int offset = 0;
|
|
|
|
|
|
|
|
num = ds[len-1];
|
|
|
|
while (num) {
|
|
|
|
num = SHORTDN(num);
|
|
|
|
offset++;
|
|
|
|
}
|
2001-08-29 10:28:51 +04:00
|
|
|
return (len - 1)*sizeof(BDIGIT)/2 + offset;
|
2000-10-31 11:37:47 +03:00
|
|
|
}
|
|
|
|
#define SHORTLEN(x) shortlen((x),d)
|
|
|
|
#endif
|
|
|
|
|
1998-01-16 15:19:09 +03:00
|
|
|
#define MARSHAL_MAJOR 4
|
2002-09-17 13:36:05 +04:00
|
|
|
#define MARSHAL_MINOR 8
|
1998-01-16 15:19:09 +03:00
|
|
|
|
|
|
|
#define TYPE_NIL '0'
|
|
|
|
#define TYPE_TRUE 'T'
|
|
|
|
#define TYPE_FALSE 'F'
|
|
|
|
#define TYPE_FIXNUM 'i'
|
|
|
|
|
2002-09-05 13:42:56 +04:00
|
|
|
#define TYPE_EXTENDED 'e'
|
1998-01-16 15:19:09 +03:00
|
|
|
#define TYPE_UCLASS 'C'
|
|
|
|
#define TYPE_OBJECT 'o'
|
2002-09-05 13:42:56 +04:00
|
|
|
#define TYPE_DATA 'd'
|
1998-01-16 15:19:09 +03:00
|
|
|
#define TYPE_USERDEF 'u'
|
2003-04-20 19:11:20 +04:00
|
|
|
#define TYPE_USRMARSHAL 'U'
|
1998-01-16 15:19:09 +03:00
|
|
|
#define TYPE_FLOAT 'f'
|
|
|
|
#define TYPE_BIGNUM 'l'
|
|
|
|
#define TYPE_STRING '"'
|
|
|
|
#define TYPE_REGEXP '/'
|
|
|
|
#define TYPE_ARRAY '['
|
|
|
|
#define TYPE_HASH '{'
|
1999-12-01 12:24:48 +03:00
|
|
|
#define TYPE_HASH_DEF '}'
|
1998-01-16 15:19:09 +03:00
|
|
|
#define TYPE_STRUCT 'S'
|
1999-12-01 12:24:48 +03:00
|
|
|
#define TYPE_MODULE_OLD 'M'
|
|
|
|
#define TYPE_CLASS 'c'
|
|
|
|
#define TYPE_MODULE 'm'
|
1998-01-16 15:19:09 +03:00
|
|
|
|
|
|
|
#define TYPE_SYMBOL ':'
|
|
|
|
#define TYPE_SYMLINK ';'
|
|
|
|
|
2000-01-05 07:41:21 +03:00
|
|
|
#define TYPE_IVAR 'I'
|
1998-01-16 15:19:09 +03:00
|
|
|
#define TYPE_LINK '@'
|
|
|
|
|
2003-07-29 22:26:55 +04:00
|
|
|
static ID s_dump, s_load, s_mdump, s_mload;
|
2002-04-24 08:54:16 +04:00
|
|
|
static ID s_dump_data, s_load_data, s_alloc;
|
2003-03-03 10:20:17 +03:00
|
|
|
static ID s_getc, s_read, s_write, s_binmode;
|
1998-01-16 15:19:09 +03:00
|
|
|
|
|
|
|
struct dump_arg {
|
|
|
|
VALUE obj;
|
2002-10-17 14:20:52 +04:00
|
|
|
VALUE str, dest;
|
2003-08-07 01:50:06 +04:00
|
|
|
st_table *symbols;
|
1998-01-16 15:19:09 +03:00
|
|
|
st_table *data;
|
2000-07-21 12:45:34 +04:00
|
|
|
int taint;
|
1998-01-16 15:19:09 +03:00
|
|
|
};
|
|
|
|
|
|
|
|
struct dump_call_arg {
|
|
|
|
VALUE obj;
|
|
|
|
struct dump_arg *arg;
|
|
|
|
int limit;
|
|
|
|
};
|
|
|
|
|
|
|
|
static void w_long _((long, struct dump_arg*));
|
|
|
|
|
2002-10-17 14:20:52 +04:00
|
|
|
static void
|
2003-03-03 10:20:17 +03:00
|
|
|
w_nbyte(s, n, arg)
|
2002-10-17 14:20:52 +04:00
|
|
|
char *s;
|
|
|
|
int n;
|
|
|
|
struct dump_arg *arg;
|
|
|
|
{
|
2003-03-03 10:20:17 +03:00
|
|
|
VALUE buf = arg->str;
|
|
|
|
rb_str_buf_cat(buf, s, n);
|
|
|
|
if (arg->dest && RSTRING(buf)->len >= BUFSIZ) {
|
|
|
|
if (arg->taint) OBJ_TAINT(buf);
|
|
|
|
rb_io_write(arg->dest, buf);
|
|
|
|
rb_str_resize(buf, 0);
|
2002-10-17 14:20:52 +04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
1998-01-16 15:19:09 +03:00
|
|
|
static void
|
|
|
|
w_byte(c, arg)
|
|
|
|
char c;
|
|
|
|
struct dump_arg *arg;
|
|
|
|
{
|
2003-03-03 10:20:17 +03:00
|
|
|
w_nbyte(&c, 1, arg);
|
1998-01-16 15:19:09 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
w_bytes(s, n, arg)
|
|
|
|
char *s;
|
|
|
|
int n;
|
|
|
|
struct dump_arg *arg;
|
|
|
|
{
|
|
|
|
w_long(n, arg);
|
2003-03-03 10:20:17 +03:00
|
|
|
w_nbyte(s, n, arg);
|
1998-01-16 15:19:09 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
w_short(x, arg)
|
|
|
|
int x;
|
|
|
|
struct dump_arg *arg;
|
|
|
|
{
|
2001-08-29 10:28:51 +04:00
|
|
|
w_byte((x >> 0) & 0xff, arg);
|
|
|
|
w_byte((x >> 8) & 0xff, arg);
|
1998-01-16 15:19:09 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
w_long(x, arg)
|
|
|
|
long x;
|
|
|
|
struct dump_arg *arg;
|
|
|
|
{
|
|
|
|
char buf[sizeof(long)+1];
|
|
|
|
int i, len = 0;
|
|
|
|
|
2000-12-05 12:36:54 +03:00
|
|
|
#if SIZEOF_LONG > 4
|
2001-08-29 10:28:51 +04:00
|
|
|
if (!(RSHIFT(x, 31) == 0 || RSHIFT(x, 31) == -1)) {
|
2000-12-05 12:36:54 +03:00
|
|
|
/* big long does not fit in 4 bytes */
|
|
|
|
rb_raise(rb_eTypeError, "long too big to dump");
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
1998-01-16 15:19:09 +03:00
|
|
|
if (x == 0) {
|
|
|
|
w_byte(0, arg);
|
|
|
|
return;
|
|
|
|
}
|
2000-12-05 12:36:54 +03:00
|
|
|
if (0 < x && x < 123) {
|
|
|
|
w_byte(x + 5, arg);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if (-124 < x && x < 0) {
|
|
|
|
w_byte((x - 5)&0xff, arg);
|
|
|
|
return;
|
|
|
|
}
|
1998-01-16 15:19:09 +03:00
|
|
|
for (i=1;i<sizeof(long)+1;i++) {
|
|
|
|
buf[i] = x & 0xff;
|
|
|
|
x = RSHIFT(x,8);
|
|
|
|
if (x == 0) {
|
|
|
|
buf[0] = i;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
if (x == -1) {
|
|
|
|
buf[0] = -i;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
len = i;
|
|
|
|
for (i=0;i<=len;i++) {
|
|
|
|
w_byte(buf[i], arg);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2003-04-20 19:11:20 +04:00
|
|
|
#ifdef DBL_MANT_DIG
|
2003-04-22 14:08:57 +04:00
|
|
|
#define DECIMAL_MANT (53-16) /* from IEEE754 double precision */
|
|
|
|
|
|
|
|
#if DBL_MANT_DIG > 32
|
|
|
|
#define MANT_BITS 32
|
|
|
|
#elif DBL_MANT_DIG > 24
|
|
|
|
#define MANT_BITS 24
|
|
|
|
#elif DBL_MANT_DIG > 16
|
|
|
|
#define MANT_BITS 16
|
|
|
|
#else
|
|
|
|
#define MANT_BITS 8
|
|
|
|
#endif
|
|
|
|
|
2003-04-20 19:11:20 +04:00
|
|
|
static int
|
|
|
|
save_mantissa(d, buf)
|
|
|
|
double d;
|
|
|
|
char *buf;
|
|
|
|
{
|
2003-04-22 14:08:57 +04:00
|
|
|
int e, i = 0;
|
|
|
|
unsigned long m;
|
|
|
|
double n;
|
|
|
|
|
|
|
|
d = modf(ldexp(frexp(fabs(d), &e), DECIMAL_MANT), &d);
|
|
|
|
if (d > 0) {
|
|
|
|
buf[i++] = 0;
|
|
|
|
do {
|
|
|
|
d = modf(ldexp(d, MANT_BITS), &n);
|
|
|
|
m = (unsigned long)n;
|
|
|
|
#if MANT_BITS > 24
|
|
|
|
buf[i++] = m >> 24;
|
|
|
|
#endif
|
|
|
|
#if MANT_BITS > 16
|
|
|
|
buf[i++] = m >> 16;
|
|
|
|
#endif
|
|
|
|
#if MANT_BITS > 8
|
|
|
|
buf[i++] = m >> 8;
|
|
|
|
#endif
|
|
|
|
buf[i++] = m;
|
|
|
|
} while (d > 0);
|
|
|
|
while (!buf[i - 1]) --i;
|
|
|
|
}
|
|
|
|
return i;
|
2003-04-20 19:11:20 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
static double
|
|
|
|
load_mantissa(d, buf, len)
|
|
|
|
double d;
|
|
|
|
const char *buf;
|
|
|
|
int len;
|
|
|
|
{
|
2003-04-22 14:08:57 +04:00
|
|
|
if (--len > 0 && !*buf++) { /* binary mantissa mark */
|
|
|
|
int e, s = d < 0, dig = 0;
|
|
|
|
unsigned long m;
|
|
|
|
|
|
|
|
modf(ldexp(frexp(fabs(d), &e), DECIMAL_MANT), &d);
|
|
|
|
do {
|
|
|
|
m = 0;
|
|
|
|
switch (len) {
|
|
|
|
default: m = *buf++ & 0xff;
|
|
|
|
#if MANT_BITS > 24
|
|
|
|
case 3: m = (m << 8) | (*buf++ & 0xff);
|
|
|
|
#endif
|
|
|
|
#if MANT_BITS > 16
|
|
|
|
case 2: m = (m << 8) | (*buf++ & 0xff);
|
|
|
|
#endif
|
|
|
|
#if MANT_BITS > 8
|
|
|
|
case 1: m = (m << 8) | (*buf++ & 0xff);
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
dig -= len < MANT_BITS / 8 ? 8 * (unsigned)len : MANT_BITS;
|
|
|
|
d += ldexp((double)m, dig);
|
|
|
|
} while ((len -= MANT_BITS / 8) > 0);
|
|
|
|
d = ldexp(d, e - DECIMAL_MANT);
|
2003-04-20 19:11:20 +04:00
|
|
|
if (s) d = -d;
|
|
|
|
}
|
|
|
|
return d;
|
|
|
|
}
|
|
|
|
#else
|
|
|
|
#define load_mantissa(d, buf, len) (d)
|
|
|
|
#define save_mantissa(d, buf) 0
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef DBL_DIG
|
2003-04-21 17:02:08 +04:00
|
|
|
#define FLOAT_DIG (DBL_DIG+2)
|
2003-04-20 19:11:20 +04:00
|
|
|
#else
|
|
|
|
#define FLOAT_DIG 17
|
|
|
|
#endif
|
|
|
|
|
1998-01-16 15:19:09 +03:00
|
|
|
static void
|
|
|
|
w_float(d, arg)
|
|
|
|
double d;
|
|
|
|
struct dump_arg *arg;
|
|
|
|
{
|
|
|
|
char buf[100];
|
|
|
|
|
2001-11-19 08:03:03 +03:00
|
|
|
if (isinf(d)) {
|
|
|
|
if (d < 0) strcpy(buf, "-inf");
|
|
|
|
else strcpy(buf, "inf");
|
|
|
|
}
|
|
|
|
else if (isnan(d)) {
|
|
|
|
strcpy(buf, "nan");
|
|
|
|
}
|
2001-11-27 13:00:35 +03:00
|
|
|
else if (d == 0.0) {
|
|
|
|
if (1.0/d < 0) strcpy(buf, "-0");
|
|
|
|
else strcpy(buf, "0");
|
|
|
|
}
|
2001-11-19 08:03:03 +03:00
|
|
|
else {
|
2003-04-20 19:11:20 +04:00
|
|
|
int len;
|
|
|
|
|
2001-11-19 08:03:03 +03:00
|
|
|
/* xxx: should not use system's sprintf(3) */
|
2003-04-20 19:11:20 +04:00
|
|
|
sprintf(buf, "%.*g", FLOAT_DIG, d);
|
|
|
|
len = strlen(buf);
|
|
|
|
w_bytes(buf, len + save_mantissa(d, buf + len), arg);
|
|
|
|
return;
|
2001-11-19 08:03:03 +03:00
|
|
|
}
|
1998-01-16 15:19:09 +03:00
|
|
|
w_bytes(buf, strlen(buf), arg);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
w_symbol(id, arg)
|
|
|
|
ID id;
|
|
|
|
struct dump_arg *arg;
|
|
|
|
{
|
|
|
|
char *sym = rb_id2name(id);
|
2003-08-16 18:58:34 +04:00
|
|
|
st_data_t num;
|
1998-01-16 15:19:09 +03:00
|
|
|
|
2003-08-07 01:50:06 +04:00
|
|
|
if (st_lookup(arg->symbols, id, &num)) {
|
1998-01-16 15:19:09 +03:00
|
|
|
w_byte(TYPE_SYMLINK, arg);
|
2003-08-16 18:58:34 +04:00
|
|
|
w_long((long)num, arg);
|
1998-01-16 15:19:09 +03:00
|
|
|
}
|
|
|
|
else {
|
|
|
|
w_byte(TYPE_SYMBOL, arg);
|
|
|
|
w_bytes(sym, strlen(sym), arg);
|
2003-08-07 01:50:06 +04:00
|
|
|
st_add_direct(arg->symbols, id, arg->symbols->num_entries);
|
1998-01-16 15:19:09 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
w_unique(s, arg)
|
|
|
|
char *s;
|
|
|
|
struct dump_arg *arg;
|
|
|
|
{
|
2001-10-05 10:30:42 +04:00
|
|
|
if (s[0] == '#') {
|
2003-05-22 12:30:58 +04:00
|
|
|
rb_raise(rb_eTypeError, "can't dump anonymous class %s", s);
|
2001-10-05 10:30:42 +04:00
|
|
|
}
|
1998-01-16 15:19:09 +03:00
|
|
|
w_symbol(rb_intern(s), arg);
|
|
|
|
}
|
|
|
|
|
2003-10-09 21:45:53 +04:00
|
|
|
static void w_object _((VALUE,struct dump_arg*,int));
|
1998-01-16 15:19:09 +03:00
|
|
|
|
|
|
|
static int
|
1999-08-13 09:45:20 +04:00
|
|
|
hash_each(key, value, arg)
|
1998-01-16 15:19:09 +03:00
|
|
|
VALUE key, value;
|
|
|
|
struct dump_call_arg *arg;
|
|
|
|
{
|
2003-10-09 21:45:53 +04:00
|
|
|
w_object(key, arg->arg, arg->limit);
|
|
|
|
w_object(value, arg->arg, arg->limit);
|
1998-01-16 15:19:09 +03:00
|
|
|
return ST_CONTINUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
* 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-22 07:00:03 +03:00
|
|
|
w_extended(klass, arg, check)
|
2002-09-05 13:42:56 +04:00
|
|
|
VALUE klass;
|
1998-01-16 15:19:09 +03:00
|
|
|
struct dump_arg *arg;
|
* 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-22 07:00:03 +03:00
|
|
|
int check;
|
1998-01-16 15:19:09 +03:00
|
|
|
{
|
2002-08-27 12:31:08 +04:00
|
|
|
char *path;
|
|
|
|
|
2002-09-05 13:42:56 +04:00
|
|
|
if (FL_TEST(klass, FL_SINGLETON)) {
|
* 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-22 07:00:03 +03:00
|
|
|
if (check && RCLASS(klass)->m_tbl->num_entries ||
|
2002-09-05 13:42:56 +04:00
|
|
|
(RCLASS(klass)->iv_tbl && RCLASS(klass)->iv_tbl->num_entries > 1)) {
|
2002-08-27 12:31:08 +04:00
|
|
|
rb_raise(rb_eTypeError, "singleton can't be dumped");
|
|
|
|
}
|
2002-09-05 13:42:56 +04:00
|
|
|
klass = RCLASS(klass)->super;
|
2002-08-27 12:31:08 +04:00
|
|
|
}
|
2002-09-05 13:42:56 +04:00
|
|
|
while (BUILTIN_TYPE(klass) == T_ICLASS) {
|
|
|
|
path = rb_class2name(RBASIC(klass)->klass);
|
|
|
|
w_byte(TYPE_EXTENDED, arg);
|
|
|
|
w_unique(path, arg);
|
|
|
|
klass = RCLASS(klass)->super;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
* 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-22 07:00:03 +03:00
|
|
|
w_class(type, obj, arg, check)
|
2002-09-05 13:42:56 +04:00
|
|
|
int type;
|
|
|
|
VALUE obj;
|
|
|
|
struct dump_arg *arg;
|
* 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-22 07:00:03 +03:00
|
|
|
int check;
|
2002-09-05 13:42:56 +04:00
|
|
|
{
|
|
|
|
char *path;
|
|
|
|
|
|
|
|
VALUE klass = CLASS_OF(obj);
|
* 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-22 07:00:03 +03:00
|
|
|
w_extended(klass, arg, check);
|
2002-09-05 13:42:56 +04:00
|
|
|
w_byte(type, arg);
|
2002-08-27 12:31:08 +04:00
|
|
|
path = rb_class2name(klass);
|
|
|
|
w_unique(path, arg);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
w_uclass(obj, base_klass, arg)
|
|
|
|
VALUE obj, base_klass;
|
|
|
|
struct dump_arg *arg;
|
|
|
|
{
|
|
|
|
VALUE klass = CLASS_OF(obj);
|
|
|
|
|
* 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-22 07:00:03 +03:00
|
|
|
w_extended(klass, arg, Qtrue);
|
2003-08-07 01:50:06 +04:00
|
|
|
klass = rb_class_real(klass);
|
2002-08-27 12:31:08 +04:00
|
|
|
if (klass != base_klass) {
|
1998-01-16 15:19:09 +03:00
|
|
|
w_byte(TYPE_UCLASS, arg);
|
2003-08-07 01:50:06 +04:00
|
|
|
w_unique(rb_class2name(klass), arg);
|
1998-01-16 15:19:09 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2003-10-04 21:51:11 +04:00
|
|
|
static int
|
|
|
|
w_obj_each(id, value, arg)
|
|
|
|
ID id;
|
|
|
|
VALUE value;
|
|
|
|
struct dump_call_arg *arg;
|
|
|
|
{
|
|
|
|
w_symbol(id, arg->arg);
|
2003-10-09 21:45:53 +04:00
|
|
|
w_object(value, arg->arg, arg->limit);
|
2003-10-04 21:51:11 +04:00
|
|
|
return ST_CONTINUE;
|
|
|
|
}
|
|
|
|
|
2000-01-05 07:41:21 +03:00
|
|
|
static void
|
|
|
|
w_ivar(tbl, arg)
|
|
|
|
st_table *tbl;
|
|
|
|
struct dump_call_arg *arg;
|
|
|
|
{
|
|
|
|
if (tbl) {
|
|
|
|
w_long(tbl->num_entries, arg->arg);
|
2003-10-04 21:51:11 +04:00
|
|
|
st_foreach(tbl, w_obj_each, (st_data_t)arg);
|
2000-01-05 07:41:21 +03:00
|
|
|
}
|
|
|
|
else {
|
|
|
|
w_long(0, arg->arg);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
1998-01-16 15:19:09 +03:00
|
|
|
static void
|
2003-10-09 21:45:53 +04:00
|
|
|
w_object(obj, arg, limit)
|
1998-01-16 15:19:09 +03:00
|
|
|
VALUE obj;
|
|
|
|
struct dump_arg *arg;
|
|
|
|
int limit;
|
|
|
|
{
|
|
|
|
struct dump_call_arg c_arg;
|
2000-01-17 11:37:53 +03:00
|
|
|
st_table *ivtbl = 0;
|
* 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-22 07:00:03 +03:00
|
|
|
st_data_t num;
|
1998-01-16 15:19:09 +03:00
|
|
|
|
|
|
|
if (limit == 0) {
|
2000-02-01 06:12:21 +03:00
|
|
|
rb_raise(rb_eArgError, "exceed depth limit");
|
1998-01-16 15:19:09 +03:00
|
|
|
}
|
2003-08-07 01:50:06 +04:00
|
|
|
|
2003-08-08 07:48:33 +04:00
|
|
|
limit--;
|
|
|
|
c_arg.limit = limit;
|
|
|
|
c_arg.arg = arg;
|
|
|
|
|
* 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-22 07:00:03 +03:00
|
|
|
if (st_lookup(arg->data, obj, &num)) {
|
|
|
|
w_byte(TYPE_LINK, arg);
|
|
|
|
w_long((long)num, arg);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2003-08-07 01:50:06 +04:00
|
|
|
if (ivtbl = rb_generic_ivar_table(obj)) {
|
|
|
|
w_byte(TYPE_IVAR, arg);
|
|
|
|
}
|
1998-01-16 15:19:09 +03:00
|
|
|
if (obj == Qnil) {
|
|
|
|
w_byte(TYPE_NIL, arg);
|
|
|
|
}
|
1999-01-20 07:59:39 +03:00
|
|
|
else if (obj == Qtrue) {
|
1998-01-16 15:19:09 +03:00
|
|
|
w_byte(TYPE_TRUE, arg);
|
|
|
|
}
|
1999-01-20 07:59:39 +03:00
|
|
|
else if (obj == Qfalse) {
|
1998-01-16 15:19:09 +03:00
|
|
|
w_byte(TYPE_FALSE, arg);
|
|
|
|
}
|
|
|
|
else if (FIXNUM_P(obj)) {
|
|
|
|
#if SIZEOF_LONG <= 4
|
|
|
|
w_byte(TYPE_FIXNUM, arg);
|
|
|
|
w_long(FIX2INT(obj), arg);
|
|
|
|
#else
|
2001-08-23 10:02:15 +04:00
|
|
|
if (RSHIFT((long)obj, 31) == 0 || RSHIFT((long)obj, 31) == -1) {
|
1998-01-16 15:19:09 +03:00
|
|
|
w_byte(TYPE_FIXNUM, arg);
|
1999-01-20 07:59:39 +03:00
|
|
|
w_long(FIX2LONG(obj), arg);
|
1998-01-16 15:19:09 +03:00
|
|
|
}
|
|
|
|
else {
|
2003-10-09 21:45:53 +04:00
|
|
|
w_object(rb_int2big(FIX2LONG(obj)), arg, limit);
|
1998-01-16 15:19:09 +03:00
|
|
|
}
|
|
|
|
#endif
|
|
|
|
}
|
2000-03-07 11:37:59 +03:00
|
|
|
else if (SYMBOL_P(obj)) {
|
2000-04-10 09:48:43 +04:00
|
|
|
w_symbol(SYM2ID(obj), arg);
|
2000-03-07 11:37:59 +03:00
|
|
|
}
|
1998-01-16 15:19:09 +03:00
|
|
|
else {
|
2000-07-21 12:45:34 +04:00
|
|
|
if (OBJ_TAINTED(obj)) arg->taint = Qtrue;
|
|
|
|
|
1999-01-20 07:59:39 +03:00
|
|
|
st_add_direct(arg->data, obj, arg->data->num_entries);
|
2003-07-29 22:26:55 +04:00
|
|
|
if (rb_respond_to(obj, s_mdump)) {
|
|
|
|
VALUE v;
|
|
|
|
|
2003-07-30 11:24:11 +04:00
|
|
|
v = rb_funcall(obj, s_mdump, 0, 0);
|
* 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-22 07:00:03 +03:00
|
|
|
w_class(TYPE_USRMARSHAL, obj, arg, Qfalse);
|
2003-10-09 21:45:53 +04:00
|
|
|
w_object(v, arg, limit);
|
|
|
|
if (ivtbl) w_ivar(0, &c_arg);
|
2003-07-29 22:26:55 +04:00
|
|
|
return;
|
|
|
|
}
|
1998-01-16 15:19:09 +03:00
|
|
|
if (rb_respond_to(obj, s_dump)) {
|
|
|
|
VALUE v;
|
|
|
|
|
1999-08-13 09:45:20 +04:00
|
|
|
v = rb_funcall(obj, s_dump, 1, INT2NUM(limit));
|
2003-07-31 12:42:44 +04:00
|
|
|
if (TYPE(v) != T_STRING) {
|
|
|
|
rb_raise(rb_eTypeError, "_dump() must return string");
|
|
|
|
}
|
2003-10-09 21:45:53 +04:00
|
|
|
if (!ivtbl && (ivtbl = rb_generic_ivar_table(v))) {
|
|
|
|
w_byte(TYPE_IVAR, arg);
|
|
|
|
}
|
* 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-22 07:00:03 +03:00
|
|
|
w_class(TYPE_USERDEF, obj, arg, Qfalse);
|
1998-01-16 15:19:09 +03:00
|
|
|
w_bytes(RSTRING(v)->ptr, RSTRING(v)->len, arg);
|
2003-10-09 21:45:53 +04:00
|
|
|
if (ivtbl) {
|
|
|
|
w_ivar(ivtbl, &c_arg);
|
|
|
|
}
|
1998-01-16 15:19:09 +03:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
switch (BUILTIN_TYPE(obj)) {
|
|
|
|
case T_CLASS:
|
2001-05-11 09:24:59 +04:00
|
|
|
if (FL_TEST(obj, FL_SINGLETON)) {
|
|
|
|
rb_raise(rb_eTypeError, "singleton class can't be dumped");
|
|
|
|
}
|
1999-12-01 12:24:48 +03:00
|
|
|
w_byte(TYPE_CLASS, arg);
|
|
|
|
{
|
|
|
|
VALUE path = rb_class_path(obj);
|
2001-06-05 11:19:39 +04:00
|
|
|
if (RSTRING(path)->ptr[0] == '#') {
|
2003-05-22 12:30:58 +04:00
|
|
|
rb_raise(rb_eTypeError, "can't dump anonymous class %s",
|
2001-06-05 11:19:39 +04:00
|
|
|
RSTRING(path)->ptr);
|
|
|
|
}
|
1999-12-01 12:24:48 +03:00
|
|
|
w_bytes(RSTRING(path)->ptr, RSTRING(path)->len, arg);
|
|
|
|
}
|
2000-01-05 07:41:21 +03:00
|
|
|
break;
|
1999-12-01 12:24:48 +03:00
|
|
|
|
|
|
|
case T_MODULE:
|
1998-01-16 15:19:09 +03:00
|
|
|
w_byte(TYPE_MODULE, arg);
|
|
|
|
{
|
|
|
|
VALUE path = rb_class_path(obj);
|
2001-06-05 11:19:39 +04:00
|
|
|
if (RSTRING(path)->ptr[0] == '#') {
|
2003-05-22 12:30:58 +04:00
|
|
|
rb_raise(rb_eTypeError, "can't dump anonymous module %s",
|
2001-06-05 11:19:39 +04:00
|
|
|
RSTRING(path)->ptr);
|
|
|
|
}
|
1998-01-16 15:19:09 +03:00
|
|
|
w_bytes(RSTRING(path)->ptr, RSTRING(path)->len, arg);
|
|
|
|
}
|
2000-01-05 07:41:21 +03:00
|
|
|
break;
|
1998-01-16 15:19:09 +03:00
|
|
|
|
|
|
|
case T_FLOAT:
|
|
|
|
w_byte(TYPE_FLOAT, arg);
|
|
|
|
w_float(RFLOAT(obj)->value, arg);
|
2000-01-05 07:41:21 +03:00
|
|
|
break;
|
1998-01-16 15:19:09 +03:00
|
|
|
|
|
|
|
case T_BIGNUM:
|
|
|
|
w_byte(TYPE_BIGNUM, arg);
|
|
|
|
{
|
2002-01-23 10:30:43 +03:00
|
|
|
char sign = RBIGNUM(obj)->sign ? '+' : '-';
|
2000-11-20 10:31:55 +03:00
|
|
|
long len = RBIGNUM(obj)->len;
|
2000-10-31 11:37:47 +03:00
|
|
|
BDIGIT *d = RBIGNUM(obj)->digits;
|
1998-01-16 15:19:09 +03:00
|
|
|
|
|
|
|
w_byte(sign, arg);
|
2000-11-20 10:31:55 +03:00
|
|
|
w_long(SHORTLEN(len), arg); /* w_short? */
|
1998-01-16 15:19:09 +03:00
|
|
|
while (len--) {
|
2000-10-31 11:37:47 +03:00
|
|
|
#if SIZEOF_BDIGITS > SIZEOF_SHORT
|
|
|
|
BDIGIT num = *d;
|
|
|
|
int i;
|
|
|
|
|
2001-03-26 12:57:16 +04:00
|
|
|
for (i=0; i<SIZEOF_BDIGITS; i+=SIZEOF_SHORT) {
|
2000-10-31 11:37:47 +03:00
|
|
|
w_short(num & SHORTMASK, arg);
|
|
|
|
num = SHORTDN(num);
|
2001-03-26 12:57:16 +04:00
|
|
|
if (len == 0 && num == 0) break;
|
2000-10-31 11:37:47 +03:00
|
|
|
}
|
|
|
|
#else
|
1998-01-16 15:19:09 +03:00
|
|
|
w_short(*d, arg);
|
2000-10-31 11:37:47 +03:00
|
|
|
#endif
|
1998-01-16 15:19:09 +03:00
|
|
|
d++;
|
|
|
|
}
|
|
|
|
}
|
2000-01-05 07:41:21 +03:00
|
|
|
break;
|
1998-01-16 15:19:09 +03:00
|
|
|
|
|
|
|
case T_STRING:
|
1999-01-20 07:59:39 +03:00
|
|
|
w_uclass(obj, rb_cString, arg);
|
1998-01-16 15:19:09 +03:00
|
|
|
w_byte(TYPE_STRING, arg);
|
|
|
|
w_bytes(RSTRING(obj)->ptr, RSTRING(obj)->len, arg);
|
2000-01-05 07:41:21 +03:00
|
|
|
break;
|
1998-01-16 15:19:09 +03:00
|
|
|
|
|
|
|
case T_REGEXP:
|
1999-01-20 07:59:39 +03:00
|
|
|
w_uclass(obj, rb_cRegexp, arg);
|
1998-01-16 15:19:09 +03:00
|
|
|
w_byte(TYPE_REGEXP, arg);
|
|
|
|
w_bytes(RREGEXP(obj)->str, RREGEXP(obj)->len, arg);
|
1999-01-20 07:59:39 +03:00
|
|
|
w_byte(rb_reg_options(obj), arg);
|
2000-01-05 07:41:21 +03:00
|
|
|
break;
|
1998-01-16 15:19:09 +03:00
|
|
|
|
|
|
|
case T_ARRAY:
|
1999-01-20 07:59:39 +03:00
|
|
|
w_uclass(obj, rb_cArray, arg);
|
1998-01-16 15:19:09 +03:00
|
|
|
w_byte(TYPE_ARRAY, arg);
|
|
|
|
{
|
2000-11-20 10:31:55 +03:00
|
|
|
long len = RARRAY(obj)->len;
|
1998-01-16 15:19:09 +03:00
|
|
|
VALUE *ptr = RARRAY(obj)->ptr;
|
|
|
|
|
|
|
|
w_long(len, arg);
|
|
|
|
while (len--) {
|
2003-10-09 21:45:53 +04:00
|
|
|
w_object(*ptr, arg, limit);
|
1998-01-16 15:19:09 +03:00
|
|
|
ptr++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case T_HASH:
|
1999-01-20 07:59:39 +03:00
|
|
|
w_uclass(obj, rb_cHash, arg);
|
2002-08-29 13:08:18 +04:00
|
|
|
if (NIL_P(RHASH(obj)->ifnone)) {
|
|
|
|
w_byte(TYPE_HASH, arg);
|
|
|
|
}
|
|
|
|
else if (FL_TEST(obj, FL_USER2)) {
|
|
|
|
/* FL_USER2 means HASH_PROC_DEFAULT (see hash.c) */
|
2003-05-22 12:30:58 +04:00
|
|
|
rb_raise(rb_eTypeError, "cannot dump hash with default proc");
|
1999-12-01 12:24:48 +03:00
|
|
|
}
|
|
|
|
else {
|
2002-08-29 13:08:18 +04:00
|
|
|
w_byte(TYPE_HASH_DEF, arg);
|
1999-12-01 12:24:48 +03:00
|
|
|
}
|
1998-01-16 15:19:09 +03:00
|
|
|
w_long(RHASH(obj)->tbl->num_entries, arg);
|
* 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 18:55:43 +03:00
|
|
|
st_foreach(RHASH(obj)->tbl, hash_each, (st_data_t)&c_arg);
|
1999-12-01 12:24:48 +03:00
|
|
|
if (!NIL_P(RHASH(obj)->ifnone)) {
|
2003-10-09 21:45:53 +04:00
|
|
|
w_object(RHASH(obj)->ifnone, arg, limit);
|
1999-12-01 12:24:48 +03:00
|
|
|
}
|
1998-01-16 15:19:09 +03:00
|
|
|
break;
|
|
|
|
|
|
|
|
case T_STRUCT:
|
* 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-22 07:00:03 +03:00
|
|
|
w_class(TYPE_STRUCT, obj, arg, Qtrue);
|
1998-01-16 15:19:09 +03:00
|
|
|
{
|
2000-11-20 10:31:55 +03:00
|
|
|
long len = RSTRUCT(obj)->len;
|
1998-01-16 15:19:09 +03:00
|
|
|
VALUE mem;
|
2000-11-20 10:31:55 +03:00
|
|
|
long i;
|
1998-01-16 15:19:09 +03:00
|
|
|
|
|
|
|
w_long(len, arg);
|
2001-08-29 10:28:51 +04:00
|
|
|
mem = rb_struct_iv_get(rb_obj_class(obj), "__member__");
|
1998-01-16 15:19:09 +03:00
|
|
|
if (mem == Qnil) {
|
2000-05-24 08:34:26 +04:00
|
|
|
rb_raise(rb_eTypeError, "uninitialized struct");
|
1998-01-16 15:19:09 +03:00
|
|
|
}
|
|
|
|
for (i=0; i<len; i++) {
|
2000-06-14 09:30:29 +04:00
|
|
|
w_symbol(SYM2ID(RARRAY(mem)->ptr[i]), arg);
|
2003-10-09 21:45:53 +04:00
|
|
|
w_object(RSTRUCT(obj)->ptr[i], arg, limit);
|
1998-01-16 15:19:09 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case T_OBJECT:
|
* 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-22 07:00:03 +03:00
|
|
|
w_class(TYPE_OBJECT, obj, arg, Qtrue);
|
2002-08-27 12:31:08 +04:00
|
|
|
w_ivar(ROBJECT(obj)->iv_tbl, &c_arg);
|
1998-01-16 15:19:09 +03:00
|
|
|
break;
|
|
|
|
|
2003-04-09 09:08:25 +04:00
|
|
|
case T_DATA:
|
|
|
|
{
|
|
|
|
VALUE v;
|
|
|
|
|
* 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-22 07:00:03 +03:00
|
|
|
w_class(TYPE_DATA, obj, arg, Qtrue);
|
2003-04-09 09:08:25 +04:00
|
|
|
if (!rb_respond_to(obj, s_dump_data)) {
|
|
|
|
rb_raise(rb_eTypeError,
|
* 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-22 07:00:03 +03:00
|
|
|
"no marshal_dump is defined for class %s",
|
2003-04-09 09:08:25 +04:00
|
|
|
rb_obj_classname(obj));
|
|
|
|
}
|
|
|
|
v = rb_funcall(obj, s_dump_data, 0);
|
2003-10-09 21:45:53 +04:00
|
|
|
w_object(v, arg, limit);
|
2003-04-09 09:08:25 +04:00
|
|
|
}
|
|
|
|
break;
|
2002-04-24 08:54:16 +04:00
|
|
|
|
1998-01-16 15:19:09 +03:00
|
|
|
default:
|
1999-01-20 07:59:39 +03:00
|
|
|
rb_raise(rb_eTypeError, "can't dump %s",
|
2003-01-31 07:00:17 +03:00
|
|
|
rb_obj_classname(obj));
|
1998-01-16 15:19:09 +03:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2000-01-05 07:41:21 +03:00
|
|
|
if (ivtbl) {
|
|
|
|
w_ivar(ivtbl, &c_arg);
|
|
|
|
}
|
1998-01-16 15:19:09 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
static VALUE
|
|
|
|
dump(arg)
|
|
|
|
struct dump_call_arg *arg;
|
|
|
|
{
|
2003-10-09 21:45:53 +04:00
|
|
|
w_object(arg->obj, arg->arg, arg->limit);
|
2002-10-17 14:20:52 +04:00
|
|
|
if (arg->arg->dest) {
|
|
|
|
rb_io_write(arg->arg->dest, arg->arg->str);
|
|
|
|
rb_str_resize(arg->arg->str, 0);
|
|
|
|
}
|
1999-01-20 07:59:39 +03:00
|
|
|
return 0;
|
1998-01-16 15:19:09 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
static VALUE
|
|
|
|
dump_ensure(arg)
|
|
|
|
struct dump_arg *arg;
|
|
|
|
{
|
2003-08-07 01:50:06 +04:00
|
|
|
st_free_table(arg->symbols);
|
1998-01-16 15:19:09 +03:00
|
|
|
st_free_table(arg->data);
|
2003-03-03 10:20:17 +03:00
|
|
|
if (arg->taint) {
|
2000-07-21 12:45:34 +04:00
|
|
|
OBJ_TAINT(arg->str);
|
|
|
|
}
|
1999-01-20 07:59:39 +03:00
|
|
|
return 0;
|
1998-01-16 15:19:09 +03:00
|
|
|
}
|
|
|
|
|
2003-12-27 19:07:43 +03:00
|
|
|
/*
|
|
|
|
* call-seq:
|
|
|
|
* dump( obj [, anIO] , limit=--1 ) => anIO
|
|
|
|
*
|
|
|
|
* Serializes obj and all descendent objects. If anIO is
|
|
|
|
* specified, the serialized data will be written to it, otherwise the
|
|
|
|
* data will be returned as a String. If limit is specified, the
|
|
|
|
* traversal of subobjects will be limited to that depth. If limit is
|
|
|
|
* negative, no checking of depth will be performed.
|
|
|
|
*
|
|
|
|
* class Klass
|
|
|
|
* def initialize(str)
|
|
|
|
* @str = str
|
|
|
|
* end
|
|
|
|
* def sayHello
|
|
|
|
* @str
|
|
|
|
* end
|
|
|
|
* end
|
|
|
|
*
|
|
|
|
* (produces no output)
|
|
|
|
*
|
|
|
|
* o = Klass.new("hello\n")
|
|
|
|
* data = Marshal.dump(o)
|
|
|
|
* obj = Marshal.load(data)
|
|
|
|
* obj.sayHello #=> "hello\n"
|
|
|
|
*/
|
1998-01-16 15:19:09 +03:00
|
|
|
static VALUE
|
|
|
|
marshal_dump(argc, argv)
|
|
|
|
int argc;
|
|
|
|
VALUE* argv;
|
|
|
|
{
|
|
|
|
VALUE obj, port, a1, a2;
|
|
|
|
int limit = -1;
|
|
|
|
struct dump_arg arg;
|
|
|
|
struct dump_call_arg c_arg;
|
|
|
|
|
2003-04-08 09:40:29 +04:00
|
|
|
port = Qnil;
|
1998-01-16 15:19:09 +03:00
|
|
|
rb_scan_args(argc, argv, "12", &obj, &a1, &a2);
|
|
|
|
if (argc == 3) {
|
2000-04-12 09:06:23 +04:00
|
|
|
if (!NIL_P(a2)) limit = NUM2INT(a2);
|
2003-04-08 09:40:29 +04:00
|
|
|
if (NIL_P(a1)) goto type_error;
|
1998-01-16 15:19:09 +03:00
|
|
|
port = a1;
|
|
|
|
}
|
|
|
|
else if (argc == 2) {
|
|
|
|
if (FIXNUM_P(a1)) limit = FIX2INT(a1);
|
2003-04-08 09:40:29 +04:00
|
|
|
else if (NIL_P(a1)) goto type_error;
|
1998-01-16 15:19:09 +03:00
|
|
|
else port = a1;
|
|
|
|
}
|
2002-10-17 14:20:52 +04:00
|
|
|
arg.dest = 0;
|
2003-04-08 09:40:29 +04:00
|
|
|
if (!NIL_P(port)) {
|
2003-03-03 10:20:17 +03:00
|
|
|
if (!rb_respond_to(port, s_write)) {
|
2003-04-08 09:40:29 +04:00
|
|
|
type_error:
|
1999-01-20 07:59:39 +03:00
|
|
|
rb_raise(rb_eTypeError, "instance of IO needed");
|
1998-01-16 15:19:09 +03:00
|
|
|
}
|
2003-03-03 10:20:17 +03:00
|
|
|
arg.str = rb_str_buf_new(0);
|
|
|
|
arg.dest = port;
|
|
|
|
if (rb_respond_to(port, s_binmode)) {
|
|
|
|
rb_funcall2(port, s_binmode, 0, 0);
|
|
|
|
}
|
1998-01-16 15:19:09 +03:00
|
|
|
}
|
|
|
|
else {
|
2001-05-30 13:12:34 +04:00
|
|
|
port = rb_str_buf_new(0);
|
1998-01-16 15:19:09 +03:00
|
|
|
arg.str = port;
|
|
|
|
}
|
|
|
|
|
2003-08-07 01:50:06 +04:00
|
|
|
arg.symbols = st_init_numtable();
|
|
|
|
arg.data = st_init_numtable();
|
|
|
|
arg.taint = Qfalse;
|
|
|
|
c_arg.obj = obj;
|
|
|
|
c_arg.arg = &arg;
|
1998-01-16 15:19:09 +03:00
|
|
|
c_arg.limit = limit;
|
|
|
|
|
|
|
|
w_byte(MARSHAL_MAJOR, &arg);
|
|
|
|
w_byte(MARSHAL_MINOR, &arg);
|
|
|
|
|
1999-01-20 07:59:39 +03:00
|
|
|
rb_ensure(dump, (VALUE)&c_arg, dump_ensure, (VALUE)&arg);
|
1998-01-16 15:19:09 +03:00
|
|
|
|
|
|
|
return port;
|
|
|
|
}
|
|
|
|
|
|
|
|
struct load_arg {
|
1999-01-20 07:59:39 +03:00
|
|
|
char *ptr, *end;
|
2003-08-07 01:50:06 +04:00
|
|
|
st_table *symbols;
|
1999-10-20 11:10:23 +04:00
|
|
|
VALUE data;
|
1998-01-16 15:19:09 +03:00
|
|
|
VALUE proc;
|
2000-07-21 12:45:34 +04:00
|
|
|
int taint;
|
1998-01-16 15:19:09 +03:00
|
|
|
};
|
|
|
|
|
2000-01-05 07:41:21 +03:00
|
|
|
static VALUE r_object _((struct load_arg *arg));
|
|
|
|
|
1998-01-16 15:19:09 +03:00
|
|
|
static int
|
|
|
|
r_byte(arg)
|
|
|
|
struct load_arg *arg;
|
|
|
|
{
|
1999-08-13 09:45:20 +04:00
|
|
|
int c;
|
|
|
|
|
2003-03-03 10:20:17 +03:00
|
|
|
if (!arg->end) {
|
2002-10-17 14:20:52 +04:00
|
|
|
VALUE src = (VALUE)arg->ptr;
|
|
|
|
VALUE v = rb_funcall2(src, s_getc, 0, 0);
|
|
|
|
if (NIL_P(v)) rb_eof_error();
|
|
|
|
c = (unsigned char)FIX2INT(v);
|
|
|
|
}
|
1999-08-13 09:45:20 +04:00
|
|
|
else if (arg->ptr < arg->end) {
|
|
|
|
c = *(unsigned char*)arg->ptr++;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
rb_raise(rb_eArgError, "marshal data too short");
|
|
|
|
}
|
|
|
|
return c;
|
1998-01-16 15:19:09 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
long_toobig(size)
|
|
|
|
int size;
|
|
|
|
{
|
1999-01-20 07:59:39 +03:00
|
|
|
rb_raise(rb_eTypeError, "long too big for this architecture (size %d, given %d)",
|
|
|
|
sizeof(long), size);
|
1998-01-16 15:19:09 +03:00
|
|
|
}
|
|
|
|
|
2001-08-29 10:28:51 +04:00
|
|
|
#undef SIGN_EXTEND_CHAR
|
|
|
|
#if __STDC__
|
|
|
|
# define SIGN_EXTEND_CHAR(c) ((signed char)(c))
|
|
|
|
#else /* not __STDC__ */
|
|
|
|
/* As in Harbison and Steele. */
|
|
|
|
# define SIGN_EXTEND_CHAR(c) ((((unsigned char)(c)) ^ 128) - 128)
|
|
|
|
#endif
|
|
|
|
|
1998-01-16 15:19:09 +03:00
|
|
|
static long
|
|
|
|
r_long(arg)
|
|
|
|
struct load_arg *arg;
|
|
|
|
{
|
|
|
|
register long x;
|
2001-08-29 10:28:51 +04:00
|
|
|
int c = SIGN_EXTEND_CHAR(r_byte(arg));
|
|
|
|
long i;
|
1998-01-16 15:19:09 +03:00
|
|
|
|
|
|
|
if (c == 0) return 0;
|
|
|
|
if (c > 0) {
|
2000-12-05 12:36:54 +03:00
|
|
|
if (4 < c && c < 128) {
|
|
|
|
return c - 5;
|
|
|
|
}
|
2000-11-20 10:31:55 +03:00
|
|
|
if (c > sizeof(long)) long_toobig(c);
|
1998-01-16 15:19:09 +03:00
|
|
|
x = 0;
|
|
|
|
for (i=0;i<c;i++) {
|
|
|
|
x |= (long)r_byte(arg) << (8*i);
|
|
|
|
}
|
|
|
|
}
|
1999-01-20 07:59:39 +03:00
|
|
|
else {
|
2000-12-05 12:36:54 +03:00
|
|
|
if (-129 < c && c < -4) {
|
|
|
|
return c + 5;
|
|
|
|
}
|
1998-01-16 15:19:09 +03:00
|
|
|
c = -c;
|
2000-11-20 10:31:55 +03:00
|
|
|
if (c > sizeof(long)) long_toobig(c);
|
1998-01-16 15:19:09 +03:00
|
|
|
x = -1;
|
|
|
|
for (i=0;i<c;i++) {
|
2001-08-29 10:28:51 +04:00
|
|
|
x &= ~((long)0xff << (8*i));
|
1998-01-16 15:19:09 +03:00
|
|
|
x |= (long)r_byte(arg) << (8*i);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return x;
|
|
|
|
}
|
|
|
|
|
2002-09-04 10:37:39 +04:00
|
|
|
#define r_bytes(arg) r_bytes0(r_long(arg), (arg))
|
1998-01-16 15:19:09 +03:00
|
|
|
|
2002-09-04 10:37:39 +04:00
|
|
|
static VALUE
|
|
|
|
r_bytes0(len, arg)
|
2000-11-20 10:31:55 +03:00
|
|
|
long len;
|
1998-01-16 15:19:09 +03:00
|
|
|
struct load_arg *arg;
|
|
|
|
{
|
2002-09-04 10:37:39 +04:00
|
|
|
VALUE str;
|
|
|
|
|
2003-03-03 10:20:17 +03:00
|
|
|
if (!arg->end) {
|
2002-10-17 14:20:52 +04:00
|
|
|
VALUE src = (VALUE)arg->ptr;
|
|
|
|
VALUE n = LONG2NUM(len);
|
|
|
|
str = rb_funcall2(src, s_read, 1, &n);
|
|
|
|
if (NIL_P(str)) goto too_short;
|
2002-12-19 12:20:20 +03:00
|
|
|
StringValue(str);
|
2002-10-17 14:20:52 +04:00
|
|
|
if (RSTRING(str)->len != len) goto too_short;
|
|
|
|
if (OBJ_TAINTED(str)) arg->taint = Qtrue;
|
|
|
|
}
|
1998-01-16 15:19:09 +03:00
|
|
|
else {
|
|
|
|
if (arg->ptr + len > arg->end) {
|
2003-03-03 10:20:17 +03:00
|
|
|
too_short:
|
|
|
|
rb_raise(rb_eArgError, "marshal data too short");
|
1998-01-16 15:19:09 +03:00
|
|
|
}
|
2002-09-04 10:37:39 +04:00
|
|
|
str = rb_str_new(arg->ptr, len);
|
1998-01-16 15:19:09 +03:00
|
|
|
arg->ptr += len;
|
|
|
|
}
|
2002-09-04 10:37:39 +04:00
|
|
|
return str;
|
1998-01-16 15:19:09 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
static ID
|
2000-04-10 09:48:43 +04:00
|
|
|
r_symlink(arg)
|
1998-01-16 15:19:09 +03:00
|
|
|
struct load_arg *arg;
|
|
|
|
{
|
|
|
|
ID id;
|
2000-11-20 10:31:55 +03:00
|
|
|
long num = r_long(arg);
|
1998-01-16 15:19:09 +03:00
|
|
|
|
2003-08-07 01:50:06 +04:00
|
|
|
if (st_lookup(arg->symbols, num, &id)) {
|
2000-04-10 09:48:43 +04:00
|
|
|
return id;
|
1998-01-16 15:19:09 +03:00
|
|
|
}
|
2003-05-22 12:30:58 +04:00
|
|
|
rb_raise(rb_eArgError, "bad symbol");
|
2000-04-10 09:48:43 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
static ID
|
|
|
|
r_symreal(arg)
|
|
|
|
struct load_arg *arg;
|
|
|
|
{
|
|
|
|
ID id;
|
|
|
|
|
2002-09-04 10:37:39 +04:00
|
|
|
id = rb_intern(RSTRING(r_bytes(arg))->ptr);
|
2003-08-07 01:50:06 +04:00
|
|
|
st_insert(arg->symbols, arg->symbols->num_entries, id);
|
1998-01-16 15:19:09 +03:00
|
|
|
|
|
|
|
return id;
|
|
|
|
}
|
|
|
|
|
2000-04-10 09:48:43 +04:00
|
|
|
static ID
|
|
|
|
r_symbol(arg)
|
|
|
|
struct load_arg *arg;
|
|
|
|
{
|
|
|
|
if (r_byte(arg) == TYPE_SYMLINK) {
|
|
|
|
return r_symlink(arg);
|
|
|
|
}
|
|
|
|
return r_symreal(arg);
|
|
|
|
}
|
|
|
|
|
1998-01-16 15:19:09 +03:00
|
|
|
static char*
|
|
|
|
r_unique(arg)
|
|
|
|
struct load_arg *arg;
|
|
|
|
{
|
|
|
|
return rb_id2name(r_symbol(arg));
|
|
|
|
}
|
|
|
|
|
|
|
|
static VALUE
|
|
|
|
r_string(arg)
|
|
|
|
struct load_arg *arg;
|
|
|
|
{
|
2002-09-04 10:37:39 +04:00
|
|
|
return r_bytes(arg);
|
1998-01-16 15:19:09 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
static VALUE
|
2003-10-02 12:25:00 +04:00
|
|
|
r_entry(v, arg)
|
1998-01-16 15:19:09 +03:00
|
|
|
VALUE v;
|
|
|
|
struct load_arg *arg;
|
|
|
|
{
|
1999-10-20 11:10:23 +04:00
|
|
|
rb_hash_aset(arg->data, INT2FIX(RHASH(arg->data)->tbl->num_entries), v);
|
2000-07-21 12:45:34 +04:00
|
|
|
if (arg->taint) OBJ_TAINT(v);
|
1998-01-16 15:19:09 +03:00
|
|
|
return v;
|
|
|
|
}
|
|
|
|
|
2000-01-05 07:41:21 +03:00
|
|
|
static void
|
|
|
|
r_ivar(obj, arg)
|
|
|
|
VALUE obj;
|
|
|
|
struct load_arg *arg;
|
|
|
|
{
|
2000-11-20 10:31:55 +03:00
|
|
|
long len;
|
2000-01-05 07:41:21 +03:00
|
|
|
|
|
|
|
len = r_long(arg);
|
|
|
|
if (len > 0) {
|
|
|
|
while (len--) {
|
|
|
|
ID id = r_symbol(arg);
|
|
|
|
VALUE val = r_object(arg);
|
|
|
|
rb_ivar_set(obj, id, val);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2002-09-05 13:42:56 +04:00
|
|
|
static VALUE
|
|
|
|
path2class(path)
|
|
|
|
char *path;
|
|
|
|
{
|
|
|
|
VALUE v = rb_path2class(path);
|
|
|
|
|
|
|
|
if (TYPE(v) != T_CLASS) {
|
2003-05-22 12:30:58 +04:00
|
|
|
rb_raise(rb_eArgError, "%s does not refer class", path);
|
2002-09-05 13:42:56 +04:00
|
|
|
}
|
|
|
|
return v;
|
|
|
|
}
|
|
|
|
|
|
|
|
static VALUE
|
|
|
|
path2module(path)
|
|
|
|
char *path;
|
|
|
|
{
|
|
|
|
VALUE v = rb_path2class(path);
|
|
|
|
|
|
|
|
if (TYPE(v) != T_MODULE) {
|
2003-05-22 12:30:58 +04:00
|
|
|
rb_raise(rb_eArgError, "%s does not refer module", path);
|
2002-09-05 13:42:56 +04:00
|
|
|
}
|
|
|
|
return v;
|
|
|
|
}
|
|
|
|
|
1998-01-16 15:19:09 +03:00
|
|
|
static VALUE
|
2003-10-20 06:06:42 +04:00
|
|
|
r_object0(arg, proc, ivp, extmod)
|
1998-01-16 15:19:09 +03:00
|
|
|
struct load_arg *arg;
|
2002-08-28 19:58:35 +04:00
|
|
|
VALUE proc;
|
2003-10-02 12:25:00 +04:00
|
|
|
int *ivp;
|
2003-10-20 06:06:42 +04:00
|
|
|
VALUE extmod;
|
1998-01-16 15:19:09 +03:00
|
|
|
{
|
2002-02-26 09:48:59 +03:00
|
|
|
VALUE v = Qnil;
|
1998-01-16 15:19:09 +03:00
|
|
|
int type = r_byte(arg);
|
1999-10-20 11:10:23 +04:00
|
|
|
long id;
|
1998-01-16 15:19:09 +03:00
|
|
|
|
|
|
|
switch (type) {
|
|
|
|
case TYPE_LINK:
|
1999-10-20 11:10:23 +04:00
|
|
|
id = r_long(arg);
|
2002-08-21 19:47:54 +04:00
|
|
|
v = rb_hash_aref(arg->data, LONG2FIX(id));
|
1999-10-27 08:20:00 +04:00
|
|
|
if (NIL_P(v)) {
|
|
|
|
rb_raise(rb_eArgError, "dump format error (unlinked)");
|
1998-01-16 15:19:09 +03:00
|
|
|
}
|
1999-10-27 08:20:00 +04:00
|
|
|
return v;
|
1998-01-16 15:19:09 +03:00
|
|
|
|
2000-01-05 07:41:21 +03:00
|
|
|
case TYPE_IVAR:
|
2003-10-02 12:25:00 +04:00
|
|
|
{
|
|
|
|
int ivar = Qtrue;
|
|
|
|
|
2003-10-20 06:06:42 +04:00
|
|
|
v = r_object0(arg, 0, &ivar, extmod);
|
2003-10-02 12:25:00 +04:00
|
|
|
if (ivar) r_ivar(v, arg);
|
|
|
|
}
|
2002-08-28 19:58:35 +04:00
|
|
|
break;
|
2000-01-05 07:41:21 +03:00
|
|
|
|
2002-09-05 13:42:56 +04:00
|
|
|
case TYPE_EXTENDED:
|
|
|
|
{
|
|
|
|
VALUE m = path2module(r_unique(arg));
|
|
|
|
|
2003-10-20 06:06:42 +04:00
|
|
|
if (NIL_P(extmod)) extmod = rb_ary_new2(0);
|
|
|
|
rb_ary_push(extmod, m);
|
2003-10-15 06:27:56 +04:00
|
|
|
|
2003-10-20 06:06:42 +04:00
|
|
|
v = r_object0(arg, 0, 0, extmod);
|
|
|
|
while (RARRAY(extmod)->len > 0) {
|
|
|
|
m = rb_ary_pop(extmod);
|
2003-10-15 06:27:56 +04:00
|
|
|
rb_extend_object(v, m);
|
|
|
|
}
|
2002-09-05 13:42:56 +04:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
1998-01-16 15:19:09 +03:00
|
|
|
case TYPE_UCLASS:
|
|
|
|
{
|
2002-09-05 13:42:56 +04:00
|
|
|
VALUE c = path2class(r_unique(arg));
|
2001-10-03 11:19:19 +04:00
|
|
|
|
2002-12-12 10:29:14 +03:00
|
|
|
if (FL_TEST(c, FL_SINGLETON)) {
|
|
|
|
rb_raise(rb_eTypeError, "singleton can't be loaded");
|
|
|
|
}
|
2003-10-20 06:06:42 +04:00
|
|
|
v = r_object0(arg, 0, 0, extmod);
|
2001-10-22 10:48:18 +04:00
|
|
|
if (rb_special_const_p(v) || TYPE(v) == T_OBJECT || TYPE(v) == T_CLASS) {
|
|
|
|
format_error:
|
1999-01-20 07:59:39 +03:00
|
|
|
rb_raise(rb_eArgError, "dump format error (user class)");
|
1998-01-16 15:19:09 +03:00
|
|
|
}
|
2001-10-22 10:48:18 +04:00
|
|
|
if (TYPE(v) == T_MODULE || !RTEST(rb_funcall(c, '<', 1, RBASIC(v)->klass))) {
|
|
|
|
VALUE tmp = rb_obj_alloc(c);
|
|
|
|
|
|
|
|
if (TYPE(v) != TYPE(tmp)) goto format_error;
|
2001-10-03 11:19:19 +04:00
|
|
|
}
|
1999-01-20 07:59:39 +03:00
|
|
|
RBASIC(v)->klass = c;
|
1998-01-16 15:19:09 +03:00
|
|
|
}
|
2002-08-28 19:58:35 +04:00
|
|
|
break;
|
1998-01-16 15:19:09 +03:00
|
|
|
|
|
|
|
case TYPE_NIL:
|
2002-02-26 09:48:59 +03:00
|
|
|
v = Qnil;
|
|
|
|
break;
|
1998-01-16 15:19:09 +03:00
|
|
|
|
|
|
|
case TYPE_TRUE:
|
2002-02-26 09:48:59 +03:00
|
|
|
v = Qtrue;
|
|
|
|
break;
|
1998-01-16 15:19:09 +03:00
|
|
|
|
|
|
|
case TYPE_FALSE:
|
2002-02-26 09:48:59 +03:00
|
|
|
v = Qfalse;
|
2002-02-28 09:53:33 +03:00
|
|
|
break;
|
1998-01-16 15:19:09 +03:00
|
|
|
|
|
|
|
case TYPE_FIXNUM:
|
|
|
|
{
|
2000-11-20 10:31:55 +03:00
|
|
|
long i = r_long(arg);
|
2002-08-21 19:47:54 +04:00
|
|
|
v = LONG2FIX(i);
|
1998-01-16 15:19:09 +03:00
|
|
|
}
|
2002-02-26 09:48:59 +03:00
|
|
|
break;
|
1998-01-16 15:19:09 +03:00
|
|
|
|
|
|
|
case TYPE_FLOAT:
|
|
|
|
{
|
2001-11-19 08:03:03 +03:00
|
|
|
double d, t = 0.0;
|
2002-09-04 10:37:39 +04:00
|
|
|
VALUE str = r_bytes(arg);
|
2003-04-20 19:11:20 +04:00
|
|
|
const char *ptr = RSTRING(str)->ptr;
|
1998-01-16 15:19:09 +03:00
|
|
|
|
2003-04-20 19:11:20 +04:00
|
|
|
if (strcmp(ptr, "nan") == 0) {
|
2001-11-19 08:03:03 +03:00
|
|
|
d = t / t;
|
|
|
|
}
|
2003-04-20 19:11:20 +04:00
|
|
|
else if (strcmp(ptr, "inf") == 0) {
|
2001-11-19 08:03:03 +03:00
|
|
|
d = 1.0 / t;
|
|
|
|
}
|
2003-04-20 19:11:20 +04:00
|
|
|
else if (strcmp(ptr, "-inf") == 0) {
|
2001-11-19 08:03:03 +03:00
|
|
|
d = -1.0 / t;
|
|
|
|
}
|
|
|
|
else {
|
2003-04-20 19:11:20 +04:00
|
|
|
char *e;
|
|
|
|
d = strtod(ptr, &e);
|
2003-04-22 14:08:57 +04:00
|
|
|
d = load_mantissa(d, e, RSTRING(str)->len - (e - ptr));
|
2001-11-19 08:03:03 +03:00
|
|
|
}
|
|
|
|
v = rb_float_new(d);
|
2003-10-02 12:25:00 +04:00
|
|
|
r_entry(v, arg);
|
1998-01-16 15:19:09 +03:00
|
|
|
}
|
2002-02-26 09:48:59 +03:00
|
|
|
break;
|
1998-01-16 15:19:09 +03:00
|
|
|
|
|
|
|
case TYPE_BIGNUM:
|
|
|
|
{
|
2000-11-20 10:31:55 +03:00
|
|
|
long len;
|
2000-10-31 11:37:47 +03:00
|
|
|
BDIGIT *digits;
|
2002-10-17 14:20:52 +04:00
|
|
|
VALUE data;
|
1998-01-16 15:19:09 +03:00
|
|
|
|
|
|
|
NEWOBJ(big, struct RBignum);
|
1999-01-20 07:59:39 +03:00
|
|
|
OBJSETUP(big, rb_cBignum, T_BIGNUM);
|
1998-01-16 15:19:09 +03:00
|
|
|
big->sign = (r_byte(arg) == '+');
|
2000-10-31 11:37:47 +03:00
|
|
|
len = r_long(arg);
|
2002-10-17 14:20:52 +04:00
|
|
|
data = r_bytes0(len * 2, arg);
|
2001-03-22 11:59:26 +03:00
|
|
|
#if SIZEOF_BDIGITS == SIZEOF_SHORT
|
|
|
|
big->len = len;
|
|
|
|
#else
|
2001-08-29 10:28:51 +04:00
|
|
|
big->len = (len + 1) * 2 / sizeof(BDIGIT);
|
2001-03-22 11:59:26 +03:00
|
|
|
#endif
|
2000-10-31 11:37:47 +03:00
|
|
|
big->digits = digits = ALLOC_N(BDIGIT, big->len);
|
2002-10-17 14:20:52 +04:00
|
|
|
MEMCPY(digits, RSTRING(data)->ptr, char, len * 2);
|
2000-10-31 11:37:47 +03:00
|
|
|
#if SIZEOF_BDIGITS > SIZEOF_SHORT
|
2002-10-17 14:20:52 +04:00
|
|
|
MEMZERO((char *)digits + len * 2, char,
|
|
|
|
big->len * sizeof(BDIGIT) - len * 2);
|
|
|
|
#endif
|
|
|
|
len = big->len;
|
|
|
|
while (len > 0) {
|
|
|
|
unsigned char *p = (unsigned char *)digits;
|
2000-10-31 11:37:47 +03:00
|
|
|
BDIGIT num = 0;
|
2002-10-17 14:20:52 +04:00
|
|
|
#if SIZEOF_BDIGITS > SIZEOF_SHORT
|
2000-10-31 11:37:47 +03:00
|
|
|
int shift = 0;
|
|
|
|
int i;
|
|
|
|
|
2002-10-17 14:20:52 +04:00
|
|
|
for (i=0; i<SIZEOF_BDIGITS; i++) {
|
|
|
|
num |= (int)p[i] << shift;
|
|
|
|
shift += 8;
|
2000-10-31 11:37:47 +03:00
|
|
|
}
|
|
|
|
#else
|
2002-10-17 14:20:52 +04:00
|
|
|
num = p[0] | (p[1] << 8);
|
2000-10-31 11:37:47 +03:00
|
|
|
#endif
|
2002-10-17 14:20:52 +04:00
|
|
|
*digits++ = num;
|
|
|
|
len--;
|
1998-01-16 15:19:09 +03:00
|
|
|
}
|
2002-02-27 07:52:21 +03:00
|
|
|
v = rb_big_norm((VALUE)big);
|
2003-10-02 12:25:00 +04:00
|
|
|
r_entry(v, arg);
|
1998-01-16 15:19:09 +03:00
|
|
|
}
|
2002-02-26 09:48:59 +03:00
|
|
|
break;
|
1998-01-16 15:19:09 +03:00
|
|
|
|
|
|
|
case TYPE_STRING:
|
2003-10-02 12:25:00 +04:00
|
|
|
v = r_entry(r_string(arg), arg);
|
2002-02-26 09:48:59 +03:00
|
|
|
break;
|
1998-01-16 15:19:09 +03:00
|
|
|
|
|
|
|
case TYPE_REGEXP:
|
|
|
|
{
|
2002-09-04 10:37:39 +04:00
|
|
|
volatile VALUE str = r_bytes(arg);
|
|
|
|
int options = r_byte(arg);
|
2003-10-02 12:25:00 +04:00
|
|
|
v = r_entry(rb_reg_new(RSTRING(str)->ptr, RSTRING(str)->len, options), arg);
|
1998-01-16 15:19:09 +03:00
|
|
|
}
|
2002-02-26 09:48:59 +03:00
|
|
|
break;
|
1998-01-16 15:19:09 +03:00
|
|
|
|
|
|
|
case TYPE_ARRAY:
|
|
|
|
{
|
2000-11-20 10:31:55 +03:00
|
|
|
volatile long len = r_long(arg); /* gcc 2.7.2.3 -O2 bug?? */
|
1999-08-24 12:21:56 +04:00
|
|
|
|
1999-01-20 07:59:39 +03:00
|
|
|
v = rb_ary_new2(len);
|
2003-10-02 12:25:00 +04:00
|
|
|
r_entry(v, arg);
|
1998-01-16 15:19:09 +03:00
|
|
|
while (len--) {
|
1999-01-20 07:59:39 +03:00
|
|
|
rb_ary_push(v, r_object(arg));
|
1998-01-16 15:19:09 +03:00
|
|
|
}
|
|
|
|
}
|
2002-02-26 09:48:59 +03:00
|
|
|
break;
|
1998-01-16 15:19:09 +03:00
|
|
|
|
|
|
|
case TYPE_HASH:
|
1999-12-01 12:24:48 +03:00
|
|
|
case TYPE_HASH_DEF:
|
1998-01-16 15:19:09 +03:00
|
|
|
{
|
2000-11-20 10:31:55 +03:00
|
|
|
long len = r_long(arg);
|
1998-01-16 15:19:09 +03:00
|
|
|
|
1999-01-20 07:59:39 +03:00
|
|
|
v = rb_hash_new();
|
2003-10-02 12:25:00 +04:00
|
|
|
r_entry(v, arg);
|
1998-01-16 15:19:09 +03:00
|
|
|
while (len--) {
|
|
|
|
VALUE key = r_object(arg);
|
|
|
|
VALUE value = r_object(arg);
|
1999-01-20 07:59:39 +03:00
|
|
|
rb_hash_aset(v, key, value);
|
1998-01-16 15:19:09 +03:00
|
|
|
}
|
1999-12-02 09:58:52 +03:00
|
|
|
if (type == TYPE_HASH_DEF) {
|
1999-12-01 12:24:48 +03:00
|
|
|
RHASH(v)->ifnone = r_object(arg);
|
|
|
|
}
|
1998-01-16 15:19:09 +03:00
|
|
|
}
|
2002-02-26 09:48:59 +03:00
|
|
|
break;
|
1998-01-16 15:19:09 +03:00
|
|
|
|
|
|
|
case TYPE_STRUCT:
|
|
|
|
{
|
1999-01-20 07:59:39 +03:00
|
|
|
VALUE klass, mem, values;
|
2000-11-20 10:31:55 +03:00
|
|
|
volatile long i; /* gcc 2.7.2.3 -O2 bug?? */
|
|
|
|
long len;
|
1998-01-16 15:19:09 +03:00
|
|
|
ID slot;
|
|
|
|
|
2002-09-05 13:42:56 +04:00
|
|
|
klass = path2class(r_unique(arg));
|
2001-10-19 18:32:51 +04:00
|
|
|
mem = rb_struct_iv_get(klass, "__member__");
|
1998-01-16 15:19:09 +03:00
|
|
|
if (mem == Qnil) {
|
2000-05-24 08:34:26 +04:00
|
|
|
rb_raise(rb_eTypeError, "uninitialized struct");
|
1998-01-16 15:19:09 +03:00
|
|
|
}
|
|
|
|
len = r_long(arg);
|
|
|
|
|
1999-01-20 07:59:39 +03:00
|
|
|
values = rb_ary_new2(len);
|
1998-01-16 15:19:09 +03:00
|
|
|
for (i=0; i<len; i++) {
|
1999-01-20 07:59:39 +03:00
|
|
|
rb_ary_push(values, Qnil);
|
1998-01-16 15:19:09 +03:00
|
|
|
}
|
1999-01-20 07:59:39 +03:00
|
|
|
v = rb_struct_alloc(klass, values);
|
2003-10-02 12:25:00 +04:00
|
|
|
r_entry(v, arg);
|
1998-01-16 15:19:09 +03:00
|
|
|
for (i=0; i<len; i++) {
|
|
|
|
slot = r_symbol(arg);
|
|
|
|
|
2000-06-14 09:30:29 +04:00
|
|
|
if (RARRAY(mem)->ptr[i] != ID2SYM(slot)) {
|
1999-01-20 07:59:39 +03:00
|
|
|
rb_raise(rb_eTypeError, "struct %s not compatible (:%s for :%s)",
|
|
|
|
rb_class2name(klass),
|
|
|
|
rb_id2name(slot),
|
2000-06-14 09:30:29 +04:00
|
|
|
rb_id2name(SYM2ID(RARRAY(mem)->ptr[i])));
|
1998-01-16 15:19:09 +03:00
|
|
|
}
|
2002-08-21 19:47:54 +04:00
|
|
|
rb_struct_aset(v, LONG2FIX(i), r_object(arg));
|
1998-01-16 15:19:09 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case TYPE_USERDEF:
|
|
|
|
{
|
2002-09-05 13:42:56 +04:00
|
|
|
VALUE klass = path2class(r_unique(arg));
|
2003-10-02 12:25:00 +04:00
|
|
|
VALUE data;
|
1998-01-16 15:19:09 +03:00
|
|
|
|
2002-02-26 09:48:59 +03:00
|
|
|
if (!rb_respond_to(klass, s_load)) {
|
|
|
|
rb_raise(rb_eTypeError, "class %s needs to have method `_load'",
|
|
|
|
rb_class2name(klass));
|
1998-01-16 15:19:09 +03:00
|
|
|
}
|
2003-10-02 12:25:00 +04:00
|
|
|
data = r_string(arg);
|
|
|
|
if (ivp) {
|
|
|
|
r_ivar(data, arg);
|
|
|
|
*ivp = Qfalse;
|
|
|
|
}
|
|
|
|
v = rb_funcall(klass, s_load, 1, data);
|
|
|
|
r_entry(v, arg);
|
1998-01-16 15:19:09 +03:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
2003-07-29 22:26:55 +04:00
|
|
|
case TYPE_USRMARSHAL:
|
|
|
|
{
|
|
|
|
VALUE klass = path2class(r_unique(arg));
|
2003-10-02 12:25:00 +04:00
|
|
|
VALUE data;
|
2003-07-29 22:26:55 +04:00
|
|
|
|
|
|
|
v = rb_obj_alloc(klass);
|
2003-10-20 06:06:42 +04:00
|
|
|
if (! NIL_P(extmod)) {
|
|
|
|
while (RARRAY(extmod)->len > 0) {
|
|
|
|
VALUE m = rb_ary_pop(extmod);
|
2003-10-15 06:27:56 +04:00
|
|
|
rb_extend_object(v, m);
|
|
|
|
}
|
|
|
|
}
|
2003-07-29 22:26:55 +04:00
|
|
|
if (!rb_respond_to(v, s_mload)) {
|
|
|
|
rb_raise(rb_eTypeError, "instance of %s needs to have method `marshal_load'",
|
|
|
|
rb_class2name(klass));
|
|
|
|
}
|
2003-10-02 12:25:00 +04:00
|
|
|
r_entry(v, arg);
|
|
|
|
data = r_object(arg);
|
|
|
|
rb_funcall(v, s_mload, 1, data);
|
2003-07-29 22:26:55 +04:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
1998-01-16 15:19:09 +03:00
|
|
|
case TYPE_OBJECT:
|
|
|
|
{
|
2002-09-05 13:42:56 +04:00
|
|
|
VALUE klass = path2class(r_unique(arg));
|
1998-01-16 15:19:09 +03:00
|
|
|
|
1999-01-20 07:59:39 +03:00
|
|
|
v = rb_obj_alloc(klass);
|
2001-10-03 11:19:19 +04:00
|
|
|
if (TYPE(v) != T_OBJECT) {
|
|
|
|
rb_raise(rb_eArgError, "dump format error");
|
|
|
|
}
|
2003-10-02 12:25:00 +04:00
|
|
|
r_entry(v, arg);
|
2000-01-05 07:41:21 +03:00
|
|
|
r_ivar(v, arg);
|
1998-01-16 15:19:09 +03:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
2002-04-24 08:54:16 +04:00
|
|
|
case TYPE_DATA:
|
|
|
|
{
|
2002-09-05 13:42:56 +04:00
|
|
|
VALUE klass = path2class(r_unique(arg));
|
2002-08-29 13:08:18 +04:00
|
|
|
if (rb_respond_to(klass, s_alloc)) {
|
|
|
|
static int warn = Qtrue;
|
|
|
|
if (warn) {
|
|
|
|
rb_warn("define `allocate' instead of `_alloc'");
|
|
|
|
warn = Qfalse;
|
|
|
|
}
|
|
|
|
v = rb_funcall(klass, s_alloc, 0);
|
2002-04-24 08:54:16 +04:00
|
|
|
}
|
2002-08-29 13:08:18 +04:00
|
|
|
else {
|
|
|
|
v = rb_obj_alloc(klass);
|
|
|
|
}
|
2002-04-24 08:54:16 +04:00
|
|
|
if (TYPE(v) != T_DATA) {
|
|
|
|
rb_raise(rb_eArgError, "dump format error");
|
|
|
|
}
|
2003-10-02 12:25:00 +04:00
|
|
|
r_entry(v, arg);
|
2002-04-24 08:54:16 +04:00
|
|
|
if (!rb_respond_to(v, s_load_data)) {
|
|
|
|
rb_raise(rb_eTypeError,
|
|
|
|
"class %s needs to have instance method `_load_data'",
|
|
|
|
rb_class2name(klass));
|
|
|
|
}
|
2003-10-20 06:06:42 +04:00
|
|
|
rb_funcall(v, s_load_data, 1, r_object0(arg, 0, 0, extmod));
|
2002-04-24 08:54:16 +04:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
1999-12-01 12:24:48 +03:00
|
|
|
case TYPE_MODULE_OLD:
|
1998-01-16 15:19:09 +03:00
|
|
|
{
|
2003-04-18 22:05:11 +04:00
|
|
|
volatile VALUE str = r_bytes(arg);
|
2002-09-05 13:42:56 +04:00
|
|
|
|
2003-04-18 22:05:11 +04:00
|
|
|
v = rb_path2class(RSTRING(str)->ptr);
|
2003-10-02 12:25:00 +04:00
|
|
|
r_entry(v, arg);
|
1998-01-16 15:19:09 +03:00
|
|
|
}
|
2002-02-26 09:48:59 +03:00
|
|
|
break;
|
1998-01-16 15:19:09 +03:00
|
|
|
|
1999-12-01 12:24:48 +03:00
|
|
|
case TYPE_CLASS:
|
|
|
|
{
|
2003-04-18 22:05:11 +04:00
|
|
|
volatile VALUE str = r_bytes(arg);
|
2002-09-05 13:42:56 +04:00
|
|
|
|
|
|
|
v = path2class(RSTRING(str)->ptr);
|
2003-10-02 12:25:00 +04:00
|
|
|
r_entry(v, arg);
|
1999-12-01 12:24:48 +03:00
|
|
|
}
|
2002-02-26 09:48:59 +03:00
|
|
|
break;
|
1999-12-01 12:24:48 +03:00
|
|
|
|
|
|
|
case TYPE_MODULE:
|
|
|
|
{
|
2003-04-18 22:05:11 +04:00
|
|
|
volatile VALUE str = r_bytes(arg);
|
2002-09-05 13:42:56 +04:00
|
|
|
|
|
|
|
v = path2module(RSTRING(str)->ptr);
|
2003-10-02 12:25:00 +04:00
|
|
|
r_entry(v, arg);
|
1999-12-01 12:24:48 +03:00
|
|
|
}
|
2002-02-26 09:48:59 +03:00
|
|
|
break;
|
2000-04-10 09:48:43 +04:00
|
|
|
|
2000-03-07 11:37:59 +03:00
|
|
|
case TYPE_SYMBOL:
|
2002-02-26 09:48:59 +03:00
|
|
|
v = ID2SYM(r_symreal(arg));
|
2002-02-27 07:52:21 +03:00
|
|
|
break;
|
2000-04-10 09:48:43 +04:00
|
|
|
|
|
|
|
case TYPE_SYMLINK:
|
2002-02-27 07:52:21 +03:00
|
|
|
return ID2SYM(r_symlink(arg));
|
1999-12-01 12:24:48 +03:00
|
|
|
|
1998-01-16 15:19:09 +03:00
|
|
|
default:
|
1999-01-20 07:59:39 +03:00
|
|
|
rb_raise(rb_eArgError, "dump format error(0x%x)", type);
|
1998-01-16 15:19:09 +03:00
|
|
|
break;
|
|
|
|
}
|
2002-08-28 19:58:35 +04:00
|
|
|
if (proc) {
|
2003-05-30 20:08:03 +04:00
|
|
|
rb_funcall(proc, rb_intern("call"), 1, v);
|
2002-02-26 09:48:59 +03:00
|
|
|
}
|
|
|
|
return v;
|
1998-01-16 15:19:09 +03:00
|
|
|
}
|
|
|
|
|
2002-08-28 19:58:35 +04:00
|
|
|
static VALUE
|
|
|
|
r_object(arg)
|
|
|
|
struct load_arg *arg;
|
|
|
|
{
|
2003-10-15 06:27:56 +04:00
|
|
|
return r_object0(arg, arg->proc, 0, Qnil);
|
2002-08-28 19:58:35 +04:00
|
|
|
}
|
|
|
|
|
1998-01-16 15:19:09 +03:00
|
|
|
static VALUE
|
|
|
|
load(arg)
|
|
|
|
struct load_arg *arg;
|
|
|
|
{
|
|
|
|
return r_object(arg);
|
|
|
|
}
|
|
|
|
|
|
|
|
static VALUE
|
|
|
|
load_ensure(arg)
|
|
|
|
struct load_arg *arg;
|
|
|
|
{
|
2003-08-07 01:50:06 +04:00
|
|
|
st_free_table(arg->symbols);
|
1999-01-20 07:59:39 +03:00
|
|
|
return 0;
|
1998-01-16 15:19:09 +03:00
|
|
|
}
|
|
|
|
|
2003-12-27 19:07:43 +03:00
|
|
|
/*
|
|
|
|
* call-seq:
|
|
|
|
* load( source [, proc] ) => obj
|
|
|
|
* restore( source [, proc] ) => obj
|
|
|
|
*
|
|
|
|
* Returns the result of converting the serialized data in source into a
|
|
|
|
* Ruby object (possibly with associated subordinate objects). source
|
|
|
|
* may be either an instance of IO or an object that responds to
|
|
|
|
* to_str. If proc is specified, it will be passed each object as it
|
|
|
|
* is deserialized.
|
|
|
|
*/
|
1998-01-16 15:19:09 +03:00
|
|
|
static VALUE
|
|
|
|
marshal_load(argc, argv)
|
|
|
|
int argc;
|
|
|
|
VALUE *argv;
|
|
|
|
{
|
|
|
|
VALUE port, proc;
|
2000-11-20 10:31:55 +03:00
|
|
|
int major, minor;
|
1998-01-16 15:19:09 +03:00
|
|
|
VALUE v;
|
|
|
|
struct load_arg arg;
|
|
|
|
|
|
|
|
rb_scan_args(argc, argv, "11", &port, &proc);
|
2003-03-03 10:20:17 +03:00
|
|
|
if (rb_respond_to(port, rb_intern("to_str"))) {
|
2001-05-02 08:22:21 +04:00
|
|
|
arg.taint = OBJ_TAINTED(port); /* original taintedness */
|
|
|
|
StringValue(port); /* possible conversion */
|
|
|
|
arg.ptr = RSTRING(port)->ptr;
|
|
|
|
arg.end = arg.ptr + RSTRING(port)->len;
|
1998-01-16 15:19:09 +03:00
|
|
|
}
|
2002-10-17 14:20:52 +04:00
|
|
|
else if (rb_respond_to(port, s_getc) && rb_respond_to(port, s_read)) {
|
2003-03-03 10:20:17 +03:00
|
|
|
if (rb_respond_to(port, s_binmode)) {
|
|
|
|
rb_funcall2(port, s_binmode, 0, 0);
|
|
|
|
}
|
2003-07-29 22:26:55 +04:00
|
|
|
arg.taint = Qtrue;
|
2002-10-17 14:20:52 +04:00
|
|
|
arg.ptr = (char *)port;
|
|
|
|
arg.end = 0;
|
|
|
|
}
|
1998-01-16 15:19:09 +03:00
|
|
|
else {
|
1999-01-20 07:59:39 +03:00
|
|
|
rb_raise(rb_eTypeError, "instance of IO needed");
|
1998-01-16 15:19:09 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
major = r_byte(&arg);
|
2000-11-20 10:31:55 +03:00
|
|
|
minor = r_byte(&arg);
|
2000-11-21 17:31:11 +03:00
|
|
|
if (major != MARSHAL_MAJOR || minor > MARSHAL_MINOR) {
|
2000-11-20 10:31:55 +03:00
|
|
|
rb_raise(rb_eTypeError, "incompatible marshal file format (can't be read)\n\
|
|
|
|
\tformat version %d.%d required; %d.%d given",
|
|
|
|
MARSHAL_MAJOR, MARSHAL_MINOR, major, minor);
|
1998-01-16 15:19:09 +03:00
|
|
|
}
|
2001-07-31 10:24:45 +04:00
|
|
|
if (RTEST(ruby_verbose) && minor != MARSHAL_MINOR) {
|
2000-11-20 10:31:55 +03:00
|
|
|
rb_warn("incompatible marshal file format (can be read)\n\
|
|
|
|
\tformat version %d.%d required; %d.%d given",
|
|
|
|
MARSHAL_MAJOR, MARSHAL_MINOR, major, minor);
|
1998-01-16 15:19:09 +03:00
|
|
|
}
|
|
|
|
|
2003-08-07 01:50:06 +04:00
|
|
|
arg.symbols = st_init_numtable();
|
2003-06-06 13:24:59 +04:00
|
|
|
arg.data = rb_hash_new();
|
2000-11-20 10:31:55 +03:00
|
|
|
if (NIL_P(proc)) arg.proc = 0;
|
|
|
|
else arg.proc = proc;
|
|
|
|
v = rb_ensure(load, (VALUE)&arg, load_ensure, (VALUE)&arg);
|
|
|
|
|
1998-01-16 15:19:09 +03:00
|
|
|
return v;
|
|
|
|
}
|
|
|
|
|
2003-12-27 19:07:43 +03:00
|
|
|
/*
|
|
|
|
* The marshaling library converts collections of Ruby objects into a
|
|
|
|
* byte stream, allowing them to be stored outside the currently
|
|
|
|
* active script. This data may subsequently be read and the original
|
|
|
|
* objects reconstituted.
|
|
|
|
* Marshaled data has major and minor version numbers stored along
|
|
|
|
* with the object information. In normal use, marshaling can only
|
|
|
|
* load data written with the same major version number and an equal
|
|
|
|
* or lower minor version number. If Ruby's ``verbose'' flag is set
|
|
|
|
* (normally using -d, -v, -w, or --verbose) the major and minor
|
|
|
|
* numbers must match exactly. Marshal versioning is independent of
|
|
|
|
* Ruby's version numbers. You can extract the version by reading the
|
|
|
|
* first two bytes of marshaled data.
|
|
|
|
*
|
|
|
|
* str = Marshal.dump("thing")
|
|
|
|
* RUBY_VERSION #=> "1.8.0"
|
|
|
|
* str[0] #=> 4
|
|
|
|
* str[1] #=> 8
|
|
|
|
*
|
|
|
|
* Some objects cannot be dumped: if the objects to be dumped include
|
|
|
|
* bindings, procedure or method objects, instances of class IO, or
|
|
|
|
* singleton objects, a TypeError will be raised.
|
|
|
|
* If your class has special serialization needs (for example, if you
|
|
|
|
* want to serialize in some specific format), or if it contains
|
|
|
|
* objects that would otherwise not be serializable, you can implement
|
|
|
|
* your own serialization strategy by defining two methods, _dump and
|
|
|
|
* _load:
|
|
|
|
* The instance method _dump should return a String object containing
|
|
|
|
* all the information necessary to reconstitute objects of this class
|
|
|
|
* and all referenced objects up to a maximum depth given as an integer
|
|
|
|
* parameter (a value of -1 implies that you should disable depth checking).
|
|
|
|
* The class method _load should take a String and return an object of this class.
|
|
|
|
*/
|
1999-01-20 07:59:39 +03:00
|
|
|
void
|
1998-01-16 15:19:09 +03:00
|
|
|
Init_marshal()
|
|
|
|
{
|
1999-01-20 07:59:39 +03:00
|
|
|
VALUE rb_mMarshal = rb_define_module("Marshal");
|
1998-01-16 15:19:09 +03:00
|
|
|
|
1999-01-20 07:59:39 +03:00
|
|
|
s_dump = rb_intern("_dump");
|
|
|
|
s_load = rb_intern("_load");
|
2003-07-29 22:26:55 +04:00
|
|
|
s_mdump = rb_intern("marshal_dump");
|
|
|
|
s_mload = rb_intern("marshal_load");
|
2002-04-24 08:54:16 +04:00
|
|
|
s_dump_data = rb_intern("_dump_data");
|
|
|
|
s_load_data = rb_intern("_load_data");
|
|
|
|
s_alloc = rb_intern("_alloc");
|
2002-10-17 14:20:52 +04:00
|
|
|
s_getc = rb_intern("getc");
|
|
|
|
s_read = rb_intern("read");
|
|
|
|
s_write = rb_intern("write");
|
2003-03-03 10:20:17 +03:00
|
|
|
s_binmode = rb_intern("binmode");
|
2002-10-17 14:20:52 +04:00
|
|
|
|
1999-01-20 07:59:39 +03:00
|
|
|
rb_define_module_function(rb_mMarshal, "dump", marshal_dump, -1);
|
|
|
|
rb_define_module_function(rb_mMarshal, "load", marshal_load, -1);
|
2000-06-23 11:05:59 +04:00
|
|
|
rb_define_module_function(rb_mMarshal, "restore", marshal_load, -1);
|
2001-07-31 10:24:45 +04:00
|
|
|
|
2001-07-31 12:33:17 +04:00
|
|
|
rb_define_const(rb_mMarshal, "MAJOR_VERSION", INT2FIX(MARSHAL_MAJOR));
|
|
|
|
rb_define_const(rb_mMarshal, "MINOR_VERSION", INT2FIX(MARSHAL_MINOR));
|
1998-01-16 15:19:09 +03:00
|
|
|
}
|
2001-07-03 11:29:00 +04:00
|
|
|
|
|
|
|
VALUE
|
|
|
|
rb_marshal_dump(obj, port)
|
|
|
|
VALUE obj, port;
|
|
|
|
{
|
|
|
|
int argc = 1;
|
|
|
|
VALUE argv[2];
|
|
|
|
|
|
|
|
argv[0] = obj;
|
|
|
|
argv[1] = port;
|
|
|
|
if (!NIL_P(port)) argc = 2;
|
|
|
|
return marshal_dump(argc, argv);
|
|
|
|
}
|
|
|
|
|
|
|
|
VALUE
|
|
|
|
rb_marshal_load(port)
|
|
|
|
VALUE port;
|
|
|
|
{
|
|
|
|
return marshal_load(1, &port);
|
|
|
|
}
|