diff --git a/include/pocketpy/common/vector.h b/include/pocketpy/common/vector.h index 1dc0a9ff..8acf246c 100644 --- a/include/pocketpy/common/vector.h +++ b/include/pocketpy/common/vector.h @@ -34,6 +34,7 @@ c11_vector c11_vector__copy(const c11_vector* self); void c11_vector__reserve(c11_vector* self, int capacity); void c11_vector__clear(c11_vector* self); void* c11_vector__emplace(c11_vector* self); +c11_array c11_vector__submit(c11_vector* self); #define c11__getitem(T, self, index) (((T*)(self)->data)[index]) #define c11__setitem(T, self, index, value) ((T*)(self)->data)[index] = value; diff --git a/src/common/sstream.c b/src/common/sstream.c index 40e74caf..8a6dcdb8 100644 --- a/src/common/sstream.c +++ b/src/common/sstream.c @@ -152,12 +152,13 @@ void pk_SStream__write_any(pk_SStream* self, const char* fmt, const pk_AnyStr* a py_Str pk_SStream__submit(pk_SStream* self) { c11_vector__push(char, &self->data, '\0'); + c11_array a = c11_vector__submit(&self->data); // TODO: optimize c11__isascii py_Str retval = { - .size = self->data.count - 1, - .is_ascii = c11__isascii((char*)self->data.data, self->data.count), + .size = a.count - 1, + .is_ascii = c11__isascii((char*)a.data, a.count), .is_sso = false, - ._ptr = (char*)self->data.data + ._ptr = (char*)a.data }; return retval; } diff --git a/src/common/vector.c b/src/common/vector.c index 4696a0f6..b46676df 100644 --- a/src/common/vector.c +++ b/src/common/vector.c @@ -62,3 +62,15 @@ void* c11_vector__emplace(c11_vector* self){ self->count++; return p; } + +c11_array c11_vector__submit(c11_vector* self){ + c11_array retval = { + .data = self->data, + .count = self->count, + .elem_size = self->elem_size + }; + self->data = NULL; + self->count = 0; + self->capacity = 0; + return retval; +} diff --git a/src/compiler/lexer.c b/src/compiler/lexer.c index 5abbbf3c..a8df1047 100644 --- a/src/compiler/lexer.c +++ b/src/compiler/lexer.c @@ -739,13 +739,8 @@ Error* pk_Lexer__process(pk_SourceData_ src, c11_array* out_tokens){ } } // set out_tokens - *out_tokens = (c11_array){ - .data = lexer.nexts.data, - .count = lexer.nexts.count, - .elem_size = lexer.nexts.elem_size - }; - c11_vector__ctor(&lexer.nexts, sizeof(Token)); - + *out_tokens = c11_vector__submit(&lexer.nexts); + pk_Lexer__dtor(&lexer); return NULL; }