]> git.mxchange.org Git - flightgear.git/blobdiff - src/Scripting/NasalSys.cxx
Vivian MEAZZA:
[flightgear.git] / src / Scripting / NasalSys.cxx
index 88cd7e379142fe4a9482ab7faa272d665a920a22..870d6def1455f0831e095243af62223d333bb799 100644 (file)
@@ -71,7 +71,7 @@ bool FGNasalSys::parseAndRun(const char* sourceCode)
     if(naIsNil(code))
         return false;
 
-    naCall(_context, code, naNil(), naNil(), naNil());
+    naCall(_context, code, 0, 0, naNil(), naNil());
 
     if(!naGetError(_context)) return true;
     logError();
@@ -385,7 +385,7 @@ void FGNasalSys::loadPropertyScripts()
         const char* src = n->getStringValue("script");
         if(!n->hasChild("script")) src = 0; // Hrm...
         if(src)
-            initModule(module, n->getPath(), src, strlen(src));
+            createModule(module, n->getPath(), src, strlen(src));
 
         if(!file_specified && !src)
             SG_LOG(SG_NASAL, SG_ALERT, "Nasal error: " <<
@@ -422,14 +422,14 @@ void FGNasalSys::loadModule(SGPath file, const char* module)
         return;
     }
 
-    initModule(module, file.c_str(), buf, len);
+    createModule(module, file.c_str(), buf, len);
     delete[] buf;
 }
 
 // Parse and run.  Save the local variables namespace, as it will
 // become a sub-object of globals.
-void FGNasalSys::initModule(const char* moduleName, const char* fileName,
-                            const char* src, int len)
+void FGNasalSys::createModule(const char* moduleName, const char* fileName,
+                              const char* src, int len)
 {
     naRef code = parse(fileName, src, len);
     if(naIsNil(code))
@@ -444,7 +444,7 @@ void FGNasalSys::initModule(const char* moduleName, const char* fileName,
     if(!naHash_get(_globals, modname, &locals))
         locals = naNewHash(_context);
 
-    naCall(_context, code, naNil(), naNil(), locals);
+    naCall(_context, code, 0, 0, naNil(), locals);
     if(naGetError(_context)) {
         logError();
         return;
@@ -471,21 +471,25 @@ naRef FGNasalSys::parse(const char* filename, const char* buf, int len)
 
 bool FGNasalSys::handleCommand(const SGPropertyNode* arg)
 {
-    // Parse the Nasal source.  I'd love to use the property name of
-    // the argument, but it's actually a *clone* of the original
-    // location in the property tree.  arg->getPath() returns an empty
-    // string.
     const char* nasal = arg->getStringValue("script");
-    naRef code = parse("<command>", nasal, strlen(nasal));
+    const char* moduleName = arg->getStringValue("module");
+    naRef code = parse(arg->getPath(true), nasal, strlen(nasal));
     if(naIsNil(code)) return false;
-    
+
+    naRef locals = naNil();
+    if (moduleName[0]) {
+        naRef modname = naNewString(_context);
+        naStr_fromdata(modname, (char*)moduleName, strlen(moduleName));
+        if(!naHash_get(_globals, modname, &locals))
+            locals = naNewHash(_context);
+    }
     // Cache the command argument for inspection via cmdarg().  For
     // performance reasons, we won't bother with it if the invoked
     // code doesn't need it.
     _cmdArg = (SGPropertyNode*)arg;
 
     // Call it!
-    naRef result = naCall(_context, code, naNil(), naNil(), naNil());
+    naRef result = naCall(_context, code, 0, 0, naNil(), locals);
     if(!naGetError(_context)) return true;
     logError();
     return false;
@@ -494,7 +498,7 @@ bool FGNasalSys::handleCommand(const SGPropertyNode* arg)
 // settimer(func, dt, simtime) extension function.  The first argument
 // is a Nasal function to call, the second is a delta time (from now),
 // in seconds.  The third, if present, is a boolean value indicating
-// that "simulator" time (rather than real time) is to be used.
+// that "real world" time (rather than simulator time) is to be used.
 //
 // Implementation note: the FGTimer objects don't live inside the
 // garbage collector, so the Nasal handler functions have to be
@@ -511,7 +515,7 @@ void FGNasalSys::setTimer(int argc, naRef* args)
     naRef delta = argc > 1 ? args[1] : naNil();
     if(naIsNil(delta)) return;
     
-    bool simtime = (argc > 2 && naTrue(args[2])) ? true : false;
+    bool simtime = (argc > 2 && naTrue(args[2])) ? false : true;
 
     // Generate and register a C++ timer handler
     NasalTimer* t = new NasalTimer;
@@ -526,7 +530,7 @@ void FGNasalSys::setTimer(int argc, naRef* args)
 
 void FGNasalSys::handleTimer(NasalTimer* t)
 {
-    naCall(_context, t->handler, naNil(), naNil(), naNil());
+    naCall(_context, t->handler, 0, 0, naNil(), naNil());
     if(naGetError(_context))
         logError();
     gcRelease(t->gcKey);