diff --git a/src/expr.h b/src/expr.h index 0e106e24..25849da6 100644 --- a/src/expr.h +++ b/src/expr.h @@ -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()); diff --git a/tests/25_rawstring.py b/tests/25_rawstring.py index b638acf2..07cd31bd 100644 --- a/tests/25_rawstring.py +++ b/tests/25_rawstring.py @@ -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 '