This is like buffer_size, but for Copy segments.
objlist_ptr pointer Pointer to the object list
+ newobj_ptr pointer Pointer to the new object list.
objlist_len 32-bit Length of the object list, in IDs
+ newobj_len 32-bit Length of the new object list.
The object list is a special segment that contains object IDs
rather than arbitrary data. Each object ID will be translated
regardless of the pointer size. The first object in the list
is the object to receive the message.
+ Objects which live in this address space have the high bit
+ clear; remote objects have the high bit set. When sending
+ an object reference that has not been exposed to the kernel
+ before, its interface hash should exist in the newobj list.
+
+
+
num_segments 32-bit Number of data segments
segment.ptr pointer Pointer to data segment
file << indent << "};\n\n"
<< indent << "static const __attribute__((unused)) "
"::System::RunTime::VStructInfo _info = {\n"
- << indent << "\t_guids, " << sym->chainlen << '\n'
+ << indent << "\t_guids, " << sym->chainlen << ",\n"
+#if 0
+ << indent << "\t_marshall, _unmarshall,\n"
+#endif
<< indent << "};\n";
{
extra_newline();
+#if 0
+ file << indent << "void _invoke(::System::RunTime::Array"
+ << "< ::System::RunTime::ID> objlist,\n"
+ << indent << " ::System::RunTime::ParamInfoBlock::Segment *segs,\n"
+ << indent << " int nsegs);\n\n";
+#endif
+
file << indent << "static const __attribute__((unused))\n"
<< indent << "::System::RunTime::IFaceInfo _info = {\n"
<< indent << "\t&_guid,\n"
}
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[];
guid1[3] == guid2[3])));
}
- typedef uint32_t ID;
struct ParamInfoBlock {
uint32_t buffer_size;
uint32_t copy_size;
struct IFaceInfo {
const GUID *guid;
+ void (*invoke)(Array<ID> objlist,
+ ParamInfoBlock::Segment *segs,
+ int nsegs);
+ ::System::_i_Object *(*wrapper)(ID id);
+ };
+
+ 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,
ParamInfoBlock::Segment *segs,
return ptr;
};
+// ::System::Object create_wrapper(
+
namespace Priv {
typedef void (*MethodEntry)(ParamInfoBlock *pib);