static SGPropertyNode* findnode(naContext c, naRef* vec, int len)
{
SGPropertyNode* p = globals->get_props();
- for(int i=0; i<len; i++) {
- naRef a = vec[i];
- if(!naIsString(a)) return 0;
- p = p->getNode(naStr_data(a));
- if(p == 0) return 0;
+ try {
+ for(int i=0; i<len; i++) {
+ naRef a = vec[i];
+ if(!naIsString(a)) return 0;
+ p = p->getNode(naStr_data(a));
+ if(p == 0) return 0;
+ }
+ } catch (const string& err) {
+ naRuntimeError(c, (char *)err.c_str());
+ return 0;
}
return p;
}
SGPropertyNode* props = globals->get_props();
naRef val = args[argc-1];
- if(naIsString(val)) props->setStringValue(buf, naStr_data(val));
- else props->setDoubleValue(buf, naNumValue(val).num);
+ try {
+ if(naIsString(val)) props->setStringValue(buf, naStr_data(val));
+ else props->setDoubleValue(buf, naNumValue(val).num);
+ } catch (const string& err) {
+ naRuntimeError(c, (char *)err.c_str());
+ }
return naNil();
#undef BUFLEN
}
naRef idx = naNumValue(naVec_get(argv, 1));
bool create = naTrue(naVec_get(argv, 2));
SGPropertyNode* n;
- if(naIsNil(idx) || !naIsNum(idx)) {
- n = (*node)->getChild(naStr_data(child), create);
- } else {
- n = (*node)->getChild(naStr_data(child), (int)idx.num, create);
+ try {
+ if(naIsNil(idx) || !naIsNum(idx)) {
+ n = (*node)->getChild(naStr_data(child), create);
+ } else {
+ n = (*node)->getChild(naStr_data(child), (int)idx.num, create);
+ }
+ } catch (const string& err) {
+ naRuntimeError(c, (char *)err.c_str());
+ return naNil();
}
if(!n) return naNil();
return propNodeGhostCreate(c, n);
// Get all children of a specified name
naRef name = naVec_get(argv, 0);
if(!naIsString(name)) return naNil();
- vector<SGPropertyNode_ptr> children
- = (*node)->getChildren(naStr_data(name));
- for(unsigned int i=0; i<children.size(); i++)
- naVec_append(result, propNodeGhostCreate(c, children[i]));
+ try {
+ vector<SGPropertyNode_ptr> children
+ = (*node)->getChildren(naStr_data(name));
+ for(unsigned int i=0; i<children.size(); i++)
+ naVec_append(result, propNodeGhostCreate(c, children[i]));
+ } catch (const string& err) {
+ naRuntimeError(c, (char *)err.c_str());
+ return naNil();
+ }
}
return result;
}
naRef child = naVec_get(argv, 0);
naRef index = naVec_get(argv, 1);
if(!naIsString(child) || !naIsNum(index)) return naNil();
- (*node)->removeChild(naStr_data(child), (int)index.num, false);
+ try {
+ (*node)->removeChild(naStr_data(child), (int)index.num, false);
+ } catch (const string& err) {
+ naRuntimeError(c, (char *)err.c_str());
+ }
return naNil();
}
// Remove all children of a specified name
naRef name = naVec_get(argv, 0);
if(!naIsString(name)) return naNil();
- vector<SGPropertyNode_ptr> children
- = (*node)->removeChildren(naStr_data(name), false);
- for(unsigned int i=0; i<children.size(); i++)
- naVec_append(result, propNodeGhostCreate(c, children[i]));
+ try {
+ vector<SGPropertyNode_ptr> children
+ = (*node)->removeChildren(naStr_data(name), false);
+ for(unsigned int i=0; i<children.size(); i++)
+ naVec_append(result, propNodeGhostCreate(c, children[i]));
+ } catch (const string& err) {
+ naRuntimeError(c, (char *)err.c_str());
+ return naNil();
+ }
}
return result;
}
naRef path = naVec_get(argv, 0);
bool create = naTrue(naVec_get(argv, 1));
if(!naIsString(path)) return naNil();
- SGPropertyNode* n = (*node)->getNode(naStr_data(path), create);
+ SGPropertyNode* n;
+ try {
+ n = (*node)->getNode(naStr_data(path), create);
+ } catch (const string& err) {
+ naRuntimeError(c, (char *)err.c_str());
+ return naNil();
+ }
return propNodeGhostCreate(c, n);
}