endmethod // --- alloc struct Array* Array_alloc(U32 size) { enum { N = 10 }; static struct Class* cls[] = { classref(Array0, Array1, Array2, Array3, Array4, Array5, Array6, Array7, Array8, Array9, ArrayN) }; size_t extra = size * sizeof(OBJ); // check for overflow if (extra/sizeof(OBJ) < size) THROW(gnewWithStr(ExOverflow, "size is too large")); OBJ _cls = (OBJ)cls[size > N ? N : size]; OBJ _arr = gallocWithSize(_cls, extra); struct ArrayN *arrn = CAST(struct ArrayN*, _arr); struct Array *arr = &arrn->ArrayBlk.Array; arr->object = arrn->_object; arr->size = 0; arr->stride = 1; return arr; }
#include <cos/gen/message.h> #include <cos/gen/object.h> #include <cos/gen/stream.h> // ----- useclass(InputOutputFile, OutputInputFile); // ----- read-write -> write-read (multiple inheritance) defmethod(void, gunrecognizedMessage1, InputOutputFile) if (ginstancesUnderstandMessage1(OutputInputFile, _sel) != True) next_method(self); BOOL chg = cos_object_unsafeChangeClass(_1, classref(OutputInputFile), classref(Stream)); test_assert(chg, "unable to change from InputOutputFile to OutputInputFile"); forward_message(_1); endmethod defmethod(void, gunrecognizedMessage2, InputOutputFile, Object) if (ginstancesUnderstandMessage2(OutputInputFile, _2, _sel) != True) next_method(self,self2); BOOL chg = cos_object_unsafeChangeClass(_1, classref(OutputInputFile), classref(Stream)); test_assert(chg, "unable to change from InputOutputFile to OutputInputFile"); forward_message(_1,_2); endmethod