GnuSmalltalkUsersGuide:BaseChapter 035

From 흡혈양파의 번역工房
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
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