예제 #1
0
        public static RuntimeIshtarField GetField(uint index, RuntimeIshtarClass owner, VeinModule module, CallFrame frame)
        {
            var name  = module.GetFieldNameByIndex((int)index);
            var field = owner.FindField(name.Name);

            if (field is null)
            {
                FastFail(WNE.MISSING_FIELD, $"Field '{name}' not found in '{owner.FullName.NameWithNS}'", frame);
                ValidateLastError();
                return(null);
            }
            return(field);
        }
예제 #2
0
        public void ThrowException(RuntimeIshtarClass @class, string message)
        {
            this.exception = new CallFrameException()
            {
                value = IshtarGC.AllocObject(@class)
            };

            if (@class.FindField("message") is null)
            {
                throw new InvalidOperationException($"Class '{@class.FullName}' is not contained 'message' field.");
            }

            this.exception.value->vtable[@class.Field["message"].vtable_offset]
                = IshtarMarshal.ToIshtarObject(message);
        }
예제 #3
0
 public static bool IsAssignableFrom(CallFrame frame, RuntimeIshtarClass c1, RuntimeIshtarClass c2)
 {
     if (!c1.is_inited)
     {
         c1.init_vtable();
     }
     if (!c2.is_inited)
     {
         c2.init_vtable();
     }
     // TODO: Array detection
     // TODO: Generic detection
     // TODO: Interfrace detection
     if (c1.FullName == VeinCore.ObjectClass.FullName)
     {
         return(true);
     }
     return(c1.IsInner(c2));
 }
예제 #4
0
        public static RuntimeIshtarClass DecodeClass(byte[] arr, RuntimeIshtarModule ishtarModule)
        {
            using var mem    = new MemoryStream(arr);
            using var binary = new BinaryReader(mem);
            var className = binary.ReadTypeName(ishtarModule);
            var flags     = (ClassFlags)binary.ReadInt16();

            var parentLen = binary.ReadInt16();

            var parents = new List <VeinClass>();

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


            var len = binary.ReadInt32();

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

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

            DecodeField(binary, @class, ishtarModule);

            return(@class);
        }
예제 #5
0
 public static IshtarObject *IsInstanceOfByRef(CallFrame frame, IshtarObject *c, RuntimeIshtarClass @class)
 {
     // temporary cast to\from interface is not support
     frame.ThrowException(KnowTypes.IncorrectCastFault(frame));
     return(c);
 }
예제 #6
0
 public static IshtarObject *IsInstanceOf(CallFrame frame, IshtarObject * @this, RuntimeIshtarClass @class)
 {
     if ([email protected]_inited)
     {
         @class.init_vtable();
     }
     if (@this == null)
     {
         return(null);
     }
     if (@class.IsInterface)
     {
         return(IsInstanceOfByRef(frame, @this, @class));
     }
     return(IsAssignableFrom(frame, @class, @this->decodeClass()) ? @this : null);
 }
예제 #7
0
 public void ThrowException(RuntimeIshtarClass @class) =>
 this.exception = new CallFrameException()
 {
     value = IshtarGC.AllocObject(@class)
 };