Ejemplo n.º 1
0
        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();
            }
        }
Ejemplo n.º 2
0
        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();
        }
Ejemplo n.º 3
0
        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();
        }