summaryrefslogtreecommitdiffhomepage
path: root/include
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2014-10-02 09:27:39 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2014-10-02 09:27:39 +0900
commit6b956f1c1b18e69529ba4daef886ff7c11621656 (patch)
treee62b87a2d816999d160547ac98458210aa3f8fbd /include
parentae1403004b4c9de25e2abfbcd2e838dc737a23d5 (diff)
downloadmruby-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.h4
-rw-r--r--include/mruby/value.h10
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