![]() |
|
||||||||
경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지 |
|
그 아이 [tsirorret]
2015-09-11 08:39 X
빌더님은 정말 대단하시군요. 저는 다른 분야라 컴파일러 쪽은 잘 모르지만 존경합니다.
컴파일러에서 Exception을 구현하 방법을... 단 몇 줄의 글로 써서 설명하기는 불가능 할 것 같고요...
퍼서널러티에 대해서만 적어 봅니다. A() 라는 함수가 try...catch 블럭을 갖고 있고... 호출 과정이 A -> B -> C -> D의 함수 순으로 이어졌고... 함수 D()에서 'CExceptionQueryError'라는 Exception 객체를 throw로 던졌다고 가정해 봅시다. 그리고 A()에서 catch(CExceptionQueryError &e) 로 예외를 받는 구조가 있다고 해 봅시다. 퍼서널러티 함수가 하는 첫번째 일은... Exception Frame을 Unwinding하면서 해당 Exception Handler를 찾게 되는데.. 이 경우에는 A()함수의 catch (CExceptionQueryError &e) {} . try...catch 블럭이 되겠죠. 두번째 하는 일은...
위에서 찾은 Exception Handler 지점 까지... 각 Exception Fame 별로 설정되어 있는 landing pad 코드를 실행하게 됩니다. (clean up) 그리고... Exception Context를 구성해서 해당 Exception Handler를 실행하게 됩니다. search와 clean up 단계를 2 phase로 실행하게 되는 거죠. 만약 함수 B와 C에 어떤 클래스 객체가 스택변수로 생성되어 있다면... 제어 흐름이 D()에서 A()로 바껴 버리기 때문에... 스택에 생성되어 있는 클래스 객체들의 소멸자도 호출해 주어야 하는데... 이건 clean up 단계에서 이루어지게 됩니다. Exception Frame Unwinding 과정에서 실행되는 clean up 코드와 Exception Handler 코드를 landing pad 라고 합니다. landing pad를 포함해서 Exception 객채의 type-info, try...catch 블럭의 중첩 레벨, call site 정보 등등...
여러 정보들을 컴파일러가 생성하게 되는데... 이를 LSDA라고 합니다. 표준으로 뭐가 정해져 있는 게 아니고 컴파일러 마다 다릅니다. (Language-Specific Data Area) 퍼스널리티가 하는 역할을 요약하면 대충 이렇고요. (댓글로 적으니 앞뒤 문맥이 이상하게 꼬이네. 수정기능도 없고) Exceip 패치코드에 Code Guard 패치코드가 같이 적용된줄 알고... 먼저 올렸던 Code Guard 패치 글은 삭제했는데 빠졌나 보네요. 작업해 놓은 Code Guard 패치코드도 다 지워버린 거 같습니다. 시간 내서(주말 쯤?) 다시 작업해서 올려 보겠습니다. 관련 글 리스트
|
Copyright © 1999-2015, borlandforum.com. All right reserved. |