Fix aliasing issue for some multiple assignments from varargs return values
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user