source: webkit/trunk/JavaScriptCore/API/JSContextRef.cpp@ 26625

Last change on this file since 26625 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: 2.8 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#include <wtf/Platform.h>
28#include "APICast.h"
29#include "JSContextRef.h"
30
31#include "JSCallbackObject.h"
32#include "completion.h"
33#include "interpreter.h"
34#include "object.h"
35
36using namespace KJS;
37
38JSGlobalContextRef JSGlobalContextCreate(JSClassRef globalObjectClass)
39{
40 JSLock lock;
41
42 JSObject* globalObject;
43 if (globalObjectClass)
44 // Specify jsNull() as the prototype. Interpreter will fix it up to point at builtinObjectPrototype() in its constructor
45 globalObject = new JSCallbackObject(0, globalObjectClass, jsNull(), 0);
46 else
47 globalObject = new JSObject();
48
49 Interpreter* interpreter = new Interpreter(globalObject); // adds the built-in object prototype to the global object
50 if (globalObjectClass)
51 static_cast<JSCallbackObject*>(globalObject)->initializeIfNeeded(interpreter->globalExec());
52 JSGlobalContextRef ctx = reinterpret_cast<JSGlobalContextRef>(interpreter->globalExec());
53 return JSGlobalContextRetain(ctx);
54}
55
56JSGlobalContextRef JSGlobalContextRetain(JSGlobalContextRef ctx)
57{
58 JSLock lock;
59 ExecState* exec = toJS(ctx);
60 exec->dynamicInterpreter()->ref();
61 return ctx;
62}
63
64void JSGlobalContextRelease(JSGlobalContextRef ctx)
65{
66 JSLock lock;
67 ExecState* exec = toJS(ctx);
68 exec->dynamicInterpreter()->deref();
69}
70
71JSObjectRef JSContextGetGlobalObject(JSContextRef ctx)
72{
73 ExecState* exec = toJS(ctx);
74 return toRef(exec->dynamicInterpreter()->globalObject());
75}
Note: See TracBrowser for help on using the repository browser.