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

Last change on this file since 15149 was 15149, checked in by ggaren, 19 years ago

Reviewed by Darin.


  • Refined value conversions in the API:
    • failed toNumber returns NaN
    • failed toObject returns NULL
    • failed toString returns empty string


  • Refined excpetion handling in the API:
    • failed value conversions do not throw exceptions
    • uncaught exceptions in JSEvaluate, JSObjectCallAsFunction, and JSObjectCallAsConstructor are returned through a JSValueRef* exception argument
    • removed JSContextHasException, because JSContextGetException does the same job


  • API/JSBase.h:
  • API/JSCharBufferRef.cpp: (JSValueCopyStringValue):
  • API/JSContextRef.cpp: (JSEvaluate):
  • API/JSContextRef.h:
  • API/JSNodeList.c: Added test code demonstrating how you would use toNumber, and why you probably don't need toUInt32, etc. (JSNodeListPrototype_item): (JSNodeList_getProperty):
  • API/JSObjectRef.cpp: (JSValueToObject): (JSObjectCallAsFunction): (JSObjectCallAsConstructor):
  • API/JSObjectRef.h:
  • API/JSValueRef.cpp: (JSValueToNumber):
  • API/JSValueRef.h:
  • API/minidom.c: (main):
  • API/testapi.c: (main): Added tests for new rules, and call to JSGCProtect to fix Intel crash
  • JavaScriptCore.exp:
File size: 4.2 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 "APICast.h"
28#include "JSContextRef.h"
29
30#include "JSCallbackObject.h"
31#include "completion.h"
32#include "interpreter.h"
33#include "object.h"
34
35using namespace KJS;
36
37JSContextRef JSContextCreate(JSClassRef globalObjectClass, JSObjectRef globalObjectPrototype)
38{
39 JSLock lock;
40
41 JSObject* jsPrototype = toJS(globalObjectPrototype);
42
43 JSObject* globalObject;
44 if (globalObjectClass) {
45 if (jsPrototype)
46 globalObject = new JSCallbackObject(globalObjectClass, jsPrototype);
47 else
48 globalObject = new JSCallbackObject(globalObjectClass);
49 } else {
50 // creates a slightly more efficient object
51 if (jsPrototype)
52 globalObject = new JSObject(jsPrototype);
53 else
54 globalObject = new JSObject();
55 }
56
57 Interpreter* interpreter = new Interpreter(globalObject); // adds the built-in object prototype to the global object
58 return toRef(interpreter->globalExec());
59}
60
61void JSContextDestroy(JSContextRef context)
62{
63 JSLock lock;
64 ExecState* exec = toJS(context);
65 delete exec->dynamicInterpreter();
66}
67
68JSObjectRef JSContextGetGlobalObject(JSContextRef context)
69{
70 ExecState* exec = toJS(context);
71 return toRef(exec->dynamicInterpreter()->globalObject());
72}
73
74JSValueRef JSEvaluate(JSContextRef context, JSCharBufferRef script, JSValueRef thisValue, JSCharBufferRef sourceURL, int startingLineNumber, JSValueRef* exception)
75{
76 JSLock lock;
77 ExecState* exec = toJS(context);
78 JSValue* jsThisValue = toJS(thisValue);
79 UString::Rep* scriptRep = toJS(script);
80 UString::Rep* sourceURLRep = toJS(sourceURL);
81 // Interpreter::evaluate sets thisValue to the global object if it is NULL
82 Completion completion = exec->dynamicInterpreter()->evaluate(UString(sourceURLRep), startingLineNumber, UString(scriptRep), jsThisValue);
83
84 if (completion.complType() == Throw) {
85 if (exception)
86 *exception = completion.value();
87 return NULL;
88 }
89
90 if (completion.value())
91 return toRef(completion.value());
92
93 // happens, for example, when the only statement is an empty (';') statement
94 return toRef(jsUndefined());
95}
96
97bool JSCheckSyntax(JSContextRef context, JSCharBufferRef script)
98{
99 JSLock lock;
100 ExecState* exec = toJS(context);
101 UString::Rep* rep = toJS(script);
102 return exec->dynamicInterpreter()->checkSyntax(UString(rep));
103}
104
105JSValueRef JSContextGetException(JSContextRef context)
106{
107 ExecState* exec = toJS(context);
108 return toRef(exec->exception());
109}
110
111void JSContextClearException(JSContextRef context)
112{
113 ExecState* exec = toJS(context);
114 if (exec->hadException())
115 exec->clearException();
116}
117
118void JSContextSetException(JSContextRef context, JSValueRef value)
119{
120 ExecState* exec = toJS(context);
121 JSValue* jsValue = toJS(value);
122 exec->setException(jsValue);
123}
124
Note: See TracBrowser for help on using the repository browser.