All Downloads are FREE. Search and download functionalities are using the official Maven repository.

nl.weeaboo.lua2.internal.LuaArgsUtil Maven / Gradle / Ivy

package nl.weeaboo.lua2.internal;

import static nl.weeaboo.lua2.vm.LuaConstants.NONE;
import static nl.weeaboo.lua2.vm.LuaValue.varargsOf;

import nl.weeaboo.lua2.LuaUtil;
import nl.weeaboo.lua2.vm.LuaValue;
import nl.weeaboo.lua2.vm.Varargs;

/**
 * Contains various functions for working with Lua function arguments.
 */
public final class LuaArgsUtil {

    private LuaArgsUtil() {
    }

    /**
     * Returns a {@link Varargs} that's a concetenation of {@code firstArgs} and {@code secondArgs}.
     */
    public static Varargs concatVarargs(Varargs firstArgs, Varargs secondArgs) {
        if (firstArgs == null || firstArgs.narg() == 0) {
            return secondArgs;
        }
        if (secondArgs == null || secondArgs.narg() == 0) {
            return firstArgs;
        }

        int firstCount = firstArgs.narg();
        int secondCount = secondArgs.narg();

        LuaValue[] merged = new LuaValue[firstCount + secondCount];
        for (int n = 0; n < firstCount; n++) {
            merged[n] = firstArgs.arg(1 + n);
        }
        for (int n = 0; n < secondCount; n++) {
            merged[firstCount + n] = secondArgs.arg(1 + n);
        }
        return LuaValue.varargsOf(merged);
    }

    /**
     * Returns a {@link Varargs} that's a copy of part of the given stack.
     */
    public static Varargs copyArgs(LuaValue[] stack, int offset, int length) {
        if (length <= 0) {
            return NONE;
        }

        LuaValue[] array = new LuaValue[length];
        for (int n = 0; n < length; n++) {
            array[n] = stack[offset + n];
        }
        return varargsOf(array);
    }

    /**
     * Returns a {@link Varargs} that's a copy of part of the given stack with {@code extra} concatenated to the end.
     */
    public static Varargs copyArgs(LuaValue[] stack, int offset, int length, Varargs extra) {
        if (length <= 0) {
            return LuaUtil.copyArgs(extra);
        }

        if (extra == null) {
            extra = NONE;
        }
        int extraL = extra.narg();

        LuaValue[] array = new LuaValue[length + extraL];
        for (int n = 0; n < length; n++) {
            array[n] = stack[offset + n];
        }
        for (int n = 0; n < extraL; n++) {
            array[length + n] = extra.arg(1 + n);
        }
        return varargsOf(array);
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy