Index: /cpp/frams/neuro/neuroimpl.cpp
===================================================================
--- /cpp/frams/neuro/neuroimpl.cpp	(revision 126)
+++ /cpp/frams/neuro/neuroimpl.cpp	(revision 127)
@@ -300,7 +300,7 @@
 {"getInputSum",0,0,"Get signal sum","p f(d input)",PROCEDURE(p_getsum),},
 {"getWeightedInputSum",0,0,"Get weighted signal sum","p f(d input)",PROCEDURE(p_getwsum),"Uses any number of inputs starting with the specified input. getWeightedInputSum(0)=weightedInputSum"},
-{"getInputCount",0,0,"Get input count","d",GETONLY(count),},
-{"inputSum",0,0,"Full signal sum","f",GETONLY(sum),},
-{"weightedInputSum",0,0,"Full weighted signal sum","f",GETONLY(wsum),},
+{"getInputCount",0,PARAM_READONLY,"Get input count","d",GETONLY(count),},
+{"inputSum",0,PARAM_READONLY,"Full signal sum","f",GETONLY(sum),},
+{"weightedInputSum",0,PARAM_READONLY,"Full weighted signal sum","f",GETONLY(wsum),},
 {"getInputChannelCount",0,0,"Get channel count for input","p d(d input)",PROCEDURE(p_getchancount),},
 {"getInputStateChannel",0,0,"Get input signal from channel","p f(d input,d channel)",PROCEDURE(p_getchan),},
@@ -313,11 +313,11 @@
 {"currState",0,0,"Current neuron state (channel 0)","f",GETSET(cstate),"When read, it behaves just like the 'state' field.\nWhen written, changes the current neuron state immediately, which disturbs the regular synchronous NN operation.\nThis feature should only be used while controlling the neuron 'from outside' (like a neuro probe) and not in the neuron definition. See also: Neuro.hold",},
 {"setCurrStateChannel",0,0,"Set current neuron state for channel","p(d channel,f value)",PROCEDURE(p_setcstate),"Analogous to \"currState\"."},
-{"position_x",0,0,"Position x","f",GETONLY(position_x),},
-{"position_y",0,0,"Position y","f",GETONLY(position_y),},
-{"position_z",0,0,"Position z","f",GETONLY(position_z),},
-{"creature",0,0,"Gets owner creature","o Creature",GETONLY(creature),},
-{"part",0,0,"The Part object where this neuron is located","o MechPart",GETONLY(part),},
-{"joint",0,0,"The Joint object where this neuron is located","o MechJoint",GETONLY(joint),},
-{"fields",0,0,"Custom neuron fields","o Fields",GETONLY(fields),
+{"position_x",0,PARAM_READONLY,"Position x","f",GETONLY(position_x),},
+{"position_y",0,PARAM_READONLY,"Position y","f",GETONLY(position_y),},
+{"position_z",0,PARAM_READONLY,"Position z","f",GETONLY(position_z),},
+{"creature",0,PARAM_READONLY,"Gets owner creature","o Creature",GETONLY(creature),},
+{"part",0,PARAM_READONLY,"The Part object where this neuron is located","o MechPart",GETONLY(part),},
+{"joint",0,PARAM_READONLY,"The Joint object where this neuron is located","o MechJoint",GETONLY(joint),},
+{"fields",0,PARAM_READONLY,"Custom neuron fields","o Fields",GETONLY(fields),
 "Neurons can have different fields depending on their class. Script neurons have their fields defined using the \"prop:\" syntax. If you develop a custom neuron script you should use the Fields object for accessing your own neuron fields. The Neuro.fields property is meant for accessing the neuron fields from the outside script.\n"
 "Examples:\n"
@@ -333,6 +333,6 @@
 "for(i=0;i<iobj.properties;i++)\n"
 " Simulator.print(iobj.getId(i)+\" (\"+iobj.getName(i)+\")\");",},
-{"def",0,0,"Neuron definition from which this live neuron was built","o NeuroDef",GETONLY(neurodef),},
-{"classObject",0,0,"Neuron class for this neuron","o NeuroClass",GETONLY(classObject),},
+{"def",0,PARAM_READONLY,"Neuron definition from which this live neuron was built","o NeuroDef",GETONLY(neurodef),},
+{"classObject",0,PARAM_READONLY,"Neuron class for this neuron","o NeuroClass",GETONLY(classObject),},
 #ifdef NEURO_SIGNALS
 {"signals",0,PARAM_READONLY,"Signals","o NeuroSignals",FIELD(sigs_obj),},
Index: /cpp/frams/vm/classes/3dobject.cpp
===================================================================
--- /cpp/frams/vm/classes/3dobject.cpp	(revision 126)
+++ /cpp/frams/vm/classes/3dobject.cpp	(revision 127)
@@ -225,7 +225,7 @@
 {"zz",1,PARAM_NOSTATIC,"orientation.z.z","f",FIELD(o.z.z),},
 
-{"x",0,PARAM_NOSTATIC,"x vector","oXYZ",GETONLY(x),},
-{"y",0,PARAM_NOSTATIC,"y vector","oXYZ",GETONLY(y),},
-{"z",0,PARAM_NOSTATIC,"z vector","oXYZ",GETONLY(z),},
+{"x",0,PARAM_NOSTATIC+PARAM_READONLY,"x vector","oXYZ",GETONLY(x),},
+{"y",0,PARAM_NOSTATIC+PARAM_READONLY,"y vector","oXYZ",GETONLY(y),},
+{"z",0,PARAM_NOSTATIC+PARAM_READONLY,"z vector","oXYZ",GETONLY(z),},
 
 {"new",0,0,"create new Orient object","p oOrient()",PROCEDURE(p_new),},
Index: /cpp/frams/vm/classes/collectionobj.cpp
===================================================================
--- /cpp/frams/vm/classes/collectionobj.cpp	(revision 126)
+++ /cpp/frams/vm/classes/collectionobj.cpp	(revision 127)
@@ -30,5 +30,5 @@
 {"new",0,0,"create new Vector","p oVector()",STATICPROCEDURE(p_new),},
 {"sort",0,PARAM_NOSTATIC,"sort elements (in place)","p(o comparator)",PROCEDURE(p_sort),"comparator can be null, giving the \"natural\" sorting order (depending on element type), otherwise it must be a function reference obtained by the \"function FUNCTIONNAME\" operator.\n\nExample:\nfunction compareLastDigit(a,b) {return (a%10)<(b%10);}\nvar v=[16,23,35,42,54,61];\nv.sort(function compareLastDigit);"},
-{"iterator",0,PARAM_NOSTATIC,"iterator","o",GETONLY(iterator),},
+{"iterator",0,PARAM_NOSTATIC+PARAM_READONLY,"iterator","o",GETONLY(iterator),},
 {0,0,0,},
 };
@@ -44,5 +44,5 @@
  "var i;\nfor(i=0;i<d.size;i++) Simulator.print(d.getKey(i)+\" is \"+d.get(i));",},
 {"clear",0,PARAM_NOSTATIC,"clear data","p()",PROCEDURE(p_clear),},
-{"size",0,PARAM_NOSTATIC,"element count","d",GETONLY(size),},
+{"size",0,PARAM_NOSTATIC+PARAM_READONLY,"element count","d",GETONLY(size),},
 {"remove",0,PARAM_NOSTATIC,"remove named or indexed element","p(x key)",PROCEDURE(p_remove),},
 {"get",0,PARAM_NOSTATIC,"get named or indexed element","p x(x key)",PROCEDURE(p_get),},
