}
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,
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 {
};
struct IFaceInfo {
- static const uint8_t *guid;
+ const GUID *guid;
+ void (*invoke)(Array<ID> 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<uint8_t> &buf,
GrowableArray<ID> &objlist,
+ GrowableArray<NewObject> &newobjlist,
ParamInfoBlock::Segment *segs,
int nsegs);
void (*unmarshall)(Array<uint8_t> buf,
- Array<ID> objlist,
+ Array< ::System::_i_Object *> objlist,
ParamInfoBlock::Segment *segs,
int nsegs);
};