Skip to content

Commit

Permalink
Added support for meta data (#155)
Browse files Browse the repository at this point in the history
* Small fixes (and with incorrect commas)

* Added support for metadata 

#97

* Didn't mean to change all that whitespace

* More whitespace madness

* Compile warning fix

* Gcc fixes

* Fixed memory leaks and operations on uninitialized memory

* Fixed uninitialized data

* PR review fixes

* Review fix from PR #157

* GCC C fix

* Moved metadata access to dl_reflect.h

* Removed WinMerge .bak file

Co-authored-by: Christian Nilsendahl <[email protected]>
  • Loading branch information
Tisten and Christian Nilsendahl authored Nov 2, 2022
1 parent cf5fe0c commit 9c49f39
Show file tree
Hide file tree
Showing 18 changed files with 583 additions and 117 deletions.
18 changes: 15 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -135,7 +135,10 @@ Type-libs in text-format follows this format.
// Defaults to `uint32` if not set.
"type" : "int64",

"comment": "my_enum is an externally declared enumeration and have 7 values",
"comment": "my_enum is an externally declared enumeration and have 7 values",,

// "metadata" has a list of dl instances which are attached to the enumeration
"metadata": [ { "my_type" : { "member": 1 } } ]

// "values" are the actual values of the enum-type as a dict.
"values" : {
Expand All @@ -161,8 +164,11 @@ Type-libs in text-format follows this format.
// it was added as to shorten the text-format and still keep more descriptive names
// in the generated headers.
"aliases" : ["apa", "kossa"],

"comment": "This enumerator has aliases",

"comment": "This enumerator has aliases"
// "metadata" has a list of dl instances which are attached to the enumerator
"metadata": [ { "my_type" : { "member": 1 } } ]
}
}
}
Expand Down Expand Up @@ -194,6 +200,9 @@ Type-libs in text-format follows this format.
// If not set, no comment will be written to .h
"comment" : "this type is a nice type!",

// "metadata" has a list of dl instances which are attached to the type
"metadata": [ { "my_type" : { "member": 1 } } ],

// "members" is a list of all members of this type.
"members" : [
// one {} per member and the members will be ordered as they are in this list.
Expand All @@ -219,7 +228,10 @@ Type-libs in text-format follows this format.
"comment" : "only used in unittests to check for errors",

// "const" adds the const type modifier to this member in the generated header file
"const" : true
"const" : true,

// "metadata" has a list of dl instances which are attached to the member
"metadata": [ { "my_type" : { "member": 1 } } ]
}
]
}
Expand Down
2 changes: 1 addition & 1 deletion include/dl/dl.h
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -349,7 +349,7 @@ dl_error_t DL_DLL_EXPORT dl_instance_load_inplace( dl_ctx_t dl_ctx,
instance - Ptr to instance to calculate size of.
out_size - Ptr where to store the amount of bytes needed to store the instances.
*/
dl_error_t DL_DLL_EXPORT dl_instance_calc_size( dl_ctx_t dl_ctx, dl_typeid_t type, void* instance, size_t* out_size);
dl_error_t DL_DLL_EXPORT dl_instance_calc_size( dl_ctx_t dl_ctx, dl_typeid_t type, const void* instance, size_t* out_size);

/*
Function: dl_instace_store
Expand Down
Empty file modified include/dl/dl_defines.h
100644 → 100755
Empty file.
70 changes: 41 additions & 29 deletions include/dl/dl_reflect.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,15 +29,18 @@ typedef struct dl_type_context_info
*/
typedef struct dl_type_info
{
dl_typeid_t tid;
const char* name;
const char* comment;
unsigned int size;
unsigned int alignment;
unsigned int member_count;
unsigned int is_extern : 1;
unsigned int is_union : 1;
unsigned int should_verify : 1;
dl_typeid_t tid;
const char* name;
const char* comment;
unsigned int size;
unsigned int alignment;
unsigned int member_count;
unsigned int metadata_count;
const dl_typeid_t* metadata_type_ids;
const void** metadata_instances;
unsigned int is_extern : 1;
unsigned int is_union : 1;
unsigned int should_verify : 1;
} dl_type_info_t;

/*
Expand All @@ -46,36 +49,42 @@ typedef struct dl_type_info
*/
typedef struct dl_member_info
{
const char* name;
const char* comment;
dl_type_atom_t atom;
dl_type_storage_t storage;
dl_typeid_t type_id;
unsigned int size;
unsigned int alignment;
unsigned int offset;
unsigned int array_count;
unsigned int bits;
unsigned int is_const : 1;
unsigned int should_verify : 1;
const char* name;
const char* comment;
dl_type_atom_t atom;
dl_type_storage_t storage;
dl_typeid_t type_id;
unsigned int size;
unsigned int alignment;
unsigned int offset;
unsigned int array_count;
unsigned int bits;
unsigned int metadata_count;
const dl_typeid_t* metadata_type_ids;
const void** metadata_instances;
unsigned int is_const : 1;
unsigned int should_verify : 1;
} dl_member_info_t;

/*
Struct: dl_type_info_t
Struct: dl_enum_info
Struct used to retrieve information about a specific DL-enum.
*/
typedef struct dl_enum_info
{
dl_typeid_t tid;
const char* name;
const char* comment;
dl_type_storage_t storage;
unsigned int value_count;
unsigned int is_extern : 1;
dl_typeid_t tid;
const char* name;
const char* comment;
dl_type_storage_t storage;
unsigned int value_count;
unsigned int metadata_count;
const dl_typeid_t* metadata_type_ids;
const void** metadata_instances;
unsigned int is_extern : 1;
} dl_enum_info_t;

/*
Struct: dl_member_info_t
Struct: dl_enum_value_info
Struct used to retrieve information about a specific DL-enum-value.
*/
typedef struct dl_enum_value_info
Expand All @@ -93,6 +102,9 @@ typedef struct dl_enum_value_info
uint32_t u32;
uint64_t u64;
} value;
unsigned int metadata_count;
const dl_typeid_t* metadata_type_ids;
const void** metadata_instances;
} dl_enum_value_info_t;

#ifdef __cplusplus
Expand Down
36 changes: 18 additions & 18 deletions src/dl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,11 @@ dl_error_t dl_context_destroy(dl_ctx_t dl_ctx)
dl_free( &dl_ctx->alloc, dl_ctx->typedata_strings );
dl_free( &dl_ctx->alloc, dl_ctx->default_data );
dl_free( &dl_ctx->alloc, dl_ctx->c_includes );
for( size_t i = 0; i < dl_ctx->metadatas_count; ++i)
dl_free( &dl_ctx->alloc, dl_ctx->metadatas[i] );
dl_free( &dl_ctx->alloc, dl_ctx->metadatas );
dl_free( &dl_ctx->alloc, dl_ctx->metadata_infos );
dl_free( &dl_ctx->alloc, dl_ctx->metadata_typeinfos );
dl_free( &dl_ctx->alloc, dl_ctx );
return DL_ERROR_OK;
}
Expand Down Expand Up @@ -445,28 +450,23 @@ dl_error_t dl_instance_store( dl_ctx_t dl_ctx, dl_typeid_t type_id,
if( type == 0x0 )
return DL_ERROR_TYPE_NOT_FOUND;

// write header
dl_data_header header;
header.id = DL_INSTANCE_ID;
header.version = DL_INSTANCE_VERSION;
header.root_instance_type = type_id;
header.instance_size = 0;
header.is_64_bit_ptr = sizeof(void*) == 8 ? 1 : 0;
header.pad[0] = header.pad[1] = header.pad[2] = 0;

unsigned char* store_ctx_buffer = 0x0;
size_t store_ctx_buffer_size = 0;
bool store_ctx_is_dummy = out_buffer_size == 0;
bool store_ctx_is_dummy = out_buffer_size == 0;
CDLBinStoreContext store_context(out_buffer + sizeof(dl_data_header), out_buffer_size - sizeof(dl_data_header), store_ctx_is_dummy, dl_ctx->alloc);

if( out_buffer_size > 0 )
{
memcpy(out_buffer, &header, sizeof(dl_data_header));
store_ctx_buffer = out_buffer + sizeof(dl_data_header);
store_ctx_buffer_size = out_buffer_size - sizeof(dl_data_header);
if( instance == out_buffer + sizeof(dl_data_header) )
memset( out_buffer, 0, sizeof(dl_data_header) );
else
memset( out_buffer, 0, out_buffer_size );

dl_data_header* header = (dl_data_header*)out_buffer;
header->id = DL_INSTANCE_ID;
header->version = DL_INSTANCE_VERSION;
header->root_instance_type = type_id;
header->is_64_bit_ptr = sizeof( void* ) == 8 ? 1 : 0;
}

CDLBinStoreContext store_context( store_ctx_buffer, store_ctx_buffer_size, store_ctx_is_dummy, dl_ctx->alloc );

dl_binary_writer_reserve( &store_context.writer, type->size[DL_PTR_SIZE_HOST] );
store_context.AddWrittenPtr(instance, 0); // if pointer refere to root-node, it can be found at offset 0

Expand All @@ -487,7 +487,7 @@ dl_error_t dl_instance_store( dl_ctx_t dl_ctx, dl_typeid_t type_id,
return err;
}

dl_error_t dl_instance_calc_size( dl_ctx_t dl_ctx, dl_typeid_t type, void* instance, size_t* out_size )
dl_error_t dl_instance_calc_size( dl_ctx_t dl_ctx, dl_typeid_t type, const void* instance, size_t* out_size )
{
return dl_instance_store( dl_ctx, type, instance, 0x0, 0, out_size );
}
Expand Down
1 change: 1 addition & 0 deletions src/dl_convert.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -938,6 +938,7 @@ static dl_error_t dl_internal_convert_instance( dl_ctx_t dl_ctx,
if(out_instance != 0x0)
{
dl_data_header* new_header = (dl_data_header*)out_instance;
memset(new_header, 0, sizeof(dl_data_header));
new_header->id = DL_INSTANCE_ID;
new_header->version = DL_INSTANCE_VERSION;
new_header->root_instance_type = type;
Expand Down
66 changes: 39 additions & 27 deletions src/dl_reflect.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,25 +33,31 @@ dl_error_t dl_reflect_loaded_enumids( dl_ctx_t dl_ctx, dl_typeid_t* out_enums, u

static void dl_reflect_copy_type_info( dl_ctx_t ctx, dl_type_info_t* typeinfo, const dl_type_desc* type )
{
typeinfo->tid = ctx->type_ids[ type - ctx->type_descs ];
typeinfo->name = dl_internal_type_name( ctx, type );
typeinfo->comment = dl_internal_type_comment( ctx, type );
typeinfo->size = type->size[DL_PTR_SIZE_HOST];
typeinfo->alignment = type->alignment[DL_PTR_SIZE_HOST];
typeinfo->member_count = type->member_count;
typeinfo->is_extern = ( type->flags & DL_TYPE_FLAG_IS_EXTERNAL ) ? 1 : 0;
typeinfo->is_union = ( type->flags & DL_TYPE_FLAG_IS_UNION ) ? 1 : 0;
typeinfo->should_verify = ( type->flags & DL_TYPE_FLAG_VERIFY_EXTERNAL_SIZE_ALIGN ) ? 1 : 0;
typeinfo->tid = ctx->type_ids[ type - ctx->type_descs ];
typeinfo->name = dl_internal_type_name( ctx, type );
typeinfo->comment = dl_internal_type_comment( ctx, type );
typeinfo->size = type->size[DL_PTR_SIZE_HOST];
typeinfo->alignment = type->alignment[DL_PTR_SIZE_HOST];
typeinfo->member_count = type->member_count;
typeinfo->metadata_count = type->metadata_count;
typeinfo->metadata_type_ids = &ctx->metadata_typeinfos[type->metadata_start];
typeinfo->metadata_instances = &ctx->metadata_infos[type->metadata_start];
typeinfo->is_extern = ( type->flags & DL_TYPE_FLAG_IS_EXTERNAL ) ? 1 : 0;
typeinfo->is_union = ( type->flags & DL_TYPE_FLAG_IS_UNION ) ? 1 : 0;
typeinfo->should_verify = ( type->flags & DL_TYPE_FLAG_VERIFY_EXTERNAL_SIZE_ALIGN ) ? 1 : 0;
}

static void dl_reflect_copy_enum_info( dl_ctx_t ctx, dl_enum_info_t* enuminfo, const dl_enum_desc* enum_ )
{
enuminfo->tid = ctx->enum_ids[ enum_ - ctx->enum_descs ];
enuminfo->name = dl_internal_enum_name( ctx, enum_ );
enuminfo->comment = dl_internal_enum_comment( ctx, enum_ );
enuminfo->storage = enum_->storage;
enuminfo->value_count = enum_->value_count;
enuminfo->is_extern = ( enum_->flags & DL_TYPE_FLAG_IS_EXTERNAL ) ? 1 : 0;
enuminfo->tid = ctx->enum_ids[ enum_ - ctx->enum_descs ];
enuminfo->name = dl_internal_enum_name( ctx, enum_ );
enuminfo->comment = dl_internal_enum_comment( ctx, enum_ );
enuminfo->storage = enum_->storage;
enuminfo->value_count = enum_->value_count;
enuminfo->metadata_count = enum_->metadata_count;
enuminfo->metadata_type_ids = &ctx->metadata_typeinfos[enum_->metadata_start];
enuminfo->metadata_instances = &ctx->metadata_infos[enum_->metadata_start];
enuminfo->is_extern = ( enum_->flags & DL_TYPE_FLAG_IS_EXTERNAL ) ? 1 : 0;
}

dl_error_t DL_DLL_EXPORT dl_reflect_loaded_types( dl_ctx_t dl_ctx, dl_type_info_t* out_types, unsigned int out_types_size )
Expand Down Expand Up @@ -120,18 +126,21 @@ dl_error_t DL_DLL_EXPORT dl_reflect_get_type_members( dl_ctx_t dl_ctx, dl_typeid
{
const dl_member_desc* member = dl_get_type_member( dl_ctx, type, member_index );

out_members[member_index].name = dl_internal_member_name( dl_ctx, member );
out_members[member_index].comment = dl_internal_member_comment( dl_ctx, member );
out_members[member_index].atom = member->AtomType();
out_members[member_index].storage = member->StorageType();
out_members[member_index].type_id = member->type_id;
out_members[member_index].size = member->size[DL_PTR_SIZE_HOST];
out_members[member_index].alignment = member->alignment[DL_PTR_SIZE_HOST];
out_members[member_index].offset = member->offset[DL_PTR_SIZE_HOST];
out_members[member_index].array_count = 0;
out_members[member_index].bits = 0;
out_members[member_index].is_const = ( member->flags & DL_MEMBER_FLAG_IS_CONST ) ? 1 : 0;
out_members[member_index].should_verify = ( member->flags & DL_MEMBER_FLAG_VERIFY_EXTERNAL_SIZE_OFFSET ) ? 1 : 0;
out_members[member_index].name = dl_internal_member_name( dl_ctx, member );
out_members[member_index].comment = dl_internal_member_comment( dl_ctx, member );
out_members[member_index].atom = member->AtomType();
out_members[member_index].storage = member->StorageType();
out_members[member_index].type_id = member->type_id;
out_members[member_index].size = member->size[DL_PTR_SIZE_HOST];
out_members[member_index].alignment = member->alignment[DL_PTR_SIZE_HOST];
out_members[member_index].offset = member->offset[DL_PTR_SIZE_HOST];
out_members[member_index].array_count = 0;
out_members[member_index].bits = 0;
out_members[member_index].metadata_count = member->metadata_count;
out_members[member_index].metadata_type_ids = &dl_ctx->metadata_typeinfos[member->metadata_start];
out_members[member_index].metadata_instances = &dl_ctx->metadata_infos[member->metadata_start];
out_members[member_index].is_const = ( member->flags & DL_MEMBER_FLAG_IS_CONST ) ? 1 : 0;
out_members[member_index].should_verify = ( member->flags & DL_MEMBER_FLAG_VERIFY_EXTERNAL_SIZE_OFFSET ) ? 1 : 0;

switch(member->AtomType())
{
Expand Down Expand Up @@ -161,6 +170,9 @@ dl_error_t DL_DLL_EXPORT dl_reflect_get_enum_values( dl_ctx_t dl_ctx, dl_typeid_
out_values[value].name = dl_internal_enum_alias_name( dl_ctx, &dl_ctx->enum_alias_descs[v->main_alias]);
out_values[value].comment = dl_internal_enum_value_comment( dl_ctx, v);
out_values[value].value.u64 = v->value;
out_values[value].metadata_count = v->metadata_count;
out_values[value].metadata_type_ids = &dl_ctx->metadata_typeinfos[v->metadata_start];
out_values[value].metadata_instances = &dl_ctx->metadata_infos[v->metadata_start];
}

return DL_ERROR_OK;
Expand Down
Loading

0 comments on commit 9c49f39

Please sign in to comment.