]> 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 04f2210755730040c7e6441dcdc1717337594a6f..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 {
         WTF_MAKE_NONCOPYABLE(CachedCall); WTF_MAKE_FAST_ALLOCATED;
     public:
-        CachedCall(CallFrame* callFrame, JSFunction* function, int argCount)
+        CachedCall(CallFrame* callFrame, JSFunction* function, int argumentCount)
             : m_valid(false)
             , m_interpreter(callFrame->interpreter())
-            , m_globalObjectScope(callFrame->globalData(), function->scope()->globalObject.get())
+            , m_entryScope(callFrame->vm(), function->scope()->globalObject())
         {
-            ASSERT(!function->isHostFunction());
-            m_closure = m_interpreter->prepareForRepeatCall(function->jsExecutable(), callFrame, function, argCount, function->scope());
+            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();
         }
         
@@ -50,26 +57,15 @@ namespace JSC {
             ASSERT(m_valid);
             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;
-        DynamicGlobalObjectScope m_globalObjectScope;
+        VMEntryScope m_entryScope;
+        ProtoCallFrame m_protoCallFrame;
+        Vector<JSValue> m_arguments;
         CallFrameClosure m_closure;
     };
 }