summaryrefslogtreecommitdiff
path: root/configure.in
diff options
context:
space:
mode:
Diffstat (limited to 'configure.in')
-rw-r--r--configure.in57
1 files changed, 57 insertions, 0 deletions
diff --git a/configure.in b/configure.in
index 2185174851..81bc57eeb2 100644
--- a/configure.in
+++ b/configure.in
@@ -1230,6 +1230,63 @@ if test $rb_cv_stack_end_address != no; then
AC_DEFINE_UNQUOTED(STACK_END_ADDRESS, $rb_cv_stack_end_address)
fi
+AC_CACHE_CHECK(for gc_mark and gc_children stack frame approximate size(word), rb_cv_gc_mark_stackframe_word,
+[save_CFLAGS="$CFLAGS"
+CFLAGS="-O0"
+AC_TRY_RUN([
+int word;
+void *stack_start;
+
+void
+set_stackframe_word()
+{
+ int dumy = 42;
+ int diff;
+
+ if (stack_start < (void *)&dumy) {
+ diff = (int)((void *)&dumy - stack_start);
+ }
+ else {
+ diff = (int)(stack_start - (void *)&dumy);
+ }
+ word = (diff/sizeof(void *));
+ if ((diff % sizeof(void *)) != 0) {
+ word++;
+ }
+}
+
+void
+gc_mark_children(void *p1, void *p2, int lev)
+{
+ void *obj = p2;
+
+ set_stackframe_word(p1,p2,lev);
+}
+
+void
+gc_mark(void *p1, void *p2, int lev)
+{
+ void *obj = p2;
+
+ gc_mark_children(p1,p2,lev++);
+}
+
+int
+main() {
+ int dumy = 42;
+
+ stack_start = (void *)&dumy;
+ gc_mark(0, 0, 255);
+ return word;
+}
+],
+ [rb_cv_gc_mark_stackframe_word="$?"],
+ [rb_cv_gc_mark_stackframe_word="$?"],
+ [rb_cv_gc_mark_stackframe_word="30"])
+CFLAGS="$save_CFLAGS"])
+AC_DEFINE_UNQUOTED(GC_MARK_STACKFRAME_WORD, $rb_cv_gc_mark_stackframe_word)
+
+
dnl Checks for library functions.
AC_TYPE_GETGROUPS
AC_TYPE_SIGNAL