(call FunctionCall)
| 429 | } |
| 430 | |
| 431 | func (r *Runtime) arrayproto_splice(call FunctionCall) Value { |
| 432 | o := call.This.ToObject(r) |
| 433 | length := toLength(o.self.getStr("length", nil)) |
| 434 | actualStart := relToIdx(call.Argument(0).ToInteger(), length) |
| 435 | var actualDeleteCount int64 |
| 436 | switch len(call.Arguments) { |
| 437 | case 0: |
| 438 | case 1: |
| 439 | actualDeleteCount = length - actualStart |
| 440 | default: |
| 441 | actualDeleteCount = min(max(call.Argument(1).ToInteger(), 0), length-actualStart) |
| 442 | } |
| 443 | itemCount := max(int64(len(call.Arguments)-2), 0) |
| 444 | newLength := length - actualDeleteCount + itemCount |
| 445 | if newLength >= maxInt { |
| 446 | panic(r.NewTypeError("Invalid array length")) |
| 447 | } |
| 448 | a := arraySpeciesCreate(o, actualDeleteCount) |
| 449 | if src := r.checkStdArrayObj(o); src != nil { |
| 450 | if dst := r.checkStdArrayObjWithProto(a); dst != nil { |
| 451 | values := make([]Value, actualDeleteCount) |
| 452 | copy(values, src.values[actualStart:]) |
| 453 | setArrayValues(dst, values) |
| 454 | } else { |
| 455 | for k := int64(0); k < actualDeleteCount; k++ { |
| 456 | createDataPropertyOrThrow(a, intToValue(k), src.values[k+actualStart]) |
| 457 | } |
| 458 | a.self.setOwnStr("length", intToValue(actualDeleteCount), true) |
| 459 | } |
| 460 | var values []Value |
| 461 | if itemCount < actualDeleteCount { |
| 462 | values = src.values |
| 463 | copy(values[actualStart+itemCount:], values[actualStart+actualDeleteCount:]) |
| 464 | tail := values[newLength:] |
| 465 | for k := range tail { |
| 466 | tail[k] = nil |
| 467 | } |
| 468 | values = values[:newLength] |
| 469 | } else if itemCount > actualDeleteCount { |
| 470 | if int64(cap(src.values)) >= newLength { |
| 471 | values = src.values[:newLength] |
| 472 | copy(values[actualStart+itemCount:], values[actualStart+actualDeleteCount:length]) |
| 473 | } else { |
| 474 | values = make([]Value, newLength) |
| 475 | copy(values, src.values[:actualStart]) |
| 476 | copy(values[actualStart+itemCount:], src.values[actualStart+actualDeleteCount:]) |
| 477 | } |
| 478 | } else { |
| 479 | values = src.values |
| 480 | } |
| 481 | if itemCount > 0 { |
| 482 | copy(values[actualStart:], call.Arguments[2:]) |
| 483 | } |
| 484 | src.values = values |
| 485 | src.objCount = len(values) |
| 486 | } else { |
| 487 | for k := int64(0); k < actualDeleteCount; k++ { |
| 488 | from := valueInt(k + actualStart) |
nothing calls this directly
no test coverage detected