⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 typd_mlc.c

📁 linux下建立JAVA虚拟机的源码KAFFE
💻 C
📖 第 1 页 / 共 2 页
字号:
{    register word bm = GC_ext_descriptors[env].ed_bitmap;    register word * current_p = addr;    register word current;    register ptr_t greatest_ha = GC_greatest_plausible_heap_addr;    register ptr_t least_ha = GC_least_plausible_heap_addr;        for (; bm != 0; bm >>= 1, current_p++) {    	if (bm & 1) {    	    current = *current_p;	    FIXUP_POINTER(current);    	    if ((ptr_t)current >= least_ha && (ptr_t)current <= greatest_ha) {    	        PUSH_CONTENTS((ptr_t)current, mark_stack_ptr,			      mark_stack_limit, current_p, exit1);    	    }    	}    }    if (GC_ext_descriptors[env].ed_continued) {        /* Push an entry with the rest of the descriptor back onto the	*/        /* stack.  Thus we never do too much work at once.  Note that	*/        /* we also can't overflow the mark stack unless we actually 	*/        /* mark something.						*/        mark_stack_ptr++;        if (mark_stack_ptr >= mark_stack_limit) {            mark_stack_ptr = GC_signal_mark_stack_overflow(mark_stack_ptr);        }        mark_stack_ptr -> mse_start = addr + WORDSZ;        mark_stack_ptr -> mse_descr =        	GC_MAKE_PROC(GC_typed_mark_proc_index, env+1);    }    return(mark_stack_ptr);}/* Return the size of the object described by d.  It would be faster to	*//* store this directly, or to compute it as part of			*//* GC_push_complex_descriptor, but hopefully it doesn't matter.		*/word GC_descr_obj_size(d)register complex_descriptor *d;{    switch(d -> TAG) {      case LEAF_TAG:      	return(d -> ld.ld_nelements * d -> ld.ld_size);      case ARRAY_TAG:        return(d -> ad.ad_nelements               * GC_descr_obj_size(d -> ad.ad_element_descr));      case SEQUENCE_TAG:        return(GC_descr_obj_size(d -> sd.sd_first)               + GC_descr_obj_size(d -> sd.sd_second));      default:        ABORT("Bad complex descriptor");        /*NOTREACHED*/ return 0; /*NOTREACHED*/    }}/* Push descriptors for the object at addr with complex descriptor d	*//* onto the mark stack.  Return 0 if the mark stack overflowed.  	*/mse * GC_push_complex_descriptor(addr, d, msp, msl)word * addr;register complex_descriptor *d;register mse * msp;mse * msl;{    register ptr_t current = (ptr_t) addr;    register word nelements;    register word sz;    register word i;        switch(d -> TAG) {      case LEAF_TAG:        {          register GC_descr descr = d -> ld.ld_descriptor;                    nelements = d -> ld.ld_nelements;          if (msl - msp <= (ptrdiff_t)nelements) return(0);          sz = d -> ld.ld_size;          for (i = 0; i < nelements; i++) {              msp++;              msp -> mse_start = (word *)current;              msp -> mse_descr = descr;              current += sz;          }          return(msp);        }      case ARRAY_TAG:        {          register complex_descriptor *descr = d -> ad.ad_element_descr;                    nelements = d -> ad.ad_nelements;          sz = GC_descr_obj_size(descr);          for (i = 0; i < nelements; i++) {              msp = GC_push_complex_descriptor((word *)current, descr,              					msp, msl);              if (msp == 0) return(0);              current += sz;          }          return(msp);        }      case SEQUENCE_TAG:        {          sz = GC_descr_obj_size(d -> sd.sd_first);          msp = GC_push_complex_descriptor((word *)current, d -> sd.sd_first,          				   msp, msl);          if (msp == 0) return(0);          current += sz;          msp = GC_push_complex_descriptor((word *)current, d -> sd.sd_second,          				   msp, msl);          return(msp);        }      default:        ABORT("Bad complex descriptor");        /*NOTREACHED*/ return 0; /*NOTREACHED*/   }}/*ARGSUSED*/# if defined(__STDC__) || defined(__cplusplus)    mse * GC_array_mark_proc(register word * addr,			     register mse * mark_stack_ptr,			     mse * mark_stack_limit,			     word env)# else    mse * GC_array_mark_proc(addr, mark_stack_ptr, mark_stack_limit, env)    register word * addr;    register mse * mark_stack_ptr;    mse * mark_stack_limit;    word env;# endif{    register hdr * hhdr = HDR(addr);    register word sz = hhdr -> hb_sz;    register complex_descriptor * descr = (complex_descriptor *)(addr[sz-1]);    mse * orig_mark_stack_ptr = mark_stack_ptr;    mse * new_mark_stack_ptr;        if (descr == 0) {    	/* Found a reference to a free list entry.  Ignore it. */    	return(orig_mark_stack_ptr);    }    /* In use counts were already updated when array descriptor was	*/    /* pushed.  Here we only replace it by subobject descriptors, so 	*/    /* no update is necessary.						*/    new_mark_stack_ptr = GC_push_complex_descriptor(addr, descr,    						    mark_stack_ptr,    						    mark_stack_limit-1);    if (new_mark_stack_ptr == 0) {    	/* Doesn't fit.  Conservatively push the whole array as a unit	*/    	/* and request a mark stack expansion.				*/    	/* This cannot cause a mark stack overflow, since it replaces	*/    	/* the original array entry.					*/    	GC_mark_stack_too_small = TRUE;    	new_mark_stack_ptr = orig_mark_stack_ptr + 1;    	new_mark_stack_ptr -> mse_start = addr;    	new_mark_stack_ptr -> mse_descr = WORDS_TO_BYTES(sz) | GC_DS_LENGTH;    } else {        /* Push descriptor itself */        new_mark_stack_ptr++;        new_mark_stack_ptr -> mse_start = addr + sz - 1;        new_mark_stack_ptr -> mse_descr = sizeof(word) | GC_DS_LENGTH;    }    return(new_mark_stack_ptr);}#if defined(__STDC__) || defined(__cplusplus)  GC_descr GC_make_descriptor(GC_bitmap bm, size_t len)#else  GC_descr GC_make_descriptor(bm, len)  GC_bitmap bm;  size_t len;#endif{    register signed_word last_set_bit = len - 1;    register word result;    register int i;#   define HIGH_BIT (((word)1) << (WORDSZ - 1))        if (!GC_explicit_typing_initialized) GC_init_explicit_typing();    while (last_set_bit >= 0 && !GC_get_bit(bm, last_set_bit)) last_set_bit --;    if (last_set_bit < 0) return(0 /* no pointers */);#   if ALIGNMENT == CPP_WORDSZ/8    {      register GC_bool all_bits_set = TRUE;      for (i = 0; i < last_set_bit; i++) {    	if (!GC_get_bit(bm, i)) {    	    all_bits_set = FALSE;    	    break;    	}      }      if (all_bits_set) {    	/* An initial section contains all pointers.  Use length descriptor. */        return(WORDS_TO_BYTES(last_set_bit+1) | GC_DS_LENGTH);      }    }#   endif    if (last_set_bit < BITMAP_BITS) {    	/* Hopefully the common case.			*/    	/* Build bitmap descriptor (with bits reversed)	*/    	result = HIGH_BIT;    	for (i = last_set_bit - 1; i >= 0; i--) {    	    result >>= 1;    	    if (GC_get_bit(bm, i)) result |= HIGH_BIT;    	}    	result |= GC_DS_BITMAP;    	return(result);    } else {    	signed_word index;    	    	index = GC_add_ext_descriptor(bm, (word)last_set_bit+1);    	if (index == -1) return(WORDS_TO_BYTES(last_set_bit+1) | GC_DS_LENGTH);    				/* Out of memory: use conservative	*/    				/* approximation.			*/    	result = GC_MAKE_PROC(GC_typed_mark_proc_index, (word)index);    	return(result);    }}ptr_t GC_clear_stack();#define GENERAL_MALLOC(lb,k) \    (GC_PTR)GC_clear_stack(GC_generic_malloc((word)lb, k))    #define GENERAL_MALLOC_IOP(lb,k) \    (GC_PTR)GC_clear_stack(GC_generic_malloc_ignore_off_page(lb, k))#if defined(__STDC__) || defined(__cplusplus)  void * GC_malloc_explicitly_typed(size_t lb, GC_descr d)#else  char * GC_malloc_explicitly_typed(lb, d)  size_t lb;  GC_descr d;#endif{register ptr_t op;register ptr_t * opp;register word lw;DCL_LOCK_STATE;    lb += TYPD_EXTRA_BYTES;    if( SMALL_OBJ(lb) ) {#       ifdef MERGE_SIZES	  lw = GC_size_map[lb];#	else	  lw = ALIGNED_WORDS(lb);#       endif	opp = &(GC_eobjfreelist[lw]);	FASTLOCK();        if( !FASTLOCK_SUCCEEDED() || (op = *opp) == 0 ) {            FASTUNLOCK();            op = (ptr_t)GENERAL_MALLOC((word)lb, GC_explicit_kind);	    if (0 == op) return 0;#	    ifdef MERGE_SIZES		lw = GC_size_map[lb];	/* May have been uninitialized.	*/#	    endif        } else {            *opp = obj_link(op);	    obj_link(op) = 0;            GC_words_allocd += lw;            FASTUNLOCK();        }   } else {       op = (ptr_t)GENERAL_MALLOC((word)lb, GC_explicit_kind);       if (op != NULL)	    lw = BYTES_TO_WORDS(GC_size(op));   }   if (op != NULL)       ((word *)op)[lw - 1] = d;   return((GC_PTR) op);}#if defined(__STDC__) || defined(__cplusplus)  void * GC_malloc_explicitly_typed_ignore_off_page(size_t lb, GC_descr d)#else  char * GC_malloc_explicitly_typed_ignore_off_page(lb, d)  size_t lb;  GC_descr d;#endif{register ptr_t op;register ptr_t * opp;register word lw;DCL_LOCK_STATE;    lb += TYPD_EXTRA_BYTES;    if( SMALL_OBJ(lb) ) {#       ifdef MERGE_SIZES	  lw = GC_size_map[lb];#	else	  lw = ALIGNED_WORDS(lb);#       endif	opp = &(GC_eobjfreelist[lw]);	FASTLOCK();        if( !FASTLOCK_SUCCEEDED() || (op = *opp) == 0 ) {            FASTUNLOCK();            op = (ptr_t)GENERAL_MALLOC_IOP(lb, GC_explicit_kind);#	    ifdef MERGE_SIZES		lw = GC_size_map[lb];	/* May have been uninitialized.	*/#	    endif        } else {            *opp = obj_link(op);	    obj_link(op) = 0;            GC_words_allocd += lw;            FASTUNLOCK();        }   } else {       op = (ptr_t)GENERAL_MALLOC_IOP(lb, GC_explicit_kind);       if (op != NULL)       lw = BYTES_TO_WORDS(GC_size(op));   }   if (op != NULL)       ((word *)op)[lw - 1] = d;   return((GC_PTR) op);}#if defined(__STDC__) || defined(__cplusplus)  void * GC_calloc_explicitly_typed(size_t n,  				    size_t lb,  				    GC_descr d)#else  char * GC_calloc_explicitly_typed(n, lb, d)  size_t n;  size_t lb;  GC_descr d;#endif{register ptr_t op;register ptr_t * opp;register word lw;GC_descr simple_descr;complex_descriptor *complex_descr;register int descr_type;struct LeafDescriptor leaf;DCL_LOCK_STATE;    descr_type = GC_make_array_descriptor((word)n, (word)lb, d,    					  &simple_descr, &complex_descr, &leaf);    switch(descr_type) {    	case NO_MEM: return(0);    	case SIMPLE: return(GC_malloc_explicitly_typed(n*lb, simple_descr));    	case LEAF:    	    lb *= n;    	    lb += sizeof(struct LeafDescriptor) + TYPD_EXTRA_BYTES;    	    break;    	case COMPLEX:    	    lb *= n;    	    lb += TYPD_EXTRA_BYTES;    	    break;    }    if( SMALL_OBJ(lb) ) {#       ifdef MERGE_SIZES	  lw = GC_size_map[lb];#	else	  lw = ALIGNED_WORDS(lb);#       endif	opp = &(GC_arobjfreelist[lw]);	FASTLOCK();        if( !FASTLOCK_SUCCEEDED() || (op = *opp) == 0 ) {            FASTUNLOCK();            op = (ptr_t)GENERAL_MALLOC((word)lb, GC_array_kind);	    if (0 == op) return(0);#	    ifdef MERGE_SIZES		lw = GC_size_map[lb];	/* May have been uninitialized.	*/            #	    endif        } else {            *opp = obj_link(op);	    obj_link(op) = 0;            GC_words_allocd += lw;            FASTUNLOCK();        }   } else {       op = (ptr_t)GENERAL_MALLOC((word)lb, GC_array_kind);       if (0 == op) return(0);       lw = BYTES_TO_WORDS(GC_size(op));   }   if (descr_type == LEAF) {       /* Set up the descriptor inside the object itself. */       VOLATILE struct LeafDescriptor * lp =           (struct LeafDescriptor *)               ((word *)op                + lw - (BYTES_TO_WORDS(sizeof(struct LeafDescriptor)) + 1));                       lp -> ld_tag = LEAF_TAG;       lp -> ld_size = leaf.ld_size;       lp -> ld_nelements = leaf.ld_nelements;       lp -> ld_descriptor = leaf.ld_descriptor;       ((VOLATILE word *)op)[lw - 1] = (word)lp;   } else {       extern unsigned GC_finalization_failures;       unsigned ff = GC_finalization_failures;              ((word *)op)[lw - 1] = (word)complex_descr;       /* Make sure the descriptor is cleared once there is any danger	*/       /* it may have been collected.					*/       (void)         GC_general_register_disappearing_link((GC_PTR *)         					  ((word *)op+lw-1),       					          (GC_PTR) op);       if (ff != GC_finalization_failures) {	   /* Couldn't register it due to lack of memory.  Punt.	*/	   /* This will probably fail too, but gives the recovery code  */	   /* a chance.							*/	   return(GC_malloc(n*lb));       }			             }   return((GC_PTR) op);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -