This articles was published on 2015-01-02
What happened with mruby between August 2014 and December 2014?
The biggest highlights since the last update were definitely the release of mruby 1.1.0 and the implementation of the mruby debugger (mrbd). The debugger came surprisingly with a really amazing test coverage and also a proper documentation file.
25 commits were dedicated to refactor the current mruby source. Most famously probably the refactoring of mrb_sym2name_len
which went thru two phases. The original refactor approach replaced the linear search by a hash search. This improved the speed but had the disadvantage that the memory consumption increased. Matz pointed out that this function was originally implemented with this slower algorithm to keep the memory consumption low. Based on some profiling performed by dycoon it turned out that the time spend inside of mrb_sym2name_len
seemed really long:
Based on these results, matz refactored the code with a linear symbol table which lead to a search performance now of O(1).
The biggest improvement on the testing side was definitely the tests provided together with the mruby debugger. It is amazing to see that a new piece of code comes immediately with a proper test coverage. I hope this will set a standard of how to add amazing new functions and programs to the mruby core. A big thanks goes here to the mruby forum which seem to be the main contributor of the mruby debugger test cases as also to Mitsubishi Electric Micro-Computer Application Software Co.,Ltd which was mentioned in the commit and has also provided support for implementing the debugger and the test cases.
The standard library slowly reaches a state that not to many important features are missing for daily usage. Nevertheless 14 commits were dedicated to improve the following:
String
#prepend
, #insert
, #succ
, #succ!
, #next
, #next!
Float::{INFINITY,NAN}
Kernel
.Integer
, .Float
, .Hash
, .String
, .Array
Hash.[]
71 commits were dedicated to bug fixing. In general this is the major task these days as more and more people starting to use mruby more and more corner cases are identified where mruby doesn’t perform proper. In general it is a good thing that these bugs are found but as I said before in other blog entries, we still have the issue that regression tests are most of the time not provided, so it is likely that we will see some of these fixed bugs in the future again.
Here a list with all commits during these months.
Avoid block_given? in mrbgem:enum.rb to reduce method calls
avoid block_given? in enum.rb to reduce method calls
Refactor mrbc_context_new func
condition refactoring in load.c
refactor MACRO to avoid local variable name conflict; ref #2585
Refactor mrb_obj_is_kind_of_m() in kernel.c
Refactor obj_is_instance_of() in kernel.c
refactor valid instance variable name check
refactor mruby method(fix indent. remove temporary value, duplicate procedure)
refactor class.c methods (fix indent, remove unneed temp value. )
Refactor flo_mod func in numeric.c
refactor mrb_hash_shift, num_pow, flo_eq, flo_finite_p method
Refactor incremental_sweep_phase() in gc.c
code reduce by using mrb_get_args(“n”)
O(1) mrb_sym2name_len(); close #2591
remove unnecessary CHAR_BIT != 8 check
mruby-strip doesn’t need mrbgems
remove unnecessary mrb_float casting; ref #2531
implement attr_reader and attr_writer in C; use cfunc closure to speed-up
add multiple assignment decomposition test
avoid iseq allocation from static irep binary. it reduces 424KB allocation for mrbtest
remove test for succ on Unicode (non-ASCII) char; #2520
added Math.cos and Math.tan test case
add Float::{INFINITY,NAN} if available
Add String#succ, String#succ!, String#next, String#next!
Handle Array#[float, int] Close #2626
String#[]: float handling merged to #2677
String#[] should reject nil index
khash.h: keep key/value table accessible from original hashtable during resize; fix #2682
now retrieves number of arguments of blocks from OP_ENTER op code; close #2671
block_given? should return correct value when called in blocks; close #2678
block_given? should return false on top-level; ref #2678
Fix splat and multiple assignments
mrdb: fix that break command cannot handle Windows paths
avoid out-of-bounds access of irep->lv; ref #2671, fix #2675
eval() should preserve stack in env properly; fix #2671
Fix crash if #inspect does not return a string value
Fix crash if #inspect does not return a string value
mirb dies if #inspect returns a non-string value; fix #2666
block_given did not work with nested block invocation for some cases; fix #2665
fix ISBLANK() for Visual Studio < 2013 (ref #2658)
preserve ICLASS in ci->target_class; fix #2657; ensuring #1467 #1470 #1493 still works
Fix: Numeric#step infinite loop.
fix(String) String#[] accepts float; close #2650 #2651
wrong register number adjustment in multiple assignment; fix #2654
Fix String#slice! raise TypeError or return invalid value.
Fix mrb_iv_check function decleration
Fix misaligned access when reading irep; close #2630
context proc may be cfunc; fix #2609
fixed. cygwin-gcc(ver4.8.3) warning in conv_digit()
fixed. closures scope in eval(string)
Fix `mrb_get_args` arguments types found by mruby-clang-plugin.
`Module#const_defined?` to take second optional argument as CRuby; fix #2593
Fix MSVC C++ ABI build. Close #2588.
fixed wandering filename problem
Fix default gem loading in `generate_gem_table`.
fix strict aliasing rule violation
instance variable name validation based on
Fix error handlings for fputs().
Fix error handlings for fprintf().
Fix allocation-error-handlings for scope_new().
Fix error handlings for mrb_open_core().
Fix error handling for mrb_open_allocf().
Fix error handling for mrb_pool_realloc().
Fix error handling for mrb_generate_code().
Fix error hanldlings in read_irep_record().
need to add space for receiver to proc env; fix #2525
fix build when neither src nor mrblib directory exists.
Fix String#succ. “-a-”.succ should be “-b-”
Fix String#succ. “-”.succ should be “.”
Fix a bug that class variable can’t be referenced from class method
fix linkage of range_beg_len and mrb_range_beg_len
fix typo with MRB_INT16; fix #2495
revert 6c1dfc9; ref #2525 #2565
revert 6c1dfc9; ref #2525 #2565
Fix mismatches for MRB_API declarations.
Implement C API mrb_notimplement
add some MRB_API to function prototypes
remove unnecessary MRB_API from mrb_num_div(); close #2578
Add API `mrb_data_init` to initialize `MRB_TT_DATA` tagged instance.
add MRB_API modifiers to mruby API functions
mrb_str_new(mrb, “”, len) creates an unmodifiable string object; ref #2674
mrb_p() should print mrb_obj_as_string() if #inspect does not return a string value
mrb_parser_dump() did not work with block arguments
try to convert not only nil but every objects to fixnums; ref #2677
mruby-eval: proc from env may be NULL; close #2676
should not pop register when value from multiple assignment required
OP_APOST local variable display was wrong
free memory used by breakpoints
free return value of dirname()
remove unnecessary _WIN32 preprocessor check
align indent of local variable names in codedump()
should support recursive mlhs decomposition, e.g. (a,b),c = [1,2],3
don’t convert function pointer to object pointer
free memory used by breakpoints
free return value of dirname()
separate mrb_notimplement() and mrb_notimplement_m(); ref #2636
[ci skip] rephrasing about mailing list description; ref #2639
change BIN_PATH for new gc in Arduino IDE >= 1.5.7
Modify Arduino build config for IDE >= 1.5.7
%zu format is not supported by MSVC
update teeny of MRUBY_VERSION; ref #2629
avoid using rewind(3) to load mrb files
read whole mrb file at once to calculate correct padding offset; ref #2630
specify alignment specifier for GCC and MSC; ref #2630
Under cygwin host, ncurses.a is only available instead of termcap.a.
add cast to return from aget_index(); ref #2627
use mrb_get_args to parse Integer() option; ref #2625
Replace int with mrb_bool in parse_string func
Replace int with mrb_bool in local_var_p func
need addtional type check to avoid SEGV; ref #2609
remove header prototype of mrb_exc_print; close #2607
add similar range check for tm->usec as well
always check range before casting time_t to mrb_int
time_t may overflow mrb_int when word boxing is used
word_boxing.h used int to represent symbols; use mrb_sym instead
remove accidental check-in of mruby-thread gem
cast MRB_ENV_STACK_LEN to (mrb_int); ref #2600
Change mrblib’s source path to absolute path
Pacify MSVC warnings for numeric.c, proc.c, and symbol.c
use __init_array_start to determine readonly data section;
mrbconf.h option MRB_USE_ETEXT_EDATA to reduce memory.
mrb_sym2name_len() should initialize lenp even when proper symbol does not exist
target_class should not be TT_ICLASS in instance_eval(string); ref #1152
Remove duplicated mrb_print_backtrace() declaration
Wrap CONTRIBUTING.md to 80 columns
const_defined? to check superclasses; ref #2593
to_hash/to_a check in Hash[] should only be done when only one argument is given; ref #2594
copy documentation comment from CRuby
remove line number from raise message
update outdated links to the original program.
change mrb_sym type from uint16_t to uint32_t
constify pointer from RARRAY_PTR to detect potential write barrier bugs.
add benchmark/bm_app_lc_fizzbuzz.rb
Add inline to str_with_class().
remove execution bit from benchmark/fib39.rb
support native byteorder in mrb files; ref 3492be
get rid of shadowing variables (mrbgems)
rename a local variable current_node -> nodetype; ref #2583
get rid of shadowing variables
save and restore arena index to prevent arena overflow.
Use mrb_str_cat_lit() instead of mrb_str_cat_cstr() for string-literals.
move mrb_proc_new_cfunc_with_env() to the core
attr_reader and attr_writer should return nil
remove ci->nreg initialization from cipush()
delete obsolete macros (mrb_basic + mrb_object)
use RITE_LV_NULL_MARK for better readability
add sym_validate_len() to validate symbol length
more OP_MOVE swap detection in peephole optimization
allow no_optimize esp. for debugger
adjust node lineno of muiti line statements
adjust node lineno of muiti line statements
Rename functions for avoinding symbol confiliction.
Unify duplicated functions (noregexp() and regexp_check()).
add write barrier to env on pop call info poped. #2525
add symbol table overflow check
Add a missing space after “,”.
Use mrb_malloc() instead of mrb_realloc().
Remove discareded NULL checks.
remove unused MSVC strtoll fallback
printf: cast variables to the expected type
Use sizeof() instead of strlen().
use mrb_str_cat_lit() instead of mrb_str_cat_cstr().
changed to call check_cv_name_str in check_cv_name_sym and adjust indent
Unify include guard styles and header comments.
Remove a discarded comparison.
should use non NULL scope for raise_error(); ref #2547
Use specified macro(NULL) instead of magic-number.
Improve replacement math functions for Visual C++.
use mrb_false_value instead of mrb_bool_value
removed unused variable in range_beg_len
Remove some roundoff from mrb_flo_to_str
add write barrier when iv is copied
changed some string method’s mrb-aspec
mrb_str_bytesize is a carbon copy of mrb_str_size. remove it.
“-a-a-”.succ should be “-a-b-”
changed mrb_str_size and mrb_str_bytesize comments.
fixed evaluation context of eval(string) and instance_eval(string)
move StopIteration to core; close #2518
Rename GC_STATE_NONE GC_STATE_ROOT
don’t always generate gem functions
change linkage of mrb_str_size to internal
MSVC: add simple (v)snprintf implementation
turn string obsolete functions into macros
rename obsolete mrb_special_const_p to mrb_immediate_p
Time#to_i and Time#usec should care about mrb_int overflow on MRB_INT16; ref #2495