]> granicus.if.org Git - gc/commitdiff
Add support for emscripten platform
authorJonathan Chambers <jonathan@unity3d.com>
Fri, 16 May 2014 17:46:54 +0000 (13:46 -0400)
committerLucas Meijer <lucas@unity3d.com>
Thu, 3 Jul 2014 19:00:46 +0000 (21:00 +0200)
alloc.c
include/private/gcconfig.h
mach_dep.c
mark_rts.c
misc.c

diff --git a/alloc.c b/alloc.c
index 25bb31eadcee027880fcf4552bfa685ab386f4f6..d8fb954f60d72269a7c378280adcbc4f0966ef42 100644 (file)
--- a/alloc.c
+++ b/alloc.c
@@ -202,11 +202,15 @@ GC_API GC_stop_func GC_CALL GC_get_stop_func(void)
 static word min_bytes_allocd(void)
 {
     word result;
-#   ifdef STACK_GROWS_UP
+#   ifdef __EMSCRIPTEN__
+      word stack_size = 0;
+#   else 
+#     ifdef STACK_GROWS_UP
       word stack_size = GC_approx_sp() - GC_stackbottom;
             /* GC_stackbottom is used only for a single-threaded case.  */
-#   else
+#     else
       word stack_size = GC_stackbottom - GC_approx_sp();
+#     endif
 #   endif
 
     word total_root_size;       /* includes double stack size,  */
index 7d0fc0dfece33705b8ffc94e7d7ebb5d36293ab6..4eed184285dc9f12ac61a2b0be165a55f2d1b4af 100644 (file)
 #   define mach_type_known
 # endif
 
+# if defined(__EMSCRIPTEN__)
+#   define I386
+#   define ALIGNMENT 4
+#   define mach_type_known
+# endif
+
 /* Feel free to add more clauses here */
 
 /* Or manually define the machine type here.  A machine type is         */
 #   define DATAEND NULL
 # endif
 
+# ifdef __EMSCRIPTEN__
+#   define OS_TYPE "EMSCRIPTEN"
+#   define CPP_WORDSZ 32
+#   define ALIGNMENT 4
+#   define DATASTART NULL
+#   define DATAEND NULL
+# endif
+
 # define STACK_GRAN 0x1000000
 # ifdef M68K
 #   define MACH_TYPE "M68K"
index 9c95e698137d60c6ac2a33318e458b9d7715c90a..a882c76d045d704076d09a5efd0ea08bbe2794d3 100644 (file)
       }
 #     define HAVE_PUSH_REGS
 #   endif /* __MWERKS__ */
+# elif defined(EMSCRIPTEN)
+      void GC_push_regs(void)
+      {
+      }
+#     define HAVE_PUSH_REGS
 # endif /* MACOS */
 
 #endif /* !USE_ASM_PUSH_REGS */
index a8dc04a2b7e886aa9272ae936faf8796740fc915..533415863d89c08078ad5029bf87a6f895f36f36 100644 (file)
@@ -810,7 +810,9 @@ GC_INNER void GC_push_roots(GC_bool all, ptr_t cold_gc_frame)
      * This is usually done by saving the current context on the
      * stack, and then just tracing from the stack.
      */
+#ifndef __EMSCRIPTEN__
       GC_push_regs_and_stack(cold_gc_frame);
+#endif
 
     if (GC_push_other_roots != 0) (*GC_push_other_roots)();
         /* In the threads case, this also pushes thread stacks. */
diff --git a/misc.c b/misc.c
index 68667eef086c8e8d1f68b4d96facc7c2be460556..526eb989ef65ab8ed988dc9062b778736aa7ddd4 100644 (file)
--- a/misc.c
+++ b/misc.c
@@ -349,6 +349,9 @@ GC_INNER void GC_extend_size_map(size_t i)
 /* another frame.                                                       */
 GC_API void * GC_CALL GC_clear_stack(void *arg)
 {
+#ifdef __EMSCRIPTEN__
+    return arg;
+#endif
     ptr_t sp = GC_approx_sp();  /* Hotter than actual sp */
 #   ifdef THREADS
         word volatile dummy[SMALL_CLEAR_SIZE];