diff --git a/src/Scripting/nasal-props.cxx b/src/Scripting/nasal-props.cxx index 77d7ffe85..840bd17fd 100644 --- a/src/Scripting/nasal-props.cxx +++ b/src/Scripting/nasal-props.cxx @@ -345,6 +345,23 @@ T makeVecFromVector(naRef vector) return vec; } +static std::string s_val_description(naRef val) +{ + std::ostringstream message; + if (naIsNil(val)) message << "nil"; + else if (naIsNum(val)) message << "num:" << naNumValue(val).num; + else if (naIsString(val)) message << "string:" << naStr_data(val); + else if (naIsScalar(val)) message << "scalar"; + else if (naIsVector(val)) message << "vector"; + else if (naIsHash(val)) message << "hash"; + else if (naIsFunc(val)) message << "func"; + else if (naIsCode(val)) message << "code"; + else if (naIsCCode(val)) message << "ccode"; + else if (naIsGhost(val)) message << "ghost"; + else message << "?"; + return message.str(); +} + // Helper function to set the value of a node; returns true if it succeeded or // false if it failed. <val> can be a string, number, or a // vector or numbers (for SGVec3D/4D types). @@ -359,16 +376,15 @@ static naRef f_setValueHelper(naContext c, SGPropertyNode_ptr node, naRef val) { result = node->setValue(makeVecFromVector<SGVec4d>(val)); else naRuntimeError(c, "props.setValue() vector value has wrong size"); - } else { - if(!naIsNum(val)) - naRuntimeError(c, "props.setValue() with non-number"); - + } else if(naIsNum(val)) { double d = naNumValue(val).num; if (SGMisc<double>::isNaN(d)) { naRuntimeError(c, "props.setValue() passed a NaN"); } result = node->setDoubleValue(d); + } else { + naRuntimeError(c, "props.setValue() called with unsupported value %s", s_val_description(val).c_str()); } return naNum(result); }