--- narray-miss.orig/lib/narray_miss.rb
+++ narray-miss/lib/narray_miss.rb
@@ -108,7 +108,7 @@
      create (({NArrayMiss})) form [((|value|)), ...].
 --- NArrayMiss.to_nam(array [,mask])
      create (({NArrayMiss})) from ((|array|)).
-     ((|array|)) must be (({Array})) or (({NArray})).
+     ((|array|)) must be (({Numeric})) (({Array})) or (({NArray})).
 --- NArrayMiss.to_nam_no_dup(array [,mask])
      convert from ((|array|)) to (({NArrayMiss})).
 
@@ -161,7 +161,7 @@
 
     if arg.length==2 then
       mask = arg[1]
-      if Numeric===mask then mask = [mask] end
+      if Numeric===mask then mask = array.ne(mask) end
       if Array===mask then
 	mask = NArray.to_na(mask).ne(0)
       end
@@ -183,7 +183,7 @@
     __new__(array,mask)
   end
   def self.to_nam(*arg)
-    if !(Numeric===arg[0]) && Array===arg[0] && !arg[0].is_a?(NArray)
+    if !(Numeric===arg[0]) && !(Array===arg[0]) && !arg[0].is_a?(NArray)
       raise "first argument must be Numeric, NArray or Array"
     end
     arg[0] = arg[0].dup if !(Numeric===arg[0])
@@ -260,11 +260,20 @@
 =end
 
   def [](*arg)
-    obj = @array[*arg]
-    if Numeric===obj
-      return obj
+    if arg[0].class == NArrayMiss && arg[0].typecode == BYTE
+      obj = @array[arg[0].to_na(0)]
+      if Numeric===obj
+        return obj
+      else
+        return NArrayMiss.to_nam_no_dup(obj)
+      end
     else
-      return NArrayMiss.to_nam_no_dup(obj,@mask[*arg])
+      obj = @array[*arg]
+      if Numeric===obj
+        return obj
+      else
+        return NArrayMiss.to_nam_no_dup(obj,@mask[*arg])
+      end
     end
   end
   def slice(*arg)
@@ -295,12 +304,20 @@
   end
 
   def []=(*arg)
-    self.set_without_validation(*arg)
-    if arg[-1].class != NArrayMiss && arg[-1] then
-      if arg.length==1 then
-        @mask=1
-      else
-        @mask[*arg[0..-2]] = 1
+    if arg.length == 2 && arg[0].class == NArrayMiss && arg[0].typecode == BYTE
+      idx = arg[0].to_na(0)
+      self.set_without_validation(idx,arg[-1])
+      if arg[-1].class != NArrayMiss && arg[-1] then
+        @mask[idx] = 1
+      end
+    else
+      self.set_without_validation(*arg)
+      if arg[-1].class != NArrayMiss && arg[-1] then
+        if arg.length==1 then
+          @mask=1
+        else
+          @mask[*arg[0..-2]] = 1
+        end
       end
     end
     return self
@@ -980,11 +997,11 @@
     obj
   end
   def hton
-    NArray.to_nam(@array.hton,@mask.hton)
+    NArrayMiss.to_nam(@array.hton,@mask.hton)
   end
   alias :ntoh :hton
   def htov
-    NArray.to_nam(@array.htov,@mask.htov)
+    NArrayMiss.to_nam(@array.htov,@mask.htov)
   end
   alias :vtoh :htov
 
@@ -1036,10 +1053,12 @@
 
   def set_valid(*pos)
     @mask[*pos] = 1
+    self
   end
   alias validation set_valid
   def set_invalid(*pos)
     @mask[*pos] = 0
+    self
   end
   alias invalidation set_invalid
   def all_valid
@@ -1186,7 +1205,7 @@
     sep = ", "
     const = Hash.new
     NArray.constants.each{|c| const[NArray.const_get(c)] = c}
-    str_ret = "NArrayMiss."+const[typecode].downcase+"("+shape.join(",")+"):"
+    str_ret = "NArrayMiss."+const[typecode].to_s.downcase+"("+shape.join(",")+"):"
     if rank == 0 then
       str_ret += " []"
       return str_ret
@@ -1272,7 +1291,7 @@
   def routine1(arg,dummy)
     flag=true
     if Numeric===arg then
-      term1 = @array
+      term1 = @array.dup
       term2 = arg
       mask = true
     elsif arg.class == Array then
@@ -1281,13 +1300,13 @@
       term2 = NArray.to_na(arg)
       mask = NArray.byte(*term2.shape).fill(1)
     elsif arg.class == NArray then
-      term1 = @array
+      term1 = @array.dup
       term1[@mask.not] = dummy
-      term2 = arg
+      term2 = arg.dup
       mask = NArray.byte(*term2.shape).fill(1)
     elsif arg.class == NArrayMiss then
       mask = arg.get_mask
-      term1 = @array
+      term1 = @array.dup
       term1[@mask.not] = dummy
       term2 = arg.to_na
       term2[arg.get_mask!.not] = dummy
