diff --git a/include/pocketpy/common/str.h b/include/pocketpy/common/str.h index 7452a359..0ed6dbd8 100644 --- a/include/pocketpy/common/str.h +++ b/include/pocketpy/common/str.h @@ -15,22 +15,29 @@ typedef struct c11_sv{ int size; } c11_sv; +/* string */ +typedef struct c11_bytes{ + int size; + const char data[]; +} c11_bytes; + +// int size | char[] | '\0' +typedef c11_bytes c11_string; + int c11_sv__cmp(c11_sv self, c11_sv other); int c11_sv__cmp2(c11_sv self, const char* other, int size); int c11_sv__cmp3(c11_sv self, const char* other); -// int size | char[] | '\0' -typedef const char c11_string; - c11_string* c11_string__new(const char* data); c11_string* c11_string__new2(const char* data, int size); +void c11_string__ctor(c11_string* self, const char* data); +void c11_string__ctor2(c11_string* self, const char* data, int size); c11_string* c11_string__copy(c11_string* self); void c11_string__delete(c11_string* self); -int c11_string__len(c11_string* self); c11_sv c11_string__sv(c11_string* self); c11_string* c11_string__replace(c11_string* self, char old, char new_); -int c11_string__u8_length(const c11_string* self); +int c11_string__u8_length(c11_string* self); c11_sv c11_string__u8_getitem(c11_string* self, int i); c11_string* c11_string__u8_slice(c11_string* self, int start, int stop, int step); diff --git a/include/pocketpy/pocketpy.h b/include/pocketpy/pocketpy.h index 872f1a30..8a658605 100644 --- a/include/pocketpy/pocketpy.h +++ b/include/pocketpy/pocketpy.h @@ -321,7 +321,6 @@ const char* py_tpname(py_Type type); /// %p: void* /// %t: py_Type /// %n: py_Name -const char* py_fmt(const char* fmt, ...); #define MAGIC_METHOD(x) extern uint16_t x; #include "pocketpy/xmacros/magics.h" diff --git a/src/common/sourcedata.c b/src/common/sourcedata.c index 6862b7f2..67bb235a 100644 --- a/src/common/sourcedata.c +++ b/src/common/sourcedata.c @@ -27,7 +27,7 @@ static void pk_SourceData__ctor(struct pk_SourceData* self, } self->source = pk_SStream__submit(&ss); self->is_precompiled = (strncmp(source, "pkpy:", 5) == 0); - c11_vector__push(const char*, &self->line_starts, self->source); + c11_vector__push(const char*, &self->line_starts, self->source->data); } static void pk_SourceData__dtor(struct pk_SourceData* self) { @@ -77,7 +77,7 @@ c11_string* pk_SourceData__snapshot(const struct pk_SourceData* self, pk_SStream ss; pk_SStream__ctor(&ss); - pk_sprintf(&ss, " File \"%S\", line %d", &self->filename, lineno); + pk_sprintf(&ss, " File \"%s\", line %d", self->filename->data, lineno); if(name && *name) { pk_SStream__write_cstr(&ss, ", in "); diff --git a/src/common/sstream.c b/src/common/sstream.c index e9f7cf0b..8bda68c6 100644 --- a/src/common/sstream.c +++ b/src/common/sstream.c @@ -1,5 +1,6 @@ #include "pocketpy/common/sstream.h" #include "pocketpy/common/config.h" +#include "pocketpy/common/str.h" #include "pocketpy/common/utils.h" #include "pocketpy/pocketpy.h" @@ -9,7 +10,7 @@ #include #include -const static int C11_STRING_HEADER_SIZE = sizeof(int); +const static int C11_STRING_HEADER_SIZE = sizeof(c11_string); void pk_SStream__ctor(pk_SStream* self) { c11_vector__ctor(&self->data, sizeof(char)); @@ -24,14 +25,14 @@ void pk_SStream__write_char(pk_SStream* self, char c) { c11_vector__push(char, & void pk_SStream__write_int(pk_SStream* self, int i) { // len('-2147483648') == 11 c11_vector__reserve(&self->data, self->data.count + 11 + 1); - int n = sprintf(self->data.data, "%d", i); + int n = snprintf(self->data.data, 11 + 1, "%d", i); self->data.count += n; } void pk_SStream__write_i64(pk_SStream* self, int64_t val) { // len('-9223372036854775808') == 20 c11_vector__reserve(&self->data, self->data.count + 20 + 1); - int n = sprintf(self->data.data, "%lld", (long long)val); + int n = snprintf(self->data.data, 20 + 1, "%lld", (long long)val); self->data.count += n; } @@ -106,9 +107,9 @@ void pk_SStream__write_ptr(pk_SStream* self, void* p) { c11_string* pk_SStream__submit(pk_SStream* self) { c11_vector__push(char, &self->data, '\0'); c11_array arr = c11_vector__submit(&self->data); - int* p = arr.data; - *p = arr.count - C11_STRING_HEADER_SIZE - 1; - return (c11_string*)(p + 1); + c11_string* retval = (c11_string*)arr.data; + retval->size = arr.count - C11_STRING_HEADER_SIZE - 1; + return retval; } void pk_vsprintf(pk_SStream* ss, const char* fmt, va_list args) { @@ -186,18 +187,3 @@ void pk_sprintf(pk_SStream* ss, const char* fmt, ...) { pk_vsprintf(ss, fmt, args); va_end(args); } - -const char* py_fmt(const char* fmt, ...) { - PK_THREAD_LOCAL pk_SStream ss; - if(ss.data.elem_size == 0) { - pk_SStream__ctor(&ss); - } else { - c11_vector__clear(&ss.data); - } - va_list args; - va_start(args, fmt); - pk_vsprintf(&ss, fmt, args); - va_end(args); - pk_SStream__write_char(&ss, '\0'); - return (const char*)ss.data.data; -} diff --git a/src/common/str.c b/src/common/str.c index 58f90b72..cdb36bdf 100644 --- a/src/common/str.c +++ b/src/common/str.c @@ -11,54 +11,53 @@ c11_string* c11_string__new(const char* data) { return c11_string__new2(data, strlen(data)); } c11_string* c11_string__new2(const char* data, int size) { - int* p = malloc(sizeof(int) + size + 1); - *p++ = size; + c11_string* retval = malloc(sizeof(c11_string) + size + 1); + c11_string__ctor2(retval, data, size); + return retval; +} + +void c11_string__ctor(c11_string* self, const char* data) { + c11_string__ctor2(self, data, strlen(data)); +} + +void c11_string__ctor2(c11_string* self, const char* data, int size) { + self->size = size; + char* p = (char*)self->data; memcpy(p, data, size); - ((char*)p)[size] = '\0'; - return (c11_string*)p; + p[size] = '\0'; } c11_string* c11_string__copy(c11_string* self) { - int* p = (int*)self - 1; - int total_size = sizeof(int) + *p + 1; - int* q = malloc(total_size); - memcpy(q, p, total_size); - return (c11_string*)(q + 1); + int total_size = sizeof(c11_string) + self->size + 1; + c11_string* retval = malloc(total_size); + memcpy(retval, self, total_size); + return retval; } void c11_string__delete(c11_string* self) { - int* p = (int*)self - 1; - free(p); -} - -int c11_string__len(c11_string* self) { - int* p = (int*)self - 1; - return *p; + free(self); } c11_sv c11_string__sv(c11_string* self) { - int* p = (int*)self - 1; - return (c11_sv){self, *p}; + return (c11_sv){self->data, self->size}; } c11_string* c11_string__replace(c11_string* self, char old, char new_) { c11_string* retval = c11_string__copy(self); - char* p = (char*)retval; - int size = c11_string__len(retval); - for(int i = 0; i < size; i++) { + char* p = (char*)retval->data; + for(int i = 0; i < retval->size; i++) { if(p[i] == old) p[i] = new_; } return retval; } int c11_string__u8_length(c11_string* self) { - int size = c11_string__len(self); - return c11__byte_index_to_unicode(self, size); + return c11__byte_index_to_unicode(self->data, self->size); } c11_sv c11_string__u8_getitem(c11_string* self, int i) { - i = c11__unicode_index_to_byte(self, i); - int size = c11__u8_header(self[i], false); + i = c11__unicode_index_to_byte(self->data, i); + int size = c11__u8_header(self->data[i], false); return c11_sv__slice2(c11_string__sv(self), i, i + size); } diff --git a/src/compiler/compiler.c b/src/compiler/compiler.c index eec27067..c73a056c 100644 --- a/src/compiler/compiler.c +++ b/src/compiler/compiler.c @@ -2054,11 +2054,11 @@ Error* pk_compile(pk_SourceData_ src, CodeObject* out) { if(err) return err; Token* data = (Token*)tokens.data; - printf("%s\n", src->filename); + printf("%s\n", src->filename->data); for(int i = 0; i < tokens.count; i++) { Token* t = data + i; c11_string* tmp = c11_string__new2(t->start, t->length); - printf("[%d] %s: %s\n", t->line, pk_TokenSymbols[t->type], tmp); + printf("[%d] %s: %s\n", t->line, pk_TokenSymbols[t->type], tmp->data); c11_string__delete(tmp); } diff --git a/src/compiler/lexer.c b/src/compiler/lexer.c index d6a2188d..2cb1a704 100644 --- a/src/compiler/lexer.c +++ b/src/compiler/lexer.c @@ -40,7 +40,7 @@ const static TokenValue EmptyTokenValue; static void pk_Lexer__ctor(pk_Lexer* self, pk_SourceData_ src){ PK_INCREF(src); self->src = src; - self->curr_char = self->token_start = src->source; + self->curr_char = self->token_start = src->source->data; self->current_line = 1; self->brackets_level = 0; c11_vector__ctor(&self->nexts, sizeof(Token)); @@ -549,7 +549,7 @@ static Error* lex_one_token(pk_Lexer* self, bool* eof){ static Error* from_precompiled(pk_Lexer* self) { TokenDeserializer deserializer; - TokenDeserializer__ctor(&deserializer, self->src->source); + TokenDeserializer__ctor(&deserializer, self->src->source->data); deserializer.curr += 5; // skip "pkpy:" c11_sv version = TokenDeserializer__read_string(&deserializer, '\n'); @@ -576,8 +576,8 @@ static Error* from_precompiled(pk_Lexer* self) { if(is_raw_string_used(t.type)) { int64_t index = TokenDeserializer__read_uint(&deserializer, ','); c11_string* p = c11__getitem(c11_string*, precompiled_tokens, index); - t.start = p; - t.length = c11_string__len(p); + t.start = p->data; + t.length = p->size; } else { t.start = NULL; t.length = 0; @@ -937,7 +937,7 @@ double TokenDeserializer__read_float(TokenDeserializer* self, char c){ // TODO: optimize this c11_string* nullterm = c11_string__new2(sv.data, sv.size); char* end; - double retval = strtod(nullterm, &end); + double retval = strtod(nullterm->data, &end); c11_string__delete(nullterm); assert(*end == 0); return retval; diff --git a/src/interpreter/ceval.c b/src/interpreter/ceval.c index 2e02e33c..d0be6c63 100644 --- a/src/interpreter/ceval.c +++ b/src/interpreter/ceval.c @@ -495,7 +495,7 @@ pk_FrameResult pk_VM__run_top_frame(pk_VM* self) { } SP() = begin; c11_string* res = pk_SStream__submit(&ss); - py_newstrn(SP()++, res, c11_string__len(res)); + py_newstrn(SP()++, res->data, res->size); c11_string__delete(res); DISPATCH(); } diff --git a/src/public/cast.c b/src/public/cast.c index 36ba3bb4..3c38cc3b 100644 --- a/src/public/cast.c +++ b/src/public/cast.c @@ -4,65 +4,58 @@ #include "pocketpy/objects/object.h" #include "pocketpy/interpreter/vm.h" -int64_t py_toint(const py_Ref self){ +int64_t py_toint(const py_Ref self) { assert(self->type == tp_int); return self->_i64; } -double py_tofloat(const py_Ref self){ +double py_tofloat(const py_Ref self) { assert(self->type == tp_float); return self->_f64; } -bool py_castfloat(const py_Ref self, double* out){ - switch(self->type){ - case tp_int: - *out = (double)self->_i64; - return true; - case tp_float: - *out = self->_f64; - return true; - default: - return false; +bool py_castfloat(const py_Ref self, double* out) { + switch(self->type) { + case tp_int: *out = (double)self->_i64; return true; + case tp_float: *out = self->_f64; return true; + default: return false; } } -bool py_tobool(const py_Ref self){ +bool py_tobool(const py_Ref self) { assert(self->type == tp_bool); return self->_bool; } -py_Type py_totype(const py_Ref self){ +py_Type py_totype(const py_Ref self) { assert(self->type == tp_type); py_Type* ud = py_touserdata(self); return *ud; } -const char* py_tostr(const py_Ref self){ +const char* py_tostr(const py_Ref self) { assert(self->type == tp_str); - int* p = PyObject__value(self->_obj); - return (const char*)(p+1); + c11_string* ud = PyObject__value(self->_obj); + return ud->data; } -const char* py_tostrn(const py_Ref self, int* size){ +const char* py_tostrn(const py_Ref self, int* size) { assert(self->type == tp_str); - int* p = PyObject__value(self->_obj); - *size = *p; - return (const char*)(p+1); + c11_string* ud = PyObject__value(self->_obj); + *size = ud->size; + return ud->data; } -const unsigned char* py_tobytes(const py_Ref self, int* size){ +const unsigned char* py_tobytes(const py_Ref self, int* size) { assert(self->type == tp_bytes); int* ud = PyObject__value(self->_obj); *size = *ud; return (unsigned char*)(ud + 1); } -void* py_touserdata(const py_Ref self){ +void* py_touserdata(const py_Ref self) { assert(self && self->is_ptr); return PyObject__value(self->_obj); } -bool py_istype(const py_Ref self, py_Type type){ - return self->type == type; -} +bool py_istype(const py_Ref self, py_Type type) { return self->type == type; } diff --git a/src/public/values.c b/src/public/values.c index 02af220b..621ae9ea 100644 --- a/src/public/values.c +++ b/src/public/values.c @@ -46,10 +46,10 @@ void py_newstr(py_Ref out, const char* data) { void py_newstrn(py_Ref out, const char* data, int size) { pk_ManagedHeap* heap = &pk_current_vm->heap; - int total_size = sizeof(int) + size + 1; + int total_size = sizeof(c11_string) + size + 1; PyObject* obj = pk_ManagedHeap__gcnew(heap, tp_str, 0, total_size); - int* p = PyObject__value(obj); - *p = size; + c11_string* ud = PyObject__value(obj); + c11_string__ctor2(ud, data, size); out->type = tp_str; out->is_ptr = true; out->_obj = obj;