MCPcopy Create free account
hub / github.com/dop251/goja / arrayproto_splice

Method arrayproto_splice

builtin_array.go:431–530  ·  view source on GitHub ↗
(call FunctionCall)

Source from the content-addressed store, hash-verified

429}
430
431func (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)

Callers

nothing calls this directly

Calls 15

NewTypeErrorMethod · 0.95
checkStdArrayObjMethod · 0.95
toLengthFunction · 0.85
relToIdxFunction · 0.85
arraySpeciesCreateFunction · 0.85
setArrayValuesFunction · 0.85
intToValueFunction · 0.85
valueIntTypeAlias · 0.85
nilSafeFunction · 0.85
ToObjectMethod · 0.65

Tested by

no test coverage detected