Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add a WAT test for interfacing JS via WASM #594

Closed
certik opened this issue Aug 15, 2022 · 0 comments · Fixed by #588
Closed

Add a WAT test for interfacing JS via WASM #594

certik opened this issue Aug 15, 2022 · 0 comments · Fixed by #588

Comments

@certik
Copy link
Contributor

certik commented Aug 15, 2022

Original issue: https://gitlab.com/lfortran/lfortran/-/issues/771

I would do the following:

$ lfortran --show-wat a.f90 
warning: Function with no body
  --> a.f90:73:9 - 76:23
   |
73 |            subroutine show_img(n, m, A) bind(c)
   |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
...
   |
76 |            end subroutine
   | ...^^^^^^^^^^^^^^^^^^^^^^^ show_img

warning: WASM: Calls to C subroutine are not yet supported
  --> a.f90:73:9 - 76:23
   |
73 |            subroutine show_img(n, m, A) bind(c)
   |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
...
   |
76 |            end subroutine
   | ...^^^^^^^^^^^^^^^^^^^^^^^ Function: calls show_img


Note: if any of the above error or warning messages are not clear or are lacking
context please report it to us (we consider that a bug that needs to be fixed).
(module
    (type (;0;) (func (param i32) (result)))
    (type (;1;) (func (param i64) (result)))
    (type (;2;) (func (param f32) (result)))
    (type (;3;) (func (param f64) (result)))
    (type (;4;) (func (param i32 i32) (result)))
    (type (;5;) (func (param) (result)))
    (type (;6;) (func (param i32) (result)))
    (import "js" "print_i32" (func (;0;) (type 0)))
    (import "js" "print_i64" (func (;1;) (type 1)))
    (import "js" "print_f32" (func (;2;) (type 2)))
    (import "js" "print_f64" (func (;3;) (type 3)))
    (import "js" "print_str" (func (;4;) (type 4)))
    (import "js" "flush_buf" (func (;5;) (type 5)))
    (import "js" "set_exit_code" (func (;6;) (type 6)))
    (import "js" "memory" (memory (;0;) 100 100))
)

where a.f90 is the code from the current dev.lfortran.org:

program mandelbrot
    implicit none
    integer  , parameter :: rk       = 8
    integer  , parameter :: i_max    =  600
    integer  , parameter :: j_max    =  450
    integer  , parameter :: n_max    =  100
    real (rk), parameter :: x_centre = -0.5_rk
    real (rk), parameter :: y_centre =  0.0_rk
    real (rk), parameter :: width    =  4.0_rk
    real (rk), parameter :: height   =  3.0_rk
    real (rk), parameter :: dx_di    =   width / i_max
    real (rk), parameter :: dy_dj    = -height / j_max
    real (rk), parameter :: x_offset = x_centre - 0.5_rk * (i_max + 1) * dx_di
    real (rk), parameter :: y_offset = y_centre - 0.5_rk * (j_max + 1) * dy_dj
    integer :: image(i_max, j_max)
    integer :: image_t(j_max, i_max)
    integer   :: i
    integer   :: j
    integer   :: n
    real (rk) :: x
    real (rk) :: y
    real (rk) :: x_0
    real (rk) :: y_0
    real (rk) :: x_sqr
    real (rk) :: y_sqr

    do j = 1, j_max
    y_0 = y_offset + dy_dj * j
    do i = 1, i_max
        x_0 = x_offset + dx_di * i
        x = 0.0_rk
        y = 0.0_rk
        n = 0
        do
        x_sqr = x ** 2
        y_sqr = y ** 2
        if (x_sqr + y_sqr > 4.0_rk) then
            image(i,j) = 255
            exit
        end if
        if (n == n_max) then
            image(i,j) = 0
            exit
        end if
        y = y_0 + 2.0_rk * x * y
        x = x_0 + x_sqr - y_sqr
        n = n + 1
        end do
    end do
    end do

    ! print '(a)', 'P2'
    ! print '(i0, 1x, i0)', i_max, j_max
    ! print '(i0)', 255
    ! do j = 1, 3
    !   do i = 1, 3
    !     print '(i0)', image(i,j)
    !   end do
    ! end do

    do i = 1, i_max
        do j = 1, j_max
            image_t(j, i) = image(i, j)
        end do
    end do

    print *, "The result is as follows:"
    call show_img(j_max, i_max, image_t)

    print *, "Thank you! Hope you had fun!"

    interface
        subroutine show_img(n, m, A) bind(c)
        integer, intent(in) :: n, m
        integer, intent(in) :: A(n,m)
        end subroutine
    end interface
end program mandelbrot
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

1 participant