]> git.saurik.com Git - apple/javascriptcore.git/blobdiff - interpreter/CachedCall.h
JavaScriptCore-7600.1.4.17.5.tar.gz
[apple/javascriptcore.git] / interpreter / CachedCall.h
index eb48a03d67a55ac1ee249fc251b244c2ba245e5f..30cad2a14ffdbfb4d57cf5a12fcb900e264f876b 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2009 Apple Inc. All rights reserved.
+ * Copyright (C) 2009, 2013 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
 #define CachedCall_h
 
 #include "CallFrameClosure.h"
+#include "ExceptionHelpers.h"
 #include "JSFunction.h"
 #include "JSGlobalObject.h"
 #include "Interpreter.h"
+#include "ProtoCallFrame.h"
+#include "VMEntryScope.h"
 
 namespace JSC {
-    class CachedCall : public Noncopyable {
+    class CachedCall {
+        WTF_MAKE_NONCOPYABLE(CachedCall); WTF_MAKE_FAST_ALLOCATED;
     public:
-        CachedCall(CallFrame* callFrame, JSFunction* function, int argCount, JSValue* exception)
+        CachedCall(CallFrame* callFrame, JSFunction* function, int argumentCount)
             : m_valid(false)
             , m_interpreter(callFrame->interpreter())
-            , m_exception(exception)
-            , m_globalObjectScope(callFrame, function->scope().globalObject())
+            , m_entryScope(callFrame->vm(), function->scope()->globalObject())
         {
-            ASSERT(!function->isHostFunction());
-            m_closure = m_interpreter->prepareForRepeatCall(function->jsExecutable(), callFrame, function, argCount, function->scope().node(), exception);
-            m_valid = !*exception;
+            ASSERT(!function->isHostFunctionNonInline());
+            if (callFrame->vm().isSafeToRecurse()) {
+                m_arguments.resize(argumentCount);
+                m_closure = m_interpreter->prepareForRepeatCall(function->jsExecutable(), callFrame, &m_protoCallFrame, function, argumentCount + 1, function->scope(), m_arguments.data());
+            } else
+                throwStackOverflowError(callFrame);
+            m_valid = !callFrame->hadException();
         }
         
         JSValue call()
         { 
             ASSERT(m_valid);
-            return m_interpreter->execute(m_closure, m_exception);
+            return m_interpreter->execute(m_closure);
         }
-        void setThis(JSValue v) { m_closure.setArgument(0, v); }
-        void setArgument(int n, JSValue v) { m_closure.setArgument(n + 1, v); }
+        void setThis(JSValue v) { m_protoCallFrame.setThisValue(v); }
+        void setArgument(int n, JSValue v) { m_protoCallFrame.setArgument(n, v); }
 
-        CallFrame* newCallFrame(ExecState* exec)
-        {
-            CallFrame* callFrame = m_closure.newCallFrame;
-            callFrame->setScopeChain(exec->scopeChain());
-            return callFrame;
-        }
-
-        ~CachedCall()
-        {
-            if (m_valid)
-                m_interpreter->endRepeatCall(m_closure);
-        }
-        
     private:
         bool m_valid;
         Interpreter* m_interpreter;
-        JSValue* m_exception;
-        DynamicGlobalObjectScope m_globalObjectScope;
+        VMEntryScope m_entryScope;
+        ProtoCallFrame m_protoCallFrame;
+        Vector<JSValue> m_arguments;
         CallFrameClosure m_closure;
     };
 }