diff --git a/packages/corto/src/_object.h b/packages/corto/src/_object.h index 30ff23c5..a6cd9529 100644 --- a/packages/corto/src/_object.h +++ b/packages/corto/src/_object.h @@ -202,6 +202,7 @@ typedef struct ext_corto_expr_opt { corto_object scope; corto_type returnType; corto_bool returnsReference; + corto_bool inverse; } ext_corto_expr_opt; ext_corto_expr* ext_corto_expr_alloc(void); diff --git a/packages/corto/src/lang/unit.c b/packages/corto/src/lang/unit.c index e6f650d7..837009d6 100644 --- a/packages/corto/src/lang/unit.c +++ b/packages/corto/src/lang/unit.c @@ -16,21 +16,30 @@ corto_int16 _corto_unit_construct( corto_unit this) { /* $begin(corto/lang/unit/construct) */ - ext_corto_expr *expr = NULL; + ext_corto_expr *exprToQuantity = NULL, *exprFromQuantity = NULL; if (this->conversion) { corto_id typeId; - expr = ext_corto_expr_alloc(); + exprToQuantity = ext_corto_expr_alloc(); + exprFromQuantity = ext_corto_expr_alloc(); corto_fullpath(typeId, this->type); char *types[] = {typeId}; - if (ext_corto_expr_compb(expr, NULL, this->conversion, types)) { - corto_dealloc(expr); + if (ext_corto_expr_compb(exprToQuantity, NULL, this->conversion, types)) { + corto_dealloc(exprToQuantity); goto error; } - this->toQuantity = (corto_word)expr; + ext_corto_expr_opt opt = {.inverse = TRUE}; + + if (ext_corto_expr_compb(exprFromQuantity, &opt, this->conversion, types)) { + corto_dealloc(exprFromQuantity); + goto error; + } + + this->toQuantity = (corto_word)exprToQuantity; + this->fromQuantity = (corto_word)exprFromQuantity; } return 0;