JavaScriptCore:
authorggaren <ggaren@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 30 Aug 2006 18:45:07 +0000 (18:45 +0000)
committerggaren <ggaren@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 30 Aug 2006 18:45:07 +0000 (18:45 +0000)
        Reviewed, tweaked by ggaren.

        - Added storage and accessor functions for ExecState as a fix for
          http://bugzilla.opendarwin.org/show_bug.cgi?id=10114

        * kjs/ExecState.cpp:
        (KJS::ExecState::ExecState):
        * kjs/ExecState.h:
        * kjs/context.h:
        (KJS::Context::setExecState):
        (KJS::Context::execState):

LayoutTests:

        Reviewed by ggaren.

        - Updated test to check for exceptions thrown in a plug-in.  This is
          a test for http://bugzilla.opendarwin.org/show_bug.cgi?id=10114.
        * plugins/bindings-test-expected.txt:
        * plugins/bindings-test.html:

WebCore:

        Reviewed, tweaked by ggaren.

        - Changed to use ExecState on current context rather than global.
          Part of the fix for http://bugzilla.opendarwin.org/show_bug.cgi?id=10114
        * bindings/objc/WebScriptObject.mm:
        (+[WebScriptObject throwException:]):
        (-[WebScriptObject setException:]):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@16117 268f45cc-cd09-0410-ab3c-d52691b4dbfc

JavaScriptCore/ChangeLog
JavaScriptCore/kjs/context.h
JavaScriptCore/kjs/function.cpp
JavaScriptCore/kjs/interpreter.cpp
LayoutTests/ChangeLog
LayoutTests/plugins/bindings-test-expected.txt
LayoutTests/plugins/bindings-test.html
WebCore/ChangeLog
WebCore/bindings/objc/WebScriptObject.mm

index 35f98b825e61f5ef9ef0ae3e9d083f856a8b1dac..7f2d4a1abbec3882b01948a0835d6433ac4f8c15 100644 (file)
@@ -1,3 +1,17 @@
+2006-08-29  waylonis  <waylonis@google.com>
+
+        Reviewed, tweaked by ggaren.
+
+        - Added storage and accessor functions for ExecState as a fix for
+          http://bugzilla.opendarwin.org/show_bug.cgi?id=10114
+        
+        * kjs/ExecState.cpp:
+        (KJS::ExecState::ExecState):
+        * kjs/ExecState.h:
+        * kjs/context.h:
+        (KJS::Context::setExecState):
+        (KJS::Context::execState):
+
 2006-08-30  Nikolas Zimmermann  <zimmermann@kde.org>
 
         Reviewed by Tim H.
index cc854ac387d1f6cca24c922103b7ca658137c845..f76e17da105c90fd334525d764613e6a6269fe4b 100644 (file)
@@ -29,6 +29,8 @@
 
 namespace KJS  {
 
+  class ExecState;
+  
   /** 
    * @short Execution context.
    *
@@ -117,6 +119,9 @@ namespace KJS  {
         
     void mark();
 
+    void setExecState(ExecState* exec) { m_execState = exec; }
+    ExecState* execState() { return m_execState; }
+
   private:
     // Contexts are always stack-allocated, and the garbage collector
     // marks the stack, so we don't need to protect the objects below from GC.
@@ -124,6 +129,7 @@ namespace KJS  {
     Interpreter* m_interpreter;
     Context* m_callingContext;
     FunctionBodyNode* m_currentBody;
+    ExecState* m_execState;
 
     FunctionImp* m_function;
     const List* m_arguments;
index 20a4be945d70fda8d01382d8420c18e4f9f54d36..106bf613daa001da6a48a1692ef9ba11cfd751ce 100644 (file)
@@ -82,6 +82,7 @@ JSValue *FunctionImp::callAsFunction(ExecState* exec, JSObject* thisObj, const L
   ExecState newExec(exec->dynamicInterpreter(), &ctx);
   if (exec->hadException())
     newExec.setException(exec->exception());
+  ctx.setExecState(&newExec);
 
   // assign user supplied arguments to parameters
   processParameters(&newExec, args);
@@ -818,10 +819,10 @@ JSValue *GlobalFuncImp::callAsFunction(ExecState *exec, JSObject */*thisObj*/, c
                        progNode.get(),
                        EvalCode,
                        exec->context());
-        
         ExecState newExec(exec->dynamicInterpreter(), &ctx);
         if (exec->hadException())
             newExec.setException(exec->exception());
+        ctx.setExecState(&newExec);
         
         // execute the code
         progNode->processVarDecls(&newExec);
index 9f364b8c49ad4bb236e796bf28e07e6854cc90d0..7ce74ea31c4a619e4cf9a99476055287ab7c36e0 100644 (file)
@@ -470,6 +470,7 @@ Completion Interpreter::evaluate(const UString& sourceURL, int startingLineNumbe
         // execute the code
         Context ctx(globalObj, this, thisObj, progNode.get());
         ExecState newExec(this, &ctx);
+        ctx.setExecState(&newExec);
         progNode->processVarDecls(&newExec);
         res = progNode->execute(&newExec);
     }
index 2fda9f5c0dded05be1272288a638afca7ea5f643..483876b69737783456f53d83263ec0faa52025f3 100644 (file)
@@ -1,3 +1,12 @@
+2006-08-29  waylonis  <waylonis@google.com>
+
+        Reviewed by ggaren.
+
+        - Updated test to check for exceptions thrown in a plug-in.  This is
+          a test for http://bugzilla.opendarwin.org/show_bug.cgi?id=10114.
+        * plugins/bindings-test-expected.txt:
+        * plugins/bindings-test.html:
+
 2006-08-29  Darin Adler  <darin@apple.com>
 
         Reviewed by Hyatt.
index e77469dbd4924ede5ace30addb96aa8eccb11702..dd9cd62bdffb4429568fdbd4f8bb3f6c24600a3c 100644 (file)
@@ -10,6 +10,8 @@ ALERT: null = null (same)
 ALERT: object = object (same)
 ALERT: one,two = one,two (same)
 ALERT: object = object (same)
+ALERT: String Hello == Hello
+ALERT: String Not Hello != Hello
 ALERT: typeof(cPlugin)=function
 ALERT: cPlugin()=1
 ALERT: typeof(cPlugin)=object
index 99b3cf906163b3b1dfc62a13858fca64ca06e338..cecf99f66fc2cd5eb13ae4e930b096a85c6136eb 100644 (file)
@@ -47,6 +47,21 @@ function doTest()
         echoTest(42);
         echoTest(null);
         echoTest(new Array("one", "two"));
+        
+        // Test exceptions
+        function exceptionTest(arg) {
+               try {
+                       objCPlugin.throwIfArgumentIsNotHello(arg);
+               } catch (e) {
+                       alert("String " + arg + " != Hello");
+                       return;
+               }
+               
+               alert("String " + arg + " == Hello");
+        }
+        
+        exceptionTest("Hello");
+        exceptionTest("Not Hello");
     }
     
     // Test the C plugin
index cb4a676067b2e2020a27eb1458f03a14052f32d2..29f7c2c34ba82baccfd928afbb9b2ca274c86c51 100644 (file)
@@ -1,3 +1,13 @@
+2006-08-29  waylonis  <waylonis@google.com>
+
+        Reviewed, tweaked by ggaren.
+        
+        - Changed to use ExecState on current context rather than global.
+          Part of the fix for http://bugzilla.opendarwin.org/show_bug.cgi?id=10114
+        * bindings/objc/WebScriptObject.mm:
+        (+[WebScriptObject throwException:]):
+        (-[WebScriptObject setException:]):
+
 2006-08-30  Adele Peterson  <adele@apple.com>
 
         Reviewed by Darin.
index 16ca0d3d66f9c05dd7479d751cae19762efa7540..db372d46b3431cf51c67f9b0deab9686ab1d1335 100644 (file)
@@ -26,6 +26,7 @@
 #import "config.h"
 #import "WebScriptObjectPrivate.h"
 
+#import <JavaScriptCore/context.h>
 #import <JavaScriptCore/objc_instance.h>
 #import <JavaScriptCore/runtime_object.h>
 
@@ -137,11 +138,14 @@ static void _didExecute(WebScriptObject *obj)
     // in which case this will have to change.
     first = interp;
     do {
-        ExecState *exec = interp->globalExec();
         // If the interpreter has a context, we set the exception.
         if (interp->context()) {
-            throwError(exec, GeneralError, exceptionMessage);
-            return YES;
+            ExecState *exec = interp->context()->execState();
+            
+            if (exec) {
+                throwError(exec, GeneralError, exceptionMessage);
+                return YES;
+            }
         }
         interp = interp->nextInterpreter();
     } while (interp != first);
@@ -388,8 +392,15 @@ static List listFromNSArray(ExecState *exec, NSArray *array)
 
 - (void)setException:(NSString *)description
 {
-    if (const RootObject *root = [self _executionContext])
-        throwError(root->interpreter()->globalExec(), GeneralError, description);
+    if (const RootObject *root = [self _executionContext]) {
+        if (root->interpreter()->context()) {
+            ExecState *exec = root->interpreter()->context()->execState();
+
+            ASSERT(exec);
+            throwError(exec, GeneralError, description);
+        } else
+            throwError(root->interpreter()->globalExec(), GeneralError, description);
+    }
 }
 
 + (id)_convertValueToObjcValue:(JSValue *)value originExecutionContext:(const RootObject *)originExecutionContext executionContext:(const RootObject *)executionContext