VM: name change no_non_safepoint_words_p -> stack_frame_p
It returns true if the quotation should be wrapped in a stack frame.locals-and-roots
							parent
							
								
									1fddf79724
								
							
						
					
					
						commit
						00a64c9271
					
				| 
						 | 
				
			
			@ -84,24 +84,21 @@ bool quotation_jit::mega_lookup_p(cell i, cell length) {
 | 
			
		|||
      array_nth(elements.untagged(), i + 3) == parent->special_objects[MEGA_LOOKUP_WORD];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Subprimitives should be flagged with whether they require a stack frame.
 | 
			
		||||
   See #295. */
 | 
			
		||||
bool quotation_jit::special_subprimitive_p(cell obj) {
 | 
			
		||||
  // Subprimitives should be flagged with whether they require a stack frame.
 | 
			
		||||
  // See #295.
 | 
			
		||||
  return obj == parent->special_objects[SIGNAL_HANDLER_WORD] ||
 | 
			
		||||
         obj == parent->special_objects[LEAF_SIGNAL_HANDLER_WORD] ||
 | 
			
		||||
         obj == parent->special_objects[UNWIND_NATIVE_FRAMES_WORD];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool quotation_jit::word_safepoint_p(cell obj) {
 | 
			
		||||
  return !special_subprimitive_p(obj);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* true if there are no non-safepoint words in the quoation... */
 | 
			
		||||
bool quotation_jit::no_non_safepoint_words_p() {
 | 
			
		||||
/* All quotations wants a stack frame, except those that contain calls
 | 
			
		||||
   to the special subprimitives. See #295. */
 | 
			
		||||
bool quotation_jit::stack_frame_p() {
 | 
			
		||||
  cell length = array_capacity(elements.untagged());
 | 
			
		||||
  for (cell i = 0; i < length; i++) {
 | 
			
		||||
    cell obj = array_nth(elements.untagged(), i);
 | 
			
		||||
    if (TAG(obj) == WORD_TYPE && !word_safepoint_p(obj))
 | 
			
		||||
    if (TAG(obj) == WORD_TYPE && special_subprimitive_p(obj))
 | 
			
		||||
      return false;
 | 
			
		||||
  }
 | 
			
		||||
  return true;
 | 
			
		||||
| 
						 | 
				
			
			@ -139,11 +136,11 @@ void quotation_jit::emit_quotation(cell quot_) {
 | 
			
		|||
 | 
			
		||||
/* Allocates memory (parameter(), literal(), emit_epilog, emit_with_literal)*/
 | 
			
		||||
void quotation_jit::iterate_quotation() {
 | 
			
		||||
  bool no_non_safepoint_words = no_non_safepoint_words_p();
 | 
			
		||||
  bool stack_frame = stack_frame_p();
 | 
			
		||||
 | 
			
		||||
  set_position(0);
 | 
			
		||||
 | 
			
		||||
  if (no_non_safepoint_words) {
 | 
			
		||||
  if (stack_frame) {
 | 
			
		||||
    emit(parent->special_objects[JIT_SAFEPOINT]);
 | 
			
		||||
    emit(parent->special_objects[JIT_PROLOG]);
 | 
			
		||||
  }
 | 
			
		||||
| 
						 | 
				
			
			@ -162,10 +159,10 @@ void quotation_jit::iterate_quotation() {
 | 
			
		|||
        if (to_boolean(obj.as<word>()->subprimitive)) {
 | 
			
		||||
          tail_call = emit_subprimitive(obj.value(),     /* word */
 | 
			
		||||
                                        i == length - 1, /* tail_call_p */
 | 
			
		||||
                                        no_non_safepoint_words);    /* stack_frame_p */
 | 
			
		||||
                                        stack_frame);  /* stack_frame_p */
 | 
			
		||||
        }                                                /* Everything else */
 | 
			
		||||
        else if (i == length - 1) {
 | 
			
		||||
          emit_epilog(no_non_safepoint_words);
 | 
			
		||||
          emit_epilog(stack_frame);
 | 
			
		||||
          tail_call = true;
 | 
			
		||||
          word_jump(obj.value());
 | 
			
		||||
        } else
 | 
			
		||||
| 
						 | 
				
			
			@ -199,7 +196,7 @@ void quotation_jit::iterate_quotation() {
 | 
			
		|||
        /* 'if' preceded by two literal quotations (this is why if and ? are
 | 
			
		||||
           mutually recursive in the library, but both still work) */
 | 
			
		||||
        if (fast_if_p(i, length)) {
 | 
			
		||||
          emit_epilog(no_non_safepoint_words);
 | 
			
		||||
          emit_epilog(stack_frame);
 | 
			
		||||
          tail_call = true;
 | 
			
		||||
 | 
			
		||||
          emit_quotation(array_nth(elements.untagged(), i));
 | 
			
		||||
| 
						 | 
				
			
			@ -232,7 +229,7 @@ void quotation_jit::iterate_quotation() {
 | 
			
		|||
          /* Load the object from the datastack, then remove our stack frame. */
 | 
			
		||||
          emit_with_literal(parent->special_objects[PIC_LOAD],
 | 
			
		||||
                            tag_fixnum(-index * sizeof(cell)));
 | 
			
		||||
          emit_epilog(no_non_safepoint_words);
 | 
			
		||||
          emit_epilog(stack_frame);
 | 
			
		||||
          tail_call = true;
 | 
			
		||||
 | 
			
		||||
          emit_mega_cache_lookup(array_nth(elements.untagged(), i), index,
 | 
			
		||||
| 
						 | 
				
			
			@ -252,7 +249,7 @@ void quotation_jit::iterate_quotation() {
 | 
			
		|||
 | 
			
		||||
  if (!tail_call) {
 | 
			
		||||
    set_position(length);
 | 
			
		||||
    emit_epilog(no_non_safepoint_words);
 | 
			
		||||
    emit_epilog(stack_frame);
 | 
			
		||||
    emit(parent->special_objects[JIT_RETURN]);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -25,8 +25,7 @@ struct quotation_jit : public jit {
 | 
			
		|||
  bool declare_p(cell i, cell length);
 | 
			
		||||
  bool special_subprimitive_p(cell obj);
 | 
			
		||||
  cell word_stack_frame_size(cell obj);
 | 
			
		||||
  bool word_safepoint_p(cell obj);
 | 
			
		||||
  bool no_non_safepoint_words_p();
 | 
			
		||||
  bool stack_frame_p();
 | 
			
		||||
  void iterate_quotation();
 | 
			
		||||
 | 
			
		||||
  /* Allocates memory */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue