From b633338a7a59b11bbfbf384ccb587438880c99e2 Mon Sep 17 00:00:00 2001 From: theraven Date: Wed, 29 Jun 2011 12:03:41 +0000 Subject: [PATCH] Remove indirection from alias table. --- alias_table.c | 28 ++++++++++++++-------------- arc.m | 29 ++++++++++++++++++++--------- 2 files changed, 34 insertions(+), 23 deletions(-) diff --git a/alias_table.c b/alias_table.c index 8555038..9fda1cd 100644 --- a/alias_table.c +++ b/alias_table.c @@ -37,31 +37,34 @@ struct objc_alias Class class; }; -typedef struct objc_alias *Alias; +typedef struct objc_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) { - 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_COMPARE_FUNCTION alias_compare #define MAP_TABLE_HASH_KEY string_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" 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) { 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); - if (NULL == alias) + if (NULL == alias.name) { return NULL; } - return alias->class; + return alias.class; } PRIVATE void alias_table_insert(Alias alias) @@ -117,10 +120,7 @@ BOOL class_registerAlias_np(Class class, const char *alias) */ return (class == existingClass); } - - Alias newAlias = alias_pool_alloc(); - newAlias->name = strdup(alias); - newAlias->class = class; + Alias newAlias = { strdup(alias), class }; alias_table_insert(newAlias); return 1; } diff --git a/arc.m b/arc.m index c69718f..d80fd4a 100644 --- a/arc.m +++ b/arc.m @@ -86,12 +86,23 @@ id objc_storeStrong(id *object, id value) //////////////////////////////////////////////////////////////////////////////// // //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_loadWeak(id* object) @@ -99,14 +110,16 @@ id objc_loadWeak(id* object) return objc_autorelease(objc_loadWeakRetained(object)); } - -void objc_moveWeak(id *dest, id *src) +void objc_copyWeak(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) @@ -114,10 +127,8 @@ void objc_destroyWeak(id* obj) objc_storeWeak(object, nil); } -id objc_initWeak(id*, id) +id objc_initWeak(id *object, id value) { *object = nil; return objc_storeWeak(object, value); } - -#endif