--- lexxer.l | 1 + parser.h | 1 + parser.y | 17 +++++++++++++++++ type.c | 10 +++++++++- type.h | 2 ++ 5 files changed, 30 insertions(+), 1 deletion(-)
diff --git a/lexxer.l b/lexxer.l index 5f2f61e..7ff5677 100644 --- a/lexxer.l +++ b/lexxer.l @@ -138,6 +138,7 @@ static void doSharp(const char *body); /* process body of # directives */ <Normal>[Ss][Kk][Ii][Pp] RETURN(sySkip); <Normal>[Ss][Tt][Rr][Uu][Cc][Tt] RETURN(syStruct); <Normal>[Ii][Nn][Tt][Rr][Aa][Nn] RETURN(syInTran); +<Normal>[Ii][Nn][Tt][Rr][Aa][Nn][Pp][Aa][Yy][Ll][Oo][Aa][Dd] RETURN(syInTranPayload); <Normal>[Oo][Uu][Tt][Tt][Rr][Aa][Nn] RETURN(syOutTran); <Normal>[Dd][Ee][Ss][Tt][Rr][Uu][Cc][Tt][Oo][Rr] RETURN(syDestructor); <Normal>[Cc][Tt][Yy][Pp][Ee] RETURN(syCType); diff --git a/parser.h b/parser.h index 651b66e..96e9b5d 100644 --- a/parser.h +++ b/parser.h @@ -82,6 +82,7 @@ typedef union #define syQString 319 #define syFileName 320 #define syIPCFlag 321 +#define syInTranPayload 322 extern YYSTYPE yylval; diff --git a/parser.y b/parser.y index a916cb3..e88fd22 100644 --- a/parser.y +++ b/parser.y @@ -98,6 +98,8 @@ %token <string> syFileName %token <flag> syIPCFlag +%token syInTranPayload + %left syPlus syMinus %left syStar syDiv @@ -365,6 +367,21 @@ TransTypeSpec : TypeSpec $$->itServerType, $7); $$->itServerType = $7; } + | TransTypeSpec syInTranPayload syColon + syIdentifier syIdentifier +{ + $$ = $1; + + if (($$->itTransType != strNULL) && !streql($$->itTransType, $4)) + warn("conflicting translation types (%s, %s)", + $$->itTransType, $4); + $$->itTransType = $4; + + if (($$->itInTransPayload != strNULL) && !streql($$->itInTransPayload, $5)) + warn("conflicting in-translation functions (%s, %s)", + $$->itInTransPayload, $5); + $$->itInTransPayload = $5; +} | TransTypeSpec syOutTran syColon syIdentifier syIdentifier syLParen syIdentifier syRParen { diff --git a/type.c b/type.c index 3078dab..7565f34 100644 --- a/type.c +++ b/type.c @@ -118,6 +118,7 @@ itAlloc(void) strNULL, /* identifier_t itServerType */ strNULL, /* identifier_t itTransType */ strNULL, /* identifier_t itInTrans */ + strNULL, /* identifier_t itInTransPayload */ strNULL, /* identifier_t itOutTrans */ strNULL, /* identifier_t itDestructor */ }; @@ -376,7 +377,9 @@ itCheckDecl(identifier_t name, ipc_type_t *it) limitations in Mig */ if (it->itVarArray) { - if ((it->itInTrans != strNULL) || (it->itOutTrans != strNULL)) + if ((it->itInTrans != strNULL) || + (it->itInTransPayload != strNULL) || + (it->itOutTrans != strNULL)) error("%s: can't translate variable-sized arrays", name); if (it->itDestructor != strNULL) @@ -419,6 +422,10 @@ itPrintTrans(const ipc_type_t *it) printf("\tInTran:\t\t%s %s(%s)\n", it->itTransType, it->itInTrans, it->itServerType); + if (it->itInTransPayload != strNULL) + printf("\tInTranPayload:\t\t%s %s\n", + it->itTransType, it->itInTransPayload); + if (it->itOutTrans != strNULL) printf("\tOutTran:\t%s %s(%s)\n", it->itServerType, it->itOutTrans, it->itTransType); @@ -556,6 +563,7 @@ itResetType(ipc_type_t *old) /* reset all special translation/destruction/type info */ old->itInTrans = strNULL; + old->itInTransPayload = strNULL; old->itOutTrans = strNULL; old->itDestructor = strNULL; old->itUserType = strNULL; diff --git a/type.h b/type.h index f199059..50de063 100644 --- a/type.h +++ b/type.h @@ -107,6 +107,7 @@ typedef enum dealloc { * cusertype: itUserType * cservertype: itServerType * intran: itTransType itInTrans(itServerType) + * intranpayload: itTransType itInTransPayload * outtran: itServerType itOutTrans(itTransType) * destructor: itDestructor(itTransType); * @@ -165,6 +166,7 @@ typedef struct ipc_type identifier_t itTransType; identifier_t itInTrans; /* may be NULL */ + identifier_t itInTransPayload; /* may be NULL */ identifier_t itOutTrans; /* may be NULL */ identifier_t itDestructor; /* may be NULL */ } ipc_type_t; -- 1.7.10.4