.ret();
}
private void generateCompareTo(ClassDefinition classDefinition, List<Integer> sortChannels, List<SortOrder> sortOrders)
{
CompilerContext compilerContext = new CompilerContext(bootstrapMethod);
MethodDefinition compareToMethod = classDefinition.declareMethod(compilerContext,
a(PUBLIC),
"compareTo",
type(int.class),
arg("pagesIndex", PagesIndex.class),
arg("leftPosition", int.class),
arg("rightPosition", int.class));
LocalVariableDefinition valueAddresses = compilerContext.declareVariable(LongArrayList.class, "valueAddresses");
compareToMethod
.getBody()
.comment("LongArrayList valueAddresses = pagesIndex.valueAddresses")
.getVariable("pagesIndex")
.invokeVirtual(PagesIndex.class, "getValueAddresses", LongArrayList.class)
.putVariable(valueAddresses);
LocalVariableDefinition leftPageAddress = compilerContext.declareVariable(long.class, "leftPageAddress");
compareToMethod
.getBody()
.comment("long leftPageAddress = valueAddresses.getLong(leftPosition)")
.getVariable(valueAddresses)
.getVariable("leftPosition")
.invokeVirtual(LongArrayList.class, "getLong", long.class, int.class)
.putVariable(leftPageAddress);
LocalVariableDefinition leftBlockIndex = compilerContext.declareVariable(int.class, "leftBlockIndex");
compareToMethod
.getBody()
.comment("int leftBlockIndex = decodeSliceIndex(leftPageAddress)")
.getVariable(leftPageAddress)
.invokeStatic(SyntheticAddress.class, "decodeSliceIndex", int.class, long.class)
.putVariable(leftBlockIndex);
LocalVariableDefinition leftBlockPosition = compilerContext.declareVariable(int.class, "leftBlockPosition");
compareToMethod
.getBody()
.comment("int leftBlockPosition = decodePosition(leftPageAddress)")
.getVariable(leftPageAddress)
.invokeStatic(SyntheticAddress.class, "decodePosition", int.class, long.class)
.putVariable(leftBlockPosition);
LocalVariableDefinition rightPageAddress = compilerContext.declareVariable(long.class, "rightPageAddress");
compareToMethod
.getBody()
.comment("long rightPageAddress = valueAddresses.getLong(rightPosition);")
.getVariable(valueAddresses)
.getVariable("rightPosition")
.invokeVirtual(LongArrayList.class, "getLong", long.class, int.class)
.putVariable(rightPageAddress);
LocalVariableDefinition rightBlockIndex = compilerContext.declareVariable(int.class, "rightBlockIndex");
compareToMethod
.getBody()
.comment("int rightBlockIndex = decodeSliceIndex(rightPageAddress)")
.getVariable(rightPageAddress)
.invokeStatic(SyntheticAddress.class, "decodeSliceIndex", int.class, long.class)
.putVariable(rightBlockIndex);
LocalVariableDefinition rightBlockPosition = compilerContext.declareVariable(int.class, "rightBlockPosition");
compareToMethod
.getBody()
.comment("int rightBlockPosition = decodePosition(rightPageAddress)")
.getVariable(rightPageAddress)
.invokeStatic(SyntheticAddress.class, "decodePosition", int.class, long.class)