GnuSmalltalkUsersGuide:BaseChapter 039
- CompiledMethod
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로의 전송을 갖는지 응답하라.