Skip to content

Commit

Permalink
Fix variable arguments in namespaces.
Browse files Browse the repository at this point in the history
  • Loading branch information
Moderocky committed Nov 4, 2022
1 parent 51ad482 commit 744f110
Show file tree
Hide file tree
Showing 8 changed files with 25 additions and 51 deletions.
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

<groupId>org.byteskript</groupId>
<artifactId>byteskript</artifactId>
<version>1.0.39</version>
<version>1.0.40</version>
<name>ByteSkript</name>
<description>A compiled JVM implementation of the Skript language.</description>

Expand Down
40 changes: 0 additions & 40 deletions src/main/java/org/byteskript/skript/compiler/BridgeCompiler.java
Original file line number Diff line number Diff line change
Expand Up @@ -114,46 +114,6 @@ private void extractSimpleArguments(int length, Class<?>[] arguments, Class<?>[]
}
}

public Class<?> createClass0()
throws IllegalAccessException {
final Class<?>[] arguments = source.parameterArray();
final Class<?>[] parameters = target.getParameterTypes();
final Class<?> expected = source.returnType();
final Class<?> result = target.getReturnType();
if (arguments.length != parameters.length) // todo dynamic?
throw new ScriptRuntimeError("Function argument count did not match target parameter count.");
final ClassWriter writer = new ClassWriter(0);
writer.visit(Skript.JAVA_VERSION, 0x0001 | 0x1000, location, null, "java/lang/Object", null);
final MethodVisitor visitor;
final Type[] types = new Type[arguments.length];
for (int i = 0; i < arguments.length; i++) types[i] = Type.getType(arguments[i]);
visitor = writer.visitMethod(0x0001 | 0x0008 | 0x0040 | 0x1000, "bridge", Type.getMethodDescriptor(Type.getType(expected), types), null, null);
visitor.visitCode();
for (int i = 0; i < arguments.length; i++) { // assume no fat arguments ?
final Class<?> argument = arguments[i];
final Class<?> parameter = parameters[i];
visitor.visitVarInsn(20 + this.instructionOffset(argument), i);
this.boxAtomic(visitor, parameter);
this.conform(visitor, parameter);
visitor.visitTypeInsn(192, Type.getInternalName(this.getUnboxingType(parameter)));
this.unbox(visitor, parameter);
}
this.invoke(visitor);
if (result == void.class) {
visitor.visitInsn(1);
visitor.visitInsn(176);
} else {
this.box(visitor, result);
visitor.visitTypeInsn(192, Type.getInternalName(this.getWrapperType(expected)));
visitor.visitInsn(171 + this.instructionOffset(expected));
}
visitor.visitMaxs(Math.max(parameters.length + 1 + this.wideIndexOffset(parameters, result), 1), arguments.length);
visitor.visitEnd();
writer.visitEnd();
this.generated = lookup.defineClass(writer.toByteArray());
return generated;
}

protected int instructionOffset(Class<?> type) {
if (type == int.class) return 1;
if (type == boolean.class) return 1;
Expand Down
6 changes: 4 additions & 2 deletions src/main/java/org/byteskript/skript/compiler/FileContext.java
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ private void addSkriptFunctions() {
for (final Method method : Class.forName("skript").getMethods()) {
if (!Modifier.isStatic(method.getModifiers())) continue;
if (!Modifier.isPublic(method.getModifiers())) continue;
this.functions.add(new Function(method.getName(), owner, CommonTypes.OBJECT, Type.array(CommonTypes.OBJECT, method.getParameterCount()), new Type(method.getReturnType()), Type.of(method.getParameterTypes())));
this.functions.add(new Function(method.getName(), owner, CommonTypes.OBJECT, Type.array(CommonTypes.OBJECT, method.getParameterCount()), new Type(method.getReturnType()), Type.of(method.getParameterTypes()), method.isVarArgs()));
}
} catch (Throwable ex) {
throw new RuntimeException("Unable to load Skript functions.", ex);
Expand Down Expand Up @@ -437,7 +437,9 @@ public Function getFunction(String name, int arguments) {
if (function.name().equals(name) && function.arguments().length == arguments) return function;
}
for (final Function function : functions) { // zero-functions may be imported
if (function.name().equals(name) && function.arguments().length == 0) return function.copy(arguments);
if (!function.name().equals(name)) continue;
if (function.arguments().length == 0) return function.copy(arguments);
else if (function.variable()) return function;
}
return null;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,18 +14,19 @@

import java.util.Arrays;

public record Function(String name, Type provider, Type returnType, Type[] arguments, Type result, Type[] parameters) {
public record Function(String name, Type provider, Type returnType, Type[] arguments, Type result, Type[] parameters,
boolean variable) {

public Function(String name, Type provider) {
this(name, provider, CommonTypes.OBJECT);
}

public Function(String name, Type provider, Type returnType, Type... arguments) {
this(name, provider, returnType, arguments, returnType, arguments);
this(name, provider, returnType, arguments, returnType, arguments, false);
}

public Function(Type provider, MethodErasure erasure) {
this(erasure.name(), provider, erasure.returnType(), erasure.parameterTypes(), erasure.returnType(), erasure.parameterTypes());
this(erasure.name(), provider, erasure.returnType(), erasure.parameterTypes(), erasure.returnType(), erasure.parameterTypes(), false);
}

public Function copy(int arguments) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ public void compile(Context context, Pattern.Match match) {
if (!Modifier.isStatic(method.getModifiers())) continue;
if (!Modifier.isPublic(method.getModifiers())) continue;
context.registerFunction(new Function(method.getName(), type, CommonTypes.OBJECT,
Type.array(CommonTypes.OBJECT, method.getParameterCount()), new Type(method.getReturnType()), Type.of(method.getParameterTypes())));
Type.array(CommonTypes.OBJECT, method.getParameterCount()), new Type(method.getReturnType()), Type.of(method.getParameterTypes()), method.isVarArgs()));
}
context.setState(CompileState.CODE_BODY);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,13 @@ default OperatorFunction<B, A> opposite() {
final OperatorFunction<A, B> function = this;
return new OperatorFunction<>() {
@Override
public Object union2(A first, B second) throws Throwable {
return function.union(first, second);
public Object union(B first, A second) throws Throwable {
return function.union2(first, second);
}

@Override
public Object union(B first, A second) throws Throwable {
return function.union2(first, second);
public Object union2(A first, B second) throws Throwable {
return function.union(first, second);
}

@Override
Expand Down
6 changes: 6 additions & 0 deletions src/main/java/skript.java
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,12 @@ public static Number abs(Number object) { // the instance-checks make sure the c
throw new ScriptRuntimeError("Unable to abs(" + object + ") - not a number.");
}

public static double sum(Number... numbers) {
double value = 0;
for (Number number : numbers) value += number.doubleValue();
return value;
}

public static double sqrt(double number) {
if (number == 0) return 0;
return Math.sqrt(number);
Expand Down
5 changes: 5 additions & 0 deletions src/test/resources/tests/namespaceskript.bsk
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,11 @@ function maths:
assert round(5) is 5: "Round function returned wrong result."
assert ln(-3) < 1: "Ln function returned wrong result."
assert log(3) > 1: "Log function returned wrong result."
assert sum(10) = 10: "Sum single number failed."
assert sum() = 0: "Sum no numbers failed."
assert sum(10, 5) = 15: "Sum two numbers failed."
assert sum(10, -11) = -1: "Sum negative numbers failed."
assert sum(-1, -1) = -2: "Sum negative numbers failed."

function generic:
trigger:
Expand Down

0 comments on commit 744f110

Please sign in to comment.