builtin_typedarrays.go 52 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476
  1. package goja
  2. import (
  3. "fmt"
  4. "math"
  5. "sort"
  6. "unsafe"
  7. "github.com/dop251/goja/unistring"
  8. )
  9. type typedArraySortCtx struct {
  10. ta *typedArrayObject
  11. compare func(FunctionCall) Value
  12. needValidate bool
  13. }
  14. func (ctx *typedArraySortCtx) Len() int {
  15. return ctx.ta.length
  16. }
  17. func (ctx *typedArraySortCtx) Less(i, j int) bool {
  18. if ctx.needValidate {
  19. ctx.ta.viewedArrayBuf.ensureNotDetached(true)
  20. ctx.needValidate = false
  21. }
  22. offset := ctx.ta.offset
  23. if ctx.compare != nil {
  24. x := ctx.ta.typedArray.get(offset + i)
  25. y := ctx.ta.typedArray.get(offset + j)
  26. res := ctx.compare(FunctionCall{
  27. This: _undefined,
  28. Arguments: []Value{x, y},
  29. }).ToNumber()
  30. ctx.needValidate = true
  31. if i, ok := res.(valueInt); ok {
  32. return i < 0
  33. }
  34. f := res.ToFloat()
  35. if f < 0 {
  36. return true
  37. }
  38. if f > 0 {
  39. return false
  40. }
  41. if math.Signbit(f) {
  42. return true
  43. }
  44. return false
  45. }
  46. return ctx.ta.typedArray.less(offset+i, offset+j)
  47. }
  48. func (ctx *typedArraySortCtx) Swap(i, j int) {
  49. if ctx.needValidate {
  50. ctx.ta.viewedArrayBuf.ensureNotDetached(true)
  51. ctx.needValidate = false
  52. }
  53. offset := ctx.ta.offset
  54. ctx.ta.typedArray.swap(offset+i, offset+j)
  55. }
  56. func allocByteSlice(size int) (b []byte) {
  57. defer func() {
  58. if x := recover(); x != nil {
  59. panic(rangeError(fmt.Sprintf("Buffer size is too large: %d", size)))
  60. }
  61. }()
  62. if size < 0 {
  63. panic(rangeError(fmt.Sprintf("Invalid buffer size: %d", size)))
  64. }
  65. b = make([]byte, size)
  66. return
  67. }
  68. func (r *Runtime) builtin_newArrayBuffer(args []Value, newTarget *Object) *Object {
  69. if newTarget == nil {
  70. panic(r.needNew("ArrayBuffer"))
  71. }
  72. b := r._newArrayBuffer(r.getPrototypeFromCtor(newTarget, r.global.ArrayBuffer, r.global.ArrayBufferPrototype), nil)
  73. if len(args) > 0 {
  74. b.data = allocByteSlice(r.toIndex(args[0]))
  75. }
  76. return b.val
  77. }
  78. func (r *Runtime) arrayBufferProto_getByteLength(call FunctionCall) Value {
  79. o := r.toObject(call.This)
  80. if b, ok := o.self.(*arrayBufferObject); ok {
  81. if b.ensureNotDetached(false) {
  82. return intToValue(int64(len(b.data)))
  83. }
  84. return intToValue(0)
  85. }
  86. panic(r.NewTypeError("Object is not ArrayBuffer: %s", o))
  87. }
  88. func (r *Runtime) arrayBufferProto_slice(call FunctionCall) Value {
  89. o := r.toObject(call.This)
  90. if b, ok := o.self.(*arrayBufferObject); ok {
  91. l := int64(len(b.data))
  92. start := relToIdx(call.Argument(0).ToInteger(), l)
  93. var stop int64
  94. if arg := call.Argument(1); arg != _undefined {
  95. stop = arg.ToInteger()
  96. } else {
  97. stop = l
  98. }
  99. stop = relToIdx(stop, l)
  100. newLen := max(stop-start, 0)
  101. ret := r.speciesConstructor(o, r.global.ArrayBuffer)([]Value{intToValue(newLen)}, nil)
  102. if ab, ok := ret.self.(*arrayBufferObject); ok {
  103. if newLen > 0 {
  104. b.ensureNotDetached(true)
  105. if ret == o {
  106. panic(r.NewTypeError("Species constructor returned the same ArrayBuffer"))
  107. }
  108. if int64(len(ab.data)) < newLen {
  109. panic(r.NewTypeError("Species constructor returned an ArrayBuffer that is too small: %d", len(ab.data)))
  110. }
  111. ab.ensureNotDetached(true)
  112. copy(ab.data, b.data[start:stop])
  113. }
  114. return ret
  115. }
  116. panic(r.NewTypeError("Species constructor did not return an ArrayBuffer: %s", ret.String()))
  117. }
  118. panic(r.NewTypeError("Object is not ArrayBuffer: %s", o))
  119. }
  120. func (r *Runtime) arrayBuffer_isView(call FunctionCall) Value {
  121. if o, ok := call.Argument(0).(*Object); ok {
  122. if _, ok := o.self.(*dataViewObject); ok {
  123. return valueTrue
  124. }
  125. if _, ok := o.self.(*typedArrayObject); ok {
  126. return valueTrue
  127. }
  128. }
  129. return valueFalse
  130. }
  131. func (r *Runtime) newDataView(args []Value, newTarget *Object) *Object {
  132. if newTarget == nil {
  133. panic(r.needNew("DataView"))
  134. }
  135. proto := r.getPrototypeFromCtor(newTarget, r.global.DataView, r.global.DataViewPrototype)
  136. var bufArg Value
  137. if len(args) > 0 {
  138. bufArg = args[0]
  139. }
  140. var buffer *arrayBufferObject
  141. if o, ok := bufArg.(*Object); ok {
  142. if b, ok := o.self.(*arrayBufferObject); ok {
  143. buffer = b
  144. }
  145. }
  146. if buffer == nil {
  147. panic(r.NewTypeError("First argument to DataView constructor must be an ArrayBuffer"))
  148. }
  149. var byteOffset, byteLen int
  150. if len(args) > 1 {
  151. offsetArg := nilSafe(args[1])
  152. byteOffset = r.toIndex(offsetArg)
  153. buffer.ensureNotDetached(true)
  154. if byteOffset > len(buffer.data) {
  155. panic(r.newError(r.global.RangeError, "Start offset %s is outside the bounds of the buffer", offsetArg.String()))
  156. }
  157. }
  158. if len(args) > 2 && args[2] != nil && args[2] != _undefined {
  159. byteLen = r.toIndex(args[2])
  160. if byteOffset+byteLen > len(buffer.data) {
  161. panic(r.newError(r.global.RangeError, "Invalid DataView length %d", byteLen))
  162. }
  163. } else {
  164. byteLen = len(buffer.data) - byteOffset
  165. }
  166. o := &Object{runtime: r}
  167. b := &dataViewObject{
  168. baseObject: baseObject{
  169. class: classObject,
  170. val: o,
  171. prototype: proto,
  172. extensible: true,
  173. },
  174. viewedArrayBuf: buffer,
  175. byteOffset: byteOffset,
  176. byteLen: byteLen,
  177. }
  178. o.self = b
  179. b.init()
  180. return o
  181. }
  182. func (r *Runtime) dataViewProto_getBuffer(call FunctionCall) Value {
  183. if dv, ok := r.toObject(call.This).self.(*dataViewObject); ok {
  184. return dv.viewedArrayBuf.val
  185. }
  186. panic(r.NewTypeError("Method get DataView.prototype.buffer called on incompatible receiver %s", call.This.String()))
  187. }
  188. func (r *Runtime) dataViewProto_getByteLen(call FunctionCall) Value {
  189. if dv, ok := r.toObject(call.This).self.(*dataViewObject); ok {
  190. dv.viewedArrayBuf.ensureNotDetached(true)
  191. return intToValue(int64(dv.byteLen))
  192. }
  193. panic(r.NewTypeError("Method get DataView.prototype.byteLength called on incompatible receiver %s", call.This.String()))
  194. }
  195. func (r *Runtime) dataViewProto_getByteOffset(call FunctionCall) Value {
  196. if dv, ok := r.toObject(call.This).self.(*dataViewObject); ok {
  197. dv.viewedArrayBuf.ensureNotDetached(true)
  198. return intToValue(int64(dv.byteOffset))
  199. }
  200. panic(r.NewTypeError("Method get DataView.prototype.byteOffset called on incompatible receiver %s", call.This.String()))
  201. }
  202. func (r *Runtime) dataViewProto_getFloat32(call FunctionCall) Value {
  203. if dv, ok := r.toObject(call.This).self.(*dataViewObject); ok {
  204. return floatToValue(float64(dv.viewedArrayBuf.getFloat32(dv.getIdxAndByteOrder(call.Argument(0), call.Argument(1), 4))))
  205. }
  206. panic(r.NewTypeError("Method DataView.prototype.getFloat32 called on incompatible receiver %s", call.This.String()))
  207. }
  208. func (r *Runtime) dataViewProto_getFloat64(call FunctionCall) Value {
  209. if dv, ok := r.toObject(call.This).self.(*dataViewObject); ok {
  210. return floatToValue(dv.viewedArrayBuf.getFloat64(dv.getIdxAndByteOrder(call.Argument(0), call.Argument(1), 8)))
  211. }
  212. panic(r.NewTypeError("Method DataView.prototype.getFloat64 called on incompatible receiver %s", call.This.String()))
  213. }
  214. func (r *Runtime) dataViewProto_getInt8(call FunctionCall) Value {
  215. if dv, ok := r.toObject(call.This).self.(*dataViewObject); ok {
  216. idx, _ := dv.getIdxAndByteOrder(call.Argument(0), call.Argument(1), 1)
  217. return intToValue(int64(dv.viewedArrayBuf.getInt8(idx)))
  218. }
  219. panic(r.NewTypeError("Method DataView.prototype.getInt8 called on incompatible receiver %s", call.This.String()))
  220. }
  221. func (r *Runtime) dataViewProto_getInt16(call FunctionCall) Value {
  222. if dv, ok := r.toObject(call.This).self.(*dataViewObject); ok {
  223. return intToValue(int64(dv.viewedArrayBuf.getInt16(dv.getIdxAndByteOrder(call.Argument(0), call.Argument(1), 2))))
  224. }
  225. panic(r.NewTypeError("Method DataView.prototype.getInt16 called on incompatible receiver %s", call.This.String()))
  226. }
  227. func (r *Runtime) dataViewProto_getInt32(call FunctionCall) Value {
  228. if dv, ok := r.toObject(call.This).self.(*dataViewObject); ok {
  229. return intToValue(int64(dv.viewedArrayBuf.getInt32(dv.getIdxAndByteOrder(call.Argument(0), call.Argument(1), 4))))
  230. }
  231. panic(r.NewTypeError("Method DataView.prototype.getInt32 called on incompatible receiver %s", call.This.String()))
  232. }
  233. func (r *Runtime) dataViewProto_getUint8(call FunctionCall) Value {
  234. if dv, ok := r.toObject(call.This).self.(*dataViewObject); ok {
  235. idx, _ := dv.getIdxAndByteOrder(call.Argument(0), call.Argument(1), 1)
  236. return intToValue(int64(dv.viewedArrayBuf.getUint8(idx)))
  237. }
  238. panic(r.NewTypeError("Method DataView.prototype.getUint8 called on incompatible receiver %s", call.This.String()))
  239. }
  240. func (r *Runtime) dataViewProto_getUint16(call FunctionCall) Value {
  241. if dv, ok := r.toObject(call.This).self.(*dataViewObject); ok {
  242. return intToValue(int64(dv.viewedArrayBuf.getUint16(dv.getIdxAndByteOrder(call.Argument(0), call.Argument(1), 2))))
  243. }
  244. panic(r.NewTypeError("Method DataView.prototype.getUint16 called on incompatible receiver %s", call.This.String()))
  245. }
  246. func (r *Runtime) dataViewProto_getUint32(call FunctionCall) Value {
  247. if dv, ok := r.toObject(call.This).self.(*dataViewObject); ok {
  248. return intToValue(int64(dv.viewedArrayBuf.getUint32(dv.getIdxAndByteOrder(call.Argument(0), call.Argument(1), 4))))
  249. }
  250. panic(r.NewTypeError("Method DataView.prototype.getUint32 called on incompatible receiver %s", call.This.String()))
  251. }
  252. func (r *Runtime) dataViewProto_setFloat32(call FunctionCall) Value {
  253. if dv, ok := r.toObject(call.This).self.(*dataViewObject); ok {
  254. val := toFloat32(call.Argument(1))
  255. idx, bo := dv.getIdxAndByteOrder(call.Argument(0), call.Argument(2), 4)
  256. dv.viewedArrayBuf.setFloat32(idx, val, bo)
  257. return _undefined
  258. }
  259. panic(r.NewTypeError("Method DataView.prototype.setFloat32 called on incompatible receiver %s", call.This.String()))
  260. }
  261. func (r *Runtime) dataViewProto_setFloat64(call FunctionCall) Value {
  262. if dv, ok := r.toObject(call.This).self.(*dataViewObject); ok {
  263. val := call.Argument(1).ToFloat()
  264. idx, bo := dv.getIdxAndByteOrder(call.Argument(0), call.Argument(2), 8)
  265. dv.viewedArrayBuf.setFloat64(idx, val, bo)
  266. return _undefined
  267. }
  268. panic(r.NewTypeError("Method DataView.prototype.setFloat64 called on incompatible receiver %s", call.This.String()))
  269. }
  270. func (r *Runtime) dataViewProto_setInt8(call FunctionCall) Value {
  271. if dv, ok := r.toObject(call.This).self.(*dataViewObject); ok {
  272. val := toInt8(call.Argument(1))
  273. idx, _ := dv.getIdxAndByteOrder(call.Argument(0), call.Argument(2), 1)
  274. dv.viewedArrayBuf.setInt8(idx, val)
  275. return _undefined
  276. }
  277. panic(r.NewTypeError("Method DataView.prototype.setInt8 called on incompatible receiver %s", call.This.String()))
  278. }
  279. func (r *Runtime) dataViewProto_setInt16(call FunctionCall) Value {
  280. if dv, ok := r.toObject(call.This).self.(*dataViewObject); ok {
  281. val := toInt16(call.Argument(1))
  282. idx, bo := dv.getIdxAndByteOrder(call.Argument(0), call.Argument(2), 2)
  283. dv.viewedArrayBuf.setInt16(idx, val, bo)
  284. return _undefined
  285. }
  286. panic(r.NewTypeError("Method DataView.prototype.setInt16 called on incompatible receiver %s", call.This.String()))
  287. }
  288. func (r *Runtime) dataViewProto_setInt32(call FunctionCall) Value {
  289. if dv, ok := r.toObject(call.This).self.(*dataViewObject); ok {
  290. val := toInt32(call.Argument(1))
  291. idx, bo := dv.getIdxAndByteOrder(call.Argument(0), call.Argument(2), 4)
  292. dv.viewedArrayBuf.setInt32(idx, val, bo)
  293. return _undefined
  294. }
  295. panic(r.NewTypeError("Method DataView.prototype.setInt32 called on incompatible receiver %s", call.This.String()))
  296. }
  297. func (r *Runtime) dataViewProto_setUint8(call FunctionCall) Value {
  298. if dv, ok := r.toObject(call.This).self.(*dataViewObject); ok {
  299. val := toUint8(call.Argument(1))
  300. idx, _ := dv.getIdxAndByteOrder(call.Argument(0), call.Argument(2), 1)
  301. dv.viewedArrayBuf.setUint8(idx, val)
  302. return _undefined
  303. }
  304. panic(r.NewTypeError("Method DataView.prototype.setUint8 called on incompatible receiver %s", call.This.String()))
  305. }
  306. func (r *Runtime) dataViewProto_setUint16(call FunctionCall) Value {
  307. if dv, ok := r.toObject(call.This).self.(*dataViewObject); ok {
  308. val := toUint16(call.Argument(1))
  309. idx, bo := dv.getIdxAndByteOrder(call.Argument(0), call.Argument(2), 2)
  310. dv.viewedArrayBuf.setUint16(idx, val, bo)
  311. return _undefined
  312. }
  313. panic(r.NewTypeError("Method DataView.prototype.setUint16 called on incompatible receiver %s", call.This.String()))
  314. }
  315. func (r *Runtime) dataViewProto_setUint32(call FunctionCall) Value {
  316. if dv, ok := r.toObject(call.This).self.(*dataViewObject); ok {
  317. val := toUint32(call.Argument(1))
  318. idx, bo := dv.getIdxAndByteOrder(call.Argument(0), call.Argument(2), 4)
  319. dv.viewedArrayBuf.setUint32(idx, val, bo)
  320. return _undefined
  321. }
  322. panic(r.NewTypeError("Method DataView.prototype.setUint32 called on incompatible receiver %s", call.This.String()))
  323. }
  324. func (r *Runtime) typedArrayProto_getBuffer(call FunctionCall) Value {
  325. if ta, ok := r.toObject(call.This).self.(*typedArrayObject); ok {
  326. return ta.viewedArrayBuf.val
  327. }
  328. panic(r.NewTypeError("Method get TypedArray.prototype.buffer called on incompatible receiver %s", call.This.String()))
  329. }
  330. func (r *Runtime) typedArrayProto_getByteLen(call FunctionCall) Value {
  331. if ta, ok := r.toObject(call.This).self.(*typedArrayObject); ok {
  332. if ta.viewedArrayBuf.data == nil {
  333. return _positiveZero
  334. }
  335. return intToValue(int64(ta.length) * int64(ta.elemSize))
  336. }
  337. panic(r.NewTypeError("Method get TypedArray.prototype.byteLength called on incompatible receiver %s", call.This.String()))
  338. }
  339. func (r *Runtime) typedArrayProto_getLength(call FunctionCall) Value {
  340. if ta, ok := r.toObject(call.This).self.(*typedArrayObject); ok {
  341. if ta.viewedArrayBuf.data == nil {
  342. return _positiveZero
  343. }
  344. return intToValue(int64(ta.length))
  345. }
  346. panic(r.NewTypeError("Method get TypedArray.prototype.length called on incompatible receiver %s", call.This.String()))
  347. }
  348. func (r *Runtime) typedArrayProto_getByteOffset(call FunctionCall) Value {
  349. if ta, ok := r.toObject(call.This).self.(*typedArrayObject); ok {
  350. if ta.viewedArrayBuf.data == nil {
  351. return _positiveZero
  352. }
  353. return intToValue(int64(ta.offset) * int64(ta.elemSize))
  354. }
  355. panic(r.NewTypeError("Method get TypedArray.prototype.byteOffset called on incompatible receiver %s", call.This.String()))
  356. }
  357. func (r *Runtime) typedArrayProto_copyWithin(call FunctionCall) Value {
  358. if ta, ok := r.toObject(call.This).self.(*typedArrayObject); ok {
  359. ta.viewedArrayBuf.ensureNotDetached(true)
  360. l := int64(ta.length)
  361. var relEnd int64
  362. to := toIntStrict(relToIdx(call.Argument(0).ToInteger(), l))
  363. from := toIntStrict(relToIdx(call.Argument(1).ToInteger(), l))
  364. if end := call.Argument(2); end != _undefined {
  365. relEnd = end.ToInteger()
  366. } else {
  367. relEnd = l
  368. }
  369. final := toIntStrict(relToIdx(relEnd, l))
  370. data := ta.viewedArrayBuf.data
  371. offset := ta.offset
  372. elemSize := ta.elemSize
  373. if final > from {
  374. ta.viewedArrayBuf.ensureNotDetached(true)
  375. copy(data[(offset+to)*elemSize:], data[(offset+from)*elemSize:(offset+final)*elemSize])
  376. }
  377. return call.This
  378. }
  379. panic(r.NewTypeError("Method TypedArray.prototype.copyWithin called on incompatible receiver %s", call.This.String()))
  380. }
  381. func (r *Runtime) typedArrayProto_entries(call FunctionCall) Value {
  382. if ta, ok := r.toObject(call.This).self.(*typedArrayObject); ok {
  383. ta.viewedArrayBuf.ensureNotDetached(true)
  384. return r.createArrayIterator(ta.val, iterationKindKeyValue)
  385. }
  386. panic(r.NewTypeError("Method TypedArray.prototype.entries called on incompatible receiver %s", call.This.String()))
  387. }
  388. func (r *Runtime) typedArrayProto_every(call FunctionCall) Value {
  389. if ta, ok := r.toObject(call.This).self.(*typedArrayObject); ok {
  390. ta.viewedArrayBuf.ensureNotDetached(true)
  391. callbackFn := r.toCallable(call.Argument(0))
  392. fc := FunctionCall{
  393. This: call.Argument(1),
  394. Arguments: []Value{nil, nil, call.This},
  395. }
  396. for k := 0; k < ta.length; k++ {
  397. if ta.isValidIntegerIndex(k) {
  398. fc.Arguments[0] = ta.typedArray.get(ta.offset + k)
  399. } else {
  400. fc.Arguments[0] = _undefined
  401. }
  402. fc.Arguments[1] = intToValue(int64(k))
  403. if !callbackFn(fc).ToBoolean() {
  404. return valueFalse
  405. }
  406. }
  407. return valueTrue
  408. }
  409. panic(r.NewTypeError("Method TypedArray.prototype.every called on incompatible receiver %s", call.This.String()))
  410. }
  411. func (r *Runtime) typedArrayProto_fill(call FunctionCall) Value {
  412. if ta, ok := r.toObject(call.This).self.(*typedArrayObject); ok {
  413. ta.viewedArrayBuf.ensureNotDetached(true)
  414. l := int64(ta.length)
  415. k := toIntStrict(relToIdx(call.Argument(1).ToInteger(), l))
  416. var relEnd int64
  417. if endArg := call.Argument(2); endArg != _undefined {
  418. relEnd = endArg.ToInteger()
  419. } else {
  420. relEnd = l
  421. }
  422. final := toIntStrict(relToIdx(relEnd, l))
  423. value := ta.typedArray.toRaw(call.Argument(0))
  424. ta.viewedArrayBuf.ensureNotDetached(true)
  425. for ; k < final; k++ {
  426. ta.typedArray.setRaw(ta.offset+k, value)
  427. }
  428. return call.This
  429. }
  430. panic(r.NewTypeError("Method TypedArray.prototype.fill called on incompatible receiver %s", call.This.String()))
  431. }
  432. func (r *Runtime) typedArrayProto_filter(call FunctionCall) Value {
  433. o := r.toObject(call.This)
  434. if ta, ok := o.self.(*typedArrayObject); ok {
  435. ta.viewedArrayBuf.ensureNotDetached(true)
  436. callbackFn := r.toCallable(call.Argument(0))
  437. fc := FunctionCall{
  438. This: call.Argument(1),
  439. Arguments: []Value{nil, nil, call.This},
  440. }
  441. buf := make([]byte, 0, ta.length*ta.elemSize)
  442. captured := 0
  443. rawVal := make([]byte, ta.elemSize)
  444. for k := 0; k < ta.length; k++ {
  445. if ta.isValidIntegerIndex(k) {
  446. fc.Arguments[0] = ta.typedArray.get(ta.offset + k)
  447. i := (ta.offset + k) * ta.elemSize
  448. copy(rawVal, ta.viewedArrayBuf.data[i:])
  449. } else {
  450. fc.Arguments[0] = _undefined
  451. for i := range rawVal {
  452. rawVal[i] = 0
  453. }
  454. }
  455. fc.Arguments[1] = intToValue(int64(k))
  456. if callbackFn(fc).ToBoolean() {
  457. buf = append(buf, rawVal...)
  458. captured++
  459. }
  460. }
  461. c := r.speciesConstructorObj(o, ta.defaultCtor)
  462. ab := r._newArrayBuffer(r.global.ArrayBufferPrototype, nil)
  463. ab.data = buf
  464. kept := r.toConstructor(ta.defaultCtor)([]Value{ab.val}, ta.defaultCtor)
  465. if c == ta.defaultCtor {
  466. return kept
  467. } else {
  468. ret := r.typedArrayCreate(c, []Value{intToValue(int64(captured))})
  469. keptTa := kept.self.(*typedArrayObject)
  470. for i := 0; i < captured; i++ {
  471. ret.typedArray.set(i, keptTa.typedArray.get(keptTa.offset+i))
  472. }
  473. return ret.val
  474. }
  475. }
  476. panic(r.NewTypeError("Method TypedArray.prototype.filter called on incompatible receiver %s", call.This.String()))
  477. }
  478. func (r *Runtime) typedArrayProto_find(call FunctionCall) Value {
  479. if ta, ok := r.toObject(call.This).self.(*typedArrayObject); ok {
  480. ta.viewedArrayBuf.ensureNotDetached(true)
  481. predicate := r.toCallable(call.Argument(0))
  482. fc := FunctionCall{
  483. This: call.Argument(1),
  484. Arguments: []Value{nil, nil, call.This},
  485. }
  486. for k := 0; k < ta.length; k++ {
  487. var val Value
  488. if ta.isValidIntegerIndex(k) {
  489. val = ta.typedArray.get(ta.offset + k)
  490. }
  491. fc.Arguments[0] = val
  492. fc.Arguments[1] = intToValue(int64(k))
  493. if predicate(fc).ToBoolean() {
  494. return val
  495. }
  496. }
  497. return _undefined
  498. }
  499. panic(r.NewTypeError("Method TypedArray.prototype.find called on incompatible receiver %s", call.This.String()))
  500. }
  501. func (r *Runtime) typedArrayProto_findIndex(call FunctionCall) Value {
  502. if ta, ok := r.toObject(call.This).self.(*typedArrayObject); ok {
  503. ta.viewedArrayBuf.ensureNotDetached(true)
  504. predicate := r.toCallable(call.Argument(0))
  505. fc := FunctionCall{
  506. This: call.Argument(1),
  507. Arguments: []Value{nil, nil, call.This},
  508. }
  509. for k := 0; k < ta.length; k++ {
  510. if ta.isValidIntegerIndex(k) {
  511. fc.Arguments[0] = ta.typedArray.get(ta.offset + k)
  512. } else {
  513. fc.Arguments[0] = _undefined
  514. }
  515. fc.Arguments[1] = intToValue(int64(k))
  516. if predicate(fc).ToBoolean() {
  517. return fc.Arguments[1]
  518. }
  519. }
  520. return intToValue(-1)
  521. }
  522. panic(r.NewTypeError("Method TypedArray.prototype.findIndex called on incompatible receiver %s", call.This.String()))
  523. }
  524. func (r *Runtime) typedArrayProto_forEach(call FunctionCall) Value {
  525. if ta, ok := r.toObject(call.This).self.(*typedArrayObject); ok {
  526. ta.viewedArrayBuf.ensureNotDetached(true)
  527. callbackFn := r.toCallable(call.Argument(0))
  528. fc := FunctionCall{
  529. This: call.Argument(1),
  530. Arguments: []Value{nil, nil, call.This},
  531. }
  532. for k := 0; k < ta.length; k++ {
  533. var val Value
  534. if ta.isValidIntegerIndex(k) {
  535. val = ta.typedArray.get(ta.offset + k)
  536. }
  537. fc.Arguments[0] = val
  538. fc.Arguments[1] = intToValue(int64(k))
  539. callbackFn(fc)
  540. }
  541. return _undefined
  542. }
  543. panic(r.NewTypeError("Method TypedArray.prototype.forEach called on incompatible receiver %s", call.This.String()))
  544. }
  545. func (r *Runtime) typedArrayProto_includes(call FunctionCall) Value {
  546. if ta, ok := r.toObject(call.This).self.(*typedArrayObject); ok {
  547. ta.viewedArrayBuf.ensureNotDetached(true)
  548. length := int64(ta.length)
  549. if length == 0 {
  550. return valueFalse
  551. }
  552. n := call.Argument(1).ToInteger()
  553. if n >= length {
  554. return valueFalse
  555. }
  556. if n < 0 {
  557. n = max(length+n, 0)
  558. }
  559. searchElement := call.Argument(0)
  560. if searchElement == _negativeZero {
  561. searchElement = _positiveZero
  562. }
  563. startIdx := toIntStrict(n)
  564. if !ta.viewedArrayBuf.ensureNotDetached(false) {
  565. if searchElement == _undefined && startIdx < ta.length {
  566. return valueTrue
  567. }
  568. return valueFalse
  569. }
  570. if ta.typedArray.typeMatch(searchElement) {
  571. se := ta.typedArray.toRaw(searchElement)
  572. for k := startIdx; k < ta.length; k++ {
  573. if ta.typedArray.getRaw(ta.offset+k) == se {
  574. return valueTrue
  575. }
  576. }
  577. }
  578. return valueFalse
  579. }
  580. panic(r.NewTypeError("Method TypedArray.prototype.includes called on incompatible receiver %s", call.This.String()))
  581. }
  582. func (r *Runtime) typedArrayProto_indexOf(call FunctionCall) Value {
  583. if ta, ok := r.toObject(call.This).self.(*typedArrayObject); ok {
  584. ta.viewedArrayBuf.ensureNotDetached(true)
  585. length := int64(ta.length)
  586. if length == 0 {
  587. return intToValue(-1)
  588. }
  589. n := call.Argument(1).ToInteger()
  590. if n >= length {
  591. return intToValue(-1)
  592. }
  593. if n < 0 {
  594. n = max(length+n, 0)
  595. }
  596. if ta.viewedArrayBuf.ensureNotDetached(false) {
  597. searchElement := call.Argument(0)
  598. if searchElement == _negativeZero {
  599. searchElement = _positiveZero
  600. }
  601. if !IsNaN(searchElement) && ta.typedArray.typeMatch(searchElement) {
  602. se := ta.typedArray.toRaw(searchElement)
  603. for k := toIntStrict(n); k < ta.length; k++ {
  604. if ta.typedArray.getRaw(ta.offset+k) == se {
  605. return intToValue(int64(k))
  606. }
  607. }
  608. }
  609. }
  610. return intToValue(-1)
  611. }
  612. panic(r.NewTypeError("Method TypedArray.prototype.indexOf called on incompatible receiver %s", call.This.String()))
  613. }
  614. func (r *Runtime) typedArrayProto_join(call FunctionCall) Value {
  615. if ta, ok := r.toObject(call.This).self.(*typedArrayObject); ok {
  616. ta.viewedArrayBuf.ensureNotDetached(true)
  617. s := call.Argument(0)
  618. var sep valueString
  619. if s != _undefined {
  620. sep = s.toString()
  621. } else {
  622. sep = asciiString(",")
  623. }
  624. l := ta.length
  625. if l == 0 {
  626. return stringEmpty
  627. }
  628. var buf valueStringBuilder
  629. var element0 Value
  630. if ta.isValidIntegerIndex(0) {
  631. element0 = ta.typedArray.get(ta.offset + 0)
  632. }
  633. if element0 != nil && element0 != _undefined && element0 != _null {
  634. buf.WriteString(element0.toString())
  635. }
  636. for i := 1; i < l; i++ {
  637. buf.WriteString(sep)
  638. if ta.isValidIntegerIndex(i) {
  639. element := ta.typedArray.get(ta.offset + i)
  640. if element != nil && element != _undefined && element != _null {
  641. buf.WriteString(element.toString())
  642. }
  643. }
  644. }
  645. return buf.String()
  646. }
  647. panic(r.NewTypeError("Method TypedArray.prototype.join called on incompatible receiver"))
  648. }
  649. func (r *Runtime) typedArrayProto_keys(call FunctionCall) Value {
  650. if ta, ok := r.toObject(call.This).self.(*typedArrayObject); ok {
  651. ta.viewedArrayBuf.ensureNotDetached(true)
  652. return r.createArrayIterator(ta.val, iterationKindKey)
  653. }
  654. panic(r.NewTypeError("Method TypedArray.prototype.keys called on incompatible receiver %s", call.This.String()))
  655. }
  656. func (r *Runtime) typedArrayProto_lastIndexOf(call FunctionCall) Value {
  657. if ta, ok := r.toObject(call.This).self.(*typedArrayObject); ok {
  658. ta.viewedArrayBuf.ensureNotDetached(true)
  659. length := int64(ta.length)
  660. if length == 0 {
  661. return intToValue(-1)
  662. }
  663. var fromIndex int64
  664. if len(call.Arguments) < 2 {
  665. fromIndex = length - 1
  666. } else {
  667. fromIndex = call.Argument(1).ToInteger()
  668. if fromIndex >= 0 {
  669. fromIndex = min(fromIndex, length-1)
  670. } else {
  671. fromIndex += length
  672. if fromIndex < 0 {
  673. fromIndex = -1 // prevent underflow in toIntStrict() on 32-bit platforms
  674. }
  675. }
  676. }
  677. if ta.viewedArrayBuf.ensureNotDetached(false) {
  678. searchElement := call.Argument(0)
  679. if searchElement == _negativeZero {
  680. searchElement = _positiveZero
  681. }
  682. if !IsNaN(searchElement) && ta.typedArray.typeMatch(searchElement) {
  683. se := ta.typedArray.toRaw(searchElement)
  684. for k := toIntStrict(fromIndex); k >= 0; k-- {
  685. if ta.typedArray.getRaw(ta.offset+k) == se {
  686. return intToValue(int64(k))
  687. }
  688. }
  689. }
  690. }
  691. return intToValue(-1)
  692. }
  693. panic(r.NewTypeError("Method TypedArray.prototype.lastIndexOf called on incompatible receiver %s", call.This.String()))
  694. }
  695. func (r *Runtime) typedArrayProto_map(call FunctionCall) Value {
  696. if ta, ok := r.toObject(call.This).self.(*typedArrayObject); ok {
  697. ta.viewedArrayBuf.ensureNotDetached(true)
  698. callbackFn := r.toCallable(call.Argument(0))
  699. fc := FunctionCall{
  700. This: call.Argument(1),
  701. Arguments: []Value{nil, nil, call.This},
  702. }
  703. dst := r.typedArraySpeciesCreate(ta, []Value{intToValue(int64(ta.length))})
  704. for i := 0; i < ta.length; i++ {
  705. if ta.isValidIntegerIndex(i) {
  706. fc.Arguments[0] = ta.typedArray.get(ta.offset + i)
  707. } else {
  708. fc.Arguments[0] = _undefined
  709. }
  710. fc.Arguments[1] = intToValue(int64(i))
  711. dst.typedArray.set(i, callbackFn(fc))
  712. }
  713. return dst.val
  714. }
  715. panic(r.NewTypeError("Method TypedArray.prototype.map called on incompatible receiver %s", call.This.String()))
  716. }
  717. func (r *Runtime) typedArrayProto_reduce(call FunctionCall) Value {
  718. if ta, ok := r.toObject(call.This).self.(*typedArrayObject); ok {
  719. ta.viewedArrayBuf.ensureNotDetached(true)
  720. callbackFn := r.toCallable(call.Argument(0))
  721. fc := FunctionCall{
  722. This: _undefined,
  723. Arguments: []Value{nil, nil, nil, call.This},
  724. }
  725. k := 0
  726. if len(call.Arguments) >= 2 {
  727. fc.Arguments[0] = call.Argument(1)
  728. } else {
  729. if ta.length > 0 {
  730. fc.Arguments[0] = ta.typedArray.get(ta.offset + 0)
  731. k = 1
  732. }
  733. }
  734. if fc.Arguments[0] == nil {
  735. panic(r.NewTypeError("Reduce of empty array with no initial value"))
  736. }
  737. for ; k < ta.length; k++ {
  738. if ta.isValidIntegerIndex(k) {
  739. fc.Arguments[1] = ta.typedArray.get(ta.offset + k)
  740. } else {
  741. fc.Arguments[1] = _undefined
  742. }
  743. idx := valueInt(k)
  744. fc.Arguments[2] = idx
  745. fc.Arguments[0] = callbackFn(fc)
  746. }
  747. return fc.Arguments[0]
  748. }
  749. panic(r.NewTypeError("Method TypedArray.prototype.reduce called on incompatible receiver %s", call.This.String()))
  750. }
  751. func (r *Runtime) typedArrayProto_reduceRight(call FunctionCall) Value {
  752. if ta, ok := r.toObject(call.This).self.(*typedArrayObject); ok {
  753. ta.viewedArrayBuf.ensureNotDetached(true)
  754. callbackFn := r.toCallable(call.Argument(0))
  755. fc := FunctionCall{
  756. This: _undefined,
  757. Arguments: []Value{nil, nil, nil, call.This},
  758. }
  759. k := ta.length - 1
  760. if len(call.Arguments) >= 2 {
  761. fc.Arguments[0] = call.Argument(1)
  762. } else {
  763. if k >= 0 {
  764. fc.Arguments[0] = ta.typedArray.get(ta.offset + k)
  765. k--
  766. }
  767. }
  768. if fc.Arguments[0] == nil {
  769. panic(r.NewTypeError("Reduce of empty array with no initial value"))
  770. }
  771. for ; k >= 0; k-- {
  772. if ta.isValidIntegerIndex(k) {
  773. fc.Arguments[1] = ta.typedArray.get(ta.offset + k)
  774. } else {
  775. fc.Arguments[1] = _undefined
  776. }
  777. idx := valueInt(k)
  778. fc.Arguments[2] = idx
  779. fc.Arguments[0] = callbackFn(fc)
  780. }
  781. return fc.Arguments[0]
  782. }
  783. panic(r.NewTypeError("Method TypedArray.prototype.reduceRight called on incompatible receiver %s", call.This.String()))
  784. }
  785. func (r *Runtime) typedArrayProto_reverse(call FunctionCall) Value {
  786. if ta, ok := r.toObject(call.This).self.(*typedArrayObject); ok {
  787. ta.viewedArrayBuf.ensureNotDetached(true)
  788. l := ta.length
  789. middle := l / 2
  790. for lower := 0; lower != middle; lower++ {
  791. upper := l - lower - 1
  792. ta.typedArray.swap(ta.offset+lower, ta.offset+upper)
  793. }
  794. return call.This
  795. }
  796. panic(r.NewTypeError("Method TypedArray.prototype.reverse called on incompatible receiver %s", call.This.String()))
  797. }
  798. func (r *Runtime) typedArrayProto_set(call FunctionCall) Value {
  799. if ta, ok := r.toObject(call.This).self.(*typedArrayObject); ok {
  800. srcObj := call.Argument(0).ToObject(r)
  801. targetOffset := toIntStrict(call.Argument(1).ToInteger())
  802. if targetOffset < 0 {
  803. panic(r.newError(r.global.RangeError, "offset should be >= 0"))
  804. }
  805. ta.viewedArrayBuf.ensureNotDetached(true)
  806. targetLen := ta.length
  807. if src, ok := srcObj.self.(*typedArrayObject); ok {
  808. src.viewedArrayBuf.ensureNotDetached(true)
  809. srcLen := src.length
  810. if x := srcLen + targetOffset; x < 0 || x > targetLen {
  811. panic(r.newError(r.global.RangeError, "Source is too large"))
  812. }
  813. if src.defaultCtor == ta.defaultCtor {
  814. copy(ta.viewedArrayBuf.data[(ta.offset+targetOffset)*ta.elemSize:],
  815. src.viewedArrayBuf.data[src.offset*src.elemSize:(src.offset+srcLen)*src.elemSize])
  816. } else {
  817. curSrc := uintptr(unsafe.Pointer(&src.viewedArrayBuf.data[src.offset*src.elemSize]))
  818. endSrc := curSrc + uintptr(srcLen*src.elemSize)
  819. curDst := uintptr(unsafe.Pointer(&ta.viewedArrayBuf.data[(ta.offset+targetOffset)*ta.elemSize]))
  820. dstOffset := ta.offset + targetOffset
  821. srcOffset := src.offset
  822. if ta.elemSize == src.elemSize {
  823. if curDst <= curSrc || curDst >= endSrc {
  824. for i := 0; i < srcLen; i++ {
  825. ta.typedArray.set(dstOffset+i, src.typedArray.get(srcOffset+i))
  826. }
  827. } else {
  828. for i := srcLen - 1; i >= 0; i-- {
  829. ta.typedArray.set(dstOffset+i, src.typedArray.get(srcOffset+i))
  830. }
  831. }
  832. } else {
  833. x := int(curDst-curSrc) / (src.elemSize - ta.elemSize)
  834. if x < 0 {
  835. x = 0
  836. } else if x > srcLen {
  837. x = srcLen
  838. }
  839. if ta.elemSize < src.elemSize {
  840. for i := x; i < srcLen; i++ {
  841. ta.typedArray.set(dstOffset+i, src.typedArray.get(srcOffset+i))
  842. }
  843. for i := x - 1; i >= 0; i-- {
  844. ta.typedArray.set(dstOffset+i, src.typedArray.get(srcOffset+i))
  845. }
  846. } else {
  847. for i := 0; i < x; i++ {
  848. ta.typedArray.set(dstOffset+i, src.typedArray.get(srcOffset+i))
  849. }
  850. for i := srcLen - 1; i >= x; i-- {
  851. ta.typedArray.set(dstOffset+i, src.typedArray.get(srcOffset+i))
  852. }
  853. }
  854. }
  855. }
  856. } else {
  857. targetLen := ta.length
  858. srcLen := toIntStrict(toLength(srcObj.self.getStr("length", nil)))
  859. if x := srcLen + targetOffset; x < 0 || x > targetLen {
  860. panic(r.newError(r.global.RangeError, "Source is too large"))
  861. }
  862. for i := 0; i < srcLen; i++ {
  863. val := nilSafe(srcObj.self.getIdx(valueInt(i), nil))
  864. ta.viewedArrayBuf.ensureNotDetached(true)
  865. if ta.isValidIntegerIndex(i) {
  866. ta.typedArray.set(targetOffset+i, val)
  867. }
  868. }
  869. }
  870. return _undefined
  871. }
  872. panic(r.NewTypeError("Method TypedArray.prototype.set called on incompatible receiver %s", call.This.String()))
  873. }
  874. func (r *Runtime) typedArrayProto_slice(call FunctionCall) Value {
  875. if ta, ok := r.toObject(call.This).self.(*typedArrayObject); ok {
  876. ta.viewedArrayBuf.ensureNotDetached(true)
  877. length := int64(ta.length)
  878. start := toIntStrict(relToIdx(call.Argument(0).ToInteger(), length))
  879. var e int64
  880. if endArg := call.Argument(1); endArg != _undefined {
  881. e = endArg.ToInteger()
  882. } else {
  883. e = length
  884. }
  885. end := toIntStrict(relToIdx(e, length))
  886. count := end - start
  887. if count < 0 {
  888. count = 0
  889. }
  890. dst := r.typedArraySpeciesCreate(ta, []Value{intToValue(int64(count))})
  891. if dst.defaultCtor == ta.defaultCtor {
  892. if count > 0 {
  893. ta.viewedArrayBuf.ensureNotDetached(true)
  894. offset := ta.offset
  895. elemSize := ta.elemSize
  896. copy(dst.viewedArrayBuf.data, ta.viewedArrayBuf.data[(offset+start)*elemSize:(offset+start+count)*elemSize])
  897. }
  898. } else {
  899. for i := 0; i < count; i++ {
  900. ta.viewedArrayBuf.ensureNotDetached(true)
  901. dst.typedArray.set(i, ta.typedArray.get(ta.offset+start+i))
  902. }
  903. }
  904. return dst.val
  905. }
  906. panic(r.NewTypeError("Method TypedArray.prototype.slice called on incompatible receiver %s", call.This.String()))
  907. }
  908. func (r *Runtime) typedArrayProto_some(call FunctionCall) Value {
  909. if ta, ok := r.toObject(call.This).self.(*typedArrayObject); ok {
  910. ta.viewedArrayBuf.ensureNotDetached(true)
  911. callbackFn := r.toCallable(call.Argument(0))
  912. fc := FunctionCall{
  913. This: call.Argument(1),
  914. Arguments: []Value{nil, nil, call.This},
  915. }
  916. for k := 0; k < ta.length; k++ {
  917. if ta.isValidIntegerIndex(k) {
  918. fc.Arguments[0] = ta.typedArray.get(ta.offset + k)
  919. } else {
  920. fc.Arguments[0] = _undefined
  921. }
  922. fc.Arguments[1] = intToValue(int64(k))
  923. if callbackFn(fc).ToBoolean() {
  924. return valueTrue
  925. }
  926. }
  927. return valueFalse
  928. }
  929. panic(r.NewTypeError("Method TypedArray.prototype.some called on incompatible receiver %s", call.This.String()))
  930. }
  931. func (r *Runtime) typedArrayProto_sort(call FunctionCall) Value {
  932. if ta, ok := r.toObject(call.This).self.(*typedArrayObject); ok {
  933. ta.viewedArrayBuf.ensureNotDetached(true)
  934. var compareFn func(FunctionCall) Value
  935. if arg := call.Argument(0); arg != _undefined {
  936. compareFn = r.toCallable(arg)
  937. }
  938. ctx := typedArraySortCtx{
  939. ta: ta,
  940. compare: compareFn,
  941. }
  942. sort.Stable(&ctx)
  943. return call.This
  944. }
  945. panic(r.NewTypeError("Method TypedArray.prototype.sort called on incompatible receiver %s", call.This.String()))
  946. }
  947. func (r *Runtime) typedArrayProto_subarray(call FunctionCall) Value {
  948. if ta, ok := r.toObject(call.This).self.(*typedArrayObject); ok {
  949. l := int64(ta.length)
  950. beginIdx := relToIdx(call.Argument(0).ToInteger(), l)
  951. var relEnd int64
  952. if endArg := call.Argument(1); endArg != _undefined {
  953. relEnd = endArg.ToInteger()
  954. } else {
  955. relEnd = l
  956. }
  957. endIdx := relToIdx(relEnd, l)
  958. newLen := max(endIdx-beginIdx, 0)
  959. return r.typedArraySpeciesCreate(ta, []Value{ta.viewedArrayBuf.val,
  960. intToValue((int64(ta.offset) + beginIdx) * int64(ta.elemSize)),
  961. intToValue(newLen),
  962. }).val
  963. }
  964. panic(r.NewTypeError("Method TypedArray.prototype.subarray called on incompatible receiver %s", call.This.String()))
  965. }
  966. func (r *Runtime) typedArrayProto_toLocaleString(call FunctionCall) Value {
  967. if ta, ok := r.toObject(call.This).self.(*typedArrayObject); ok {
  968. length := ta.length
  969. var buf valueStringBuilder
  970. for i := 0; i < length; i++ {
  971. ta.viewedArrayBuf.ensureNotDetached(true)
  972. if i > 0 {
  973. buf.WriteRune(',')
  974. }
  975. item := ta.typedArray.get(ta.offset + i)
  976. r.writeItemLocaleString(item, &buf)
  977. }
  978. return buf.String()
  979. }
  980. panic(r.NewTypeError("Method TypedArray.prototype.toLocaleString called on incompatible receiver %s", call.This.String()))
  981. }
  982. func (r *Runtime) typedArrayProto_values(call FunctionCall) Value {
  983. if ta, ok := r.toObject(call.This).self.(*typedArrayObject); ok {
  984. ta.viewedArrayBuf.ensureNotDetached(true)
  985. return r.createArrayIterator(ta.val, iterationKindValue)
  986. }
  987. panic(r.NewTypeError("Method TypedArray.prototype.values called on incompatible receiver %s", call.This.String()))
  988. }
  989. func (r *Runtime) typedArrayProto_toStringTag(call FunctionCall) Value {
  990. if obj, ok := call.This.(*Object); ok {
  991. if ta, ok := obj.self.(*typedArrayObject); ok {
  992. return nilSafe(ta.defaultCtor.self.getStr("name", nil))
  993. }
  994. }
  995. return _undefined
  996. }
  997. func (r *Runtime) newTypedArray([]Value, *Object) *Object {
  998. panic(r.NewTypeError("Abstract class TypedArray not directly constructable"))
  999. }
  1000. func (r *Runtime) typedArray_from(call FunctionCall) Value {
  1001. mapFn := call.Argument(1)
  1002. if mapFn == _undefined {
  1003. mapFn = nil
  1004. }
  1005. return r.typedArrayFrom(r.toObject(call.This), call.Argument(0).ToObject(r), mapFn, call.Argument(2))
  1006. }
  1007. func (r *Runtime) typedArray_of(call FunctionCall) Value {
  1008. ta := r.typedArrayCreate(r.toObject(call.This), []Value{intToValue(int64(len(call.Arguments)))})
  1009. for i, val := range call.Arguments {
  1010. ta.typedArray.set(i, val)
  1011. }
  1012. return ta.val
  1013. }
  1014. func (r *Runtime) allocateTypedArray(newTarget *Object, length int, taCtor typedArrayObjectCtor) *Object {
  1015. buf := r._newArrayBuffer(r.global.ArrayBufferPrototype, nil)
  1016. ta := taCtor(buf, 0, length, r.getPrototypeFromCtor(newTarget, nil, r.global.TypedArrayPrototype))
  1017. if length > 0 {
  1018. buf.data = allocByteSlice(length * ta.elemSize)
  1019. }
  1020. return ta.val
  1021. }
  1022. func (r *Runtime) typedArraySpeciesCreate(ta *typedArrayObject, args []Value) *typedArrayObject {
  1023. return r.typedArrayCreate(r.speciesConstructorObj(ta.val, ta.defaultCtor), args)
  1024. }
  1025. func (r *Runtime) typedArrayCreate(ctor *Object, args []Value) *typedArrayObject {
  1026. o := r.toConstructor(ctor)(args, ctor)
  1027. if ta, ok := o.self.(*typedArrayObject); ok {
  1028. ta.viewedArrayBuf.ensureNotDetached(true)
  1029. if len(args) == 1 {
  1030. if l, ok := args[0].(valueInt); ok {
  1031. if ta.length < int(l) {
  1032. panic(r.NewTypeError("Derived TypedArray constructor created an array which was too small"))
  1033. }
  1034. }
  1035. }
  1036. return ta
  1037. }
  1038. panic(r.NewTypeError("Invalid TypedArray: %s", o))
  1039. }
  1040. func (r *Runtime) typedArrayFrom(ctor, items *Object, mapFn, thisValue Value) *Object {
  1041. var mapFc func(call FunctionCall) Value
  1042. if mapFn != nil {
  1043. mapFc = r.toCallable(mapFn)
  1044. if thisValue == nil {
  1045. thisValue = _undefined
  1046. }
  1047. }
  1048. usingIter := toMethod(items.self.getSym(SymIterator, nil))
  1049. if usingIter != nil {
  1050. values := r.iterableToList(items, usingIter)
  1051. ta := r.typedArrayCreate(ctor, []Value{intToValue(int64(len(values)))})
  1052. if mapFc == nil {
  1053. for idx, val := range values {
  1054. ta.typedArray.set(idx, val)
  1055. }
  1056. } else {
  1057. fc := FunctionCall{
  1058. This: thisValue,
  1059. Arguments: []Value{nil, nil},
  1060. }
  1061. for idx, val := range values {
  1062. fc.Arguments[0], fc.Arguments[1] = val, intToValue(int64(idx))
  1063. val = mapFc(fc)
  1064. ta.typedArray.set(idx, val)
  1065. }
  1066. }
  1067. return ta.val
  1068. }
  1069. length := toIntStrict(toLength(items.self.getStr("length", nil)))
  1070. ta := r.typedArrayCreate(ctor, []Value{intToValue(int64(length))})
  1071. if mapFc == nil {
  1072. for i := 0; i < length; i++ {
  1073. ta.typedArray.set(i, nilSafe(items.self.getIdx(valueInt(i), nil)))
  1074. }
  1075. } else {
  1076. fc := FunctionCall{
  1077. This: thisValue,
  1078. Arguments: []Value{nil, nil},
  1079. }
  1080. for i := 0; i < length; i++ {
  1081. idx := valueInt(i)
  1082. fc.Arguments[0], fc.Arguments[1] = items.self.getIdx(idx, nil), idx
  1083. ta.typedArray.set(i, mapFc(fc))
  1084. }
  1085. }
  1086. return ta.val
  1087. }
  1088. func (r *Runtime) _newTypedArrayFromArrayBuffer(ab *arrayBufferObject, args []Value, newTarget *Object, taCtor typedArrayObjectCtor) *Object {
  1089. ta := taCtor(ab, 0, 0, r.getPrototypeFromCtor(newTarget, nil, r.global.TypedArrayPrototype))
  1090. var byteOffset int
  1091. if len(args) > 1 && args[1] != nil && args[1] != _undefined {
  1092. byteOffset = r.toIndex(args[1])
  1093. if byteOffset%ta.elemSize != 0 {
  1094. panic(r.newError(r.global.RangeError, "Start offset of %s should be a multiple of %d", newTarget.self.getStr("name", nil), ta.elemSize))
  1095. }
  1096. }
  1097. ab.ensureNotDetached(true)
  1098. var length int
  1099. if len(args) > 2 && args[2] != nil && args[2] != _undefined {
  1100. length = r.toIndex(args[2])
  1101. if byteOffset+length*ta.elemSize > len(ab.data) {
  1102. panic(r.newError(r.global.RangeError, "Invalid typed array length: %d", length))
  1103. }
  1104. } else {
  1105. if len(ab.data)%ta.elemSize != 0 {
  1106. panic(r.newError(r.global.RangeError, "Byte length of %s should be a multiple of %d", newTarget.self.getStr("name", nil), ta.elemSize))
  1107. }
  1108. length = (len(ab.data) - byteOffset) / ta.elemSize
  1109. }
  1110. ta.offset = byteOffset / ta.elemSize
  1111. ta.length = length
  1112. return ta.val
  1113. }
  1114. func (r *Runtime) _newTypedArrayFromTypedArray(src *typedArrayObject, newTarget *Object) *Object {
  1115. dst := r.typedArrayCreate(newTarget, []Value{_positiveZero})
  1116. src.viewedArrayBuf.ensureNotDetached(true)
  1117. l := src.length
  1118. dst.viewedArrayBuf.prototype = r.getPrototypeFromCtor(r.toObject(src.viewedArrayBuf.getStr("constructor", nil)), r.global.ArrayBuffer, r.global.ArrayBufferPrototype)
  1119. dst.viewedArrayBuf.data = allocByteSlice(toIntStrict(int64(l) * int64(dst.elemSize)))
  1120. if src.defaultCtor == dst.defaultCtor {
  1121. copy(dst.viewedArrayBuf.data, src.viewedArrayBuf.data[src.offset*src.elemSize:])
  1122. dst.length = src.length
  1123. return dst.val
  1124. }
  1125. dst.length = l
  1126. for i := 0; i < l; i++ {
  1127. dst.typedArray.set(i, src.typedArray.get(src.offset+i))
  1128. }
  1129. return dst.val
  1130. }
  1131. func (r *Runtime) _newTypedArray(args []Value, newTarget *Object, taCtor typedArrayObjectCtor) *Object {
  1132. if newTarget == nil {
  1133. panic(r.needNew("TypedArray"))
  1134. }
  1135. if len(args) > 0 {
  1136. if obj, ok := args[0].(*Object); ok {
  1137. switch o := obj.self.(type) {
  1138. case *arrayBufferObject:
  1139. return r._newTypedArrayFromArrayBuffer(o, args, newTarget, taCtor)
  1140. case *typedArrayObject:
  1141. return r._newTypedArrayFromTypedArray(o, newTarget)
  1142. default:
  1143. return r.typedArrayFrom(newTarget, obj, nil, nil)
  1144. }
  1145. }
  1146. }
  1147. var l int
  1148. if len(args) > 0 {
  1149. if arg0 := args[0]; arg0 != nil {
  1150. l = r.toIndex(arg0)
  1151. }
  1152. }
  1153. return r.allocateTypedArray(newTarget, l, taCtor)
  1154. }
  1155. func (r *Runtime) newUint8Array(args []Value, newTarget *Object) *Object {
  1156. return r._newTypedArray(args, newTarget, r.newUint8ArrayObject)
  1157. }
  1158. func (r *Runtime) newUint8ClampedArray(args []Value, newTarget *Object) *Object {
  1159. return r._newTypedArray(args, newTarget, r.newUint8ClampedArrayObject)
  1160. }
  1161. func (r *Runtime) newInt8Array(args []Value, newTarget *Object) *Object {
  1162. return r._newTypedArray(args, newTarget, r.newInt8ArrayObject)
  1163. }
  1164. func (r *Runtime) newUint16Array(args []Value, newTarget *Object) *Object {
  1165. return r._newTypedArray(args, newTarget, r.newUint16ArrayObject)
  1166. }
  1167. func (r *Runtime) newInt16Array(args []Value, newTarget *Object) *Object {
  1168. return r._newTypedArray(args, newTarget, r.newInt16ArrayObject)
  1169. }
  1170. func (r *Runtime) newUint32Array(args []Value, newTarget *Object) *Object {
  1171. return r._newTypedArray(args, newTarget, r.newUint32ArrayObject)
  1172. }
  1173. func (r *Runtime) newInt32Array(args []Value, newTarget *Object) *Object {
  1174. return r._newTypedArray(args, newTarget, r.newInt32ArrayObject)
  1175. }
  1176. func (r *Runtime) newFloat32Array(args []Value, newTarget *Object) *Object {
  1177. return r._newTypedArray(args, newTarget, r.newFloat32ArrayObject)
  1178. }
  1179. func (r *Runtime) newFloat64Array(args []Value, newTarget *Object) *Object {
  1180. return r._newTypedArray(args, newTarget, r.newFloat64ArrayObject)
  1181. }
  1182. func (r *Runtime) createArrayBufferProto(val *Object) objectImpl {
  1183. b := newBaseObjectObj(val, r.global.ObjectPrototype, classObject)
  1184. byteLengthProp := &valueProperty{
  1185. accessor: true,
  1186. configurable: true,
  1187. getterFunc: r.newNativeFunc(r.arrayBufferProto_getByteLength, nil, "get byteLength", nil, 0),
  1188. }
  1189. b._put("byteLength", byteLengthProp)
  1190. b._putProp("constructor", r.global.ArrayBuffer, true, false, true)
  1191. b._putProp("slice", r.newNativeFunc(r.arrayBufferProto_slice, nil, "slice", nil, 2), true, false, true)
  1192. b._putSym(SymToStringTag, valueProp(asciiString("ArrayBuffer"), false, false, true))
  1193. return b
  1194. }
  1195. func (r *Runtime) createArrayBuffer(val *Object) objectImpl {
  1196. o := r.newNativeConstructOnly(val, r.builtin_newArrayBuffer, r.global.ArrayBufferPrototype, "ArrayBuffer", 1)
  1197. o._putProp("isView", r.newNativeFunc(r.arrayBuffer_isView, nil, "isView", nil, 1), true, false, true)
  1198. r.putSpeciesReturnThis(o)
  1199. return o
  1200. }
  1201. func (r *Runtime) createDataViewProto(val *Object) objectImpl {
  1202. b := newBaseObjectObj(val, r.global.ObjectPrototype, classObject)
  1203. b._put("buffer", &valueProperty{
  1204. accessor: true,
  1205. configurable: true,
  1206. getterFunc: r.newNativeFunc(r.dataViewProto_getBuffer, nil, "get buffer", nil, 0),
  1207. })
  1208. b._put("byteLength", &valueProperty{
  1209. accessor: true,
  1210. configurable: true,
  1211. getterFunc: r.newNativeFunc(r.dataViewProto_getByteLen, nil, "get byteLength", nil, 0),
  1212. })
  1213. b._put("byteOffset", &valueProperty{
  1214. accessor: true,
  1215. configurable: true,
  1216. getterFunc: r.newNativeFunc(r.dataViewProto_getByteOffset, nil, "get byteOffset", nil, 0),
  1217. })
  1218. b._putProp("constructor", r.global.DataView, true, false, true)
  1219. b._putProp("getFloat32", r.newNativeFunc(r.dataViewProto_getFloat32, nil, "getFloat32", nil, 1), true, false, true)
  1220. b._putProp("getFloat64", r.newNativeFunc(r.dataViewProto_getFloat64, nil, "getFloat64", nil, 1), true, false, true)
  1221. b._putProp("getInt8", r.newNativeFunc(r.dataViewProto_getInt8, nil, "getInt8", nil, 1), true, false, true)
  1222. b._putProp("getInt16", r.newNativeFunc(r.dataViewProto_getInt16, nil, "getInt16", nil, 1), true, false, true)
  1223. b._putProp("getInt32", r.newNativeFunc(r.dataViewProto_getInt32, nil, "getInt32", nil, 1), true, false, true)
  1224. b._putProp("getUint8", r.newNativeFunc(r.dataViewProto_getUint8, nil, "getUint8", nil, 1), true, false, true)
  1225. b._putProp("getUint16", r.newNativeFunc(r.dataViewProto_getUint16, nil, "getUint16", nil, 1), true, false, true)
  1226. b._putProp("getUint32", r.newNativeFunc(r.dataViewProto_getUint32, nil, "getUint32", nil, 1), true, false, true)
  1227. b._putProp("setFloat32", r.newNativeFunc(r.dataViewProto_setFloat32, nil, "setFloat32", nil, 2), true, false, true)
  1228. b._putProp("setFloat64", r.newNativeFunc(r.dataViewProto_setFloat64, nil, "setFloat64", nil, 2), true, false, true)
  1229. b._putProp("setInt8", r.newNativeFunc(r.dataViewProto_setInt8, nil, "setInt8", nil, 2), true, false, true)
  1230. b._putProp("setInt16", r.newNativeFunc(r.dataViewProto_setInt16, nil, "setInt16", nil, 2), true, false, true)
  1231. b._putProp("setInt32", r.newNativeFunc(r.dataViewProto_setInt32, nil, "setInt32", nil, 2), true, false, true)
  1232. b._putProp("setUint8", r.newNativeFunc(r.dataViewProto_setUint8, nil, "setUint8", nil, 2), true, false, true)
  1233. b._putProp("setUint16", r.newNativeFunc(r.dataViewProto_setUint16, nil, "setUint16", nil, 2), true, false, true)
  1234. b._putProp("setUint32", r.newNativeFunc(r.dataViewProto_setUint32, nil, "setUint32", nil, 2), true, false, true)
  1235. b._putSym(SymToStringTag, valueProp(asciiString("DataView"), false, false, true))
  1236. return b
  1237. }
  1238. func (r *Runtime) createDataView(val *Object) objectImpl {
  1239. o := r.newNativeConstructOnly(val, r.newDataView, r.global.DataViewPrototype, "DataView", 3)
  1240. return o
  1241. }
  1242. func (r *Runtime) createTypedArrayProto(val *Object) objectImpl {
  1243. b := newBaseObjectObj(val, r.global.ObjectPrototype, classObject)
  1244. b._put("buffer", &valueProperty{
  1245. accessor: true,
  1246. configurable: true,
  1247. getterFunc: r.newNativeFunc(r.typedArrayProto_getBuffer, nil, "get buffer", nil, 0),
  1248. })
  1249. b._put("byteLength", &valueProperty{
  1250. accessor: true,
  1251. configurable: true,
  1252. getterFunc: r.newNativeFunc(r.typedArrayProto_getByteLen, nil, "get byteLength", nil, 0),
  1253. })
  1254. b._put("byteOffset", &valueProperty{
  1255. accessor: true,
  1256. configurable: true,
  1257. getterFunc: r.newNativeFunc(r.typedArrayProto_getByteOffset, nil, "get byteOffset", nil, 0),
  1258. })
  1259. b._putProp("constructor", r.global.TypedArray, true, false, true)
  1260. b._putProp("copyWithin", r.newNativeFunc(r.typedArrayProto_copyWithin, nil, "copyWithin", nil, 2), true, false, true)
  1261. b._putProp("entries", r.newNativeFunc(r.typedArrayProto_entries, nil, "entries", nil, 0), true, false, true)
  1262. b._putProp("every", r.newNativeFunc(r.typedArrayProto_every, nil, "every", nil, 1), true, false, true)
  1263. b._putProp("fill", r.newNativeFunc(r.typedArrayProto_fill, nil, "fill", nil, 1), true, false, true)
  1264. b._putProp("filter", r.newNativeFunc(r.typedArrayProto_filter, nil, "filter", nil, 1), true, false, true)
  1265. b._putProp("find", r.newNativeFunc(r.typedArrayProto_find, nil, "find", nil, 1), true, false, true)
  1266. b._putProp("findIndex", r.newNativeFunc(r.typedArrayProto_findIndex, nil, "findIndex", nil, 1), true, false, true)
  1267. b._putProp("forEach", r.newNativeFunc(r.typedArrayProto_forEach, nil, "forEach", nil, 1), true, false, true)
  1268. b._putProp("includes", r.newNativeFunc(r.typedArrayProto_includes, nil, "includes", nil, 1), true, false, true)
  1269. b._putProp("indexOf", r.newNativeFunc(r.typedArrayProto_indexOf, nil, "indexOf", nil, 1), true, false, true)
  1270. b._putProp("join", r.newNativeFunc(r.typedArrayProto_join, nil, "join", nil, 1), true, false, true)
  1271. b._putProp("keys", r.newNativeFunc(r.typedArrayProto_keys, nil, "keys", nil, 0), true, false, true)
  1272. b._putProp("lastIndexOf", r.newNativeFunc(r.typedArrayProto_lastIndexOf, nil, "lastIndexOf", nil, 1), true, false, true)
  1273. b._put("length", &valueProperty{
  1274. accessor: true,
  1275. configurable: true,
  1276. getterFunc: r.newNativeFunc(r.typedArrayProto_getLength, nil, "get length", nil, 0),
  1277. })
  1278. b._putProp("map", r.newNativeFunc(r.typedArrayProto_map, nil, "map", nil, 1), true, false, true)
  1279. b._putProp("reduce", r.newNativeFunc(r.typedArrayProto_reduce, nil, "reduce", nil, 1), true, false, true)
  1280. b._putProp("reduceRight", r.newNativeFunc(r.typedArrayProto_reduceRight, nil, "reduceRight", nil, 1), true, false, true)
  1281. b._putProp("reverse", r.newNativeFunc(r.typedArrayProto_reverse, nil, "reverse", nil, 0), true, false, true)
  1282. b._putProp("set", r.newNativeFunc(r.typedArrayProto_set, nil, "set", nil, 1), true, false, true)
  1283. b._putProp("slice", r.newNativeFunc(r.typedArrayProto_slice, nil, "slice", nil, 2), true, false, true)
  1284. b._putProp("some", r.newNativeFunc(r.typedArrayProto_some, nil, "some", nil, 1), true, false, true)
  1285. b._putProp("sort", r.newNativeFunc(r.typedArrayProto_sort, nil, "sort", nil, 1), true, false, true)
  1286. b._putProp("subarray", r.newNativeFunc(r.typedArrayProto_subarray, nil, "subarray", nil, 2), true, false, true)
  1287. b._putProp("toLocaleString", r.newNativeFunc(r.typedArrayProto_toLocaleString, nil, "toLocaleString", nil, 0), true, false, true)
  1288. b._putProp("toString", r.global.arrayToString, true, false, true)
  1289. valuesFunc := r.newNativeFunc(r.typedArrayProto_values, nil, "values", nil, 0)
  1290. b._putProp("values", valuesFunc, true, false, true)
  1291. b._putSym(SymIterator, valueProp(valuesFunc, true, false, true))
  1292. b._putSym(SymToStringTag, &valueProperty{
  1293. getterFunc: r.newNativeFunc(r.typedArrayProto_toStringTag, nil, "get [Symbol.toStringTag]", nil, 0),
  1294. accessor: true,
  1295. configurable: true,
  1296. })
  1297. return b
  1298. }
  1299. func (r *Runtime) createTypedArray(val *Object) objectImpl {
  1300. o := r.newNativeConstructOnly(val, r.newTypedArray, r.global.TypedArrayPrototype, "TypedArray", 0)
  1301. o._putProp("from", r.newNativeFunc(r.typedArray_from, nil, "from", nil, 1), true, false, true)
  1302. o._putProp("of", r.newNativeFunc(r.typedArray_of, nil, "of", nil, 0), true, false, true)
  1303. r.putSpeciesReturnThis(o)
  1304. return o
  1305. }
  1306. func (r *Runtime) addPrototype(ctor *Object, proto *Object) *baseObject {
  1307. p := r.newBaseObject(proto, classObject)
  1308. p._putProp("constructor", ctor, true, false, true)
  1309. ctor.self._putProp("prototype", p.val, false, false, false)
  1310. return p
  1311. }
  1312. func (r *Runtime) typedArrayCreator(ctor func(args []Value, newTarget *Object) *Object, name unistring.String, bytesPerElement int) func(val *Object) objectImpl {
  1313. return func(val *Object) objectImpl {
  1314. o := r.newNativeConstructOnly(val, ctor, nil, name, 3)
  1315. o.prototype = r.global.TypedArray
  1316. proto := r.addPrototype(o.val, r.global.TypedArrayPrototype)
  1317. bpe := intToValue(int64(bytesPerElement))
  1318. o._putProp("BYTES_PER_ELEMENT", bpe, false, false, false)
  1319. proto._putProp("BYTES_PER_ELEMENT", bpe, false, false, false)
  1320. return o
  1321. }
  1322. }
  1323. func (r *Runtime) initTypedArrays() {
  1324. r.global.ArrayBufferPrototype = r.newLazyObject(r.createArrayBufferProto)
  1325. r.global.ArrayBuffer = r.newLazyObject(r.createArrayBuffer)
  1326. r.addToGlobal("ArrayBuffer", r.global.ArrayBuffer)
  1327. r.global.DataViewPrototype = r.newLazyObject(r.createDataViewProto)
  1328. r.global.DataView = r.newLazyObject(r.createDataView)
  1329. r.addToGlobal("DataView", r.global.DataView)
  1330. r.global.TypedArrayPrototype = r.newLazyObject(r.createTypedArrayProto)
  1331. r.global.TypedArray = r.newLazyObject(r.createTypedArray)
  1332. r.global.Uint8Array = r.newLazyObject(r.typedArrayCreator(r.newUint8Array, "Uint8Array", 1))
  1333. r.addToGlobal("Uint8Array", r.global.Uint8Array)
  1334. r.global.Uint8ClampedArray = r.newLazyObject(r.typedArrayCreator(r.newUint8ClampedArray, "Uint8ClampedArray", 1))
  1335. r.addToGlobal("Uint8ClampedArray", r.global.Uint8ClampedArray)
  1336. r.global.Int8Array = r.newLazyObject(r.typedArrayCreator(r.newInt8Array, "Int8Array", 1))
  1337. r.addToGlobal("Int8Array", r.global.Int8Array)
  1338. r.global.Uint16Array = r.newLazyObject(r.typedArrayCreator(r.newUint16Array, "Uint16Array", 2))
  1339. r.addToGlobal("Uint16Array", r.global.Uint16Array)
  1340. r.global.Int16Array = r.newLazyObject(r.typedArrayCreator(r.newInt16Array, "Int16Array", 2))
  1341. r.addToGlobal("Int16Array", r.global.Int16Array)
  1342. r.global.Uint32Array = r.newLazyObject(r.typedArrayCreator(r.newUint32Array, "Uint32Array", 4))
  1343. r.addToGlobal("Uint32Array", r.global.Uint32Array)
  1344. r.global.Int32Array = r.newLazyObject(r.typedArrayCreator(r.newInt32Array, "Int32Array", 4))
  1345. r.addToGlobal("Int32Array", r.global.Int32Array)
  1346. r.global.Float32Array = r.newLazyObject(r.typedArrayCreator(r.newFloat32Array, "Float32Array", 4))
  1347. r.addToGlobal("Float32Array", r.global.Float32Array)
  1348. r.global.Float64Array = r.newLazyObject(r.typedArrayCreator(r.newFloat64Array, "Float64Array", 8))
  1349. r.addToGlobal("Float64Array", r.global.Float64Array)
  1350. }