comparison core/src/luan/impl/Closure.java @ 663:b438a47196bc

finish compiling function blocks
author Franklin Schmidt <fschmidt@gmail.com>
date Thu, 07 Apr 2016 00:01:10 -0600
parents f1150518c467
children 71f8f5075df8
comparison
equal deleted inserted replaced
662:ee00a619eec1 663:b438a47196bc
35 35
36 UpValue[] upValues() { 36 UpValue[] upValues() {
37 return upValues; 37 return upValues;
38 } 38 }
39 39
40 @Override public Object call(LuanState luan,Object[] args) throws LuanException { 40 @Override public Object call(LuanState ls,Object[] args) throws LuanException {
41 try { 41 LuanStateImpl luan = (LuanStateImpl)ls;
42 return call(this,(LuanStateImpl)luan,args);
43 } catch(StackOverflowError e) {
44 throw new LuanException( "stack overflow", e );
45 }
46 }
47
48 private static Object call(Closure closure,LuanStateImpl luan,Object[] args) throws LuanException {
49 FnDef fnDef = closure.fnDef;
50 Object[] varArgs = null; 42 Object[] varArgs = null;
51 if( fnDef.isVarArg ) { 43 if( fnDef.isVarArg ) {
52 if( args.length > fnDef.numArgs ) { 44 if( args.length > fnDef.numArgs ) {
53 varArgs = new Object[ args.length - fnDef.numArgs ]; 45 varArgs = new Object[ args.length - fnDef.numArgs ];
54 for( int i=0; i<varArgs.length; i++ ) { 46 for( int i=0; i<varArgs.length; i++ ) {
56 } 48 }
57 } else { 49 } else {
58 varArgs = LuanFunction.NOTHING; 50 varArgs = LuanFunction.NOTHING;
59 } 51 }
60 } 52 }
61 Object[] stack = luan.newFrame(closure,fnDef.stackSize,varArgs); 53 Object[] stack = luan.newFrame(this,fnDef.stackSize,varArgs);
62 final int n = Math.min(args.length,fnDef.numArgs); 54 final int n = Math.min(args.length,fnDef.numArgs);
63 for( int i=0; i<n; i++ ) { 55 for( int i=0; i<n; i++ ) {
64 stack[i] = args[i]; 56 stack[i] = args[i];
65 } 57 }
66 Object returnValues; 58 Object returnValues;
67 try { 59 try {
68 fnDef.block.eval(luan); 60 return fnDef.block.eval(luan);
69 } catch(ReturnException e) { 61 } catch(StackOverflowError e) {
62 throw new LuanException( "stack overflow", e );
70 } finally { 63 } finally {
71 returnValues = luan.returnValues;
72 luan.popFrame(); 64 luan.popFrame();
73 } 65 }
74 return returnValues;
75 } 66 }
76 67
77 } 68 }