1 /* 2 * Copyright (C) 2007 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 #include "config.h" 30 #include "GCController.h" 31 32 #include <JavaScriptCore/JSObjectRef.h> 33 #include <JavaScriptCore/JSRetainPtr.h> 34 35 GCController::GCController() 36 { 37 } 38 39 GCController::~GCController() 40 { 41 } 42 43 // Static Functions 44 45 static JSValueRef collectCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) 46 { 47 GCController* controller = static_cast<GCController*>(JSObjectGetPrivate(thisObject)); 48 controller->collect(); 49 return JSValueMakeUndefined(context); 50 } 51 52 static JSValueRef collectOnAlternateThreadCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) 53 { 54 bool waitUntilDone = false; 55 if (argumentCount > 0) 56 waitUntilDone = JSValueToBoolean(context, arguments[0]); 57 58 GCController* controller = static_cast<GCController*>(JSObjectGetPrivate(thisObject)); 59 controller->collectOnAlternateThread(waitUntilDone); 60 61 return JSValueMakeUndefined(context); 62 } 63 64 static JSValueRef getJSObjectCountCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) 65 { 66 GCController* controller = static_cast<GCController*>(JSObjectGetPrivate(thisObject)); 67 size_t jsObjectCount = controller->getJSObjectCount(); 68 69 return JSValueMakeNumber(context, jsObjectCount); 70 } 71 72 // Object Creation 73 74 void GCController::makeWindowObject(JSContextRef context, JSObjectRef windowObject, JSValueRef* exception) 75 { 76 JSRetainPtr<JSStringRef> gcControllerStr(Adopt, JSStringCreateWithUTF8CString("GCController")); 77 78 JSClassRef classRef = getJSClass(); 79 JSValueRef gcControllerObject = JSObjectMake(context, classRef, this); 80 JSClassRelease(classRef); 81 82 JSObjectSetProperty(context, windowObject, gcControllerStr.get(), gcControllerObject, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete, exception); 83 } 84 85 JSClassRef GCController::getJSClass() 86 { 87 static JSStaticFunction staticFunctions[] = { 88 { "collect", collectCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, 89 { "collectOnAlternateThread", collectOnAlternateThreadCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, 90 { "getJSObjectCount", getJSObjectCountCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, 91 { 0, 0, 0 } 92 }; 93 94 static JSClassDefinition classDefinition = { 95 0, kJSClassAttributeNone, "GCController", 0, 0, staticFunctions, 96 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 97 }; 98 99 return JSClassCreate(&classDefinition); 100 } 101