Optimizations for f-strings

This commit is contained in:
K. Lange 2021-01-22 08:38:36 +09:00
parent 195bd33a19
commit 8ec3cfe07d
3 changed files with 22 additions and 5 deletions

View File

@ -1770,8 +1770,11 @@ static void string(int type) {
}
c += 2;
} else if (isFormat && *c == '{') {
emitConstant(OBJECT_VAL(krk_copyString(stringBytes,stringLength)));
if (atLeastOne) emitByte(OP_ADD);
if (!atLeastOne || stringLength) { /* Make sure there's a string for coersion reasons */
emitConstant(OBJECT_VAL(krk_copyString(stringBytes,stringLength)));
if (atLeastOne) emitByte(OP_ADD);
atLeastOne = 1;
}
stringLength = 0;
KrkScanner beforeExpression = krk_tellScanner();
Parser parserBefore = parser;
@ -1814,7 +1817,7 @@ static void string(int type) {
error("Expected closing } after expression in f-string");
goto _cleanupError;
}
emitByte(OP_ADD);
if (atLeastOne) emitByte(OP_ADD);
atLeastOne = 1;
c++;
} else {
@ -1839,9 +1842,11 @@ static void string(int type) {
emitConstant(OBJECT_VAL(bytes));
return;
}
emitConstant(OBJECT_VAL(krk_copyString(stringBytes,stringLength)));
if (!isFormat || stringLength || !atLeastOne) {
emitConstant(OBJECT_VAL(krk_copyString(stringBytes,stringLength)));
if (atLeastOne) emitByte(OP_ADD);
}
FREE_ARRAY(char,stringBytes,stringCapacity);
if (isFormat && atLeastOne) emitByte(OP_ADD);
#undef PUSH_CHAR
return;
_cleanupError:

6
test/testFStrings.krk Normal file
View File

@ -0,0 +1,6 @@
print(f"Regular string")
print(f"{1 + 2}")
print(f"{1 + 2} with a string after")
print(f"with a string before {1 + 2}")
print(f"with {1+2}{object} nothing in between")
print(f"{1 + 2}{3 + 4}{[]}{{}} with some fun expressions")

View File

@ -0,0 +1,6 @@
Regular string
3
3 with a string after
with a string before 3
with 3<type 'object'> nothing in between
37[]{} with some fun expressions