Bug 636063, part 1: Frontend support for |compress|d messages. r=bent

This commit is contained in:
Chris Jones 2012-08-25 01:25:08 -07:00
parent 3e50bbc9d9
commit 6da49bb1b7
8 changed files with 54 additions and 3 deletions

View File

@ -315,6 +315,7 @@ class MessageDecl(Node):
self.direction = None
self.inParams = [ ]
self.outParams = [ ]
self.compress = ''
def addInParams(self, inParamsList):
self.inParams += inParamsList

View File

@ -121,6 +121,7 @@ reserved = set((
'bridges',
'call',
'child',
'compress',
'__delete__',
'delete', # reserve 'delete' to prevent its use
'goto',
@ -484,13 +485,15 @@ def p_MessageDecl(p):
p[0] = msg
def p_MessageBody(p):
"""MessageBody : MessageId MessageInParams MessageOutParams"""
"""MessageBody : MessageId MessageInParams MessageOutParams OptionalMessageCompress"""
# FIXME/cjones: need better loc info: use one of the quals
loc, name = p[1]
msg = MessageDecl(loc)
msg.name = name
msg.addInParams(p[2])
msg.addOutParams(p[3])
msg.compress = p[4]
p[0] = msg
def p_MessageId(p):
@ -517,6 +520,14 @@ def p_MessageOutParams(p):
else:
p[0] = p[3]
def p_OptionalMessageCompress(p):
"""OptionalMessageCompress : COMPRESS
| """
if 1 == len(p):
p[0] = ''
else:
p[0] = 'compress'
##--------------------
## State machine

View File

@ -228,7 +228,7 @@ class StateType(IPDLType):
class MessageType(IPDLType):
def __init__(self, sendSemantics, direction,
ctor=False, dtor=False, cdtype=None):
ctor=False, dtor=False, cdtype=None, compress=False):
assert not (ctor and dtor)
assert not (ctor or dtor) or type is not None
@ -239,6 +239,7 @@ class MessageType(IPDLType):
self.ctor = ctor
self.dtor = dtor
self.cdtype = cdtype
self.compress = compress
def isMessage(self): return True
def isCtor(self): return self.ctor
@ -1068,7 +1069,8 @@ class GatherDecls(TcheckVisitor):
self.symtab.enterScope(md)
msgtype = MessageType(md.sendSemantics, md.direction,
ctor=isctor, dtor=isdtor, cdtype=cdtype)
ctor=isctor, dtor=isdtor, cdtype=cdtype,
compress=(md.compress == 'compress'))
# replace inparam Param nodes with proper Decls
def paramToDecl(param):
@ -1458,6 +1460,13 @@ class CheckTypes(TcheckVisitor):
"asynchronous message `%s' declares return values",
mname)
if (mtype.compress and
(not mtype.isAsync() or mtype.isCtor() or mtype.isDtor())):
self.error(
loc,
"message `%s' in protocol `%s' requests compression but is not async or is special (ctor or dtor)",
mname[:-len('constructor')], pname)
if mtype.isCtor() and not ptype.isManagerOf(mtype.constructedType()):
self.error(
loc,

View File

@ -0,0 +1,8 @@
include protocol compressCtorManagee;
rpc protocol compressCtor {
manages compressCtorManagee;
parent:
async compressCtorManagee() compress;
};

View File

@ -0,0 +1,8 @@
include protocol compressCtor;
rpc protocol compressCtorManagee {
manager compressCtor;
child:
async __delete__() compress;
};

View File

@ -0,0 +1,6 @@
rpc protocol rpcMessageCompress {
parent:
rpc foo() compress;
child:
rpc bar() compress;
};

View File

@ -0,0 +1,4 @@
sync protocol syncMessageCompress {
parent:
sync foo() compress;
};

View File

@ -0,0 +1,4 @@
rpc protocol messageCompress {
child:
async foo() compress;
};