AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

IsObject / IsClass

Ein Thema von choose · begonnen am 3. Feb 2004 · letzter Beitrag vom 22. Nov 2005
 
choose

Registriert seit: 2. Nov 2003
Ort: Bei Kiel, SH
729 Beiträge
 
Delphi 2006 Architect
 
#17

Re: IsObject / IsClass

  Alt 21. Nov 2005, 09:00
Hey,

habe einmal versucht, die Idee von Hagen umzusetzen, und nun eine angepasste Version von IsObject erstellt:
Delphi-Quellcode:
function IsObject(AObject: Pointer): Boolean; assembler;
asm
      OR EAX,EAX // AObject == nil ??
      JNZ @@Try
      RET
@@Try:
      XOR EDX,EDX // install Exception Frame, SEH
      PUSH OFFSET @@Except
      PUSH DWord Ptr FS:[EDX]
      MOV FS:[EDX],ESP

      // actual tests ***************
@@Step1_ClassTypeIsNil:
      // test whether classtype is nil
      MOV EAX,[EAX] // EAX := AObject^.ClassType
      OR EAX,EAX
      JZ @@False
@@Step2_SelfReference:
      // object's self reference should point to object again
      CMP EAX,[EAX].vmtSelfPtr // EAX = ClassType.vmtSelfPtr
      JNE @@False
@@Step3_TypeInfosKindIsClass:
      MOV ECX,EAX // ECX := ClassType
      // object's typ info has to be a valid class
      MOV EAX,[EAX].vmtTypeInfo // EAX := TypeInfo(AnObject.ClassInfo)
      CMP [EAX].TTypeInfo.Kind, tkClass // AnObject.ClassInfo)^.Kind = tkClass
      JNE @@False
@@Step4_ValidTypeInfo:
      // valid type info has self reference at -0x04
      CMP EAX,[EAX-4] // (TypInfo-4)^ = TypInfo
      JNE @@False
@@Step5_TypeDataPointsBackToClass:
      // type data of class' type info points to class again
      PUSH EDX
      // copied from GetTypeData (EAX==PTypeInfo) -> (EAX==PTypeData)
        XOR EDX,EDX
        MOV DL,[EAX].TTypeInfo.Name.Byte[0]
        LEA EAX,[EAX].TTypeInfo.Name[EDX+1]
      POP EDX
      CMP ECX,[EAX].TTypeData.ClassType // TypeData(AnObject)^.ClassType = AnObject.ClassType
      JNE @@False
      // ****************************

@@True:
      MOV AL, 1
      JMP @@ReturnWithoutException
@@FALSE:
      SUB EAX, EAX
@@ReturnWithoutException:
      POP DWord Ptr FS:[EDX] // uninstall Exception Frame
      POP EDX
      RET

@@Except:
      MOV EAX,[ESP + 00Ch] // context
      MOV DWord Ptr [EAX + 0B0h],0 // context.eax = 0
      MOV DWord Ptr [EAX + 0B8h],OFFSET @@ReturnWithoutException // context.eip = @@2
      SUB EAX,EAX // 0 = ExceptionContinueExecution
end;
@Hagen: Wenn Du damit einverstanden bist, würde ich IsObject sowie ein Extrakt für IsClass nach TypInfoEx übernehmen.
gruß, choose
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:53 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz