Ну я же спрашивал не про let n = new Number(42), а про let n = 42;
Хотя примитивный тип и обертка, ведут себя во многих случаях похоже, но все время приходится помнить, что это только обертка, и с ней нельзя делать все тоже, что и с примитивным значением. например не проскочит (из вашего примера) var Man = new Number(1536); Man += 1; Попробуйте выполнить все дальнейшее. Если Вас устроит подобная обертка для BigInt, то она, оказывается существует. Нельзя сделать, по аналогии с Number, new BigInt(x) Но можно Object(BigInt(x)) |
Теперь работает всё как и планировалось!
Цитата:
Цитата:
<html> <head> <script> const X64_getters = { RAX :function() { var n = this[0]; n = new Object(BigInt((n & 0xFFFFFFFFFFFFFFFFn) | (this.EXPAND_SIGN && (n & 0x8000000000000000n) ? 0xFFFFFFFFFFFFFFFF0000000000000000n : 0n))); n.WIDTH = 16; this.EXPAND_SIGN = false; return n; }, EAX :function() { var n = this[0]; n = new Object(BigInt((n & 0xFFFFFFFFn) | (this.EXPAND_SIGN && (n & 0x80000000n) ? 0xFFFFFFFF00000000n : 0n))); n.WIDTH = 8; this.EXPAND_SIGN = false; return n; }, AX :function() { var n = this[0]; n = new Object(BigInt((n & 0xFFFFn) | (this.EXPAND_SIGN && (n & 0x8000n) ? 0xFFFFFFFFFFFF0000n : 0n))); n.WIDTH = 4; this.EXPAND_SIGN = false; return n; }, AL :function() { var n = this[0]; n = new Object(BigInt((n & 0xFFn) | (this.EXPAND_SIGN && (n & 0x80n) ? 0xFFFFFFFFFFFFFF00n : 0n))); n.WIDTH = 2; this.EXPAND_SIGN = false; return n; }, AH :function() { var n = this[0] >> 8n; n = new Object(BigInt((n & 0xFFn) | (this.EXPAND_SIGN && (n & 0x80n) ? 0xFFFFFFFFFFFFFF00n : 0n))); n.WIDTH = 2; this.EXPAND_SIGN = false; return n; }, RBX :function() { var n = this[3]; n = new Object(BigInt((n & 0xFFFFFFFFFFFFFFFFn) | (this.EXPAND_SIGN && (n & 0x8000000000000000n) ? 0xFFFFFFFFFFFFFFFF0000000000000000n : 0n))); n.WIDTH = 16; this.EXPAND_SIGN = false; return n; }, EBX :function() { var n = this[3]; n = new Object(BigInt((n & 0xFFFFFFFFn) | (this.EXPAND_SIGN && (n & 0x80000000n) ? 0xFFFFFFFF00000000n : 0n))); n.WIDTH = 8; this.EXPAND_SIGN = false; return n; }, BX :function() { var n = this[3]; n = new Object(BigInt((n & 0xFFFFn) | (this.EXPAND_SIGN && (n & 0x8000n) ? 0xFFFFFFFFFFFF0000n : 0n))); n.WIDTH = 4; this.EXPAND_SIGN = false; return n; }, BL :function() { var n = this[3]; n = new Object(BigInt((n & 0xFFn) | (this.EXPAND_SIGN && (n & 0x80n) ? 0xFFFFFFFFFFFFFF00n : 0n))); n.WIDTH = 2; this.EXPAND_SIGN = false; return n; }, BH :function() { var n = this[3] >> 8n; n = new Object(BigInt((n & 0xFFn) | (this.EXPAND_SIGN && (n & 0x80n) ? 0xFFFFFFFFFFFFFF00n : 0n))); n.WIDTH = 2; this.EXPAND_SIGN = false; return n; }, RCX :function() { var n = this[1]; n = new Object(BigInt((n & 0xFFFFFFFFFFFFFFFFn) | (this.EXPAND_SIGN && (n & 0x8000000000000000n) ? 0xFFFFFFFFFFFFFFFF0000000000000000n : 0n))); n.WIDTH = 16; this.EXPAND_SIGN = false; return n; }, ECX :function() { var n = this[1]; n = new Object(BigInt((n & 0xFFFFFFFFn) | (this.EXPAND_SIGN && (n & 0x80000000n) ? 0xFFFFFFFF00000000n : 0n))); n.WIDTH = 8; this.EXPAND_SIGN = false; return n; }, CX :function() { var n = this[1]; n = new Object(BigInt((n & 0xFFFFn) | (this.EXPAND_SIGN && (n & 0x8000n) ? 0xFFFFFFFFFFFF0000n : 0n))); n.WIDTH = 4; this.EXPAND_SIGN = false; return n; }, CL :function() { var n = this[1]; n = new Object(BigInt((n & 0xFFn) | (this.EXPAND_SIGN && (n & 0x80n) ? 0xFFFFFFFFFFFFFF00n : 0n))); n.WIDTH = 2; this.EXPAND_SIGN = false; return n; }, CH :function() { var n = this[1] >> 8n; n = new Object(BigInt((n & 0xFFn) | (this.EXPAND_SIGN && (n & 0x80n) ? 0xFFFFFFFFFFFFFF00n : 0n))); n.WIDTH = 2; this.EXPAND_SIGN = false; return n; }, RDX :function() { var n = this[2]; n = new Object(BigInt((n & 0xFFFFFFFFFFFFFFFFn) | (this.EXPAND_SIGN && (n & 0x8000000000000000n) ? 0xFFFFFFFFFFFFFFFF0000000000000000n : 0n))); n.WIDTH = 16; this.EXPAND_SIGN = false; return n; }, EDX :function() { var n = this[2]; n = new Object(BigInt((n & 0xFFFFFFFFn) | (this.EXPAND_SIGN && (n & 0x80000000n) ? 0xFFFFFFFF00000000n : 0n))); n.WIDTH = 8; this.EXPAND_SIGN = false; return n; }, DX :function() { var n = this[2]; n = new Object(BigInt((n & 0xFFFFn) | (this.EXPAND_SIGN && (n & 0x8000n) ? 0xFFFFFFFFFFFF0000n : 0n))); n.WIDTH = 4; this.EXPAND_SIGN = false; return n; }, DL :function() { var n = this[2]; n = new Object(BigInt((n & 0xFFn) | (this.EXPAND_SIGN && (n & 0x80n) ? 0xFFFFFFFFFFFFFF00n : 0n))); n.WIDTH = 2; this.EXPAND_SIGN = false; return n; }, DH :function() { var n = this[2] >> 8n; n = new Object(BigInt((n & 0xFFn) | (this.EXPAND_SIGN && (n & 0x80n) ? 0xFFFFFFFFFFFFFF00n : 0n))); n.WIDTH = 2; this.EXPAND_SIGN = false; return n; }, SIGNED :function() { this.EXPAND_SIGN = true; return this; } }; for(var fn in X64_getters) BigUint64Array.prototype.__defineGetter__(fn, X64_getters[fn]); var X64 = new BigUint64Array(16); X64[0] = 0xABCDEF0123456789n; X64[1] = 0x7654321089ABCDEFn; X64[2] = 0xF7E6D5C4B3A29180n; X64[3] = 0xF0E1D2C3B4A59687n; function main() { var Widths = { RAX :16, EAX :8, AX :4, AH :2, AL :2, RCX :16, ECX :8, CX :4, CH :2, CL :2, RDX :16, EDX :8, DX :4, DH :2, DL :2, RDX :16, EDX :8, DX :4, DH :2, DL :2 }; var hTable = document.getElementsByTagName("table")[0]; var hCells; var row, cell, regId, reg, sreg, width, content, flag, x64; for(row = 0; row < hTable.rows.length; ++ row) { hCells = hTable.rows[row].cells; for(cell = 0; cell < hCells.length; ++ cell) { hCells[cell].style.width = "100%"; hCells[cell].style.textAlign = "center"; if("reg" in hCells[cell].dataset) { regId = hCells[cell].dataset.reg.toUpperCase(); if(regId in X64) { reg = X64[regId]; sreg = X64.SIGNED[regId]; width = reg.WIDTH; flag = isFinite(width); if(!flag) width = regId in Widths ? Widths[regId] : 16; content = []; content.push("0".repeat(32) + reg.toString(16)); content.push("0".repeat(32) + sreg.toString(16)); hCells[cell].textContent = regId + ":" + (content[0].substr(-width * 2) + "/" + content[1].substr(-width * 2)).toUpperCase() + (flag ? "" : " !!!"); } else hCells[cell].textContent = "???"; } } } } </script> </head> <body onload='main()'> <table style=white-space:pre> <tr><td colspan=8 data-reg=RAX></td></tr> <tr><td colspan=4>---</td><td colspan=4 data-reg=EAX></td></tr> <tr><td colspan=6>---</td><td colspan=2 data-reg=AX></td></tr> <tr><td colspan=6>---</td><td data-reg=AH></td><td data-reg=AL></td></tr> <tr><td colspan=8 data-reg=RCX></td></tr> <tr><td colspan=4>---</td><td colspan=4 data-reg=ECX></td></tr> <tr><td colspan=6>---</td><td colspan=2 data-reg=CX></td></tr> <tr><td colspan=6>---</td><td data-reg=CH></td><td data-reg=CL></td></tr> <tr><td colspan=8 data-reg=RDX></td></tr> <tr><td colspan=4>---</td><td colspan=4 data-reg=EDX></td></tr> <tr><td colspan=6>---</td><td colspan=2 data-reg=DX></td></tr> <tr><td colspan=6>---</td><td data-reg=DH></td><td data-reg=DL></td></tr> <tr><td colspan=8 data-reg=RBX></td></tr> <tr><td colspan=4>---</td><td colspan=4 data-reg=EBX></td></tr> <tr><td colspan=6>---</td><td colspan=2 data-reg=BX></td></tr> <tr><td colspan=6>---</td><td data-reg=BH></td><td data-reg=BL></td></tr> </table> </body>Спасибо!:t hanks: P.S.: Правда, напрягает громоздкость и рутинность описания всех методов таким образом… Но, я сам выбрал такой путь…:haha: |
Если добавить
BigUint64Array.prototype._retval = function (n, w) { let v = Object(BigInt(n)); v.WIDTH = w; this.EXPAND_SIGN = false; return v; } То можно подсократить код RAX :function() { var n = this[0]; n = (n & 0xFFFFFFFFFFFFFFFFn) | (this.EXPAND_SIGN && (n & 0x8000000000000000n) ? 0xFFFFFFFFFFFFFFFF0000000000000000n : 0n); return this._retval(n, 16); }, |
Цитата:
С одной стороны - мой код и гроша не стоит, да и писал для себя. Но с другой - это же не очень хорошая практика плодить сущности!:no: |
Цитата:
Цитата:
Хорошей практикой было бы вообще не курочить прототипы встроенных объектов (это, кстати сказывается на производительности), а создать класс - наследник от BigUint64Array и все новые методы, геттеры и сеттеры определять в нем. |
Цитата:
Этот код и так из соседнего проекта (титул так и остался) с кучей рудиментов, а тот код - из другого проекта, так как лень парсер листинга с нуля писать. В итоге - я уже с трудом разбираюсь. Боюсь поломать.:p Цитата:
Соответственно, и парсер, и симулятор - всё в классы завернуть можно (и нужно)! Как только руки дойдут.:victory: |
Часовой пояс GMT +3, время: 07:56. |