Fix aliasing issue for some multiple assignments from varargs return values

This commit is contained in:
James Roseborough
2015-03-15 23:23:06 +00:00
parent 4cf1dca264
commit 17ffcc6940
2 changed files with 15 additions and 5 deletions

View File

@@ -21,6 +21,8 @@
******************************************************************************/ ******************************************************************************/
package org.luaj.vm2; package org.luaj.vm2;
import org.luaj.vm2.Varargs;
/** /**
* Base class for all concrete lua type values. * Base class for all concrete lua type values.
* <p> * <p>
@@ -3405,8 +3407,12 @@ public class LuaValue extends Varargs {
public static Varargs varargsOf(final LuaValue[] v,Varargs r) { public static Varargs varargsOf(final LuaValue[] v,Varargs r) {
switch ( v.length ) { switch ( v.length ) {
case 0: return r; case 0: return r;
case 1: return r.narg()>0? new Varargs.PairVarargs(v[0],r): v[0]; case 1: return r.narg()>0?
case 2: return r.narg()>0? new Varargs.ArrayVarargs(v,r): new Varargs.PairVarargs(v[0],v[1]); (Varargs) new Varargs.PairVarargs(v[0],r):
(Varargs) v[0];
case 2: return r.narg()>0?
(Varargs) new Varargs.ArrayVarargs(v,r):
(Varargs) new Varargs.PairVarargs(v[0],v[1]);
default: return new Varargs.ArrayVarargs(v,r); default: return new Varargs.ArrayVarargs(v,r);
} }
} }
@@ -3445,8 +3451,12 @@ public class LuaValue extends Varargs {
public static Varargs varargsOf(final LuaValue[] v, final int offset, final int length, Varargs more) { public static Varargs varargsOf(final LuaValue[] v, final int offset, final int length, Varargs more) {
switch ( length ) { switch ( length ) {
case 0: return more; case 0: return more;
case 1: return more.narg()>0? new Varargs.PairVarargs(v[offset],more): v[offset]; case 1: return more.narg()>0?
case 2: return more.narg()>0? new Varargs.ArrayPartVarargs(v,offset,length,more): new Varargs.PairVarargs(v[offset],v[offset+1]); (Varargs) new Varargs.PairVarargs(v[offset],more):
(Varargs) v[offset];
case 2: return more.narg()>0?
(Varargs) new Varargs.ArrayPartVarargs(v,offset,length,more):
(Varargs) new Varargs.PairVarargs(v[offset],v[offset+1]);
default: return new Varargs.ArrayPartVarargs(v,offset,length,more); default: return new Varargs.ArrayPartVarargs(v,offset,length,more);
} }
} }

View File

@@ -688,7 +688,7 @@ public abstract class Varargs {
return LuaValue.varargsOf(v, offset + start - 1, length - (start - 1), more); return LuaValue.varargsOf(v, offset + start - 1, length - (start - 1), more);
} }
void copyto(LuaValue[] dest, int offset, int length) { void copyto(LuaValue[] dest, int offset, int length) {
int n = Math.min(this.v.length, length); int n = Math.min(this.length, length);
System.arraycopy(this.v, this.offset, dest, offset, n); System.arraycopy(this.v, this.offset, dest, offset, n);
more.copyto(dest, offset + n, length - n); more.copyto(dest, offset + n, length - n);
} }