diff --git a/include/mruby/string.h b/include/mruby/string.h index ac6740c5d..329f323b5 100644 --- a/include/mruby/string.h +++ b/include/mruby/string.h @@ -92,6 +92,8 @@ struct RStringEmbed { # define RSTR_COPY_SINGLE_BYTE_FLAG(dst, src) (void)0 #endif #define RSTR_SET_ASCII_FLAG(s) RSTR_SET_SINGLE_BYTE_FLAG(s) +#define RSTR_BINARY_P(s) ((s)->flags & MRB_STR_BINARY) +#define RSTR_SET_BINARY_FLAG(s) ((s)->flags |= MRB_STR_BINARY) /** * Returns a pointer from a Ruby string @@ -109,7 +111,8 @@ struct RStringEmbed { #define MRB_STR_FSHARED 2 #define MRB_STR_NOFREE 4 #define MRB_STR_EMBED 8 /* type flags up to here */ -#define MRB_STR_SINGLE_BYTE 16 +#define MRB_STR_BINARY 16 +#define MRB_STR_SINGLE_BYTE 32 #define MRB_STR_EMBED_LEN_SHIFT 6 #define MRB_STR_EMBED_LEN_BIT 5 #define MRB_STR_EMBED_LEN_MASK (((1 << MRB_STR_EMBED_LEN_BIT) - 1) << MRB_STR_EMBED_LEN_SHIFT) diff --git a/mrbgems/mruby-string-ext/src/string.c b/mrbgems/mruby-string-ext/src/string.c index 8ca266b8a..31de0109c 100644 --- a/mrbgems/mruby-string-ext/src/string.c +++ b/mrbgems/mruby-string-ext/src/string.c @@ -1325,6 +1325,13 @@ str_ascii_only_p(mrb_state *mrb, mrb_value str) return mrb_true_value(); } +static mrb_value +str_b(mrb_state *mrb, mrb_value str) +{ + RSTR_SET_BINARY_FLAG(mrb_str_ptr(str)); + return str; +} + void mrb_mruby_string_ext_gem_init(mrb_state* mrb) { @@ -1364,6 +1371,7 @@ mrb_mruby_string_ext_gem_init(mrb_state* mrb) mrb_define_method_id(mrb, s, MRB_OPSYM(minus), str_uminus, MRB_ARGS_REQ(1)); mrb_define_method_id(mrb, s, MRB_SYM_Q(valid_encoding), str_valid_enc_p, MRB_ARGS_NONE()); mrb_define_method_id(mrb, s, MRB_SYM_Q(ascii_only), str_ascii_only_p, MRB_ARGS_NONE()); + mrb_define_method_id(mrb, s, MRB_SYM(b), str_b, MRB_ARGS_NONE()); mrb_define_method_id(mrb, s, MRB_SYM(__lines), str_lines, MRB_ARGS_NONE()); mrb_define_method_id(mrb, s, MRB_SYM(__codepoints), str_codepoints, MRB_ARGS_NONE());