This is the mail archive of the
frysk@sourceware.org
mailing list for the frysk project.
Re: ISA checks for factories
- From: Andrew Cagney <cagney at redhat dot com>
- To: Phil Muldoon <pmuldoon at redhat dot com>
- Cc: Frysk Hackers <frysk at sourceware dot org>
- Date: Wed, 03 Oct 2007 15:41:56 -0400
- Subject: Re: ISA checks for factories
- References: <4703549C.30709@redhat.com>
Phil,
unfortunate timing, we crossed e-mails during the night,
Phil Muldoon wrote:
I've written several factories to decide what class to instantiate
depending on the ISA. These usually end up as hacks, probably because
I do not understand something quite right, or there is no real decent
"What ISA does this task/proc belong" discovery.
I can instance check an ISA with:
Isa isa = proc.getIsa();
There is now also:
ISA isa = task.getISA()
which returns a frysk.isa.ISA, which looks smells and behaves like an
ENUM. This new ISA just the following attributes:
- family (i386, x8664, PPC)
- word size (4, 8)
- byte order (little, big)
leading to the combinations: IA32, X8664, PPC32LE, PPC32BE, PPC64LE,
PPC64BE.
if (isa instanceof IsaIA32) ....
It can then be used as either:
if (isa == ISA.IA32)
..
else if (isa = ISA.X8664)
..
or better?:
ISAMap map = new ISAMap("why am I here")
.put(ISA.IA32, new My(IA32))
.put(ISA.X8664, new My(X8664))
;
...
// Throws a RuntimeException if ISA missing
My o = (My) map.get(task.getISA);
which could easily be wrapped up in a factory.
Andrew
and so on, but that will not work for 32 on 64 ISAs. For example, on a
32 bit process on a 64 bit system, the instance returned would be
LinuxIa32On64
And those cannot be instance checked as they are package private,
while the "native" ISAs are public.
So what is the solution here? Open the scope of the xxOnxx ISAs? I get
the feeling that instanceof checks tell me that we need to work on a
better solution anyway. Reverting to reflection screams hack to me.
Regards
Phil