Added functions to access instance variables.

git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@3566 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
Richard Frith-MacDonald 1999-01-15 11:24:03 +00:00
parent 09e161c2a3
commit 4d4e790c67
3 changed files with 96 additions and 0 deletions

View file

@ -1,3 +1,9 @@
Fri Jan 15 10:45:00 1999 Richard Frith-Macdonald <richard@brainstorm.co.uk>
src/NSObjCRuntime.m: Added GSGetInstanceVariable() and
GSSetInstanceVariable() methods - extensions to gnustep.
src/NSObjCRuntime.h: ditto
Tue Jan 12 4:10:00 1999 Richard Frith-Macdonald <richard@brainstorm.co.uk>
* src/NSProcessInfo.m: Fix for GNU/Linux-powerpc (__PPC__) to get

View file

@ -53,4 +53,9 @@ extern void NSLogv (NSString* format, va_list args);
#define nil 0
#endif nil
#ifndef NO_GNUSTEP
extern BOOL GSGetInstanceVariable(id obj, NSString *name, void* data);
extern BOOL GSSetInstanceVariable(id obj, NSString *name, void* data);
#endif
#endif /* __NSObjCRuntime_h_GNUSTEP_BASE_INCLUDE */

View file

@ -72,3 +72,88 @@ NSGetSizeAndAlignment(const char *typePtr, unsigned *sizep, unsigned *alignp)
*alignp = info.align;
}
BOOL
GSGetIinstanceVariable(id obj, NSString *iVarName, void *data)
{
const char *name = [iVarName cString];
Class class;
struct objc_ivar_list *ivars;
struct objc_ivar *ivar = 0;
int offset;
const char *type;
unsigned int size;
class = [obj class];
while (class != nil && ivar == 0)
{
ivars = class->ivars;
class = class->super_class;
if (ivars)
{
int i;
for (i = 0; i < ivars->ivar_count; i++)
{
if (strcmp(ivars->ivar_list[i].ivar_name, name) == 0)
{
ivar = &ivars->ivar_list[i];
break;
}
}
}
}
if (ivar == 0)
{
NSLog(@"Attempt to get non-existent ivar");
return NO;
}
offset = ivar->ivar_offset;
type = ivar->ivar_type;
size = objc_sizeof_type(type);
memcpy(data, ((void*)obj) + offset, size);
return YES;
}
BOOL
GSSetInstanceVariable(id obj, NSString *iVarName, void *data)
{
const char *name = [iVarName cString];
Class class;
struct objc_ivar_list *ivars;
struct objc_ivar *ivar = 0;
int offset;
const char *type;
unsigned int size;
class = [obj class];
while (class != nil && ivar == 0)
{
ivars = class->ivars;
class = class->super_class;
if (ivars)
{
int i;
for (i = 0; i < ivars->ivar_count; i++)
{
if (strcmp(ivars->ivar_list[i].ivar_name, name) == 0)
{
ivar = &ivars->ivar_list[i];
break;
}
}
}
}
if (ivar == 0)
{
NSLog(@"Attempt to set non-existent ivar");
return NO;
}
offset = ivar->ivar_offset;
type = ivar->ivar_type;
size = objc_sizeof_type(type);
memcpy(((void*)obj) + offset, data, size);
return YES;
}