From d286893196d08cbe61ff2c80f470d8c0a7f606cf Mon Sep 17 00:00:00 2001 From: dos-reis Date: Sun, 18 Dec 2011 04:29:19 +0000 Subject: * interp/g-opt.boot (removeScope!): New. (optimize!): Call it. (optimizeFunctionDef): Simplify. --- src/interp/g-opt.boot | 28 ++++++++++------------------ src/interp/g-util.boot | 2 +- src/interp/lisp-backend.boot | 1 + 3 files changed, 12 insertions(+), 19 deletions(-) (limited to 'src/interp') diff --git a/src/interp/g-opt.boot b/src/interp/g-opt.boot index 7816eafb..75d358da 100644 --- a/src/interp/g-opt.boot +++ b/src/interp/g-opt.boot @@ -371,14 +371,22 @@ cleanLoop! x == prefixWalk!(x,function f) where xs.first := g(first xs,tag) x +removeScope! x == prefixWalk!(x,function f) where + f x == + x is ['%scope,g,y] => + hasNoLeave?(y,g) => resetTo(x,f y) + x + x + ++ Transform an intermediate form (output of the elaborator) to ++ a lower intermediate form, applying several transformations ++ generaly intended to improve quality and efficiency. optimize! x == x := spliceSeq! packWhen! transformIF! removeLeave! cleanLoop! x changeVariableDefinitionToStore(x,nil) - simplifyVMForm cancelScopeLeave! spliceSeq! packWhen! inlineLocals! - groupTranscients! cancelScopeLeave! removeJunk! reduceXLAM! x + simplifyVMForm removeScope! cancelScopeLeave! spliceSeq! packWhen! + inlineLocals! groupTranscients! cancelScopeLeave! + removeJunk! reduceXLAM! x ++ A non-mutating version of `optimize!'. optimize x == @@ -395,22 +403,6 @@ optimizeFunctionDef(def) == sayBrightlyI bright '"Intermediate VM code:" pp expr - expr.absBody := - removeTopLevelLabel expr.absBody where - removeTopLevelLabel body == - body is ['%scope,g,u] => - removeTopLevelLabel replaceLeaveByReturn(u,g) - body - replaceLeaveByReturn(x,g) == - fn(x,g) - x - fn(x,g) == - x is ['%leave,=g,:u] => - x.first := "RETURN" - x.rest := replaceLeaveByReturn(u,g) - x isnt [.,:.] => nil - replaceLeaveByReturn(first x,g) - replaceLeaveByReturn(rest x,g) [first def,expr] resetTo(x,y) == diff --git a/src/interp/g-util.boot b/src/interp/g-util.boot index 4404d105..bceb53b9 100644 --- a/src/interp/g-util.boot +++ b/src/interp/g-util.boot @@ -55,8 +55,8 @@ abstraction? x == x is [op,:.] and ident? op and abstractionOperator? op hasNoLeave?(expr,g) == + atomic? expr => true expr is ['%leave, =g,:.] => false - expr isnt [.,:.] => true hasNoLeave?(first expr,g) and hasNoLeave?(rest expr,g) mkScope(tag,expr) == diff --git a/src/interp/lisp-backend.boot b/src/interp/lisp-backend.boot index fb1e012b..8dac4ce9 100644 --- a/src/interp/lisp-backend.boot +++ b/src/interp/lisp-backend.boot @@ -649,6 +649,7 @@ for x in [ ['%lambda, :'LAMBDA], ['%exit, :'EXIT], ['%when, :'COND], + ['%scope, :'BLOCK], -- I/O stream functions ['%writeString, :'WRITE_-STRING], -- cgit v1.2.3