This articles was published on 2013-04-04
What happened on the mruby front in March 2013?
The Integer and String class was partly refactored and some bug fixes were applied to the RegExp API.
The mruby-random GEM was created and added to the mruby core. It is based on a C Random Number Generator Library from Takuji Nishimura and Makoto Matsumoto.
mrbgems seems to have reached a definite breakthrough. The following core GEMs were created only in this month: mruby-print, mruby-sprintf, mruby-eval, mruby-enum-ext, mrb-array-ext, mruby-string-ext, mruby-numeric, mruby-struct and mruby-hash-ext. Some of these GEMs contain functionalities which were previously in the mruby core. As a GEM it is now possible to remove these features without patching the source.
Several literals like %W, %w, %s, %I and %i were added to mruby by FUKUZAWA Tadashi. He also implemented the missing here documents.
Masaki Muranaka was working very hard this month. With around 100 commits only this month he improved the API quite dramatically by abstracting internal C structures and functions.
Here a list with all commits during this month.
Integer.round have no arg. 
Move Integer.{floor,ceil,round,truncate} to mrblib/. For maintainability. 
Remove unused functions. 
undef Integer#new; ref #1111 
add Integer#chr test case: multibyte (raise RangeError) 
add “strip” family to String. 
Add String#dump method. 
bugfix escape charactor for Regexp class 
Add test for Random::srand 
Fix test for mruby-random 
Add test for mruby-random 
Activated mruby-random 
Refactoring mruby-rand 
Add Random#rand and Random#srand 
Add Kernel#rand and Kernel#srand 
Change Random module to class 
add mt19937ar license (BSD) to LEGAL 
Modified license information for mruby-random 
Add mruby-random mrbgem (no activation though) 
Remove unused mrb_sprintf 
mruby-sprintf should precede mruby-print 
Add mruby-print 
Remove __printstr__ 
add mruby-eval mrbgem (no activation though) 
add mruby-hash-ext mrbgem, and method: Hash#merge! 
Add double-quote 
add Enumerable#group_by 
add Enumerable#each_slice 
add method(uniq, -, |, &, flatten, compact) and test of Array to mruby-array-ext 
add Enumerable#each_cons 
add Enumerable#take, Enumerable#take_while 
add Enumerable#drop_while 
add Enumerable#drop 
add mruby-enum-ext 
update build_config.rb 
update build_config.rb 
add mrbgem: mrb-array-ext 
add mrbgems/ext/mruby-numeric, and method: Integer#chr 
add mrbgems/mruby-string-ext, and method: String#getbyte 
Separate Kernel#sprintf support from mruby core. It’s moved to mrbgems. 
Move src/sprintf to mrbgems/mruby-sprintf/src/ 
Move mrblib for Struct 
Gemify 
Pluggable Struct 
Pluggable Struct 
implement literal %W %w %s refactor string parsing 
%I %i literal 
refactor heredoc identifier 
allow backtick as a symbol 
Backtick operation 
refactor heredoc identifier 
implement literal %W %w %s refactor string parsing 
implement heredoc 
Add new API mrb_ptr_as_string(). 
Rename API mrb_str_cat2() to mrb_str_cat_cstr(). This is for naming orthogonality. mrb_str_cat2() is also left for backward compatibility. 
Add new API mrb_intern_cstr(). This is for naming orthogonality. mrb_intern is also left for backward compatibility. 
add new macro mrb_bool as a counterpart of mrb_bool_value 
rename mrb_true_or_false_value() to mrb_bool_value() 
Use mrb_true_or_false_value() / in sym_equal(). 
Use mrb_true_or_false_value() / in mrb_str_include(). 
Use mrb_true_or_false_value() / in mrb_str_eql(). 
Use mrb_true_or_false_value() / in mrb_str_empty_p(). 
Use mrb_true_or_false_value() / in mrb_str_equal_m(). 
Use mrb_true_or_false_value() / in range_eql(). 
Use mrb_true_or_false_value() / in mrb_range_include(). 
Use mrb_true_or_false_value() / in mrb_range_eq(). 
Use mrb_true_or_false_value() / in mrb_range_excl(). 
Use mrb_true_or_false_value() / in false_or(). 
Use mrb_true_or_false_value() / in false_xor(). 
Use mrb_true_or_false_value() / in true_xor(). 
Use mrb_true_or_false_value() / in true_and(). 
Use mrb_true_or_false_value() / in fix_equal(). 
Use mrb_true_or_false_value() / in flo_finite_p(). 
Use mrb_true_or_false_value() / in flo_eq(). 
Use mrb_true_or_false_value() / in num_eql(). 
Use mrb_true_or_false_value() / in obj_respond_to(). 
Use mrb_true_or_false_value() / in mrb_obj_is_kind_of_m(). 
Use mrb_true_or_false_value() / in mrb_obj_ivar_defined(). 
Use mrb_true_or_false_value() / in obj_is_instance_of(). 
Use mrb_true_or_false_value() / in mrb_f_block_given_p_m(). 
Use mrb_true_or_false_value() / in mrb_equal_m(). 
Use mrb_true_or_false_value() / in mrb_obj_not_equal_m(). 
Use mrb_true_or_false_value() / in mrb_obj_equal_m(). 
Use mrb_true_or_false_value() / in hash_equal(). 
Use mrb_true_or_false_value() / in mrb_hash_has_keyWithKey(). 
Use mrb_true_or_false_value() / in mrb_hash_empty_p(). 
Use mrb_true_or_false_value() / in gc_generational_mode_set(). 
Use mrb_true_or_false_value() / in change_gen_gc_mode(). 
Use mrb_true_or_false_value() / in gc_disable(). 
Use mrb_true_or_false_value() / in gc_enable(). 
Use mrb_true_or_false_value() / in exc_equal(). 
Use mrb_true_or_false_value() / in mrb_mod_eqq(). 
Use mrb_true_or_false_value() / in mrb_mod_const_defined(). 
Use mrb_true_or_false_value() / in mrb_mod_method_defined(). 
Use mrb_true_or_false_value() / in mrb_mod_cvar_defined(). 
Use mrb_true_or_false_value() / in mrb_bob_not(). 
Use mrb_true_or_false_value() / in mrb_ary_eql(). 
Use mrb_true_or_false_value() / in mrb_ary_equal(). 
Use mrb_true_or_false_value() / in mrb_ary_empty_p(). 
Use mrb_true_or_false_value() / in mrb_struct_eql(). 
Use mrb_true_or_false_value() / in mrb_struct_equal(). 
Remove the macro mrb_bool_value(). Use mrb_true_or_false() instead. 
Add new API mrb_true_or_false_value(). 
Add a new function mrb_flo_to_str(). Use it instead of sprintf() as possible. 
rename mrb_basic to mrb_basic_ptr; close #1011 
obsolete mrb_object; opposite of bc870ce 
mrb_str_new2 -> mrb_str_new_cstr 
Modify API configuration.   C API mrb_p() is always callable.   – But it will do nothing when ENABLE_STDIO is not defined. 
Change the second argument of mrb_flo_to_str().  Export mrb_flo_to_str() as API. 
Remove mrb_flt2big() as there is no bignum in the core.  Add new API mrb_flo_to_fixnum(). You can replace mrb_flt2big() to mrb_flo_to_fixnum() with few modifications. 
Remove API mrb_string_value(). There have mrb_str_to_str() in the core. And mrb_string_value() is no merit to keep using. 
Remove str_to_mrb_int(). There is some reasons.  It is not used in the core.  It does not have mrb_ prefix.  strtol() is slightly heavy and we have similar API. 
use new mrb_format API from mrb_raisef; its only format specifier is “%S” (stringify) and takes mrb_value; close #1062 
Reduce using snprintf(). They can replace by mruby API. 
use size_t for string length C API 
Fix the calc_crc_16_ccitt signature to match the source file 
should have rewinded stack on exceptions; close #1113 
revive #to_int 
move to_i from fixnum to integer; remove reference of to_int which is not in ISO 
cancel f4c27c6 since mruby.h is required for mrb_value etc. anyway 
Add null char terminate to each symbol name. 
Change to return the exception object when an exception occurred in mrb_funcall 
Rename mrb_fix2str() to mrb_fixnum_to_str(). This is for naming consistency. 
Include mrbconf.h as MRB_INT_MAX used here. 
Fixed testrb load path 
Display the command line when mrbc is kicked in the verbose mode. 
Add CHAR_BIT check. There are uint8_t to char conversions. 
Reduce temporary memory allocations. They are redundant. 
Modify the type of line-number to uint16_t. Type short is not portable. And it cannot be more than UINT16_MAX because of the mrbc binary format. 
Reduce temporary memory allocations. They are redundant. 
Remove RiteFile as no used. 
Allow globals that start with $_ 
Rearrange SIZE_MAX. It is supported also VC++ since its version10. And there seems SIZE_MAX is defined in stdint.h. And it possibly (depends on the version of VC++) conflicts with SIZE_MAX in limits.h. This patch is no need if I did not support VC++. 
Move TRUE/FALSE existence checks. 
Sort include files. Some redundant includes are removed. 
Remove limits.h from numeric.h. Add limits.h to some C files. 
Fixed wrong section size calculation 
Fix a type mismatch. 
return value from fread(3) just cannot be ignored 
Fix format for new mrb_raisef(). 
Add arena guard. It will be exausted when the pool is huge. 
Fix argunum_error() to use mrb_format(). 
Fix %s to %S. 
Modify mrb_name_error() to use mrb_format(). 
Catch return values to silent compiler 
Fix raisef formats in struct.c. 
LEGAL file generator for binaries 
Fix. In some cases, %S substitutions were failed. 
Remove the escape backslash from the result string. 
replace non formatting printf to (f)puts 
implement mrb_format and mrb_vformat 
Use mrb_check_datatype directly to avoid warning. 
Remove empty line 
Fix .travis.yml 
Add travis_config.rb 
Add simple usage message for mirb 
Fix build error on VS2012 toolchain. A local variables define beginning of a scope block. VS2012 unacceptable “;;” in struct definition. 
Added debug infomation section into .mrb file 
Remove unused variable 
bug in fread(3) error check 
little cosmetic change (delete word Rite); bump dump file version number 
Support mt instance valiables 
Use C99 flexible array in pool.c 
main.to_s should also return “main” 
Changed to static functions 
remove all MRB_TT_MAIN from source 
use C99 flexible array member instead of [1] 
zero length array is GCC extension 
fixed build error on VS2012 toolchains. 
Preprocessor # should be the top of line. 
Remove unused macros. 
Remove #if 0 … #endif code. 
remove unused functions ‘mrb_strerrno’ and ‘mrb_bug_errno’. 
Fix indentation in mirb.c 
Make mrb_top_self return a real instance. 
Make topenv() static inlined 
Add stdio.h. This is just for now. We should discuss about remote tests later. 
Separate FILE dependencies with ENABLE_STDIO. 
Include stddef.h. It is required by size_t. In case you include stdio.h, stddef.h is included indirectly. 
Adjusted indent, space and tab 
Changed the RData type field to ‘const’ 
fixed NaN boxing compilation 
Remove needless prototype 
Use size_t instead of int. This is for portability. 
For particular environments which has 25 < n < 32 bit int. There is no cost even if you use 16/32bit int targets. 
Add brances to macro parameter. It may be refactored as GET_UNPACK_{b,c} are used only by GETARG_{b,c}. 
Use ptrdiff_t instead of int. This is for portability. 
Use mrb_bool instead of int. This is for portability; based on e767ebf but iv_foreach_func must return int 
Remove unused marco CODEGEN_DUMP. 
rename mrb_ptr_as_string() to mrb_ptr_to_str() 
Remove _obj_classname() as unused. 
Use mrb_obj_classname() instead of _obj_classname(). They are complietely same. 
Remove *printf() that have “%p” format as possible. Use tomrb_ptr_as_string() instead. 
Set MRB_TT_MODULE to Module. 
Use mrb_str_cat() instead of mrb_str_cat2() as possible. 
Add bitbucket git support. 
Make array.c and vm.c share value_move(). 
Array bang methods should return nil if no change happen 
Add configuration macro MRB_PARSER_BUF_SIZE. 
Add an internal function intern_c(). It reduces function call parameter. For maintainability and performance. 
Make intern_gen() inline. This is enough tiny to be inlined. 
Use mrb_intern2() instead of mrb_intern(). This is for avoiding overhead by strlen(). 
Use mrb_intern2 
Use ` 
fix comment. 
fix the type of value that is returned by bit-shift expression. 
“Ax” is larger than 16-bit. 
 fix the type of value that is returned by bit-shift expression. 
fix the type of value that is returned by bit-shift expression. 
remove gperf installation that is not needed if src/lex.def is properly updated; cancel #1037 
update lex.def 
Update Travis CI build to install gperf. 
Fix indentation in keywords 
Add gem version to build summary if it exists. 
fix comment 
fix spelling 
remove unused local variable beg in parser_yylex 
bugfix about escaping ‘n’ 
remove disused check code 
Could you add me to AUTHORS? 
Simplify conditional expressions. This is for speed tuning. 
Lazy variable declarations. They are for speed tune. 
Clean some redundant code up. 
Make topenv() inlined. 
Extract uvget/uvset to OP_GETUPVAR/OP_SETUPVAR. This is for speed tuning. 
Make some tiny functions inlined. This is for supeed tuning. 
Remove mrb_checkstack() as unused. 
Optimize OP_SUBI. 
Optimize OP_ADD instruction. 
remove unused local variable beg in parser_yylex 
personal style preference on function call in flo_to_s 
fix the type of argument named ‘aspec’. ‘aspec’ should be large at least 24 bit. 
applying C++ patch from @monaka to support C++ bool type; close #1019 
Removed unused expr 
fix the type of bit field variable. if ‘int’ type is 16bit integer, ‘unsigned int flags: 21′ is too large. 
bugfix about escaping ‘n’ 
remove disused check code 
Could you add me to AUTHORS? 
remove bit-shift operation. 
Remove memmove(). Use value_move() instead. 
Fix a warning happens on MRB_INT64 enabled. 
Add float.h. It exists even if the environment was freestanding. It has been supported since C89. 
refine abf1b18 to remove nested if 
Add Build Example for Arduino Due 
Remove stdio.h as it is included in mrbconf.h. 
Remove stdlib.h from mruby.h. It is for portability (care for freestanding environments).  This is a first step. It will be reduced stdlib.h in each files later. 
Remove unnecessory stdint.h. 
Include mruby.h. As KHASH_DEFAULT_SIZE might be defined in mrbconf.h. 
Remove unused string.h. 
Remove strncmp(). It enables to process various options. 
Remove string.h in khash.h 
Avoid to call memset(). Use the new function kh_fill_flags() instead. This is for compatibility. 
Change the place of the close parenthesis. Even though it probably cause no bugs for current code. 
display BasicObject information in mirb 
removed compatibility macros mrb_ary_new_elts() and mrb_ary_new4() 
Remove bit-fields. They doesn’t reduce memory on major environments. 
rename method 
bug fix: fix wrong method name. 
support ‘Cygwin’ as build platform. 
Fix indentation in symbol.c 
bug fix: fix “–sysroot” option and host platform detection. 
Add break to default case in switch statement 
add mrb_int overflow check for mrb_int 
experimental MRB_INT16 added 
use mrb_int as possible based on a patch from @monaka; close #994 
symbol length make size_t from mrb_int; cancel #993 monaka/pr-cleanup-symbol.c-20130312 
remove PARANOID from comments 
Define type mrb_bool. It is typedef-ed to _Bool on C99, unsigned int on MSVC. It is safer than applying 1bit bit-fields to signed int. 
Remove compiler warning 
Cut off eval_test from main 
Add null check 
Extract stack zero filling to stack_clear(). Porting evelopers can optimize by replacing to memset() on their own risk. 
Simplify. Temporary variable “i” is removed. 
Add the type check in mrb_str_to_cstr(). 
set DATA_TYPE as soon as possible. 
mrb_sys_fail raises SystemCallError if we have it. 
Use mrb_int as possible. 
Copy to *lenp just in case lenp != NULL. 
Remove unused return value in mruby.c 
Replace tabs with spaces 
Add static declaration 
Use suitable types for variables. 
Use suitable types for variables. 
Use int. They are no need to use unsigned/signed long. Think about 16bit architectures. 
Add comments for paradnoid (a.k.a. mission critical) engineers. 
Remove a meaningless type cast. 
Remove str_alloc(). Use mrb_obj_alloc_string instead. 
Remove mrb_str_sublen() as it is not used. 
Remove mrb_str_new2(). Use mrb_str_new_cstr() instead.  Make mrb_str_new_cstr() accept NULL pointer. It generates 0byte strings by NULL pointer. 
Fix indents. 
Rename STR_BUF_MIN_SIZE to MRB_STR_BUF_MIN_SIZE. Make it configurable. 
fix inspect method 
restore arena after mrb_define_method() 
return value from mrb_gc_arena_save() is int 
Fix typo 
Fix indent in string.c 
Change default gem path. 
more CFLAGS and LDFLAGS are specified automatically. 
add a new feature to select the target Android platform. 
add a new feature to select the target architecture. 
define and use print format macros for mrb_int 
OP_ARRAY may overflow ARG_C 
Fix warnings. 
Don’t use int. It decreases portability.   Use size_t as array index and length. It avoids overflow in the extreme situations. 
Sanity check. As there are implicaton SIZE_MAX >= UINT32_MAX in this code. This assumption may break on some targets which have 16bit memory space. 
Clean up code. 
Store to *bin_size if bin_size != NULL. 
Use type cast not void* but char*. Don’t substiture void pointers. 
Remove unused substitutions and calculations. 
Don’t initialize variables that store result as MRB_DUMP_OK. It possibly causes bugs on modifications in the future. 
Fixed to uint8_t 
Fixed #969 
Change unsigned char to uint8_t 
fix comment 
unify mrb_ary_new{,_elts,_from_values}; mrb_ary_from_values() is a winner 
mrbc: exit if outfile is specified multiple times 
refactoring 
bug fix: add new option ‘-mandroid’ into CFLAGS and same options are applied into LDFLAGS. 
New mrb format. The detail is in https://github.com/mruby/mruby/issues/944 
bug fix: the argument of ‘–sysroot’ option should be followed ‘=’ character. 
fix handling of :branch option of gem.conf 
Apply @masuidrive’s review point. @bins should be Array. 
Add Support to build loadable modules defined in mrbgems. 
Cut off mrb_irep_free from mrb_close; based on a patch from @matsumoto-r; close #951 
Remove warning for regexp 
Add null check after mrb_realloc for array 
Add include guard in node.h 
Replace tabs with spaces 
skip empty OP_STRCAT 
Remove RB_GC_GUARD(x) macro. See also mruby/mruby#948. 
Skip end of loop in mrb_sym2name_len 
Add accessor: version, description, summary, homepage. 
use mrb_str_buf_new to create a buffer to be used by mrb_str_buf_cat 
Make some printf enclose in #ifdef ENABLE_STDIO. 
Include stdio.h in mrbconf.h instead of C extension sources. 
Added a link to the contribution guidelines in the README 
proper irep pool duplication check for strings 
save/restore arena index for each codedump iteration 
Replace tabs with spaces 
allow reserved word for heredoc terminator 
applied a patch from @cremo to support MSVC 
use mrb_int for RString len 
fix mrb_int for INT64 env 
The variable len isn’t used anywhere. 
delete trailing space 
Reduce a snprintf() call in localjump_error(). 
Clean up range.c. Use mrb_int. Use mrb_vtype. 
Define ARY_MAX_SIZE strictly. Use mrb_int instead of int. 
Remove trailing whitespaces. This is just a cosmetic change. 
cleanup: unused variable local_svar 
Adjust some indents 
cleanup: delete commented out match_op() from parse.y 
bugfix: assert_raise 
remove installing executable first to avoid text-file-busy when investigating on debugger 
string interpolation in regex 
mrb_open takes no arguments: (void) instead of () 
Remove unused var sv 
use TT_ARRAY instead of TT_DATA 
Fix two typos 
replace instance_of check with structure check 
remove struct RStruct, use RArray instead 
fix indent in struct.c 
internal array should be pudated using mrb_ary_set() 
Set nil to uninitialized members 
Fix copy values 
Fixed GC guard 
Should be MRB_DATA class. RStruct isn’t managed by mruby core. So it should be self-managed class instances. 
format some source code (vm.c) 
format some source code (class.c) 
Add typedef to structures that have mrb_ prefix. Use typedef-ed type instead of struct directly. 
Move the place of a curly bracket. This is just a cosmetic change. 
Remove unused structures. 
Fix styleguide based on @cremno’s input 
Modification of CONTRIBUTING.md