Skip to content

Commit 1081efd

Browse files
authored
Merge pull request #423 from Abdullahjavednesar/str_slice
Adding str slicing
2 parents 5723ba1 + 11b3d57 commit 1081efd

File tree

5 files changed

+14
-5
lines changed

5 files changed

+14
-5
lines changed

integration_tests/test_str_01.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,16 @@ def test_str_index():
2727
assert a[-1] == "5"
2828
assert a[-6] == "0"
2929

30+
def test_str_slice():
31+
a: str
32+
a = "012345"
33+
assert a[2:4] == "23"
34+
assert a[2:3] == a[2]
35+
3036
def check():
3137
f()
3238
test_str_concat()
3339
test_str_index()
40+
test_str_slice()
3441

3542
check()

src/libasr/codegen/asr_to_llvm.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1075,15 +1075,17 @@ class ASRToLLVMVisitor : public ASR::BaseVisitor<ASRToLLVMVisitor>
10751075
//throw CodeGenError("Only string(a:b) for a,b variables for now.", x.base.base.loc);
10761076
// Use the "right" index for now
10771077
this->visit_expr_wrapper(x.m_args[0].m_right, true);
1078-
llvm::Value *idx = tmp;
1078+
llvm::Value *idx2 = tmp;
1079+
this->visit_expr_wrapper(x.m_args[0].m_left, true);
1080+
llvm::Value *idx1 = tmp;
10791081
// idx = builder->CreateSub(idx, llvm::ConstantInt::get(context, llvm::APInt(32, 1)));
10801082
//std::vector<llvm::Value*> idx_vec = {llvm::ConstantInt::get(context, llvm::APInt(32, 0)), idx};
10811083
// std::vector<llvm::Value*> idx_vec = {idx};
10821084
llvm::Value *str = CreateLoad(array);
10831085
// llvm::Value *p = CreateGEP(str, idx_vec);
10841086
// TODO: Currently the string starts at the right location, but goes to the end of the original string.
10851087
// We have to allocate a new string, copy it and add null termination.
1086-
llvm::Value *p = lfortran_str_copy(str, idx, idx);
1088+
llvm::Value *p = lfortran_str_copy(str, idx1, idx2);
10871089

10881090
tmp = builder->CreateAlloca(character_type, nullptr);
10891091
builder->CreateStore(p, tmp);

src/lpython/semantics/python_ast_to_asr.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1233,7 +1233,7 @@ class CommonVisitor : public AST::BaseVisitor<Derived> {
12331233
if (!ASRUtils::is_integer(*ASRUtils::expr_type(ASRUtils::EXPR(tmp)))) {
12341234
throw SemanticError("slice indices must be integers or None", tmp->loc);
12351235
}
1236-
ai.m_right = index_add_one(x.base.base.loc, ASRUtils::EXPR(tmp));
1236+
ai.m_right = ASRUtils::EXPR(tmp);
12371237
}
12381238
if (s->m_step != nullptr) {
12391239
this->visit_expr(*s->m_step);

tests/reference/asr-subscript1-1acfc19.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
"outfile": null,
77
"outfile_hash": null,
88
"stdout": "asr-subscript1-1acfc19.stdout",
9-
"stdout_hash": "ce3de13d575b58ea45610106701fea385509a39f0a88cd9a96b1f3a9",
9+
"stdout_hash": "567ee666c2e63003152d97effb4b33f7866639a4a3285f564b9a7689",
1010
"stderr": null,
1111
"stderr_hash": null,
1212
"returncode": 0
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
(TranslationUnit (SymbolTable 1 {main_program: (Program (SymbolTable 3 {}) main_program [] []), test_subscript: (Subroutine (SymbolTable 2 {A: (Variable 2 A Local () () Default (Integer 4 [((IntegerConstant 1 (Integer 4 [])) (IntegerConstant 5 (Integer 4 [])))]) Source Public Required .false.), B: (Variable 2 B Local () () Default (Integer 4 [((IntegerConstant 1 (Integer 4 [])) (IntegerConstant 2 (Integer 4 [])))]) Source Public Required .false.), i: (Variable 2 i Local () () Default (Integer 4 []) Source Public Required .false.), s: (Variable 2 s Local () () Default (Character 1 -2 () []) Source Public Required .false.)}) test_subscript [] [(= (Var 2 s) (StringConstant "abc" (Character 1 3 () [])) ()) (= (Var 2 s) (ArrayRef 2 s [((BinOp (IntegerConstant 0 (Integer 4 [])) Add (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) () ()) (BinOp (IntegerConstant 0 (Integer 4 [])) Add (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) () ()) ())] (Character 1 -2 () []) ()) ()) (= (Var 2 s) (ArrayRef 2 s [((BinOp (IntegerConstant 1 (Integer 4 [])) Add (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) () ()) (BinOp (IntegerConstant 2 (Integer 4 [])) Add (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) () ()) ())] (Character 1 -2 () []) ()) ()) (= (Var 2 s) (ArrayRef 2 s [(() () ())] (Character 1 -2 () []) ()) ()) (= (Var 2 s) (ArrayRef 2 s [(() () (BinOp (UnaryOp USub (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) (IntegerConstant -1 (Integer 4 []))) Add (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) () ()))] (Character 1 -2 () []) ()) ()) (= (Var 2 s) (ArrayRef 2 s [(() () (BinOp (IntegerConstant 2 (Integer 4 [])) Add (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) () ()))] (Character 1 -2 () []) ()) ()) (= (Var 2 s) (ArrayRef 2 s [((BinOp (IntegerConstant 1 (Integer 4 [])) Add (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) () ()) (BinOp (IntegerConstant 88 (Integer 4 [])) Add (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) () ()) (BinOp (IntegerConstant 1 (Integer 4 [])) Add (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) () ()))] (Character 1 -2 () []) ()) ()) (= (Var 2 s) (ArrayRef 2 s [((BinOp (IntegerConstant 1 (Integer 4 [])) Add (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) () ()) (BinOp (IntegerConstant 1 (Integer 4 [])) Add (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) () ()) (BinOp (UnaryOp USub (IntegerConstant 4 (Integer 4 [])) (Integer 4 []) (IntegerConstant -4 (Integer 4 []))) Add (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) () ()))] (Character 1 -2 () []) ()) ()) (= (Var 2 s) (ArrayRef 2 s [((BinOp (UnaryOp USub (IntegerConstant 89 (Integer 4 [])) (Integer 4 []) (IntegerConstant -89 (Integer 4 []))) Add (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) () ()) () (BinOp (IntegerConstant 4 (Integer 4 [])) Add (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) () ()))] (Character 1 -2 () []) ()) ()) (= (Var 2 s) (ArrayRef 2 s [((BinOp (UnaryOp USub (IntegerConstant 3 (Integer 4 [])) (Integer 4 []) (IntegerConstant -3 (Integer 4 []))) Add (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) () ()) (BinOp (UnaryOp USub (IntegerConstant 3 (Integer 4 [])) (Integer 4 []) (IntegerConstant -3 (Integer 4 []))) Add (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) () ()) (BinOp (UnaryOp USub (IntegerConstant 3 (Integer 4 [])) (Integer 4 []) (IntegerConstant -3 (Integer 4 []))) Add (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) () ()))] (Character 1 -2 () []) ()) ()) (= (Var 2 s) (ArrayRef 2 s [((BinOp (IntegerConstant 2 (Integer 4 [])) Add (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) () ()) (BinOp (IntegerConstant 3 (Integer 4 [])) Add (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) () ()) ())] (Character 1 -2 () []) ()) ()) (= (Var 2 i) (ArrayRef 2 A [(() (BinOp (IntegerConstant 0 (Integer 4 [])) Add (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) () ()) ())] (Integer 4 [((IntegerConstant 1 (Integer 4 [])) (IntegerConstant 5 (Integer 4 [])))]) ()) ()) (= (Var 2 B) (ArrayRef 2 A [((BinOp (IntegerConstant 1 (Integer 4 [])) Add (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) () ()) (BinOp (IntegerConstant 3 (Integer 4 [])) Add (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) () ()) ())] (Integer 4 [((IntegerConstant 1 (Integer 4 [])) (IntegerConstant 5 (Integer 4 [])))]) ()) ()) (= (Var 2 B) (ArrayRef 2 A [((BinOp (IntegerConstant 1 (Integer 4 [])) Add (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) () ()) (BinOp (IntegerConstant 2 (Integer 4 [])) Add (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) () ()) (BinOp (IntegerConstant 3 (Integer 4 [])) Add (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) () ()))] (Integer 4 [((IntegerConstant 1 (Integer 4 [])) (IntegerConstant 5 (Integer 4 [])))]) ()) ())] Source Public Implementation () .false. .false.)}) [])
1+
(TranslationUnit (SymbolTable 1 {main_program: (Program (SymbolTable 3 {}) main_program [] []), test_subscript: (Subroutine (SymbolTable 2 {A: (Variable 2 A Local () () Default (Integer 4 [((IntegerConstant 1 (Integer 4 [])) (IntegerConstant 5 (Integer 4 [])))]) Source Public Required .false.), B: (Variable 2 B Local () () Default (Integer 4 [((IntegerConstant 1 (Integer 4 [])) (IntegerConstant 2 (Integer 4 [])))]) Source Public Required .false.), i: (Variable 2 i Local () () Default (Integer 4 []) Source Public Required .false.), s: (Variable 2 s Local () () Default (Character 1 -2 () []) Source Public Required .false.)}) test_subscript [] [(= (Var 2 s) (StringConstant "abc" (Character 1 3 () [])) ()) (= (Var 2 s) (ArrayRef 2 s [((BinOp (IntegerConstant 0 (Integer 4 [])) Add (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) () ()) (BinOp (IntegerConstant 0 (Integer 4 [])) Add (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) () ()) ())] (Character 1 -2 () []) ()) ()) (= (Var 2 s) (ArrayRef 2 s [((BinOp (IntegerConstant 1 (Integer 4 [])) Add (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) () ()) (IntegerConstant 2 (Integer 4 [])) ())] (Character 1 -2 () []) ()) ()) (= (Var 2 s) (ArrayRef 2 s [(() () ())] (Character 1 -2 () []) ()) ()) (= (Var 2 s) (ArrayRef 2 s [(() () (BinOp (UnaryOp USub (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) (IntegerConstant -1 (Integer 4 []))) Add (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) () ()))] (Character 1 -2 () []) ()) ()) (= (Var 2 s) (ArrayRef 2 s [(() () (BinOp (IntegerConstant 2 (Integer 4 [])) Add (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) () ()))] (Character 1 -2 () []) ()) ()) (= (Var 2 s) (ArrayRef 2 s [((BinOp (IntegerConstant 1 (Integer 4 [])) Add (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) () ()) (IntegerConstant 88 (Integer 4 [])) (BinOp (IntegerConstant 1 (Integer 4 [])) Add (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) () ()))] (Character 1 -2 () []) ()) ()) (= (Var 2 s) (ArrayRef 2 s [((IntegerConstant 1 (Integer 4 [])) (IntegerConstant 1 (Integer 4 [])) (BinOp (UnaryOp USub (IntegerConstant 4 (Integer 4 [])) (Integer 4 []) (IntegerConstant -4 (Integer 4 []))) Add (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) () ()))] (Character 1 -2 () []) ()) ()) (= (Var 2 s) (ArrayRef 2 s [((BinOp (UnaryOp USub (IntegerConstant 89 (Integer 4 [])) (Integer 4 []) (IntegerConstant -89 (Integer 4 []))) Add (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) () ()) () (BinOp (IntegerConstant 4 (Integer 4 [])) Add (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) () ()))] (Character 1 -2 () []) ()) ()) (= (Var 2 s) (ArrayRef 2 s [((BinOp (UnaryOp USub (IntegerConstant 3 (Integer 4 [])) (Integer 4 []) (IntegerConstant -3 (Integer 4 []))) Add (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) () ()) (UnaryOp USub (IntegerConstant 3 (Integer 4 [])) (Integer 4 []) (IntegerConstant -3 (Integer 4 []))) (BinOp (UnaryOp USub (IntegerConstant 3 (Integer 4 [])) (Integer 4 []) (IntegerConstant -3 (Integer 4 []))) Add (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) () ()))] (Character 1 -2 () []) ()) ()) (= (Var 2 s) (ArrayRef 2 s [((BinOp (IntegerConstant 2 (Integer 4 [])) Add (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) () ()) (IntegerConstant 3 (Integer 4 [])) ())] (Character 1 -2 () []) ()) ()) (= (Var 2 i) (ArrayRef 2 A [(() (BinOp (IntegerConstant 0 (Integer 4 [])) Add (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) () ()) ())] (Integer 4 [((IntegerConstant 1 (Integer 4 [])) (IntegerConstant 5 (Integer 4 [])))]) ()) ()) (= (Var 2 B) (ArrayRef 2 A [((BinOp (IntegerConstant 1 (Integer 4 [])) Add (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) () ()) (IntegerConstant 3 (Integer 4 [])) ())] (Integer 4 [((IntegerConstant 1 (Integer 4 [])) (IntegerConstant 5 (Integer 4 [])))]) ()) ()) (= (Var 2 B) (ArrayRef 2 A [((BinOp (IntegerConstant 1 (Integer 4 [])) Add (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) () ()) (IntegerConstant 2 (Integer 4 [])) (BinOp (IntegerConstant 3 (Integer 4 [])) Add (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) () ()))] (Integer 4 [((IntegerConstant 1 (Integer 4 [])) (IntegerConstant 5 (Integer 4 [])))]) ()) ())] Source Public Implementation () .false. .false.)}) [])

0 commit comments

Comments
 (0)