package org.shedlang.compiler.shidtopatio; import org.shedlang.compiler.patio.PatioDataElementImmutableDefinition; import org.shedlang.compiler.patio.PatioFunctionDeclaration; import org.shedlang.compiler.patio.PatioLocal; import org.shedlang.compiler.patio.PatioVisibility; import org.shedlang.compiler.patio.instructions.PatioCall; import org.shedlang.compiler.patio.operands.PatioDataPtrConst; import org.shedlang.compiler.patio.operands.PatioLocalRef; import org.shedlang.compiler.patio.operands.PatioOperand; import org.shedlang.compiler.patio.types.PatioDataLayouts; import org.shedlang.compiler.patio.types.PatioDataValue; import org.shedlang.compiler.patio.types.PatioDataValues; import org.shedlang.compiler.patio.values.PatioDataPtrValueDataElement; import org.shedlang.compiler.sources.Source; import org.shedlang.compiler.sources.Sources; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; import java.util.Optional; public class ShidToPatioStrings { public static final PatioFunctionDeclaration STRING_ADD_DECLARATION = new PatioFunctionDeclaration( "shed__runtime__string_add", List.of( PatioLocal.param("left", ShidToPatioTypes.VALUE_TYPE), PatioLocal.param("right", ShidToPatioTypes.VALUE_TYPE) ), List.of(ShidToPatioTypes.VALUE_TYPE), Sources.RUNTIME ); private ShidToPatioStrings() {} public static ShidToPatioResult define( String value, Source source, ShidToPatioContext context ) { var codeUnits = value.getBytes(StandardCharsets.UTF_8); var codeUnitsDataValues = new ArrayList(); for (var codeUnit : codeUnits) { codeUnitsDataValues.add(PatioDataValues.byte_(codeUnit)); } var dataValue = ShidToPatioGc.gcObjectStaticDataValue(PatioDataValues.struct(List.of( PatioDataValues.int_(codeUnits.length), PatioDataValues.array(PatioDataLayouts.BYTE, codeUnitsDataValues) ))); var elementNameResult = context.allocateCompilationUnitElementName( ShidToPatioCompilationUnitElementSpace.STRING ); var elementName = elementNameResult.value(); context = elementNameResult.context(); context = context.addCompilationUnitElement(new PatioDataElementImmutableDefinition( elementName, PatioVisibility.PRIVATE, dataValue, source )); return context.toResult(new PatioDataPtrConst( new PatioDataPtrValueDataElement(elementName) )); } public static ShidToPatioContext add( PatioLocalRef destination, PatioOperand left, PatioOperand right, Source source, ShidToPatioContext context ) { context = context.ensureCompilationUnitElement(STRING_ADD_DECLARATION); context = context.addInstruction(new PatioCall( List.of(destination), STRING_ADD_DECLARATION.name(), List.of(left, right), source )); return context; } }