Skip to content

Instantly share code, notes, and snippets.

@monaka
Last active December 15, 2015 21:50
Show Gist options
  • Save monaka/5328960 to your computer and use it in GitHub Desktop.
Save monaka/5328960 to your computer and use it in GitHub Desktop.
ROMed target support for mruby.
diff --git a/include/mrbconf.h b/include/mrbconf.h
index 60e9b44..7af8686 100644
--- a/include/mrbconf.h
+++ b/include/mrbconf.h
@@ -63,6 +63,7 @@
/* -DENABLE_XXXX to enable following features */
//#define ENABLE_DEBUG /* hooks for debugger */
+//#define MRB_ENABLE_ROMED /* ROMed targets support */
/* end of configuration */
diff --git a/src/symbol.c b/src/symbol.c
index 55bb488..0cd5e04 100644
--- a/src/symbol.c
+++ b/src/symbol.c
@@ -11,6 +11,12 @@
#include "mruby/khash.h"
#include "mruby/string.h"
+#ifdef MRB_ENABLE_ROMED
+extern mrb_bool on_rodata_p(void *ptr);
+#else
+# define on_rodata_p(ptr) FALSE
+#endif
+
/* ------------------------------------------------------ */
typedef struct symbol_name {
size_t len;
@@ -50,10 +56,15 @@ mrb_intern2(mrb_state *mrb, const char *name, size_t len)
return kh_value(h, k);
sym = ++mrb->symidx;
- p = (char *)mrb_malloc(mrb, len+1);
- memcpy(p, name, len);
- p[len] = 0;
- sname.name = (const char*)p;
+ if (on_rodata_p(name)) {
+ sname.name = name;
+ }
+ else {
+ p = (char *)mrb_malloc(mrb, len+1);
+ memcpy(p, name, len);
+ p[len] = 0;
+ sname.name = (const char*)p;
+ }
k = kh_put(n2s, h, sname);
kh_value(h, k) = sym;
@@ -99,8 +110,14 @@ mrb_free_symtbl(mrb_state *mrb)
khash_t(n2s) *h = mrb->name2sym;
khiter_t k;
- for (k = kh_begin(h); k != kh_end(h); k++)
- if (kh_exist(h, k)) mrb_free(mrb, (char*)kh_key(h, k).name);
+ for (k = kh_begin(h); k != kh_end(h); k++) {
+ if (kh_exist(h, k)) {
+ char *name = (char *)kh_key(h, k).name;
+ if (!on_rodata_p(name)) {
+ mrb_free(mrb, name);
+ }
+ }
+ }
kh_destroy(n2s,mrb->name2sym);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment