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 }