Skip to content

Commit cf1addd

Browse files
mtdowlingadwsingh
authored andcommitted
Add SPLIT opcode, fix EndpointBddTrait namespace
1 parent 592133e commit cf1addd

9 files changed

Lines changed: 57 additions & 5 deletions

File tree

client/client-rulesengine/src/main/java/software/amazon/smithy/java/client/rulesengine/BytecodeCompiler.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
import software.amazon.smithy.rulesengine.language.syntax.rule.Rule;
3333
import software.amazon.smithy.rulesengine.logic.bdd.Bdd;
3434
import software.amazon.smithy.rulesengine.logic.bdd.BddNodeConsumer;
35-
import software.amazon.smithy.rulesengine.logic.bdd.EndpointBddTrait;
35+
import software.amazon.smithy.rulesengine.traits.EndpointBddTrait;
3636

3737
final class BytecodeCompiler {
3838

@@ -304,6 +304,14 @@ public Void visitLibraryFunction(FunctionDefinition fn, List<Expression> args) {
304304
writer.writeByte(Opcodes.URI_ENCODE);
305305
return null;
306306
}
307+
case "split" -> {
308+
// Compile all three arguments (string, delimiter, limit)
309+
compileExpression(args.get(0));
310+
compileExpression(args.get(1));
311+
compileExpression(args.get(2));
312+
writer.writeByte(Opcodes.SPLIT);
313+
return null;
314+
}
307315
}
308316

309317
// A generic function call without a special opcode

client/client-rulesengine/src/main/java/software/amazon/smithy/java/client/rulesengine/BytecodeDisassembler.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ final class BytecodeDisassembler {
8080
Map.entry(Opcodes.IS_VALID_HOST_LABEL, new InstructionDef("IS_VALID_HOST_LABEL", OperandType.NONE)),
8181
Map.entry(Opcodes.PARSE_URL, new InstructionDef("PARSE_URL", OperandType.NONE)),
8282
Map.entry(Opcodes.URI_ENCODE, new InstructionDef("URI_ENCODE", OperandType.NONE)),
83+
Map.entry(Opcodes.SPLIT, new InstructionDef("SPLIT", OperandType.NONE)),
8384

8485
// Return operations
8586
Map.entry(Opcodes.RETURN_ERROR, new InstructionDef("RETURN_ERROR", OperandType.NONE)),

client/client-rulesengine/src/main/java/software/amazon/smithy/java/client/rulesengine/BytecodeEvaluator.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import software.amazon.smithy.java.io.uri.URLEncoding;
1919
import software.amazon.smithy.rulesengine.language.syntax.expressions.functions.IsValidHostLabel;
2020
import software.amazon.smithy.rulesengine.language.syntax.expressions.functions.ParseUrl;
21+
import software.amazon.smithy.rulesengine.language.syntax.expressions.functions.Split;
2122
import software.amazon.smithy.rulesengine.language.syntax.expressions.functions.Substring;
2223
import software.amazon.smithy.rulesengine.logic.ConditionEvaluator;
2324

@@ -381,6 +382,15 @@ private Object run(int start) {
381382
stackPosition--; // Pop the null value
382383
}
383384
}
385+
case Opcodes.SPLIT -> {
386+
// Pops 3, pushes 1
387+
int idx = stackPosition - 3;
388+
var string = (String) stack[idx];
389+
var delimiter = (String) stack[idx + 1];
390+
var limit = ((Number) stack[idx + 2]).intValue();
391+
stack[idx] = Split.split(string, delimiter, limit);
392+
stackPosition = idx + 1;
393+
}
384394
default -> throw new RulesEvaluationError("Unknown rules engine instruction: " + opcode, pc);
385395
}
386396
}

client/client-rulesengine/src/main/java/software/amazon/smithy/java/client/rulesengine/EndpointRulesPlugin.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@
1414
import software.amazon.smithy.java.context.Context;
1515
import software.amazon.smithy.java.core.schema.TraitKey;
1616
import software.amazon.smithy.java.logging.InternalLogger;
17-
import software.amazon.smithy.rulesengine.logic.bdd.EndpointBddTrait;
1817
import software.amazon.smithy.rulesengine.traits.ContextParamTrait;
18+
import software.amazon.smithy.rulesengine.traits.EndpointBddTrait;
1919
import software.amazon.smithy.rulesengine.traits.EndpointRuleSetTrait;
2020
import software.amazon.smithy.rulesengine.traits.OperationContextParamsTrait;
2121
import software.amazon.smithy.rulesengine.traits.StaticContextParamsTrait;

client/client-rulesengine/src/main/java/software/amazon/smithy/java/client/rulesengine/Opcodes.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -413,4 +413,13 @@ private Opcodes() {}
413413
* <p><code>JNN_OR_POP [offset:ushort]</code>
414414
*/
415415
public static final byte JNN_OR_POP = 42;
416+
417+
/**
418+
* Pop a string, delimiter, and limit from the stack and push the split result.
419+
*
420+
* <p>Stack: [..., string, delimiter, limit] => [..., list]
421+
*
422+
* <p><code>SPLIT</code>
423+
*/
424+
public static final byte SPLIT = 41;
416425
}

client/client-rulesengine/src/main/java/software/amazon/smithy/java/client/rulesengine/RulesEngineBuilder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
import java.util.ServiceLoader;
1818
import java.util.function.Function;
1919
import software.amazon.smithy.java.context.Context;
20-
import software.amazon.smithy.rulesengine.logic.bdd.EndpointBddTrait;
20+
import software.amazon.smithy.rulesengine.traits.EndpointBddTrait;
2121

2222
/**
2323
* Compiles and loads a rules engine used to resolve endpoints based on Smithy's rules engine traits.

client/client-rulesengine/src/test/java/software/amazon/smithy/java/client/rulesengine/BytecodeCompilerTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
import software.amazon.smithy.rulesengine.language.syntax.rule.NoMatchRule;
4242
import software.amazon.smithy.rulesengine.language.syntax.rule.Rule;
4343
import software.amazon.smithy.rulesengine.logic.bdd.Bdd;
44-
import software.amazon.smithy.rulesengine.logic.bdd.EndpointBddTrait;
44+
import software.amazon.smithy.rulesengine.traits.EndpointBddTrait;
4545

4646
class BytecodeCompilerTest {
4747

client/client-rulesengine/src/test/java/software/amazon/smithy/java/client/rulesengine/BytecodeEvaluatorTest.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -744,6 +744,30 @@ void testUriEncode() {
744744
evaluator.test(0);
745745
}
746746

747+
@Test
748+
void testSplitWithLimit() {
749+
writer.markConditionStart();
750+
writer.writeByte(Opcodes.LOAD_CONST);
751+
writer.writeByte(writer.getConstantIndex("a--b--c--d"));
752+
writer.writeByte(Opcodes.LOAD_CONST);
753+
writer.writeByte(writer.getConstantIndex("--"));
754+
writer.writeByte(Opcodes.LOAD_CONST);
755+
writer.writeByte(writer.getConstantIndex(2));
756+
writer.writeByte(Opcodes.SPLIT);
757+
// Get the second element (should be "b--c--d")
758+
writer.writeByte(Opcodes.GET_INDEX);
759+
writer.writeByte(1);
760+
writer.writeByte(Opcodes.LOAD_CONST);
761+
writer.writeByte(writer.getConstantIndex("b--c--d"));
762+
writer.writeByte(Opcodes.STRING_EQUALS);
763+
writer.writeByte(Opcodes.RETURN_VALUE);
764+
765+
bytecode = buildBytecode();
766+
evaluator = createEvaluator(bytecode);
767+
768+
assertTrue(evaluator.test(0));
769+
}
770+
747771
private BytecodeEvaluator createEvaluator(Bytecode bytecode) {
748772
RegisterFiller filler = RegisterFiller.of(bytecode, Collections.emptyMap());
749773
BytecodeEvaluator eval = new BytecodeEvaluator(bytecode, new RulesExtension[0], filler);

client/client-rulesengine/src/test/java/software/amazon/smithy/java/client/rulesengine/EndpointRulesPluginTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@
2525
import software.amazon.smithy.model.shapes.ShapeId;
2626
import software.amazon.smithy.model.traits.Trait;
2727
import software.amazon.smithy.rulesengine.language.EndpointRuleSet;
28-
import software.amazon.smithy.rulesengine.logic.bdd.EndpointBddTrait;
2928
import software.amazon.smithy.rulesengine.logic.cfg.Cfg;
29+
import software.amazon.smithy.rulesengine.traits.EndpointBddTrait;
3030
import software.amazon.smithy.utils.IoUtils;
3131

3232
public class EndpointRulesPluginTest {

0 commit comments

Comments
 (0)