Zlib.gzip uses kwargs instead of argc [Feature #13020]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@57126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
naruse 2016-12-20 16:02:21 +00:00
parent 1cc9c93ff9
commit ba568c0ea3
2 changed files with 24 additions and 5 deletions

View File

@ -4276,6 +4276,10 @@ zlib_gzip_end(struct gzfile *gz)
zstream_end(&gz->z);
}
#define OPTHASH_GIVEN_P(opts) \
(argc > 0 && !NIL_P((opts) = rb_check_hash_type(argv[argc-1])) && (--argc, 1))
static ID id_level, id_strategy;
/*
* call-seq:
* Zlib.gzip(src, level=nil, strategy=nil) -> String
@ -4305,9 +4309,22 @@ zlib_s_gzip(int argc, VALUE *argv, VALUE klass)
struct gzfile *gz = &gz0;
long len;
int err;
VALUE src, level, strategy;
VALUE src, opts, level=Qnil, strategy=Qnil;
rb_scan_args(argc, argv, "12", &src, &level, &strategy);
if (OPTHASH_GIVEN_P(opts)) {
ID keyword_ids[2];
VALUE kwargs[2];
keyword_ids[0] = id_level;
keyword_ids[1] = id_strategy;
rb_get_kwargs(opts, keyword_ids, 0, 2, kwargs);
if (kwargs[0] != Qundef) {
level = kwargs[0];
}
if (kwargs[1] != Qundef) {
strategy = kwargs[1];
}
}
rb_scan_args(argc, argv, "10", &src);
StringValue(src);
gzfile_init(gz, &deflate_funcs, zlib_gzip_end);
gz->level = ARG_LEVEL(level);
@ -4690,6 +4707,8 @@ Init_zlib(void)
/* OS code for unknown hosts */
rb_define_const(mZlib, "OS_UNKNOWN", INT2FIX(OS_UNKNOWN));
id_level = rb_intern("level");
id_strategy = rb_intern("strategy");
#endif /* GZIP_SUPPORT */
}

View File

@ -1134,19 +1134,19 @@ if defined? Zlib
expected = %w[1f8b08000000000000ff4bcbcf07002165738c03000000].pack("H*")
assert_equal expected, actual
actual = Zlib.gzip("foo".freeze, 0)
actual = Zlib.gzip("foo".freeze, level: 0)
actual[4, 4] = "\x00\x00\x00\x00" # replace mtime
actual[9] = "\xff" # replace OS
expected = %w[1f8b08000000000000ff010300fcff666f6f2165738c03000000].pack("H*")
assert_equal expected, actual
actual = Zlib.gzip("foo".freeze, 9)
actual = Zlib.gzip("foo".freeze, level: 9)
actual[4, 4] = "\x00\x00\x00\x00" # replace mtime
actual[9] = "\xff" # replace OS
expected = %w[1f8b08000000000002ff4bcbcf07002165738c03000000].pack("H*")
assert_equal expected, actual
actual = Zlib.gzip("foo".freeze, 9, Zlib::FILTERED)
actual = Zlib.gzip("foo".freeze, level: 9, strategy: Zlib::FILTERED)
actual[4, 4] = "\x00\x00\x00\x00" # replace mtime
actual[9] = "\xff" # replace OS
expected = %w[1f8b08000000000002ff4bcbcf07002165738c03000000].pack("H*")