GnuSmalltalkUsersGuide:BaseChapter 035

From 흡혈양파의 번역工房
Jump to: navigation, search
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'를 응답하라.


Notes