]> gitweb.factorcode.org Git - factor.git/blobdiff - vm/contexts.hpp
webapps.wiki: adding search bar
[factor.git] / vm / contexts.hpp
index eeb0bf5e0649c1c5be3aca1d217d8925b90522fc..945b9cda7d50ae9d5fd1f9ecbb3bb36aa25be61f 100644 (file)
@@ -2,8 +2,7 @@ namespace factor {
 
 // Context object count and identifiers must be kept in sync with:
 //   core/kernel/kernel.factor
-
-static const cell context_object_count = 10;
+static const cell context_object_count = 4;
 
 enum context_object {
   OBJ_NAMESTACK,
@@ -12,34 +11,38 @@ enum context_object {
   OBJ_IN_CALLBACK_P,
 };
 
-static const cell stack_reserved = 1024;
+// When the callstack fills up (e.g by to deep recursion), a callstack
+// overflow error is triggered. So before continuing executing on it
+// in general_error(), we chop off this many bytes to have some space
+// to work with. Mac OSX 64 bit needs more than 8192. See issue #1419.
+static const cell stack_reserved = 16384;
 
 struct context {
 
-  // First 4 fields accessed directly by compiler. See basis/vm/vm.factor
+  // First 5 fields accessed directly by compiler. See basis/vm/vm.factor
 
-  /* Factor callstack pointers */
+  // Factor callstack pointers
   cell callstack_top;
   cell callstack_bottom;
 
-  /* current datastack top pointer */
+  // current datastack top pointer
   cell datastack;
 
-  /* current retain stack top pointer */
+  // current retain stack top pointer
   cell retainstack;
 
-  /* C callstack pointer */
+  // C callstack pointer
   cell callstack_save;
 
   segment* datastack_seg;
   segment* retainstack_seg;
   segment* callstack_seg;
 
-  /* context-specific special objects, accessed by context-object and
-     set-context-object primitives */
+  // context-specific special objects, accessed by context-object and
+  // set-context-object primitives
   cell context_objects[context_object_count];
 
-  context(cell datastack_size, cell retainstack_size, cell callstack_size);
+  context(cell ds_size, cell rs_size, cell cs_size);
   ~context();
 
   void reset_datastack();
@@ -48,6 +51,8 @@ struct context {
   void reset_context_objects();
   void reset();
   void fix_stacks();
+  void fill_stack_seg(cell top_ptr, segment* seg, cell pattern);
+  vm_error_type address_to_error(cell addr);
 
   cell peek() { return *(cell*)datastack; }
 
@@ -66,8 +71,8 @@ struct context {
 };
 
 VM_C_API context* new_context(factor_vm* parent);
-VM_C_API void delete_context(factor_vm* parent, context* old_context);
-VM_C_API void reset_context(factor_vm* parent, context* ctx);
+VM_C_API void delete_context(factor_vm* parent);
+VM_C_API void reset_context(factor_vm* parent);
 VM_C_API cell begin_callback(factor_vm* parent, cell quot);
 VM_C_API void end_callback(factor_vm* parent);