GnuSmalltalkUsersGuide:BaseChapter 038
- CompiledCode
CompiledCode
네임스페이스 Smalltalk에 정의됨
슈퍼클래스: ArrayedCollection
범주: 언어-구현
- 나는 컴파일된 코드를 표현한다. 나는 블록과 메서드를 위한 추상 슈퍼클래스이다.
CompiledCode 클래스: 캐시 비우기(cache flushing)
flushTranslatorCache
가상 머신에서 (존재하는 경우) just-in-time 코드 번역기에 의해 유지되는 캐시 유형을 응답하라. 현재로선 아무 일도 하지 않는다.
CompiledCode 클래스: 인스턴스 생성
new: numBytecodes header: anInteger literals: literals
주어진 바이트코드 수와 주어진 헤더의 공간이 있는 수신자의 새 인스턴스를 응답하라.
new: numBytecodes header: anInteger numLiterals: numLiterals
주어진 바이트코드 수와 주어진 헤더의 공간이 있는 수신자의 새 인스턴스를 응답하라.
CompiledCode 클래스: 테이블
bytecodeInfoTable
바이트코드의 일부 프로퍼티를 정의하는 ByteArray를 리턴하라. 각 바이트코드마다 4 바이트가 예약된다. 4번째 바이트는 플래그 바이트이다: bit 7은 인자가 bytecode->line number 매핑을 생성 시 사용되는 행 번호임을 의미한다.
첫 세 개는 연산의 조합을 나타내는 바이트코드에만 적용되는 의미를 갖는다: 4번째 바이트의 bit 0 = 0일 경우 BC1 ARG BC2 OPERAND 조합이 가능하고, 4번째 바이트의 bit 0 = 1인 경우 BC1 OPERAND BC2 ARG 조합이 가능한데 여기서 BC1 은 첫 번째, BC2는 두 번째, ARG는 세 번째 바이트이고 OPERAND는 바이트코드 스트림에 표시되는 바이트 인자다.
specialSelectors
메서드 내에서 전송되어야 하는 리터럴에 있을 필요가 없는 메시지명의 배열을 응답하라. 여기서 그들의 위치는 바이트코드로 된 정수 코드를 반영한다.
specialSelectorsNumArgs
#specialSelector가 응답한 메시지에 대한 arities의 조화로운 색인(harmoniously-indexed) 배열을 응답하라.
CompiledCode: 접근하기
at: anIndex put: aBytecode
aBytecode를 anIndex-th 바이트코드로서 보관하라.
blockAt: anIndex
리터럴이 CompiledBlock 또는 BlockClosure일 것으로 가정하고 anIndex-th 리터럴에 부착된 CompiledBlock을 응답하라.
bytecodeAt: anIndex
anIndex-th 바이트코드를 응답하라.
bytecodeAt: anIndex put: aBytecode
aBytecode를 anIndex-th 바이트코드로서 보관하라.
flags
Private - 수신자에 대한 최적화 플래그를 응답하라.
isAnnotated
'false'를 응답하라.
literalAt: anIndex
anIndex-th 리터럴을 응답하라.
literalAt: anInteger put: aValue
aValue를 anIndex-th 리터럴로 보관하라.
literals
나의 코드 또는 내가 소유하는 CompiledCode 인스턴스가 참조하는 리터럴을 응답하라.
methodClass
수신자가 설치된 클래스를 응답하라.
methodClass: methodClass
수신자의 클래스 인스턴스 변수를 설정하라.
numArgs
수신자의 인자 수를 응답하라.
numLiterals
수신자에 대한 리터럴 수를 응답하라.
numTemps
수신자에 대한 임시변수(temporaries)의 수를 응답하라.
primitive
수신자가 호출한 프리미티브를 응답하라.
selector
메서드가 어떤 선택자를 통해 호출되는지 응답하라.
selector: aSymbol
메서드가 어떤 선택자를 통해 호출되는지 설정하라.
sourceCodeLinesDelta
LINE NUMBER 바이트코드 내 번호부터 소스 코드 행 번호까지 delta를 응답하라.
stackDepth
수신자에게 필요한 스택 슬롯의 개수를 응답하라.
CompiledCode: 기본
= aMethod
수신자와 aMethod가 같은지 응답하라.
hash
수신자에 대한 해시값을 응답하라.
methodCategory
메서드 범주를 응답하라.
methodCategory: aCategory
메서드 범주를 주어진 문자열로 설정하라.
methodSourceCode
메서드 소스 코드를 응답하라 (FileSegment, String, nil 중 하나)
methodSourceFile
메서드 소스 코드가 보관된 파일을 응답하라.
methodSourcePos
methodSourceFile 내에서 메서드 소스 코드가 보관된 위치를 응답하라.
methodSourceString
메서드 소스 코드를 문자열로서 응답하라.
CompiledCode: 복사하기
deepCopy
수신자의 깊은 복사(deep copy)를 응답하라.
CompiledCode: 디버깅하기
inspect
수신자의 내용을 길게 인쇄하라.
CompiledCode: 바이트코드 디코딩하기
dispatchTo: anObject with: param
바이트코드를 역어셈블하고 메시지 전송의 형태로 anObject에게 알린다. Param은 모든 메시지 전송에 인자로서 주어진다.
CompiledCode: 리터럴 - 반복
allLiteralSymbolsDo: aBlock
#allLiteralsDo: 와 같지만 발견된 Symbols로 aBlock을 호출하라.
allLiteralsDo: aBlock
나의 리터럴을 walk시키되 Arrays와 Messages로 내려가면서 접촉된 각 객체로 aBlock을 호출한다.
literalsDo: aBlock
나의 리터럴 리스트 내 각 객체로 즉시 aBlock을 호출하라.
CompiledCode: 보안
verify
수신자에 대한 바이트코드를 검증하고 검증 과정이 실패할 경우 예외를 발생시켜라.
CompiledCode: 접근 검사하기
accesses: instVarIndex
주어진 색인으로 수신자가 인스턴스 변수에 접근하는지 응답하라.
assigns: instVarIndex
주어진 색인으로 수신자가 인스턴스 변수에 작성하는지 응답하라.
containsLiteral: anObject
수신자가 anObject와 같은 리터럴을 포함하는지 응답하라.
hasBytecode: byte between: firstIndex and: lastIndex
수신자가 firstIndex와 lastIndex 사이의 색인에 'byte' 바이트코드를 포함하는지 응답하라.
jumpDestinationAt: anIndex forward: aBoolean
바이트코드 색인 'anIndex' 에서 점프(jump)가 착지(land)하는지 응답하라.
reads: instVarIndex
주어진 색인으로 수신자가 인스턴스 변수를 읽는지 응답하라.
refersTo: anObject
수신자가 주어진 객체를 참조하는지 응답하라.
sendsToSuper
수신자가 super로의 전송을 포함하는지 응답하라.
sourceCodeMap
바이트코드 색인을 소스 코드 행 번호로 매핑하는 배열을 응답하라. 0 값은 유효하지 않은 명령어 포인터 색인을 나타낸다.
CompiledCode: 번역
discardTranslation
수신자(가 있을 경우)에 대한 just-in-time 번역된 코드를 정리하라.