문제

나는 여기에서 기본 사항으로 돌아갑니다. 그러나 LUA에서는 다음과 같은 테이블을 정의 할 수 있습니다.

myTable = {}
myTable [1] = 12

테이블 참조 자체를 인쇄하면 포인터가 다시 나타납니다. 요소에 액세스하려면 인덱스를 지정해야합니다 (즉, 배열과 정확히 같습니다).

print(myTable )    --prints pointer
print(myTable[1])  --prints 12

이제 기능은 다른 이야기입니다. SO와 같은 기능을 정의하고 인쇄 할 수 있습니다.

myFunc = function() local x = 14 end     --Defined function
print(myFunc)                            --Printed pointer to function

정의 된 기능의 본문에 액세스하는 방법이 있습니까? 나는 작은 코드 시각화를 만들려고 노력하고 있으며, 시각화 작품이 코드에 '연결'할 수 있도록 특수 함수/변수가있는 주어진 함수를 '시드'하고 싶습니다. 변수 또는 문자열.

도움이 되었습니까?

해결책

일반 LUA에서 주어진 기능의 바디 소스 코드에 액세스 할 수있는 방법은 없습니다. 바이트 코드로 편집 한 후 소스 코드가 버려집니다.

참고 BTW 해당 기능은로드 스트링과 같은 시설을 갖춘 런타임에서 정의 될 수 있습니다.

실제로 달성하고자하는 것에 따라 부분 솔루션이 가능합니다.

디버그 라이브러리에서 소스 코드 위치를 얻을 수 있습니다. 디버그 라이브러리가 활성화되고 디버그 기호가 바이트 코드에서 벗겨지지 않은 경우. 그 후 실제 소스 파일을로드하고 코드를 추출 할 수 있습니다.

필요한 메타 데이터로 수동으로 관심있는 기능을 장식 할 수 있습니다. LUA의 기능은 유효한 테이블 키이므로 MetAdata to-Metadata 테이블을 만들 수 있습니다. 이 테이블을 약화시키기를 원하므로 GC에 의해 함수가 수집되는 것을 막을 수 없습니다.

LUA 코드 분석을위한 솔루션이 필요한 경우 살펴보십시오. Metalua.

다른 팁

디버그 라이브러리를 사용하는 것이 유일한 내기입니다. 이를 사용하면 문자열 (함수가 'loadString'으로로드 된 청크로 정의 된 경우) 또는 함수가 정의 된 파일의 이름을 얻을 수 있습니다. 함수 정의가 시작되고 끝나는 선 수와 함께. 참조 선적 서류 비치.

여기 내 현재 작업에서 우리는 LUA를 패치하여 함수의 시작 및 끝에 열 숫자를 제공하므로 기능 소스를 사용하여 얻을 수 있습니다. 패치는 재생산하기가 그리 어렵지 않지만 여기에 게시 할 수는 없다고 생각합니다 .-(

체크 아웃 LUA 내성 시설 디버깅 라이브러리에서.

디버그 라이브러리의 주요 내성적 기능은 Debug.getInfo 함수입니다. 첫 번째 매개 변수는 함수 또는 스택 레벨 일 수 있습니다. FOO의 경우 debug.getInfo (foo)를 호출하면 해당 기능에 대한 데이터가 포함 된 테이블이 나타납니다. 테이블에는 다음 필드가있을 수 있습니다.

당신이 원하는 분야는 내가 생각하는 기능입니다.

당신은 그것을 만들어서 이것을 달성 할 수 있습니다 환경 각 기능에 대해 (참조 setfenv) 및 글로벌 (대 지역) 변수 사용. 함수에서 생성 된 변수는 함수가 실행 된 후 환경 테이블에 나타납니다.

env = {}
myFunc = function() x = 14 end
setfenv(myFunc, env)
myFunc()
print(myFunc)    -- prints pointer
print(env.x)     -- prints 14

또는, 당신은 그것을 사용할 수 있습니다 디버그 라이브러리:

> myFunc = function() local x = 14 ; debug.debug() end
> myFunc()
> lua_debug> _, x = debug.getlocal(3, 1)
> lua_debug> print(x) -- prints 14

로컬 변수를 후크 기능 디버그 모드를 명시 적으로 입력하는 대신 (예 : Debug.debug () 호출 추가)

또 한있다 디버그 인터페이스 lua c api에서.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top