mirror of
https://github.com/gnustep/libs-base.git
synced 2025-04-23 00:41:02 +00:00
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:
parent
09e161c2a3
commit
4d4e790c67
3 changed files with 96 additions and 0 deletions
|
@ -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
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue