builtin_typedarrays.go 52 KB

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