mruby configuration macros

The configuration file

You can do the build configuration in the build configuration file. The default configuration file is build_config/default.rb.

You can specify your own configuration file by the MRUBY_CONFIG environment variable (you can use CONFIG for shorthand for MRUBY_CONFIG). If the path doesn't exist, build_config/${MRUBY_CONFIG}.rb is used.

How to use these macros

Just add the configuration value to the MRuby::Build#defines attribute. This is the same for MRuby::CrossBuild.

# build_config.rb

MRuby::Build.new do |conf|
  ...
  conf.defines << 'MRB_GC_FIXED_ARENA'
  conf.defines << 'MRB_NO_METHOD_CACHE'
  ...
end

NOTE

  • Use common definitions (conf.defines) instead of per-compiler definitions (e.g., conf.cc.defines) unless there is a special reason not to.
  • It is now deprecated to edit the include/mruby/mrbconf.h file or give it directly as a compiler flag, as was the case before.

stdio setting

MRB_NO_STDIO

  • When defined <stdio.h> functions won't be used.
  • Some features will be disabled when this is enabled:
    • mrb_irep load/dump from/to file.
    • Compiling mruby script from a file.
    • Printing features in src/print.c.

Debug macros

MRB_USE_DEBUG_HOOK

  • When defined code fetch hook and debug OP hook will be enabled.
  • When using any of the hook set function pointer code_fetch_hook and/or debug_op_hook of mrb_state.
  • Fetch hook will be called before any OP.
  • Debug OP hook will be called when dispatching OP_DEBUG.

MRB_DEBUG

  • When defined mrb_assert* macro will be defined with macros from <assert.h>.
  • Could be enabled via enable_debug method of MRuby::Build.

Stack configuration

MRB_STACK_EXTEND_DOUBLING

  • If defined doubles the stack size when extending it.
  • Otherwise extends stack with 1.5x growth (minimum MRB_STACK_GROWTH).

MRB_STACK_GROWTH

  • Default value is 128.
  • Minimum stack growth size when extending.
  • Ignored when MRB_STACK_EXTEND_DOUBLING is defined.

MRB_STACK_MAX

  • Default value is 0x40000 - MRB_STACK_GROWTH.
  • Raises RuntimeError when stack size exceeds this value.

Primitive type configuration

MRB_USE_FLOAT32

  • When defined single-precision floating-point type(C type float) is used as mrb_float.
  • Otherwise, double-precision floating-point type(C type double) is used as mrb_float.

MRB_NO_FLOAT

  • When defined removes floating-point numbers from mruby.
  • It makes mruby easier to handle in "Micro-controller without FPU" and "Kernel Space".

MRB_INT32

  • When defined, or MRB_INT64 are not defined on 32-bit CPU mode, mrb_int will be defined as int32_t.
  • Conflicts with MRB_INT64.

MRB_INT64

  • When defined, or MRB_INT32 are not defined on 64-bit CPU mode, mrb_int will be defined as int64_t.
  • Conflicts with MRB_INT32.
  • On 32-bit platforms, MRB_INT64 requires MRB_NO_BOXING because heap-allocated RInteger needs 8-byte alignment that the GC heap may not guarantee with word or NaN boxing.

Garbage collector configuration

MRB_GC_STRESS

  • When defined full GC is emitted per each RBasic allocation.
  • Mainly used in memory manager debugging.
  • If defined at the same time as MRB_DEBUG, full GC is emitted also per each heap allocation (mrb_malloc() or etc.). This configuration slows down mruby execution by a factor of 2 to 3 or even more.

MRB_GC_TURN_OFF_GENERATIONAL

  • When defined turns generational GC off by default.

MRB_GC_FIXED_ARENA

  • When defined used fixed size GC arena.
  • Raises RuntimeError when this is defined and GC arena size exceeds MRB_GC_ARENA_SIZE.
  • Useful tracking unnecessary mruby object allocation.

MRB_GC_ARENA_SIZE

  • Default value is 100.
  • Ignored when MRB_GC_FIXED_ARENA isn't defined.
  • Defines fixed GC arena size.

MRB_HEAP_PAGE_SIZE

  • Default value is 1024.
  • Specifies number of RBasic per each heap page.

Memory pool configuration

POOL_ALIGNMENT

  • Default value is 4.
  • If you're allocating data types that requires alignment more than default value define the largest value of required alignment.

POOL_PAGE_SIZE

  • Default value is 16000.
  • Specifies page size of pool page.
  • Smaller the value is increases memory overhead.

State atexit configuration

MRB_FIXED_STATE_ATEXIT_STACK

  • If defined enables fixed size mrb_state atexit stack.
  • Raises RuntimeError when mrb_state_atexit call count to same mrb_state exceeds MRB_FIXED_STATE_ATEXIT_STACK_SIZE's value.

MRB_FIXED_STATE_ATEXIT_STACK_SIZE

  • Default value is 5.
  • If MRB_FIXED_STATE_ATEXIT_STACK isn't defined this macro is ignored.

mrb_value configuration

MRB_ENDIAN_BIG

  • If defined compiles mruby for big endian machines.
  • Used in MRB_NAN_BOXING.
  • Some mrbgem use this mrbconf.

MRB_NAN_BOXING

  • If defined represent mrb_value in boxed double.
  • Conflicts with MRB_USE_FLOAT32 and MRB_NO_FLOAT.

MRB_WORD_BOXING

  • If defined represent mrb_value as a word (natural unit of data for the processor).
  • Default boxing mode when none is specified.
  • On 64-bit platforms, floats are inlined using rotation encoding.
  • On 32-bit platforms, floats are heap-allocated as RFloat objects.

MRB_NO_BOXING

  • If defined represent mrb_value as a C struct (occupies 2 words).
  • Most portable but least memory-efficient representation.
  • Required for MRB_INT64 on 32-bit platforms.
  • Default for host-debug configuration.

MRB_WORDBOX_NO_INLINE_FLOAT

  • If defined disables inline float values in word boxing.
  • All floats are heap-allocated as RFloat objects.
  • Automatically defined on 32-bit platforms (64-bit double cannot fit in a 32-bit word).
  • Only meaningful with MRB_WORD_BOXING.

Reduce heap memory configuration

MRB_USE_ETEXT_RO_DATA_P

  • Use etext and edata section addresses defined by the linker to detect read-only data.
  • Those addresses are widely available, but not portable, nor standardized.
  • Defined by default on User-mode Linux.

MRB_NO_DEFAULT_RO_DATA_P

  • Define this macro when the default mrb_ro_data_p() does not work for any reason.

MRB_USE_CUSTOM_RO_DATA_P

  • Define to provide your own mrb_ro_data_p() implementation.
  • The prototype declaration is mrb_bool mrb_ro_data_p(const char *ptr).
  • Return TRUE if ptr is in the read-only section, otherwise return FALSE.

Other configuration

MRB_USE_MALLOC_TRIM

  • Call malloc_trim(0) for each mrb_full_gc() call.

MRB_UTF8_STRING

  • Adds UTF-8 encoding support to character-oriented String instance methods.
  • If it isn't defined, they only support the US-ASCII encoding.

MRB_STR_LENGTH_MAX

  • The maximum length of strings (default 1048576).
  • Set this value to zero to skip the check.

MRB_ARY_LENGTH_MAX

  • The maximum length of arrays (default 131072).
  • Set this value to zero to skip the check.

MRB_FUNCALL_ARGC_MAX

  • Default value is 16.
  • Specifies 4th argument(argc) max value of mrb_funcall.
  • Raises ArgumentError when the argc argument is bigger then this value mrb_funcall.

KHASH_INITIAL_SIZE

  • Default value is 32.
  • Specifies initial size of khash table bucket.
  • Used in kh_init_ ## name function.

MRB_NO_METHOD_CACHE

  • Disable method cache to save memory.

MRB_METHOD_CACHE_SIZE

  • Default value is 256.
  • Ignored if MRB_NO_METHOD_CACHE is defined.
  • Need to be the power of 2.

MRB_USE_ALL_SYMBOLS

  • Make it available Symbol.all_symbols in mrbgems/mruby-symbol-ext
  • Increase heap memory usage.

MRB_USE_VM_SWITCH_DISPATCH

  • Turn on switch dispatch in VM loop.
  • Otherwise, computed goto (direct threading) is used when supported by the compiler.

MRB_SYMBOL_LINEAR_THRESHOLD

  • Default value is 256.
  • Threshold for switching symbol table from linear search to hash table.

Tuning profiles

Predefined profiles adjust several macros together for specific deployment targets. Define one of the following:

MRB_CONSTRAINED_BASELINE_PROFILE

  • For micro controllers.
  • Enables MRB_NO_METHOD_CACHE, reduces KHASH_INITIAL_SIZE to 16, and MRB_HEAP_PAGE_SIZE to 256.

MRB_BASELINE_PROFILE

  • Default mruby profile. No additional changes.

MRB_MAIN_PROFILE

  • For desktop computers or workstations.
  • Increases MRB_METHOD_CACHE_SIZE to 1024 and MRB_HEAP_PAGE_SIZE to 4096.

MRB_HIGH_PROFILE

  • For long-lived server processes.
  • Increases MRB_METHOD_CACHE_SIZE to 4096 and MRB_HEAP_PAGE_SIZE to 4096.