(
builder: LowLevelIRBuilder, lenv: Value, index: Value, line: int
)
| 279 | |
| 280 | |
| 281 | def vec_check_and_adjust_index( |
| 282 | builder: LowLevelIRBuilder, lenv: Value, index: Value, line: int |
| 283 | ) -> Value: |
| 284 | r = Register(int64_rprimitive) |
| 285 | index = builder.coerce(index, int64_rprimitive, line) |
| 286 | lenv = builder.coerce(lenv, int64_rprimitive, line) |
| 287 | ok, ok2, ok3 = BasicBlock(), BasicBlock(), BasicBlock() |
| 288 | fail, fail2 = BasicBlock(), BasicBlock() |
| 289 | is_less = builder.comparison_op(index, lenv, ComparisonOp.ULT, line) |
| 290 | builder.add_bool_branch(is_less, ok2, fail) |
| 291 | builder.activate_block(fail) |
| 292 | |
| 293 | x = builder.int_add(index, lenv) |
| 294 | is_less2 = builder.comparison_op(x, lenv, ComparisonOp.ULT, line) |
| 295 | builder.add_bool_branch(is_less2, ok, fail2) |
| 296 | |
| 297 | builder.activate_block(fail2) |
| 298 | # TODO: Include index in exception |
| 299 | builder.add(RaiseStandardError(RaiseStandardError.INDEX_ERROR, None, line)) |
| 300 | builder.add(Unreachable()) |
| 301 | |
| 302 | builder.activate_block(ok) |
| 303 | builder.assign(r, x) |
| 304 | builder.goto(ok3) |
| 305 | |
| 306 | builder.activate_block(ok2) |
| 307 | builder.assign(r, index) |
| 308 | builder.goto(ok3) |
| 309 | |
| 310 | builder.activate_block(ok3) |
| 311 | return r |
| 312 | |
| 313 | |
| 314 | def vec_get_item( |
no test coverage detected
searching dependent graphs…