Mercurial Hosting > luan
comparison core/src/luan/impl/Closure.java @ 659:f1150518c467
remove tail recursion
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Tue, 05 Apr 2016 20:30:42 -0600 |
parents | cdc70de628b5 |
children | b438a47196bc |
comparison
equal
deleted
inserted
replaced
658:e038905512d3 | 659:f1150518c467 |
---|---|
44 throw new LuanException( "stack overflow", e ); | 44 throw new LuanException( "stack overflow", e ); |
45 } | 45 } |
46 } | 46 } |
47 | 47 |
48 private static Object call(Closure closure,LuanStateImpl luan,Object[] args) throws LuanException { | 48 private static Object call(Closure closure,LuanStateImpl luan,Object[] args) throws LuanException { |
49 while(true) { | 49 FnDef fnDef = closure.fnDef; |
50 FnDef fnDef = closure.fnDef; | 50 Object[] varArgs = null; |
51 Object[] varArgs = null; | 51 if( fnDef.isVarArg ) { |
52 if( fnDef.isVarArg ) { | 52 if( args.length > fnDef.numArgs ) { |
53 if( args.length > fnDef.numArgs ) { | 53 varArgs = new Object[ args.length - fnDef.numArgs ]; |
54 varArgs = new Object[ args.length - fnDef.numArgs ]; | 54 for( int i=0; i<varArgs.length; i++ ) { |
55 for( int i=0; i<varArgs.length; i++ ) { | 55 varArgs[i] = args[fnDef.numArgs+i]; |
56 varArgs[i] = args[fnDef.numArgs+i]; | |
57 } | |
58 } else { | |
59 varArgs = LuanFunction.NOTHING; | |
60 } | 56 } |
57 } else { | |
58 varArgs = LuanFunction.NOTHING; | |
61 } | 59 } |
62 Object[] stack = luan.newFrame(closure,fnDef.stackSize,varArgs); | |
63 final int n = Math.min(args.length,fnDef.numArgs); | |
64 for( int i=0; i<n; i++ ) { | |
65 stack[i] = args[i]; | |
66 } | |
67 Object returnValues; | |
68 try { | |
69 fnDef.block.eval(luan); | |
70 } catch(ReturnException e) { | |
71 } finally { | |
72 returnValues = luan.returnValues; | |
73 closure = luan.tailFn; | |
74 luan.popFrame(); | |
75 } | |
76 if( closure == null ) | |
77 return returnValues; | |
78 args = Luan.array(returnValues); | |
79 } | 60 } |
61 Object[] stack = luan.newFrame(closure,fnDef.stackSize,varArgs); | |
62 final int n = Math.min(args.length,fnDef.numArgs); | |
63 for( int i=0; i<n; i++ ) { | |
64 stack[i] = args[i]; | |
65 } | |
66 Object returnValues; | |
67 try { | |
68 fnDef.block.eval(luan); | |
69 } catch(ReturnException e) { | |
70 } finally { | |
71 returnValues = luan.returnValues; | |
72 luan.popFrame(); | |
73 } | |
74 return returnValues; | |
80 } | 75 } |
81 | 76 |
82 } | 77 } |