wardite 0.4.3 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/wardite/alu_i32.generated.rb +27 -13
- data/lib/wardite/alu_i64.generated.rb +27 -13
- data/lib/wardite/errors.rb +9 -0
- data/lib/wardite/version.rb +1 -1
- data/lib/wardite.rb +2 -0
- data/scripts/gen_alu.rb +27 -13
- data/sig/generated/wardite/errors.rbs +12 -0
- metadata +4 -2
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: e3ca81e45a3da7f90566d465d5248bcac03981953e97c81681de900851348407
         | 
| 4 | 
            +
              data.tar.gz: 2b0952f92a92bce4d54283868fd2565b9dbaa178cc1187b2a7f6feca6225fe57
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 8a4db779ed117465fb2c981c0b9da39dcdd001e60abf00262d04353449b5b72ad433949d6c640458fe2b61b503e84180dbf3c7709d791b48f7ed2a5ad9dbe372
         | 
| 7 | 
            +
              data.tar.gz: 7d00f04205f6ef10b21dee7067adf1f480a529cea4bf0caa404fd888547f101f3908f54863262333e2b363d2d17b28b4899ff12ddc5e226958eda975354fd954
         | 
| @@ -311,7 +311,7 @@ module Wardite | |
| 311 311 | 
             
                    digits = target.memsize
         | 
| 312 312 | 
             
                    count = 0
         | 
| 313 313 | 
             
                    digits.times do |i|
         | 
| 314 | 
            -
                      if (target.value & (1 << i)). | 
| 314 | 
            +
                      if (target.value & (1 << i)).nonzero?
         | 
| 315 315 | 
             
                        count += 1
         | 
| 316 316 | 
             
                      end
         | 
| 317 317 | 
             
                    end
         | 
| @@ -347,7 +347,13 @@ module Wardite | |
| 347 347 | 
             
                    if !right.is_a?(I32) || !left.is_a?(I32)
         | 
| 348 348 | 
             
                      raise EvalError, "maybe empty or invalid stack"
         | 
| 349 349 | 
             
                    end
         | 
| 350 | 
            -
                     | 
| 350 | 
            +
                    result = left.value_s / right.value_s.to_f
         | 
| 351 | 
            +
                    iresult = (result >= 0 ? result.floor : result.ceil).to_i
         | 
| 352 | 
            +
                    if iresult >= (1 << (left.memsize - 1))
         | 
| 353 | 
            +
                      raise IntegerOverflow, "integer overflow"
         | 
| 354 | 
            +
                    end
         | 
| 355 | 
            +
                  
         | 
| 356 | 
            +
                    runtime.stack.push(I32(iresult))
         | 
| 351 357 |  | 
| 352 358 |  | 
| 353 359 | 
             
                  when :i32_div_u
         | 
| @@ -363,7 +369,13 @@ module Wardite | |
| 363 369 | 
             
                    if !right.is_a?(I32) || !left.is_a?(I32)
         | 
| 364 370 | 
             
                      raise EvalError, "maybe empty or invalid stack"
         | 
| 365 371 | 
             
                    end
         | 
| 366 | 
            -
                     | 
| 372 | 
            +
                    result = left.value_s % right.value_s
         | 
| 373 | 
            +
                    if result > 0 && left.value_s < 0
         | 
| 374 | 
            +
                      result = result - right.value_s
         | 
| 375 | 
            +
                    elsif result < 0 && left.value_s > 0
         | 
| 376 | 
            +
                      result = result - right.value_s
         | 
| 377 | 
            +
                    end
         | 
| 378 | 
            +
                    runtime.stack.push(I32(result))
         | 
| 367 379 |  | 
| 368 380 |  | 
| 369 381 | 
             
                  when :i32_rem_u
         | 
| @@ -403,8 +415,8 @@ module Wardite | |
| 403 415 | 
             
                    if !right.is_a?(I32) || !left.is_a?(I32)
         | 
| 404 416 | 
             
                      raise EvalError, "maybe empty or invalid stack"
         | 
| 405 417 | 
             
                    end
         | 
| 406 | 
            -
                    value = left.value << right.value
         | 
| 407 | 
            -
                    value %=  | 
| 418 | 
            +
                    value = left.value << (right.value % right.memsize)
         | 
| 419 | 
            +
                    value %= 1 << right.memsize
         | 
| 408 420 |  | 
| 409 421 | 
             
                    runtime.stack.push(I32(value))
         | 
| 410 422 |  | 
| @@ -414,7 +426,7 @@ module Wardite | |
| 414 426 | 
             
                    if !right.is_a?(I32) || !left.is_a?(I32)
         | 
| 415 427 | 
             
                      raise EvalError, "maybe empty or invalid stack"
         | 
| 416 428 | 
             
                    end
         | 
| 417 | 
            -
                    value = left.value_s >> right.value
         | 
| 429 | 
            +
                    value = left.value_s >> (right.value % right.memsize)
         | 
| 418 430 | 
             
                    runtime.stack.push(I32(value))
         | 
| 419 431 |  | 
| 420 432 |  | 
| @@ -423,7 +435,7 @@ module Wardite | |
| 423 435 | 
             
                    if !right.is_a?(I32) || !left.is_a?(I32)
         | 
| 424 436 | 
             
                      raise EvalError, "maybe empty or invalid stack"
         | 
| 425 437 | 
             
                    end
         | 
| 426 | 
            -
                    value = left.value >> right.value
         | 
| 438 | 
            +
                    value = left.value >> (right.value % right.memsize)
         | 
| 427 439 | 
             
                    runtime.stack.push(I32(value))
         | 
| 428 440 |  | 
| 429 441 |  | 
| @@ -432,9 +444,10 @@ module Wardite | |
| 432 444 | 
             
                    if !right.is_a?(I32) || !left.is_a?(I32)
         | 
| 433 445 | 
             
                      raise EvalError, "maybe empty or invalid stack"
         | 
| 434 446 | 
             
                    end
         | 
| 435 | 
            -
                     | 
| 436 | 
            -
                     | 
| 437 | 
            -
                     | 
| 447 | 
            +
                    k = (right.value % right.memsize)
         | 
| 448 | 
            +
                    rotated = left.value << k
         | 
| 449 | 
            +
                    rest = left.value & (I32::I32_MAX << (right.memsize - k))
         | 
| 450 | 
            +
                    value = rotated | (rest >> (right.memsize - k))
         | 
| 438 451 | 
             
                    runtime.stack.push(I32(value))
         | 
| 439 452 |  | 
| 440 453 |  | 
| @@ -443,9 +456,10 @@ module Wardite | |
| 443 456 | 
             
                    if !right.is_a?(I32) || !left.is_a?(I32)
         | 
| 444 457 | 
             
                      raise EvalError, "maybe empty or invalid stack"
         | 
| 445 458 | 
             
                    end
         | 
| 446 | 
            -
                     | 
| 447 | 
            -
                     | 
| 448 | 
            -
                     | 
| 459 | 
            +
                    k = (right.value % right.memsize)
         | 
| 460 | 
            +
                    rotated = left.value >> k
         | 
| 461 | 
            +
                    rest = left.value & (I32::I32_MAX >> (right.memsize - k))
         | 
| 462 | 
            +
                    value = rotated | (rest << (right.memsize - k))
         | 
| 449 463 | 
             
                    runtime.stack.push(I32(value))
         | 
| 450 464 |  | 
| 451 465 |  | 
| @@ -368,7 +368,7 @@ module Wardite | |
| 368 368 | 
             
                    digits = target.memsize
         | 
| 369 369 | 
             
                    count = 0
         | 
| 370 370 | 
             
                    digits.times do |i|
         | 
| 371 | 
            -
                      if (target.value & (1 << i)). | 
| 371 | 
            +
                      if (target.value & (1 << i)).nonzero?
         | 
| 372 372 | 
             
                        count += 1
         | 
| 373 373 | 
             
                      end
         | 
| 374 374 | 
             
                    end
         | 
| @@ -404,7 +404,13 @@ module Wardite | |
| 404 404 | 
             
                    if !right.is_a?(I64) || !left.is_a?(I64)
         | 
| 405 405 | 
             
                      raise EvalError, "maybe empty or invalid stack"
         | 
| 406 406 | 
             
                    end
         | 
| 407 | 
            -
                     | 
| 407 | 
            +
                    result = left.value_s / right.value_s.to_f
         | 
| 408 | 
            +
                    iresult = (result >= 0 ? result.floor : result.ceil).to_i
         | 
| 409 | 
            +
                    if iresult >= (1 << (left.memsize - 1))
         | 
| 410 | 
            +
                      raise IntegerOverflow, "integer overflow"
         | 
| 411 | 
            +
                    end
         | 
| 412 | 
            +
                  
         | 
| 413 | 
            +
                    runtime.stack.push(I64(iresult))
         | 
| 408 414 |  | 
| 409 415 |  | 
| 410 416 | 
             
                  when :i64_div_u
         | 
| @@ -420,7 +426,13 @@ module Wardite | |
| 420 426 | 
             
                    if !right.is_a?(I64) || !left.is_a?(I64)
         | 
| 421 427 | 
             
                      raise EvalError, "maybe empty or invalid stack"
         | 
| 422 428 | 
             
                    end
         | 
| 423 | 
            -
                     | 
| 429 | 
            +
                    result = left.value_s % right.value_s
         | 
| 430 | 
            +
                    if result > 0 && left.value_s < 0
         | 
| 431 | 
            +
                      result = result - right.value_s
         | 
| 432 | 
            +
                    elsif result < 0 && left.value_s > 0
         | 
| 433 | 
            +
                      result = result - right.value_s
         | 
| 434 | 
            +
                    end
         | 
| 435 | 
            +
                    runtime.stack.push(I64(result))
         | 
| 424 436 |  | 
| 425 437 |  | 
| 426 438 | 
             
                  when :i64_rem_u
         | 
| @@ -460,8 +472,8 @@ module Wardite | |
| 460 472 | 
             
                    if !right.is_a?(I64) || !left.is_a?(I64)
         | 
| 461 473 | 
             
                      raise EvalError, "maybe empty or invalid stack"
         | 
| 462 474 | 
             
                    end
         | 
| 463 | 
            -
                    value = left.value << right.value
         | 
| 464 | 
            -
                    value %=  | 
| 475 | 
            +
                    value = left.value << (right.value % right.memsize)
         | 
| 476 | 
            +
                    value %= 1 << right.memsize
         | 
| 465 477 |  | 
| 466 478 | 
             
                    runtime.stack.push(I64(value))
         | 
| 467 479 |  | 
| @@ -471,7 +483,7 @@ module Wardite | |
| 471 483 | 
             
                    if !right.is_a?(I64) || !left.is_a?(I64)
         | 
| 472 484 | 
             
                      raise EvalError, "maybe empty or invalid stack"
         | 
| 473 485 | 
             
                    end
         | 
| 474 | 
            -
                    value = left.value_s >> right.value
         | 
| 486 | 
            +
                    value = left.value_s >> (right.value % right.memsize)
         | 
| 475 487 | 
             
                    runtime.stack.push(I64(value))
         | 
| 476 488 |  | 
| 477 489 |  | 
| @@ -480,7 +492,7 @@ module Wardite | |
| 480 492 | 
             
                    if !right.is_a?(I64) || !left.is_a?(I64)
         | 
| 481 493 | 
             
                      raise EvalError, "maybe empty or invalid stack"
         | 
| 482 494 | 
             
                    end
         | 
| 483 | 
            -
                    value = left.value >> right.value
         | 
| 495 | 
            +
                    value = left.value >> (right.value % right.memsize)
         | 
| 484 496 | 
             
                    runtime.stack.push(I64(value))
         | 
| 485 497 |  | 
| 486 498 |  | 
| @@ -489,9 +501,10 @@ module Wardite | |
| 489 501 | 
             
                    if !right.is_a?(I64) || !left.is_a?(I64)
         | 
| 490 502 | 
             
                      raise EvalError, "maybe empty or invalid stack"
         | 
| 491 503 | 
             
                    end
         | 
| 492 | 
            -
                     | 
| 493 | 
            -
                     | 
| 494 | 
            -
                     | 
| 504 | 
            +
                    k = (right.value % right.memsize)
         | 
| 505 | 
            +
                    rotated = left.value << k
         | 
| 506 | 
            +
                    rest = left.value & (I64::I64_MAX << (right.memsize - k))
         | 
| 507 | 
            +
                    value = rotated | (rest >> (right.memsize - k))
         | 
| 495 508 | 
             
                    runtime.stack.push(I64(value))
         | 
| 496 509 |  | 
| 497 510 |  | 
| @@ -500,9 +513,10 @@ module Wardite | |
| 500 513 | 
             
                    if !right.is_a?(I64) || !left.is_a?(I64)
         | 
| 501 514 | 
             
                      raise EvalError, "maybe empty or invalid stack"
         | 
| 502 515 | 
             
                    end
         | 
| 503 | 
            -
                     | 
| 504 | 
            -
                     | 
| 505 | 
            -
                     | 
| 516 | 
            +
                    k = (right.value % right.memsize)
         | 
| 517 | 
            +
                    rotated = left.value >> k
         | 
| 518 | 
            +
                    rest = left.value & (I64::I64_MAX >> (right.memsize - k))
         | 
| 519 | 
            +
                    value = rotated | (rest << (right.memsize - k))
         | 
| 506 520 | 
             
                    runtime.stack.push(I64(value))
         | 
| 507 521 |  | 
| 508 522 |  | 
    
        data/lib/wardite/version.rb
    CHANGED
    
    
    
        data/lib/wardite.rb
    CHANGED
    
    | @@ -7,6 +7,7 @@ require_relative "wardite/const" | |
| 7 7 | 
             
            require_relative "wardite/instruction"
         | 
| 8 8 | 
             
            require_relative "wardite/value"
         | 
| 9 9 | 
             
            require_relative "wardite/load"
         | 
| 10 | 
            +
            require_relative "wardite/errors"
         | 
| 10 11 |  | 
| 11 12 | 
             
            module Wardite
         | 
| 12 13 | 
             
              module Evaluator
         | 
| @@ -1119,6 +1120,7 @@ module Wardite | |
| 1119 1120 | 
             
                  end
         | 
| 1120 1121 |  | 
| 1121 1122 | 
             
                  @data += String.new("\0" * (delta * 64 * 1024))
         | 
| 1123 | 
            +
                  self.current = newsize
         | 
| 1122 1124 | 
             
                  prev
         | 
| 1123 1125 | 
             
                end
         | 
| 1124 1126 |  | 
    
        data/scripts/gen_alu.rb
    CHANGED
    
    | @@ -480,7 +480,7 @@ module GenAlu | |
| 480 480 | 
             
                    digits = target.memsize
         | 
| 481 481 | 
             
                    count = 0
         | 
| 482 482 | 
             
                    digits.times do |i|
         | 
| 483 | 
            -
                      if (target.value & (1 << i)). | 
| 483 | 
            +
                      if (target.value & (1 << i)).nonzero?
         | 
| 484 484 | 
             
                        count += 1
         | 
| 485 485 | 
             
                      end
         | 
| 486 486 | 
             
                    end
         | 
| @@ -520,7 +520,13 @@ module GenAlu | |
| 520 520 | 
             
                    if !right.is_a?(${CLASS}) || !left.is_a?(${CLASS})
         | 
| 521 521 | 
             
                      raise EvalError, "maybe empty or invalid stack"
         | 
| 522 522 | 
             
                    end
         | 
| 523 | 
            -
                     | 
| 523 | 
            +
                    result = left.value_s / right.value_s.to_f
         | 
| 524 | 
            +
                    iresult = (result >= 0 ? result.floor : result.ceil).to_i
         | 
| 525 | 
            +
                    if iresult >= (1 << (left.memsize - 1))
         | 
| 526 | 
            +
                      raise IntegerOverflow, "integer overflow"
         | 
| 527 | 
            +
                    end
         | 
| 528 | 
            +
             | 
| 529 | 
            +
                    runtime.stack.push(${CLASS}(iresult))
         | 
| 524 530 | 
             
                RUBY
         | 
| 525 531 |  | 
| 526 532 | 
             
                div_u: <<~RUBY,
         | 
| @@ -547,7 +553,13 @@ module GenAlu | |
| 547 553 | 
             
                    if !right.is_a?(${CLASS}) || !left.is_a?(${CLASS})
         | 
| 548 554 | 
             
                      raise EvalError, "maybe empty or invalid stack"
         | 
| 549 555 | 
             
                    end
         | 
| 550 | 
            -
                     | 
| 556 | 
            +
                    result = left.value_s % right.value_s
         | 
| 557 | 
            +
                    if result > 0 && left.value_s < 0
         | 
| 558 | 
            +
                      result = result - right.value_s
         | 
| 559 | 
            +
                    elsif result < 0 && left.value_s > 0
         | 
| 560 | 
            +
                      result = result - right.value_s
         | 
| 561 | 
            +
                    end
         | 
| 562 | 
            +
                    runtime.stack.push(${CLASS}(result))
         | 
| 551 563 | 
             
                RUBY
         | 
| 552 564 |  | 
| 553 565 | 
             
                rem_u: <<~RUBY,
         | 
| @@ -592,8 +604,8 @@ module GenAlu | |
| 592 604 | 
             
                    if !right.is_a?(${CLASS}) || !left.is_a?(${CLASS})
         | 
| 593 605 | 
             
                      raise EvalError, "maybe empty or invalid stack"
         | 
| 594 606 | 
             
                    end
         | 
| 595 | 
            -
                    value = left.value << right.value
         | 
| 596 | 
            -
                    value %=  | 
| 607 | 
            +
                    value = left.value << (right.value % right.memsize)
         | 
| 608 | 
            +
                    value %= 1 << right.memsize
         | 
| 597 609 |  | 
| 598 610 | 
             
                    runtime.stack.push(${CLASS}(value))
         | 
| 599 611 | 
             
                RUBY
         | 
| @@ -604,7 +616,7 @@ module GenAlu | |
| 604 616 | 
             
                    if !right.is_a?(${CLASS}) || !left.is_a?(${CLASS})
         | 
| 605 617 | 
             
                      raise EvalError, "maybe empty or invalid stack"
         | 
| 606 618 | 
             
                    end
         | 
| 607 | 
            -
                    value = left.value_s >> right.value
         | 
| 619 | 
            +
                    value = left.value_s >> (right.value % right.memsize)
         | 
| 608 620 | 
             
                    runtime.stack.push(${CLASS}(value))
         | 
| 609 621 | 
             
                RUBY
         | 
| 610 622 |  | 
| @@ -614,7 +626,7 @@ module GenAlu | |
| 614 626 | 
             
                    if !right.is_a?(${CLASS}) || !left.is_a?(${CLASS})
         | 
| 615 627 | 
             
                      raise EvalError, "maybe empty or invalid stack"
         | 
| 616 628 | 
             
                    end
         | 
| 617 | 
            -
                    value = left.value >> right.value
         | 
| 629 | 
            +
                    value = left.value >> (right.value % right.memsize)
         | 
| 618 630 | 
             
                    runtime.stack.push(${CLASS}(value))
         | 
| 619 631 | 
             
                RUBY
         | 
| 620 632 |  | 
| @@ -624,9 +636,10 @@ module GenAlu | |
| 624 636 | 
             
                    if !right.is_a?(${CLASS}) || !left.is_a?(${CLASS})
         | 
| 625 637 | 
             
                      raise EvalError, "maybe empty or invalid stack"
         | 
| 626 638 | 
             
                    end
         | 
| 627 | 
            -
                     | 
| 628 | 
            -
                     | 
| 629 | 
            -
                     | 
| 639 | 
            +
                    k = (right.value % right.memsize)
         | 
| 640 | 
            +
                    rotated = left.value << k
         | 
| 641 | 
            +
                    rest = left.value & (${CLASS}::${CLASS}_MAX << (right.memsize - k))
         | 
| 642 | 
            +
                    value = rotated | (rest >> (right.memsize - k))
         | 
| 630 643 | 
             
                    runtime.stack.push(${CLASS}(value))
         | 
| 631 644 | 
             
                RUBY
         | 
| 632 645 |  | 
| @@ -636,9 +649,10 @@ module GenAlu | |
| 636 649 | 
             
                    if !right.is_a?(${CLASS}) || !left.is_a?(${CLASS})
         | 
| 637 650 | 
             
                      raise EvalError, "maybe empty or invalid stack"
         | 
| 638 651 | 
             
                    end
         | 
| 639 | 
            -
                     | 
| 640 | 
            -
                     | 
| 641 | 
            -
                     | 
| 652 | 
            +
                    k = (right.value % right.memsize)
         | 
| 653 | 
            +
                    rotated = left.value >> k
         | 
| 654 | 
            +
                    rest = left.value & (${CLASS}::${CLASS}_MAX >> (right.memsize - k))
         | 
| 655 | 
            +
                    value = rotated | (rest << (right.memsize - k))
         | 
| 642 656 | 
             
                    runtime.stack.push(${CLASS}(value))
         | 
| 643 657 | 
             
                RUBY
         | 
| 644 658 |  | 
| @@ -0,0 +1,12 @@ | |
| 1 | 
            +
            # Generated from lib/wardite/errors.rb with RBS::Inline
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            # frozen_string_literal: true
         | 
| 4 | 
            +
            # rbs_inline: enabled
         | 
| 5 | 
            +
            module Wardite
         | 
| 6 | 
            +
              # basic error class.
         | 
| 7 | 
            +
              class WebAssemblyError < StandardError
         | 
| 8 | 
            +
              end
         | 
| 9 | 
            +
             | 
| 10 | 
            +
              class IntegerOverflow < WebAssemblyError
         | 
| 11 | 
            +
              end
         | 
| 12 | 
            +
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: wardite
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0. | 
| 4 | 
            +
              version: 0.5.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Uchio Kondo
         | 
| 8 8 | 
             
            autorequire:
         | 
| 9 9 | 
             
            bindir: exe
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2024-11- | 
| 11 | 
            +
            date: 2024-11-24 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies: []
         | 
| 13 13 | 
             
            description: A pure-ruby webassembly runtime
         | 
| 14 14 | 
             
            email:
         | 
| @@ -49,6 +49,7 @@ files: | |
| 49 49 | 
             
            - lib/wardite/alu_i64.generated.rb
         | 
| 50 50 | 
             
            - lib/wardite/const.rb
         | 
| 51 51 | 
             
            - lib/wardite/convert.generated.rb
         | 
| 52 | 
            +
            - lib/wardite/errors.rb
         | 
| 52 53 | 
             
            - lib/wardite/instruction.rb
         | 
| 53 54 | 
             
            - lib/wardite/leb128.rb
         | 
| 54 55 | 
             
            - lib/wardite/load.rb
         | 
| @@ -66,6 +67,7 @@ files: | |
| 66 67 | 
             
            - sig/generated/wardite/alu_i64.generated.rbs
         | 
| 67 68 | 
             
            - sig/generated/wardite/const.rbs
         | 
| 68 69 | 
             
            - sig/generated/wardite/convert.generated.rbs
         | 
| 70 | 
            +
            - sig/generated/wardite/errors.rbs
         | 
| 69 71 | 
             
            - sig/generated/wardite/instruction.rbs
         | 
| 70 72 | 
             
            - sig/generated/wardite/leb128.rbs
         | 
| 71 73 | 
             
            - sig/generated/wardite/load.rbs
         |