The Trunk: Compiler-nice.321.mcz

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

The Trunk: Compiler-nice.321.mcz

commits-2
Nicolas Cellier uploaded a new version of Compiler to project The Trunk:
http://source.squeak.org/trunk/Compiler-nice.321.mcz

==================== Summary ====================

Name: Compiler-nice.321
Author: nice
Time: 3 May 2016, 9:02:56.110078 am
UUID: fd182984-c3ab-4477-bbff-44d9b1744ee3
Ancestors: Compiler-nice.320

Be pedantic: refuse to compile until the user eliminate dead code following a returning if (case when both branches return).
Do this only when interactive, we don't like when Compiler refuses to load legacy code.

=============== Diff against Compiler-nice.320 ===============

Item was changed:
  ----- Method: Parser>>statements:innerBlock:blockNode: (in category 'expression types') -----
  statements: argNodes innerBlock: inner blockNode: theBlockNode
 
  | stmts returns start |
  "give initial comment to block, since others trail statements"
  theBlockNode comment: currentComment.
  currentComment := nil.
  stmts := OrderedCollection new.
  returns := false.
  hereType ~~ #rightBracket ifTrue:
  [[theBlockNode startOfLastStatement: (start := self startOfNextToken).
   (returns := self matchReturn)
  ifTrue:
  [self expression ifFalse:
  [^self expected: 'Expression to return'].
  self addComment.
  stmts addLast: (parseNode isReturningIf
  ifTrue: [parseNode]
  ifFalse: [ReturnNode new
  expr: parseNode
  encoder: encoder
  sourceRange: (start to: self endOfLastToken)])]
  ifFalse:
  [self expression
  ifTrue:
  [self addComment.
+ "if both branches return, following code is unreachable, let's avoid this.
+ But only if interactive, we don't want to prevent loading of legacy code"
+ self interactive ifTrue: [returns := parseNode isReturningIf].
  stmts addLast: parseNode]
  ifFalse:
  [self addComment.
  stmts size = 0 ifTrue:
  [stmts addLast:
  (encoder encodeVariable:
  (inner ifTrue: ['nil'] ifFalse: ['self']))]]].
   returns ifTrue:
  [self match: #period.
  (hereType == #rightBracket or: [hereType == #doIt]) ifFalse:
  [^self expected: 'End of block']].
   returns not and: [self match: #period]] whileTrue].
  theBlockNode
  arguments: argNodes
  statements: stmts
  returns: returns
  from: encoder.
  parseNode := theBlockNode.
  ^true!