Remove JAVASCRIPT_PROFILER define
[WebKit-https.git] / JavaScriptCore / VM / Machine.cpp
index 7ef1f73..177a748 100644 (file)
@@ -38,6 +38,7 @@
 #include "JSLock.h"
 #include "JSPropertyNameIterator.h"
 #include "Parser.h"
+#include "Profiler.h"
 #include "Register.h"
 #include "array_object.h"
 #include "debugger.h"
@@ -436,8 +437,13 @@ static NEVER_INLINE bool isNotObject(ExecState* exec, const Instruction*, CodeBl
     return true;
 }
 
-static NEVER_INLINE JSValue* eval(ExecState* exec, JSObject* thisObj, ScopeChainNode* scopeChain, RegisterFile* registerFile, Register* r, int argv, int argc, JSValue*& exceptionValue)
+static NEVER_INLINE JSValue* callEval(ExecState* exec, JSObject* thisObj, ScopeChainNode* scopeChain, RegisterFile* registerFile, Register* r, int argv, int argc, JSValue*& exceptionValue)
 {
+    Profiler** profiler = Profiler::enabledProfilerReference();
+    JSObject* evalFunction = scopeChain->globalObject()->evalFunction();
+    if (*profiler)
+        (*profiler)->willExecute(exec, evalFunction);
+
     JSValue* x = argc >= 2 ? r[argv + 1].u.jsValue : jsUndefined();
     
     if (!x->isString())
@@ -460,7 +466,12 @@ static NEVER_INLINE JSValue* eval(ExecState* exec, JSObject* thisObj, ScopeChain
         return 0;
     }
 
-    return machine().execute(evalNode.get(), exec, thisObj, registerFile, r - (*registerFile->basePointer()) + argv + argc, scopeChain, &exceptionValue);
+    JSValue* result = machine().execute(evalNode.get(), exec, thisObj, registerFile, r - (*registerFile->basePointer()) + argv + argc, scopeChain, &exceptionValue);
+
+    if ((*profiler))
+        (*profiler)->didExecute(exec, evalFunction);
+
+    return result;
 }
 
 Machine& machine()
@@ -589,6 +600,9 @@ NEVER_INLINE bool Machine::unwindCallFrame(ExecState* exec, JSValue* exceptionVa
     r = (*registerBase) + callerRegisterOffset;
     exec->m_callFrameOffset = callerRegisterOffset - codeBlock->numLocals - CallFrameHeaderSize;
     vPC = callFrame[ReturnVPC].u.vPC;
+
+    if (Profiler* profiler = *Profiler::enabledProfilerReference())
+        profiler->didExecute(exec, callFrame[Callee].u.jsObject);
     return true;
 }
 
@@ -649,7 +663,11 @@ JSValue* Machine::execute(ProgramNode* programNode, ExecState* exec, ScopeChainN
     
     if (codeBlock->needsFullScopeChain)
         scopeChain = scopeChain->copy();
-    
+
+    Profiler** profiler = Profiler::enabledProfilerReference();
+    if (*profiler)
+        (*profiler)->willExecute(exec, programNode->sourceURL(), programNode->lineNo());
+
     ExecState newExec(exec, this, registerFile, scopeChain, -1);
 
     m_reentryDepth++;
@@ -657,6 +675,10 @@ JSValue* Machine::execute(ProgramNode* programNode, ExecState* exec, ScopeChainN
     m_reentryDepth--;
 
     registerFileStack->popGlobalRegisterFile();
+
+    if (*profiler)
+        (*profiler)->didExecute(exec, programNode->sourceURL(), programNode->lineNo());
+
     return result;
 }
 
@@ -704,14 +726,20 @@ JSValue* Machine::execute(FunctionBodyNode* functionBodyNode, ExecState* exec, F
     scopeChain = scopeChainForCall(functionBodyNode, newCodeBlock, scopeChain, registerBase, r);            
 
     ExecState newExec(exec, this, registerFile, scopeChain, callFrameOffset);
+    
+    Profiler** profiler = Profiler::enabledProfilerReference();
+    if (*profiler)
+        (*profiler)->willExecute(exec, function);
 
     m_reentryDepth++;
     JSValue* result = privateExecute(Normal, &newExec, registerFile, r, scopeChain, newCodeBlock, exception);
     m_reentryDepth--;
 
+    if (*profiler)
+        (*profiler)->didExecute(exec, function);
+
     registerFile->shrink(oldSize);
     return result;
-    
 }
 
 JSValue* Machine::execute(EvalNode* evalNode, ExecState* exec, JSObject* thisObj, RegisterFile* registerFile, int registerOffset, ScopeChainNode* scopeChain, JSValue** exception)
@@ -720,6 +748,7 @@ JSValue* Machine::execute(EvalNode* evalNode, ExecState* exec, JSObject* thisObj
         *exception = createStackOverflowError(exec);
         return 0;
     }
+
     EvalCodeBlock* codeBlock = &evalNode->code(scopeChain);
     
     JSVariableObject* variableObject;
@@ -760,6 +789,10 @@ JSValue* Machine::execute(EvalNode* evalNode, ExecState* exec, JSObject* thisObj
     if (codeBlock->needsFullScopeChain)
         scopeChain = scopeChain->copy();
 
+    Profiler** profiler = Profiler::enabledProfilerReference();
+    if (*profiler)
+        (*profiler)->willExecute(exec, evalNode->sourceURL(), evalNode->lineNo());
+
     ExecState newExec(exec, this, registerFile, scopeChain, -1);
 
     m_reentryDepth++;
@@ -767,6 +800,10 @@ JSValue* Machine::execute(EvalNode* evalNode, ExecState* exec, JSObject* thisObj
     m_reentryDepth--;
 
     registerFile->shrink(oldSize);
+
+    if (*profiler)
+        (*profiler)->didExecute(exec, evalNode->sourceURL(), evalNode->lineNo());
+
     return result;
 }
 
@@ -837,11 +874,20 @@ JSValue* Machine::privateExecute(ExecutionFlag flag, ExecState* exec, RegisterFi
 
     JSValue* exceptionValue = 0;
     Instruction* handlerVPC = 0;
-    
+
     Register** registerBase = registerFile->basePointer();
     Instruction* vPC = codeBlock->instructions.begin();
     JSValue** k = codeBlock->jsValues.data();
+    Profiler** enabledProfilerReference = Profiler::enabledProfilerReference();
     
+#if HAVE(COMPUTED_GOTO)
+    // Yet another hack around GCC's various foibles, in this case fetching the
+    // profiler reference results in a regression.  Removing this indirection
+    // results in a 0.8% regression.
+    goto *(&&profilerFetchHack);
+    profilerFetchHack:
+#endif
+
     registerFile->setSafeForReentry(false);
 #define VM_CHECK_EXCEPTION() \
      do { \
@@ -1813,7 +1859,9 @@ JSValue* Machine::privateExecute(ExecutionFlag flag, ExecState* exec, RegisterFi
             JSObject* thisObject = r[codeBlock->thisRegister].u.jsObject;
 
             registerFile->setSafeForReentry(true);
-            JSValue* result = eval(exec, thisObject, scopeChain, registerFile, r, argv, argc, exceptionValue);
+
+            JSValue* result = callEval(exec, thisObject, scopeChain, registerFile, r, argv, argc, exceptionValue);
+
             registerFile->setSafeForReentry(false);
             r = (*registerBase) + registerOffset;
 
@@ -1853,6 +1901,8 @@ JSValue* Machine::privateExecute(ExecutionFlag flag, ExecState* exec, RegisterFi
         CallType callType = v->getCallData(callData);
         
         if (callType == CallTypeJS) {
+            if (*enabledProfilerReference)
+                (*enabledProfilerReference)->willExecute(exec, static_cast<JSObject*>(v));
             int registerOffset = r - (*registerBase);
             Register* callFrame = r + argv - CallFrameHeaderSize;
             int callFrameOffset = registerOffset + argv - CallFrameHeaderSize;
@@ -1878,8 +1928,10 @@ JSValue* Machine::privateExecute(ExecutionFlag flag, ExecState* exec, RegisterFi
         }
 
         if (callType == CallTypeNative) {
+            if (*enabledProfilerReference)
+                (*enabledProfilerReference)->willExecute(exec, static_cast<JSObject*>(v));
             int registerOffset = r - (*registerBase);
-            
+
             r[argv].u.jsValue = base == missingThisObjectMarker() ? exec->globalThisValue() : (r[base].u.jsValue)->toObject(exec); // "this" value
             JSObject* thisObj = static_cast<JSObject*>(r[argv].u.jsValue);
 
@@ -1892,6 +1944,8 @@ JSValue* Machine::privateExecute(ExecutionFlag flag, ExecState* exec, RegisterFi
             r = (*registerBase) + registerOffset;
             r[dst].u.jsValue = returnValue;
 
+            if (*enabledProfilerReference)
+                (*enabledProfilerReference)->didExecute(exec, static_cast<JSObject*>(v));
             VM_CHECK_EXCEPTION();
 
             ++vPC;
@@ -1937,7 +1991,10 @@ JSValue* Machine::privateExecute(ExecutionFlag flag, ExecState* exec, RegisterFi
         exec->m_callFrameOffset = callerRegisterOffset - codeBlock->numLocals - CallFrameHeaderSize;
         int r0 = callFrame[ReturnValueRegister].u.i;
         r[r0].u.jsValue = returnValue;
-        
+
+        if (*enabledProfilerReference)
+            (*enabledProfilerReference)->didExecute(exec, callFrame[Callee].u.jsObject);
+
         NEXT_OPCODE;
     }
     BEGIN_OPCODE(op_construct) {
@@ -1955,6 +2012,9 @@ JSValue* Machine::privateExecute(ExecutionFlag flag, ExecState* exec, RegisterFi
         JSObject* constructor = static_cast<JSObject*>(funcVal);
 
         if (constructType == ConstructTypeJS) {
+            if (*enabledProfilerReference)
+                (*enabledProfilerReference)->willExecute(exec, constructor);
+
             int registerOffset = r - (*registerBase);
             Register* callFrame = r + argv - CallFrameHeaderSize;
             int callFrameOffset = registerOffset + argv - CallFrameHeaderSize;
@@ -1988,6 +2048,9 @@ JSValue* Machine::privateExecute(ExecutionFlag flag, ExecState* exec, RegisterFi
         }
 
         if (constructType == ConstructTypeNative) {
+            if (*enabledProfilerReference)
+                (*enabledProfilerReference)->willExecute(exec, constructor);
+
             int registerOffset = r - (*registerBase);
 
             List args(&r[argv + 1].u.jsValue, argc - 1);
@@ -1999,6 +2062,9 @@ JSValue* Machine::privateExecute(ExecutionFlag flag, ExecState* exec, RegisterFi
             VM_CHECK_EXCEPTION();
             r[dst].u.jsValue = returnValue;
 
+            if (*enabledProfilerReference)
+                (*enabledProfilerReference)->didExecute(exec, constructor);
+
             ++vPC;
             NEXT_OPCODE;
         }