source: webkit/trunk/JavaScriptCore/API/JSCallbackObject.h@ 25257

Last change on this file since 25257 was 25257, checked in by bdash, 18 years ago

2007-08-26 Mark Rowe <[email protected]>

Reviewed by Darin Adler.

<rdar://problem/4949002> JSGlobalContextCreate can cause crashes because it passes a NULL JSContextRef to the globalObjectClass's initialize callback

JSCallbackObject now tracks whether it was constructed with a null ExecState. This will happen when the object is being used as the global object,
as the Interpreter needs to be created after the global object. In this situation the initialization is deferred until after the Interpreter's
ExecState is available to be passed down to the initialize callbacks.

  • API/JSCallbackObject.cpp: (KJS::JSCallbackObject::init): Track whether we successfully initialized. (KJS::JSCallbackObject::initializeIfNeeded): Attempt to initialize with the new ExecState.
  • API/JSCallbackObject.h:
  • API/JSContextRef.cpp: (JSGlobalContextCreate): Initialize the JSCallbackObject with the Interpreter's ExecState.
  • API/testapi.c: (testInitializeOfGlobalObjectClassHasNonNullContext): (main): Verify that the context passed to the initialize callback is non-null.
File size: 3.6 KB
Line 
1// -*- mode: c++; c-basic-offset: 4 -*-
2/*
3 * Copyright (C) 2006 Apple Computer, Inc. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
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 *
14 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
15 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
18 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
22 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 */
26
27#ifndef JSCallbackObject_h
28#define JSCallbackObject_h
29
30#include "JSObjectRef.h"
31#include "JSValueRef.h"
32#include "object.h"
33
34namespace KJS {
35
36class JSCallbackObject : public JSObject
37{
38public:
39 JSCallbackObject(ExecState*, JSClassRef, JSValue* prototype, void* data);
40 virtual ~JSCallbackObject();
41
42 virtual UString className() const;
43
44 virtual bool getOwnPropertySlot(ExecState*, const Identifier&, PropertySlot&);
45 virtual bool getOwnPropertySlot(ExecState*, unsigned, PropertySlot&);
46
47 virtual void put(ExecState*, const Identifier&, JSValue*, int attr);
48 virtual void put(ExecState*, unsigned, JSValue*, int attr);
49
50 virtual bool deleteProperty(ExecState*, const Identifier&);
51 virtual bool deleteProperty(ExecState*, unsigned);
52
53 virtual bool implementsConstruct() const;
54 virtual JSObject* construct(ExecState*, const List& args);
55
56 virtual bool implementsHasInstance() const;
57 virtual bool hasInstance(ExecState *exec, JSValue *value);
58
59 virtual bool implementsCall() const;
60 virtual JSValue* callAsFunction(ExecState*, JSObject* thisObj, const List &args);
61
62 virtual void getPropertyNames(ExecState*, PropertyNameArray&);
63
64 virtual double toNumber(ExecState*) const;
65 virtual UString toString(ExecState*) const;
66
67 void setPrivate(void* data);
68 void* getPrivate();
69
70 virtual const ClassInfo *classInfo() const { return &info; }
71 static const ClassInfo info;
72
73 bool inherits(JSClassRef) const;
74
75 void initializeIfNeeded(ExecState*);
76
77private:
78 JSCallbackObject(); // prevent default construction
79 JSCallbackObject(const JSCallbackObject&);
80
81 void init(ExecState*, JSClassRef jsClass, void*);
82
83 static JSValue* cachedValueGetter(ExecState*, JSObject*, const Identifier&, const PropertySlot&);
84 static JSValue* staticValueGetter(ExecState*, JSObject*, const Identifier&, const PropertySlot& slot);
85 static JSValue* staticFunctionGetter(ExecState*, JSObject*, const Identifier&, const PropertySlot& slot);
86 static JSValue* callbackGetter(ExecState*, JSObject*, const Identifier&, const PropertySlot&);
87
88 void* m_privateData;
89 JSClassRef m_class;
90 bool m_isInitialized;
91};
92
93} // namespace KJS
94
95#endif // JSCallbackObject_h
Note: See TracBrowser for help on using the repository browser.