|
1 | | - |
| 1 | +// Notice: the reason I don't use instanceof for checking for my custom type is because it doesn't f**king work for some reason |
2 | 2 |
|
3 | 3 | (async function(Scratch) { |
4 | 4 | const {BlockType, BlockShape, ArgumentType, Cast, vm} = Scratch |
|
28 | 28 | return this.arrayBuffer |
29 | 29 | } |
30 | 30 | jwArrayHandler() { |
31 | | - return `Array Buffer<${this.arrayBuffer.byteLength}>` |
| 31 | + return `Buffer<${this.arrayBuffer.byteLength}>` |
32 | 32 | } |
33 | 33 | dogeiscutObjectHandler() { |
34 | 34 | return `Array Buffer (Length: ${this.arrayBuffer.byteLength})` |
35 | 35 | } |
36 | | - dogeiscutSetHandler() { |
37 | | - return `Buffer<${this.arrayBuffer.byteLength}>` |
38 | | - } |
| 36 | + // dogeiscutSetHandler() { |
| 37 | + // return `Buffer<${this.arrayBuffer.byteLength}>` |
| 38 | + // } |
39 | 39 | toJSON() { |
40 | 40 | return Array.from(new Uint8Array(this.arrayBuffer)) |
41 | 41 | } |
|
76 | 76 | root.appendChild(arrBufDisplay) |
77 | 77 | } |
78 | 78 | } else { |
79 | | - let nullBuffer = span(`(Null Buffer)`) |
80 | | - nullBuffer.style.color = "#888888" |
81 | | - root.appendChild(nullBuffer) |
| 79 | + let emptyBuffer = span(`(Empty Buffer)`) |
| 80 | + emptyBuffer.style.color = "#888888" |
| 81 | + root.appendChild(emptyBuffer) |
82 | 82 | } |
83 | 83 | let sizeDisplay = span(`Byte Length: ${length}`) |
84 | 84 | sizeDisplay.style.fontSize = "12px" |
|
88 | 88 | toString() { |
89 | 89 | return JSON.stringify([...(new Uint8Array(this.arrayBuffer))]); |
90 | 90 | } |
91 | | - constructor(source) { |
| 91 | + constructor(source, passthrough = true) { // Passthrough will return the source if the source is already an ArrayBufferType and passthrough is true, for optimization reasons |
| 92 | + if (source == undefined || source == null) source = 0; |
| 93 | + if (passthrough && ("customId" in source && source.customId == "agBuffer")) return source; |
92 | 94 | if (source instanceof Array) { |
93 | | - window.agBufferDebugLastType = "jsarray" |
| 95 | + // window.agBufferDebugLastType = "jsarray" |
94 | 96 | // Uint8Array conversion is necessary because ArrayBuffer constructor doesn't take normal arrays as input |
95 | 97 | this.arrayBuffer = (new Uint8Array(source)).buffer |
96 | 98 | } else if (source instanceof vm.jwArray.Type) { |
97 | | - window.agBufferDebugLastType = "jwArray" |
| 99 | + // window.agBufferDebugLastType = "jwArray" |
98 | 100 | // Same reason here |
99 | 101 | this.arrayBuffer = new Uint8Array(source.array).buffer |
100 | 102 | } else if (typeof source == "number") { |
101 | | - window.agBufferDebugLastType = "length" |
| 103 | + // window.agBufferDebugLastType = "length" |
102 | 104 | // no Uint8Array needed as the constructor can take (number) to create a blank arraybuffer of length (number) |
103 | 105 | this.arrayBuffer = new ArrayBuffer(source) |
104 | 106 | } else if (source instanceof Uint8Array || (source.buffer && source.buffer instanceof ArrayBuffer)) { |
105 | | - window.agBufferDebugLastType = "typedarray" |
| 107 | + // window.agBufferDebugLastType = "typedarray" |
106 | 108 | this.arrayBuffer = source.buffer |
107 | 109 | } else if (source instanceof ArrayBuffer) { |
108 | | - window.agBufferDebugLastType = "jsarraybuffer" |
| 110 | + // window.agBufferDebugLastType = "jsarraybuffer" |
109 | 111 | this.arrayBuffer = source |
110 | 112 |
|
111 | 113 | } else if (typeof source == "string" && (() => {try{return Array.isArray(JSON.parse(source))}catch{return false}})()) { // weird inline code to see if we can JSON.parse the string as array |
112 | | - window.agBufferDebugLastType = "json" |
| 114 | + // window.agBufferDebugLastType = "json" |
113 | 115 | this.arrayBuffer = new Uint8Array(JSON.parse(source)).buffer |
114 | 116 | } else if (typeof(source.toArrayBuffer) == "function") { |
115 | | - window.agBufferDebugLastType = "toArrayBuffer" |
| 117 | + // window.agBufferDebugLastType = "toArrayBuffer" |
116 | 118 | this.arrayBuffer = source.toArrayBuffer() |
117 | 119 | } else { |
118 | | - window.agBufferDebugLastType = "invalidBuffer" |
| 120 | + // window.agBufferDebugLastType = "invalidBuffer" |
119 | 121 | this.arrayBuffer = new ArrayBuffer(0); |
120 | 122 | } |
121 | 123 |
|
122 | 124 | // Make a dataview to access the buffer better |
123 | 125 | this.dataView = new DataView(this.arrayBuffer) |
124 | 126 | // some debug code so I can debug what the heck the problem is from the console |
125 | 127 |
|
126 | | - window.agBufferDebug = this; |
| 128 | + // window.agBufferDebug = this; |
127 | 129 | } |
128 | 130 | } |
129 | 131 | const agBuffer = { |
|
168 | 170 | v => new ArrayBufferType(new Uint8Array([...v])) |
169 | 171 | ); |
170 | 172 | vm.runtime.registerCompiledExtensionBlocks('agBuffer', this.getCompileInfo()) |
| 173 | + if (!vm.runtime.ext_jwArray) vm.extensionManager.loadExtensionIdSync('jwArray') |
171 | 174 | } |
172 | 175 | getInfo() { |
173 | 176 | return { |
|
479 | 482 | VALUE: {type:ArgumentType.BOOLEAN} |
480 | 483 | }, |
481 | 484 | }, |
482 | | - |
483 | 485 | ], |
484 | 486 | "menus":{ |
485 | 487 | DATATYPES: { |
|
554 | 556 | } |
555 | 557 | builderAppendBuffer({VALUE}, util) { |
556 | 558 | if ((VALUE == undefined || VALUE == null) && !agBuffer.disableErrorHandling) return; |
| 559 | + VALUE = new ArrayBuffer(VALUE) |
557 | 560 | let bi = util.thread._agBufferBuilderIndex ?? [] |
558 | 561 | if (bi[bi.length-1]) { |
559 | 562 | let buffer = bi[bi.length-1] |
|
573 | 576 | } |
574 | 577 | } |
575 | 578 |
|
576 | | - toArray(args) { |
| 579 | + toArray({BUFFER}) { |
577 | 580 | if (args.BUFFER == undefined && !agBuffer.disableErrorHandling) return; |
578 | | - const arrbuf = args.BUFFER; |
| 581 | + BUFFER = new ArrayBuffer(BUFFER) |
| 582 | + const arrbuf = BUFFER; |
579 | 583 |
|
580 | 584 | return vm.jwArray.Type.toArray(Array.from(new Uint8Array(arrbuf.arrayBuffer))) |
581 | 585 | } |
582 | 586 | getValue(args) { |
583 | 587 | if (args.BUFFER == undefined && !agBuffer.disableErrorHandling) return 0; |
584 | | - let buffer = args.BUFFER |
| 588 | + |
| 589 | + let buffer = new ArrayBufferType(args.BUFFER) |
| 590 | + |
585 | 591 | const type = args.TYPE |
586 | 592 | const index = args.INDEX |
587 | 593 | const endian = args.ENDIAN |
|
616 | 622 | setValue(args) { |
617 | 623 | if (args.BUFFER == undefined && !agBuffer.disableErrorHandling) return; |
618 | 624 |
|
619 | | - let buffer = args.BUFFER |
| 625 | + let buffer = new ArrayBufferType(args.BUFFER) |
620 | 626 | const type = args.TYPE |
621 | 627 | const index = args.INDEX |
622 | 628 | const endian = args.ENDIAN |
|
677 | 683 | } |
678 | 684 | getSize(args) { |
679 | 685 | if (args.BUFFER == undefined && !agBuffer.disableErrorHandling) return 0; |
| 686 | + args.BUFFER = new ArrayBufferType(args.BUFFER) |
680 | 687 | if (!args.BUFFER.customId || args.BUFFER.customId != "agBuffer") return 0; |
681 | 688 | return args.BUFFER.arrayBuffer.byteLength |
682 | 689 | } |
|
685 | 692 | } |
686 | 693 | toString(args) { |
687 | 694 | if (args.BUFFER == undefined && !agBuffer.disableErrorHandling) return ""; |
| 695 | + args.BUFFER = new ArrayBufferType(args.BUFFER) |
688 | 696 | return new TextDecoder().decode(new Uint8Array(args.BUFFER.arrayBuffer)) |
689 | 697 | } |
690 | 698 | fromBase64(args) { |
|
693 | 701 | } |
694 | 702 | toBase64(args) { |
695 | 703 | if (args.BUFFER == undefined && !agBuffer.disableErrorHandling) return ""; |
696 | | - const buffer = args.BUFFER |
| 704 | + |
| 705 | + const buffer = new ArrayBufferType(args.BUFFER) |
697 | 706 | return new Uint8Array(buffer.arrayBuffer).toBase64(); |
698 | 707 | } |
699 | 708 | async fromUrl(args) { |
|
704 | 713 | } |
705 | 714 | toDataUrl(args) { |
706 | 715 | if (args.BUFFER == undefined && !agBuffer.disableErrorHandling) return ""; |
707 | | - const buffer = args.BUFFER |
| 716 | + const buffer = new ArrayBufferType(args.BUFFER) |
708 | 717 | return ("data:application/octet-stream;base64," + new Uint8Array(buffer.arrayBuffer).toBase64()) |
709 | 718 | } |
710 | 719 | maxReporterLines(args) { |
711 | | - vm.agBuffer.maxReporterRows = args.LINES |
| 720 | + vm.agBuffer.maxReporterRows = Cast.toNumber(args.LINES) |
712 | 721 | } |
713 | 722 | itemsOf(args) { |
714 | 723 | if (args.BUFFER == undefined && !agBuffer.disableErrorHandling) return new ArrayBufferType(0); |
| 724 | + args.BUFFER = new ArrayBufferType(args.BUFFER) |
715 | 725 | return new agBuffer.Type(args.BUFFER.arrayBuffer.slice(args.MIN, args.MAX)) |
716 | 726 | } |
717 | 727 | writeSubBuffer(args) { |
718 | | - if (args.BUFFER == undefined) return; |
719 | | - if (args.SUBBUFFER == undefined) return; |
| 728 | + if (args.BUFFER == undefined && !agBuffer.disableErrorHandling) return; |
| 729 | + if (args.SUBBUFFER == undefined && !agBuffer.disableErrorHandling) return; |
| 730 | + args.BUFFER = new ArrayBufferType(args.BUFFER) |
| 731 | + args.SUBBUFFER = new ArrayBufferType(args.SUBBUFFER) |
720 | 732 | let buffer = args.BUFFER |
721 | 733 | let subbuffer = args.SUBBUFFER |
722 | 734 | let startindex = args.INDEX |
|
727 | 739 | } |
728 | 740 | writeAutoType(args) { |
729 | 741 | if (args.BUFFER == undefined && !agBuffer.disableErrorHandling) return 0; |
730 | | - let buffer = args.BUFFER |
| 742 | + let buffer = new ArrayBufferType(args.BUFFER) |
731 | 743 | let value = args.VALUE |
732 | 744 | let index = args.INDEX |
733 | 745 | let endian = args.ENDIAN |
|
738 | 750 | } |
739 | 751 | resize(args) { |
740 | 752 | if (args.BUFFER == undefined && !agBuffer.disableErrorHandling) return new ArrayBufferType(args.SIZE); |
741 | | - let buffer = args.BUFFER |
742 | | - let newSize = args.SIZE |
| 753 | + let buffer = new ArrayBufferType(args.BUFFER) |
| 754 | + let newSize = Cast.toNumber(args.SIZE) |
743 | 755 | return new agBuffer.Type(buffer.arrayBuffer.transfer(newSize)) |
744 | 756 | } |
745 | 757 | copy(args) { |
746 | 758 | if (args.BUFFER == undefined && !agBuffer.disableErrorHandling) return new ArrayBufferType(0); |
| 759 | + args.BUFFER = new ArrayBufferType(args.BUFFER) |
747 | 760 | return new ArrayBufferType(args.BUFFER.arrayBuffer.transfer()) |
748 | 761 | } |
749 | 762 | reverse(args) { |
750 | | - let buffer = args.BUFFER |
| 763 | + let buffer = new ArrayBufferType(args.BUFFER) |
751 | 764 | buffer.arrayBuffer = new Uint8Array(buffer.arrayBuffer).reverse().buffer |
752 | 765 | buffer.dataView = new DataView(buffer.arrayBuffer) |
753 | 766 | } |
754 | 767 | reverseR(args) { |
755 | 768 | if (args.BUFFER == undefined && !agBuffer.disableErrorHandling) return new ArrayBufferType(0); |
756 | | - let buffer = args.BUFFER |
| 769 | + let buffer = new ArrayBufferType(args.BUFFER) |
757 | 770 | return new ArrayBufferType(new Uint8Array(buffer.arrayBuffer).reverse()) |
758 | 771 | } |
759 | 772 | stringify(args) { |
760 | 773 | if (args.BUFFER == undefined && !agBuffer.disableErrorHandling) return ""; |
761 | | - let buffer = args.BUFFER |
| 774 | + let buffer = new ArrayBufferType(args.BUFFER) |
762 | 775 | let mode = args.MODE |
763 | 776 | switch (mode) { |
764 | 777 | case "array": |
|
772 | 785 | } |
773 | 786 | } |
774 | 787 | errorHandling(args) { |
775 | | - agBuffer.disableErrorHandling = args.VALUE |
| 788 | + agBuffer.disableErrorHandling = Cast.toBoolean(args.VALUE) |
776 | 789 | } |
777 | 790 | forEachV({}, util) { |
778 | 791 | const pair = util.thread.stackFrames[0].agBuffer; |
|
781 | 794 |
|
782 | 795 | forEach({BUFFER}, util) { |
783 | 796 | if (BUFFER == undefined && !agBuffer.disableErrorHandling) return; |
| 797 | + BUFFER = new ArrayBufferType(BUFFER) |
784 | 798 | if (util.stackFrame.execute) { |
785 | 799 | const { entries, pointer } = util.stackFrame; |
786 | 800 | util.stackFrame.pointer++; |
|
799 | 813 | } |
800 | 814 |
|
801 | 815 | } |
802 | | - (async () => { |
803 | | - if (!vm.runtime.ext_jwArray) vm.extensionManager.loadExtensionIdSync('jwArray') |
804 | | - vm.runtime.requestBlocksUpdate() |
805 | | - vm.runtime.requestToolboxExtensionsUpdate() |
806 | | - vm.emitWorkspaceUpdate() |
807 | | - })() |
| 816 | + |
808 | 817 | vm.agBuffer = agBuffer |
809 | 818 | let extension = new Extension(); |
810 | 819 | Scratch.extensions.register(extension); |
|
0 commit comments