Skip to content

Commit 137ca31

Browse files
committed
Improvements to syntax inlining.
1 parent f6e3fdf commit 137ca31

File tree

10 files changed

+99
-21
lines changed

10 files changed

+99
-21
lines changed

src/main/java/org/byteskript/skript/api/SyntaxElement.java

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
import org.byteskript.skript.api.note.ForceExtract;
1414
import org.byteskript.skript.api.note.ForceInline;
1515
import org.byteskript.skript.compiler.*;
16-
import org.byteskript.skript.compiler.structure.PreVariable;
1716
import org.byteskript.skript.error.ScriptReassemblyError;
1817
import org.byteskript.skript.lang.handler.StandardHandlers;
1918

@@ -143,13 +142,7 @@ default void writeCall(final MethodBuilder builder, final Method method, final C
143142
else sub.writeCode(returnObject());
144143
builder.writeCode(invokeStatic(context.getType(), target));
145144
} else if (inline != null) {
146-
final InlineController controller = new InlineController(context);
147-
for (int i = method.getParameterTypes().length - 1; i >= 0; i--) {
148-
final PreVariable var = new PreVariable("$unspec_" + i);
149-
context.forceUnspecVariable(var);
150-
final int slot = context.slotOf(var);
151-
builder.writeCode(WriteInstruction.storeObject(slot));
152-
}
145+
final InlineController controller = new InlineController(context, method);
153146
builder.writeCode(SourceReader.getSource(method, controller).toArray(new WriteInstruction[0]));
154147
} else if (extract != null) {
155148
final ClassBuilder parent = builder.finish();

src/main/java/org/byteskript/skript/compiler/InlineController.java

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,17 @@
66

77
package org.byteskript.skript.compiler;
88

9+
import mx.kenzie.foundation.MethodBuilder;
910
import mx.kenzie.foundation.RewriteController;
1011
import mx.kenzie.foundation.Type;
1112
import mx.kenzie.foundation.WriteInstruction;
13+
import org.byteskript.skript.api.SyntaxElement;
1214
import org.byteskript.skript.compiler.structure.MultiLabel;
1315
import org.byteskript.skript.compiler.structure.PreVariable;
16+
import org.byteskript.skript.lang.syntax.variable.VariableExpression;
1417
import org.objectweb.asm.Label;
1518

19+
import java.lang.reflect.Method;
1620
import java.util.HashMap;
1721
import java.util.Map;
1822

@@ -23,8 +27,30 @@ public class InlineController extends RewriteController {
2327
final MultiLabel label = new MultiLabel();
2428
protected final Map<Integer, PreVariable> special = new HashMap<>();
2529

26-
public InlineController(Context context) {
30+
public InlineController(Context context, Method method) {
2731
this.context = context;
32+
this.prepareVariables(method);
33+
}
34+
35+
private void prepareVariables(Method method) {
36+
final ElementTree[] inputs = context.getCompileCurrent().nested();
37+
for (int i = 0; i < inputs.length; i++) {
38+
final SyntaxElement element = inputs[i].current();
39+
if (element.getClass() != VariableExpression.class) continue;
40+
final VariableExpression expression = (VariableExpression) inputs[i].current();
41+
special.put(i, expression.getVariable(context, inputs[i].match()));
42+
}
43+
final MethodBuilder builder = context.getMethod();
44+
for (int i = method.getParameterTypes().length - 1; i >= 0; i--) {
45+
if (special.containsKey(i)) {
46+
builder.writeCode(WriteInstruction.pop()); // have to pop, aload is already queued
47+
continue;
48+
}
49+
final PreVariable var = new PreVariable("$unspec_" + i);
50+
context.forceUnspecVariable(var);
51+
final int slot = context.slotOf(var);
52+
builder.writeCode(WriteInstruction.storeObject(slot));
53+
}
2854
}
2955

3056
public Map<Integer, PreVariable> getSpecial() {
@@ -63,6 +89,20 @@ public int adjustVariable(int i) {
6389
return context.slotOf(variable);
6490
}
6591

92+
@Override
93+
public WriteInstruction return0(int opcode) {
94+
return this.jumpToEnd();
95+
// if (opcode < 177) {
96+
// int slot = this.returnSlot();
97+
// return (writer, visitor) -> {
98+
// visitor.visitVarInsn(opcode - 118, slot);
99+
// this.jumpToEnd().accept(writer, visitor);
100+
// };
101+
// } else {
102+
// return this.jumpToEnd();
103+
// }
104+
}
105+
66106
@Override
67107
public int returnSlot() {
68108
final PreVariable variable = new PreVariable("$unspec_ret");

src/main/java/org/byteskript/skript/compiler/SkriptLangSpec.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -78,20 +78,20 @@
7878
import static org.byteskript.skript.lang.handler.StandardHandlers.GET;
7979

8080
public final class SkriptLangSpec extends ModifiableLibrary implements LanguageDefinition, Library {
81-
public static final Pattern LINE_COMMENT = Pattern.compile("//.*(?=(\\R|$|\\n))");
82-
public static final Pattern BLOCK_COMMENT = Pattern.compile("/\\*[\\s\\S]*?\\*/");
83-
public static final Pattern DEAD_SPACE = Pattern.compile("(?<=\\S)[\\t\\f\\v ]+(?=(\\R|$))");
8481
public static final Pattern IDENTIFIER = Pattern.compile("\\p{javaJavaIdentifierStart}\\p{javaJavaIdentifierPart}*");
8582
public static final JavaVersion JAVA_VERSION = JavaVersion.JAVA_17;
8683

8784
static final SkriptLangSpec INSTANCE = new SkriptLangSpec();
88-
public static final LanguageDefinition LANG = INSTANCE;
8985
public static final Library LIBRARY = INSTANCE;
9086

9187
final LanguageElement[] grammar = StandardElements.values();
9288

9389
final Map<State, List<SyntaxElement>> syntax = new HashMap<>();
9490

91+
public LanguageElement[] getGrammar() {
92+
return grammar;
93+
}
94+
9595
private SkriptLangSpec() {
9696
super("Skript");
9797
registerTypes(

src/main/java/org/byteskript/skript/lang/syntax/generic/PropertyExpression.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,6 @@ public Pattern.Match match(String thing, Context context) {
6363
final Matcher matcher = pattern.matcher(thing);
6464
if (!matcher.find()) return null;
6565
final String name = matcher.group("name");
66-
// if (!context.hasHandle(name, context.getHandlerMode())) return null;
6766
final Matcher dummy = createDummy(thing, i, matcher);
6867
dummy.find();
6968
return new Pattern.Match(dummy, name, CommonTypes.OBJECT);

src/main/java/org/byteskript/skript/lang/syntax/list/ClearList.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
package org.byteskript.skript.lang.syntax.list;
88

99
import org.byteskript.skript.api.note.Documentation;
10-
import org.byteskript.skript.api.note.ForceExtract;
10+
import org.byteskript.skript.api.note.ForceInline;
1111
import org.byteskript.skript.api.syntax.Effect;
1212
import org.byteskript.skript.compiler.Context;
1313
import org.byteskript.skript.compiler.Pattern;
@@ -39,7 +39,7 @@ public ClearList() {
3939
handlers.put(StandardHandlers.RUN, findMethod(this.getClass(), "run", Object.class));
4040
}
4141

42-
@ForceExtract
42+
@ForceInline
4343
public static void run(Object object) {
4444
if (object instanceof Collection list) list.clear();
4545
if (object instanceof Map map) map.clear(); // in case this is loaded in preference.

src/main/java/org/byteskript/skript/lang/syntax/list/ListCreator.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
import mx.kenzie.foundation.Type;
1010
import org.byteskript.skript.api.note.Documentation;
11-
import org.byteskript.skript.api.note.ForceExtract;
11+
import org.byteskript.skript.api.note.ForceInline;
1212
import org.byteskript.skript.api.syntax.SimpleExpression;
1313
import org.byteskript.skript.compiler.CommonTypes;
1414
import org.byteskript.skript.compiler.SkriptLangSpec;
@@ -47,7 +47,7 @@ public Type getReturnType() {
4747
return CommonTypes.LIST;
4848
}
4949

50-
@ForceExtract
50+
@ForceInline
5151
public static DataList create() {
5252
return new DataList();
5353
}

src/main/java/org/byteskript/skript/lang/syntax/map/MapCreator.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
import mx.kenzie.foundation.Type;
1010
import org.byteskript.skript.api.note.Documentation;
11-
import org.byteskript.skript.api.note.ForceExtract;
11+
import org.byteskript.skript.api.note.ForceInline;
1212
import org.byteskript.skript.api.syntax.SimpleExpression;
1313
import org.byteskript.skript.compiler.CommonTypes;
1414
import org.byteskript.skript.compiler.SkriptLangSpec;
@@ -40,7 +40,7 @@ public Type getReturnType() {
4040
return CommonTypes.MAP;
4141
}
4242

43-
@ForceExtract
43+
@ForceInline
4444
public static DataMap create() {
4545
return new DataMap();
4646
}

src/main/java/org/byteskript/skript/lang/syntax/variable/VariableExpression.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,6 @@ public Type getHolderType() {
7676
@Override
7777
public void compile(Context context, Pattern.Match match) {
7878
final MethodBuilder method = context.getMethod();
79-
assert method != null;
8079
final String name = match.matcher().group("name");
8180
final PreVariable variable = context.getVariable(name);
8281
final int slot = context.slotOf(variable);
@@ -90,6 +89,11 @@ public void compile(Context context, Pattern.Match match) {
9089
}
9190
}
9291

92+
public PreVariable getVariable(Context context, Pattern.Match match) {
93+
final String name = match.matcher().group("name");
94+
return context.getVariable(name);
95+
}
96+
9397
@Override
9498
public Type getReturnType() {
9599
return CommonTypes.OBJECT;
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
/*
2+
* Copyright (c) 2021 ByteSkript org (Moderocky)
3+
* View the full licence information and permissions:
4+
* https://github.com/Moderocky/ByteSkript/blob/master/LICENSE
5+
*/
6+
7+
package org.byteskript.skript.test;
8+
9+
import mx.kenzie.foundation.language.PostCompileClass;
10+
import org.byteskript.skript.runtime.Script;
11+
import org.byteskript.skript.runtime.Skript;
12+
import org.byteskript.skript.runtime.internal.Member;
13+
import org.junit.BeforeClass;
14+
import org.junit.Test;
15+
16+
public class InlineTest extends SkriptTest {
17+
18+
private static final Skript skript = new Skript();
19+
private static Script script;
20+
21+
@BeforeClass
22+
public static void start() throws Throwable {
23+
final PostCompileClass cls = skript.compileScript(InlineTest.class.getClassLoader()
24+
.getResourceAsStream("inline.bsk"), "skript.inline");
25+
script = skript.loadScript(cls);
26+
}
27+
28+
@Test
29+
public void simple() throws Throwable {
30+
final Member function = script.getFunction("simple");
31+
assert function != null;
32+
function.invoke();
33+
}
34+
35+
}

src/test/resources/inline.bsk

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
2+
function simple:
3+
trigger:
4+
set {var} to a new list
5+
add "hello" to {var}
6+
assert {var} contains "hello": "List contains check failed."
7+
clear {var}

0 commit comments

Comments
 (0)