Eliot Miranda uploaded a new version of Tests to project The Trunk:
http://source.squeak.org/trunk/Tests-eem.376.mcz ==================== Summary ==================== Name: Tests-eem.376 Author: eem Time: 6 April 2017, 4:06:35.872493 pm UUID: cf795993-c2d9-4443-b1ae-ac421928a96a Ancestors: Tests-eem.375 Make the decompilation tests use the same bytecode set for recompilation as the original method. Make the testMaxLiterals test use the preferred bytecode set's literal limit. =============== Diff against Tests-eem.375 =============== Item was changed: ----- Method: CompilerTest>>testMaxLiterals (in category 'limits') ----- testMaxLiterals "Document the maximum number of literals in a compiled method" | maxLiterals stringThatCanBeCompiled stringWithOneTooManyLiterals | "Why 6? It's rather implementation dependent. But the {... construct is compiled as (Array braceStream: size) nextPut: expr; ...; braceArray where nextPut: is a special selector. So one each for Array binding, #braceStream, #braceArray and the size, one for the selector and one for the methodClass makes 6." + maxLiterals := CompiledCode preferredBytecodeSetEncoderClass new maxNumLiterals - 6. - maxLiterals := thisContext method encoderClass new maxNumLiterals - 6. stringThatCanBeCompiled := '{ ', (String streamContents: [:strm | 1 to: maxLiterals do: [:e | strm nextPutAll: '''', e asString, '''', ' . ']]), '}'. stringWithOneTooManyLiterals := '{ ', (String streamContents: [:strm | 1 to: maxLiterals + 1 do: [:e | strm nextPutAll: '''', e asString, '''', ' . ']]), '}'. self assert: ((1 to: maxLiterals) collect: #printString) equals: (Compiler evaluate: stringThatCanBeCompiled). "If the following test fails, it means that the limit has been raised or eliminated, and this test should be updated to reflect the improvement." self should: [Compiler evaluate: stringWithOneTooManyLiterals] raise: Error. ! Item was changed: ----- Method: DecompilerTests>>checkDecompileMethod: (in category 'utilities') ----- checkDecompileMethod: oldMethod | cls selector oldMethodNode methodNode newMethod oldCodeString newCodeString | cls := oldMethod methodClass. selector := oldMethod selector. oldMethodNode := (cls decompilerClass new withTempNames: oldMethod methodNode schematicTempNamesString) decompile: selector in: cls method: oldMethod methodForDecompile. [oldMethodNode properties includesKey: #warning] whileTrue: [oldMethodNode properties removeKey: #warning]. oldCodeString := oldMethodNode decompileString. + methodNode := [| compiler | + compiler := cls newCompiler. + compiler parser encoderClass: oldMethod encoderClass. + compiler - methodNode := [cls newCompiler compile: oldCodeString in: cls notifying: nil ifFail: []] on: SyntaxErrorNotification do: [:ex| ex errorMessage = 'Cannot store into' ifTrue: [ex return: #badStore]. ex pass]. "Ignore cannot store into block arg errors; they're not our issue." methodNode ~~ #badStore ifTrue: [newMethod := methodNode generate. newCodeString := ((cls decompilerClass new withTempNames: methodNode schematicTempNamesString) decompile: selector in: cls method: newMethod methodForDecompile) decompileString. "(StringHolder new textContents: (TextDiffBuilder buildDisplayPatchFrom: oldCodeString to: newCodeString)) openLabel: 'Decompilation Differences for ', cls name,'>>',selector" "(StringHolder new textContents: (TextDiffBuilder buildDisplayPatchFrom: oldMethod abstractSymbolic to: newMethod abstractSymbolic)) openLabel: 'Bytecode Differences for ', cls name,'>>',selector" self assert: (oldCodeString = newCodeString or: [(Scanner new scanTokens: oldCodeString) = (Scanner new scanTokens: newCodeString)]) description: cls name asString, ' ', selector asString resumable: true]! |
Free forum by Nabble | Edit this page |