// This function could be made to do a binary search if we can
// manage to somehow sort the IFaceTables...
- uintptr_t downcast(::System::_i_Object *obj,
- const unsigned long *new_guid)
+ uintptr_t downcast(::System::_i_Object *obj, const GUID *new_guid)
{
if (!obj)
return 0;
unsupported_long_size();
IFaceTable *tbl = obj->info->concrete_IFaceTable;
- unsigned long new_guid_first = *new_guid;
+ unsigned long new_guid_first = new_guid->l[0];
// This doesn't use guids_equal(), as that would eliminate the
// ability to cache the first word of new_guid. The compiler
// behaves.
while (true) {
- if (tbl->guid[0] == new_guid_first &&
- tbl->guid[1] == new_guid[1] &&
+ if (tbl->info->guid->l[0] == new_guid_first &&
+ tbl->info->guid->l[1] == new_guid->l[1] &&
(sizeof(long) == 8 ||
- (tbl->guid[2] == new_guid[2] &&
- tbl->guid[3] == new_guid[3])))
+ (tbl->info->guid->l[2] == new_guid->l[2] &&
+ tbl->info->guid->l[3] == new_guid->l[3])))
break;
tbl++;
- if (__builtin_expect(!tbl->guid, 0))
+ if (__builtin_expect(!tbl->info->guid->l[0], 0))
return 0;
}
{
// FIXME: marshall struct
}
-
+
void handle_message(ParamInfoBlock *pib)
{
Message *msg = reinterpret_cast<Message *>(pib->segments[0].ptr);
sizeof(InvokeMethod));
// ID obj = pib->objlist[0];
-
-
break;
}