Skip to content

Commit

Permalink
add tag v1_8_7_299
Browse files Browse the repository at this point in the history
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/tags/v1_8_7_299@28412 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
  • Loading branch information
shyouhei committed Jun 23, 2010
1 parent 1ae1696 commit 54956f6
Show file tree
Hide file tree
Showing 5 changed files with 88 additions and 106 deletions.
10 changes: 10 additions & 0 deletions ChangeLog
Original file line number Original file line Diff line number Diff line change
@@ -1,3 +1,13 @@
Wed Jun 23 22:22:42 2010 Nobuyoshi Nakada <nobu@ruby-lang.org>

* test/optparse/test_summary.rb: fixed superclass so that it run
solely.

Wed Jun 23 21:54:17 2010 URABE Shyouhei <shyouhei@ruby-lang.org>

* marshal.c, test/ruby/test_marshal.rb: Revert r25230. This test
is troublesome.

Mon Jun 21 18:12:15 2010 NAKAMURA Usaku <usa@ruby-lang.org> Mon Jun 21 18:12:15 2010 NAKAMURA Usaku <usa@ruby-lang.org>


* ext/openssl/extconf.rb: check some functions added at OpenSSL 1.0.0. * ext/openssl/extconf.rb: check some functions added at OpenSSL 1.0.0.
Expand Down
142 changes: 72 additions & 70 deletions marshal.c
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -85,10 +85,12 @@ static ID s_dump_data, s_load_data, s_alloc, s_call;
static ID s_getc, s_read, s_write, s_binmode; static ID s_getc, s_read, s_write, s_binmode;


struct dump_arg { struct dump_arg {
VALUE obj;
VALUE str, dest; VALUE str, dest;
st_table *symbols; st_table *symbols;
st_table *data; st_table *data;
int taint; int taint;
VALUE wrapper;
}; };


struct dump_call_arg { struct dump_call_arg {
Expand All @@ -102,32 +104,22 @@ check_dump_arg(arg, sym)
struct dump_arg *arg; struct dump_arg *arg;
ID sym; ID sym;
{ {
if (!arg->symbols) { if (!DATA_PTR(arg->wrapper)) {
rb_raise(rb_eRuntimeError, "Marshal.dump reentered at %s", rb_raise(rb_eRuntimeError, "Marshal.dump reentered at %s",
rb_id2name(sym)); rb_id2name(sym));
} }
} }


static void clear_dump_arg _((struct dump_arg *arg));

static void static void
mark_dump_arg(ptr) mark_dump_arg(ptr)
void *ptr; void *ptr;
{ {
struct dump_arg *p = ptr; struct dump_arg *p = ptr;
if (!p->symbols) if (!ptr)
return; return;
rb_mark_set(p->data); rb_mark_set(p->data);
} }


static void
free_dump_arg(ptr)
void *ptr;
{
clear_dump_arg(ptr);
xfree(ptr);
}

static VALUE static VALUE
class2path(klass) class2path(klass)
VALUE klass; VALUE klass;
Expand Down Expand Up @@ -707,17 +699,32 @@ w_object(obj, arg, limit)
} }
} }


static void static VALUE
clear_dump_arg(arg) dump(arg)
struct dump_call_arg *arg;
{
w_object(arg->obj, arg->arg, arg->limit);
if (arg->arg->dest) {
rb_io_write(arg->arg->dest, arg->arg->str);
rb_str_resize(arg->arg->str, 0);
}
return 0;
}

static VALUE
dump_ensure(arg)
struct dump_arg *arg; struct dump_arg *arg;
{ {
if (!arg->symbols) return; if (!DATA_PTR(arg->wrapper)) return 0;
st_free_table(arg->symbols); st_free_table(arg->symbols);
arg->symbols = 0;
st_free_table(arg->data); st_free_table(arg->data);
DATA_PTR(arg->wrapper) = 0;
arg->wrapper = 0;
if (arg->taint) { if (arg->taint) {
OBJ_TAINT(arg->str); OBJ_TAINT(arg->str);
} }

return 0;
} }


/* /*
Expand Down Expand Up @@ -753,8 +760,8 @@ marshal_dump(argc, argv)
{ {
VALUE obj, port, a1, a2; VALUE obj, port, a1, a2;
int limit = -1; int limit = -1;
struct dump_arg *arg; struct dump_arg arg;
VALUE wrapper; struct dump_call_arg c_arg;


port = Qnil; port = Qnil;
rb_scan_args(argc, argv, "12", &obj, &a1, &a2); rb_scan_args(argc, argv, "12", &obj, &a1, &a2);
Expand All @@ -768,40 +775,37 @@ marshal_dump(argc, argv)
else if (NIL_P(a1)) goto type_error; else if (NIL_P(a1)) goto type_error;
else port = a1; else port = a1;
} }
wrapper = Data_Make_Struct(rb_cData, struct dump_arg, mark_dump_arg, free_dump_arg, arg); arg.dest = 0;
arg->dest = 0; arg.symbols = st_init_numtable();
arg->symbols = st_init_numtable(); arg.data = st_init_numtable();
arg->data = st_init_numtable(); arg.taint = Qfalse;
arg->taint = Qfalse; arg.str = rb_str_buf_new(0);
arg->str = rb_str_buf_new(0); RBASIC(arg.str)->klass = 0;
RBASIC(arg->str)->klass = 0; arg.wrapper = Data_Wrap_Struct(rb_cData, mark_dump_arg, 0, &arg);
if (!NIL_P(port)) { if (!NIL_P(port)) {
if (!rb_respond_to(port, s_write)) { if (!rb_respond_to(port, s_write)) {
type_error: type_error:
rb_raise(rb_eTypeError, "instance of IO needed"); rb_raise(rb_eTypeError, "instance of IO needed");
} }
arg->dest = port; arg.dest = port;
if (rb_respond_to(port, s_binmode)) { if (rb_respond_to(port, s_binmode)) {
rb_funcall2(port, s_binmode, 0, 0); rb_funcall2(port, s_binmode, 0, 0);
check_dump_arg(arg, s_binmode); check_dump_arg(&arg, s_binmode);
} }
} }
else { else {
port = arg->str; port = arg.str;
} }


w_byte(MARSHAL_MAJOR, arg); c_arg.obj = obj;
w_byte(MARSHAL_MINOR, arg); c_arg.arg = &arg;
c_arg.limit = limit;


w_object(obj, arg, limit); w_byte(MARSHAL_MAJOR, &arg);
if (arg->dest) { w_byte(MARSHAL_MINOR, &arg);
rb_io_write(arg->dest, arg->str);
rb_str_resize(arg->str, 0);
}


RBASIC(arg->str)->klass = rb_cString; rb_ensure(dump, (VALUE)&c_arg, dump_ensure, (VALUE)&arg);
clear_dump_arg(arg); RBASIC(arg.str)->klass = rb_cString;
RB_GC_GUARD(wrapper);


return port; return port;
} }
Expand All @@ -813,38 +817,30 @@ struct load_arg {
st_table *data; st_table *data;
VALUE proc; VALUE proc;
int taint; int taint;
VALUE wrapper;
}; };


static void static void
check_load_arg(arg, sym) check_load_arg(arg, sym)
struct load_arg *arg; struct load_arg *arg;
ID sym; ID sym;
{ {
if (!arg->symbols) { if (!DATA_PTR(arg->wrapper)) {
rb_raise(rb_eRuntimeError, "Marshal.load reentered at %s", rb_raise(rb_eRuntimeError, "Marshal.load reentered at %s",
rb_id2name(sym)); rb_id2name(sym));
} }
} }


static void clear_load_arg _((struct load_arg *arg));

static void static void
mark_load_arg(ptr) mark_load_arg(ptr)
void *ptr; void *ptr;
{ {
struct load_arg *p = ptr; struct load_arg *p = ptr;
if (!p->symbols) if (!ptr)
return; return;
rb_mark_tbl(p->data); rb_mark_tbl(p->data);
} }


static void
free_load_arg(void *ptr)
{
clear_load_arg(ptr);
xfree(ptr);
}

static VALUE r_object _((struct load_arg *arg)); static VALUE r_object _((struct load_arg *arg));


static int static int
Expand Down Expand Up @@ -1419,14 +1415,23 @@ r_object(arg)
return r_object0(arg, arg->proc, 0, Qnil); return r_object0(arg, arg->proc, 0, Qnil);
} }


static void static VALUE
clear_load_arg(arg) load(arg)
struct load_arg *arg; struct load_arg *arg;
{ {
if (!arg->symbols) return; return r_object(arg);
}

static VALUE
load_ensure(arg)
struct load_arg *arg;
{
if (!DATA_PTR(arg->wrapper)) return 0;
st_free_table(arg->symbols); st_free_table(arg->symbols);
arg->symbols = 0;
st_free_table(arg->data); st_free_table(arg->data);
DATA_PTR(arg->wrapper) = 0;
arg->wrapper = 0;
return 0;
} }


/* /*
Expand All @@ -1447,8 +1452,8 @@ marshal_load(argc, argv)
{ {
VALUE port, proc; VALUE port, proc;
int major, minor, taint = Qfalse; int major, minor, taint = Qfalse;
VALUE v, wrapper; VALUE v;
struct load_arg *arg; struct load_arg arg;


rb_scan_args(argc, argv, "11", &port, &proc); rb_scan_args(argc, argv, "11", &port, &proc);
v = rb_check_string_type(port); v = rb_check_string_type(port);
Expand All @@ -1465,18 +1470,17 @@ marshal_load(argc, argv)
else { else {
rb_raise(rb_eTypeError, "instance of IO needed"); rb_raise(rb_eTypeError, "instance of IO needed");
} }
wrapper = Data_Make_Struct(rb_cData, struct load_arg, mark_load_arg, free_load_arg, arg); arg.src = port;
arg->src = port; arg.offset = 0;
arg->offset = 0; arg.symbols = st_init_numtable();
arg->symbols = st_init_numtable(); arg.data = st_init_numtable();
arg->data = st_init_numtable(); arg.proc = 0;
arg->proc = 0; arg.wrapper = Data_Wrap_Struct(rb_cData, mark_load_arg, 0, &arg);
arg->taint = taint; arg.taint = taint;


major = r_byte(arg); major = r_byte(&arg);
minor = r_byte(arg); minor = r_byte(&arg);
if (major != MARSHAL_MAJOR || minor > MARSHAL_MINOR) { if (major != MARSHAL_MAJOR || minor > MARSHAL_MINOR) {
clear_load_arg(arg);
rb_raise(rb_eTypeError, "incompatible marshal file format (can't be read)\n\ rb_raise(rb_eTypeError, "incompatible marshal file format (can't be read)\n\
\tformat version %d.%d required; %d.%d given", \tformat version %d.%d required; %d.%d given",
MARSHAL_MAJOR, MARSHAL_MINOR, major, minor); MARSHAL_MAJOR, MARSHAL_MINOR, major, minor);
Expand All @@ -1487,10 +1491,8 @@ marshal_load(argc, argv)
MARSHAL_MAJOR, MARSHAL_MINOR, major, minor); MARSHAL_MAJOR, MARSHAL_MINOR, major, minor);
} }


if (!NIL_P(proc)) arg->proc = proc; if (!NIL_P(proc)) arg.proc = proc;
v = r_object(arg); v = rb_ensure(load, (VALUE)&arg, load_ensure, (VALUE)&arg);
clear_load_arg(arg);
RB_GC_GUARD(wrapper);


return v; return v;
} }
Expand Down
6 changes: 2 additions & 4 deletions test/optparse/test_summary.rb
Original file line number Original file line Diff line number Diff line change
@@ -1,8 +1,6 @@
require 'test/unit' require 'test_optparse'
require 'optparse'


class TestOptionParser < Test::Unit::TestCase; end class TestOptionParser::SummaryTest < TestOptionParser
class TestOptionParser::SummaryTest < Test::Unit::TestCase
def test_short_clash def test_short_clash
r = nil r = nil
o = OptionParser.new do |opts| o = OptionParser.new do |opts|
Expand Down
28 changes: 0 additions & 28 deletions test/ruby/test_marshal.rb
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -72,34 +72,6 @@ def test_too_long_string
assert_equal("marshal data too short", e.message) assert_equal("marshal data too short", e.message)
end end


class DumpTest
def marshal_dump
loop { Thread.pass }
end
end

class LoadTest
def marshal_dump
nil
end
def marshal_load(obj)
loop { Thread.pass }
end
end

def test_context_switch
o = DumpTest.new
Thread.new { Marshal.dump(o) }
GC.start
assert(true, '[ruby-dev:39425]')

o = LoadTest.new
m = Marshal.dump(o)
Thread.new { Marshal.load(m) }
GC.start
assert(true, '[ruby-dev:39425]')
end

def test_taint def test_taint
x = Object.new x = Object.new
x.taint x.taint
Expand Down
8 changes: 4 additions & 4 deletions version.h
Original file line number Original file line Diff line number Diff line change
@@ -1,15 +1,15 @@
#define RUBY_VERSION "1.8.7" #define RUBY_VERSION "1.8.7"
#define RUBY_RELEASE_DATE "2010-06-21" #define RUBY_RELEASE_DATE "2010-06-23"
#define RUBY_VERSION_CODE 187 #define RUBY_VERSION_CODE 187
#define RUBY_RELEASE_CODE 20100621 #define RUBY_RELEASE_CODE 20100623
#define RUBY_PATCHLEVEL 297 #define RUBY_PATCHLEVEL 299


#define RUBY_VERSION_MAJOR 1 #define RUBY_VERSION_MAJOR 1
#define RUBY_VERSION_MINOR 8 #define RUBY_VERSION_MINOR 8
#define RUBY_VERSION_TEENY 7 #define RUBY_VERSION_TEENY 7
#define RUBY_RELEASE_YEAR 2010 #define RUBY_RELEASE_YEAR 2010
#define RUBY_RELEASE_MONTH 6 #define RUBY_RELEASE_MONTH 6
#define RUBY_RELEASE_DAY 21 #define RUBY_RELEASE_DAY 23


#ifdef RUBY_EXTERN #ifdef RUBY_EXTERN
RUBY_EXTERN const char ruby_version[]; RUBY_EXTERN const char ruby_version[];
Expand Down

0 comments on commit 54956f6

Please sign in to comment.