Skip to content

Get len() and string indexing working #198

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 9 commits into from
Mar 4, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions integration_tests/run_tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
"test_builtin_int.py",
"test_builtin_len.py",
"test_builtin_float.py",
"test_builtin_str_02.py",
"test_math1.py",
"test_math_02.py",
"test_c_interop_01.py",
Expand Down
2 changes: 2 additions & 0 deletions integration_tests/test_builtin_len.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,5 @@ def test_len():
assert len(s) == 0
assert len("abcd") == 4
assert len("") == 0

test_len()
19 changes: 19 additions & 0 deletions integration_tests/test_builtin_str_02.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
def _lpython_str_equal(a: str, b: str) -> bool:
if len(a) != len(b):
return False
i: i32
for i in range(len(a)):
if a[i] != b[i]:
return False
return True

def f():
assert _lpython_str_equal("a", "a")
assert not _lpython_str_equal("a2", "a")
assert not _lpython_str_equal("a", "a123")
assert not _lpython_str_equal("a23", "a24")
assert _lpython_str_equal("a24", "a24")
assert _lpython_str_equal("abcdefg", "abcdefg")
assert not _lpython_str_equal("abcdef3", "abcdefg")

f()
4 changes: 3 additions & 1 deletion src/libasr/codegen/asr_to_cpp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1070,7 +1070,9 @@ Kokkos::View<T*> from_std_vector(const std::vector<T> &v)
void visit_DoConcurrentLoop(const ASR::DoConcurrentLoop_t &x) {
std::string indent(indentation_level*indentation_spaces, ' ');
std::string out = indent + "Kokkos::parallel_for(";
out += "Kokkos::RangePolicy<Kokkos::DefaultExecutionSpace>(1, ";
out += "Kokkos::RangePolicy<Kokkos::DefaultExecutionSpace>(";
visit_expr(*x.m_head.m_start);
out += src + ", ";
visit_expr(*x.m_head.m_end);
out += src + "+1)";
ASR::Variable_t *loop_var = LFortran::ASRUtils::EXPR2VAR(x.m_head.m_v);
Expand Down
37 changes: 26 additions & 11 deletions src/libasr/codegen/asr_to_llvm.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -999,6 +999,8 @@ class ASRToLLVMVisitor : public ASR::BaseVisitor<ASRToLLVMVisitor>
&& ASR::down_cast<ASR::Character_t>(x.m_type)->n_dims == 0) {
// String indexing:
if (x.n_args == 1) {
LFORTRAN_ASSERT(x.m_args[0].m_left)
LFORTRAN_ASSERT(x.m_args[0].m_right)
if (ASR::is_a<ASR::Var_t>(*x.m_args[0].m_left)
&&ASR::is_a<ASR::Var_t>(*x.m_args[0].m_right)) {
ASR::Variable_t *l = EXPR2VAR(x.m_args[0].m_left);
Expand All @@ -1022,7 +1024,20 @@ class ASRToLLVMVisitor : public ASR::BaseVisitor<ASRToLLVMVisitor>
throw CodeGenError("Only string(a:b) for a==b supported for now.", x.base.base.loc);
}
} else {
throw CodeGenError("Only string(a:b) for a,b variables for now.", x.base.base.loc);
//throw CodeGenError("Only string(a:b) for a,b variables for now.", x.base.base.loc);
// Use the "right" index for now
this->visit_expr_wrapper(x.m_args[0].m_right, true);
llvm::Value *idx = tmp;
idx = builder->CreateSub(idx, llvm::ConstantInt::get(context, llvm::APInt(32, 1)));
//std::vector<llvm::Value*> idx_vec = {llvm::ConstantInt::get(context, llvm::APInt(32, 0)), idx};
std::vector<llvm::Value*> idx_vec = {idx};
llvm::Value *str = builder->CreateLoad(array);
llvm::Value *p = builder->CreateGEP(str, idx_vec);
// TODO: Currently the string starts at the right location, but goes to the end of the original string.
// We have to allocate a new string, copy it and add null termination.

tmp = builder->CreateAlloca(character_type, nullptr);
builder->CreateStore(p, tmp);
}
} else {
throw CodeGenError("Only string(a:b) supported for now.", x.base.base.loc);
Expand Down Expand Up @@ -3901,27 +3916,27 @@ class ASRToLLVMVisitor : public ASR::BaseVisitor<ASRToLLVMVisitor>
} else if (parent_subroutine){
push_nested_stack(parent_subroutine);
}
bool intrinsic_function = ASRUtils::is_intrinsic_function2(s);
uint32_t h;
if (s->m_abi == ASR::abiType::Source) {
if (s->m_abi == ASR::abiType::Source && !intrinsic_function) {
h = get_hash((ASR::asr_t*)s);
} else if (s->m_abi == ASR::abiType::LFortranModule) {
throw CodeGenError("Function LFortran interfaces not implemented yet");
} else if (s->m_abi == ASR::abiType::Interactive) {
h = get_hash((ASR::asr_t*)s);
} else if (s->m_abi == ASR::abiType::Intrinsic) {
} else if (s->m_abi == ASR::abiType::Intrinsic || intrinsic_function) {
std::string func_name = s->m_name;
if( fname2arg_type.find(func_name) != fname2arg_type.end() ) {
h = get_hash((ASR::asr_t*)s);
} else {
if (func_name == "len") {
std::vector<llvm::Value *> args = convert_call_args(x, "len");
LFORTRAN_ASSERT(args.size() == 1)
tmp = lfortran_str_len(args[0]);
return;
}
if( s->m_deftype == ASR::deftypeType::Interface ) {
if (func_name == "len") {
std::vector<llvm::Value *> args = convert_call_args(x, "len");
LFORTRAN_ASSERT(args.size() == 1)
tmp = lfortran_str_len(args[0]);
return;
} else {
throw CodeGenError("Intrinsic '" + func_name + "' not implemented yet and compile time value is not available.");
}
throw CodeGenError("Intrinsic '" + func_name + "' not implemented yet and compile time value is not available.");
} else {
h = get_hash((ASR::asr_t*)s);
}
Expand Down
29 changes: 24 additions & 5 deletions src/lpython/semantics/python_ast_to_asr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -967,6 +967,19 @@ class BodyVisitor : public CommonVisitor<BodyVisitor> {
tmp = ASR::make_Assert_t(al, x.base.base.loc, test, msg);
}

ASR::expr_t *index_add_one(const Location &loc, ASR::expr_t *idx) {
// Add 1 to the index `idx`, assumes `idx` is of type Integer 4
ASR::expr_t *overloaded = nullptr;
ASR::expr_t *comptime_value = nullptr;
ASR::ttype_t *a_type = ASRUtils::TYPE(ASR::make_Integer_t(al, loc,
4, nullptr, 0));
ASR::expr_t *constant_one = ASR::down_cast<ASR::expr_t>(ASR::make_ConstantInteger_t(
al, loc, 1, a_type));
return ASRUtils::EXPR(ASR::make_BinOp_t(al, loc, idx,
ASR::binopType::Add, constant_one, a_type,
comptime_value, overloaded));
}

void visit_Subscript(const AST::Subscript_t &x) {
this->visit_expr(*x.m_value);
ASR::expr_t *value = ASRUtils::EXPR(tmp);
Expand All @@ -981,25 +994,31 @@ class BodyVisitor : public CommonVisitor<BodyVisitor> {
AST::Slice_t *s = AST::down_cast<AST::Slice_t>(x.m_slice);
if (s->m_lower != nullptr) {
this->visit_expr(*s->m_lower);
ai.m_left = ASRUtils::EXPR(tmp);
ai.m_left = index_add_one(x.base.base.loc, ASRUtils::EXPR(tmp));
}
if (s->m_upper != nullptr) {
this->visit_expr(*s->m_upper);
ai.m_right = ASRUtils::EXPR(tmp);
ai.m_right = index_add_one(x.base.base.loc, ASRUtils::EXPR(tmp));
}
if (s->m_step != nullptr) {
this->visit_expr(*s->m_step);
ai.m_step = ASRUtils::EXPR(tmp);
ai.m_step = index_add_one(x.base.base.loc, ASRUtils::EXPR(tmp));
}
} else {
this->visit_expr(*x.m_slice);
ASR::expr_t *index = ASRUtils::EXPR(tmp);
ASR::expr_t *index = index_add_one(x.base.base.loc, ASRUtils::EXPR(tmp));
ai.m_right = index;
}
args.push_back(al, ai);
ASR::symbol_t *s = ASR::down_cast<ASR::Var_t>(value)->m_v;
ASR::Variable_t *v = ASR::down_cast<ASR::Variable_t>(s);
ASR::ttype_t *type = v->m_type;
if (ASR::is_a<ASR::Character_t>(*type)) {
if (!ai.m_left && ai.m_right) {
// String indexing is done using "a(3:3)" style
ai.m_left = ai.m_right;
}
}
args.push_back(al, ai);
tmp = ASR::make_ArrayRef_t(al, x.base.base.loc, s, args.p,
args.size(), type, nullptr);
}
Expand Down
2 changes: 1 addition & 1 deletion tests/reference/asr-dictionary1-a105a36.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
"outfile": null,
"outfile_hash": null,
"stdout": "asr-dictionary1-a105a36.stdout",
"stdout_hash": "7d1a1cf87681db72f9b9ea3b3e5c7e1b5177bb3179e93b13c1867f45",
"stdout_hash": "a1b435f14f711aab8b1ac266fdda7fa5379c00680f64506f88359dde",
"stderr": null,
"stderr_hash": null,
"returncode": 0
Expand Down
2 changes: 1 addition & 1 deletion tests/reference/asr-dictionary1-a105a36.stdout
Original file line number Diff line number Diff line change
@@ -1 +1 @@
(TranslationUnit (SymbolTable 1 {main_program: (Program (SymbolTable 3 {}) main_program [] []), test_Dict: (Subroutine (SymbolTable 2 {x: (Variable 2 x Local () () Default (Dict (Integer 4 []) (Integer 4 [])) Source Public Required .false.), y: (Variable 2 y Local () () Default (Dict (Character 1 -2 () []) (Integer 4 [])) Source Public Required .false.), z: (Variable 2 z Local () () Default (Integer 4 []) Source Public Required .false.)}) test_Dict [] [(= (Var 2 x) (ConstantDictionary [(ConstantInteger 1 (Integer 4 [])) (ConstantInteger 3 (Integer 4 []))] [(ConstantInteger 2 (Integer 4 [])) (ConstantInteger 4 (Integer 4 []))] (Dict (Integer 4 []) (Integer 4 []))) ()) (= (Var 2 y) (ConstantDictionary [(ConstantString "a" (Character 1 1 () [])) (ConstantString "b" (Character 1 1 () []))] [(UnaryOp USub (ConstantInteger 1 (Integer 4 [])) (Integer 4 []) (ConstantInteger -1 (Integer 4 []))) (UnaryOp USub (ConstantInteger 2 (Integer 4 [])) (Integer 4 []) (ConstantInteger -2 (Integer 4 [])))] (Dict (Character 1 1 () []) (Integer 4 []))) ()) (= (Var 2 z) (ArrayRef 2 x [(() (ConstantString "a" (Character 1 1 () [])) ())] (Dict (Integer 4 []) (Integer 4 [])) ()) ()) (= (Var 2 z) (ArrayRef 2 x [(() (ConstantString "b" (Character 1 1 () [])) ())] (Dict (Integer 4 []) (Integer 4 [])) ()) ())] Source Public Implementation () .false. .false.)}) [])
(TranslationUnit (SymbolTable 1 {main_program: (Program (SymbolTable 3 {}) main_program [] []), test_Dict: (Subroutine (SymbolTable 2 {x: (Variable 2 x Local () () Default (Dict (Integer 4 []) (Integer 4 [])) Source Public Required .false.), y: (Variable 2 y Local () () Default (Dict (Character 1 -2 () []) (Integer 4 [])) Source Public Required .false.), z: (Variable 2 z Local () () Default (Integer 4 []) Source Public Required .false.)}) test_Dict [] [(= (Var 2 x) (ConstantDictionary [(ConstantInteger 1 (Integer 4 [])) (ConstantInteger 3 (Integer 4 []))] [(ConstantInteger 2 (Integer 4 [])) (ConstantInteger 4 (Integer 4 []))] (Dict (Integer 4 []) (Integer 4 []))) ()) (= (Var 2 y) (ConstantDictionary [(ConstantString "a" (Character 1 1 () [])) (ConstantString "b" (Character 1 1 () []))] [(UnaryOp USub (ConstantInteger 1 (Integer 4 [])) (Integer 4 []) (ConstantInteger -1 (Integer 4 []))) (UnaryOp USub (ConstantInteger 2 (Integer 4 [])) (Integer 4 []) (ConstantInteger -2 (Integer 4 [])))] (Dict (Character 1 1 () []) (Integer 4 []))) ()) (= (Var 2 z) (ArrayRef 2 x [(() (BinOp (ConstantString "a" (Character 1 1 () [])) Add (ConstantInteger 1 (Integer 4 [])) (Integer 4 []) () ()) ())] (Dict (Integer 4 []) (Integer 4 [])) ()) ()) (= (Var 2 z) (ArrayRef 2 x [(() (BinOp (ConstantString "b" (Character 1 1 () [])) Add (ConstantInteger 1 (Integer 4 [])) (Integer 4 []) () ()) ())] (Dict (Integer 4 []) (Integer 4 [])) ()) ())] Source Public Implementation () .false. .false.)}) [])
2 changes: 1 addition & 1 deletion tests/reference/asr-doconcurrentloop_01-3fdc189.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
"outfile": null,
"outfile_hash": null,
"stdout": "asr-doconcurrentloop_01-3fdc189.stdout",
"stdout_hash": "183dfafc0b2bc0eb5c1e9c003ac6593e394015616ef63348ed6e2fd5",
"stdout_hash": "e72faeb1c7457129366580f156612808b1990df5bcac53d69ac077e8",
"stderr": null,
"stderr_hash": null,
"returncode": 0
Expand Down
2 changes: 1 addition & 1 deletion tests/reference/asr-doconcurrentloop_01-3fdc189.stdout
Original file line number Diff line number Diff line change
@@ -1 +1 @@
(TranslationUnit (SymbolTable 1 {_lfortran_main_program: (Subroutine (SymbolTable 5 {}) _lfortran_main_program [] [(SubroutineCall 1 main0 () [] ())] Source Public Implementation () .false. .false.), main0: (Subroutine (SymbolTable 3 {a: (Variable 3 a Local () () Default (Real 4 [((ConstantInteger 1 (Integer 4 [])) (ConstantInteger 10000 (Integer 4 [])))]) Source Public Required .false.), b: (Variable 3 b Local () () Default (Real 4 [((ConstantInteger 1 (Integer 4 [])) (ConstantInteger 10000 (Integer 4 [])))]) Source Public Required .false.), c: (Variable 3 c Local () () Default (Real 4 [((ConstantInteger 1 (Integer 4 [])) (ConstantInteger 10000 (Integer 4 [])))]) Source Public Required .false.), i: (Variable 3 i Local () () Default (Integer 4 []) Source Public Required .false.), nsize: (Variable 3 nsize Local () () Default (Integer 4 []) Source Public Required .false.), scalar: (Variable 3 scalar Local () () Default (Real 4 []) Source Public Required .false.)}) main0 [] [(= (Var 3 scalar) (ImplicitCast (ConstantReal 10.000000 (Real 8 [])) RealToReal (Real 4 []) ()) ()) (= (Var 3 nsize) (ConstantInteger 1234 (Integer 4 [])) ()) (DoConcurrentLoop ((Var 3 i) (ConstantInteger 0 (Integer 4 [])) (BinOp (Var 3 nsize) Sub (ConstantInteger 1 (Integer 4 [])) (Integer 4 []) () ()) (ConstantInteger 1 (Integer 4 []))) [(= (ArrayRef 3 a [(() (Var 3 i) ())] (Real 4 [((ConstantInteger 1 (Integer 4 [])) (ConstantInteger 10000 (Integer 4 [])))]) ()) (ImplicitCast (ConstantReal 5.000000 (Real 8 [])) RealToReal (Real 4 [((ConstantInteger 1 (Integer 4 [])) (ConstantInteger 10000 (Integer 4 [])))]) ()) ()) (= (ArrayRef 3 b [(() (Var 3 i) ())] (Real 4 [((ConstantInteger 1 (Integer 4 [])) (ConstantInteger 10000 (Integer 4 [])))]) ()) (ImplicitCast (ConstantReal 5.000000 (Real 8 [])) RealToReal (Real 4 [((ConstantInteger 1 (Integer 4 [])) (ConstantInteger 10000 (Integer 4 [])))]) ()) ())]) (SubroutineCall 1 triad () [(Var 3 a) (Var 3 b) (Var 3 scalar) (Var 3 c)] ()) (Print () [(ConstantString "End Stream Triad" (Character 1 16 () []))])] Source Public Implementation () .false. .false.), main_program: (Program (SymbolTable 4 {}) main_program [] [(SubroutineCall 1 _lfortran_main_program () [] ())]), triad: (Subroutine (SymbolTable 2 {N: (Variable 2 N Local () () Default (Integer 4 []) Source Public Required .false.), a: (Variable 2 a InOut () () Default (Real 4 [(() ())]) Source Public Required .false.), b: (Variable 2 b InOut () () Default (Real 4 [(() ())]) Source Public Required .false.), c: (Variable 2 c InOut () () Default (Real 4 [(() ())]) Source Public Required .false.), i: (Variable 2 i Local () () Default (Integer 4 []) Source Public Required .false.), scalar: (Variable 2 scalar In () () Default (Real 4 []) Source Public Required .false.)}) triad [(Var 2 a) (Var 2 b) (Var 2 scalar) (Var 2 c)] [(= (Var 2 N) (ConstantInteger 1234 (Integer 4 [])) ()) (DoConcurrentLoop ((Var 2 i) (ConstantInteger 0 (Integer 4 [])) (BinOp (Var 2 N) Sub (ConstantInteger 1 (Integer 4 [])) (Integer 4 []) () ()) (ConstantInteger 1 (Integer 4 []))) [(= (ArrayRef 2 c [(() (Var 2 i) ())] (Real 4 [(() ())]) ()) (BinOp (ArrayRef 2 a [(() (Var 2 i) ())] (Real 4 [(() ())]) ()) Add (BinOp (Var 2 scalar) Mul (ArrayRef 2 b [(() (Var 2 i) ())] (Real 4 [(() ())]) ()) (Real 4 []) () ()) (Real 4 [(() ())]) () ()) ())])] Source Public Implementation () .false. .false.)}) [])
(TranslationUnit (SymbolTable 1 {_lfortran_main_program: (Subroutine (SymbolTable 5 {}) _lfortran_main_program [] [(SubroutineCall 1 main0 () [] ())] Source Public Implementation () .false. .false.), main0: (Subroutine (SymbolTable 3 {a: (Variable 3 a Local () () Default (Real 4 [((ConstantInteger 1 (Integer 4 [])) (ConstantInteger 10000 (Integer 4 [])))]) Source Public Required .false.), b: (Variable 3 b Local () () Default (Real 4 [((ConstantInteger 1 (Integer 4 [])) (ConstantInteger 10000 (Integer 4 [])))]) Source Public Required .false.), c: (Variable 3 c Local () () Default (Real 4 [((ConstantInteger 1 (Integer 4 [])) (ConstantInteger 10000 (Integer 4 [])))]) Source Public Required .false.), i: (Variable 3 i Local () () Default (Integer 4 []) Source Public Required .false.), nsize: (Variable 3 nsize Local () () Default (Integer 4 []) Source Public Required .false.), scalar: (Variable 3 scalar Local () () Default (Real 4 []) Source Public Required .false.)}) main0 [] [(= (Var 3 scalar) (ImplicitCast (ConstantReal 10.000000 (Real 8 [])) RealToReal (Real 4 []) ()) ()) (= (Var 3 nsize) (ConstantInteger 1234 (Integer 4 [])) ()) (DoConcurrentLoop ((Var 3 i) (ConstantInteger 0 (Integer 4 [])) (BinOp (Var 3 nsize) Sub (ConstantInteger 1 (Integer 4 [])) (Integer 4 []) () ()) (ConstantInteger 1 (Integer 4 []))) [(= (ArrayRef 3 a [(() (BinOp (Var 3 i) Add (ConstantInteger 1 (Integer 4 [])) (Integer 4 []) () ()) ())] (Real 4 [((ConstantInteger 1 (Integer 4 [])) (ConstantInteger 10000 (Integer 4 [])))]) ()) (ImplicitCast (ConstantReal 5.000000 (Real 8 [])) RealToReal (Real 4 [((ConstantInteger 1 (Integer 4 [])) (ConstantInteger 10000 (Integer 4 [])))]) ()) ()) (= (ArrayRef 3 b [(() (BinOp (Var 3 i) Add (ConstantInteger 1 (Integer 4 [])) (Integer 4 []) () ()) ())] (Real 4 [((ConstantInteger 1 (Integer 4 [])) (ConstantInteger 10000 (Integer 4 [])))]) ()) (ImplicitCast (ConstantReal 5.000000 (Real 8 [])) RealToReal (Real 4 [((ConstantInteger 1 (Integer 4 [])) (ConstantInteger 10000 (Integer 4 [])))]) ()) ())]) (SubroutineCall 1 triad () [(Var 3 a) (Var 3 b) (Var 3 scalar) (Var 3 c)] ()) (Print () [(ConstantString "End Stream Triad" (Character 1 16 () []))])] Source Public Implementation () .false. .false.), main_program: (Program (SymbolTable 4 {}) main_program [] [(SubroutineCall 1 _lfortran_main_program () [] ())]), triad: (Subroutine (SymbolTable 2 {N: (Variable 2 N Local () () Default (Integer 4 []) Source Public Required .false.), a: (Variable 2 a InOut () () Default (Real 4 [(() ())]) Source Public Required .false.), b: (Variable 2 b InOut () () Default (Real 4 [(() ())]) Source Public Required .false.), c: (Variable 2 c InOut () () Default (Real 4 [(() ())]) Source Public Required .false.), i: (Variable 2 i Local () () Default (Integer 4 []) Source Public Required .false.), scalar: (Variable 2 scalar In () () Default (Real 4 []) Source Public Required .false.)}) triad [(Var 2 a) (Var 2 b) (Var 2 scalar) (Var 2 c)] [(= (Var 2 N) (ConstantInteger 1234 (Integer 4 [])) ()) (DoConcurrentLoop ((Var 2 i) (ConstantInteger 0 (Integer 4 [])) (BinOp (Var 2 N) Sub (ConstantInteger 1 (Integer 4 [])) (Integer 4 []) () ()) (ConstantInteger 1 (Integer 4 []))) [(= (ArrayRef 2 c [(() (BinOp (Var 2 i) Add (ConstantInteger 1 (Integer 4 [])) (Integer 4 []) () ()) ())] (Real 4 [(() ())]) ()) (BinOp (ArrayRef 2 a [(() (BinOp (Var 2 i) Add (ConstantInteger 1 (Integer 4 [])) (Integer 4 []) () ()) ())] (Real 4 [(() ())]) ()) Add (BinOp (Var 2 scalar) Mul (ArrayRef 2 b [(() (BinOp (Var 2 i) Add (ConstantInteger 1 (Integer 4 [])) (Integer 4 []) () ()) ())] (Real 4 [(() ())]) ()) (Real 4 []) () ()) (Real 4 [(() ())]) () ()) ())])] Source Public Implementation () .false. .false.)}) [])
2 changes: 1 addition & 1 deletion tests/reference/asr-list1-770ba33.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
"outfile": null,
"outfile_hash": null,
"stdout": "asr-list1-770ba33.stdout",
"stdout_hash": "8d8b6e7775ff0eeba1cf05bb19d8d76a6d66617217d948c5f2e6c604",
"stdout_hash": "914fe18743d90c819ca6101262ba2218b74a2007025b9593f8b85e35",
"stderr": null,
"stderr_hash": null,
"returncode": 0
Expand Down
Loading