source: webkit/trunk/JavaScriptCore/API/JSCharBufferRef.cpp@ 14951

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

JavaScriptCore:

Reviewed by Anders.


  • First cut at C API to JavaScript. Includes a unit test, 'testapi.c', and the outline of a test app, 'minidom.c'.


Includes one change to JSC internals: Rename propList to getPropertyList and have it
take its target property list by reference so that subclasses can
add properties to the list before calling through to their superclasses.


Also, I just ran prepare-ChangeLog in about 10 seconds, and I would like
to give a shout-out to that.


  • API/APICast.h: Added. (toJS): (toRef):
  • API/JSBase.h: Added.
  • API/JSCallbackObject.cpp: Added. (KJS::): (KJS::JSCallbackObject::JSCallbackObject): (KJS::JSCallbackObject::~JSCallbackObject): (KJS::JSCallbackObject::className): (KJS::JSCallbackObject::getOwnPropertySlot): (KJS::JSCallbackObject::put): (KJS::JSCallbackObject::deleteProperty): (KJS::JSCallbackObject::implementsConstruct): (KJS::JSCallbackObject::construct): (KJS::JSCallbackObject::implementsCall): (KJS::JSCallbackObject::callAsFunction): (KJS::JSCallbackObject::getPropertyList): (KJS::JSCallbackObject::toBoolean): (KJS::JSCallbackObject::toNumber): (KJS::JSCallbackObject::toString): (KJS::JSCallbackObject::setPrivate): (KJS::JSCallbackObject::getPrivate): (KJS::JSCallbackObject::cachedValueGetter): (KJS::JSCallbackObject::callbackGetter):
  • API/JSCallbackObject.h: Added. (KJS::JSCallbackObject::classInfo):
  • API/JSCharBufferRef.cpp: Added. (JSStringMake): (JSCharBufferCreate): (JSCharBufferCreateUTF8): (JSCharBufferRetain): (JSCharBufferRelease): (JSValueCopyStringValue): (JSCharBufferGetLength): (JSCharBufferGetCharactersPtr): (JSCharBufferGetCharacters): (JSCharBufferGetMaxLengthUTF8): (JSCharBufferGetCharactersUTF8): (JSCharBufferIsEqual): (JSCharBufferIsEqualUTF8): (JSCharBufferCreateWithCFString): (CFStringCreateWithJSCharBuffer):
  • API/JSCharBufferRef.h: Added.
  • API/JSContextRef.cpp: Added. (JSContextCreate): (JSContextDestroy): (JSContextGetGlobalObject): (JSEvaluate): (JSCheckSyntax): (JSContextHasException): (JSContextGetException): (JSContextClearException): (JSContextSetException):
  • API/JSContextRef.h: Added.
  • API/JSObjectRef.cpp: Added. (JSValueToObject): (JSObjectMake): (JSFunctionMake): (JSObjectGetDescription): (JSObjectGetPrototype): (JSObjectSetPrototype): (JSObjectHasProperty): (JSObjectGetProperty): (JSObjectSetProperty): (JSObjectDeleteProperty): (JSObjectGetPrivate): (JSObjectSetPrivate): (JSObjectIsFunction): (JSObjectCallAsFunction): (JSObjectIsConstructor): (JSObjectCallAsConstructor): (JSPropertyListEnumerator::JSPropertyListEnumerator): (JSObjectCreatePropertyEnumerator): (JSPropertyEnumeratorGetNext): (JSPropertyEnumeratorRetain): (JSPropertyEnumeratorRelease): (JSPropertyListAdd):
  • API/JSObjectRef.h: Added.
  • API/JSValueRef.cpp: Added. (JSValueGetType): (JSValueIsUndefined): (JSValueIsNull): (JSValueIsBoolean): (JSValueIsNumber): (JSValueIsString): (JSValueIsObject): (JSValueIsEqual): (JSValueIsStrictEqual): (JSUndefinedMake): (JSNullMake): (JSBooleanMake): (JSNumberMake): (JSValueToBoolean): (JSValueToNumber): (JSGCProtect): (JSGCUnprotect): (JSGCCollect):
  • API/JSValueRef.h: Added.
  • API/JavaScriptCore.h: Added.
  • API/minidom.c: Added. (main):
  • API/minidom.html: Added.
  • API/minidom.js: Added.
  • API/testapi.c: Added. (assertEqualsAsBoolean): (assertEqualsAsNumber): (assertEqualsAsUTF8String): (assertEqualsAsCharactersPtr): (assertEqualsAsCharacters): (MyObject_initialize): (MyObject_copyDescription): (MyObject_hasProperty): (MyObject_getProperty): (MyObject_setProperty): (MyObject_deleteProperty): (MyObject_getPropertyList): (MyObject_callAsFunction): (MyObject_callAsConstructor): (MyObject_convertToType): (MyObject_finalize): (print_callAsFunction): (main): (createStringWithContentsOfFile):
  • API/testapi.js: Added.
  • ChangeLog:
  • JavaScriptCore.xcodeproj/project.pbxproj:
  • bindings/npruntime_impl.h:
  • kjs/array_instance.h:
  • kjs/array_object.cpp: (ArrayInstance::getPropertyList):
  • kjs/interpreter.cpp: (KJS::Interpreter::evaluate):
  • kjs/nodes.cpp: (ForInNode::execute):
  • kjs/object.cpp: (KJS::JSObject::put): (KJS::JSObject::canPut): (KJS::JSObject::deleteProperty): (KJS::JSObject::propertyIsEnumerable): (KJS::JSObject::getPropertyAttributes): (KJS::JSObject::getPropertyList):
  • kjs/object.h:
  • kjs/property_map.cpp: (KJS::PropertyMap::get):
  • kjs/property_map.h:
  • kjs/scope_chain.cpp: (KJS::ScopeChain::print):
  • kjs/string_object.cpp: (StringInstance::getPropertyList):
  • kjs/string_object.h:
  • kjs/ustring.h: (KJS::UString::Rep::ref):

JavaScriptGlue:

Reviewed by Anders.


  • Required for JS API: Rename propList to getPropertyList and have it take its target property list by reference so that subclasses can add properties to the list before calling through to their superclasses.
  • JSUtils.cpp: (KJSValueToCFTypeInternal):
  • JSValueWrapper.cpp: (JSValueWrapper::JSObjectCopyPropertyNames):
  • UserObjectImp.cpp: (UserObjectImp::getPropertyList):
  • UserObjectImp.h:
File size: 5.3 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 "JSCharBufferRef.h"
29
30#include <JavaScriptCore/JSLock.h>
31#include <JavaScriptCore/JSType.h>
32#include <JavaScriptCore/internal.h>
33#include <JavaScriptCore/operations.h>
34#include <JavaScriptCore/ustring.h>
35#include <JavaScriptCore/value.h>
36
37using namespace KJS;
38
39JSValueRef JSStringMake(JSCharBufferRef buffer)
40{
41 JSLock lock;
42 UString::Rep* rep = toJS(buffer);
43 return toRef(jsString(UString(rep)));
44}
45
46JSCharBufferRef JSCharBufferCreate(const JSChar* chars, size_t numChars)
47{
48 JSLock lock;
49 return toRef(UString(reinterpret_cast<const UChar*>(chars), numChars).rep()->ref());
50}
51
52JSCharBufferRef JSCharBufferCreateUTF8(const char* string)
53{
54 JSLock lock;
55 // FIXME: Only works with ASCII
56 // Use decodeUTF8Sequence or http://www.unicode.org/Public/PROGRAMS/CVTUTF/ instead
57 return toRef(UString(string).rep()->ref());
58}
59
60JSCharBufferRef JSCharBufferRetain(JSCharBufferRef buffer)
61{
62 UString::Rep* rep = toJS(buffer);
63 return toRef(rep->ref());
64}
65
66void JSCharBufferRelease(JSCharBufferRef buffer)
67{
68 JSLock lock;
69 UString::Rep* rep = toJS(buffer);
70 rep->deref();
71}
72
73JSCharBufferRef JSValueCopyStringValue(JSContextRef context, JSValueRef value)
74{
75 JSLock lock;
76 JSValue* jsValue = toJS(value);
77 ExecState* exec = toJS(context);
78
79 JSCharBufferRef charBufferRef = toRef(jsValue->toString(exec).rep()->ref());
80 // FIXME: What should we do with this exception?
81 if (exec->hadException())
82 exec->clearException();
83 return charBufferRef;
84}
85
86size_t JSCharBufferGetLength(JSCharBufferRef buffer)
87{
88 UString::Rep* rep = toJS(buffer);
89 return rep->size();
90}
91
92const JSChar* JSCharBufferGetCharactersPtr(JSCharBufferRef buffer)
93{
94 UString::Rep* rep = toJS(buffer);
95 return reinterpret_cast<const JSChar*>(rep->data());
96}
97
98void JSCharBufferGetCharacters(JSCharBufferRef inBuffer, JSChar* outBuffer, size_t numChars)
99{
100 UString::Rep* rep = toJS(inBuffer);
101 const JSChar* data = reinterpret_cast<const JSChar*>(rep->data());
102
103 memcpy(outBuffer, data, numChars * sizeof(JSChar));
104}
105
106size_t JSCharBufferGetMaxLengthUTF8(JSCharBufferRef buffer)
107{
108 UString::Rep* rep = toJS(buffer);
109
110 // Any UTF8 character > 3 bytes encodes as a UTF16 surrogate pair.
111 return rep->size() * 3 + 1; // + 1 for terminating '\0'
112}
113
114size_t JSCharBufferGetCharactersUTF8(JSCharBufferRef inBuffer, char* outBuffer, size_t bufferSize)
115{
116 JSLock lock;
117 UString::Rep* rep = toJS(inBuffer);
118 CString cString = UString(rep).UTF8String();
119
120 size_t length = std::min(bufferSize, cString.size() + 1); // + 1 for terminating '\0'
121 memcpy(outBuffer, cString.c_str(), length);
122 return length;
123}
124
125bool JSCharBufferIsEqual(JSCharBufferRef a, JSCharBufferRef b)
126{
127 UString::Rep* aRep = toJS(a);
128 UString::Rep* bRep = toJS(b);
129
130 return UString(aRep) == UString(bRep);
131}
132
133bool JSCharBufferIsEqualUTF8(JSCharBufferRef a, const char* b)
134{
135 JSCharBufferRef bBuf = JSCharBufferCreateUTF8(b);
136 bool result = JSCharBufferIsEqual(a, bBuf);
137 JSCharBufferRelease(bBuf);
138
139 return result;
140}
141
142#if defined(__APPLE__)
143JSCharBufferRef JSCharBufferCreateWithCFString(CFStringRef string)
144{
145 JSLock lock;
146 CFIndex length = CFStringGetLength(string);
147
148 // Optimized path for when CFString backing store is a UTF16 buffer
149 if (const UniChar* buffer = CFStringGetCharactersPtr(string)) {
150 UString::Rep* rep = UString(reinterpret_cast<const UChar*>(buffer), length).rep()->ref();
151 return toRef(rep);
152 }
153
154 UniChar* buffer = static_cast<UniChar*>(fastMalloc(sizeof(UniChar) * length));
155 CFStringGetCharacters(string, CFRangeMake(0, length), buffer);
156 UString::Rep* rep = UString(reinterpret_cast<UChar*>(buffer), length, false).rep()->ref();
157 return toRef(rep);
158}
159
160CFStringRef CFStringCreateWithJSCharBuffer(CFAllocatorRef alloc, JSCharBufferRef buffer)
161{
162 UString::Rep* rep = toJS(buffer);
163 return CFStringCreateWithCharacters(alloc, reinterpret_cast<const JSChar*>(rep->data()), rep->size());
164}
165
166#endif // __APPLE__
Note: See TracBrowser for help on using the repository browser.