Exemple #1
0
 public VeinField(VeinClass owner, FieldName fullName, FieldFlags flags, VeinClass fieldType)
 {
     this.Owner     = owner;
     this.FullName  = fullName;
     this.Flags     = flags;
     this.FieldType = fieldType;
 }
Exemple #2
0
 internal MethodBuilder(ClassBuilder clazz, string name, VeinClass returnType, params VeinArgumentRef[] args)
     : base(name, 0, returnType, clazz, args)
 {
     classBuilder = clazz;
     _generator   = new ILGenerator(this);
     clazz.moduleBuilder.InternString(Name);
 }
Exemple #3
0
 public VeinProperty(VeinClass owner, FieldName fullName, FieldFlags flags, VeinClass propType)
 {
     this.Owner    = owner;
     this.FullName = fullName;
     this.Flags    = flags;
     this.PropType = propType;
 }
Exemple #4
0
        public static unsafe RuntimeIshtarMethod DecodeMethod(byte[] arr, VeinClass @class, RuntimeIshtarModule ishtarModule)
        {
            using var mem    = new MemoryStream(arr);
            using var binary = new BinaryReader(mem);
            var idx       = binary.ReadInt32();
            var flags     = (MethodFlags)binary.ReadInt16();
            var bodysize  = binary.ReadInt32();
            var stacksize = binary.ReadByte();
            var locals    = binary.ReadByte();
            var retType   = binary.ReadTypeName(ishtarModule);
            var args      = ReadArguments(binary, ishtarModule);
            var body      = binary.ReadBytes(bodysize);


            var mth = new RuntimeIshtarMethod(ishtarModule.GetConstStringByIndex(idx), flags,
                                              ishtarModule.FindType(retType, true, false),
                                              @class, args.ToArray());

            if (mth.IsExtern)
            {
                return(mth);
            }

            ConstructIL(mth, body, stacksize, ishtarModule);

            return(mth);
        }
Exemple #5
0
        internal RuntimeIshtarField DefineField(string name, FieldFlags flags, VeinClass type)
        {
            var f = new RuntimeIshtarField(this, new FieldName(name, Name), flags, type);

            this.Fields.Add(f);
            return(f);
        }
Exemple #6
0
 internal RuntimeIshtarClass(QualityTypeName name, VeinClass parent, RuntimeIshtarModule module)
     : base(name, parent, module)
 {
     if (module is null)
     {
         return;
     }
     ID            = module.Vault.TokenGranted.GrantClassID();
     runtime_token = new RuntimeToken(module.ID, ID);
 }
Exemple #7
0
 public static void DecodeField(BinaryReader binary, VeinClass @class, ModuleReader module)
 {
     foreach (var _ in..binary.ReadInt32())
     {
         var name      = FieldName.Resolve(binary.ReadInt32(), module);
         var type_name = binary.ReadTypeName(module);
         var type      = module.FindType(type_name, true, false);
         var flags     = (FieldFlags)binary.ReadInt16();
         var method    = new VeinField(@class, name, flags, type);
         @class.Fields.Add(method);
     }
 }
Exemple #8
0
        internal RuntimeIshtarMethod DefineMethod(string name, VeinClass returnType, MethodFlags flags, params VeinArgumentRef[] args)
        {
            var method = new RuntimeIshtarMethod(name, flags, returnType, this, args);

            method.Arguments.AddRange(args);

            if (Methods.Any(x => x.Name.Equals(method.Name)))
            {
                throw new Exception();
            }

            Methods.Add(method);
            return(method);
        }
Exemple #9
0
        public static VeinMethod DecodeMethod(byte[] arr, VeinClass @class, ModuleReader module)
        {
            using var mem    = new MemoryStream(arr);
            using var binary = new BinaryReader(mem);
            var idx       = binary.ReadInt32();
            var flags     = (MethodFlags)binary.ReadInt16();
            var bodysize  = binary.ReadInt32();
            var stacksize = binary.ReadByte();
            var locals    = binary.ReadByte();
            var retType   = binary.ReadTypeName(module);
            var args      = ReadArguments(binary, module);
            var _         = binary.ReadBytes(bodysize);

            return(new VeinMethod(module.GetConstStringByIndex(idx), flags,
                                  module.FindType(retType, true, false),
                                  @class, args.ToArray()));
        }
Exemple #10
0
        public static VeinClass DecodeClass(byte[] arr, ModuleReader module)
        {
            using var mem    = new MemoryStream(arr);
            using var binary = new BinaryReader(mem);
            var className = binary.ReadTypeName(module);
            var flags     = (ClassFlags)binary.ReadInt16();

            var parentLen = binary.ReadInt16();

            var parents = new List <VeinClass>();

            foreach (var _ in..parentLen)
            {
                var parentIdx = binary.ReadTypeName(module);
                parents.Add(module.FindType(parentIdx, true, false));
            }

            var len = binary.ReadInt32();

            var @class = new VeinClass(className, parents.ToArray(), module)
            {
                Flags = flags
            };

            foreach (var _ in..len)
            {
                var body =
                    binary.ReadBytes(binary.ReadInt32());
                var method = DecodeMethod(body, @class, module);
                @class.Methods.Add(method);
            }

            DecodeField(binary, @class, module);

            return(@class);
        }
Exemple #11
0
 public RuntimeIshtarField(VeinClass owner, FieldName fullName, FieldFlags flags, VeinClass fieldType) :
     base(owner, fullName, flags, fieldType)
 {
 }
Exemple #12
0
        public static void Indicate(VeinClass clazz)
        {
            switch (clazz.FullName.NameWithNS)
            {
            case "global::vein/lang/Aspect":
                clazz.TypeCode       = VeinTypeCode.TYPE_CLASS;
                VeinCore.AspectClass = clazz;
                break;

            case "global::vein/lang/Raw":
                clazz.TypeCode    = VeinTypeCode.TYPE_RAW;
                VeinCore.RawClass = clazz;
                break;

            case "global::vein/lang/Object":
                clazz.TypeCode       = VeinTypeCode.TYPE_OBJECT;
                VeinCore.ObjectClass = clazz;
                break;

            case "global::vein/lang/ValueType":
                clazz.TypeCode          = VeinTypeCode.TYPE_OBJECT;
                VeinCore.ValueTypeClass = clazz;
                break;

            case "global::vein/lang/Array":
                clazz.TypeCode      = VeinTypeCode.TYPE_ARRAY;
                VeinCore.ArrayClass = clazz;
                break;

            case "global::vein/lang/Void":
                clazz.TypeCode     = VeinTypeCode.TYPE_VOID;
                VeinCore.VoidClass = clazz;
                break;

            case "global::vein/lang/Int64":
                clazz.TypeCode      = VeinTypeCode.TYPE_I8;
                VeinCore.Int64Class = clazz;
                break;

            case "global::vein/lang/Int32":
                clazz.TypeCode      = VeinTypeCode.TYPE_I4;
                VeinCore.Int32Class = clazz;
                break;

            case "global::vein/lang/Int16":
                clazz.TypeCode      = VeinTypeCode.TYPE_I2;
                VeinCore.Int16Class = clazz;
                break;

            case "global::vein/lang/UInt64":
                clazz.TypeCode       = VeinTypeCode.TYPE_U8;
                VeinCore.UInt64Class = clazz;
                break;

            case "global::vein/lang/UInt32":
                clazz.TypeCode       = VeinTypeCode.TYPE_U4;
                VeinCore.UInt32Class = clazz;
                break;

            case "global::vein/lang/UInt16":
                clazz.TypeCode       = VeinTypeCode.TYPE_U2;
                VeinCore.UInt16Class = clazz;
                break;

            case "global::vein/lang/Boolean":
                clazz.TypeCode     = VeinTypeCode.TYPE_BOOLEAN;
                VeinCore.BoolClass = clazz;
                break;

            case "global::vein/lang/String":
                clazz.TypeCode       = VeinTypeCode.TYPE_STRING;
                VeinCore.StringClass = clazz;
                break;

            case "global::vein/lang/Char":
                clazz.TypeCode     = VeinTypeCode.TYPE_CHAR;
                VeinCore.CharClass = clazz;
                break;

            case "global::vein/lang/Half":
                clazz.TypeCode     = VeinTypeCode.TYPE_R2;
                VeinCore.HalfClass = clazz;
                break;

            case "global::vein/lang/Float":
                clazz.TypeCode      = VeinTypeCode.TYPE_R4;
                VeinCore.FloatClass = clazz;
                break;

            case "global::vein/lang/Double":
                clazz.TypeCode       = VeinTypeCode.TYPE_R8;
                VeinCore.DoubleClass = clazz;
                break;

            case "global::vein/lang/Decimal":
                clazz.TypeCode        = VeinTypeCode.TYPE_R16;
                VeinCore.DecimalClass = clazz;
                break;

            case "global::vein/lang/Byte":
                clazz.TypeCode     = VeinTypeCode.TYPE_U1;
                VeinCore.ByteClass = clazz;
                break;

            case "global::vein/lang/Exception":
                clazz.TypeCode          = VeinTypeCode.TYPE_CLASS;
                VeinCore.ExceptionClass = clazz;
                break;

            default:
                throw new NotSupportedException();
            }
        }
Exemple #13
0
 public static RuntimeIshtarMethod DefineEmptySystemMethod(string name, VeinClass clazz)
 => new RuntimeIshtarMethod(name, MethodFlags.Extern, clazz, new VeinArgumentRef("i", clazz))
 {
     Owner = clazz
 };