Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
#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