GnuSmalltalkUsersGuide:BaseChapter 035
- CObject
CObject
네임스페이스 Smalltalk에 정의됨
수퍼클래스: Object
범주: 언어-C 인터페이스
- 나는 표준 스몰토크 커널 클래스 계층구조에 속하지 않는다. 나의 인스턴스들은 스몰토크 시스템이 해석 가능한 값을 포함한다; 주로 스몰토크 환경 외부의 데이터에 대한 "포인터"를 보관한다. C callout 메커니즘은 나의 인스턴스들을 그에 상응하는 C 값으로 변환되어 외부 루틴에서 사용할 수 있도록 해준다.
CObject 클래스: 변환
type
기본 사례에서 특별한 것은 없다 - 수신자에 대해 CType를 응답하라.
CObject 클래스: 인스턴스 생성
address: anInteger
전달된 어드레스, anInteger를 가리키는 새 객체를 응답하라.
alloc: nBytes
nBytes 바이트를 할당하고 수신자의 인스턴스를 리턴하라.
gcAlloc: nBytes
nBytes 바이트를 할당하고 수신자의 인스턴스를 리턴하라.
gcNew: nBytes
nBytes 바이트를 할당하고 수신자의 인스턴스를 리턴하라.
new
NULL을 가리키는 새 객체를 응답하라.
new: nBytes
nBytes 바이트를 할당하고 수신자의 인스턴스를 리턴하라.
CObject 클래스: 선점 할당(primitive allocation)
alloc: nBytes type: cTypeObject
nBytes 바이트를 할당하고 주어진 타입의 CObject 를 리턴하라.
gcAlloc: nBytes type: cTypeObject
nBytes 바이트를 할당하고 주어진 타입의 CObject 를 리턴하라.
CObject 클래스: 서브클래싱하기
subclass: aSymbol
주어진 이름으로 된 서브클래스를 생성하라.
CObject: 접근하기
address
수신자가 가리키는 어드레스를 응답하라. 저장공간이 nil인 경우 절대 어드레스가 가능하고, 그렇지 않은 경우 #storage에서 스몰토크 객체에 따라 상대적이다. 이런 경우 0의 어드레스는 첫 번째 인스턴스 변수에 해당한다.
address: anInteger
수신자가 전달된 어드레스, anInteger를 가리키도록 설정하라.
isAbsolute
객체가 쓰레기 수집된 스몰토크 저장공간을 가리키는지, 아니면 절대 어드레스인지 응답하라.
printOn: aStream
수신자의 표현을 인쇄하라.
storage
수신자가 가리키는 저장공간을 응답하고, 절대 어드레스인 경우 nil을 응답하라.
storage: anObject
수신자가 anObject의 저장공간을 가리키도록 변경하라.
type: aCType
수신자의 타입을 aCType으로 설정하라.
CObject: 기본
= anObject
수신자와 aCObject가 같을 경우 true를 리턴하라.
hash
anObject에 대한 해시값을 리턴하라.
CObject: C 데이터 접근
at: byteOffset put: aValue type: aType
aValue를 byteOffset 바이트로부터 주어진 타입의 데이터로서 보관하되 수신자에 보관된 포인터 다음에 보관하라.
at: byteOffset type: aType
frombyteOffset 바이트로부터 주어진 타입의 데이터 일부를 수신자에 보관된 포인터 다음에 응답하라.
free
수신자의 포인터를 해제하고 null로 설정하라. 수신자가 malloc-ed된 영역의 베이스(base)를 가리키지 않을 경우 큰 문제가 발생할 것이다.
CObject: 변환
castTo: aType
수신자와 동일한 어드레스를 가리키지만 aType CType에 속하는 다른 CObject를 응답하라.
narrow
해당 메서드는 리턴 타입이 CType으로 명시된 C call-out에 의해 CObjects 상에서 호출된다; 대부분의 경우 리턴된 CObject의 클래스를 변경하도록 해준다. 기본적으로는 아무 일도 하지 않기 때문에 리턴 타입을 명시하는 데 #cObject가 사용될 경우 호출되지 않는다.
type
수신자에 대한 CType을 응답하라.
CObject: finalization
finalize
VM이 이를 호출하도록 만들기 위해서는 #addToBeFinalized를 사용하라. 이는 CObject가 가리키는 메모리는 자동으로 해제한다. #free를 사용하여 수신자가 malloc-ed 영역의 베이스를 가리키지 않을 경우 큰 문제가 발생하므로 해당 기능은 자동으로 활성화된다.
CObject: 포인터와 같은 행위
+ anInteger
&receiver[anInteger] 를 가리키는 수신자 클래스의 또 다른 인스턴스를 리턴하라 (아니면 C에서 'receiver + anInteger'의 결과를 선호한다면 이를 리턴해도 좋다)
- intOrPtr
intOrPtr 가 정수일 경우 at &receiver[-anInteger]를 가리키는 수신자 클래스의 또 다른 인스턴스를 리턴하라 (아니면 C에서 'receiver - anInteger'의 결과를 선호한다면 이를 리턴해도 좋다). 수신자와 동일한 클래스일 경우 chars의 차이를 리턴하면 되는데, 두 개의 가리킨 어드레스 간 바이트를 예로 들 수 있겠다 (또는 C에서 'receiver -anotherCharPtr'의 결과를 선호한다면 이를 리턴해도 좋다).
addressAt: anIndex
수신자를 지나서 anIndex가 가리키는 객체에 상응하는 요소 타입의 새 CObject를 리턴하라 (CObjects는 포인터를 표현하고 C 포인터는 배열과 같이 행동함을 기억하라). anIndex는 다른 C 스타일의 접근과 마찬가지로 0부터 시작한다.
at: anIndex
수신자를 지나서 anIndex가 가리키는 포인터를 역참조하라 (CObjects는 포인터를 표현하고 C 포인터는 배열과 같이 행동함을 기억하라). anIndex는 다른 C 스타일의 접근과 마찬가지로 0부터 시작한다.
at: anIndex put: aValue
수신자를 지나서 anIndex가 가리키는 전달된 스몰토크 객체 또는 CObject 'aValue'를 보관한다; 역참조된 대상이 CObject인 경우: 즉, 해당 메서드는 cobj[anIndex]=aValue 또는 or cobj[anIndex]=*aValue와 같다. anIndex는 다른 C 스타일의 접근과 마찬가지로 0부터 시작한다. 두 경우 모두 aValue는 요소 타입의 것이거나 그에 상응하는 스몰토크 타입의 것이어야만 (즉, CStrings의 배열에 String이 괜찮다) C의 타입이 정해지지 않아(untyped) 시그널링 되지 않는 타이핑 문제를 피할 수 있다.
decr
포인터를 sizeof(dereferencedType) 바이트 하향(byte down)에 따라 조정하라 (예: -receiver)
decrBy: anInteger
포인터를 anInteger 요소 하향(elements down)에 따라 조정하라 (예: receiver -=anInteger)
incr
포인터를 sizeof(dereferencedType) 바이트 상향에 따라 조정하라 (예: ++receiver)
incrBy: anInteger
포인터를 anInteger 요소 상향에 따라 조정하라 (예: receiver += anInteger)
CObject: 검사하기
isNull
수신자가 NULL을 가리키는 경우 true를 리턴하라.
CObject: 기능 검사하기
isCObject
'true'를 응답하라.