forked from dop251/goja
-
Notifications
You must be signed in to change notification settings - Fork 0
/
builtin_typedarrays.go
105 lines (91 loc) · 2.41 KB
/
builtin_typedarrays.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
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)
}