package org.shedlang.compiler.shidtopatio; import org.shedlang.compiler.patio.instructions.PatioMemoryLoad; import org.shedlang.compiler.patio.instructions.PatioMemoryStore; import org.shedlang.compiler.patio.operands.PatioLocalRef; import org.shedlang.compiler.patio.operands.PatioOperand; import org.shedlang.compiler.patio.types.PatioDataLayout; import org.shedlang.compiler.patio.types.PatioDataLayouts; import org.shedlang.compiler.patio.types.PatioTypes; import org.shedlang.compiler.sources.Source; import java.util.List; public class ShidToPatioVars { private ShidToPatioVars() { } private static class VarRuntimeType implements RuntimeType { private static final PatioDataLayout LAYOUT = ShidToPatioGc.gcObjectDataLayout( PatioDataLayouts.struct(List.of( PatioDataLayouts.fromType(ShidToPatioTypes.VALUE_TYPE) )) ); @Override public PatioDataLayout layout() { return LAYOUT; } private static final List GC_CHILDREN_OFFSET = ShidToPatioGc.gcObjectOffset(List.of()); @Override public List gcChildrenOffset() { return GC_CHILDREN_OFFSET; } @Override public int gcChildrenCount() { return 1; } private static final List VALUE_OFFSET = ShidToPatioGc.gcObjectOffset(List.of(0)); public List valueOffset() { return VALUE_OFFSET; } } private static final VarRuntimeType VAR_RUNTIME_TYPE = new VarRuntimeType(); public static ShidToPatioContext alloc( String shidName, Source source, ShidToPatioContext context ) { var patioLocalResult = context.declareShidVal( shidName, PatioTypes.DATA_PTR ); var patioLocal = patioLocalResult.value(); context = patioLocalResult.context(); context = ShidToPatioGc.alloc( patioLocal, VAR_RUNTIME_TYPE, source, context ); context = context.initShidLocal(shidName); return context; } public static ShidToPatioContext store( String shidName, PatioOperand value, Source source, ShidToPatioContext context ) { return context.addInstruction(new PatioMemoryStore( context.shidLocalNameToLocal(shidName), VAR_RUNTIME_TYPE.layout(), VAR_RUNTIME_TYPE.valueOffset(), value, source )); } public static ShidToPatioContext load( PatioLocalRef destination, String shidName, Source source, ShidToPatioContext context ) { return context.addInstruction(new PatioMemoryLoad( destination, context.shidLocalNameToLocal(shidName), VAR_RUNTIME_TYPE.layout(), VAR_RUNTIME_TYPE.valueOffset(), source )); } }