Class new title: ParsedBlock subclassof: Stream fields: 'returns' declare: ''; sharing: ByteCodes default [limit _ 1. array _ Vector new: 1. position _ 0. returns _ false] doesReturn [returns _ true] emitExceptLast: t1 on: t2 | t3 [for t3 to: position - 1 do [array  t3 emitForEffect: t1 on: t2]] emitForEffect: t1 on: t2 [returns  [self emitForValue: t1 on: t2. t2 pop: 1] self emitExceptLast: t1 on: t2. array  position emitForEffect: t1 on: t2] emitForTruth: t1 falsity: t2 into: t3 on: t4 [returns  [self emitForValue: t3 on: t4] self emitExceptLast: t3 on: t4. array  position emitForTruth: t1 falsity: t2 into: t3 on: t4] emitForValue: t1 on: t2 [self emitExceptLast: t1 on: t2. array  position emitForValue: t1 on: t2. returns  [t1 next_ toReturn]] findMacros: t1 compilerTemps: t2 | t3 t4 t5 [for t3 to: position do [t4 _ array  t3. (t4 isnt: ParsedAssignment) or (t4 var < codeLoadTemp or t4 var > (codeLoadTemp + 255))  [t4 findMacros: t1 compilerTemps: t2] t5 _ t4 var - codeLoadTemp + 1. t3  (position - 2) and (t4 isForFromToInit: array  (t3 + 1) loop: array  (t3 + 2))  [t1 next_ self. t1 next_ t3. t2  t5 _ true. t4 expr findMacros: t1 compilerTemps: t2. array  (t3 + 1) findMacros: t1 compilerTemps: t2. (array  (t3 + 2)) doExpr findMacros: t1 compilerTemps: t2. t3 _ t3 + 2] t3  (position - 1) and (array  t3 isForFromInit: array  (t3 + 1))  [t1 next_ self. t1 next_ t3. t2  t5 _ true. t4 expr findMacros: t1 compilerTemps: t2. (array  (t3 + 1)) doExpr findMacros: t1 compilerTemps: t2. t3 _ t3 + 1] t4 findMacros: t1 compilerTemps: t2]] firstPush [(array  1) firstPush] insertMacro: t1 decompiler: t2 | t3 t4 t5 [t3 _ ParsedForLoop new block: self loc: t1 decompiler: t2. array  t1 _ t3. t4 _ t3 nStatements. for t5 from: t1 + t4 to: position do [array  t5 - t4 + 1 _ array  t5]. position _ position - t4 + 1] mustReturn: t1 [returns  [] [t1  [position > 0 and (array  position) emitsLoad  [array  position _ toLoadSelf] self next_ toLoadSelf]]. self doesReturn] printon: t1 | t2 [t1 append: '['. for t2 to: position - 1 do [t1 print: array  t2. t1 append: '. ']. [returns  [t1 append: '']]. [position > 0  [t1 print: array  position]]. t1 append: ']'] printon: t1 indent: t2 precedence: t3 forValue: t4 decompiler: t5 | t6 [position = 0  [t1 append: '[]'] t1 append: '['. for t6 to: position - 1 do [array  t6 printon: t1 indent: t2 precedence: 0 forValue: false decompiler: t5. t1 append: '.'. t1 crtab: t2]. [returns  [t1 append: '']]. array  position printon: t1 indent: t2 precedence: 0 forValue: (returns or t4) decompiler: t5. t1 append: ']'] quickCode | t1 t2 [[position = 1 and (returns and [t2 _ array  1. t2 emitsLoad])  [t2 = toLoadSelf  [NoteTaker  [(CompiledMethod new: 2) toReturnSelf] t1 _ String new: 2. t1  1 _ 0. t1  2 _ 1. t1] t2 isField  [NoteTaker  [(CompiledMethod new: 2) toLoadField: (t2 land: 255) + 1] t1 _ String new: 5. t1  1 _ 0. t1  2 _ 40. t1  3 _ 0. t1  4 _ 0. t1  5 _ t2. t1] false]]. false] returns [returns] sizeExceptLast | t1 t2 t3 t4 [t4 _ 0. t2 _ array  position. for t1 to: position - 1 do [t3 _ t2 firstPush. t2 _ array  (position - t1). t4 _ t4 + (t2 sizeForEffect: t3)]. t4] sizeForEffect: t1 [returns  [self sizeForValue] self sizeExceptLast + (array  position sizeForEffect: t1)] sizeForTruth: t1 falsity: t2 [returns  [self sizeForValue] self sizeExceptLast + (array  position sizeForTruth: t1 falsity: t2)] sizeForValue [self sizeExceptLast + (array  position) sizeForValue + [returns  [1] 0]]