diff --git a/source/toy_parser.c b/source/toy_parser.c index 53c2e20..469b87b 100644 --- a/source/toy_parser.c +++ b/source/toy_parser.c @@ -388,7 +388,7 @@ static Toy_AstFlag literal(Toy_Bucket** bucketHandle, Toy_Parser* parser, Toy_As buffer[i] = '\0'; unsigned int len = i - escapeCounter; //NOTE: len is ONLY the string length - Toy_private_emitAstValue(bucketHandle, rootHandle, TOY_VALUE_FROM_STRING(Toy_toStringLength(bucketHandle, buffer, len))); + Toy_private_emitAstValue(bucketHandle, rootHandle, TOY_VALUE_FROM_STRING(Toy_createStringLength(bucketHandle, buffer, len))); //BUGFIX: create the string to avoid losing local var 'buffer' return TOY_AST_FLAG_NONE; } diff --git a/source/toy_string.c b/source/toy_string.c index 8fdef6e..2fbe958 100644 --- a/source/toy_string.c +++ b/source/toy_string.c @@ -42,6 +42,21 @@ Toy_String* Toy_toStringLength(Toy_Bucket** bucketHandle, const char* cstring, u return ret; } +Toy_String* Toy_createStringLength(Toy_Bucket** bucketHandle, const char* cstring, unsigned int length) { + Toy_String* ret = (Toy_String*)Toy_partitionBucket(bucketHandle, sizeof(Toy_String)); + char* data = (char*)Toy_partitionBucket(bucketHandle, length + 1); + + strncpy(data, cstring, length); + + ret->info.type = TOY_STRING_LEAF; + ret->info.length = length; + ret->info.refCount = 1; + ret->info.cachedHash = 0; //don't calc until needed + ret->leaf.data = data; //DO make a copy, stored in the bucket + + return ret; +} + Toy_String* Toy_copyString(Toy_String* str) { assert(str->info.refCount != 0 && "Can't copy a string with refcount of zero"); incrementRefCount(str); diff --git a/source/toy_string.h b/source/toy_string.h index 42fe622..7a310ab 100644 --- a/source/toy_string.h +++ b/source/toy_string.h @@ -41,6 +41,8 @@ typedef union Toy_String_t { TOY_API Toy_String* Toy_toString(Toy_Bucket** bucketHandle, const char* cstring); TOY_API Toy_String* Toy_toStringLength(Toy_Bucket** bucketHandle, const char* cstring, unsigned int length); +TOY_API Toy_String* Toy_createStringLength(Toy_Bucket** bucketHandle, const char* cstring, unsigned int length); + TOY_API Toy_String* Toy_copyString(Toy_String* str); TOY_API Toy_String* Toy_concatStrings(Toy_Bucket** bucketHandle, Toy_String* left, Toy_String* right); diff --git a/source/toy_vm.c b/source/toy_vm.c index bf408ea..f0b2677 100644 --- a/source/toy_vm.c +++ b/source/toy_vm.c @@ -63,7 +63,7 @@ static void processRead(Toy_VM* vm) { case TOY_VALUE_STRING: { enum Toy_StringType stringType = READ_BYTE(vm); - int len = (int)READ_BYTE(vm); //only needed for name strings + //int len = (int)READ_BYTE(vm); //WARN: only used for name strings //grab the jump as an integer unsigned int jump = *((int*)(vm->code + vm->jumpsAddr + READ_INT(vm))); @@ -73,7 +73,7 @@ static void processRead(Toy_VM* vm) { //build a string from the data section if (stringType == TOY_STRING_LEAF) { - value = TOY_VALUE_FROM_STRING(Toy_toStringLength(&vm->memoryBucket, cstring, len)); + value = TOY_VALUE_FROM_STRING(Toy_toString(&vm->memoryBucket, cstring)); } else { Toy_error("Invalid string type found in opcode read");