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); }
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); }
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)); }
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); }
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); }
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); }
public void ThrowException(RuntimeIshtarClass @class) => this.exception = new CallFrameException() { value = IshtarGC.AllocObject(@class) };