2 * Copyright (C) 1999-2001 Harri Porten (porten@kde.org)
3 * Copyright (C) 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved.
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 #include "StringConstructor.h"
24 #include "Executable.h"
26 #include "JSFunction.h"
27 #include "JSGlobalObject.h"
28 #include "JSCInlines.h"
29 #include "StringPrototype.h"
33 static EncodedJSValue JSC_HOST_CALL
stringFromCharCode(ExecState
*);
37 #include "StringConstructor.lut.h"
41 const ClassInfo
StringConstructor::s_info
= { "Function", &InternalFunction::s_info
, 0, ExecState::stringConstructorTable
, CREATE_METHOD_TABLE(StringConstructor
) };
43 /* Source for StringConstructor.lut.h
44 @begin stringConstructorTable
45 fromCharCode stringFromCharCode DontEnum|Function 1
49 STATIC_ASSERT_IS_TRIVIALLY_DESTRUCTIBLE(StringConstructor
);
51 StringConstructor::StringConstructor(VM
& vm
, Structure
* structure
)
52 : InternalFunction(vm
, structure
)
56 void StringConstructor::finishCreation(VM
& vm
, StringPrototype
* stringPrototype
)
58 Base::finishCreation(vm
, stringPrototype
->classInfo()->className
);
59 putDirectWithoutTransition(vm
, vm
.propertyNames
->prototype
, stringPrototype
, ReadOnly
| DontEnum
| DontDelete
);
60 putDirectWithoutTransition(vm
, vm
.propertyNames
->length
, jsNumber(1), ReadOnly
| DontEnum
| DontDelete
);
63 bool StringConstructor::getOwnPropertySlot(JSObject
* object
, ExecState
* exec
, PropertyName propertyName
, PropertySlot
&slot
)
65 return getStaticFunctionSlot
<InternalFunction
>(exec
, ExecState::stringConstructorTable(exec
->vm()), jsCast
<StringConstructor
*>(object
), propertyName
, slot
);
68 // ------------------------------ Functions --------------------------------
70 static NEVER_INLINE JSValue
stringFromCharCodeSlowCase(ExecState
* exec
)
72 unsigned length
= exec
->argumentCount();
74 PassRefPtr
<StringImpl
> impl
= StringImpl::createUninitialized(length
, buf
);
75 for (unsigned i
= 0; i
< length
; ++i
)
76 buf
[i
] = static_cast<UChar
>(exec
->uncheckedArgument(i
).toUInt32(exec
));
77 return jsString(exec
, impl
);
80 static EncodedJSValue JSC_HOST_CALL
stringFromCharCode(ExecState
* exec
)
82 if (LIKELY(exec
->argumentCount() == 1))
83 return JSValue::encode(jsSingleCharacterString(exec
, exec
->uncheckedArgument(0).toUInt32(exec
)));
84 return JSValue::encode(stringFromCharCodeSlowCase(exec
));
87 JSCell
* JSC_HOST_CALL
stringFromCharCode(ExecState
* exec
, int32_t arg
)
89 return jsSingleCharacterString(exec
, arg
);
92 static EncodedJSValue JSC_HOST_CALL
constructWithStringConstructor(ExecState
* exec
)
94 JSGlobalObject
* globalObject
= asInternalFunction(exec
->callee())->globalObject();
97 if (!exec
->argumentCount())
98 return JSValue::encode(StringObject::create(vm
, globalObject
->stringObjectStructure()));
100 return JSValue::encode(StringObject::create(vm
, globalObject
->stringObjectStructure(), exec
->uncheckedArgument(0).toString(exec
)));
103 ConstructType
StringConstructor::getConstructData(JSCell
*, ConstructData
& constructData
)
105 constructData
.native
.function
= constructWithStringConstructor
;
106 return ConstructTypeHost
;
109 static EncodedJSValue JSC_HOST_CALL
callStringConstructor(ExecState
* exec
)
111 if (!exec
->argumentCount())
112 return JSValue::encode(jsEmptyString(exec
));
113 return JSValue::encode(exec
->uncheckedArgument(0).toString(exec
));
116 CallType
StringConstructor::getCallData(JSCell
*, CallData
& callData
)
118 callData
.native
.function
= callStringConstructor
;