Commit 24b02955 authored by Yukihiro "Matz" Matsumoto's avatar Yukihiro "Matz" Matsumoto

git push origin masterMerge branch 'suzukaze-add-string.clear2'

parents d3fda42e 9709fe79
require 'tempfile'
assert('Compiling multiple files without new line in last line. #2361') do
a, b, out = Tempfile.new('a.rb'), Tempfile.new('b.rb'), Tempfile.new('out.mrb')
a.write('module A; end')
a.flush
b.write('module B; end')
b.flush
result = `bin/mrbc -c -o #{out.path} #{a.path} #{b.path} 2>&1`
assert_equal "bin/mrbc:#{a.path}:Syntax OK", result.chomp
assert_equal 0, $?.exitstatus
end
...@@ -3389,7 +3389,7 @@ nextc(parser_state *p) ...@@ -3389,7 +3389,7 @@ nextc(parser_state *p)
else { else {
if (p->cxt->partial_hook(p) < 0) if (p->cxt->partial_hook(p) < 0)
return -1; return -1;
return -2; return '\n';
} }
} }
...@@ -3777,7 +3777,6 @@ read_escape(parser_state *p) ...@@ -3777,7 +3777,6 @@ read_escape(parser_state *p)
eof: eof:
case -1: case -1:
case -2:
yyerror(p, "Invalid escape character syntax"); yyerror(p, "Invalid escape character syntax");
return '\0'; return '\0';
...@@ -4093,7 +4092,6 @@ parser_yylex(parser_state *p) ...@@ -4093,7 +4092,6 @@ parser_yylex(parser_state *p)
case '#': /* it's a comment */ case '#': /* it's a comment */
skip(p, '\n'); skip(p, '\n');
/* fall through */ /* fall through */
case -2: /* end of partial script. */
case '\n': case '\n':
maybe_heredoc: maybe_heredoc:
heredoc_treat_nextline(p); heredoc_treat_nextline(p);
...@@ -4128,7 +4126,6 @@ parser_yylex(parser_state *p) ...@@ -4128,7 +4126,6 @@ parser_yylex(parser_state *p)
goto retry; goto retry;
} }
case -1: /* EOF */ case -1: /* EOF */
case -2: /* end of partial script */
goto normal_newline; goto normal_newline;
default: default:
pushback(p, c); pushback(p, c);
...@@ -5450,7 +5447,7 @@ mrb_parser_set_filename(struct mrb_parser_state *p, const char *f) ...@@ -5450,7 +5447,7 @@ mrb_parser_set_filename(struct mrb_parser_state *p, const char *f)
sym = mrb_intern_cstr(p->mrb, f); sym = mrb_intern_cstr(p->mrb, f);
p->filename = mrb_sym2name_len(p->mrb, sym, NULL); p->filename = mrb_sym2name_len(p->mrb, sym, NULL);
p->lineno = (p->filename_table_length > 0)? 0 : 1; p->lineno = (p->filename_table_length > 0)? -1 : 1;
for (i = 0; i < p->filename_table_length; ++i) { for (i = 0; i < p->filename_table_length; ++i) {
if (p->filename_table[i] == sym) { if (p->filename_table[i] == sym) {
......
...@@ -2523,6 +2523,38 @@ mrb_str_bytes(mrb_state *mrb, mrb_value str) ...@@ -2523,6 +2523,38 @@ mrb_str_bytes(mrb_state *mrb, mrb_value str)
return a; return a;
} }
static inline void
str_discard(mrb_state *mrb, mrb_value str) {
struct RString *s = mrb_str_ptr(str);
if (!STR_SHARED_P(s) && !STR_EMBED_P(s) && ((s->flags & MRB_STR_NOFREE) == 0)) {
mrb_free(mrb, s->as.heap.ptr);
RSTRING(str)->as.heap.ptr = 0;
RSTRING(str)->as.heap.len = 0;
}
}
/*
* call-seq:
* string.clear -> string
*
* Makes string empty.
*
* a = "abcde"
* a.clear #=> ""
*/
static mrb_value
mrb_str_clear(mrb_state *mrb, mrb_value str)
{
struct RString *s = mrb_str_ptr(str);
str_discard(mrb, str);
STR_SET_EMBED_FLAG(s);
STR_SET_EMBED_LEN(s, 0);
RSTRING_PTR(str)[0] = '\0';
return str;
}
/* ---------------------------*/ /* ---------------------------*/
void void
mrb_init_string(mrb_state *mrb) mrb_init_string(mrb_state *mrb)
...@@ -2574,4 +2606,5 @@ mrb_init_string(mrb_state *mrb) ...@@ -2574,4 +2606,5 @@ mrb_init_string(mrb_state *mrb)
mrb_define_method(mrb, s, "upcase!", mrb_str_upcase_bang, MRB_ARGS_REQ(1)); /* 15.2.10.5.43 */ mrb_define_method(mrb, s, "upcase!", mrb_str_upcase_bang, MRB_ARGS_REQ(1)); /* 15.2.10.5.43 */
mrb_define_method(mrb, s, "inspect", mrb_str_inspect, MRB_ARGS_NONE()); /* 15.2.10.5.46(x) */ mrb_define_method(mrb, s, "inspect", mrb_str_inspect, MRB_ARGS_NONE()); /* 15.2.10.5.46(x) */
mrb_define_method(mrb, s, "bytes", mrb_str_bytes, MRB_ARGS_NONE()); mrb_define_method(mrb, s, "bytes", mrb_str_bytes, MRB_ARGS_NONE());
mrb_define_method(mrb, s, "clear", mrb_str_clear, MRB_ARGS_NONE());
} }
...@@ -209,6 +209,7 @@ module MRuby ...@@ -209,6 +209,7 @@ module MRuby
def run_bintest def run_bintest
targets = @gems.select { |v| File.directory? "#{v.dir}/bintest" }.map { |v| filename v.dir } targets = @gems.select { |v| File.directory? "#{v.dir}/bintest" }.map { |v| filename v.dir }
targets << filename(".") if File.directory? "./bintest"
sh "ruby test/bintest.rb #{targets.join ' '}" sh "ruby test/bintest.rb #{targets.join ' '}"
end end
......
...@@ -515,3 +515,24 @@ assert('String#each_byte') do ...@@ -515,3 +515,24 @@ assert('String#each_byte') do
assert_equal bytes1, bytes2 assert_equal bytes1, bytes2
end end
assert('String#clear') do
# embed string
s = "foo"
assert_equal("", s.clear)
assert_equal("", s)
# not embed string and not shared string
s = "foo" * 100
a = s
assert_equal("", s.clear)
assert_equal("", s)
assert_equal("", a)
# shared string
s = "foo" * 100
a = s[10, 90] # create shared string
assert_equal("", s.clear) # clear
assert_equal("", s) # s is cleared
assert_not_equal("", a) # a should not be affected
end
...@@ -270,7 +270,7 @@ main(int argc, char **argv) ...@@ -270,7 +270,7 @@ main(int argc, char **argv)
fprintf(stderr, "%s: no program file given\n", args.prog); fprintf(stderr, "%s: no program file given\n", args.prog);
return EXIT_FAILURE; return EXIT_FAILURE;
} }
if (args.outfile == NULL) { if (args.outfile == NULL && !args.check_syntax) {
if (n + 1 == argc) { if (n + 1 == argc) {
args.outfile = get_outfilename(mrb, argv[n], args.initname ? C_EXT : RITEBIN_EXT); args.outfile = get_outfilename(mrb, argv[n], args.initname ? C_EXT : RITEBIN_EXT);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment