static PMC *allocate(PARROT_INTERP, STable *st) { CStrInstance *obj = (CStrInstance *) Parrot_gc_allocate_fixed_size_storage(interp, sizeof(CStrInstance)); obj->common.stable = st->stable_pmc; obj->common.sc = NULL; obj->body.cstr = NULL; return wrap_object_func(interp, obj); }
/* Clone. Clone object body and the attribute storage hash. */ static PMC * repr_clone(PARROT_INTERP, PMC *to_clone) { HashAttrStoreInstance *obj; /* Allocate and set up object instance. */ obj = (HashAttrStoreInstance *) Parrot_gc_allocate_fixed_size_storage(interp, sizeof(HashAttrStoreInstance)); obj->common.stable = STABLE_PMC(to_clone); obj->store = VTABLE_clone(interp, ((HashAttrStoreInstance *)PMC_data(to_clone))->store); return wrap_object(interp, obj); }
/* Creates a new instance based on the type object. */ static PMC * instance_of(PARROT_INTERP, PMC *WHAT) { HashAttrStoreInstance *obj; /* Allocate and set up object instance. */ obj = (HashAttrStoreInstance *) Parrot_gc_allocate_fixed_size_storage(interp, sizeof(HashAttrStoreInstance)); obj->common.stable = STABLE_PMC(WHAT); obj->store = pmc_new(interp, enum_class_Hash); return wrap_object(interp, obj); }
/* Creates a new instance based on the type object. */ static PMC * allocate(PARROT_INTERP, STable *st) { P6opaqueInstance * obj; /* Compute allocation strategy if we've not already done so. */ P6opaqueREPRData * repr_data = (P6opaqueREPRData *) st->REPR_data; if (!repr_data->allocation_size) { compute_allocation_strategy(interp, st->WHAT, repr_data); PARROT_GC_WRITE_BARRIER(interp, st->stable_pmc); } /* Allocate and set up object instance. */ obj = (P6opaqueInstance *) Parrot_gc_allocate_fixed_size_storage(interp, repr_data->allocation_size); memset(obj, 0, repr_data->allocation_size); obj->common.stable = st->stable_pmc; return wrap_object(interp, obj); }
/* Clones the current object. */ static PMC * repr_clone(PARROT_INTERP, PMC *to_clone) { P6opaqueInstance *obj; P6opaqueREPRData *repr_data = (P6opaqueREPRData *)STABLE(to_clone)->REPR_data; if (defined(interp, to_clone)) { obj = (P6opaqueInstance *)Parrot_gc_allocate_fixed_size_storage(interp, repr_data->allocation_size); memcpy(obj, PMC_data(to_clone), repr_data->allocation_size); if (!PMC_IS_NULL(obj->spill)) obj->spill = VTABLE_clone(interp, obj->spill); } else { obj = mem_allocate_zeroed_typed(P6opaqueInstance); memcpy(obj, PMC_data(to_clone), sizeof(P6opaqueInstance)); } return wrap_object(interp, obj); }
/* Creates a new instance based on the type object. */ static PMC * allocate(PARROT_INTERP, STable *st) { CStructInstance * obj; CStructREPRData * repr_data = (CStructREPRData *) st->REPR_data; /* Allocate and set up object instance. */ obj = (CStructInstance *) Parrot_gc_allocate_fixed_size_storage(interp, sizeof(CStructInstance)); obj->common.stable = st->stable_pmc; obj->common.sc = NULL; obj->body.child_objs = NULL; /* Allocate child obj array. */ if(repr_data->num_child_objs > 0) { size_t bytes = repr_data->num_child_objs*sizeof(PMC *); obj->body.child_objs = (PMC **) mem_sys_allocate_zeroed(bytes); memset(obj->body.child_objs, 0, bytes); } return wrap_object_func(interp, obj); }
/* Creates a new instance based on the type object. */ static PMC * instance_of(PARROT_INTERP, PMC *WHAT) { P6opaqueInstance * obj; /* Compute allocation strategy if we've not already done so. */ P6opaqueREPRData * repr_data = (P6opaqueREPRData *) STABLE(WHAT)->REPR_data; if (!repr_data->allocation_size) { compute_allocation_strategy(interp, WHAT, repr_data); PARROT_GC_WRITE_BARRIER(interp, STABLE_PMC(WHAT)); } /* Allocate and set up object instance. */ obj = (P6opaqueInstance *) Parrot_gc_allocate_fixed_size_storage(interp, repr_data->allocation_size); memset(obj, 0, repr_data->allocation_size); obj->common.stable = STABLE_PMC(WHAT); /* The spill slot gets set to PMCNULL; it not being (C) NULL is what * lets us know it's actually a real instance, not a type object. */ obj->spill = PMCNULL; return wrap_object(interp, obj); }
Free the C<buffer> memory. =cut */ PARROT_CANNOT_RETURN_NULL PARROT_WARN_UNUSED_RESULT IO_BUFFER * Parrot_io_buffer_allocate(PARROT_INTERP, ARGMOD(PMC *owner), INTVAL flags, ARGIN_NULLOK(const STR_VTABLE *encoding), size_t init_size) { ASSERT_ARGS(Parrot_io_buffer_allocate) IO_BUFFER * const buffer = (IO_BUFFER *)Parrot_gc_allocate_fixed_size_storage(interp, sizeof (IO_BUFFER)); UNUSED(owner); buffer->encoding = encoding; if (init_size == BUFFER_SIZE_ANY) { if (flags & PIO_BF_LINEBUF) init_size = PIO_BUFFER_LINEBUF_SIZE; else init_size = PIO_BUFFER_MIN_SIZE; } buffer->buffer_size = init_size; if (init_size) { buffer->buffer_ptr = (char *)mem_sys_allocate(init_size); flags |= PIO_BF_MALLOC; } else
/* Performs a change of type, where possible. */ static void change_type(PARROT_INTERP, PMC *obj, PMC *new_type) { P6opaqueInstance *instance = (P6opaqueInstance *)PMC_data(obj); P6opaqueREPRData *cur_repr_data = (P6opaqueREPRData *)STABLE(obj)->REPR_data; P6opaqueREPRData *new_repr_data = (P6opaqueREPRData *)STABLE(new_type)->REPR_data; STRING *mro_str = Parrot_str_new_constant(interp, "mro"); PMC *cur_mro, *new_mro; INTVAL cur_mro_elems, new_mro_elems, mro_is_suffix; /* Ensure we're not trying to change the type of a type object. */ if (PObj_flag_TEST(private0, obj)) Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_INVALID_OPERATION, "Cannot change the type of a type object"); /* Ensure that the destination type REPR is P6opaque also. */ if (REPR(obj) != REPR(new_type)) Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_INVALID_OPERATION, "P6opaque can only change type to another type with P6opaque REPR"); /* Ensure that MRO of new type has current type's MRO as a suffix. */ mro_is_suffix = 1; cur_mro = introspection_call(interp, STABLE(obj)->WHAT, STABLE(obj)->HOW, mro_str, 0); new_mro = introspection_call(interp, STABLE(new_type)->WHAT, STABLE(new_type)->HOW, mro_str, 0); cur_mro_elems = VTABLE_elements(interp, cur_mro); new_mro_elems = VTABLE_elements(interp, new_mro); if (new_mro_elems >= cur_mro_elems) { INTVAL start = new_mro_elems - cur_mro_elems; INTVAL i; for (i = 0; i < cur_mro_elems; i++) { PMC *cur_elem = VTABLE_get_pmc_keyed_int(interp, cur_mro, i); PMC *new_elem = VTABLE_get_pmc_keyed_int(interp, new_mro, i + start); if (decontainerize(interp, cur_elem) != decontainerize(interp, new_elem)) { mro_is_suffix = 0; break; } } } else { mro_is_suffix = 0; } if (!mro_is_suffix) Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_INVALID_OPERATION, "P6opaque only supports type changes where the MRO of the original type is a suffix of the MRO of the new type"); /* If the new REPR never calculated it's object layout, do so now. */ if (!new_repr_data->allocation_size) { compute_allocation_strategy(interp, new_type, new_repr_data); PARROT_GC_WRITE_BARRIER(interp, STABLE_PMC(new_type)); } /* Reallocate ourself to the new allocation size, if needed, and * ensure new chunk of the memory is zeroed. Note that we can't * really re-alloc, we need to go deal with the fixed size pool * allocator. */ if (new_repr_data->allocation_size > cur_repr_data->allocation_size) { P6opaqueInstance *new_body = (P6opaqueInstance *) Parrot_gc_allocate_fixed_size_storage(interp, new_repr_data->allocation_size); memset(new_body, 0, new_repr_data->allocation_size); memcpy(new_body, instance, cur_repr_data->allocation_size); PMC_data(obj) = new_body; Parrot_gc_free_fixed_size_storage(interp, cur_repr_data->allocation_size, instance); instance = new_body; } /* Finally, we're ready to switch the S-Table pointer. */ instance->common.stable = STABLE_PMC(new_type); PARROT_GC_WRITE_BARRIER(interp, obj); }