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()); 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 { void emit(CodeEmitContext* ctx) override {
VM* vm = ctx->vm; VM* vm = ctx->vm;
static const std::regex pattern(R"(\{(.*?)\})"); static const std::regex pattern(R"(\{(.*?)\})");
@ -539,15 +551,11 @@ struct FStringExpr: Expr{
Str expr = m[1].str(); Str expr = m[1].str();
int conon = expr.index(":"); int conon = expr.index(":");
if(conon >= 0){ if(conon >= 0){
ctx->emit( _load_simple_expr(ctx, expr.substr(0, conon));
OP_LOAD_NAME,
StrName(expr.substr(0, conon)).index,
line
);
Str spec = expr.substr(conon+1); Str spec = expr.substr(conon+1);
ctx->emit(OP_FORMAT_STRING, ctx->add_const(VAR(spec)), line); ctx->emit(OP_FORMAT_STRING, ctx->add_const(VAR(spec)), line);
}else{ }else{
ctx->emit(OP_LOAD_NAME, StrName(expr).index, line); _load_simple_expr(ctx, expr);
} }
size++; size++;
i = (int)(m.position() + m.length()); 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:>10}' == ' 123'
assert f'{b:1}' == '123' assert f'{b:1}' == '123'
assert f'{b:10s}' == '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 '