|
@@ -21,7 +21,7 @@ func (ctx *typedArraySortCtx) Len() int {
|
|
|
|
|
|
func (ctx *typedArraySortCtx) Less(i, j int) bool {
|
|
|
if ctx.needValidate {
|
|
|
- ctx.ta.viewedArrayBuf.ensureNotDetached()
|
|
|
+ ctx.ta.viewedArrayBuf.ensureNotDetached(true)
|
|
|
ctx.needValidate = false
|
|
|
}
|
|
|
offset := ctx.ta.offset
|
|
@@ -54,7 +54,7 @@ func (ctx *typedArraySortCtx) Less(i, j int) bool {
|
|
|
|
|
|
func (ctx *typedArraySortCtx) Swap(i, j int) {
|
|
|
if ctx.needValidate {
|
|
|
- ctx.ta.viewedArrayBuf.ensureNotDetached()
|
|
|
+ ctx.ta.viewedArrayBuf.ensureNotDetached(true)
|
|
|
ctx.needValidate = false
|
|
|
}
|
|
|
offset := ctx.ta.offset
|
|
@@ -88,8 +88,10 @@ func (r *Runtime) builtin_newArrayBuffer(args []Value, newTarget *Object) *Objec
|
|
|
func (r *Runtime) arrayBufferProto_getByteLength(call FunctionCall) Value {
|
|
|
o := r.toObject(call.This)
|
|
|
if b, ok := o.self.(*arrayBufferObject); ok {
|
|
|
- b.ensureNotDetached()
|
|
|
- return intToValue(int64(len(b.data)))
|
|
|
+ if b.ensureNotDetached(false) {
|
|
|
+ return intToValue(int64(len(b.data)))
|
|
|
+ }
|
|
|
+ return intToValue(0)
|
|
|
}
|
|
|
panic(r.NewTypeError("Object is not ArrayBuffer: %s", o))
|
|
|
}
|
|
@@ -109,16 +111,15 @@ func (r *Runtime) arrayBufferProto_slice(call FunctionCall) Value {
|
|
|
newLen := max(stop-start, 0)
|
|
|
ret := r.speciesConstructor(o, r.global.ArrayBuffer)([]Value{intToValue(newLen)}, nil)
|
|
|
if ab, ok := ret.self.(*arrayBufferObject); ok {
|
|
|
- ab.ensureNotDetached()
|
|
|
- if ret == o {
|
|
|
- panic(r.NewTypeError("Species constructor returned the same ArrayBuffer"))
|
|
|
- }
|
|
|
- if int64(len(ab.data)) < newLen {
|
|
|
- panic(r.NewTypeError("Species constructor returned an ArrayBuffer that is too small: %d", len(ab.data)))
|
|
|
- }
|
|
|
- b.ensureNotDetached()
|
|
|
-
|
|
|
- if stop > start {
|
|
|
+ if newLen > 0 {
|
|
|
+ b.ensureNotDetached(true)
|
|
|
+ if ret == o {
|
|
|
+ panic(r.NewTypeError("Species constructor returned the same ArrayBuffer"))
|
|
|
+ }
|
|
|
+ if int64(len(ab.data)) < newLen {
|
|
|
+ panic(r.NewTypeError("Species constructor returned an ArrayBuffer that is too small: %d", len(ab.data)))
|
|
|
+ }
|
|
|
+ ab.ensureNotDetached(true)
|
|
|
copy(ab.data, b.data[start:stop])
|
|
|
}
|
|
|
return ret
|
|
@@ -162,7 +163,7 @@ func (r *Runtime) newDataView(args []Value, newTarget *Object) *Object {
|
|
|
if len(args) > 1 {
|
|
|
offsetArg := nilSafe(args[1])
|
|
|
byteOffset = r.toIndex(offsetArg)
|
|
|
- buffer.ensureNotDetached()
|
|
|
+ buffer.ensureNotDetached(true)
|
|
|
if byteOffset > len(buffer.data) {
|
|
|
panic(r.newError(r.global.RangeError, "Start offset %s is outside the bounds of the buffer", offsetArg.String()))
|
|
|
}
|
|
@@ -201,7 +202,7 @@ func (r *Runtime) dataViewProto_getBuffer(call FunctionCall) Value {
|
|
|
|
|
|
func (r *Runtime) dataViewProto_getByteLen(call FunctionCall) Value {
|
|
|
if dv, ok := r.toObject(call.This).self.(*dataViewObject); ok {
|
|
|
- dv.viewedArrayBuf.ensureNotDetached()
|
|
|
+ dv.viewedArrayBuf.ensureNotDetached(true)
|
|
|
return intToValue(int64(dv.byteLen))
|
|
|
}
|
|
|
panic(r.NewTypeError("Method get DataView.prototype.byteLength called on incompatible receiver %s", call.This.String()))
|
|
@@ -209,7 +210,7 @@ func (r *Runtime) dataViewProto_getByteLen(call FunctionCall) Value {
|
|
|
|
|
|
func (r *Runtime) dataViewProto_getByteOffset(call FunctionCall) Value {
|
|
|
if dv, ok := r.toObject(call.This).self.(*dataViewObject); ok {
|
|
|
- dv.viewedArrayBuf.ensureNotDetached()
|
|
|
+ dv.viewedArrayBuf.ensureNotDetached(true)
|
|
|
return intToValue(int64(dv.byteOffset))
|
|
|
}
|
|
|
panic(r.NewTypeError("Method get DataView.prototype.byteOffset called on incompatible receiver %s", call.This.String()))
|
|
@@ -392,7 +393,7 @@ func (r *Runtime) typedArrayProto_getByteOffset(call FunctionCall) Value {
|
|
|
|
|
|
func (r *Runtime) typedArrayProto_copyWithin(call FunctionCall) Value {
|
|
|
if ta, ok := r.toObject(call.This).self.(*typedArrayObject); ok {
|
|
|
- ta.viewedArrayBuf.ensureNotDetached()
|
|
|
+ ta.viewedArrayBuf.ensureNotDetached(true)
|
|
|
l := int64(ta.length)
|
|
|
var relEnd int64
|
|
|
to := toIntStrict(relToIdx(call.Argument(0).ToInteger(), l))
|
|
@@ -407,7 +408,7 @@ func (r *Runtime) typedArrayProto_copyWithin(call FunctionCall) Value {
|
|
|
offset := ta.offset
|
|
|
elemSize := ta.elemSize
|
|
|
if final > from {
|
|
|
- ta.viewedArrayBuf.ensureNotDetached()
|
|
|
+ ta.viewedArrayBuf.ensureNotDetached(true)
|
|
|
copy(data[(offset+to)*elemSize:], data[(offset+from)*elemSize:(offset+final)*elemSize])
|
|
|
}
|
|
|
return call.This
|
|
@@ -417,7 +418,7 @@ func (r *Runtime) typedArrayProto_copyWithin(call FunctionCall) Value {
|
|
|
|
|
|
func (r *Runtime) typedArrayProto_entries(call FunctionCall) Value {
|
|
|
if ta, ok := r.toObject(call.This).self.(*typedArrayObject); ok {
|
|
|
- ta.viewedArrayBuf.ensureNotDetached()
|
|
|
+ ta.viewedArrayBuf.ensureNotDetached(true)
|
|
|
return r.createArrayIterator(ta.val, iterationKindKeyValue)
|
|
|
}
|
|
|
panic(r.NewTypeError("Method TypedArray.prototype.entries called on incompatible receiver %s", call.This.String()))
|
|
@@ -425,14 +426,14 @@ func (r *Runtime) typedArrayProto_entries(call FunctionCall) Value {
|
|
|
|
|
|
func (r *Runtime) typedArrayProto_every(call FunctionCall) Value {
|
|
|
if ta, ok := r.toObject(call.This).self.(*typedArrayObject); ok {
|
|
|
- ta.viewedArrayBuf.ensureNotDetached()
|
|
|
+ ta.viewedArrayBuf.ensureNotDetached(true)
|
|
|
callbackFn := r.toCallable(call.Argument(0))
|
|
|
fc := FunctionCall{
|
|
|
This: call.Argument(1),
|
|
|
Arguments: []Value{nil, nil, call.This},
|
|
|
}
|
|
|
for k := 0; k < ta.length; k++ {
|
|
|
- ta.viewedArrayBuf.ensureNotDetached()
|
|
|
+ ta.viewedArrayBuf.ensureNotDetached(true)
|
|
|
fc.Arguments[0] = ta.typedArray.get(ta.offset + k)
|
|
|
fc.Arguments[1] = intToValue(int64(k))
|
|
|
if !callbackFn(fc).ToBoolean() {
|
|
@@ -447,7 +448,7 @@ func (r *Runtime) typedArrayProto_every(call FunctionCall) Value {
|
|
|
|
|
|
func (r *Runtime) typedArrayProto_fill(call FunctionCall) Value {
|
|
|
if ta, ok := r.toObject(call.This).self.(*typedArrayObject); ok {
|
|
|
- ta.viewedArrayBuf.ensureNotDetached()
|
|
|
+ ta.viewedArrayBuf.ensureNotDetached(true)
|
|
|
l := int64(ta.length)
|
|
|
k := toIntStrict(relToIdx(call.Argument(1).ToInteger(), l))
|
|
|
var relEnd int64
|
|
@@ -458,7 +459,7 @@ func (r *Runtime) typedArrayProto_fill(call FunctionCall) Value {
|
|
|
}
|
|
|
final := toIntStrict(relToIdx(relEnd, l))
|
|
|
value := ta.typedArray.toRaw(call.Argument(0))
|
|
|
- ta.viewedArrayBuf.ensureNotDetached()
|
|
|
+ ta.viewedArrayBuf.ensureNotDetached(true)
|
|
|
for ; k < final; k++ {
|
|
|
ta.typedArray.setRaw(ta.offset+k, value)
|
|
|
}
|
|
@@ -470,7 +471,7 @@ func (r *Runtime) typedArrayProto_fill(call FunctionCall) Value {
|
|
|
func (r *Runtime) typedArrayProto_filter(call FunctionCall) Value {
|
|
|
o := r.toObject(call.This)
|
|
|
if ta, ok := o.self.(*typedArrayObject); ok {
|
|
|
- ta.viewedArrayBuf.ensureNotDetached()
|
|
|
+ ta.viewedArrayBuf.ensureNotDetached(true)
|
|
|
callbackFn := r.toCallable(call.Argument(0))
|
|
|
fc := FunctionCall{
|
|
|
This: call.Argument(1),
|
|
@@ -479,7 +480,7 @@ func (r *Runtime) typedArrayProto_filter(call FunctionCall) Value {
|
|
|
buf := make([]byte, 0, ta.length*ta.elemSize)
|
|
|
captured := 0
|
|
|
for k := 0; k < ta.length; k++ {
|
|
|
- ta.viewedArrayBuf.ensureNotDetached()
|
|
|
+ ta.viewedArrayBuf.ensureNotDetached(true)
|
|
|
fc.Arguments[0] = ta.typedArray.get(k)
|
|
|
fc.Arguments[1] = intToValue(int64(k))
|
|
|
if callbackFn(fc).ToBoolean() {
|
|
@@ -508,14 +509,14 @@ func (r *Runtime) typedArrayProto_filter(call FunctionCall) Value {
|
|
|
|
|
|
func (r *Runtime) typedArrayProto_find(call FunctionCall) Value {
|
|
|
if ta, ok := r.toObject(call.This).self.(*typedArrayObject); ok {
|
|
|
- ta.viewedArrayBuf.ensureNotDetached()
|
|
|
+ ta.viewedArrayBuf.ensureNotDetached(true)
|
|
|
predicate := r.toCallable(call.Argument(0))
|
|
|
fc := FunctionCall{
|
|
|
This: call.Argument(1),
|
|
|
Arguments: []Value{nil, nil, call.This},
|
|
|
}
|
|
|
for k := 0; k < ta.length; k++ {
|
|
|
- ta.viewedArrayBuf.ensureNotDetached()
|
|
|
+ ta.viewedArrayBuf.ensureNotDetached(true)
|
|
|
val := ta.typedArray.get(ta.offset + k)
|
|
|
fc.Arguments[0] = val
|
|
|
fc.Arguments[1] = intToValue(int64(k))
|
|
@@ -530,14 +531,14 @@ func (r *Runtime) typedArrayProto_find(call FunctionCall) Value {
|
|
|
|
|
|
func (r *Runtime) typedArrayProto_findIndex(call FunctionCall) Value {
|
|
|
if ta, ok := r.toObject(call.This).self.(*typedArrayObject); ok {
|
|
|
- ta.viewedArrayBuf.ensureNotDetached()
|
|
|
+ ta.viewedArrayBuf.ensureNotDetached(true)
|
|
|
predicate := r.toCallable(call.Argument(0))
|
|
|
fc := FunctionCall{
|
|
|
This: call.Argument(1),
|
|
|
Arguments: []Value{nil, nil, call.This},
|
|
|
}
|
|
|
for k := 0; k < ta.length; k++ {
|
|
|
- ta.viewedArrayBuf.ensureNotDetached()
|
|
|
+ ta.viewedArrayBuf.ensureNotDetached(true)
|
|
|
fc.Arguments[0] = ta.typedArray.get(ta.offset + k)
|
|
|
fc.Arguments[1] = intToValue(int64(k))
|
|
|
if predicate(fc).ToBoolean() {
|
|
@@ -551,14 +552,14 @@ func (r *Runtime) typedArrayProto_findIndex(call FunctionCall) Value {
|
|
|
|
|
|
func (r *Runtime) typedArrayProto_forEach(call FunctionCall) Value {
|
|
|
if ta, ok := r.toObject(call.This).self.(*typedArrayObject); ok {
|
|
|
- ta.viewedArrayBuf.ensureNotDetached()
|
|
|
+ ta.viewedArrayBuf.ensureNotDetached(true)
|
|
|
callbackFn := r.toCallable(call.Argument(0))
|
|
|
fc := FunctionCall{
|
|
|
This: call.Argument(1),
|
|
|
Arguments: []Value{nil, nil, call.This},
|
|
|
}
|
|
|
for k := 0; k < ta.length; k++ {
|
|
|
- ta.viewedArrayBuf.ensureNotDetached()
|
|
|
+ ta.viewedArrayBuf.ensureNotDetached(true)
|
|
|
if val := ta.typedArray.get(k); val != nil {
|
|
|
fc.Arguments[0] = val
|
|
|
fc.Arguments[1] = intToValue(int64(k))
|
|
@@ -572,7 +573,7 @@ func (r *Runtime) typedArrayProto_forEach(call FunctionCall) Value {
|
|
|
|
|
|
func (r *Runtime) typedArrayProto_includes(call FunctionCall) Value {
|
|
|
if ta, ok := r.toObject(call.This).self.(*typedArrayObject); ok {
|
|
|
- ta.viewedArrayBuf.ensureNotDetached()
|
|
|
+ ta.viewedArrayBuf.ensureNotDetached(true)
|
|
|
length := int64(ta.length)
|
|
|
if length == 0 {
|
|
|
return valueFalse
|
|
@@ -587,7 +588,7 @@ func (r *Runtime) typedArrayProto_includes(call FunctionCall) Value {
|
|
|
n = max(length+n, 0)
|
|
|
}
|
|
|
|
|
|
- ta.viewedArrayBuf.ensureNotDetached()
|
|
|
+ ta.viewedArrayBuf.ensureNotDetached(true)
|
|
|
searchElement := call.Argument(0)
|
|
|
if searchElement == _negativeZero {
|
|
|
searchElement = _positiveZero
|
|
@@ -607,7 +608,7 @@ func (r *Runtime) typedArrayProto_includes(call FunctionCall) Value {
|
|
|
|
|
|
func (r *Runtime) typedArrayProto_indexOf(call FunctionCall) Value {
|
|
|
if ta, ok := r.toObject(call.This).self.(*typedArrayObject); ok {
|
|
|
- ta.viewedArrayBuf.ensureNotDetached()
|
|
|
+ ta.viewedArrayBuf.ensureNotDetached(true)
|
|
|
length := int64(ta.length)
|
|
|
if length == 0 {
|
|
|
return intToValue(-1)
|
|
@@ -622,7 +623,7 @@ func (r *Runtime) typedArrayProto_indexOf(call FunctionCall) Value {
|
|
|
n = max(length+n, 0)
|
|
|
}
|
|
|
|
|
|
- ta.viewedArrayBuf.ensureNotDetached()
|
|
|
+ ta.viewedArrayBuf.ensureNotDetached(true)
|
|
|
searchElement := call.Argument(0)
|
|
|
if searchElement == _negativeZero {
|
|
|
searchElement = _positiveZero
|
|
@@ -642,7 +643,7 @@ func (r *Runtime) typedArrayProto_indexOf(call FunctionCall) Value {
|
|
|
|
|
|
func (r *Runtime) typedArrayProto_join(call FunctionCall) Value {
|
|
|
if ta, ok := r.toObject(call.This).self.(*typedArrayObject); ok {
|
|
|
- ta.viewedArrayBuf.ensureNotDetached()
|
|
|
+ ta.viewedArrayBuf.ensureNotDetached(true)
|
|
|
s := call.Argument(0)
|
|
|
var sep valueString
|
|
|
if s != _undefined {
|
|
@@ -657,14 +658,14 @@ func (r *Runtime) typedArrayProto_join(call FunctionCall) Value {
|
|
|
|
|
|
var buf valueStringBuilder
|
|
|
|
|
|
- ta.viewedArrayBuf.ensureNotDetached()
|
|
|
+ ta.viewedArrayBuf.ensureNotDetached(true)
|
|
|
element0 := ta.typedArray.get(0)
|
|
|
if element0 != nil && element0 != _undefined && element0 != _null {
|
|
|
buf.WriteString(element0.toString())
|
|
|
}
|
|
|
|
|
|
for i := 1; i < l; i++ {
|
|
|
- ta.viewedArrayBuf.ensureNotDetached()
|
|
|
+ ta.viewedArrayBuf.ensureNotDetached(true)
|
|
|
buf.WriteString(sep)
|
|
|
element := ta.typedArray.get(i)
|
|
|
if element != nil && element != _undefined && element != _null {
|
|
@@ -679,7 +680,7 @@ func (r *Runtime) typedArrayProto_join(call FunctionCall) Value {
|
|
|
|
|
|
func (r *Runtime) typedArrayProto_keys(call FunctionCall) Value {
|
|
|
if ta, ok := r.toObject(call.This).self.(*typedArrayObject); ok {
|
|
|
- ta.viewedArrayBuf.ensureNotDetached()
|
|
|
+ ta.viewedArrayBuf.ensureNotDetached(true)
|
|
|
return r.createArrayIterator(ta.val, iterationKindKey)
|
|
|
}
|
|
|
panic(r.NewTypeError("Method TypedArray.prototype.keys called on incompatible receiver %s", call.This.String()))
|
|
@@ -687,7 +688,7 @@ func (r *Runtime) typedArrayProto_keys(call FunctionCall) Value {
|
|
|
|
|
|
func (r *Runtime) typedArrayProto_lastIndexOf(call FunctionCall) Value {
|
|
|
if ta, ok := r.toObject(call.This).self.(*typedArrayObject); ok {
|
|
|
- ta.viewedArrayBuf.ensureNotDetached()
|
|
|
+ ta.viewedArrayBuf.ensureNotDetached(true)
|
|
|
length := int64(ta.length)
|
|
|
if length == 0 {
|
|
|
return intToValue(-1)
|
|
@@ -709,7 +710,7 @@ func (r *Runtime) typedArrayProto_lastIndexOf(call FunctionCall) Value {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- ta.viewedArrayBuf.ensureNotDetached()
|
|
|
+ ta.viewedArrayBuf.ensureNotDetached(true)
|
|
|
searchElement := call.Argument(0)
|
|
|
if searchElement == _negativeZero {
|
|
|
searchElement = _positiveZero
|
|
@@ -730,7 +731,7 @@ func (r *Runtime) typedArrayProto_lastIndexOf(call FunctionCall) Value {
|
|
|
|
|
|
func (r *Runtime) typedArrayProto_map(call FunctionCall) Value {
|
|
|
if ta, ok := r.toObject(call.This).self.(*typedArrayObject); ok {
|
|
|
- ta.viewedArrayBuf.ensureNotDetached()
|
|
|
+ ta.viewedArrayBuf.ensureNotDetached(true)
|
|
|
callbackFn := r.toCallable(call.Argument(0))
|
|
|
fc := FunctionCall{
|
|
|
This: call.Argument(1),
|
|
@@ -738,7 +739,7 @@ func (r *Runtime) typedArrayProto_map(call FunctionCall) Value {
|
|
|
}
|
|
|
dst := r.typedArraySpeciesCreate(ta, []Value{intToValue(int64(ta.length))})
|
|
|
for i := 0; i < ta.length; i++ {
|
|
|
- ta.viewedArrayBuf.ensureNotDetached()
|
|
|
+ ta.viewedArrayBuf.ensureNotDetached(true)
|
|
|
fc.Arguments[0] = ta.typedArray.get(ta.offset + i)
|
|
|
fc.Arguments[1] = intToValue(int64(i))
|
|
|
dst.typedArray.set(i, callbackFn(fc))
|
|
@@ -750,7 +751,7 @@ func (r *Runtime) typedArrayProto_map(call FunctionCall) Value {
|
|
|
|
|
|
func (r *Runtime) typedArrayProto_reduce(call FunctionCall) Value {
|
|
|
if ta, ok := r.toObject(call.This).self.(*typedArrayObject); ok {
|
|
|
- ta.viewedArrayBuf.ensureNotDetached()
|
|
|
+ ta.viewedArrayBuf.ensureNotDetached(true)
|
|
|
callbackFn := r.toCallable(call.Argument(0))
|
|
|
fc := FunctionCall{
|
|
|
This: _undefined,
|
|
@@ -769,7 +770,7 @@ func (r *Runtime) typedArrayProto_reduce(call FunctionCall) Value {
|
|
|
panic(r.NewTypeError("Reduce of empty array with no initial value"))
|
|
|
}
|
|
|
for ; k < ta.length; k++ {
|
|
|
- ta.viewedArrayBuf.ensureNotDetached()
|
|
|
+ ta.viewedArrayBuf.ensureNotDetached(true)
|
|
|
idx := valueInt(k)
|
|
|
fc.Arguments[1] = ta.typedArray.get(ta.offset + k)
|
|
|
fc.Arguments[2] = idx
|
|
@@ -782,7 +783,7 @@ func (r *Runtime) typedArrayProto_reduce(call FunctionCall) Value {
|
|
|
|
|
|
func (r *Runtime) typedArrayProto_reduceRight(call FunctionCall) Value {
|
|
|
if ta, ok := r.toObject(call.This).self.(*typedArrayObject); ok {
|
|
|
- ta.viewedArrayBuf.ensureNotDetached()
|
|
|
+ ta.viewedArrayBuf.ensureNotDetached(true)
|
|
|
callbackFn := r.toCallable(call.Argument(0))
|
|
|
fc := FunctionCall{
|
|
|
This: _undefined,
|
|
@@ -801,7 +802,7 @@ func (r *Runtime) typedArrayProto_reduceRight(call FunctionCall) Value {
|
|
|
panic(r.NewTypeError("Reduce of empty array with no initial value"))
|
|
|
}
|
|
|
for ; k >= 0; k-- {
|
|
|
- ta.viewedArrayBuf.ensureNotDetached()
|
|
|
+ ta.viewedArrayBuf.ensureNotDetached(true)
|
|
|
idx := valueInt(k)
|
|
|
fc.Arguments[1] = ta.typedArray.get(ta.offset + k)
|
|
|
fc.Arguments[2] = idx
|
|
@@ -814,7 +815,7 @@ func (r *Runtime) typedArrayProto_reduceRight(call FunctionCall) Value {
|
|
|
|
|
|
func (r *Runtime) typedArrayProto_reverse(call FunctionCall) Value {
|
|
|
if ta, ok := r.toObject(call.This).self.(*typedArrayObject); ok {
|
|
|
- ta.viewedArrayBuf.ensureNotDetached()
|
|
|
+ ta.viewedArrayBuf.ensureNotDetached(true)
|
|
|
l := ta.length
|
|
|
middle := l / 2
|
|
|
for lower := 0; lower != middle; lower++ {
|
|
@@ -834,10 +835,10 @@ func (r *Runtime) typedArrayProto_set(call FunctionCall) Value {
|
|
|
if targetOffset < 0 {
|
|
|
panic(r.newError(r.global.RangeError, "offset should be >= 0"))
|
|
|
}
|
|
|
- ta.viewedArrayBuf.ensureNotDetached()
|
|
|
+ ta.viewedArrayBuf.ensureNotDetached(true)
|
|
|
targetLen := ta.length
|
|
|
if src, ok := srcObj.self.(*typedArrayObject); ok {
|
|
|
- src.viewedArrayBuf.ensureNotDetached()
|
|
|
+ src.viewedArrayBuf.ensureNotDetached(true)
|
|
|
srcLen := src.length
|
|
|
if x := srcLen + targetOffset; x < 0 || x > targetLen {
|
|
|
panic(r.newError(r.global.RangeError, "Source is too large"))
|
|
@@ -893,7 +894,7 @@ func (r *Runtime) typedArrayProto_set(call FunctionCall) Value {
|
|
|
}
|
|
|
for i := 0; i < srcLen; i++ {
|
|
|
val := nilSafe(srcObj.self.getIdx(valueInt(i), nil))
|
|
|
- ta.viewedArrayBuf.ensureNotDetached()
|
|
|
+ ta.viewedArrayBuf.ensureNotDetached(true)
|
|
|
ta.typedArray.set(targetOffset+i, val)
|
|
|
}
|
|
|
}
|
|
@@ -904,7 +905,7 @@ func (r *Runtime) typedArrayProto_set(call FunctionCall) Value {
|
|
|
|
|
|
func (r *Runtime) typedArrayProto_slice(call FunctionCall) Value {
|
|
|
if ta, ok := r.toObject(call.This).self.(*typedArrayObject); ok {
|
|
|
- ta.viewedArrayBuf.ensureNotDetached()
|
|
|
+ ta.viewedArrayBuf.ensureNotDetached(true)
|
|
|
length := int64(ta.length)
|
|
|
start := toIntStrict(relToIdx(call.Argument(0).ToInteger(), length))
|
|
|
var e int64
|
|
@@ -922,14 +923,14 @@ func (r *Runtime) typedArrayProto_slice(call FunctionCall) Value {
|
|
|
dst := r.typedArraySpeciesCreate(ta, []Value{intToValue(int64(count))})
|
|
|
if dst.defaultCtor == ta.defaultCtor {
|
|
|
if count > 0 {
|
|
|
- ta.viewedArrayBuf.ensureNotDetached()
|
|
|
+ ta.viewedArrayBuf.ensureNotDetached(true)
|
|
|
offset := ta.offset
|
|
|
elemSize := ta.elemSize
|
|
|
copy(dst.viewedArrayBuf.data, ta.viewedArrayBuf.data[(offset+start)*elemSize:(offset+start+count)*elemSize])
|
|
|
}
|
|
|
} else {
|
|
|
for i := 0; i < count; i++ {
|
|
|
- ta.viewedArrayBuf.ensureNotDetached()
|
|
|
+ ta.viewedArrayBuf.ensureNotDetached(true)
|
|
|
dst.typedArray.set(i, ta.typedArray.get(ta.offset+start+i))
|
|
|
}
|
|
|
}
|
|
@@ -940,14 +941,14 @@ func (r *Runtime) typedArrayProto_slice(call FunctionCall) Value {
|
|
|
|
|
|
func (r *Runtime) typedArrayProto_some(call FunctionCall) Value {
|
|
|
if ta, ok := r.toObject(call.This).self.(*typedArrayObject); ok {
|
|
|
- ta.viewedArrayBuf.ensureNotDetached()
|
|
|
+ ta.viewedArrayBuf.ensureNotDetached(true)
|
|
|
callbackFn := r.toCallable(call.Argument(0))
|
|
|
fc := FunctionCall{
|
|
|
This: call.Argument(1),
|
|
|
Arguments: []Value{nil, nil, call.This},
|
|
|
}
|
|
|
for k := 0; k < ta.length; k++ {
|
|
|
- ta.viewedArrayBuf.ensureNotDetached()
|
|
|
+ ta.viewedArrayBuf.ensureNotDetached(true)
|
|
|
fc.Arguments[0] = ta.typedArray.get(ta.offset + k)
|
|
|
fc.Arguments[1] = intToValue(int64(k))
|
|
|
if callbackFn(fc).ToBoolean() {
|
|
@@ -961,7 +962,7 @@ func (r *Runtime) typedArrayProto_some(call FunctionCall) Value {
|
|
|
|
|
|
func (r *Runtime) typedArrayProto_sort(call FunctionCall) Value {
|
|
|
if ta, ok := r.toObject(call.This).self.(*typedArrayObject); ok {
|
|
|
- ta.viewedArrayBuf.ensureNotDetached()
|
|
|
+ ta.viewedArrayBuf.ensureNotDetached(true)
|
|
|
var compareFn func(FunctionCall) Value
|
|
|
|
|
|
if arg := call.Argument(0); arg != _undefined {
|
|
@@ -1004,7 +1005,7 @@ func (r *Runtime) typedArrayProto_toLocaleString(call FunctionCall) Value {
|
|
|
length := ta.length
|
|
|
var buf valueStringBuilder
|
|
|
for i := 0; i < length; i++ {
|
|
|
- ta.viewedArrayBuf.ensureNotDetached()
|
|
|
+ ta.viewedArrayBuf.ensureNotDetached(true)
|
|
|
if i > 0 {
|
|
|
buf.WriteRune(',')
|
|
|
}
|
|
@@ -1018,7 +1019,7 @@ func (r *Runtime) typedArrayProto_toLocaleString(call FunctionCall) Value {
|
|
|
|
|
|
func (r *Runtime) typedArrayProto_values(call FunctionCall) Value {
|
|
|
if ta, ok := r.toObject(call.This).self.(*typedArrayObject); ok {
|
|
|
- ta.viewedArrayBuf.ensureNotDetached()
|
|
|
+ ta.viewedArrayBuf.ensureNotDetached(true)
|
|
|
return r.createArrayIterator(ta.val, iterationKindValue)
|
|
|
}
|
|
|
panic(r.NewTypeError("Method TypedArray.prototype.values called on incompatible receiver %s", call.This.String()))
|
|
@@ -1070,7 +1071,7 @@ func (r *Runtime) typedArraySpeciesCreate(ta *typedArrayObject, args []Value) *t
|
|
|
func (r *Runtime) typedArrayCreate(ctor *Object, args []Value) *typedArrayObject {
|
|
|
o := r.toConstructor(ctor)(args, ctor)
|
|
|
if ta, ok := o.self.(*typedArrayObject); ok {
|
|
|
- ta.viewedArrayBuf.ensureNotDetached()
|
|
|
+ ta.viewedArrayBuf.ensureNotDetached(true)
|
|
|
if len(args) == 1 {
|
|
|
if l, ok := args[0].(valueInt); ok {
|
|
|
if ta.length < int(l) {
|
|
@@ -1145,7 +1146,7 @@ func (r *Runtime) _newTypedArrayFromArrayBuffer(ab *arrayBufferObject, args []Va
|
|
|
panic(r.newError(r.global.RangeError, "Start offset of %s should be a multiple of %d", newTarget.self.getStr("name", nil), ta.elemSize))
|
|
|
}
|
|
|
}
|
|
|
- ab.ensureNotDetached()
|
|
|
+ ab.ensureNotDetached(true)
|
|
|
var length int
|
|
|
if len(args) > 2 && args[2] != nil && args[2] != _undefined {
|
|
|
length = r.toIndex(args[2])
|
|
@@ -1165,7 +1166,7 @@ func (r *Runtime) _newTypedArrayFromArrayBuffer(ab *arrayBufferObject, args []Va
|
|
|
|
|
|
func (r *Runtime) _newTypedArrayFromTypedArray(src *typedArrayObject, newTarget *Object) *Object {
|
|
|
dst := r.typedArrayCreate(newTarget, []Value{_positiveZero})
|
|
|
- src.viewedArrayBuf.ensureNotDetached()
|
|
|
+ src.viewedArrayBuf.ensureNotDetached(true)
|
|
|
l := src.length
|
|
|
dst.viewedArrayBuf.prototype = r.getPrototypeFromCtor(r.toObject(src.viewedArrayBuf.getStr("constructor", nil)), r.global.ArrayBuffer, r.global.ArrayBufferPrototype)
|
|
|
dst.viewedArrayBuf.data = allocByteSlice(toIntStrict(int64(l) * int64(dst.elemSize)))
|