This commit is contained in:
blueloveTH 2023-05-09 14:36:49 +08:00
parent 93ef42e1d0
commit b5e0ac7121
2 changed files with 21 additions and 6 deletions

View File

@ -522,6 +522,18 @@ struct FStringExpr: Expr{
return fmt("f", src.escape());
}
void _load_simple_expr(CodeEmitContext* ctx, Str expr){
int dot = expr.index(".");
if(dot < 0){
ctx->emit(OP_LOAD_NAME, StrName(expr.sv()).index, line);
}else{
StrName name(expr.substr(0, dot).sv());
StrName attr(expr.substr(dot+1).sv());
ctx->emit(OP_LOAD_NAME, name.index, line);
ctx->emit(OP_LOAD_ATTR, attr.index, line);
}
}
void emit(CodeEmitContext* ctx) override {
VM* vm = ctx->vm;
static const std::regex pattern(R"(\{(.*?)\})");
@ -539,15 +551,11 @@ struct FStringExpr: Expr{
Str expr = m[1].str();
int conon = expr.index(":");
if(conon >= 0){
ctx->emit(
OP_LOAD_NAME,
StrName(expr.substr(0, conon)).index,
line
);
_load_simple_expr(ctx, expr.substr(0, conon));
Str spec = expr.substr(conon+1);
ctx->emit(OP_FORMAT_STRING, ctx->add_const(VAR(spec)), line);
}else{
ctx->emit(OP_LOAD_NAME, StrName(expr).index, line);
_load_simple_expr(ctx, expr);
}
size++;
i = (int)(m.position() + m.length());

View File

@ -48,3 +48,10 @@ assert f'{b:10}' == '123 '
assert f'{b:>10}' == ' 123'
assert f'{b:1}' == '123'
assert f'{b:10s}' == '123 '
obj = object()
obj.b = '123'
assert f'{obj.b:10}' == '123 '
assert f'{obj.b:>10}' == ' 123'
assert f'{obj.b:1}' == '123'
assert f'{obj.b:10s}' == '123 '