From 620db020ed6c309020741b332ddd3f8f5bad0072 Mon Sep 17 00:00:00 2001 From: blueloveTH Date: Sat, 23 Nov 2024 16:38:57 +0800 Subject: [PATCH] ... --- include/pocketpy/common/utils.h | 4 +-- scripts/gen_primes.py | 13 ++++++-- src/compiler/compiler.c | 10 +++--- src/interpreter/ceval.c | 8 ++--- src/interpreter/vm.c | 4 +-- src/public/exec.c | 2 +- src/public/internal.c | 2 +- src/public/py_dict.c | 55 ++++++++++++++++++++------------- 8 files changed, 60 insertions(+), 38 deletions(-) diff --git a/include/pocketpy/common/utils.h b/include/pocketpy/common/utils.h index 0eed3634..d0855b85 100644 --- a/include/pocketpy/common/utils.h +++ b/include/pocketpy/common/utils.h @@ -12,9 +12,9 @@ #define PK_HEX_TABLE "0123456789abcdef" #ifdef _MSC_VER -#define c11__unreachedable() __assume(0) +#define c11__unreachable() __assume(0) #else -#define c11__unreachedable() __builtin_unreachable() +#define c11__unreachable() __builtin_unreachable() #endif #define c11__abort(...) \ diff --git a/scripts/gen_primes.py b/scripts/gen_primes.py index b1b533a0..111b96bd 100644 --- a/scripts/gen_primes.py +++ b/scripts/gen_primes.py @@ -15,7 +15,7 @@ def sieve_of_eratosthenes(n: int) -> List[int]: primes = [num for num, prime in enumerate(is_prime) if prime] return primes -all_primes = sieve_of_eratosthenes(2**31) +all_primes = sieve_of_eratosthenes(2**30) print(len(all_primes), all_primes[:10], all_primes[-10:]) index = 3 @@ -24,7 +24,10 @@ caps = [all_primes[index]] while True: for i in range(index+1, len(all_primes)): last_cap = caps[-1] - min_cap = last_cap * 2 + if last_cap < 1000: + min_cap = last_cap * 2 + else: + min_cap = last_cap * 1.5 if all_primes[i] >= min_cap: caps.append(all_primes[i]) index = i @@ -34,3 +37,9 @@ while True: print('-'*20) print(caps) + +print('switch(cap) {') +for i in range(len(caps)-1): + print(f' case {caps[i]}:', f'return {caps[i+1]};') +print(' default: c11__unreachable();') +print('}') \ No newline at end of file diff --git a/src/compiler/compiler.c b/src/compiler/compiler.c index 5572b570..88ce30a9 100644 --- a/src/compiler/compiler.c +++ b/src/compiler/compiler.c @@ -128,7 +128,7 @@ bool NameExpr__emit_del(Expr* self_, Ctx* ctx) { break; case NAME_GLOBAL: Ctx__emit_(ctx, OP_DELETE_GLOBAL, self->name, self->line); break; case NAME_GLOBAL_UNKNOWN: Ctx__emit_(ctx, OP_DELETE_NAME, self->name, self->line); break; - default: c11__unreachedable(); + default: c11__unreachable(); } return true; } @@ -327,7 +327,7 @@ void LiteralExpr__emit_(Expr* self_, Ctx* ctx) { Ctx__emit_(ctx, OP_LOAD_CONST, index, self->line); break; } - default: c11__unreachedable(); + default: c11__unreachable(); } } @@ -355,7 +355,7 @@ void Literal0Expr__emit_(Expr* self_, Ctx* ctx) { case TK_TRUE: opcode = OP_LOAD_TRUE; break; case TK_FALSE: opcode = OP_LOAD_FALSE; break; case TK_DOTDOTDOT: opcode = OP_LOAD_ELLIPSIS; break; - default: c11__unreachedable(); + default: c11__unreachable(); } Ctx__emit_(ctx, opcode, BC_NOARG, self->line); } @@ -1245,7 +1245,7 @@ static void Ctx__emit_store_name(Ctx* self, NameScope scope, py_Name name, int l case NAME_LOCAL: Ctx__emit_(self, OP_STORE_FAST, Ctx__add_varname(self, name), line); break; case NAME_GLOBAL: Ctx__emit_(self, OP_STORE_GLOBAL, name, line); break; case NAME_GLOBAL_UNKNOWN: Ctx__emit_(self, OP_STORE_NAME, name, line); break; - default: c11__unreachedable(); + default: c11__unreachable(); } } @@ -2182,7 +2182,7 @@ static Error* read_literal(Compiler* self, py_Ref out) { } else if(value->index == TokenValue_F64) { py_newfloat(out, negated ? -value->_f64 : value->_f64); } else { - c11__unreachedable(); + c11__unreachable(); } return NULL; } diff --git a/src/interpreter/ceval.c b/src/interpreter/ceval.c index a37c95b1..6d72040b 100644 --- a/src/interpreter/ceval.c +++ b/src/interpreter/ceval.c @@ -60,7 +60,7 @@ static bool stack_format_object(VM* self, c11_sv spec); case RES_RETURN: PUSH(&self->last_retval); break; \ case RES_CALL: frame = self->top_frame; goto __NEXT_FRAME; \ case RES_ERROR: goto __ERROR; \ - default: c11__unreachedable(); \ + default: c11__unreachable(); \ } \ } while(0) @@ -1101,10 +1101,10 @@ FrameResult VM__run_top_frame(VM* self) { if(!ok) goto __ERROR; DISPATCH(); } - default: c11__unreachedable(); + default: c11__unreachable(); } - c11__unreachedable(); + c11__unreachable(); __ERROR: py_BaseException__stpush(&self->curr_exception, @@ -1340,7 +1340,7 @@ static bool stack_format_object(VM* self, c11_sv spec) { c11_sbuf__write_pad(&buf, pad_right, pad_c); break; } - default: c11__unreachedable(); + default: c11__unreachable(); } } else { c11_sbuf__write_sv(&buf, c11_string__sv(body)); diff --git a/src/interpreter/vm.c b/src/interpreter/vm.c index b023eaa6..f78bb402 100644 --- a/src/interpreter/vm.c +++ b/src/interpreter/vm.c @@ -502,10 +502,10 @@ FrameResult VM__vectorcall(VM* self, uint16_t argc, uint16_t kwargc, bool opcall self->stack.sp = p0; // reset the stack return RES_RETURN; } - default: c11__unreachedable(); + default: c11__unreachable(); }; - c11__unreachedable(); + c11__unreachable(); /*****************_py_call*****************/ } diff --git a/src/public/exec.c b/src/public/exec.c index a45bc891..54589ce8 100644 --- a/src/public/exec.c +++ b/src/public/exec.c @@ -64,7 +64,7 @@ bool pk_exec(CodeObject* co, py_Ref module) { FrameResult res = VM__run_top_frame(vm); if(res == RES_ERROR) return false; if(res == RES_RETURN) return true; - c11__unreachedable(); + c11__unreachable(); } bool py_exec(const char* source, const char* filename, enum py_CompileMode mode, py_Ref module) { diff --git a/src/public/internal.c b/src/public/internal.c index fbdefbbc..cb9f5e6a 100644 --- a/src/public/internal.c +++ b/src/public/internal.c @@ -210,7 +210,7 @@ bool pk_loadmethod(py_StackRef self, py_Name name) { self[0] = *py_getslot(cls_var, 0); self[1] = pk__type_info(type)->self; break; - default: c11__unreachedable(); + default: c11__unreachable(); } return true; } diff --git a/src/public/py_dict.c b/src/public/py_dict.c index 634cdf91..30b25618 100644 --- a/src/public/py_dict.c +++ b/src/public/py_dict.c @@ -16,27 +16,40 @@ static uint32_t Dict__next_cap(uint32_t cap) { case 163: return 331; case 331: return 673; case 673: return 1361; - case 1361: return 2729; - case 2729: return 5471; - case 5471: return 10949; - case 10949: return 21911; - case 21911: return 43853; - case 43853: return 87719; - case 87719: return 175447; - case 175447: return 350899; - case 350899: return 701819; - case 701819: return 1403641; - case 1403641: return 2807303; - case 2807303: return 5614657; - case 5614657: return 11229331; - case 11229331: return 22458671; - case 22458671: return 44917381; - case 44917381: return 89834777; - case 89834777: return 179669557; - case 179669557: return 359339171; - case 359339171: return 718678369; - case 718678369: return 1437356741; - default: c11__unreachedable(); + case 1361: return 2053; + case 2053: return 3083; + case 3083: return 4637; + case 4637: return 6959; + case 6959: return 10453; + case 10453: return 15683; + case 15683: return 23531; + case 23531: return 35311; + case 35311: return 52967; + case 52967: return 79451; + case 79451: return 119179; + case 119179: return 178781; + case 178781: return 268189; + case 268189: return 402299; + case 402299: return 603457; + case 603457: return 905189; + case 905189: return 1357787; + case 1357787: return 2036687; + case 2036687: return 3055043; + case 3055043: return 4582577; + case 4582577: return 6873871; + case 6873871: return 10310819; + case 10310819: return 15466229; + case 15466229: return 23199347; + case 23199347: return 34799021; + case 34799021: return 52198537; + case 52198537: return 78297827; + case 78297827: return 117446801; + case 117446801: return 176170229; + case 176170229: return 264255353; + case 264255353: return 396383041; + case 396383041: return 594574583; + case 594574583: return 891861923; + default: c11__unreachable(); } }