private void CopyValue( Action loadSourceAddress, Action loadDestinationAddress, NIType valueType) { int typeSize = BytecodeInterpreterAllocator.GetTypeSize(valueType); if (typeSize == 4) { loadDestinationAddress(); loadSourceAddress(); _builder.EmitDerefInteger(); _builder.EmitStoreInteger(); } else if (valueType.IsRebarReferenceType() && valueType.GetReferentType() != DataTypes.StringSliceType) { loadDestinationAddress(); loadSourceAddress(); _builder.EmitDerefPointer(); _builder.EmitStorePointer(); } else { loadSourceAddress(); loadDestinationAddress(); _builder.EmitLoadIntegerImmediate(typeSize); _builder.EmitCopyBytes_TEMP(); } }
private static void CompileExchangeValues(FunctionCompiler compiler, FunctionalNode exchangeValuesNode) { VariableReference var1 = exchangeValuesNode.InputTerminals.ElementAt(0).GetTrueVariable(), var2 = exchangeValuesNode.InputTerminals.ElementAt(1).GetTrueVariable(); compiler.LoadValueAsReference(var1); compiler.LoadValueAsReference(var2); compiler._builder.EmitLoadIntegerImmediate(BytecodeInterpreterAllocator.GetTypeSize(var1.Type.GetReferentType())); compiler._builder.EmitExchangeBytes_TEMP(); }
private static void CompileInspect(FunctionCompiler compiler, FunctionalNode inspectNode) { VariableReference input = inspectNode.InputTerminals[0].GetTrueVariable(); int typeSize = BytecodeInterpreterAllocator.GetTypeSize(input.Type.GetReferentType()); StaticDataBuilder staticData = compiler._builder.DefineStaticData(); staticData.Data = new byte[typeSize]; staticData.Identifier = StaticDataIdentifier.CreateFromNode(inspectNode); compiler.LoadValueAsReference(input); compiler._builder.EmitLoadStaticDataAddress(staticData); compiler._builder.EmitLoadIntegerImmediate(typeSize); compiler._builder.EmitCopyBytes_TEMP(); }