X-Git-Url: http://git.buserror.net/cgi-bin/gitweb.cgi?p=polintos%2Fscott%2Fpriv.git;a=blobdiff_plain;f=include%2Fc%2B%2B%2Forb.h;h=1f1a3e6f6588586d69caec87fd0976ff6571c783;hp=30c4157728e083e885d37188f1fa56ed88f5425e;hb=b024710fe2b60cd4a42a8993b61333d6cdb56ca3;hpb=162bcbe20500026d447471ea289485cc94fcef05 diff --git a/include/c++/orb.h b/include/c++/orb.h index 30c4157..1f1a3e6 100644 --- a/include/c++/orb.h +++ b/include/c++/orb.h @@ -309,28 +309,19 @@ namespace System { } struct IFaceInfo; + typedef uint32_t ID; struct IFaceTable { const IFaceInfo *info; const ptrdiff_t offset; }; - struct VStructInfo { - // List of GUIDs of the struct and its superstructs, - // starting with System.VStruct and ending with - // the concrete struct. - - const unsigned long *const *const guids; - - // Length of inheritance chain; 1 for System.VStruct - - const int chainlen; + union GUID { + unsigned char c[16]; + unsigned long l[]; }; - - uintptr_t downcast(::System::_i_Object *obj, - const unsigned long *new_guid); - typedef uint64_t GUID[2]; + uintptr_t downcast(::System::_i_Object *obj, const GUID *new_guid); // FIXME: use above typedef static inline bool guids_equal(const unsigned long *guid1, @@ -343,12 +334,11 @@ namespace System { guid1[3] == guid2[3]))); } - typedef uint32_t ID; struct ParamInfoBlock { uint32_t buffer_size; uint32_t copy_size; - ID *objlist; - uint32_t objlist_len; + ID *objlist, *newobj; + uint32_t objlist_len, newobj_len; uint32_t num_segments; struct Segment { @@ -395,13 +385,37 @@ namespace System { }; struct IFaceInfo { - static const uint8_t *guid; + const GUID *guid; + void (*invoke)(Array objlist, + ParamInfoBlock::Segment *segs, + int nsegs); + ::System::_i_Object *(*wrapper)(ID id); + }; + + struct NewObject { + uint32_t guid_hash[5]; // SHA-1 hash of Interface GUIDs + uint32_t id; + uint32_t reserved[3]; // must be zero + }; + + struct VStructInfo { + // List of GUIDs of the struct and its superstructs, + // starting with System.VStruct and ending with + // the concrete struct. + + const unsigned long *const *const guids; + + // Length of inheritance chain; 1 for System.VStruct + + const int chainlen; + int (*marshall)(GrowableArray &buf, GrowableArray &objlist, + GrowableArray &newobjlist, ParamInfoBlock::Segment *segs, int nsegs); void (*unmarshall)(Array buf, - Array objlist, + Array< ::System::_i_Object *> objlist, ParamInfoBlock::Segment *segs, int nsegs); };