blueloveTH 2 years ago
parent
commit
b5e0ac7121
2 changed files with 21 additions and 6 deletions
  1. 14 6
      src/expr.h
  2. 7 0
      tests/25_rawstring.py

+ 14 - 6
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());

+ 7 - 0
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       '