diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2014-10-02 09:27:39 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2014-10-02 09:27:39 +0900 |
| commit | 6b956f1c1b18e69529ba4daef886ff7c11621656 (patch) | |
| tree | e62b87a2d816999d160547ac98458210aa3f8fbd /include | |
| parent | ae1403004b4c9de25e2abfbcd2e838dc737a23d5 (diff) | |
| download | mruby-6b956f1c1b18e69529ba4daef886ff7c11621656.tar.gz mruby-6b956f1c1b18e69529ba4daef886ff7c11621656.zip | |
use __init_array_start to determine readonly data section;
b72e94f used _etext and _edata to distinguish C string literals from heap allocated strings,
but using _edata, global char arrays may be considered as string literals. to avoid the issue,
we have to use __init_array_start, which might be less portable. you can still use _edata, by
using MRB_NO_INIT_ARRAY_START.
Diffstat (limited to 'include')
| -rw-r--r-- | include/mrbconf.h | 4 | ||||
| -rw-r--r-- | include/mruby/value.h | 10 |
2 files changed, 14 insertions, 0 deletions
diff --git a/include/mrbconf.h b/include/mrbconf.h index 0195ae96f..95d4b3637 100644 --- a/include/mrbconf.h +++ b/include/mrbconf.h @@ -41,6 +41,10 @@ /* if _etext and _edata available, mruby can reduce memory used by symbols */ //#define MRB_USE_ETEXT_EDATA +/* do not use __init_array_start to determine readonly data section; + effective only when MRB_USE_ETEXT_EDATA is defined */ +//#define MRB_NO_INIT_ARRAY_START + /* turn off generational GC by default */ //#define MRB_GC_TURN_OFF_GENERATIONAL diff --git a/include/mruby/value.h b/include/mruby/value.h index 09d00302e..9297f6b28 100644 --- a/include/mruby/value.h +++ b/include/mruby/value.h @@ -213,6 +213,7 @@ mrb_undef_value(void) #ifdef MRB_USE_ETEXT_EDATA extern char _etext[]; +#ifdef MRB_NO_INIT_ARRAY_START extern char _edata[]; static inline mrb_bool @@ -221,6 +222,15 @@ mrb_ro_data_p(const char *p) return _etext < p && p < _edata; } #else +extern char __init_array_start[]; + +static inline mrb_bool +mrb_ro_data_p(const char *p) +{ + return _etext < p && p < (char*)&__init_array_start; +} +#endif +#else # define mrb_ro_data_p(p) FALSE #endif |
