Repository: celix Updated Branches: refs/heads/feature/CELIX-237_rsa-ffi 723d5aed0 -> f1252e248
CELIX-237: dyn_interface now parses types and methods sections Project: http://git-wip-us.apache.org/repos/asf/celix/repo Commit: http://git-wip-us.apache.org/repos/asf/celix/commit/f1252e24 Tree: http://git-wip-us.apache.org/repos/asf/celix/tree/f1252e24 Diff: http://git-wip-us.apache.org/repos/asf/celix/diff/f1252e24 Branch: refs/heads/feature/CELIX-237_rsa-ffi Commit: f1252e248bb100e04412c836b2bdf84d5fd3673a Parents: 723d5ae Author: Pepijn Noltes <pepijnnol...@gmail.com> Authored: Tue Jul 14 21:56:18 2015 +0200 Committer: Pepijn Noltes <pepijnnol...@gmail.com> Committed: Tue Jul 14 21:56:18 2015 +0200 ---------------------------------------------------------------------- .../descriptors/example1.descriptor | 11 +- .../dynamic_function_interface/dyn_common.c | 26 ++- .../dynamic_function_interface/dyn_common.h | 3 + .../dynamic_function_interface/dyn_function.c | 27 ++- .../dynamic_function_interface/dyn_function.h | 4 +- .../dynamic_function_interface/dyn_interface.c | 229 ++++++++++++++----- .../dynamic_function_interface/dyn_interface.h | 31 ++- .../dynamic_function_interface/dyn_type.c | 39 ++-- .../dynamic_function_interface/dyn_type.h | 18 +- .../tst/dyn_closure_tests.cpp | 4 + .../tst/dyn_interface_tests.cpp | 8 +- 11 files changed, 277 insertions(+), 123 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/celix/blob/f1252e24/remote_services/dynamic_function_interface/descriptors/example1.descriptor ---------------------------------------------------------------------- diff --git a/remote_services/dynamic_function_interface/descriptors/example1.descriptor b/remote_services/dynamic_function_interface/descriptors/example1.descriptor index 251219a..a0eacfa 100644 --- a/remote_services/dynamic_function_interface/descriptors/example1.descriptor +++ b/remote_services/dynamic_function_interface/descriptors/example1.descriptor @@ -5,10 +5,9 @@ major_version=1 minor_version=0 micro_version=0 :types -StatResult={DDD[D average min max input} +StatsResult={DDD[D average min max input} :methods -add(PDD*D)N -sub(PDD*D)N -sqrt(PD*D)N -stats(P[D*LStatsResult;)N - +add(DD)D=add(PDD*D)N +sub(DD)D=sub(PDD*D)N +sqrt(D)D=sqrt(PD*D)N +stats([D)LStatsResult;=stats(P[D*LStatsResult;)N http://git-wip-us.apache.org/repos/asf/celix/blob/f1252e24/remote_services/dynamic_function_interface/dyn_common.c ---------------------------------------------------------------------- diff --git a/remote_services/dynamic_function_interface/dyn_common.c b/remote_services/dynamic_function_interface/dyn_common.c index 05844ef..5ee1a5a 100644 --- a/remote_services/dynamic_function_interface/dyn_common.c +++ b/remote_services/dynamic_function_interface/dyn_common.c @@ -6,6 +6,7 @@ #include <stdlib.h> #include <stdio.h> #include <ctype.h> +#include <stdbool.h> #if defined(BSD) || defined(__APPLE__) #include "open_memstream.h" @@ -17,7 +18,13 @@ static const int ERROR = 1; DFI_SETUP_LOG(dynCommon) +static bool dynCommon_charIn(int c, const char *acceptedChars); + int dynCommon_parseName(FILE *stream, char **result) { + return dynCommon_parseNameAlsoAccept(stream, NULL, result); +} + +int dynCommon_parseNameAlsoAccept(FILE *stream, const char *acceptedChars, char **result) { int status = OK; char *buf = NULL; @@ -27,7 +34,7 @@ int dynCommon_parseName(FILE *stream, char **result) { if (name != NULL) { int c = getc(stream); - while (isalnum(c) || c == '_') { + while (isalnum(c) || c == '_' || dynCommon_charIn(c, acceptedChars)) { fputc(c, name); c = getc(stream); strLen += 1; @@ -83,7 +90,7 @@ int dynCommon_parseNameValue(FILE *stream, char **outName, char **outValue) { return status; } -int dynCommon_eatChar(FILE *stream, int expected) { +inline int dynCommon_eatChar(FILE *stream, int expected) { int status = OK; int c = fgetc(stream); if (c != expected) { @@ -92,3 +99,18 @@ int dynCommon_eatChar(FILE *stream, int expected) { } return status; } + +static bool dynCommon_charIn(int c, const char *acceptedChars) { + bool status = false; + if (acceptedChars != NULL) { + int i; + for (i = 0; acceptedChars[i] != '\0'; i += 1) { + if (c == acceptedChars[i]) { + status = true; + break; + } + } + } + + return status; +} http://git-wip-us.apache.org/repos/asf/celix/blob/f1252e24/remote_services/dynamic_function_interface/dyn_common.h ---------------------------------------------------------------------- diff --git a/remote_services/dynamic_function_interface/dyn_common.h b/remote_services/dynamic_function_interface/dyn_common.h index 16df6e2..163bafc 100644 --- a/remote_services/dynamic_function_interface/dyn_common.h +++ b/remote_services/dynamic_function_interface/dyn_common.h @@ -14,6 +14,7 @@ //logging DFI_SETUP_LOG_HEADER(dynCommon); +/* typedef struct _dyn_annotation_list_type annotation_list_type; TAILQ_HEAD(_dyn_annotation_list_type, _dyn_annotation_type); @@ -22,8 +23,10 @@ struct _dyn_annotation_type { char *name; char *value; }; +*/ int dynCommon_parseName(FILE *stream, char **result); +int dynCommon_parseNameAlsoAccept(FILE *stream, const char *acceptedChars, char **result); int dynCommon_parseNameValue(FILE *stream, char **name, char **value); int dynCommon_eatChar(FILE *stream, int c); http://git-wip-us.apache.org/repos/asf/celix/blob/f1252e24/remote_services/dynamic_function_interface/dyn_function.c ---------------------------------------------------------------------- diff --git a/remote_services/dynamic_function_interface/dyn_function.c b/remote_services/dynamic_function_interface/dyn_function.c index 75aa1ae..68c3a11 100644 --- a/remote_services/dynamic_function_interface/dyn_function.c +++ b/remote_services/dynamic_function_interface/dyn_function.c @@ -19,7 +19,7 @@ DFI_SETUP_LOG(dynFunction) struct _dyn_function_type { char *name; - dyn_type_list_type *refTypes; //NOTE not owned + struct reference_types_head *refTypes; //NOTE not owned TAILQ_HEAD(,_dyn_function_argument_type) arguments; ffi_type **ffiArguments; dyn_type *funcReturn; @@ -43,12 +43,13 @@ struct _dyn_function_argument_type { static const int OK = 0; static const int MEM_ERROR = 1; static const int PARSE_ERROR = 2; +static const int ERROR = 2; static int dynFunction_initCif(dyn_function_type *dynFunc); static int dynFunction_parseDescriptor(dyn_function_type *dynFunc, FILE *descriptor); static void dynFunction_ffiBind(ffi_cif *cif, void *ret, void *args[], void *userData); -int dynFunction_parse(FILE *descriptor, dyn_type_list_type *typeReferences, dyn_function_type **out) { +int dynFunction_parse(FILE *descriptor, struct reference_types_head *refTypes, dyn_function_type **out) { int status = OK; dyn_function_type *dynFunc = NULL; LOG_DEBUG("Creating dyn function", descriptor); @@ -57,11 +58,14 @@ int dynFunction_parse(FILE *descriptor, dyn_type_list_type *typeReferences, dyn_ if (dynFunc != NULL) { TAILQ_INIT(&dynFunc->arguments); - dynFunc->refTypes = typeReferences; + dynFunc->refTypes = refTypes; status = dynFunction_parseDescriptor(dynFunc, descriptor); if (status == 0) { int rc = dynFunction_initCif(dynFunc); - status = rc != 0 ? rc : 0; + if (rc != 0) { + LOG_ERROR("Error initializing cif"); + status = ERROR; + } } } else { LOG_ERROR("Error allocationg memory for dyn functipn\n"); @@ -70,21 +74,16 @@ int dynFunction_parse(FILE *descriptor, dyn_type_list_type *typeReferences, dyn_ if (status == 0) { *out = dynFunc; - } else { - if (status == 1) { - LOG_ERROR("Cannot parse func descriptor '%s'\n", descriptor); - } else { - LOG_ERROR("Cannot allocate memory for dyn function\n"); - } - } + } + return status; } -int dynFunction_parseWithStr(const char *descriptor, dyn_type_list_type *typeReferences, dyn_function_type **out) { +int dynFunction_parseWithStr(const char *descriptor, struct reference_types_head *refTypes, dyn_function_type **out) { int status = OK; FILE *stream = fmemopen((char *)descriptor, strlen(descriptor), "r"); if (stream != NULL) { - status = dynFunction_parse(stream, typeReferences, out); + status = dynFunction_parse(stream, refTypes, out); fclose(stream); } else { status = MEM_ERROR; @@ -231,7 +230,7 @@ int dynFunction_createClosure(dyn_function_type *dynFunc, void (*bind)(void *, v return status; } -int dynClosure_getFnPointer(dyn_function_type *dynFunc, void (**fn)(void)) { +int dynFunction_getFnPointer(dyn_function_type *dynFunc, void (**fn)(void)) { int status = 0; if (dynFunc != NULL && dynFunc->fn != NULL) { (*fn) = dynFunc->fn; http://git-wip-us.apache.org/repos/asf/celix/blob/f1252e24/remote_services/dynamic_function_interface/dyn_function.h ---------------------------------------------------------------------- diff --git a/remote_services/dynamic_function_interface/dyn_function.h b/remote_services/dynamic_function_interface/dyn_function.h index 3747656..098c76e 100644 --- a/remote_services/dynamic_function_interface/dyn_function.h +++ b/remote_services/dynamic_function_interface/dyn_function.h @@ -19,8 +19,8 @@ typedef struct _dyn_closure_type dyn_closure_type; DFI_SETUP_LOG_HEADER(dynFunction); -int dynFunction_parse(FILE *descriptorStream, dyn_type_list_type *typeReferences, dyn_function_type **dynFunc); -int dynFunction_parseWithStr(const char *descriptor, dyn_type_list_type *typeReferences, dyn_function_type **dynFunc); +int dynFunction_parse(FILE *descriptorStream, struct reference_types_head *refTypes, dyn_function_type **dynFunc); +int dynFunction_parseWithStr(const char *descriptor, struct reference_types_head *refTypes, dyn_function_type **dynFunc); void dynFunction_destroy(dyn_function_type *dynFunc); int dynFunction_call(dyn_function_type *dynFunc, void(*fn)(void), void *returnValue, void **argValues); http://git-wip-us.apache.org/repos/asf/celix/blob/f1252e24/remote_services/dynamic_function_interface/dyn_interface.c ---------------------------------------------------------------------- diff --git a/remote_services/dynamic_function_interface/dyn_interface.c b/remote_services/dynamic_function_interface/dyn_interface.c index a563eab..bc07a47 100644 --- a/remote_services/dynamic_function_interface/dyn_interface.c +++ b/remote_services/dynamic_function_interface/dyn_interface.c @@ -15,6 +15,7 @@ DFI_SETUP_LOG(dynInterface); const int OK = 0; const int ERROR = 1; +static int dynInterface_parseSection(dyn_interface_type *intf, FILE *stream); static int dynInterface_parseAnnotations(dyn_interface_type *intf, FILE *stream); static int dynInterface_parseTypes(dyn_interface_type *intf, FILE *stream); static int dynInterface_parseMethods(dyn_interface_type *intf, FILE *stream); @@ -28,12 +29,19 @@ int dynInterface_parse(FILE *descriptor, dyn_interface_type **out) { TAILQ_INIT(&intf->types); TAILQ_INIT(&intf->methods); - status = dynInterface_parseAnnotations(intf, descriptor); - if (status == OK) { - status =dynInterface_parseTypes(intf, descriptor); + char peek = fgetc(descriptor); + while (peek == ':') { + ungetc(peek, descriptor); + status = dynInterface_parseSection(intf, descriptor); + if (status == OK) { + peek = fgetc(descriptor); + } else { + break; + } } + if (status == OK) { - status = dynInterface_parseMethods(intf, descriptor); + status = dynCommon_eatChar(descriptor, EOF); } } else { status = ERROR; @@ -48,7 +56,7 @@ int dynInterface_parse(FILE *descriptor, dyn_interface_type **out) { return status; } -static int dynInterface_parseAnnotations(dyn_interface_type *intf, FILE *stream) { +static int dynInterface_parseSection(dyn_interface_type *intf, FILE *stream) { int status = OK; char *sectionName = NULL; @@ -63,72 +71,187 @@ static int dynInterface_parseAnnotations(dyn_interface_type *intf, FILE *stream) } if (status == OK) { - if (strcmp("annotations", sectionName) == 0) { - LOG_DEBUG("Parsed annotations section header"); + if (strcmp("annotations", sectionName) ==0) { + status = dynInterface_parseAnnotations(intf, stream); + } else if (strcmp("types", sectionName) == 0) { + status =dynInterface_parseTypes(intf, stream); + } else if (strcmp("methods", sectionName) == 0) { + status =dynInterface_parseMethods(intf, stream); } else { status = ERROR; - LOG_ERROR("Expected annotations section, got '%s'", sectionName); + LOG_ERROR("unsupported section '%s'", sectionName); } } - if (status == OK) { - int peek = fgetc(stream); - while (peek != ':' && peek != EOF) { - ungetc(peek, stream); + return status; +} + +static int dynInterface_parseAnnotations(dyn_interface_type *intf, FILE *stream) { + int status = OK; - char *name; - char *value; - status = dynCommon_parseNameValue(stream, &name, &value); + int peek = fgetc(stream); + while (peek != ':' && peek != EOF) { + ungetc(peek, stream); - if (status == OK) { - status = dynCommon_eatChar(stream, '\n'); + char *name; + char *value; + status = dynCommon_parseNameValue(stream, &name, &value); + + if (status == OK) { + status = dynCommon_eatChar(stream, '\n'); + } + + struct namval_entry *entry = NULL; + if (status == OK) { + entry = calloc(1, sizeof(*entry)); + if (entry != NULL) { + entry->name = name; + entry->value = value; + TAILQ_INSERT_TAIL(&intf->annotations, entry, entries); + } else { + status = ERROR; + LOG_ERROR("Error allocating memory for namval entry"); } + } - if (status == OK) { - interface_namval_type *entry = calloc(1, sizeof(*entry)); - if (entry != NULL) { - entry->name = name; - entry->value = value; - TAILQ_INSERT_TAIL(&intf->annotations, entry, entries); - } else { - status = ERROR; - LOG_ERROR("Error allocating memory for namval entry"); - } - } - - if (status != OK) { - if (name != NULL) { - free(name); - } - if (value != NULL) { - free(value); - } - break; + if (status != OK) { + if (name != NULL) { + free(name); + } + if (value != NULL) { + free(value); } - peek = fgetc(stream); + if (entry != NULL) { + free(entry); + } + break; } - ungetc(peek, stream); + peek = fgetc(stream); } + ungetc(peek, stream); return status; } static int dynInterface_parseTypes(dyn_interface_type *intf, FILE *stream) { int status = OK; - //TODO implement -> extract section parse part from parseAnnotations first? + + //expected input (Name)=<Type>\n + int peek = fgetc(stream); + while (peek != ':' && peek != EOF) { + ungetc(peek, stream); + + char *name; + status = dynCommon_parseName(stream, &name); + + if (status == OK) { + status = dynCommon_eatChar(stream, '='); + } + + dyn_type *type = NULL; + if (status == OK) { + dynType_parse(stream, name, &intf->types, &type); + } + if (name != NULL) { + free(name); + } + + if (status == OK) { + status = dynCommon_eatChar(stream, '\n'); + } + + struct type_entry *entry = NULL; + if (status == OK) { + entry = calloc(1, sizeof(*entry)); + if (entry != NULL) { + entry->type = type; + TAILQ_INSERT_TAIL(&intf->types, entry, entries); + } else { + status = ERROR; + LOG_ERROR("Error allocating memory for type entry"); + } + } + + if (status != OK) { + if (type != NULL) { + dynType_destroy(type); + } + if (entry != NULL) { + free(entry); + } + break; + } + peek = fgetc(stream); + } + ungetc(peek, stream); + return status; } static int dynInterface_parseMethods(dyn_interface_type *intf, FILE *stream) { int status = OK; - //TODO refactor + + //expected input (Name)=<Method>\n + int peek = fgetc(stream); + int index = 0; + while (peek != ':' && peek != EOF) { + ungetc(peek, stream); + + char *id; + status = dynCommon_parseNameAlsoAccept(stream, "();[{}", &id); + + if (status == OK) { + status = dynCommon_eatChar(stream, '='); + } + + + dyn_function_type *func = NULL; + if (status == OK) { + status = dynFunction_parse(stream, &intf->types, &func); + } + + if (status == OK) { + status = dynCommon_eatChar(stream, '\n'); + } + + struct method_entry *entry = NULL; + if (status == OK) { + entry = calloc(1, sizeof(*entry)); + if (entry != NULL) { + entry->index = index++; + entry->id = id; + entry->dynFunc = func; + TAILQ_INSERT_TAIL(&intf->methods, entry, entries); + } else { + status = ERROR; + LOG_ERROR("Error allocating memory for method entry"); + } + } + + if (status != OK) { + if (id != NULL) { + free(id); + } + if (func != NULL) { + dynFunction_destroy(func); + //TODO free strIdentier, name + } + if (entry != NULL) { + free(entry); + } + break; + } + peek = fgetc(stream); + } + ungetc(peek, stream); + return status; } void dynInterface_destroy(dyn_interface_type *intf) { if (intf != NULL) { - interface_namval_type *nTmp = NULL; - interface_namval_type *nEntry = TAILQ_FIRST(&intf->annotations); + struct namval_entry *nTmp = NULL; + struct namval_entry *nEntry = TAILQ_FIRST(&intf->annotations); while (nEntry != NULL) { nTmp = nEntry; nEntry = TAILQ_NEXT(nEntry, entries); @@ -141,27 +264,23 @@ void dynInterface_destroy(dyn_interface_type *intf) { free(nTmp); } - interface_type_type *tmp = NULL; - interface_type_type *tInfo = TAILQ_FIRST(&intf->types); + struct type_entry *tmp = NULL; + struct type_entry *tInfo = TAILQ_FIRST(&intf->types); while (tInfo != NULL) { tmp = tInfo; tInfo = TAILQ_NEXT(tInfo, entries); - - if (tmp->name != NULL) { - free(tmp->name); - } - + dynType_destroy(tmp->type); free(tmp); } - interface_method_type *mTmp = NULL; - interface_method_type *mInfo = TAILQ_FIRST(&intf->methods); + struct method_entry *mTmp = NULL; + struct method_entry *mInfo = TAILQ_FIRST(&intf->methods); while (mInfo != NULL) { mTmp = mInfo; mInfo = TAILQ_NEXT(mInfo, entries); - if (mTmp->strIdentifier != NULL) { - free(mTmp->strIdentifier); + if (mTmp->id != NULL) { + free(mTmp->id); } if (mTmp->name != NULL) { free(mTmp->name); @@ -180,7 +299,7 @@ void dynInterface_destroy(dyn_interface_type *intf) { int dynInterface_getName(dyn_interface_type *intf, char **out) { int status = OK; char *name = NULL; - interface_namval_type *entry = NULL; + struct namval_entry *entry = NULL; TAILQ_FOREACH(entry, &intf->annotations, entries) { if (strcmp("name", entry->name) == 0) { name = entry->value; http://git-wip-us.apache.org/repos/asf/celix/blob/f1252e24/remote_services/dynamic_function_interface/dyn_interface.h ---------------------------------------------------------------------- diff --git a/remote_services/dynamic_function_interface/dyn_interface.h b/remote_services/dynamic_function_interface/dyn_interface.h index a574496..84badc4 100644 --- a/remote_services/dynamic_function_interface/dyn_interface.h +++ b/remote_services/dynamic_function_interface/dyn_interface.h @@ -20,36 +20,33 @@ DFI_SETUP_LOG_HEADER(dynInterface); * expected sections: header, types & mehods */ +TAILQ_HEAD(namvals_head, namval_entry); +TAILQ_HEAD(methods_head, method_entry); +//struct reference_types_head in dyn_type.h + typedef struct _dyn_interface_type dyn_interface_type; struct _dyn_interface_type { - TAILQ_HEAD(, _interface_namval_type) annotations; - TAILQ_HEAD(, _interface_type_type) types; - TAILQ_HEAD(, _interface_method_type) methods; + struct namvals_head annotations; + struct reference_types_head types; + struct methods_head methods; }; -typedef struct _interface_namval_type interface_namval_type; -struct _interface_namval_type { +//TODO move to dynCommon +struct namval_entry { char *name; char *value; - TAILQ_ENTRY(_interface_namval_type) entries; + TAILQ_ENTRY(namval_entry) entries; }; -typedef struct _interface_method_type interface_method_type; -struct _interface_method_type { - int identifier; - char *strIdentifier; +struct method_entry { + int index; + char *id; char *name; dyn_function_type *dynFunc; - TAILQ_ENTRY(_interface_method_type) entries; -}; - -typedef struct _interface_type_type interface_type_type; -struct _interface_type_type { - char *name; - TAILQ_ENTRY(_interface_type_type) entries; + TAILQ_ENTRY(method_entry) entries; }; int dynInterface_parse(FILE *descriptor, dyn_interface_type **out); http://git-wip-us.apache.org/repos/asf/celix/blob/f1252e24/remote_services/dynamic_function_interface/dyn_type.c ---------------------------------------------------------------------- diff --git a/remote_services/dynamic_function_interface/dyn_type.c b/remote_services/dynamic_function_interface/dyn_type.c index 2915093..720f929 100644 --- a/remote_services/dynamic_function_interface/dyn_type.c +++ b/remote_services/dynamic_function_interface/dyn_type.c @@ -17,7 +17,7 @@ DFI_SETUP_LOG(dynType) -static int dynType_parseWithStream(FILE *stream, const char *name, dyn_type *parent, dyn_type_list_type *typeReferences, dyn_type **result); +static int dynType_parseWithStream(FILE *stream, const char *name, dyn_type *parent, struct reference_types_head *refTypes, dyn_type **result); static void dynType_clear(dyn_type *type); static void dynType_clearComplex(dyn_type *type); static void dynType_clearSequence(dyn_type *type); @@ -58,15 +58,15 @@ static const int DT_ERROR = 1; static const int DT_MEM_ERROR = 2; static const int DT_PARSE_ERROR = 3; -int dynType_parse(FILE *descriptorStream, const char *name, dyn_type_list_type *typeReferences, dyn_type **type) { - return dynType_parseWithStream(descriptorStream, name, NULL, typeReferences, type); +int dynType_parse(FILE *descriptorStream, const char *name, struct reference_types_head *refTypes, dyn_type **type) { + return dynType_parseWithStream(descriptorStream, name, NULL, refTypes, type); } -int dynType_parseWithStr(const char *descriptor, const char *name, dyn_type_list_type *typeReferences, dyn_type **type) { +int dynType_parseWithStr(const char *descriptor, const char *name, struct reference_types_head *refTypes, dyn_type **type) { int status = DT_OK; FILE *stream = fmemopen((char *)descriptor, strlen(descriptor), "r"); if (stream != NULL) { - status = dynType_parseWithStream(stream, name, NULL, typeReferences, type); + status = dynType_parseWithStream(stream, name, NULL, refTypes, type); if (status == DT_OK) { int c = fgetc(stream); if (c != '\0' && c != EOF) { @@ -82,13 +82,13 @@ int dynType_parseWithStr(const char *descriptor, const char *name, dyn_type_list return status; } -static int dynType_parseWithStream(FILE *stream, const char *name, dyn_type *parent, dyn_type_list_type *typeReferences, dyn_type **result) { +static int dynType_parseWithStream(FILE *stream, const char *name, dyn_type *parent, struct reference_types_head *refTypes, dyn_type **result) { int status = DT_OK; dyn_type *type = calloc(1, sizeof(*type)); if (type != NULL) { type->parent = parent; type->type = DYN_TYPE_INVALID; - type->typeReferences = typeReferences; + type->referenceTypes = refTypes; TAILQ_INIT(&type->nestedTypesHead); if (name != NULL) { type->name = strdup(name); @@ -295,13 +295,13 @@ static int dynType_parseRefByValue(FILE *stream, dyn_type *type) { status = dynCommon_parseName(stream, &name); if (status == DT_OK) { dyn_type *ref = dynType_findType(type, name); - free(name); if (ref != NULL) { type->ref.ref = ref; } else { status = DT_PARSE_ERROR; LOG_ERROR("Error cannot find type '%s'", name); } + free(name); } if (status == DT_OK) { @@ -594,21 +594,26 @@ static ffi_type * dynType_ffiTypeFor(int c) { static dyn_type * dynType_findType(dyn_type *type, char *name) { dyn_type *result = NULL; - struct nested_entry *entry = NULL; - if (type->typeReferences != NULL) { - TAILQ_FOREACH(entry, type->typeReferences, entries) { - if (strcmp(name, entry->type.name) == 0) { - result = &entry->type; + struct type_entry *entry = NULL; + if (type->referenceTypes != NULL) { + TAILQ_FOREACH(entry, type->referenceTypes, entries) { + LOG_DEBUG("checking ref type '%s' with name '%s'", entry->type->name, name); + if (strcmp(name, entry->type->name) == 0) { + result = entry->type; break; } } } - TAILQ_FOREACH(entry, &type->nestedTypesHead, entries) { - if (strcmp(name, entry->type.name) == 0) { - result = &entry->type; - break; + if (result == NULL) { + struct nested_entry *nEntry = NULL; + TAILQ_FOREACH(nEntry, &type->nestedTypesHead, entries) { + LOG_DEBUG("checking nested type '%s' with name '%s'", nEntry->type.name, name); + if (strcmp(name, nEntry->type.name) == 0) { + result = &nEntry->type; + break; + } } } http://git-wip-us.apache.org/repos/asf/celix/blob/f1252e24/remote_services/dynamic_function_interface/dyn_type.h ---------------------------------------------------------------------- diff --git a/remote_services/dynamic_function_interface/dyn_type.h b/remote_services/dynamic_function_interface/dyn_type.h index bc19836..b1d2c9f 100644 --- a/remote_services/dynamic_function_interface/dyn_type.h +++ b/remote_services/dynamic_function_interface/dyn_type.h @@ -79,8 +79,8 @@ typedef struct _dyn_type dyn_type; -TAILQ_HEAD(_dyn_type_list_type, nested_entry); -typedef struct _dyn_type_list_type dyn_type_list_type; +TAILQ_HEAD(reference_types_head, type_entry); +TAILQ_HEAD(nested_types_head, nested_entry); struct _dyn_type { char *name; @@ -88,8 +88,8 @@ struct _dyn_type { int type; ffi_type *ffiType; dyn_type *parent; - dyn_type_list_type *typeReferences; //NOTE: not owned - dyn_type_list_type nestedTypesHead; + struct reference_types_head *referenceTypes; //NOTE: not owned + struct nested_types_head nestedTypesHead; union { struct { TAILQ_HEAD(, complex_type_entry) entriesHead; @@ -115,18 +115,22 @@ struct complex_type_entry { TAILQ_ENTRY(complex_type_entry) entries; }; +struct type_entry { + dyn_type *type; + TAILQ_ENTRY(type_entry) entries; +}; + struct nested_entry { dyn_type type; TAILQ_ENTRY(nested_entry) entries; }; - //logging DFI_SETUP_LOG_HEADER(dynType); //generic -int dynType_parse(FILE *descriptorStream, const char *name, dyn_type_list_type *typeReferences, dyn_type **type); -int dynType_parseWithStr(const char *descriptor, const char *name, dyn_type_list_type *typeReferences, dyn_type **type); +int dynType_parse(FILE *descriptorStream, const char *name, struct reference_types_head *refTypes, dyn_type **type); +int dynType_parseWithStr(const char *descriptor, const char *name, struct reference_types_head *refTypes, dyn_type **type); void dynType_destroy(dyn_type *type); int dynType_alloc(dyn_type *type, void **bufLoc); http://git-wip-us.apache.org/repos/asf/celix/blob/f1252e24/remote_services/dynamic_function_interface/tst/dyn_closure_tests.cpp ---------------------------------------------------------------------- diff --git a/remote_services/dynamic_function_interface/tst/dyn_closure_tests.cpp b/remote_services/dynamic_function_interface/tst/dyn_closure_tests.cpp index d01b22e..b2b11d7 100644 --- a/remote_services/dynamic_function_interface/tst/dyn_closure_tests.cpp +++ b/remote_services/dynamic_function_interface/tst/dyn_closure_tests.cpp @@ -93,11 +93,15 @@ static void tests() { { double (*func)(int32_t a, struct example2_arg2 b, int32_t c) = NULL; + double (*func2)(int32_t a, struct example2_arg2 b, int32_t c) = NULL; dynFunction = NULL; rc = dynFunction_parseWithStr(EXAMPLE2_DESCRIPTOR, NULL, &dynFunction); CHECK_EQUAL(0, rc); rc = dynFunction_createClosure(dynFunction, example2_binding, NULL, (void(**)(void))&func); CHECK_EQUAL(0, rc); + rc = dynFunction_getFnPointer(dynFunction, (void(**)(void))&func2); + CHECK_EQUAL(0, rc); + CHECK(func == func2); struct example2_arg2 b; b.val1 = 1.0; b.val2 = 1.5; http://git-wip-us.apache.org/repos/asf/celix/blob/f1252e24/remote_services/dynamic_function_interface/tst/dyn_interface_tests.cpp ---------------------------------------------------------------------- diff --git a/remote_services/dynamic_function_interface/tst/dyn_interface_tests.cpp b/remote_services/dynamic_function_interface/tst/dyn_interface_tests.cpp index 68dae7a..f22c540 100644 --- a/remote_services/dynamic_function_interface/tst/dyn_interface_tests.cpp +++ b/remote_services/dynamic_function_interface/tst/dyn_interface_tests.cpp @@ -50,9 +50,11 @@ extern "C" { TEST_GROUP(DynInterfaceTests) { void setup() { - dynCommon_logSetup(stdLog, NULL, 4); - dynType_logSetup(stdLog, NULL, 4); - dynFunction_logSetup(stdLog, NULL, 4); + int level = 3; + dynCommon_logSetup(stdLog, NULL, level); + dynType_logSetup(stdLog, NULL, level); + dynFunction_logSetup(stdLog, NULL, level); + dynInterface_logSetup(stdLog, NULL, level); } };