From 8f5399e77de0741651b0d058b1aa7f57f43aedb0 Mon Sep 17 00:00:00 2001 From: dos-reis Date: Thu, 27 May 2010 05:43:57 +0000 Subject: * interp/i-map.boot (compileCoerceMap): Minivectors are global variables. Generate appropriate code. * interp/i-spec1.boot (compileTargetedADEF): Likewise. (compileADEFBody): Likewise. * interp/slam.boot (isRecurrenceRelation): Likewise. Adjust patterns to match minivectors. (mkDiffAssoc): Likewise. (reportFunctionCompilation): Don't declare minivectors. --- src/ChangeLog | 11 +++++++++++ src/interp/i-map.boot | 12 ++++++------ src/interp/i-spec1.boot | 8 +++----- src/interp/slam.boot | 37 ++++++++++++++++++++----------------- 4 files changed, 40 insertions(+), 28 deletions(-) (limited to 'src') diff --git a/src/ChangeLog b/src/ChangeLog index c24c65b3..75a8470a 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,14 @@ +2010-05-27 Gabriel Dos Reis + + * interp/i-map.boot (compileCoerceMap): Minivectors are global + variables. Generate appropriate code. + * interp/i-spec1.boot (compileTargetedADEF): Likewise. + (compileADEFBody): Likewise. + * interp/slam.boot (isRecurrenceRelation): Likewise. Adjust + patterns to match minivectors. + (mkDiffAssoc): Likewise. + (reportFunctionCompilation): Don't declare minivectors. + 2010-05-26 Gabriel Dos Reis * interp/slam.boot (compileRecurrenceRelation): Generate code to diff --git a/src/interp/i-map.boot b/src/interp/i-map.boot index ab24945f..713f32d2 100644 --- a/src/interp/i-map.boot +++ b/src/interp/i-map.boot @@ -763,16 +763,16 @@ compileCoerceMap(op,argTypes,mm) == name:= makeLocalModemap(op,[first sig,:argTypes]) argCode := [objVal(coerceInteractive(objNew(arg,t1),t2) or throwKeyedMsg("S2IC0001",[arg,$mapName,t1,t2])) - for t1 in argTypes for t2 in rest sig for arg in parms] + for t1 in argTypes for t2 in sig.source for arg in parms] $insideCompileBodyIfTrue := false parms:= [:parms,'envArg] body := ['SPADCALL,:argCode,['LIST,['function,imp]]] - minivectorName := makeInternalMapMinivectorName(name) - body := declareUnusedParameters(parms,substitute(minivectorName,"$$$",body)) + minivectorName := makeInternalMapMinivectorName name + body := substitute(["%dynval",MKQ minivectorName],"$$$",body) setDynamicBinding(minivectorName,LIST2VEC $minivector) - compileInteractive - [name,['LAMBDA,parms,declareGlobalVariables [minivectorName],:body]] - first sig + compileInteractive + [name,['LAMBDA,parms,:declareUnusedParameters(parms,body)]] + sig.target depthOfRecursion(opName,body) == -- returns the "depth" of recursive calls of opName in body diff --git a/src/interp/i-spec1.boot b/src/interp/i-spec1.boot index 2b3b5ba3..4164d514 100644 --- a/src/interp/i-spec1.boot +++ b/src/interp/i-spec1.boot @@ -153,8 +153,8 @@ compileTargetedADEF(t,vars,types,body) == compileADEFBody(t,vars,types,body,computedResultType) == --+ $compiledOpNameList := [$mapName] - minivectorName := makeInternalMapMinivectorName(PNAME $mapName) - body := substitute(minivectorName,"$$$",body) + minivectorName := makeInternalMapMinivectorName PNAME $mapName + body := substitute(["%dynval",MKQ minivectorName],"$$$",body) setDynamicBinding(minivectorName,LIST2VEC $minivector) -- The use of the three variables $definingMap, $genValue and $compilingMap @@ -177,9 +177,7 @@ compileADEFBody(t,vars,types,body,computedResultType) == -- MCD 13/3/96 parms := [:vars,"envArg"] if not $definingMap and ($genValue or $compilingMap) then - fun := [$mapName,["LAMBDA",parms, - declareGlobalVariables [minivectorName], - :declareUnusedParameters(parms,body)]] + fun := [$mapName,["LAMBDA",parms,:declareUnusedParameters(parms,body)]] code := wrap compileInteractive fun else $freeVariables: local := [] diff --git a/src/interp/slam.boot b/src/interp/slam.boot index 3da6c906..3c94696e 100644 --- a/src/interp/slam.boot +++ b/src/interp/slam.boot @@ -60,11 +60,12 @@ isRecurrenceRelation(op,body,minivectorName) == lesspSlot:=compiledLookupCheck("<",[$Boolean,"$","$"],integer) notpSlot:= compiledLookupCheck("not",["$","$"],eval $Boolean) for [p,c] in pcl repeat - p is ['SPADCALL,sharpVar,n1,['ELT,=minivectorName,slot]] - and EQ(iequalSlot,$minivector.slot) => - initList:= [[n1,:c],:initList] - sharpList := insert(sharpVar,sharpList) - n:=n1 + p is ['SPADCALL,sharpVar,n1, + ["ELT",["%dynval",=MKQ minivectorName],slot]] + and EQ(iequalSlot,$minivector.slot) => + initList:= [[n1,:c],:initList] + sharpList := insert(sharpVar,sharpList) + n:=n1 miscList:= [[p,c],:miscList] miscList isnt [[generalPred,generalTerm]] or sharpList isnt [sharpArg] => return false @@ -86,14 +87,17 @@ isRecurrenceRelation(op,body,minivectorName) == --Check general predicate predOk := generalPred is '(QUOTE T) => true - generalPred is ['SPADCALL,m,=sharpArg,['ELT,=minivectorName,slot]] - and EQ(lesspSlot,$minivector.slot)=> m+1 + generalPred is ['SPADCALL,m,=sharpArg, + ["ELT",["%dynval",=MKQ minivectorName],slot]] + and EQ(lesspSlot,$minivector.slot)=> m+1 generalPred is ['SPADCALL,['SPADCALL,=sharpArg,m, - ['ELT,=minivectorName,slot]], ['ELT,=minivectorName,notSlot]] - and EQ(lesspSlot,$minivector.slot) - and EQ(notpSlot,$minivector.notSlot) => m - generalPred is ['NOT,['SPADCALL,=sharpArg,m,['ELT,=minivectorName, =lesspSlot]]] - and EQ(lesspSlot,$minivector.slot) => m + ["ELT",["%dynval",=MKQ minivectorName],slot]], + ["ELT",["%dynval",=MKQ minivectorName],notSlot]] + and EQ(lesspSlot,$minivector.slot) + and EQ(notpSlot,$minivector.notSlot) => m + generalPred is ['NOT,['SPADCALL,=sharpArg,m, + ["ELT",["%dynval",=MKQ minivectorName], =lesspSlot]]] + and EQ(lesspSlot,$minivector.slot) => m return nil integer? predOk and predOk ~= n => sayKeyedMsg("S2IX0006",[n,m]) @@ -125,7 +129,7 @@ mkDiffAssoc(op,body,k,sharpPosition,sharpArg,diffSlot,vecname) == "union"/[mkDiffAssoc(op,c,k,sharpPosition,sharpArg,diffSlot,vecname) for [p,c] in pl] body is [fn,:argl] => (fn = op) and argl.(sharpPosition-1) is - ['SPADCALL,=sharpArg,n,['ELT,=vecname,=diffSlot]] => + ['SPADCALL,=sharpArg,n,["ELT",["%dynval",=MKQ vecname],=diffSlot]] => NUMP n and n > 0 and n <= k => [[body,:$TriangleVariableList.n]] ['$failed] @@ -137,8 +141,8 @@ reportFunctionCompilation(op,nam,argl,body,isRecursive) == -- dynamic caching, see SLAMOLD BOOT --+ $compiledOpNameList := [nam] - minivectorName := makeInternalMapMinivectorName(nam) - body := substitute(minivectorName,"$$$",body) + minivectorName := makeInternalMapMinivectorName nam + body := substitute(["%dynval",MKQ minivectorName],"$$$",body) setDynamicBinding(minivectorName,LIST2VEC $minivector) argl := COPY argl -- play it safe for optimization init := @@ -149,8 +153,7 @@ reportFunctionCompilation(op,nam,argl,body,isRecursive) == cacheCount = "all" => reportFunctionCacheAll(op,nam,argl,body) parms := [:argl,"envArg"] cacheCount = 0 or null argl => - fun:= [nam,["LAMBDA",parms,declareGlobalVariables [minivectorName], - :declareUnusedParameters(parms,body)]] + fun:= [nam,["LAMBDA",parms,:declareUnusedParameters(parms,body)]] compileInteractive fun nam num := -- cgit v1.2.3