* transcode.c (econv_args): take snamev_p and dnamev_p to prevent
possible GC problem. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@19309 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
c6ff62d202
commit
cf86176338
@ -1,6 +1,12 @@
|
|||||||
|
Sat Sep 13 01:11:14 2008 Tanaka Akira <akr@fsij.org>
|
||||||
|
|
||||||
|
* transcode.c (econv_args): take snamev_p and dnamev_p to prevent
|
||||||
|
possible GC problem.
|
||||||
|
|
||||||
Sat Sep 13 00:38:54 2008 Tanaka Akira <akr@fsij.org>
|
Sat Sep 13 00:38:54 2008 Tanaka Akira <akr@fsij.org>
|
||||||
|
|
||||||
* transcode.c (enc_arg): take arg as VALUE * to prevent GC problem.
|
* transcode.c (enc_arg): take arg as VALUE * to prevent possible GC
|
||||||
|
problem.
|
||||||
|
|
||||||
Fri Sep 12 23:19:41 2008 Tanaka Akira <akr@fsij.org>
|
Fri Sep 12 23:19:41 2008 Tanaka Akira <akr@fsij.org>
|
||||||
|
|
||||||
|
23
transcode.c
23
transcode.c
@ -2654,18 +2654,19 @@ econv_s_asciicompat_encoding(VALUE klass, VALUE arg)
|
|||||||
|
|
||||||
static void
|
static void
|
||||||
econv_args(int argc, VALUE *argv,
|
econv_args(int argc, VALUE *argv,
|
||||||
|
volatile VALUE *snamev_p, volatile VALUE *dnamev_p,
|
||||||
const char **sname_p, const char **dname_p,
|
const char **sname_p, const char **dname_p,
|
||||||
rb_encoding **senc_p, rb_encoding **denc_p,
|
rb_encoding **senc_p, rb_encoding **denc_p,
|
||||||
int *ecflags_p,
|
int *ecflags_p,
|
||||||
VALUE *ecopts_p)
|
VALUE *ecopts_p)
|
||||||
{
|
{
|
||||||
VALUE source_encoding, destination_encoding, opt, opthash, flags_v, ecopts;
|
VALUE opt, opthash, flags_v, ecopts;
|
||||||
int sidx, didx;
|
int sidx, didx;
|
||||||
const char *sname, *dname;
|
const char *sname, *dname;
|
||||||
rb_encoding *senc, *denc;
|
rb_encoding *senc, *denc;
|
||||||
int ecflags;
|
int ecflags;
|
||||||
|
|
||||||
rb_scan_args(argc, argv, "21", &source_encoding, &destination_encoding, &opt);
|
rb_scan_args(argc, argv, "21", snamev_p, dnamev_p, &opt);
|
||||||
|
|
||||||
if (NIL_P(opt)) {
|
if (NIL_P(opt)) {
|
||||||
ecflags = 0;
|
ecflags = 0;
|
||||||
@ -2681,25 +2682,25 @@ econv_args(int argc, VALUE *argv,
|
|||||||
}
|
}
|
||||||
|
|
||||||
senc = NULL;
|
senc = NULL;
|
||||||
sidx = rb_to_encoding_index(source_encoding);
|
sidx = rb_to_encoding_index(*snamev_p);
|
||||||
if (0 <= sidx) {
|
if (0 <= sidx) {
|
||||||
senc = rb_enc_from_index(sidx);
|
senc = rb_enc_from_index(sidx);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
StringValue(source_encoding);
|
StringValue(*snamev_p);
|
||||||
}
|
}
|
||||||
|
|
||||||
denc = NULL;
|
denc = NULL;
|
||||||
didx = rb_to_encoding_index(destination_encoding);
|
didx = rb_to_encoding_index(*dnamev_p);
|
||||||
if (0 <= didx) {
|
if (0 <= didx) {
|
||||||
denc = rb_enc_from_index(didx);
|
denc = rb_enc_from_index(didx);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
StringValue(destination_encoding);
|
StringValue(*dnamev_p);
|
||||||
}
|
}
|
||||||
|
|
||||||
sname = senc ? senc->name : StringValueCStr(source_encoding);
|
sname = senc ? senc->name : StringValueCStr(*snamev_p);
|
||||||
dname = denc ? denc->name : StringValueCStr(destination_encoding);
|
dname = denc ? denc->name : StringValueCStr(*dnamev_p);
|
||||||
|
|
||||||
*sname_p = sname;
|
*sname_p = sname;
|
||||||
*dname_p = dname;
|
*dname_p = dname;
|
||||||
@ -2786,13 +2787,14 @@ search_convpath_i(const char *sname, const char *dname, int depth, void *arg)
|
|||||||
static VALUE
|
static VALUE
|
||||||
econv_s_search_convpath(int argc, VALUE *argv, VALUE klass)
|
econv_s_search_convpath(int argc, VALUE *argv, VALUE klass)
|
||||||
{
|
{
|
||||||
|
volatile VALUE snamev, dnamev;
|
||||||
const char *sname, *dname;
|
const char *sname, *dname;
|
||||||
rb_encoding *senc, *denc;
|
rb_encoding *senc, *denc;
|
||||||
int ecflags;
|
int ecflags;
|
||||||
VALUE ecopts;
|
VALUE ecopts;
|
||||||
VALUE convpath;
|
VALUE convpath;
|
||||||
|
|
||||||
econv_args(argc, argv, &sname, &dname, &senc, &denc, &ecflags, &ecopts);
|
econv_args(argc, argv, &snamev, &dnamev, &sname, &dname, &senc, &denc, &ecflags, &ecopts);
|
||||||
|
|
||||||
convpath = Qnil;
|
convpath = Qnil;
|
||||||
transcode_search_path(sname, dname, search_convpath_i, &convpath);
|
transcode_search_path(sname, dname, search_convpath_i, &convpath);
|
||||||
@ -2850,6 +2852,7 @@ static VALUE
|
|||||||
econv_init(int argc, VALUE *argv, VALUE self)
|
econv_init(int argc, VALUE *argv, VALUE self)
|
||||||
{
|
{
|
||||||
VALUE ecopts;
|
VALUE ecopts;
|
||||||
|
volatile VALUE snamev, dnamev;
|
||||||
const char *sname, *dname;
|
const char *sname, *dname;
|
||||||
rb_encoding *senc, *denc;
|
rb_encoding *senc, *denc;
|
||||||
rb_econv_t *ec;
|
rb_econv_t *ec;
|
||||||
@ -2859,7 +2862,7 @@ econv_init(int argc, VALUE *argv, VALUE self)
|
|||||||
rb_raise(rb_eTypeError, "already initialized");
|
rb_raise(rb_eTypeError, "already initialized");
|
||||||
}
|
}
|
||||||
|
|
||||||
econv_args(argc, argv, &sname, &dname, &senc, &denc, &ecflags, &ecopts);
|
econv_args(argc, argv, &snamev, &dnamev, &sname, &dname, &senc, &denc, &ecflags, &ecopts);
|
||||||
ec = rb_econv_open_opts(sname, dname, ecflags, ecopts);
|
ec = rb_econv_open_opts(sname, dname, ecflags, ecopts);
|
||||||
if (!ec) {
|
if (!ec) {
|
||||||
rb_exc_raise(rb_econv_open_exc(sname, dname, ecflags));
|
rb_exc_raise(rb_econv_open_exc(sname, dname, ecflags));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user