diff options
| -rw-r--r-- | src/class.c | 1 | ||||
| -rw-r--r-- | src/encoding.c | 6 | ||||
| -rw-r--r-- | src/encoding.h | 1 | ||||
| -rw-r--r-- | src/error.c | 23 | ||||
| -rw-r--r-- | src/load.c | 4 | ||||
| -rw-r--r-- | src/numeric.c | 2 | ||||
| -rw-r--r-- | src/parse.y | 1 | ||||
| -rw-r--r-- | src/range.c | 2 | ||||
| -rw-r--r-- | src/re.c | 3 | ||||
| -rw-r--r-- | src/string.c | 1 | ||||
| -rw-r--r-- | src/struct.c | 2 | ||||
| -rw-r--r-- | src/vm.c | 6 | ||||
| -rw-r--r-- | test/Makefile | 3 | ||||
| -rw-r--r-- | test/assert.rb | 67 | ||||
| -rw-r--r-- | test/t/_assert.rb | 44 | ||||
| -rw-r--r-- | test/t/bs_block.rb | 391 | ||||
| -rw-r--r-- | test/t/bs_class.rb | 121 | ||||
| -rw-r--r-- | test/t/bs_exception.rb | 158 | ||||
| -rw-r--r-- | test/t/bs_literal.rb | 39 | ||||
| -rw-r--r-- | test/t/time.rb | 1 |
20 files changed, 784 insertions, 92 deletions
diff --git a/src/class.c b/src/class.c index 1109c1e2b..7cb25f5c4 100644 --- a/src/class.c +++ b/src/class.c @@ -34,7 +34,6 @@ typedef struct fc_result { struct fc_result *prev; } fcresult_t; -struct RClass* mrb_class_real(struct RClass* cl); int kiv_lookup(khash_t(iv) *table, mrb_sym key, mrb_value *value); extern struct kh_iv *mrb_class_tbl; diff --git a/src/encoding.c b/src/encoding.c index b04cff33b..8a3bd8ef2 100644 --- a/src/encoding.c +++ b/src/encoding.c @@ -84,12 +84,6 @@ enum { #define mrb_usascii_str_new2 mrb_usascii_str_new_cstr -static size_t -enc_memsize(mrb_state *mrb, const void *p) -{ - return 0; -} - static const struct mrb_data_type encoding_data_type = { "encoding", 0, }; diff --git a/src/encoding.h b/src/encoding.h index b923ab98f..c6c470644 100644 --- a/src/encoding.h +++ b/src/encoding.h @@ -92,7 +92,6 @@ int mrb_toupper(int c); typedef OnigEncodingType mrb_encoding; -mrb_encoding* mrb_enc_get(mrb_state *mrb, mrb_value obj); /* mrb_encoding * -> name */ #define mrb_enc_name(enc) (enc)->name int mrb_enc_get_index(mrb_state *mrb, mrb_value obj); diff --git a/src/error.c b/src/error.c index f57f0e5e6..8dd800885 100644 --- a/src/error.c +++ b/src/error.c @@ -404,29 +404,6 @@ mrb_sys_fail(mrb_state *mrb, const char *mesg) mrb_raise(mrb, mrb->eRuntimeError_class, "%s", mesg); } -static mrb_value -mrb_exc_c_exception(mrb_state *mrb, mrb_value exc) -{ - mrb_value *argv; - int argc; - - mrb_get_args(mrb, "*", &argv, &argc); - return mrb_make_exception(mrb, argc, argv); -} - -static mrb_value -mrb_exc_exception(mrb_state *mrb, mrb_value exc) -{ - mrb_value *argv; - int argc; - mrb_value exclass; - - mrb_get_args(mrb, "*", &argv, &argc); - if (argc == 0) return exc; - exclass = mrb_obj_value(mrb_class(mrb, exc)); - return mrb_funcall(mrb, exclass, "exception", argc, argv); -} - void mrb_init_exception(mrb_state *mrb) { diff --git a/src/load.c b/src/load.c index 23b647ab6..015dd83e0 100644 --- a/src/load.c +++ b/src/load.c @@ -251,7 +251,7 @@ int mrb_load_irep(mrb_state *mrb, FILE* fp) { int ret, i; - uint32_t len, rlen; + uint32_t len, rlen = 0; unsigned char hex8[8], hcrc[4]; unsigned char *dst, *rite_dst = NULL; rite_binary_header bin_header; @@ -498,7 +498,7 @@ int mrb_read_irep(mrb_state *mrb, const char *bin) { int ret = MRB_DUMP_OK, i, n, nirep, sirep; - uint32_t len; + uint32_t len = 0; unsigned char *src; rite_binary_header bin_header; diff --git a/src/numeric.c b/src/numeric.c index ab6a014cc..c005e519e 100644 --- a/src/numeric.c +++ b/src/numeric.c @@ -37,8 +37,6 @@ #define fmod(x,y) fmodf(x,y) #endif -void mrb_cmperr(mrb_state *mrb, mrb_value x, mrb_value y); - void mrb_num_zerodiv(mrb_state *mrb) { diff --git a/src/parse.y b/src/parse.y index 4c339f0f4..45a024b0b 100644 --- a/src/parse.y +++ b/src/parse.y @@ -4726,7 +4726,6 @@ mrb_parse_string(mrb_state *mrb, const char *s) #define PARSER_DUMP void parser_dump(mrb_state *mrb, node *tree, int offset); -int mrb_generate_code(mrb_state*, mrb_ast_node*); int mrb_compile_file(mrb_state * mrb, FILE *f) diff --git a/src/range.c b/src/range.c index c38fc0f5f..14024f29b 100644 --- a/src/range.c +++ b/src/range.c @@ -32,8 +32,6 @@ mrb_value mrb_exec_recursive_paired(mrb_state *mrb, mrb_value (*func) (mrb_state *, mrb_value, mrb_value, int), mrb_value obj, mrb_value paired_obj, void* arg); -int printf (const char*, ...); - mrb_value mrb_range_new(mrb_state *mrb, mrb_value beg, mrb_value end, int excl) { @@ -54,14 +54,11 @@ unsigned long ruby_scan_oct(const char *, size_t, size_t *); unsigned long ruby_scan_hex(const char *, size_t, size_t *); static mrb_value mrb_match_to_a(mrb_state *mrb, mrb_value match); -int re_adjust_startpos(struct re_pattern_buffer *bufp, const char *string, int size, int startpos, int range); static mrb_value mrb_reg_preprocess(mrb_state *mrb, const char *p, const char *end, mrb_encoding *enc, mrb_encoding **fixed_enc, onig_errmsg_buffer err); static void mrb_reg_expr_str(mrb_state *mrb, mrb_value str, const char *s, long len, mrb_encoding *enc, mrb_encoding *resenc); static char * option_to_str(char str[4], int options); -mrb_value match_alloc(mrb_state *mrb); -void mrb_warn(const char *fmt, ...); static mrb_value reg_cache; //static int may_need_recompile; diff --git a/src/string.c b/src/string.c index dc7fdfae8..8a5dd7072 100644 --- a/src/string.c +++ b/src/string.c @@ -47,7 +47,6 @@ static mrb_value str_replace(mrb_state *mrb, mrb_value str, mrb_value str2); #ifdef INCLUDE_ENCODING static long str_strlen(mrb_state *mrb, mrb_value str, mrb_encoding *enc); #endif //INCLUDE_ENCODING -int mrb_block_given_p(); #ifdef INCLUDE_ENCODING #define is_ascii_string(mrb, str) (mrb_enc_str_coderange(mrb, str) == ENC_CODERANGE_7BIT) #define is_broken_string(mrb, str) (mrb_enc_str_coderange(mrb, str) == ENC_CODERANGE_BROKEN) diff --git a/src/struct.c b/src/struct.c index 767f8fbd4..ff66b19a2 100644 --- a/src/struct.c +++ b/src/struct.c @@ -31,8 +31,6 @@ mrb_value mrb_exec_recursive_paired(mrb_state *mrb, mrb_value (*func) (mrb_state #define mrb_long2int(n) ((int)(n)) -static mrb_value struct_alloc(mrb_state *mrb, mrb_value); - static struct RClass * struct_class(mrb_state *mrb) { @@ -372,11 +372,11 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) mrb_code *pc = irep->iseq; mrb_value *pool = irep->pool; mrb_sym *syms = irep->syms; - mrb_value *regs; + mrb_value *regs = NULL; mrb_code i; int ai = mrb->arena_idx; jmp_buf c_jmp; - jmp_buf *prev_jmp; + jmp_buf *prev_jmp = NULL; #ifdef DIRECT_THREADED static void *optable[] = { @@ -878,7 +878,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) regs[a] = mrb_ary_new_elts(mrb, m1+m2, stack); } else { - mrb_value *pp; + mrb_value *pp = NULL; struct RArray *rest; int len = 0; diff --git a/test/Makefile b/test/Makefile index 26c898704..7f5c16980 100644 --- a/test/Makefile +++ b/test/Makefile @@ -12,6 +12,7 @@ INIT := init_$(TARGET).c DLIB := $(TARGET).ctmp RLIB := $(TARGET).rbtmp DEPLIB := $(TARGET).d driver.d +ASSLIB := $(BASEDIR)/assert.rb MRBS := $(BASEDIR)/t/*.rb OBJS := driver.o $(MLIB) @@ -95,7 +96,7 @@ $(MRBC) : ../src/opcode.h ../src/codegen.c ../src/parse.y $(MAKE) -C ../tools/mrbc $(MAKE_FLAGS) # merge mruby sources -$(RLIB) : $(MRBS) +$(RLIB) : $(ASSLIB) $(MRBS) cat $? > $@ # clean up diff --git a/test/assert.rb b/test/assert.rb new file mode 100644 index 000000000..b2ce616e0 --- /dev/null +++ b/test/assert.rb @@ -0,0 +1,67 @@ +$ok_test = 0 +$ko_test = 0 +$kill_test = 0 +$asserts = [] + +## +# Print the assertion in a readable way +def print_assertion_string(str, iso) + print(str) + if(iso != '') + print(' [') + print(iso) + print(']') + end +end + +## +# Verify a code block. +# +# str : A remark which will be printed in case +# this assertion fails +# iso : The ISO reference code of the feature +# which will be tested by this +# assertion +def assert(str = 'Assertion failed', iso = '') + begin + if(!yield) + $asserts.push([str, iso]) + $ko_test += 1 + print('F') + else + $ok_test += 1 + print('.') + end + rescue + $kill_test += 1 + print('X') + end +end + +## +# Report the test result and print all assertions +# which were reported broken. +def report() + print "\n" + $asserts.each do |str, iso| + print('Fail: '); + print_assertion_string(str, iso) + print("\n") + end + + $total_test = $ok_test.+($ko_test) + print('Total: ') + print($total_test) + print("\n") + + print(' OK: ') + print($ok_test) + print("\n") + print(' KO: ') + print($ko_test) + print("\n") + print(' Crash: ') + print($kill_test) + print("\n") +end + diff --git a/test/t/_assert.rb b/test/t/_assert.rb deleted file mode 100644 index 91751f769..000000000 --- a/test/t/_assert.rb +++ /dev/null @@ -1,44 +0,0 @@ -$ok_test = 0 -$ko_test = 0 -$asserts = [] - -## -# Verify a code block. -# -# str : A remark which will be printed in case -# this assertion fails -# iso : The ISO reference code of the feature -# which will be tested by this -# assertion -def assert(str = 'Assertion failed', iso = '') - if(!yield) - $asserts.push([str, iso]) - $ko_test += 1 - print "F" - else - $ok_test += 1 - print "." - end -end - -## -# Report the test result and print all assertions -# which were reported broken. -def report() - print "\n" - $asserts.each do |str, iso| - print("Test Failed: #{str} [#{iso}]\n"); - end - - $total_test = $ok_test + $ko_test - print 'Total tests:' - print $total_test - print "\n" - - print ' OK: ' - print $ok_test - print "\n" - print ' KO: ' - print $ko_test - print "\n" -end diff --git a/test/t/bs_block.rb b/test/t/bs_block.rb new file mode 100644 index 000000000..acbade449 --- /dev/null +++ b/test/t/bs_block.rb @@ -0,0 +1,391 @@ +## +# Bootstrap tests for blocks + +assert('BS Block 1') do + 1.times{ + begin + a = 1 + ensure + foo = nil + end + } == 1 +end + +assert('BS Block 2') do + [1,2,3].find{|x| x == 2} == 2 +end + +assert('BS Block 3') do + class E + include Enumerable + def each(&block) + [1, 2, 3].each(&block) + end + end + E.new.find {|x| x == 2 } == 2 +end + +assert('BS Block 3') do + sum = 0 + for x in [1, 2, 3] + sum += x + end + sum == 6 +end + +assert('BS Block 4') do + sum = 0 + for x in (1..5) + sum += x + end + sum == 15 +end + +assert('BS Block 5') do + sum = 0 + for x in [] + sum += x + end + sum == 0 +end + +assert('BS Block 6') do + ans = [] + 1.times{ + for n in 1..3 + a = n + ans << a + end + } == 1 +end + +assert('BS Block 7') do + ans = [] + for m in 1..3 + for n in 1..3 + a = [m, n] + ans << a + end + end == 1..3 +end + +assert('BS Block 8') do + (1..3).to_a == [1, 2, 3] +end + +assert('BS Block 9') do + (1..3).map{|e| + e * 4 + } == [4, 8, 12] +end + +assert('BS Block 10') do + def m + yield + end + def n + yield + end + + m{ + n{ + 100 + } + } == 100 +end + +assert('BS Block 11') do + def m + yield 1 + end + + m{|ib| + m{|jb| + i = 20 + } + } == 20 +end + +assert('BS Block 12') do + def m + yield 1 + end + + m{|ib| + m{|jb| + ib = 20 + kb = 2 + } + } == 2 +end + +assert('BS Block 13') do + def iter1 + iter2{ + yield + } + end + + def iter2 + yield + end + + iter1{ + jb = 2 + iter1{ + jb = 3 + } + jb + } == 3 +end + +assert('BS Block 14') do + def iter1 + iter2{ + yield + } + end + + def iter2 + yield + end + + iter1{ + jb = 2 + iter1{ + jb + } + jb + } == 2 +end + +assert('BS Block 15') do + def m + yield 1 + end + m{|ib| + ib*2 + } == 2 +end + +assert('BS Block 16') do + def m + yield 12345, 67890 + end + m{|ib,jb| + ib*2+jb + } == 92580 +end + +assert('BS Block 17') do + def iter + yield 10 + end + + a = nil + [iter{|a| + a + }, a] == [10, nil] +end + +assert('BS Block 18') do + def iter + yield 10 + end + + iter{|a| + iter{|a| + a + 1 + } + a + } == 21 +end + +assert('BS Block 19') do + def iter + yield 10, 20, 30, 40 + end + + a = b = c = d = nil + iter{|a, b, c, d| + [a, b, c, d] + } + [a, b, c, d] == [10, 20, 30, 40, nil, nil, nil, nil] +end + +assert('BS Block 20') do + def iter + yield 10, 20, 30, 40 + end + + a = b = nil + iter{|a, b, c, d| + [a, b, c, d] + } + [a, b] == [10, 20, 30, 40, nil, nil] +end + +assert('BS Block 21') do + def iter + yield 1, 2 + end + + iter{|a, *b| + [a, b] + } == [1, [2]] +end + +assert('BS Block 22') do + def iter + yield 1, 2 + end + + iter{|*a| + [a] + } == [[1, 2]] +end + +assert('BS Block 23') do + def iter + yield 1, 2 + end + + iter{|a, b, *c| + [a, b, c] + } == [1, 2, []] +end + +assert('BS Block 24') do + def m + yield + end + m{ + 1 + } == 1 +end + +assert('BS Block 25') do + def m + yield 123 + end + m{|ib| + m{|jb| + ib*jb + } + } == 15129 +end + +assert('BS Block 26') do + def m a + yield a + end + m(1){|ib| + m(2){|jb| + ib*jb + } + } == 2 +end + +assert('BS Block 27') do + sum = 0 + 3.times{|ib| + 2.times{|jb| + sum += ib + jb + }} + sum == 9 +end + +assert('BS Block 28') do + 3.times{|bl| + break 10 + } == 10 +end + +assert('BS Block 29') do + def iter + yield 1,2,3 + end + + iter{|i, j| + [i, j] + } == [1, 2] +end + +assert('BS Block 30') do + def iter + yield 1 + end + + iter{|i, j| + [i, j] + } == [1, nil] +end + +assert('BS Block [ruby-dev:31147]') do + def m + yield + end + m{|&b| b}.inspect == 'nil' +end + +assert('BS Block [ruby-dev:31160]') do + def m() + yield + end + m {|(v,(*))|}.inspect == 'nil' +end + +assert('BS Block 31') do + def m() + yield + end + m {|((*))|}.inspect == 'nil' +end + +assert('BS Block [ruby-dev:31440]') do + def m + yield [0] + end + m{|v, &b| v}.inspect == '[0]' +end + +assert('BS Block 32') do + r = false; 1.times{|&b| r = b}; r.class == NilClass +end + +assert('BS Block [ruby-core:14395]') do + class Controller + def respond_to(&block) + responder = Responder.new + block.call(responder) + responder.respond + end + def test_for_bug + respond_to{|format| + format.js{ + "in test" + render{|obj| + obj + } + } + } + end + def render(&block) + "in render" + end + end + + class Responder + def method_missing(symbol, &block) + "enter method_missing" + @response = Proc.new{ + 'in method missing' + block.call + } + "leave method_missing" + end + def respond + @response.call + end + end + t = Controller.new + t.test_for_bug +end + diff --git a/test/t/bs_class.rb b/test/t/bs_class.rb new file mode 100644 index 000000000..d8bb63c05 --- /dev/null +++ b/test/t/bs_class.rb @@ -0,0 +1,121 @@ +## +# Bootstrap tests for Class + +assert('BS Class 1') do + class C; end + C.class == Class +end + +assert('BS Class 2') do + class C; end + C.new.class == C +end + +assert('BS Class 3') do + class C; end + C.new.class.class == Class +end + +assert('BS Class 4') do + class A; end + class C < A; end + C.class == Class +end + +assert('BS Class 5') do + class A; end + class C < A; end + C.new.class == C +end + +assert('BS Class 6') do + class A; end + class C < A; end + C.new.class.class == Class +end + +assert('BS Class Module 1') do + module M; end + M.class == Module +end + +assert('BS Class Module 2') do + module M; end + class C; include M; end + C.new.class == C +end + +# nested class +assert('BS Class Nested 1') do + class A; end + class A::B; end + A::B == A::B +end + +assert('BS Class Nested 2') do + class A; end + class A::B; end + A::B.new.class == A::B +end + +assert('BS Class Nested 3') do + class A; end + class A::B; end + A::B.new.class.class == Class +end + +assert('BS Class Nested 4') do + class A; end + class A::B; end + class A::B::C; end + A::B::C == A::B::C +end + +assert('BS Class Nested 5') do + class A; end + class A::B; end + class A::B::C; end + A::B::C.class == Class +end + +assert('BS Class Nested 6') do + class A; end + class A::B; end + class A::B::C; end + A::B::C.new.class == A::B::C +end + +assert('BS Class Nested 7') do + class A; end + class A::B; end + class A::B2 < A::B; end + A::B2 == A::B2 +end + +assert('BS Class Nested 8') do + class A; end + class A::B; end + class A::B2 < A::B; end + A::B2.class == Class +end + +assert('BS Class Colon 1') do + class A; end; A::C = 1; A::C == 1 +end + +assert('BS Class Colon 2') do + class A; class ::C; end end; C == C +end + +assert('BS Class Colon 3') do + class A; class ::C; end end; C.class == Class +end + +assert('BS Class Dup 1') do + class C; end; C.dup.class == Class +end + +assert('BS Class Dup 2') do + module M; end; M.dup.class == Module +end + diff --git a/test/t/bs_exception.rb b/test/t/bs_exception.rb new file mode 100644 index 000000000..6ab2cee2a --- /dev/null +++ b/test/t/bs_exception.rb @@ -0,0 +1,158 @@ +## +# Bootstrap tests for Exceptions + +assert('BS Exception 1') do + begin + 1+1 + ensure + 2+2 + end == 2 +end + +assert('BS Exception 2') do + begin + 1+1 + begin + 2+2 + ensure + 3+3 + end + ensure + 4+4 + end == 4 +end + +assert('BS Exception 3') do + begin + 1+1 + begin + 2+2 + ensure + 3+3 + end + ensure + 4+4 + begin + 5+5 + ensure + 6+6 + end + end == 4 +end + +assert('BS Exception 4') do + a = nil + 1.times{|e| + begin + rescue => err + end + a = err.class + } + a == NilClass +end + +assert('BS Exception 5') do + $ans = [] + def m + $! + end + def m2 + 1.times{ + begin + return + ensure + $ans << m + end + } + end + m2 + $ans == [nil] +end + +assert('BS Exception 6') do + $i = 0 + def m + iter{ + begin + $i += 1 + begin + $i += 2 + break + ensure + + end + ensure + $i += 4 + end + $i = 0 + } + end + + def iter + yield + end + m + $i == 7 +end + +assert('BS Exception 7') do + $i = 0 + def m + begin + $i += 1 + begin + $i += 2 + return + ensure + $i += 3 + end + ensure + $i += 4 + end + p :end + end + m + $i == 10 +end + +assert('BS Exception 8') do + begin + 1 + rescue + 2 + else + 3 + end == 3 +end + +assert('BS Exception 9') do + begin + 1+1 + rescue + 2+2 + else + 3+3 + ensure + 4+4 + end == 6 +end + +assert('BS Exception 10') do + begin + 1+1 + begin + 2+2 + rescue + 3+3 + else + 4+4 + end + rescue + 5+5 + else + 6+6 + ensure + 7+7 + end == 12 +end + diff --git a/test/t/bs_literal.rb b/test/t/bs_literal.rb new file mode 100644 index 000000000..b1ae3a5d6 --- /dev/null +++ b/test/t/bs_literal.rb @@ -0,0 +1,39 @@ +## +# Bootstrap test for literals + +assert('BS Literal 1') do + true == true +end + +assert('BS Literal 2') do + TrueClass == true.class +end + +assert('BS Literal 3') do + false == false +end + +assert('BS Literal 4') do + FalseClass == false.class +end + +assert('BS Literal 5') do + 'nil' == nil.inspect +end + +assert('BS Literal 6') do + NilClass == nil.class +end + +assert('BS Literal 7') do + Symbol == :sym.class +end + +assert('BS Literal 8') do + 1234 == 1234 +end + +assert('BS Literal 9') do + Fixnum == 1234.class +end + diff --git a/test/t/time.rb b/test/t/time.rb index f33cdde0d..98b99f2c2 100644 --- a/test/t/time.rb +++ b/test/t/time.rb @@ -71,3 +71,4 @@ end assert('Time#new') do Time.new.class == Time end + |
