Ejemplo n.º 1
0
        internal static GlobalAccessorInstruction Create(BinaryParsingReader reader, bool getter)
        {
            uint    globalIndex = reader.ReadVarUint32();
            OpCodes opcode      = getter ? OpCodes.GetGlobal : OpCodes.SetGlobal;

            if (MaxReusableIndex < globalIndex)
            {
                return(new GlobalAccessorInstruction(opcode)
                {
                    GlobalIndex = globalIndex
                });
            }
            GlobalAccessorInstruction[] reuseTarget = getter ? _knownGlobalGetters : _knownGlobalSetters;
            GlobalAccessorInstruction   result      = reuseTarget[globalIndex];

            if (null != result)
            {
                _reuseCount++;
            }
            else
            {
                result = new GlobalAccessorInstruction(opcode)
                {
                    GlobalIndex = globalIndex
                };
                reuseTarget[globalIndex] = result;
            }
            return(result);
        }
Ejemplo n.º 2
0
        internal static LocalAccessorInstruction Create(BinaryParsingReader reader, OpCodes opcode)
        {
            uint localIndex = reader.ReadVarUint32();

            if (MaxReusablIndex < localIndex)
            {
                return(new LocalAccessorInstruction(opcode)
                {
                    LocalIndex = localIndex
                });
            }
            LocalAccessorInstruction[] reuseTable = GetReuseTable(opcode);
            LocalAccessorInstruction   result     = reuseTable[localIndex];

            if (null != result)
            {
                _reuseCount++;
            }
            else
            {
                result = new LocalAccessorInstruction(opcode)
                {
                    LocalIndex = localIndex
                };
                reuseTable[localIndex] = result;
            }
            return(result);
        }
Ejemplo n.º 3
0
        internal static BranchInstruction Create(BinaryParsingReader reader, OpCodes opcode)
        {
            uint depth       = reader.ReadVarUint32();
            bool conditional = (OpCodes.BrIf == opcode);

            if (MaxReusableDepth < depth)
            {
                return(new BranchInstruction(opcode)
                {
                    Conditional = conditional, Depth = depth
                });
            }
            BranchInstruction[] reuseTargets = conditional ? _perDepthConditionalBranch : _perDepthBranch;
            BranchInstruction   result       = reuseTargets[depth];

            if (null != result)
            {
                _reuseCount++;
            }
            else
            {
                result = new BranchInstruction(opcode)
                {
                    Conditional = conditional, Depth = depth
                };
                reuseTargets[depth] = result;
            }
            return(result);
        }
Ejemplo n.º 4
0
        internal static MemoryControlInstruction Create(BinaryParsingReader reader, OpCodes opcode)
        {
            byte reserved = reader.ReadVarUint1();

            UseCount++;
            return(new MemoryControlInstruction(opcode)
            {
                Reserved = reserved
            });
        }
Ejemplo n.º 5
0
        internal static CallInstruction Create(BinaryParsingReader reader, OpCodes opcode)
        {
            uint itemIndex         = reader.ReadVarUint32();
            bool indirect          = (OpCodes.CallIndirect == opcode);
            byte expectedSignature = indirect ? reader.ReadVarUint1() : (byte)0;

            return(new CallInstruction(opcode)
            {
                ExpectedSignature = expectedSignature, Indirect = indirect, ItemIndex = itemIndex
            });
        }
Ejemplo n.º 6
0
        internal static BranchTableInstruction Create(BinaryParsingReader reader)
        {
            uint targetCount = reader.ReadVarUint32();

            uint[] targets = new uint[targetCount];
            for (int index = 0; index < targetCount; index++)
            {
                targets[index] = reader.ReadVarUint32();
            }
            uint defaultTarget = reader.ReadVarUint32();

            return(new BranchTableInstruction()
            {
                DefaultTarget = defaultTarget, Targets = targets
            });
        }
Ejemplo n.º 7
0
        internal static ConstantValueInstruction <T> Create(BinaryParsingReader reader, OpCodes opcode, T value)
        {
            ConstantValueInstruction <T> result;

            if (_knownValues.TryGetValue(value, out result))
            {
                _reuseCount++;
                return(result);
            }
            result = new ConstantValueInstruction <T>(opcode)
            {
                Value = value
            };
            _knownValues.Add(value, result);
            return(result);
        }
Ejemplo n.º 8
0
        internal static IfInstruction Create(BinaryParsingReader reader)
        {
            BuiltinLanguageType valueType = reader.ReadValueType(true);
            IfInstruction       result    = _knownTests[(int)valueType + 128];

            if (null != result)
            {
                _reuseCount++;
            }
            else
            {
                result = new IfInstruction()
                {
                    ValueType = valueType
                };
                _knownTests[(int)valueType + 128] = result;
            }
            return(result);
        }
Ejemplo n.º 9
0
        internal static BlockInstruction Create(BinaryParsingReader reader)
        {
            BuiltinLanguageType blockType = (BuiltinLanguageType)reader.ReadVarInt7();
            BlockInstruction    result    = _perTypeBlock[(int)blockType + 128];

            if (null != result)
            {
                _reuseCount++;
            }
            else
            {
                result = new BlockInstruction()
                {
                    BlockType = blockType
                };
                _perTypeBlock[(int)blockType + 128] = result;
            }
            return(result);
        }
Ejemplo n.º 10
0
        internal static MemoryAccessInstruction Create(BinaryParsingReader reader, OpCodes opcode)
        {
            RawValueEncoding rawValue;
            bool             store = false;

            switch (opcode)
            {
            case OpCodes.I32Store:
                store = true;
                goto case OpCodes.I32Load;

            case OpCodes.I32Load:
                rawValue = RawValueEncoding.I32;
                break;

            case OpCodes.I64Store:
                store = true;
                goto case OpCodes.I64Load;

            case OpCodes.I64Load:
                rawValue = RawValueEncoding.I64;
                break;

            case OpCodes.F32Store:
                store = true;
                goto case OpCodes.F32Load;

            case OpCodes.F32Load:
                rawValue = RawValueEncoding.F32;
                break;

            case OpCodes.F64Store:
                store = true;
                goto case OpCodes.F64Load;

            case OpCodes.F64Load:
                rawValue = RawValueEncoding.F64;
                break;

            case OpCodes.I32Load8_s:
                rawValue = RawValueEncoding.I32 | RawValueEncoding.ByteStorageSize | RawValueEncoding.Signed;
                break;

            case OpCodes.I32Load8_u:
                rawValue = RawValueEncoding.I32 | RawValueEncoding.ByteStorageSize | RawValueEncoding.Unsigned;
                break;

            case OpCodes.I32Load16_s:
                rawValue = RawValueEncoding.I32 | RawValueEncoding.WordStorageSize | RawValueEncoding.Signed;
                break;

            case OpCodes.I32Load16_u:
                rawValue = RawValueEncoding.I32 | RawValueEncoding.WordStorageSize | RawValueEncoding.Unsigned;
                break;

            case OpCodes.I64Load8_s:
                rawValue = RawValueEncoding.I64 | RawValueEncoding.ByteStorageSize | RawValueEncoding.Signed;
                break;

            case OpCodes.I64Load8_u:
                rawValue = RawValueEncoding.I64 | RawValueEncoding.ByteStorageSize | RawValueEncoding.Unsigned;
                break;

            case OpCodes.I64Load16_s:
                rawValue = RawValueEncoding.I64 | RawValueEncoding.WordStorageSize | RawValueEncoding.Signed;
                break;

            case OpCodes.I64Load16_u:
                rawValue = RawValueEncoding.I64 | RawValueEncoding.WordStorageSize | RawValueEncoding.Unsigned;
                break;

            case OpCodes.I64Load32_s:
                rawValue = RawValueEncoding.I64 | RawValueEncoding.DoubleWordStorageSize | RawValueEncoding.Signed;
                break;

            case OpCodes.I64Load32_u:
                rawValue = RawValueEncoding.I64 | RawValueEncoding.DoubleWordStorageSize | RawValueEncoding.Unsigned;
                break;

            case OpCodes.I32Store8:
                rawValue = RawValueEncoding.I32 | RawValueEncoding.ByteStorageSize;
                store    = true;
                break;

            case OpCodes.I32Store16:
                rawValue = RawValueEncoding.I32 | RawValueEncoding.WordStorageSize;
                store    = true;
                break;

            case OpCodes.I64Store8:
                rawValue = RawValueEncoding.I64 | RawValueEncoding.ByteStorageSize;
                store    = true;
                break;

            case OpCodes.I64Store16:
                rawValue = RawValueEncoding.I64 | RawValueEncoding.WordStorageSize;
                store    = true;
                break;

            case OpCodes.I64Store32:
                rawValue = RawValueEncoding.I64 | RawValueEncoding.DoubleWordStorageSize;
                store    = true;
                break;

            default:
                throw new NotSupportedException();
            }
            uint flags  = reader.ReadVarUint32();
            uint offset = reader.ReadVarUint32();

            InstructionsCount++;
            MemoryAccessInstruction result;

            // if (_knownInstructions.TryGetValue(opcode, out result)) { return result; }
            result = new MemoryAccessInstruction(opcode)
            {
                _rawValue = rawValue,
                IsLoad    = !store,
                Offset    = offset,
                Align     = flags
            };
            // _knownInstructions.Add(opcode, result);
            return(result);
        }