Remove indirection from alias table.

main
theraven 15 years ago
parent 9967d85d60
commit b633338a7a

@ -37,31 +37,34 @@ struct objc_alias
Class class; Class class;
}; };
typedef struct objc_alias *Alias; typedef struct objc_alias Alias;
static int alias_compare(const char *name, const Alias alias) static int alias_compare(const char *name, const Alias alias)
{ {
return string_compare(name, alias->name); return string_compare(name, alias.name);
} }
static int alias_hash(const Alias alias) static int alias_hash(const Alias alias)
{ {
return string_hash(alias->name); return string_hash(alias.name);
} }
static int alias_is_null(const Alias alias)
{
return alias.name == NULL;
}
static Alias NullAlias;
#define MAP_TABLE_NAME alias_table_internal #define MAP_TABLE_NAME alias_table_internal
#define MAP_TABLE_COMPARE_FUNCTION alias_compare #define MAP_TABLE_COMPARE_FUNCTION alias_compare
#define MAP_TABLE_HASH_KEY string_hash #define MAP_TABLE_HASH_KEY string_hash
#define MAP_TABLE_HASH_VALUE alias_hash #define MAP_TABLE_HASH_VALUE alias_hash
#define MAP_TABLE_VALUE_TYPE struct objc_alias
#define MAP_TABLE_VALUE_NULL alias_is_null
#define MAP_TABLE_VALUE_PLACEHOLDER NullAlias
#include "hash_table.h" #include "hash_table.h"
static alias_table_internal_table *alias_table; static alias_table_internal_table *alias_table;
#define POOL_NAME alias
#define POOL_TYPE struct objc_alias
#include "pool.h"
PRIVATE void init_alias_table(void) PRIVATE void init_alias_table(void)
{ {
alias_table_internal_initialize(&alias_table, 128); alias_table_internal_initialize(&alias_table, 128);
@ -83,12 +86,12 @@ Class alias_getClass(const char *alias_name)
Alias alias = alias_table_get_safe(alias_name); Alias alias = alias_table_get_safe(alias_name);
if (NULL == alias) if (NULL == alias.name)
{ {
return NULL; return NULL;
} }
return alias->class; return alias.class;
} }
PRIVATE void alias_table_insert(Alias alias) PRIVATE void alias_table_insert(Alias alias)
@ -117,10 +120,7 @@ BOOL class_registerAlias_np(Class class, const char *alias)
*/ */
return (class == existingClass); return (class == existingClass);
} }
Alias newAlias = { strdup(alias), class };
Alias newAlias = alias_pool_alloc();
newAlias->name = strdup(alias);
newAlias->class = class;
alias_table_insert(newAlias); alias_table_insert(newAlias);
return 1; return 1;
} }

29
arc.m

@ -86,12 +86,23 @@ id objc_storeStrong(id *object, id value)
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
// //
//FIXME: These are all stubs! //FIXME: These are all stubs!
#if 0
id objc_storeWeak(id*addr, id obj) { return obj;} struct
{
id *ref[4];
struct weakRef *next;
} weakRef;
id objc_storeWeak(id *addr, id obj)
{
id old = *addr;
if (
return obj;
}
id objc_loadWeakRetained(id* obj) id objc_loadWeakRetained(id* obj)
{ {
} }
id objc_loadWeak(id* object) id objc_loadWeak(id* object)
@ -99,14 +110,16 @@ id objc_loadWeak(id* object)
return objc_autorelease(objc_loadWeakRetained(object)); return objc_autorelease(objc_loadWeakRetained(object));
} }
void objc_copyWeak(id *dest, id *src)
void objc_moveWeak(id *dest, id *src)
{ {
objc_release(objc_initWeak(dest, objc_loadWeakRetained(src)));
} }
void objc_copyWeak(id *dest, id *src) void objc_moveWeak(id *dest, id *src)
{ {
objc_release(objc_initWeak(dest, objc_loadWeakRetained(src))); // FIXME: src can be zero'd here, removing the relationship between the
// object and the pointer, which can be cheaper.
objc_moveWeak(dest, src);
} }
void objc_destroyWeak(id* obj) void objc_destroyWeak(id* obj)
@ -114,10 +127,8 @@ void objc_destroyWeak(id* obj)
objc_storeWeak(object, nil); objc_storeWeak(object, nil);
} }
id objc_initWeak(id*, id) id objc_initWeak(id *object, id value)
{ {
*object = nil; *object = nil;
return objc_storeWeak(object, value); return objc_storeWeak(object, value);
} }
#endif

Loading…
Cancel
Save