본문으로 건너뛰기

타입 매핑과 게이트

「Lua 언어 지원」으로 돌아가기


11. 타입 매핑

테빗Lua비고
string · text · assetstringUTF-8 바이트 그대로
boolboolean
intinteger5.3+의 정수 부분형
bigint · bitsetinteger64비트 그대로
float · doublenumber
datetime · timespaninteger (틱)
uuidstring정규형 소문자, 8절
enuminteger + 이름 테이블Keyword.END 상수와 값→이름 조회
배열1-기반 시퀀스6절

Lua만의 함정

무엇내용
정수와 실수가 한 타입의 두 부분형 (5.3+)11.0은 같다고 비교되지만 다르게 찍히고 math.type이 다릅니다. 디코드 경로에 /가 하나라도 섞이면 정수 컬럼이 실수로 격상됩니다 — 나눗셈은 전부 정수 나눗셈 백엔드로. 하네스의 정식 출력이 1.0을 내는 순간 대조가 어긋나므로 게이트가 이것을 잡습니다
int64 cdata의 문자열화 (LuaJIT)tostring123LL처럼 접미사를 붙입니다. 하네스와 십진 문자열을 내는 모든 자리가 접미사를 뗀 포맷 함수를 거쳐야 하고, 그 함수는 2절의 백엔드에 있습니다
정수 오버플로는 랩어라운드varint 누적·zig-zag가 기대는 성질이 기본 동작입니다. Swift의 &+ 같은 별도 표기가 필요 없는 대신, 조심할 것이 없다는 것 자체를 적어 둡니다
문자열 불변제자리 복호가 없습니다 — 4절의 사본 반환
#과 빈 시퀀스가운데가 nil인 시퀀스는 #이 정의되지 않습니다. 옵셔널 원소 배열에서도 값 자리는 항상 채우는 6절의 규칙이 이것까지 같이 지킵니다

12. 게이트 — 하네스는 Lua를 찾지 않고 만듭니다

결정(하네스). 적합성 하네스는 lua.exe를 PATH에서 찾지 않습니다. Lua 5.4 소스(ANSI C 30여 파일, MIT)를 test/fixtures/tools/lua/에 벤더하고, 하네스 빌드가 그 소스 + 임베더 main.c + tabbit_native.c이미 있는 C 툴체인 탐색(CToolchain)으로 한 번에 컴파일합니다.

근거내용
가용성이 C와 같아집니다LuaIsAvailable이 곧 CIsAvailable입니다. CI에 Lua 설치 단계가 생기지 않고, 버전 편차도 없습니다
소비자와 같은 통합 형태를 증명합니다게임 엔진이 Lua를 쓰는 방식이 정확히 이것 — 소스를 넣고 C 모듈을 정적으로 등록하는 것 — 입니다. Unreal 스텁이 「엔진 없이 엔진의 형태대로」인 것과 같은 자리입니다
C 모듈 빌드가 게이트에 공짜로 들어옵니다tabbit_native.c가 컴파일되지 않으면 하네스 빌드가 실패합니다

게이트는 Swift의 목록에 오타 거부와 LuaJIT 모드가 더해진 아홉이고, 컴파일 게이트가 읽기 게이트로 바뀝니다 — Lua는 파싱이 거의 아무것도 증명하지 않는 언어이므로(row.slot[j].idslot이 무엇이든 파싱됩니다), Python·Ruby·PHP처럼 바이너리를 실제로 읽어 값을 대조합니다.

게이트무엇
적합성 코퍼스다른 언어와 같은 하네스 — 서명된 코퍼스를 읽어 JSON으로 내고 기대값과 대조합니다. bigint는 십진 문자열, 정수는 math.type으로 갈라 %d
MAC 거부값 4바이트를 바꾼 사본을 MAC을 이유로 거부하는 것
모듈 없는 순수 Lua 경로tabbit.native를 등록하지 않고 키도 없이 서명된 코퍼스를 읽어 값까지 대조하는 것 — 키 없는 리더가 서명된 파일을 읽는 것은 그 자체로 합법인 경로라서, 평문 시나리오를 따로 두지 않고 같은 코퍼스로 확인합니다. 3절의 첫 줄이 이 게이트로만 지켜집니다 — Swift의 「의존성 0 컴파일」과 같은 자리입니다
중첩·옵셔널nested·optional·record-trim·nested-deep·record-ref·serial-ref·nullable-elements·member-array — 전부 읽기로
예약어reserved-words 픽스처 — ["end"] 키가 실제로 읽히는 것
키 타입key-types·reference-keys — uuid 문자열 키와 int64 키 인덱스
오타 거부없는 필드의 읽기와 쓰기가 로우·enum·상수에서 각각 타입 이름과 함께 오류가 되는 것 — 6절의 엄격 메타테이블은 이 게이트로만 지켜집니다
LuaJIT 모드같은 적합성 대조를 TABBIT_LUAJIT가 가리키는 luajit 실행 파일로 한 번 더 — 언리얼 게이트의 TABBIT_UE_ROOT와 같은 조건부입니다. 키 없이 돕니다: 키를 든 실행은 그 LuaJIT의 임포트 라이브러리로 빌드한 네이티브 모듈이 필요하고, 그것은 소비자의 빌드 시스템의 일입니다. 변수가 없는 기계는 건너뛰고, 2절의 FFI 백엔드는 이 게이트로만 지켜집니다
업데이터바뀐 것만 받기·손상 다운로드 거부·재시도 — UpdaterTestServer 상대, fetch 주입 자리에 테스트 구현
계측디코드 + open의 MB/s. 5절의 「실측이 뒤집으면」을 판정할 숫자가 이것입니다

픽스처 recipe 11개(conformance·key-types·nested·optional·record-trim· nested-deep·record-ref·serial-ref·nullable-elements·member-array· reserved-words)에 lua 타깃이 들어갑니다.

조사 중에 나온 것 하나 — LanguageProfileTests의 기대 목록에 swift가 빠져 있습니다 (리플렉션은 14개를 찾는데 단정은 13개). lua를 넣을 때 그 목록을 고치면서 함께 바로잡습니다.