Browse Source

Handle string exceptions, support Modules folder, Editor player handles JS errors (exits)

Josh Engebretson 10 years ago
parent
commit
0f203a34ec

+ 18 - 0
Source/AtomicEditor/Source/Player/AEPlayerApplication.cpp

@@ -189,6 +189,8 @@ void AEPlayerApplication::Start()
 {
 
     SubscribeToEvent(E_IPCHELLOFROMBROKER, HANDLER(AEPlayerApplication, HandleHelloFromBroker));
+    SubscribeToEvent(E_JSERROR, HANDLER(AEPlayerApplication, HandleJSError));
+
 
 #ifdef ATOMIC_PLATFORM_WINDOWS
     if (fd_[0] != INVALID_IPCHANDLE_VALUE)
@@ -269,5 +271,21 @@ void AEPlayerApplication::HandleLogMessage(StringHash eventType, VariantMap& eve
         
 }
 
+void AEPlayerApplication::HandleJSError(StringHash eventType, VariantMap& eventData)
+{
+    using namespace JSError;
+    //String errName = eventData[P_ERRORNAME].GetString();
+    String errMessage = eventData[P_ERRORMESSAGE].GetString();
+    String errFilename = eventData[P_ERRORFILENAME].GetString();
+    //String errStack = eventData[P_ERRORSTACK].GetString();
+    int errLineNumber = eventData[P_ERRORLINENUMBER].GetInt();
+
+    String errorString = ToString("%s - %s - Line: %i",
+                                  errFilename.CString(), errMessage.CString(), errLineNumber);
+
+    ErrorExit(errorString);
+
+}
+
 
 }

+ 2 - 0
Source/AtomicEditor/Source/Player/AEPlayerApplication.h

@@ -53,6 +53,8 @@ private:
     /// Handle reload failure of the script file.
     void HandleScriptReloadFailed(StringHash eventType, VariantMap& eventData);
 
+    void HandleJSError(StringHash eventType, VariantMap& eventData);
+
     void HandleLogMessage(StringHash eventType, VariantMap& eventData);
 
 

+ 12 - 0
Source/AtomicJS/Javascript/JSRequire.cpp

@@ -54,6 +54,9 @@ namespace Atomic
         else
         {
             path += ".js";
+
+            if (!cache->Exists(path) && cache->Exists("Modules/" + path))
+                path = "Modules/" + path;
  
         }
 
@@ -84,8 +87,17 @@ namespace Atomic
                         duk_push_undefined(ctx);
                         return 1;
                     }
+                    else
+                    {
+                        duk_push_sprintf(ctx, "Failed loading native plugins: %s", pluginLibrary.CString());
+                        duk_throw(ctx);
+                    }
                 }
             }
+
+            duk_push_sprintf(ctx, "Failed loading module: %s", path.CString());
+            duk_throw(ctx);
+
         }
         else
         {

+ 13 - 1
Source/AtomicJS/Javascript/JSVM.cpp

@@ -315,12 +315,24 @@ void JSVM::InitComponents()
 void JSVM::SendJSErrorEvent(const String& filename)
 {
     duk_context* ctx = GetJSContext();
-    assert(duk_is_object(ctx, -1));
 
     using namespace JSError;
 
     VariantMap eventData;
 
+    if (duk_is_string(ctx, -1))
+    {
+        eventData[P_ERRORNAME] = "(Unknown Error Name)";
+        eventData[P_ERRORFILENAME] = "(Unknown Filename)";
+        eventData[P_ERRORLINENUMBER] =  -1;
+        eventData[P_ERRORMESSAGE] = duk_to_string(ctx, -1);
+        eventData[P_ERRORSTACK] = "";
+        SendEvent(E_JSERROR, eventData);
+        return;
+    }
+
+    assert(duk_is_object(ctx, -1));
+
     duk_get_prop_string(ctx, -1, "fileName");
     if (duk_is_string(ctx, -1))
     {