schema compile CHANGE better handling of features
- allow forward reference in feature's if-feature statements
- handling features of not implemented modules - all such features
are permanently disabled, but the structures must be available for
the implemented (compiled) modules which import their module.
diff --git a/src/tree_schema_helpers.c b/src/tree_schema_helpers.c
index 692acaa..20a06dc 100644
--- a/src/tree_schema_helpers.c
+++ b/src/tree_schema_helpers.c
@@ -681,12 +681,17 @@
LYS_INFORMAT format = LYS_IN_UNKNOWN;
void (*module_data_free)(void *module_data, void *user_data) = NULL;
struct lysp_load_module_check_data check_data = {0};
+ struct lys_module *m;
- /* try to get the module from the context */
- if (revision) {
- *mod = (struct lys_module*)ly_ctx_get_module(ctx, name, revision);
- } else {
- *mod = (struct lys_module*)ly_ctx_get_module_latest(ctx, name);
+ assert(mod);
+
+ if (!*mod) {
+ /* try to get the module from the context */
+ if (revision) {
+ *mod = (struct lys_module*)ly_ctx_get_module(ctx, name, revision);
+ } else {
+ *mod = (struct lys_module*)ly_ctx_get_module_latest(ctx, name);
+ }
}
if (!(*mod) || (require_parsed && !(*mod)->parsed)) {
@@ -740,12 +745,15 @@
}
} else {
/* we have module from the current context */
- if (implement && (ly_ctx_get_module_implemented(ctx, name) != *mod)) {
- /* check collision with other implemented revision */
- LOGVAL(ctx, LY_VLOG_NONE, NULL, LYVE_REFERENCE,
- "Module \"%s\" is already present in other implemented revision.", name);
- *mod = NULL;
- return LY_EDENIED;
+ if (implement) {
+ m = ly_ctx_get_module_implemented(ctx, name);
+ if (m && m != *mod) {
+ /* check collision with other implemented revision */
+ LOGVAL(ctx, LY_VLOG_NONE, NULL, LYVE_REFERENCE,
+ "Module \"%s\" is already present in other implemented revision.", name);
+ *mod = NULL;
+ return LY_EDENIED;
+ }
}
/* circular check */
@@ -828,7 +836,7 @@
TYPE *imp; \
if (!strncmp((MOD)->mod->prefix, prefix, len) && (MOD)->mod->prefix[len] == '\0') { \
/* it is the prefix of the module itself */ \
- m = ly_ctx_get_module((MOD)->mod->ctx, (MOD)->mod->name, ((struct lysc_module*)(MOD))->revision); \
+ m = ly_ctx_get_module((MOD)->mod->ctx, (MOD)->mod->name, (MOD)->mod->revision); \
} \
/* search in imports */ \
if (!m) { \