123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- package goja
- type objectArrayBuffer struct {
- baseObject
- data []byte
- }
- func (o *objectArrayBuffer) export() interface{} {
- return o.data
- }
- func (r *Runtime) _newArrayBuffer(proto *Object, o *Object) *objectArrayBuffer {
- if o == nil {
- o = &Object{runtime: r}
- }
- b := &objectArrayBuffer{
- baseObject: baseObject{
- class: classObject,
- val: o,
- prototype: proto,
- extensible: true,
- },
- }
- o.self = b
- b.init()
- return b
- }
- func (r *Runtime) builtin_ArrayBuffer(args []Value, proto *Object) *Object {
- b := r._newArrayBuffer(proto, nil)
- if len(args) > 0 {
- b.data = make([]byte, toLength(args[0]))
- }
- return b.val
- }
- func (r *Runtime) arrayBufferProto_getByteLength(call FunctionCall) Value {
- o := r.toObject(call.This)
- if b, ok := o.self.(*objectArrayBuffer); ok {
- return intToValue(int64(len(b.data)))
- }
- r.typeErrorResult(true, "Object is not ArrayBuffer: %s", o)
- panic("unreachable")
- }
- func (r *Runtime) arrayBufferProto_slice(call FunctionCall) Value {
- o := r.toObject(call.This)
- if b, ok := o.self.(*objectArrayBuffer); ok {
- l := int64(len(b.data))
- start := toLength(call.Argument(0))
- if start < 0 {
- start = l + start
- }
- if start < 0 {
- start = 0
- } else if start > l {
- start = l
- }
- var stop int64
- if arg := call.Argument(1); arg != _undefined {
- stop = toLength(arg)
- if stop < 0 {
- stop = int64(len(b.data)) + stop
- }
- if stop < 0 {
- stop = 0
- } else if stop > l {
- stop = l
- }
- } else {
- stop = l
- }
- ret := r._newArrayBuffer(r.global.ArrayBufferPrototype, nil)
- if stop > start {
- ret.data = b.data[start:stop]
- }
- return ret.val
- }
- r.typeErrorResult(true, "Object is not ArrayBuffer: %s", o)
- panic("unreachable")
- }
- func (r *Runtime) createArrayBufferProto(val *Object) objectImpl {
- b := r._newArrayBuffer(r.global.Object, val)
- byteLengthProp := &valueProperty{
- accessor: true,
- configurable: true,
- getterFunc: r.newNativeFunc(r.arrayBufferProto_getByteLength, nil, "get byteLength", nil, 0),
- }
- b._put("byteLength", byteLengthProp)
- b._putProp("slice", r.newNativeFunc(r.arrayBufferProto_slice, nil, "slice", nil, 2), true, false, true)
- return b
- }
- func (r *Runtime) initTypedArrays() {
- r.global.ArrayBufferPrototype = r.newLazyObject(r.createArrayBufferProto)
- r.global.ArrayBuffer = r.newNativeFuncConstruct(r.builtin_ArrayBuffer, "ArrayBuffer", r.global.ArrayBufferPrototype, 1)
- r.addToGlobal("ArrayBuffer", r.global.ArrayBuffer)
- }
|