mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-21 12:00:18 +00:00
...
This commit is contained in:
parent
93ef42e1d0
commit
b5e0ac7121
20
src/expr.h
20
src/expr.h
@ -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());
|
||||||
|
@ -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 '
|
||||||
|
Loading…
x
Reference in New Issue
Block a user