]> git.mxchange.org Git - flightgear.git/blobdiff - src/Scripting/NasalSys.cxx
f_alias: catch SGPropertyNode exceptions and generate runtime error
[flightgear.git] / src / Scripting / NasalSys.cxx
index af589ff3f3581f295c2cdba988b506c87e8f6e14..941776b35d6ceee5db9c6971ca85b39f9a95deec 100644 (file)
@@ -788,7 +788,9 @@ void FGNasalSys::loadModule(SGPath file, const char* module)
 // used to pass an associated property node to the module, which can then
 // be accessed via cmdarg().  (This is, for example, used by XML dialogs.)
 void FGNasalSys::createModule(const char* moduleName, const char* fileName,
-                              const char* src, int len, const SGPropertyNode* arg)
+                              const char* src, int len,
+                              const SGPropertyNode* cmdarg,
+                              int argc, naRef* args)
 {
     naRef code = parse(fileName, src, len);
     if(naIsNil(code))
@@ -803,9 +805,9 @@ void FGNasalSys::createModule(const char* moduleName, const char* fileName,
     if(!naHash_get(_globals, modname, &locals))
         locals = naNewHash(_context);
 
-    _cmdArg = (SGPropertyNode*)arg;
+    _cmdArg = (SGPropertyNode*)cmdarg;
 
-    call(code, 0, 0, locals);
+    call(code, argc, args, locals);
     hashset(_globals, moduleName, locals);
 }
 
@@ -1092,9 +1094,12 @@ void FGNasalModelData::modelLoaded(const string& path, SGPropertyNode *prop,
 {
     if(!prop)
         return;
+    SGPropertyNode *nasal = prop->getNode("nasal");
+    if(!nasal)
+        return;
 
-    SGPropertyNode *load = prop->getNode("load");
-    _unload = prop->getNode("unload");
+    SGPropertyNode *load = nasal->getNode("load");
+    _unload = nasal->getNode("unload");
     if(!load && !_unload)
         return;
 
@@ -1102,7 +1107,13 @@ void FGNasalModelData::modelLoaded(const string& path, SGPropertyNode *prop,
     if(_props)
         _module += ':' + _props->getPath();
     const char *s = load ? load->getStringValue() : "";
-    nasalSys->createModule(_module.c_str(), _module.c_str(), s, strlen(s), _props);
+
+    naRef arg[2];
+    arg[0] = nasalSys->propNodeGhost(_root);
+    arg[1] = nasalSys->propNodeGhost(prop);
+    nasalSys->createModule(_module.c_str(), _module.c_str(), s, strlen(s),
+                           _root, 2, arg);
+    _props = 0;
 }
 
 FGNasalModelData::~FGNasalModelData()
@@ -1118,7 +1129,7 @@ FGNasalModelData::~FGNasalModelData()
 
     if(_unload) {
         const char *s = _unload->getStringValue();
-        nasalSys->createModule(_module.c_str(), _module.c_str(), s, strlen(s), _props);
+        nasalSys->createModule(_module.c_str(), _module.c_str(), s, strlen(s), _root);
     }
     nasalSys->deleteModule(_module.c_str());
 }