review and merge zahary's work (#5849)

* proper indentation for the generated JS code
* improved dead-code elimination for JavaScript
* test the JS dead-code elimination

A new test spec has been added - "maxcodesize". It specifies the
maximum size of the generated code in bytes.
This commit is contained in:
zah 2017-06-03 13:45:10 +03:00 • committed by Andreas Rumpf
commit 39aef12446
7 changed files with 308 additions and 187 deletions

View file

@ -52,6 +52,7 @@ type
exitCode*: int
msg*: string
ccodeCheck*: string
maxCodeSize*: int
err*: TResultEnum
substr*, sortoutput*: bool
targets*: set[TTarget]
@ -109,6 +110,7 @@ proc specDefaults*(result: var TSpec) =
result.tfile = ""
result.tline = 0
result.tcolumn = 0
result.maxCodeSize = 0
proc parseTargets*(value: string): set[TTarget] =
for v in value.normalize.split:
@ -180,6 +182,7 @@ proc parseSpec*(filename: string): TSpec =
else:
result.cmd = e.value
of "ccodecheck": result.ccodeCheck = e.value
of "maxcodesize": discard parseInt(e.value, result.maxCodeSize)
of "target", "targets":
for v in e.value.normalize.split:
case v

View file

@ -212,20 +212,31 @@ proc cmpMsgs(r: var TResults, expected, given: TSpec, test: TTest) =
proc generatedFile(path, name: string, target: TTarget): string =
let ext = targetToExt[target]
result = path / "nimcache" /
(if target == targetJS: path.splitPath.tail & "_" else: "compiler_") &
(if target == targetJS: "" else: "compiler_") &
name.changeFileExt(ext)
proc codegenCheck(test: TTest, check: string, given: var TSpec) =
proc needsCodegenCheck(spec: TSpec): bool =
result = spec.maxCodeSize > 0 or spec.ccodeCheck.len > 0
proc codegenCheck(test: TTest, spec: TSpec, expectedMsg: var string,
given: var TSpec) =
try:
let (path, name, _) = test.name.splitFile
let genFile = generatedFile(path, name, test.target)
let contents = readFile(genFile).string
if check[0] == '\\':
# little hack to get 'match' support:
if not contents.match(check.peg):
let check = spec.ccodeCheck
if check.len > 0:
if check[0] == '\\':
# little hack to get 'match' support:
if not contents.match(check.peg):
given.err = reCodegenFailure
elif contents.find(check.peg) < 0:
given.err = reCodegenFailure
elif contents.find(check.peg) < 0:
expectedMsg = check
if spec.maxCodeSize > 0 and contents.len > spec.maxCodeSize:
given.err = reCodegenFailure
given.msg = "generated code size: " & $contents.len
expectedMsg = "max allowed size: " & $spec.maxCodeSize
except ValueError:
given.err = reInvalidPeg
echo getCurrentExceptionMsg()
@ -248,9 +259,8 @@ proc compilerOutputTests(test: TTest, given: var TSpec, expected: TSpec;
var expectedmsg: string = ""
var givenmsg: string = ""
if given.err == reSuccess:
if expected.ccodeCheck.len > 0:
codegenCheck(test, expected.ccodeCheck, given)
expectedmsg = expected.ccodeCheck
if expected.needsCodegenCheck:
codegenCheck(test, expected, expectedmsg, given)
givenmsg = given.msg
if expected.nimout.len > 0:
expectedmsg = expected.nimout