Mercurial Hosting > luan
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 } |