Mercurial Hosting > luan
diff src/luan/LuanClosure.java @ 1330:f41919741100
fix security
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Mon, 11 Feb 2019 01:38:55 -0700 |
parents | src/luan/impl/Closure.java@3ef883468fd0 |
children | 25746915a241 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/luan/LuanClosure.java Mon Feb 11 01:38:55 2019 -0700 @@ -0,0 +1,62 @@ +package luan; + +import luan.impl.Pointer; + + +public abstract class LuanClosure extends LuanFunction implements LuanCloneable, Cloneable { + public Pointer[] upValues; + public boolean javaOk; + public final String sourceName; + private LuanCloner cloner; + + public LuanClosure(int nUpValues,boolean javaOk,String sourceName) throws LuanException { + this.upValues = new Pointer[nUpValues]; + this.javaOk = javaOk; + this.sourceName = sourceName; + } + + @Override public LuanClosure shallowClone() { + check(); + try { + return (LuanClosure)clone(); + } catch(CloneNotSupportedException e) { + throw new RuntimeException(e); + } + } + + @Override public void deepenClone(LuanCloneable dc,LuanCloner cloner) { + LuanClosure clone = (LuanClosure)dc; + switch( cloner.type ) { + case COMPLETE: + clone.upValues = (Pointer[])cloner.clone(upValues); + return; + case INCREMENTAL: + clone.cloner = cloner; + clone.upValues = upValues; + return; + } + } + + private void check() { + if( cloner != null ) { + upValues = (Pointer[])cloner.clone(upValues); + cloner = null; + } + } + + @Override public final Object call(LuanState luan,Object[] args) throws LuanException { + if( luan.isLocked ) + throw new RuntimeException("luan is locked"); + check(); + luan.push(this); + try { + return doCall(luan,args); + } catch(StackOverflowError e) { + throw new LuanException( "stack overflow" ); + } finally { + luan.pop(); + } + } + + public abstract Object doCall(LuanState luan,Object[] args) throws LuanException; +}