1/* 2 * Copyright (C) 2006, 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 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26#include "config.h" 27#include "JSBase.h" 28#include "JSBasePrivate.h" 29 30#include "APICast.h" 31#include "APIShims.h" 32#include "CallFrame.h" 33#include "Completion.h" 34#include "InitializeThreading.h" 35#include "JSGlobalObject.h" 36#include "JSLock.h" 37#include "JSObject.h" 38#include "OpaqueJSString.h" 39#include "Operations.h" 40#include "SourceCode.h" 41#include <wtf/text/StringHash.h> 42 43using namespace JSC; 44 45JSValueRef JSEvaluateScript(JSContextRef ctx, JSStringRef script, JSObjectRef thisObject, JSStringRef sourceURL, int startingLineNumber, JSValueRef* exception) 46{ 47 if (!ctx) { 48 ASSERT_NOT_REACHED(); 49 return 0; 50 } 51 ExecState* exec = toJS(ctx); 52 APIEntryShim entryShim(exec); 53 54 JSObject* jsThisObject = toJS(thisObject); 55 56 // evaluate sets "this" to the global object if it is NULL 57 JSGlobalObject* globalObject = exec->dynamicGlobalObject(); 58 SourceCode source = makeSource(script->string(), sourceURL->string(), TextPosition(OrdinalNumber::fromOneBasedInt(startingLineNumber), OrdinalNumber::first())); 59 60 JSValue evaluationException; 61 JSValue returnValue = evaluate(globalObject->globalExec(), source, jsThisObject, &evaluationException); 62 63 if (evaluationException) { 64 if (exception) 65 *exception = toRef(exec, evaluationException); 66 return 0; 67 } 68 69 if (returnValue) 70 return toRef(exec, returnValue); 71 72 // happens, for example, when the only statement is an empty (';') statement 73 return toRef(exec, jsUndefined()); 74} 75 76bool JSCheckScriptSyntax(JSContextRef ctx, JSStringRef script, JSStringRef sourceURL, int startingLineNumber, JSValueRef* exception) 77{ 78 if (!ctx) { 79 ASSERT_NOT_REACHED(); 80 return false; 81 } 82 ExecState* exec = toJS(ctx); 83 APIEntryShim entryShim(exec); 84 85 SourceCode source = makeSource(script->string(), sourceURL->string(), TextPosition(OrdinalNumber::fromOneBasedInt(startingLineNumber), OrdinalNumber::first())); 86 87 JSValue syntaxException; 88 bool isValidSyntax = checkSyntax(exec->dynamicGlobalObject()->globalExec(), source, &syntaxException); 89 90 if (!isValidSyntax) { 91 if (exception) 92 *exception = toRef(exec, syntaxException); 93 return false; 94 } 95 96 return true; 97} 98 99void JSGarbageCollect(JSContextRef ctx) 100{ 101 // We used to recommend passing NULL as an argument here, which caused the only heap to be collected. 102 // As there is no longer a shared heap, the previously recommended usage became a no-op (but the GC 103 // will happen when the context group is destroyed). 104 // Because the function argument was originally ignored, some clients may pass their released context here, 105 // in which case there is a risk of crashing if another thread performs GC on the same heap in between. 106 if (!ctx) 107 return; 108 109 ExecState* exec = toJS(ctx); 110 APIEntryShim entryShim(exec, false); 111 112 exec->vm().heap.reportAbandonedObjectGraph(); 113} 114 115void JSReportExtraMemoryCost(JSContextRef ctx, size_t size) 116{ 117 if (!ctx) { 118 ASSERT_NOT_REACHED(); 119 return; 120 } 121 ExecState* exec = toJS(ctx); 122 APIEntryShim entryShim(exec); 123 exec->vm().heap.reportExtraMemoryCost(size); 124} 125 126extern "C" JS_EXPORT void JSSynchronousGarbageCollectForDebugging(JSContextRef); 127 128void JSSynchronousGarbageCollectForDebugging(JSContextRef ctx) 129{ 130 if (!ctx) 131 return; 132 133 ExecState* exec = toJS(ctx); 134 APIEntryShim entryShim(exec); 135 exec->vm().heap.collectAllGarbage(); 136} 137