The Labs \ Source Viewer \ SSCLI \ System.Reflection.Emit \ OpCode

  1. // ==++==
  2. //
  3. //
  4. // Copyright (c) 2006 Microsoft Corporation. All rights reserved.
  5. //
  6. // The use and distribution terms for this software are contained in the file
  7. // named license.txt, which can be found in the root of this distribution.
  8. // By using this software in any fashion, you are agreeing to be bound by the
  9. // terms of this license.
  10. //
  11. // You must not remove this notice, or any other, from this software.
  12. //
  13. //
  14. // ==--==
  15. namespace System.Reflection.Emit
  16. {
  17.     using System;
  18.     using System.Security.Permissions;
  19.    
  20.     [System.Runtime.InteropServices.ComVisible(true)]
  21.     public struct OpCode
  22.     {
  23.         internal string m_stringname;
  24.         internal StackBehaviour m_pop;
  25.         internal StackBehaviour m_push;
  26.         internal OperandType m_operand;
  27.         internal OpCodeType m_type;
  28.         internal int m_size;
  29.         internal byte m_s1;
  30.         internal byte m_s2;
  31.         internal FlowControl m_ctrl;
  32.        
  33.         // Specifies whether the current instructions causes the control flow to
  34.         // change unconditionally.
  35.         internal bool m_endsUncondJmpBlk;
  36.        
  37.        
  38.         // Specifies the stack change that the current instruction causes not
  39.         // taking into account the operand dependant stack changes.
  40.         internal int m_stackChange;
  41.        
  42.         internal OpCode(string stringname, StackBehaviour pop, StackBehaviour push, OperandType operand, OpCodeType type, int size, byte s1, byte s2, FlowControl ctrl, bool endsjmpblk,
  43.         int stack)
  44.         {
  45.             m_stringname = stringname;
  46.             m_pop = pop;
  47.             m_push = push;
  48.             m_operand = operand;
  49.             m_type = type;
  50.             m_size = size;
  51.             m_s1 = s1;
  52.             m_s2 = s2;
  53.             m_ctrl = ctrl;
  54.             m_endsUncondJmpBlk = endsjmpblk;
  55.             m_stackChange = stack;
  56.            
  57.         }
  58.        
  59.         internal bool EndsUncondJmpBlk()
  60.         {
  61.             return m_endsUncondJmpBlk;
  62.         }
  63.        
  64.         internal int StackChange()
  65.         {
  66.             return m_stackChange;
  67.         }
  68.        
  69.         public OperandType OperandType {
  70.             get { return (m_operand); }
  71.         }
  72.        
  73.         public FlowControl FlowControl {
  74.             get { return (m_ctrl); }
  75.         }
  76.        
  77.         public OpCodeType OpCodeType {
  78.             get { return (m_type); }
  79.         }
  80.        
  81.        
  82.         public StackBehaviour StackBehaviourPop {
  83.             get { return (m_pop); }
  84.         }
  85.        
  86.         public StackBehaviour StackBehaviourPush {
  87.             get { return (m_push); }
  88.         }
  89.        
  90.         public int Size {
  91.             get { return (m_size); }
  92.         }
  93.        
  94.         public short Value {
  95.             get {
  96.                 if (m_size == 2)
  97.                     return (short)(m_s1 << 8 | m_s2);
  98.                 return (short)m_s2;
  99.             }
  100.         }
  101.        
  102.        
  103.         public string Name {
  104.             get { return m_stringname; }
  105.         }
  106.        
  107.         public override bool Equals(object obj)
  108.         {
  109.             if (obj is OpCode)
  110.                 return Equals((OpCode)obj);
  111.             else
  112.                 return false;
  113.         }
  114.        
  115.         public bool Equals(OpCode obj)
  116.         {
  117.             return obj.m_s1 == m_s1 && obj.m_s2 == m_s2;
  118.         }
  119.        
  120.         public static bool operator ==(OpCode a, OpCode b)
  121.         {
  122.             return a.Equals(b);
  123.         }
  124.        
  125.         public static bool operator !=(OpCode a, OpCode b)
  126.         {
  127.             return !(a == b);
  128.         }
  129.        
  130.         public override int GetHashCode()
  131.         {
  132.             return this.m_stringname.GetHashCode();
  133.         }
  134.        
  135.         public override string ToString()
  136.         {
  137.             return m_stringname;
  138.         }
  139.        
  140.     }
  141. }

Developer Fusion