static void extern_record_location(value obj) { header_t hdr; if (extern_ignore_sharing) return; if (extern_trail_cur == extern_trail_limit) { struct trail_block * new_block = malloc(sizeof(struct trail_block)); if (new_block == NULL) extern_out_of_memory(); new_block->previous = extern_trail_block; extern_trail_block = new_block; extern_trail_cur = extern_trail_block->entries; extern_trail_limit = extern_trail_block->entries + ENTRIES_PER_TRAIL_BLOCK; } hdr = Hd_val(obj); extern_trail_cur->obj = obj | Colornum_hd(hdr); extern_trail_cur->field0 = Field(obj, 0); extern_trail_cur++; Hd_val(obj) = Bluehd_hd(hdr); Field(obj, 0) = (value) obj_counter; obj_counter++; }
static void grow_extern_output(intnat required) { struct output_block * blk; intnat extra; if (extern_userprovided_output != NULL) { extern_failwith("Marshal.to_buffer: buffer overflow"); } extern_output_block->end = extern_ptr; if (required <= SIZE_EXTERN_OUTPUT_BLOCK / 2) extra = 0; else extra = required; blk = malloc(sizeof(struct output_block) + extra); if (blk == NULL) extern_out_of_memory(); extern_output_block->next = blk; extern_output_block = blk; extern_output_block->next = NULL; extern_ptr = extern_output_block->data; extern_limit = extern_output_block->data + SIZE_EXTERN_OUTPUT_BLOCK + extra; }
static void extern_record_location(value obj) { header_t hdr; if (extern_trail_cur == extern_trail_limit) { struct trail_block * new_block = malloc(sizeof(struct trail_block)); if (new_block == NULL) extern_out_of_memory(); new_block->previous = extern_trail_block; extern_trail_block = new_block; extern_trail_cur = extern_trail_block->entries; extern_trail_limit = extern_trail_block->entries + ENTRIES_PER_TRAIL_BLOCK; } // Set the blue color on current object header hdr = Hd_val(obj); extern_trail_cur->obj = obj | Colornum_hd(hdr); // Save the object first field extern_trail_cur->field0 = Field(obj, 0); extern_trail_cur++; Hd_val(obj) = Bluehd_hd(hdr); // Set the current counter in first field Field(obj, 0) = (value) obj_counter; obj_counter++; }
void output_buffer_resize() { if (output_buffer_length == output_buffer_size) { output_buffer = realloc(output_buffer, sizeof(struct_data) * 2 * output_buffer_size); if (output_buffer == NULL) extern_out_of_memory(); } }
void output_buffer_init() { output_buffer = malloc(sizeof(struct_data) * 97); if (output_buffer == NULL) extern_out_of_memory(); output_buffer_size = 97; output_buffer_length = 0; }