{
if (COS_OBJECT_P (obj))
{
+ ((COS_Object)obj)->header.reference_count--;
if ( ((COS_Object)obj)->header.reference_count <= 0 )
return (*COS_Object_release_function_table
[((COS_Object)obj)->header.type
- COS_FAT_OBJECT_TYPE_MIN])(obj);
- else
- ((COS_Object)obj)->header.reference_count--;
}
return 0;
}
COS_object
concord_object_get_feature_value (COS_object object, COS_object feature)
{
- char id_buf[256];
CONCORD_Genre gobj;
CONCORD_Feature fobj;
- CONCORD_String_Tank val_st;
- size_t end;
+ COS_object ret;
if (COS_OBJECT_CHAR_P (object))
{
- cos_utf8_print_char (object, (unsigned char*)id_buf, 256);
+ if (!COS_OBJECT_DS_P (concord_current_env))
+ {
+ concord_current_env = NULL;
+ return NULL;
+ }
+ gobj = concord_get_genre (concord_current_env, "character");
}
else
return NULL;
-
- if (!COS_OBJECT_DS_P (concord_current_env))
- {
- concord_current_env = NULL;
- return NULL;
- }
-
- gobj = concord_get_genre (concord_current_env, "character");
if (gobj == NULL)
return NULL;
if (fobj == NULL)
return NULL;
- if ( concord_obj_get_feature_value_string (id_buf, fobj, &val_st) )
- return NULL;
+ if ( fobj->value_table != NULL )
+ {
+ ret = cos_hash_table_get (fobj->value_table, object);
+ if (ret != NULL)
+ return ret;
+ }
+ else
+ fobj->value_table = cos_make_hash_table ();
+
+ {
+ char id_buf[256];
+ CONCORD_String_Tank val_st;
+ size_t end;
+
+ if (COS_OBJECT_CHAR_P (object))
+ {
+ cos_utf8_print_char (object, (unsigned char*)id_buf, 256);
+ }
+ else
+ return NULL;
+
+ if ( concord_obj_get_feature_value_string (id_buf, fobj, &val_st) )
+ return NULL;
+
+ ret = cos_read_object (CONCORD_String_data (&val_st),
+ CONCORD_String_size (&val_st),
+ 0, &end);
+ if ( ret == NULL )
+ return NULL;
- return cos_read_object (CONCORD_String_data (&val_st),
- CONCORD_String_size (&val_st),
- 0, &end);
+ cos_retain_object (ret);
+ cos_hash_table_put (fobj->value_table, object, ret);
+ return ret;
+ }
}