summaryrefslogtreecommitdiffhomepage
path: root/src
AgeCommit message (Collapse)Author
2016-02-26The original code crashed when mrb->backtrace.n grew to 16.Carlo Prelz
It looks like the logic to reallocate the backtrace was flawed, based on the wrong variable (loc_raw->i, which, as I have verified, decreases from 16 to 0 instead of increasing) I am not sure if this is the correct fix
2016-02-24Avoid Error when Compiling with -std=c99 flagMalizia R
2016-02-22cosmetic change for OP_EQYukihiro "Matz" Matsumoto
2016-02-17need to free context when reclaiming fiber object in GC; fix #3109Yukihiro "Matz" Matsumoto
2016-02-05[cppcheck] mrb_str_rindex() remove unnecessary len update by chars2bytes()Yukihiro "Matz" Matsumoto
2016-02-05[cppcheck] remove duplicated breakYukihiro "Matz" Matsumoto
2016-02-05Hash: check flags before accessing ifnone; ref #980Yukihiro "Matz" Matsumoto
2016-02-04cache UTF8 status for utf8_strlen(); ref #980Yukihiro "Matz" Matsumoto
2016-02-04cache mrb_regexp_p(); ref #980Yukihiro "Matz" Matsumoto
2016-01-22Fix SEGV by stack extension in mrb_get_args()Kouhei Sutou
mrb_get_args() keeps pointer of the current stack. But address of the current stack maybe changed by method call. 'i' format character calls #to_i when the argument isn't integer but has #to_i. Here is a code that may call #to_i in mrb_get_args(): case 'i': // ... default: *p = mrb_fixnum(mrb_Integer(mrb, ARGV[arg_i])); break; // ... Here is a code #to_i is called: class X def initialize(i) @i = i end def to_i @i end end [][X.new(0), 0] # X#to_i is called So, mrb_get_args() shouldn't keep pointer and use it. mrb_get_args() should always refer mrb->ci->stack to use valid address of the current stack.
2016-01-19Fix SEGV on re-raising NoMemoryErrorKouhei Sutou
Think about the following Ruby script: segv.rb: begin lambda do lambda do "x" * 1000 # NoMemoryError end.call end.call rescue raise end If memory can't allocate after `"x" * 1000`, mruby crashes. Because L_RAISE: block in mrb_vm_exec() calls mrb_env_unshare() via cipop() and mrb_env_unshare() uses allocated memory without NULL check: L_RAISE: block: L_RAISE: // ... while (ci[0].ridx == ci[-1].ridx) { cipop(mrb); // ... } cipop(): static void cipop(mrb_state *mrb) { struct mrb_context *c = mrb->c; if (c->ci->env) { mrb_env_unshare(mrb, c->ci->env); } c->ci--; } mrb_env_unshare(): MRB_API void mrb_env_unshare(mrb_state *mrb, struct REnv *e) { size_t len = (size_t)MRB_ENV_STACK_LEN(e); // p is NULL in this case mrb_value *p = (mrb_value *)mrb_malloc(mrb, sizeof(mrb_value)*len); MRB_ENV_UNSHARE_STACK(e); if (len > 0) { stack_copy(p, e->stack, len); // p is NULL but used. It causes SEGV. } e->stack = p; mrb_write_barrier(mrb, (struct RBasic *)e); } To solve the SEGV, this change always raises NoMemoryError even when realloc() is failed after the first NoMemoryError in mrb_realloc(). mrb_unv_unshare() doesn't need to check NULL with this change. But it causes infinite loop in the following while: L_RAISE: // ... while (ci[0].ridx == ci[-1].ridx) { cipop(mrb); // ... } Because cipop() never pops ci. This change includes cipop() change. The change pops ci even when mrb_unv_unshare() is failed by NoMemoryError. This case can be reproduced by the following program: #include <stdlib.h> #include <mruby.h> #include <mruby/compile.h> static void * allocf(mrb_state *mrb, void *ptr, size_t size, void *ud) { static mrb_bool always_fail = FALSE; if (size == 1001) { always_fail = TRUE; } if (always_fail) { return NULL; } if (size == 0) { free(ptr); return NULL; } else { return realloc(ptr, size); } } int main(int argc, char **argv) { mrb_state *mrb; mrbc_context *c; FILE *file; mrb = mrb_open_allocf(allocf, NULL); c = mrbc_context_new(mrb); file = fopen(argv[1], "r"); mrb_load_file_cxt(mrb, file, c); fclose(file); mrbc_context_free(mrb, c); mrb_close(mrb); return EXIT_SUCCESS; } Try the following command lines: % cc -I include -L build/host/lib -O0 -g3 -o no-memory no-memory.c -lmruby -lm % ./no-memory segv.rb
2016-01-14Fix all zero string caseSyohei YOSHIDA
2016-01-11Merge pull request #3080 from kou/fix-class-variable-in-moduleYukihiro "Matz" Matsumoto
Fix class variable reference in module
2016-01-11Fix class variable reference in moduleKouhei Sutou
Fix #3079
2016-01-07Fix segfault on mrb_exc_backtrace.Simon Génier
The code to iterate over backtrace locations was changed in #3065, but unfortunately output_backtrace was not correctly updated to forward the callback.
2016-01-07replace mrb_toplevel_run() by mrb_top_run()Yukihiro "Matz" Matsumoto
2016-01-07change mrb_run related API names; compatibility macros providedYukihiro "Matz" Matsumoto
2016-01-07move KHASH_DECLARE(ht..) to mruby/hash.h; close #3073Yukihiro "Matz" Matsumoto
2016-01-07printf precision parameter must be 'int' typeSyohei YOSHIDA
There is a problem when MRB_INT64 is enabled.
2016-01-06symname_p support `!~`ksss
2016-01-05bytes2chars() conversion to fail if target byte offset is not on the ↵Yukihiro "Matz" Matsumoto
character boundary; ref #3067 that means String#index matches first byte of a multi-byte character. this behavior is different from CRuby, but a compromise for mruby which does not have encoding stuffs.
2016-01-04stack_extend before eval_under()Yukihiro "Matz" Matsumoto
2016-01-02instance_eval should pass the receiver as a block parameter; close #3029Yukihiro "Matz" Matsumoto
2016-01-02mruby-fiber: fiber_switch() to use nesting VM when it's called from C API or ↵Yukihiro "Matz" Matsumoto
mrb_funcall(); close #3056
2015-12-31Merge pull request #3067 from ksss/use-memchrYukihiro "Matz" Matsumoto
Use memchr for performance
2015-12-31Use memchr for performanceksss
```ruby s = "b" str = ("a" * 100 + s) t = Time.now str.index(s) puts Time.now - t ``` before => 0.000788 after => 0.000508 --- ```ruby s = "b" str = ("a" * 100 * 1024 * 1024 + s) t = Time.now str.index(s) puts Time.now - t ``` before => 0.225474 after => 0.008658
2015-12-31GC must scan env from fibers even when it's not yet copied to heap; fix #3063Yukihiro "Matz" Matsumoto
2015-12-29Support backtrace after method callsKouhei Sutou
GitHub: fix #2902, #2917 The current implementation traverses stack to retrieve backtrace. But stack will be changed when some operations are occurred. It means that backtrace may be broken after some operations. This change (1) saves the minimum information to retrieve backtrace when exception is raised and (2) restores backtrace from the minimum information when backtrace is needed. It reduces overhead for creating backtrace Ruby objects. The space for the minimum information is reused by multiple exceptions. So memory allocation isn't occurred for each exception.
2015-12-29Fix indentKouhei Sutou
2015-12-22fix build on VS2012Yasuhiro Matsumoto
2015-12-16Add case statement of MRB_TT_SCLASS in mrb_obj_is_kind_of()Kei Sawada
2015-12-16mrb_str_len_to_inum(): fixed a bug with MRB_INT_MIN conversion; fix #3048Yukihiro "Matz" Matsumoto
2015-12-16mrb_str_len_to_inum(): fixed a bug with underscores in digits; fix #3049Yukihiro "Matz" Matsumoto
2015-12-14mrb_str_len_to_inum(): string may not be NUL terminated; ref #3043Yukihiro "Matz" Matsumoto
2015-12-14mrb_str_len_to_inum(): fixed a bug with separating _ in the digits; ref #3043Yukihiro "Matz" Matsumoto
2015-12-12mrb_str_len_to_inum: should not raise "string contains null byte" error on ↵Yukihiro "Matz" Matsumoto
"0x"; fix #3043
2015-12-12mrb_str_len_to_inum: converting may not be terminated by NUL; fix #3044Yukihiro "Matz" Matsumoto
2015-12-01preserve original string for error messageYukihiro "Matz" Matsumoto
2015-12-01mrb_str_len_to_inum(): inspect string in error messageYukihiro "Matz" Matsumoto
2015-12-01new API function mrb_string_value_len()Yukihiro "Matz" Matsumoto
2015-12-01mrb_str_to_inum(): should treat null byte in strings properly; fix #3040Yukihiro "Matz" Matsumoto
2015-12-01mrb_cstr_to_inum(): should ignore trailing white spaces even when badcheck setYukihiro "Matz" Matsumoto
2015-12-01mrb_str_to_inum(): should raise error when string contains null byteYukihiro "Matz" Matsumoto
2015-12-01mrb_str_to_inum(): no need to call mrb_string_value_cstr() here; ref 05411eeYukihiro "Matz" Matsumoto
2015-12-01mrb_string_value_cstr() should not raise error for frozen stringsYukihiro "Matz" Matsumoto
cf. http://qiita.com/tsahara@github/items/b2a442af95ac893e10a1 (Japanese).
2015-11-27include changed from by quotes ("") to by brackets (<>); close #3032Yukihiro "Matz" Matsumoto
2015-11-19integer range check was moved to mrb_flo_to_fixnum(); ref #3025Yukihiro "Matz" Matsumoto
2015-11-18Bugfix nagative-number lshift() bit overflowmurase_syuka
2015-11-18Bugfix lshift() bit overflow; close #3023murase_syuka
2015-11-17add RUBY_ENGINE_VERSIONcremno
RUBY_ENGINE_VERSION is equivalent to MRUBY_VERSION. It would be a standard way to get the interpreter version (without a case expression). It's also already defined by CRuby 2.3, JRuby 9000, Opal, and Rubinius.