prevent null pointer access crashes/memory trashing.
[AROS.git] / rom / oop / getmethodid.c
blob3ec885c3161521fbe7bf42e40b6158ca331b2020
1 /*
2 Copyright © 1995-2014, The AROS Development Team. All rights reserved.
3 $Id$
5 Desc: OOP function OOP_GetMethodID
6 Lang: english
7 */
8 #include "intern.h"
9 /*****************************************************************************
11 NAME */
12 #include <proto/exec.h>
13 #include <proto/oop.h>
14 #include <exec/memory.h>
15 #include <aros/libcall.h>
17 #include <aros/debug.h>
18 #include "hash.h"
20 AROS_LH2(OOP_MethodID, OOP_GetMethodID,
22 /* SYNOPSIS */
23 AROS_LHA(CONST_STRPTR , interfaceID, A0),
24 AROS_LHA(ULONG , methodOffset, D0),
26 /* LOCATION */
27 struct Library *, OOPBase, 7, OOP)
29 /* FUNCTION
30 Maps a globally unique full method ID
31 (Interface ID + method offset) into
32 a numeric method ID.
34 INPUTS
35 interfaceID - globally unique interface identifier.
36 methodOffset - offset to the method in this interface.
39 RESULT
40 Numeric method identifier that is unique for this machine.
42 NOTES
44 EXAMPLE
46 BUGS
48 SEE ALSO
50 INTERNALS
52 ******************************************************************************/
54 AROS_LIBFUNC_INIT
56 /* Look up ID */
57 ULONG mid = 0UL;
58 struct iid_bucket *idb;
59 struct HashTable *iidtable = GetOBase(OOPBase)->ob_IIDTable;
61 EnterFunc(bug("OOP_GetMethodID(interfaceID=%s, methodOffset=%ld)\n",
62 interfaceID, methodOffset));
64 /* #warning doesn't handle failures. (Should throw exception of some kind)
66 idb = (struct iid_bucket *)iidtable->Lookup(iidtable, (IPTR)interfaceID, GetOBase(OOPBase));
67 if (idb)
69 D(bug("Got mid %ld\n", mid));
70 /* Should throw exception here if methodbase == -1UL */
71 mid = idb->methodbase + methodOffset;
73 ReturnInt ("OOP_GetMethodID", ULONG, mid);
76 /* Should throw exception here */
78 /* The ID must be left-shifted to make place for method offsets */
79 ReturnInt ("OOP_GetMethodID", ULONG, -1);
81 AROS_LIBFUNC_EXIT
83 } /* OOP_GetMethodID */