home *** CD-ROM | disk | FTP | other *** search
-
- ; *******************************************************
- ; * *
- ; * Turbo Pascal Run-time Library *
- ; * Object Handling Routines *
- ; * *
- ; * Copyright (c) 1989,92 Borland International *
- ; * *
- ; *******************************************************
-
- TITLE OBJH
-
- INCLUDE SE.ASM
-
- CODE SEGMENT BYTE PUBLIC
-
- ASSUME CS:CODE
-
- ; Externals
-
- EXTRN NewMemory:NEAR,DisMemory:NEAR,HaltError:NEAR
-
- ; Publics
-
- PUBLIC Construct,Destruct,CopyObject,MethodCheck
-
- ; Constructor support routine
- ; In DI = Method field offset
- ; BP = Constructor stack frame
- ; Out ZF = 1 if failed
-
- Construct:
-
- MOV SI,[BP+10] ;SI = VMT offset
- CMP SI,1 ;Inherited constructor call?
- JB @@2 ;Yes, exit with ZF = 0
- LES BX,[BP+6] ;ES:BX = Self
- MOV AX,ES ;Self = nil?
- OR AX,BX
- JE @@3 ;Yes, allocate
- MOV WORD PTR [BP+10],0 ;No deallocation on Fail
- @@1: MOV ES:[BX+DI],SI ;Store VMT link in object
- @@2: RETF ;Exit
- @@3: MOV AX,[SI] ;AX = Object size
- IF WindowsVersion
- INC BP ;Setup stack frame
- PUSH BP
- MOV BP,SP
- PUSH DS
- ELSE
- PUSH BP ;Setup stack frame
- MOV BP,SP
- ENDIF
- PUSH SI
- PUSH DI
- CALL NewMemory ;Allocate dynamic object
- POP DI
- POP SI
- IF WindowsVersion
- MOV SP,BP ;Remove stack frame
- POP BP
- DEC BP
- ELSE
- POP BP
- ENDIF
- JC @@4 ;Error if allocation failed
- MOV CX,AX ;Out of memory?
- OR CX,DX
- JE @@2 ;Yes, exit with ZF = 1
- MOV [BP+6],AX ;Store in Self pointer
- MOV [BP+8],DX
- MOV ES,DX ;ES:BX = Self
- MOV BX,AX
- JMP @@1 ;Init and exit with ZF = 0
- @@4: MOV SP,BP ;Remove callers stack frame
- POP BP
- IF WindowsVersion
- DEC BP
- ENDIF
- MOV AX,203
- JMP HaltError
-
- ; Destructor support routine
- ; In DI = Method field offset
- ; BP = Destructor stack frame
-
- Destruct:
-
- CMP WORD PTR [BP+10],0 ;Inherited destructor call?
- JE @@1 ;Yes, exit
- LES BX,[BP+6] ;ES:BX = Self
- MOV SI,ES:[BX+DI] ;SI = VMT offset
- MOV AX,[SI] ;AX = Object size
- MOV CX,BX ;BX:CX = Self
- MOV BX,ES
- IF WindowsVersion
- INC BP ;Setup stack frame
- PUSH BP
- MOV BP,SP
- PUSH DS
- ELSE
- PUSH BP ;Setup stack frame
- MOV BP,SP
- ENDIF
- CALL DisMemory ;Dispose dynamic object
- IF WindowsVersion
- MOV SP,BP ;Remove Windows stack frame
- POP BP
- DEC BP
- ELSE
- POP BP ;Remove Windows stack frame
- ENDIF
- JC @@2 ;Error if deallocation failed
- @@1: XOR AX,AX ;Self = nil
- MOV [BP+6],AX
- MOV [BP+8],AX
- RETF
- @@2: MOV SP,BP ;Remove callers stack frame
- POP BP
- IF WindowsVersion
- DEC BP
- ENDIF
- MOV AX,204
- JMP HaltError
-
- ; Object assignment support routine
-
- CopyObject:
-
- PUSH BP
- MOV BP,SP
- LES DI,[BP+8]
- MOV BX,[BP+6]
- ADD BX,DI
- MOV AX,ES:[BX]
- MOV SI,AX
- MOV CX,DS:[SI]
- MOV DX,DS
- LDS SI,[BP+12]
- CLD
- REP MOVSB
- MOV DS,DX
- MOV ES:[BX],AX
- POP BP
- RETF 10
-
- ; Check method table
-
- MethodCheck:
-
- MOV CX,[DI]
- JCXZ @@1
- ADD CX,[DI+2]
- JNE @@1
- RETF
- @@1: MOV AX,210
- JMP HaltError
-
- CODE ENDS
-
- END
-