diff options
| -rw-r--r-- | docs/design/001-language-v0.md | 2 | ||||
| -rw-r--r-- | src/compile.c | 8 |
2 files changed, 5 insertions, 5 deletions
diff --git a/docs/design/001-language-v0.md b/docs/design/001-language-v0.md index e9d5b2d..0b7b8dc 100644 --- a/docs/design/001-language-v0.md +++ b/docs/design/001-language-v0.md @@ -63,7 +63,7 @@ on frame { # 1/60초 진행. 핸들러 안에서 dt를 쓸 - 비교와 논리 연산은 0 또는 1을 낸다. `&& ||`는 양쪽을 모두 계산한다. 0이 아니면 참이다. - `if`의 조건은 한 번 계산한다. 문장은 순서대로 실행한다. - `frame`의 `dt`는 1/60이고 키 이벤트의 `dt`는 0이다. -- 한도: 상태 32, 입력 32, 보기 24, 핸들러 64, 명령 512, 스택 64, 소스 32 KiB. +- 한도: 상태 32, 입력 32, 보기 64, 핸들러 64, 명령 512, 스택 64, 소스 32 KiB. - 모듈을 교체하면 같은 이름의 상태 값은 유지하고, 새 상태는 초기값을 쓰고, 없어진 상태는 버린다. 교체에 실패하면 이전 모듈과 상태가 그대로다. diff --git a/src/compile.c b/src/compile.c index 7305937..f990399 100644 --- a/src/compile.c +++ b/src/compile.c @@ -7,8 +7,8 @@ #include <stdlib.h> #include <string.h> -/* Limits and opcodes of Pure module format v4. */ -enum { STATES = 32, INPUTS = 32, VIEWS = 24, HANDLERS = 64, CODE = 512, STACK = 64, NAME = 32, +/* Limits and opcodes of Pure module format v5. */ +enum { STATES = 32, INPUTS = 32, VIEWS = 64, HANDLERS = 64, CODE = 512, STACK = 64, NAME = 32, DEPTH = 64, FIELDS = 32, COLLECTIONS = 1, CONSTANTS = 64, CONSTANT_BYTES = 8192, RECORDS = 8, RECORD_FIELDS = 64, FIELDS_PER_RECORD = 16 }; enum { CONST, LOAD, DT, ADD, SUB, MUL, DIV, NEG, LT, LE, GT, GE, EQ, NE, AND, OR, NOT, @@ -944,7 +944,7 @@ static void declaration(Compiler *c) { } else if (!strcmp(kind.text, "view")) { Token name = expect_name(c, "view name"); declare(c, &name); - if (c->views == VIEWS) fail_at(c, name.line, name.column, "at most 24 views are allowed"); + if (c->views == VIEWS) fail_at(c, name.line, name.column, "at most 64 views are allowed"); expect(c, "=", "'='"); memcpy(c->view_names[c->views], name.text, NAME); c->view_value[c->views++] = expression(c, 0, false); @@ -1468,7 +1468,7 @@ static void generate(Compiler *c, unsigned char **module, size_t *size) { *size = 40 + 16u * c->states + 12u * c->collections + 16u * c->input_count + 8u * fields + 8u * c->constants + 8u * c->record_count + 16u * c->record_fields + 16u * c->views + 12u * c->handler_count + 16u * c->code_count + used + c->constant_used; unsigned char *p = *module = allocate(c, *size); - memcpy(p, "PUREMOD4", 8); + memcpy(p, "PUREMOD5", 8); put16(p + 8, c->states); put16(p + 10, c->input_count); put16(p + 12, c->views); |
