Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision
  • anders.blomdell
  • compiler-refactoring
  • labcomm2006
  • labcomm2013
  • labcomm2014
  • master
  • pragma
  • python_sig_hash
  • typedefs
  • typeref
  • v2006.0
  • v2013.0
  • v2014.0
  • v2014.1
  • v2014.2
  • v2014.3
  • v2014.4
  • v2014.5
  • v2014.6
  • v2015.0
20 results

Target

Select target project
  • anders_blomdell/labcomm
  • klaren/labcomm
  • tommyo/labcomm
  • erikj/labcomm
  • sven/labcomm
5 results
Select Git revision
  • anders.blomdell
  • compiler-refactoring
  • labcomm2006
  • labcomm2013
  • master
  • pragma
  • typedefs
  • typeref
  • v2006.0
  • v2013.0
  • v2014.0
  • v2014.1
  • v2014.2
  • v2014.3
  • v2014.4
15 results
Show changes
#!/usr/bin/python #!/usr/bin/python
import argparse
import re import re
import sys import sys
...@@ -13,7 +14,13 @@ def split_match(pattern, multiline): ...@@ -13,7 +14,13 @@ def split_match(pattern, multiline):
if __name__ == '__main__': if __name__ == '__main__':
f = open(sys.argv[1]) parser = argparse.ArgumentParser(description='Generate C test relay.')
parser.add_argument('--renaming', action='store_true')
parser.add_argument('typeinfo', help='typeinfo file')
options = parser.parse_args(sys.argv[1:])
f = open(options.typeinfo)
sample = [] sample = []
for l in map(lambda s: s.strip(), f): for l in map(lambda s: s.strip(), f):
lang,kind,func,arg,stype = l[1:].split(l[0]) lang,kind,func,arg,stype = l[1:].split(l[0])
...@@ -27,12 +34,22 @@ if __name__ == '__main__': ...@@ -27,12 +34,22 @@ if __name__ == '__main__':
|#include <sys/types.h> |#include <sys/types.h>
|#include <sys/stat.h> |#include <sys/stat.h>
|#include <fcntl.h> |#include <fcntl.h>
|#include <stdio.h>
|#include <errno.h>
|#include <labcomm2014.h> |#include <labcomm2014.h>
|#include <labcomm2014_default_error_handler.h> |#include <labcomm2014_default_error_handler.h>
|#include <labcomm2014_default_memory.h> |#include <labcomm2014_default_memory.h>
|#include <labcomm2014_default_scheduler.h> |#include <labcomm2014_default_scheduler.h>
|#include <labcomm2014_fd_reader.h> |#include <labcomm2014_fd_reader.h>
|#include <labcomm2014_fd_writer.h> |#include <labcomm2014_fd_writer.h>
"""))
if options.renaming:
result.extend(split_match('^[^|]*\|(.*)$', """
|#include "labcomm2014_renaming.h"
|#include "labcomm2014_renaming_encoder.h"
|#include "labcomm2014_renaming_decoder.h"
"""))
result.extend(split_match('^[^|]*\|(.*)$', """
|#include "c_code.h" |#include "c_code.h"
""")) """))
for func,arg,stype in sample: for func,arg,stype in sample:
...@@ -45,26 +62,64 @@ if __name__ == '__main__': ...@@ -45,26 +62,64 @@ if __name__ == '__main__':
pass pass
result.extend(split_match('^[^|]*\|(.*)$', """ result.extend(split_match('^[^|]*\|(.*)$', """
|int main(int argc, char *argv[]) { |int main(int argc, char *argv[]) {
| struct labcomm2014_encoder *e; | struct labcomm2014_encoder *e, *e_e;
| struct labcomm2014_decoder *d; | struct labcomm2014_decoder *d, *d_d;
| int in, out; """))
if options.renaming:
result.extend(split_match('^[^|]*\|(.*)$', """
| struct labcomm2014_renaming_registry *registry;
| struct labcomm2014_encoder *e_p, *e_s;
| struct labcomm2014_decoder *d_p, *d_s;
"""))
result.extend(split_match('^[^|]*\|(.*)$', """
| int in, out, result;
| |
| if (argc < 3) { return 1; } | if (argc < 3) { return 1; }
| in = open(argv[1], O_RDONLY); | in = open(argv[1], O_RDONLY);
| if (in < 0) { return 1; } | if (in < 0) { return 1; }
| out = open(argv[2], O_WRONLY); | out = open(argv[2], O_WRONLY);
| if (out < 0) { return 1; } | if (out < 0) { return 1; }
| e = labcomm2014_encoder_new(labcomm2014_fd_writer_new( | e_e = labcomm2014_encoder_new(labcomm2014_fd_writer_new(
| labcomm2014_default_memory, out, 1), | labcomm2014_default_memory, out, 1),
| labcomm2014_default_error_handler, | labcomm2014_default_error_handler,
| labcomm2014_default_memory, | labcomm2014_default_memory,
| labcomm2014_default_scheduler); | labcomm2014_default_scheduler);
| d = labcomm2014_decoder_new(labcomm2014_fd_reader_new( | d_d = labcomm2014_decoder_new(labcomm2014_fd_reader_new(
| labcomm2014_default_memory, in, 1), | labcomm2014_default_memory, in, 1),
| labcomm2014_default_error_handler, | labcomm2014_default_error_handler,
| labcomm2014_default_memory, | labcomm2014_default_memory,
| labcomm2014_default_scheduler); | labcomm2014_default_scheduler);
""")) """))
if not options.renaming:
result.extend(split_match('^[^|]*\|(.*)$', """
| e = e_e;
| d = d_d;
"""))
else:
result.extend(split_match('^[^|]*\|(.*)$', """
| registry = labcomm2014_renaming_registry_new(
| labcomm2014_default_error_handler,
| labcomm2014_default_memory,
| labcomm2014_default_scheduler);
| e_p = labcomm2014_renaming_encoder_new(e_e,
| registry,
| labcomm2014_renaming_prefix,
| "prefix:");
| e_s = labcomm2014_renaming_encoder_new(e_p,
| registry,
| labcomm2014_renaming_suffix,
| ":suffix");
| e = e_s;
| d_p = labcomm2014_renaming_decoder_new(d_d,
| registry,
| labcomm2014_renaming_prefix,
| "prefix:");
| d_s = labcomm2014_renaming_decoder_new(d_p,
| registry,
| labcomm2014_renaming_suffix,
| ":suffix");
| d = d_s;
"""))
for func,arg,stype in sample: for func,arg,stype in sample:
result.extend(split_match('^[^|]*\|(.*)$', """ result.extend(split_match('^[^|]*\|(.*)$', """
| labcomm2014_encoder_register_%(func)s(e); | labcomm2014_encoder_register_%(func)s(e);
...@@ -73,8 +128,23 @@ if __name__ == '__main__': ...@@ -73,8 +128,23 @@ if __name__ == '__main__':
| labcomm2014_decoder_sample_ref_register(d, labcomm2014_signature_%(func)s); | labcomm2014_decoder_sample_ref_register(d, labcomm2014_signature_%(func)s);
""" % { 'func': func, 'arg': arg })) """ % { 'func': func, 'arg': arg }))
result.extend(split_match('^[^|]*\|(.*)$', """ result.extend(split_match('^[^|]*\|(.*)$', """
| labcomm2014_decoder_run(d); | while ((result = labcomm2014_decoder_decode_one(d)) > 0) {};
| return 0; """))
if options.renaming:
result.extend(split_match('^[^|]*\|(.*)$', """
| labcomm2014_decoder_free(d_s);
| labcomm2014_decoder_free(d_p);
| labcomm2014_encoder_free(e_s);
| labcomm2014_encoder_free(e_p);
| labcomm2014_renaming_registry_free(registry);
"""))
result.extend(split_match('^[^|]*\|(.*)$', """
| labcomm2014_decoder_free(d_d);
| labcomm2014_encoder_free(e_e);
| if (result == 0) return 0;
| if (result == -EPIPE) return 0;
| fprintf(stderr, "Failed with %d", result);
| return 1;
|} |}
""")) """))
print "\n".join(result) print "\n".join(result)
......
#!/usr/bin/python #!/usr/bin/python
import argparse
import re import re
import sys import sys
import random import random
...@@ -18,7 +19,13 @@ def shuffle(l): ...@@ -18,7 +19,13 @@ def shuffle(l):
return result return result
if __name__ == '__main__': if __name__ == '__main__':
f = open(sys.argv[1]) parser = argparse.ArgumentParser(description='Generate C test relay.')
parser.add_argument('--renaming', action='store_true')
parser.add_argument('typeinfo', help='typeinfo file')
options = parser.parse_args(sys.argv[1:])
f = open(options.typeinfo)
sample = [] sample = []
for l in map(lambda s: s.strip(), f): for l in map(lambda s: s.strip(), f):
lang,kind,func,arg,dummy = l[1:].split(l[0]) lang,kind,func,arg,dummy = l[1:].split(l[0])
...@@ -40,7 +47,9 @@ if __name__ == '__main__': ...@@ -40,7 +47,9 @@ if __name__ == '__main__':
result.append(' %s.Handler' % sample[-1][0]) result.append(' %s.Handler' % sample[-1][0])
result.extend(split_match('^[^|]*\|(.*)$', """ result.extend(split_match('^[^|]*\|(.*)$', """
|{ |{
| EncoderChannel encoder; | Encoder encoder;
| Decoder decoder;
|
""")) """))
for func,arg in sample: for func,arg in sample:
if arg == 'void': if arg == 'void':
...@@ -63,13 +72,22 @@ if __name__ == '__main__': ...@@ -63,13 +72,22 @@ if __name__ == '__main__':
| FileStream InFile = new FileStream(InName, | FileStream InFile = new FileStream(InName,
| FileMode.Open, | FileMode.Open,
| FileAccess.Read); | FileAccess.Read);
| DecoderChannel decoder = new DecoderChannel(InFile); | decoder = new DecoderChannel(InFile);
| FileStream OutFile = new FileStream(OutName, | FileStream OutFile = new FileStream(OutName,
| FileMode.OpenOrCreate, | FileMode.OpenOrCreate,
| FileAccess.Write); | FileAccess.Write);
| encoder = new EncoderChannel(OutFile); | encoder = new EncoderChannel(OutFile);
|
""")) """))
if options.renaming:
result.extend(split_match('^[^|]*\|(.*)$', """
| RenamingRegistry registry = new RenamingRegistry();
| decoder = new RenamingDecoder(
| decoder, registry, s => "prefix:" + s + ":suffix");
| encoder = new RenamingEncoder(
| encoder, registry, s => "prefix:" + s + ":suffix");
"""))
for func,arg in shuffle(sample): for func,arg in shuffle(sample):
result.append(' %s.register(decoder, this);' % func) result.append(' %s.register(decoder, this);' % func)
pass pass
......
...@@ -179,7 +179,7 @@ class Test: ...@@ -179,7 +179,7 @@ class Test:
if p.poll() != None: if p.poll() != None:
print>>sys.stderr, "Failed with:", p.poll() print>>sys.stderr, "Failed with:", p.poll()
self.failed = True self.failed = True
elif value != self.received_value: elif value != self.received_value or decl != self.received_decl:
print>>sys.stderr, "Coding error" print>>sys.stderr, "Coding error"
print>>sys.stderr, value == self.received_value print>>sys.stderr, value == self.received_value
print>>sys.stderr, "Got: ", self.received_value print>>sys.stderr, "Got: ", self.received_value
......
#!/usr/bin/python
# -*- coding: utf-8 -*-
import argparse
import imp
import labcomm2014
import math
import os
import re
import struct
import subprocess
import sys
import threading
def labcomm_compile(lc, name, args):
for lang in [ 'c', 'csharp', 'java', 'python']:
destdir = 'gen/%s/%s' % (name, lang)
if not os.path.exists(destdir):
os.makedirs(destdir)
pass
pass
cmd = args.labcomm.split() + [
"--c=gen/%s/c/%s.c" % (name, name),
"--h=gen/%s/c/%s.h" % (name, name),
"--cs=gen/%s/csharp/%s.cs" % (name, name),
"--python=gen/%s/python/%s.py" % (name, name),
"--java=gen/%s/java/" % name,
"--typeinfo=gen/%s/%s.typeinfo" % (name, name),
lc]
subprocess.check_call(cmd)
pass
def get_signatures(path):
fp, pathname, description = imp.find_module(os.path.basename(path)[0:-3],
[ os.path.dirname(path) ])
with fp as fp:
m = imp.load_module('signatures', fp, pathname, description)
pass
return map(lambda s: s.signature, m.sample)
class Test:
def __init__(self, program, signatures):
self.program = program
self.signatures = map(lambda s: s.rename('prefix:%s:suffix' % s.name),
signatures)
pass
def generate(self, decl):
if decl.__class__ == labcomm2014.sample:
result = []
for values in self.generate(decl.decl):
result.append((decl, values))
return result
elif decl.__class__ == labcomm2014.typedef:
result = []
for values in self.generate(decl.decl):
result.append(values)
return result
elif decl.__class__ == labcomm2014.struct:
result = []
if len(decl.field) == 0:
result.append({})
else:
values1 = self.generate(decl.field[0][1])
values2 = self.generate(labcomm2014.struct(decl.field[1:]))
for v1 in values1:
for v2 in values2:
v = dict(v2)
v[decl.field[0][0]] = v1
result.append(v)
return result
elif decl.__class__ == labcomm2014.array:
if len(decl.indices) == 1:
values = self.generate(decl.decl)
if decl.indices[0] == 0:
lengths = [0, 1, 2]
else:
lengths = [ decl.indices[0] ]
else:
values = self.generate(labcomm2014.array(decl.indices[1:],
decl.decl))
if decl.indices[0] == 0:
lengths = [1, 2]
else:
lengths = [ decl.indices[0] ]
result = []
for v in values:
for i in lengths:
element = []
for j in range(i):
element.append(v)
result.append(element)
return result
elif decl.__class__ == labcomm2014.BOOLEAN:
return [False, True]
elif decl.__class__ == labcomm2014.BYTE:
return [0, 127, 128, 255]
elif decl.__class__ == labcomm2014.SHORT:
return [-32768, 0, 32767]
elif decl.__class__ == labcomm2014.INTEGER:
return [-2147483648, 0, 2147483647]
elif decl.__class__ == labcomm2014.LONG:
return [-9223372036854775808, 0, 9223372036854775807]
elif decl.__class__ == labcomm2014.FLOAT:
def tofloat(v):
return struct.unpack('f', struct.pack('f', v))[0]
return [tofloat(-math.pi), 0.0, tofloat(math.pi)]
elif decl.__class__ == labcomm2014.DOUBLE:
return [-math.pi, 0.0, math.pi]
elif decl.__class__ == labcomm2014.STRING:
return ['string', u'sträng' ]
elif decl.__class__ == labcomm2014.SAMPLE:
return self.signatures
print>>sys.stderr, decl
raise Exception("unhandled decl %s" % decl.__class__)
def uses_refs(self, decls):
for decl in decls:
if decl.__class__ == labcomm2014.sample:
if self.uses_refs([ decl.decl ]):
return True
elif decl.__class__ == labcomm2014.struct:
if self.uses_refs([ d for n,d in decl.field ]):
return True
elif decl.__class__ == labcomm2014.array:
if self.uses_refs([ decl.decl ]):
return True
elif decl.__class__ == labcomm2014.SAMPLE:
return True
return False
def run(self):
print>>sys.stderr, 'Testing', self.program
p = subprocess.Popen(self.program,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=sys.stderr)
self.expected = None
self.failed = False
self.next = threading.Condition()
decoder = threading.Thread(target=self.decode, args=(p.stdout,))
decoder.start()
encoder = labcomm2014.Encoder(labcomm2014.StreamWriter(p.stdin))
for signature in self.signatures:
encoder.add_decl(signature)
pass
if self.uses_refs(self.signatures):
for signature in self.signatures:
encoder.add_ref(signature)
for signature in self.signatures:
print>>sys.stderr, "Checking", signature.name,
for decl,value in self.generate(signature):
sys.stderr.write('.')
self.next.acquire()
self.received_value = None
self.received_decl = None
encoder.encode(value, decl)
self.next.wait(2)
self.next.release()
if p.poll() != None:
print>>sys.stderr, "Failed with:", p.poll()
self.failed = True
elif value != self.received_value or decl != self.received_decl:
print>>sys.stderr, "Coding error"
print>>sys.stderr, value == self.received_value
print>>sys.stderr, "Got: ", self.received_value
print>>sys.stderr, " ", self.received_decl
print>>sys.stderr, "Expected:", value
print>>sys.stderr, " ", decl
self.failed = True
if self.failed:
if p.poll() == None:
p.terminate()
exit(1)
pass
print>>sys.stderr
pass
p.stdin.close()
if p.wait() != 0:
exit(1)
pass
pass
def decode(self, f):
decoder = labcomm2014.Decoder(labcomm2014.StreamReader(f))
try:
while True:
value,decl = decoder.decode()
if value != None:
self.next.acquire()
self.received_value = value
self.received_decl = decl
self.expected = None
self.next.notify_all()
self.next.release()
pass
pass
except EOFError:
pass
pass
pass
def run(test, signatures):
t = Test(test, signatures)
t.run()
pass
if __name__ == "__main__":
parser = argparse.ArgumentParser(description='Run encoding test.')
class test_action(argparse.Action):
def __call__(self, parser, namespace, values, option_string=None):
old = list(getattr(namespace, self.dest))
def strip_slash(s):
if s.startswith('\\'):
return s[1:]
return s
old.append(map(strip_slash, values))
setattr(namespace, self.dest, old)
parser.add_argument('--signatures')
parser.add_argument('--test', nargs='*', action=test_action, default=[])
args = parser.parse_args()
signatures = get_signatures(args.signatures)
for test in args.test:
run(test, signatures)
exit(0)
for lc in args.lc:
run(lc, args)
pass
pass