Class: Wardite::F64
- Inherits:
-
Object
- Object
- Wardite::F64
- Includes:
- ValueHelper
- Defined in:
- lib/wardite/value.rb
Instance Attribute Summary collapse
-
#value ⇒ Object
: Float.
Class Method Summary collapse
Instance Method Summary collapse
- #convert_s(to:) ⇒ Object
- #convert_u(to:) ⇒ Object
- #demote(to:) ⇒ Object
- #extend_s(to:) ⇒ Object
- #extend_u(to:) ⇒ Object
- #inspect ⇒ Object
- #memsize ⇒ Object
- #packed(size: nil) ⇒ Object
- #promote(to:) ⇒ Object
- #reinterpret(to:) ⇒ Object
- #sign ⇒ Object
- #trunc_s(to:) ⇒ Object
- #trunc_u(to:) ⇒ Object
- #wrap(to:) ⇒ Object
Methods included from ValueHelper
Instance Attribute Details
#value ⇒ Object
: Float
487 488 489 |
# File 'lib/wardite/value.rb', line 487 def value @value end |
Class Method Details
Instance Method Details
#convert_s(to:) ⇒ Object
590 591 592 |
# File 'lib/wardite/value.rb', line 590 def convert_s(to:) raise EvalError, "unsupported operation" end |
#convert_u(to:) ⇒ Object
596 597 598 |
# File 'lib/wardite/value.rb', line 596 def convert_u(to:) raise EvalError, "unsupported operation" end |
#demote(to:) ⇒ Object
TODO:
no loss of digits…
603 604 605 606 |
# File 'lib/wardite/value.rb', line 603 def demote(to:) raise EvalError, "unsupported operation" if to != :f32 F32(value) end |
#extend_s(to:) ⇒ Object
527 528 529 |
# File 'lib/wardite/value.rb', line 527 def extend_s(to:) raise EvalError, "unsupported operation" end |
#extend_u(to:) ⇒ Object
533 534 535 |
# File 'lib/wardite/value.rb', line 533 def extend_u(to:) raise EvalError, "unsupported operation" end |
#inspect ⇒ Object
623 624 625 |
# File 'lib/wardite/value.rb', line 623 def inspect "F64(#{@value})" end |
#memsize ⇒ Object
500 501 502 |
# File 'lib/wardite/value.rb', line 500 def memsize 64 end |
#packed(size: nil) ⇒ Object
515 516 517 |
# File 'lib/wardite/value.rb', line 515 def packed(size: nil) [self.value].pack("E") end |
#promote(to:) ⇒ Object
610 611 612 |
# File 'lib/wardite/value.rb', line 610 def promote(to:) raise EvalError, "unsupported operation" end |
#reinterpret(to:) ⇒ Object
616 617 618 619 620 621 |
# File 'lib/wardite/value.rb', line 616 def reinterpret(to:) raise EvalError, "unsupported operation" if to != :i64 v = [value].pack("d").unpack("L!")[0] raise EvalError, "[BUG] String#unpack is broke, really?" if !v.is_a?(Integer) I64(v) end |
#sign ⇒ Object
505 506 507 508 509 510 511 |
# File 'lib/wardite/value.rb', line 505 def sign upper = [0.0].pack("G")[0]&.ord&.<<(7) if !upper raise "[BUG] Array#pack looks broken?" end upper.zero? ? :positive : :negative end |
#trunc_s(to:) ⇒ Object
540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 |
# File 'lib/wardite/value.rb', line 540 def trunc_s(to:) v = value.to_i case to when :i32 if v >= 0 I32(v & (I32::I32_MAX >> 1)) else v = v & I32::I32_MAX if (v >> 31).zero? raise EvalError, "[undefined behavior] detected overflow: #{value}" end I32(v) end when :i64 if v >= 0 I64(v & (I64::I64_MAX >> 1)) else v = v & I64::I64_MAX if (v >> 31).zero? raise EvalError, "[undefined behavior] detected overflow: #{value}" end I64(v) end else raise EvalError, "unsupported operation to: #{to}" end end |
#trunc_u(to:) ⇒ Object
571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 |
# File 'lib/wardite/value.rb', line 571 def trunc_u(to:) v = value.to_i if v < 0 raise EvalError, "[undefined behavior] unexpected negative value" end case to when :i32 v = v & I32::I32_MAX I32(v) when :i64 v = v & I64::I64_MAX I64(v) else raise EvalError, "unsupported operation to: #{to}" end end |
#wrap(to:) ⇒ Object
521 522 523 |
# File 'lib/wardite/value.rb', line 521 def wrap(to:) raise EvalError, "unsupported operation" end |