GnuSmalltalkUsersGuide:BaseChapter 039

From 흡혈양파의 번역工房
Jump to: navigation, search
CompiledMethod

Contents

CompiledMethod

네임스페이스 Smalltalk에 정의됨

슈퍼클래스: CompiledCode

범주: 언어-구현


나는 컴파일된 메서드를 표현한다. 메서드의 소스 코드로부터 메서드를 재컴파일할 수 있고, Emacs를 호출하여 나의 인스턴스들 중 하나에 대한 소스 코드를 편집할 수 있으며, 내 인스턴스의 컴포넌트로 접근하는 방법을 알 수 있다.


CompiledMethod class: c call-outs

pragma

asyncCCall: descr numArgs: numArgs attributes: attributesArray

주어진 인자로 #asyncCCall:args: pragma에 해당하는 CompiledMethod를 리턴하라.

pragma

cCall: descr numArgs: numArgs attributes: attributesArray

주어진 인자로 #cCall:returning:args: pragma에 해당하는 CompiledMethod를 리턴하라.


CompiledMethod 클래스: 인스턴스 생성

literals: lits numArgs: numArg numTemps: numTemp attributes: attrArray bytecodes: bytecodes depth: depth

완전한 CompiledMethod를 응답하라. 매개변수로부터 메서드 헤더를 구성하고, 리터럴과 바이트코드는 제공된 것들로 설정하라. 또 바이트코드는 최적화되며, 내장된 CompiledBlocks는 이러한 리터럴과 새로 생성된 CompiledMethod를 참조하도록 수정된다.

numArgs: args

numArgs 인자를 이용해 사용자가 정의한 메서드를 생성하라 (호출 시 #valueWithReceiver:-withArguments이 전송되는 메서드). CompiledMethod의 서브클래스에 대해 호출한 경우에만 의미가 있다.


CompiledMethod 클래스: lean 이미지

stripSourceCode

메서드 소스 코드로의 모든 참조를 시스템으로부터 제거하라.


CompiledMethod: 접근하기

allBlocksDo: aBlock

aBlock을 평가하여 그것이 보유한 모든 CompiledBlocks로 전달하라.

allLiterals

수신자가 참조한 리터럴과 그 안의 모든 블록을 응답하라.

flags

Private - 수신자에 대한 최적화 플래그를 응답하라.

isOldSyntax

메서드가 오래된 (chunk-format) 구문으로 작성되었는지 응답하라.

methodCategory

메서드 범주를 응답하라.

methodCategory: aCategory

메서드 범주를 주어진 문자열로 설정하라.

methodClass

수신자가 설치된 클래스를 응답하라.

methodClass: methodClass

수신자의 클래스 인스턴스 변수를 설정하라.

noteOldSyntax

메서드가 오래된 (chunk-format) 구문으로 작성되었음을 기억하라.

numArgs

수신자의 인자 수를 응답하라.

numTemps

수신자의 임시변수(temporaries) 수를 기억하라.

primitive

수신자가 호출한 프리미티브를 응답하라.

selector

메서드가 어떤 선택자를 통해 호출되는지 응답하라.

selector: aSymbol

메서드가 어떤 선택자를 통해서 호출되는지 설정하라.

sourceCodeLinesDelta

LINE NUMBER 바이트코드 내 번호부터 소스 코드 행 번호까지 delta를 응답하라.

stackDepth

수신자에게 필요한 스택 슬롯의 개수를 응답하라.

withAllBlocksDo: aBlock

aBlock을 평가하고 수신자와 그것이 보유하는 모든 CompiledBlocks를 평가하라.

withNewMethodClass: class

클래스로 설정된 메서드 클래스를 이용해 수신자 또는 수신자의 복사본을 응답하라.

withNewMethodClass: class selector: selector

클래스로 설정된 메서드 클래스를 이용해 수신자 또는 수신자의 복사본을 응답하라.


CompiledMethod: 속성

attributeAt: aSymbol

수신자가 정의한 aSymbol이라는 첫 번째 속성에 대한 Message를 리턴하고, 이를 찾을 수 없을 경우 오류를 응답하라.

attributeAt: aSymbol ifAbsent: aBlock

수신자가 정의한 aSymbol이라는 첫 번째 속성에 대한 Message를 리턴하고, 이를 찾을 수 없을 경우 aBlock을 평가하라.

attributes

수신자가 정의한 속성마다 해당되는 Message 들의 Array 를 리턴하라.

attributesDo: aBlock

수신자가 정의한 각 속성마다 aBlock을 평가하고 매번 Message를 전달하라.

isAnnotated

수신자가 어떤 속성이라도 갖고 있는 경우 true를 응답하라.

primitiveAttribute

수신자가 프리미티브를 정의할 경우 그것을 정의하는 데 사용된 속성과 닮은 Message를 리턴하라.


CompiledMethod: 기본

= aMethod

수신자와 aMethod가 같은지 응답하라.

hash

수신자에 대한 해시값을 응답하라.


CompiledMethod: c call-outs

isValidCCall

내가 유효한 플래그, 정보, C 함수를 호출하기 위한 ops를 갖고 있는 것으로 보이는지 응답하고 그 결과를 응답하라.

rewriteAsAsyncCCall: func args: argsArray

해당 설명 없음.

rewriteAsCCall: funcOrDescr for: aClass

해당 설명 없음.

rewriteAsCCall: func returning: returnType args: argsArray

해당 설명 없음.


CompiledMethod: 컴파일하기

methodFormattedSourceString

메서드 소스 코드를 RBFormatter를 이용해 포맷팅된 문자열로 응답하라.

Parser

패키지가 필요하다.

methodParseNode

수신자에 대한 파스 트리를 응답하고 오류가 발생할 경우 nil을 응답하라. Parser 패키지가 필요하다.

parserClass

나의 소스 코드를 파싱할 수 있는 Barhavior>>parserClass와 유사한 파서 클래스를 응답하라. Parser 패키지가 필요하다.

recompile

메서드가 떠나는 클래스의 범위 내에서 메서드를 재컴파일하라.

recompileNotifying: aNotifier

메서드가 떠나는 클래스의 범위 내에서 메서드를 재컴파일하고 #error: 를 aNotifier에게 전송하여 오류를 알려라.


CompiledMethod: 호출하기

valueWithReceiver: anObject withArguments: args

anObject 내에서 메서드를 실행하고 args Array의 요소들을 매개변수로서 전달하라. 메서드는 수신자의 클래스로부터 Object까지의 계층구조에 상주할 필요가 없지만-사실상 MethodDictionary에 전혀 존재할 필요가 없다-잘못된 일을 할 경우 스몰토크 가상 머신의 안정성을 해칠 것이다 (따라서 본인 외에는 탓할 사람이 없다).

메서드 헤더의 플래그 필드가 6인 경우 해당 메서드는 메서드 실행이 요청될 때마다 가상 머신이 콜백할 수 있는 hook를 제공한다. 이런 경우, 메서드를 호출하면 무한 루프를 야기할 것이므로 (가상 머신은 메서드의 실행을 요청하고 메서드는 VM에게 자신을 호출할 것을 요청한다) #subclassResponsibility 오류로 메서드가 실패할 것이다.


CompiledMethod: 인쇄하기

printOn: aStream

수신자의 클래스와 선택자를 aStream 상에 인쇄하라.

storeOn: aStream

수신자를 생성하기 위한 코드를 aStream 상에 인쇄하라.


CompiledMethod: 저장하기와 로딩하기

binaryRepresentationObject

해당 메서드는 PluggableProxy를 CompiledMethods와 사용 가능하도록 허용하기 위해 구현된다. 수신자를 포함하는 클래스 객체로 #>>를 전송하는 DirectedMessage 를 응답하라.


CompiledMethod: 소스 코드

methodRecompilationSourceString

메서드 소스 코드를 문자열로서 응답하여 새로운 구문으로 (괄호가 있다) 되도록 확보하라.

methodSourceCode

메서드 소스 코드를 응답하라 (FileSegment, String, nil 중 하나)

methodSourceFile

메서드 소스 코드가 보관되는 파일을 응답하라.

methodSourcePos

methodSourceFile 내에서 메서드 소스 코드가 보관되는 위치를 응답하라.

methodSourceString

메서드 소스 코드를 문자열로 응답하라.


CompiledMethod: 검사하기

accesses: instVarIndex

수신자 또는 그것이 포함하는 블록이 주어진 색인으로 된 인스턴스 변수로 접근하는지 응답하라.

assigns: instVarIndex

수신자 또는 그것이 포함하는 블록이 주어진 색인으로 된 인스턴스 변수로 작성하는지 응답하라.

isAbstract

수신자가 추상적인지 응답하라.

reads: instVarIndex

수신자 또는 그것이 포함하는 블록이 주어진 색인으로 된 인스턴스 변수를 읽는지 응답하라.

sendsToSuper

수신자 또는 그것이 포함하는 블록이 super로의 전송을 갖는지 응답하라.


Notes