source: webkit/trunk/JavaScriptCore/runtime/JSGlobalData.h@ 57879

Last change on this file since 57879 was 57192, checked in by [email protected], 15 years ago

2010-04-06 Adam Barth <[email protected]>

Reviewed by Eric Seidel.

REGRESSION: Worker termination via JS timeout may cause worker tests like fast/workers/worker-terminate.html fail.
https://bugs.webkit.org/show_bug.cgi?id=36646

Add a new exception type for forcibly terminating a JavaScript stack.
The new exception functions similarly to the
InterruptedExecutionException but is conceptually different because
execution is terminated instead of just interrupted.

  • GNUmakefile.am:
    • Added new Terminator.h file.
  • JavaScriptCore.gypi:
    • Added new Terminator.h file.
  • JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
    • Added new Terminator.h file.
  • JavaScriptCore.xcodeproj/project.pbxproj:
    • Added new Terminator.h file.
  • interpreter/Interpreter.cpp: (JSC::Interpreter::throwException):
    • Fully unwind the stack for TerminatedExecutionException.

(JSC::Interpreter::privateExecute):

  • Check if we've been terminated at the same time we check if we've timed out.
  • jit/JITStubs.cpp: (JSC::DEFINE_STUB_FUNCTION):
    • Check if we've been terminated at the same time we check if we've timed out.
  • runtime/Completion.cpp:
    • Some exceptions define special completion types so that calls can see why we terminated evaluation.

(JSC::evaluate):

  • runtime/Completion.h:
    • Define a new completion type for termination.

(JSC::):

  • runtime/ExceptionHelpers.cpp:
    • Define TerminatedExecutionException and refactor pseudo-RTTI virtual function to be more semantic.

(JSC::InterruptedExecutionError::exceptionType):
(JSC::TerminatedExecutionError::TerminatedExecutionError):
(JSC::TerminatedExecutionError::exceptionType):
(JSC::TerminatedExecutionError::toString):
(JSC::createTerminatedExecutionException):

  • runtime/ExceptionHelpers.h:
    • Entry point for generating a TerminatedExecutionException.
  • runtime/JSGlobalData.cpp: (JSC::JSGlobalData::JSGlobalData):
    • Add a Terminator object that can be used to asynchronously terminate a JavaScript execution stack.
  • runtime/JSGlobalData.h:
  • runtime/JSObject.h: (JSC::JSObject::exceptionType):
    • Define that, by default, thrown objects have a normal exception type.
  • runtime/Terminator.h: Added.
    • Added a new controller object that can be used to terminate execution asynchronously. This object is more or less a glorified bool.

(JSC::Terminator::Terminator):
(JSC::Terminator::termianteSoon):
(JSC::Terminator::shouldTerminate):

2010-04-06 Adam Barth <[email protected]>

Reviewed by Eric Seidel.

REGRESSION: Worker termination via JS timeout may cause worker tests like fast/workers/worker-terminate.html fail.
https://bugs.webkit.org/show_bug.cgi?id=36646

  • fast/workers/resources/worker-run-forever.js: Added.
  • fast/workers/worker-terminate-forever-expected.txt: Added.
  • fast/workers/worker-terminate-forever.html: Added.
    • Test what happens when we terminate an infinitely running worker. The essential point is that we don't spam the console with nonsense about a timeout.
  • platform/mac/Skipped:
    • Rescue worker-terminate.html from the Skipped list now that we've fixed the underlying bug that was causing the flakiness.

2010-04-06 Adam Barth <[email protected]>

Reviewed by Eric Seidel.

REGRESSION: Worker termination via JS timeout may cause worker tests like fast/workers/worker-terminate.html fail.
https://bugs.webkit.org/show_bug.cgi?id=36646

Cause the worker code to swallow termination exceptions because these
need not be reported to the user because they are an implementation
detail of how we terminate worker execution.

Test: fast/workers/worker-terminate-forever.html

  • bindings/js/JSDOMBinding.cpp: (WebCore::reportException):
    • Refuse to report termination exceptions to the user because they are an implementation detail.
  • bindings/js/WorkerScriptController.cpp: (WebCore::WorkerScriptController::forbidExecution):
    • Instead of using timeouts to stop run away workers, use our fancy new Terminator object.
  • Property svn:eol-style set to native
File size: 6.4 KB
Line 
1/*
2 * Copyright (C) 2008, 2009 Apple Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
14 * its contributors may be used to endorse or promote products derived
15 * from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
18 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
21 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29#ifndef JSGlobalData_h
30#define JSGlobalData_h
31
32#include "Collector.h"
33#include "DateInstanceCache.h"
34#include "ExecutableAllocator.h"
35#include "JITStubs.h"
36#include "JSValue.h"
37#include "MarkStack.h"
38#include "NumericStrings.h"
39#include "SmallStrings.h"
40#include "Terminator.h"
41#include "TimeoutChecker.h"
42#include "WeakRandom.h"
43#include <wtf/Forward.h>
44#include <wtf/HashMap.h>
45#include <wtf/RefCounted.h>
46
47struct OpaqueJSClass;
48struct OpaqueJSClassContextData;
49
50namespace JSC {
51
52 class CodeBlock;
53 class CommonIdentifiers;
54 class IdentifierTable;
55 class Interpreter;
56 class JSGlobalObject;
57 class JSObject;
58 class Lexer;
59 class Parser;
60 class Stringifier;
61 class Structure;
62 class UString;
63
64 struct HashTable;
65 struct Instruction;
66
67 struct DSTOffsetCache {
68 DSTOffsetCache()
69 {
70 reset();
71 }
72
73 void reset()
74 {
75 offset = 0.0;
76 start = 0.0;
77 end = -1.0;
78 increment = 0.0;
79 }
80
81 double offset;
82 double start;
83 double end;
84 double increment;
85 };
86
87 class JSGlobalData : public RefCounted<JSGlobalData> {
88 public:
89 struct ClientData {
90 virtual ~ClientData() = 0;
91 };
92
93 static bool sharedInstanceExists();
94 static JSGlobalData& sharedInstance();
95
96 static PassRefPtr<JSGlobalData> create();
97 static PassRefPtr<JSGlobalData> createLeaked();
98 static PassRefPtr<JSGlobalData> createNonDefault();
99 ~JSGlobalData();
100
101#if ENABLE(JSC_MULTIPLE_THREADS)
102 // Will start tracking threads that use the heap, which is resource-heavy.
103 void makeUsableFromMultipleThreads() { heap.makeUsableFromMultipleThreads(); }
104#endif
105
106 bool isSharedInstance;
107 ClientData* clientData;
108
109 const HashTable* arrayTable;
110 const HashTable* dateTable;
111 const HashTable* jsonTable;
112 const HashTable* mathTable;
113 const HashTable* numberTable;
114 const HashTable* regExpTable;
115 const HashTable* regExpConstructorTable;
116 const HashTable* stringTable;
117
118 RefPtr<Structure> activationStructure;
119 RefPtr<Structure> interruptedExecutionErrorStructure;
120 RefPtr<Structure> terminatedExecutionErrorStructure;
121 RefPtr<Structure> staticScopeStructure;
122 RefPtr<Structure> stringStructure;
123 RefPtr<Structure> notAnObjectErrorStubStructure;
124 RefPtr<Structure> notAnObjectStructure;
125 RefPtr<Structure> propertyNameIteratorStructure;
126 RefPtr<Structure> getterSetterStructure;
127 RefPtr<Structure> apiWrapperStructure;
128 RefPtr<Structure> dummyMarkableCellStructure;
129
130#if USE(JSVALUE32)
131 RefPtr<Structure> numberStructure;
132#endif
133
134 static void storeVPtrs();
135 static JS_EXPORTDATA void* jsArrayVPtr;
136 static JS_EXPORTDATA void* jsByteArrayVPtr;
137 static JS_EXPORTDATA void* jsStringVPtr;
138 static JS_EXPORTDATA void* jsFunctionVPtr;
139
140 IdentifierTable* identifierTable;
141 CommonIdentifiers* propertyNames;
142 const MarkedArgumentBuffer* emptyList; // Lists are supposed to be allocated on the stack to have their elements properly marked, which is not the case here - but this list has nothing to mark.
143 SmallStrings smallStrings;
144 NumericStrings numericStrings;
145 DateInstanceCache dateInstanceCache;
146
147#if ENABLE(ASSEMBLER)
148 ExecutableAllocator executableAllocator;
149#endif
150
151 Lexer* lexer;
152 Parser* parser;
153 Interpreter* interpreter;
154#if ENABLE(JIT)
155 JITThunks jitStubs;
156#endif
157 TimeoutChecker timeoutChecker;
158 Terminator terminator;
159 Heap heap;
160
161 JSValue exception;
162#if ENABLE(JIT)
163 ReturnAddressPtr exceptionLocation;
164#endif
165
166 const Vector<Instruction>& numericCompareFunction(ExecState*);
167 Vector<Instruction> lazyNumericCompareFunction;
168 bool initializingLazyNumericCompareFunction;
169
170 HashMap<OpaqueJSClass*, OpaqueJSClassContextData*> opaqueJSClassData;
171
172 JSGlobalObject* head;
173 JSGlobalObject* dynamicGlobalObject;
174
175 HashSet<JSObject*> arrayVisitedElements;
176
177 CodeBlock* functionCodeBlockBeingReparsed;
178 Stringifier* firstStringifierToMark;
179
180 MarkStack markStack;
181
182 double cachedUTCOffset;
183 DSTOffsetCache dstOffsetCache;
184
185 UString cachedDateString;
186 double cachedDateStringValue;
187
188 WeakRandom weakRandom;
189
190#ifndef NDEBUG
191 bool mainThreadOnly;
192#endif
193
194 void resetDateCache();
195
196 void startSampling();
197 void stopSampling();
198 void dumpSampleData(ExecState* exec);
199 private:
200 JSGlobalData(bool isShared);
201 static JSGlobalData*& sharedInstanceInternal();
202 void createNativeThunk();
203 };
204
205} // namespace JSC
206
207#endif // JSGlobalData_h
Note: See TracBrowser for help on using the repository browser.