#include <System.h>
+#include <util/radix.h>
namespace System {
namespace RunTime {
- using ::System::Exceptions::Std;
+ using namespace ::System::Exceptions::Std;
// 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;
}
return ptr;
};
-
namespace Priv {
+ typedef void (*MethodEntry)(ParamInfoBlock *pib);
+
+ struct Object {
+ MethodEntry entry;
+ void *ptr; // pointer to the class interface
+ };
+
+ typedef ::Util::RadixTree<Object, ID, 6> ObjTable;
ObjTable objtable;
unsigned long get_pc()
void exception_to_array(::System::VStruct *ex, Array<uint8_t> *ar)
{
- ar->ptr = reinterpret_cast<uint8_t *>(ex);
- ar->count = ex->_infoptr->structlen;
+ // FIXME: marshall struct
}
- void handle_message(ParameterInfoBlock *pib)
+ void handle_message(ParamInfoBlock *pib)
{
Message *msg = reinterpret_cast<Message *>(pib->segments[0].ptr);
- switch (seg0->opcode) {
+ switch (msg->seg0.opcode) {
case Segment0::InvokeMethod: {
- if (pib->segments[0].len < sizeof(InvokeMessage))
+ if (pib->segments[0].len < sizeof(InvokeMethod))
throw_idl(ShortMessage, 0, pib->segments[0].len,
- sizeof(InvokeMessage));
+ sizeof(InvokeMethod));
- ID obj = pib->objlist[0];
-
-
+// ID obj = pib->objlist[0];
break;
}
default:
- throw_idl(InvalidOpcode, seg0->opcode);
+ throw_idl(InvalidOpcode, msg->seg0.opcode);
}
}
}
}}
-extern "C" handle_message(ParameterInfoaBlock *pib, Array<uint8_t> *ex_arr)
+extern "C" void abort();
+
+extern "C" void handle_message(::System::RunTime::ParamInfoBlock *pib,
+ ::System::RunTime::Array<uint8_t> *ex_arr)
{
try {
- ::System::RunTime::handle_message(pib);
+ ::System::RunTime::Priv::handle_message(pib);
}
- catch (::System::Exception *ex) {
- exception_to_array(ex, ex_arr);
+ catch (::System::Exceptions::Exception &ex) {
+ ::System::RunTime::Priv::exception_to_array(&ex, ex_arr);
}
catch (...) {
- assertl(0, Assert::Always);
+ abort();
}
}