@@ -878,16 +878,21 @@ function compile_call(ctx::JSCompilationContext, expr::Expr)
878878 # Array indexing: arr[i] → arr[i-1]
879879 # Range indexing: arr[a:b] → arr.slice(a-1, b)
880880 if length (call_args) == 2
881- idx_arg = args[3 ] # The index argument (before compilation)
881+ idx_arg = args[3 ]
882882 idx_type = nothing
883883 if idx_arg isa Core. SSAValue
884884 idx_type = try ctx. code_info. ssavaluetypes[idx_arg. id] catch ; nothing end
885885 end
886- # Check if index is a range (UnitRange) → slice
887886 if idx_type != = nothing && idx_type isa DataType && idx_type <: AbstractRange
888887 return " $(call_args[1 ]) .slice(($(call_args[2 ]) ).start-1,($(call_args[2 ]) ).stop)"
889888 end
890889 return " $(call_args[1 ]) [($(call_args[2 ]) ) - 1]"
890+ elseif length (call_args) == 3
891+ # A[i,j] → column-major flat index: (j-1)*nrows + (i-1)
892+ return " $(call_args[1 ]) [(($(call_args[3 ]) )-1)*$(call_args[1 ]) ._size[0]+(($(call_args[2 ]) )-1)]"
893+ elseif length (call_args) == 4
894+ # A[i,j,k] → column-major: (k-1)*m*n + (j-1)*m + (i-1)
895+ return " $(call_args[1 ]) [(($(call_args[4 ]) )-1)*$(call_args[1 ]) ._size[0]*$(call_args[1 ]) ._size[1]+(($(call_args[3 ]) )-1)*$(call_args[1 ]) ._size[0]+(($(call_args[2 ]) )-1)]"
891896 end
892897 return " []"
893898 end
@@ -1031,6 +1036,18 @@ function compile_call(ctx::JSCompilationContext, expr::Expr)
10311036 if fn_name == " sort" && length (call_args) >= 1
10321037 return " $(call_args[1 ]) .slice().sort()"
10331038 end
1039+ if fn_name == " setindex!" && length (call_args) >= 3
1040+ if length (call_args) == 4
1041+ # A[i,j] = val → column-major
1042+ return " ($(call_args[1 ]) [(($(call_args[4 ]) )-1)*$(call_args[1 ]) ._size[0]+(($(call_args[3 ]) )-1)] = $(call_args[2 ]) )"
1043+ else
1044+ return " ($(call_args[1 ]) [($(call_args[3 ]) )-1] = $(call_args[2 ]) )"
1045+ end
1046+ end
1047+ if fn_name == " getindex" && length (call_args) == 3
1048+ # A[i,j] → column-major
1049+ return " $(call_args[1 ]) [(($(call_args[3 ]) )-1)*$(call_args[1 ]) ._size[0]+(($(call_args[2 ]) )-1)]"
1050+ end
10341051 if fn_name == " copy" && length (call_args) >= 1
10351052 return " $(call_args[1 ]) .slice()"
10361053 end
@@ -1058,15 +1075,39 @@ function compile_call(ctx::JSCompilationContext, expr::Expr)
10581075 return " $(call_args[2 ]) .reduce($(call_args[1 ]) )"
10591076 end
10601077
1061- # ─── Construction (by name) ───
1062- if fn_name == " zeros" && length (call_args) >= 1
1063- return " new Array($(call_args[1 ]) ).fill(0)"
1078+ # ─── Construction (by name, 1D and ND) ───
1079+ if fn_name == " zeros"
1080+ if length (call_args) == 1
1081+ return " new Array($(call_args[1 ]) ).fill(0)"
1082+ elseif length (call_args) >= 2
1083+ require_runtime! (ctx, :jl_ndarray )
1084+ return " jl_ndarray(0,[$(join (call_args, " ," )) ])"
1085+ end
10641086 end
1065- if fn_name == " ones" && length (call_args) >= 1
1066- return " new Array($(call_args[1 ]) ).fill(1)"
1087+ if fn_name == " ones"
1088+ if length (call_args) == 1
1089+ return " new Array($(call_args[1 ]) ).fill(1)"
1090+ elseif length (call_args) >= 2
1091+ require_runtime! (ctx, :jl_ndarray )
1092+ return " jl_ndarray(1,[$(join (call_args, " ," )) ])"
1093+ end
10671094 end
1068- if fn_name == " fill" && length (call_args) >= 2
1069- return " new Array($(call_args[2 ]) ).fill($(call_args[1 ]) )"
1095+ if fn_name == " fill"
1096+ if length (call_args) == 2
1097+ return " new Array($(call_args[2 ]) ).fill($(call_args[1 ]) )"
1098+ elseif length (call_args) >= 3
1099+ require_runtime! (ctx, :jl_ndarray )
1100+ return " jl_ndarray($(call_args[1 ]) ,[$(join (call_args[2 : end ], " ," )) ])"
1101+ end
1102+ end
1103+
1104+ # ─── Size (by name) ───
1105+ if fn_name == " size"
1106+ if length (call_args) == 1
1107+ return " ($(call_args[1 ]) ._size||[$(call_args[1 ]) .length]).slice()"
1108+ elseif length (call_args) == 2
1109+ return " ($(call_args[1 ]) ._size?$(call_args[1 ]) ._size[($(call_args[2 ]) )-1]:$(call_args[1 ]) .length)"
1110+ end
10701111 end
10711112
10721113 # ─── Parsing (by name) ───
@@ -1265,10 +1306,24 @@ function compile_call(ctx::JSCompilationContext, expr::Expr)
12651306 return " []"
12661307 end
12671308 end
1268- # Array indexing
1309+ # Array indexing (1D and ND)
12691310 call_args_gr = [compile_value (ctx, a) for a in args[2 : end ]]
12701311 if length (call_args_gr) == 2
12711312 return " $(call_args_gr[1 ]) [($(call_args_gr[2 ]) ) - 1]"
1313+ elseif length (call_args_gr) == 3
1314+ # A[i,j] → column-major
1315+ return " $(call_args_gr[1 ]) [(($(call_args_gr[3 ]) )-1)*$(call_args_gr[1 ]) ._size[0]+(($(call_args_gr[2 ]) )-1)]"
1316+ end
1317+ end
1318+
1319+ # Base.setindex! — array assignment (1D and ND)
1320+ if bname === :setindex! && callee. mod === Base
1321+ call_args_gr = [compile_value (ctx, a) for a in args[2 : end ]]
1322+ if length (call_args_gr) == 4
1323+ # A[i,j] = val → column-major
1324+ return " ($(call_args_gr[1 ]) [(($(call_args_gr[4 ]) )-1)*$(call_args_gr[1 ]) ._size[0]+(($(call_args_gr[3 ]) )-1)] = $(call_args_gr[2 ]) )"
1325+ elseif length (call_args_gr) == 3
1326+ return " ($(call_args_gr[1 ]) [($(call_args_gr[3 ]) )-1] = $(call_args_gr[2 ]) )"
12721327 end
12731328 end
12741329
@@ -1677,8 +1732,15 @@ function compile_invoke(ctx::JSCompilationContext, expr::Expr)
16771732 elseif func_name == " setindex!"
16781733 arr_val = compile_value (ctx, expr. args[3 ])
16791734 val_val = compile_value (ctx, expr. args[4 ])
1680- idx_val = compile_value (ctx, expr. args[5 ])
1681- return " ($(arr_val) [($(idx_val) )-1] = $(val_val) )"
1735+ if length (expr. args) == 6
1736+ # A[i,j] = val → column-major
1737+ i_val = compile_value (ctx, expr. args[5 ])
1738+ j_val = compile_value (ctx, expr. args[6 ])
1739+ return " ($(arr_val) [(($(j_val) )-1)*$(arr_val) ._size[0]+(($(i_val) )-1)] = $(val_val) )"
1740+ else
1741+ idx_val = compile_value (ctx, expr. args[5 ])
1742+ return " ($(arr_val) [($(idx_val) )-1] = $(val_val) )"
1743+ end
16821744 elseif func_name == " deleteat!"
16831745 arr_val = compile_value (ctx, expr. args[3 ])
16841746 idx_val = compile_value (ctx, expr. args[4 ])
@@ -1825,6 +1887,15 @@ function compile_invoke(ctx::JSCompilationContext, expr::Expr)
18251887 return " $(call_args[1 ]) .length === 0"
18261888 end
18271889
1890+ # size(A) → shape tuple, size(A, d) → dimension size
1891+ if func_name == " size"
1892+ if length (call_args) == 1
1893+ return " ($(call_args[1 ]) ._size||[$(call_args[1 ]) .length]).slice()"
1894+ elseif length (call_args) == 2
1895+ return " ($(call_args[1 ]) ._size?$(call_args[1 ]) ._size[($(call_args[2 ]) )-1]:$(call_args[1 ]) .length)"
1896+ end
1897+ end
1898+
18281899 # convert(T, x) → just x (type conversions are compile-time in JS)
18291900 if func_name == " convert" && length (call_args) >= 2
18301901 return call_args[2 ]
0 commit comments