From ba379fdc102753d6be2c4d937058fe40257329fe Mon Sep 17 00:00:00 2001 From: Apple Date: Mon, 26 Jul 2010 19:16:31 +0000 Subject: [PATCH] JavaScriptCore-554.1.tar.gz --- API/APICast.h | 36 +- API/JSBase.cpp | 10 +- API/JSBase.h | 18 +- API/JSBasePrivate.h | 2 +- API/JSCallbackConstructor.cpp | 15 +- API/JSCallbackConstructor.h | 2 +- API/JSCallbackFunction.cpp | 16 +- API/JSCallbackFunction.h | 4 +- API/JSCallbackObject.h | 16 +- API/JSCallbackObjectFunctions.h | 155 +- API/JSContextRef.cpp | 2 +- API/JSContextRef.h | 10 +- API/JSObjectRef.cpp | 88 +- API/JSObjectRef.h | 8 +- API/JSValueRef.cpp | 142 +- API/WebKitAvailability.h | 85 +- API/tests/testapi.c | 250 +- API/tests/testapi.js | 72 +- AllInOneFile.cpp | 3 +- ChangeLog-2008-08-10 | 31482 ---------------- DerivedSources.make | 1 + GNUmakefile.am | 99 +- JavaScriptCore.exp | 116 +- JavaScriptCore.gypi | 452 + JavaScriptCore.iPhone.order | 1409 +- JavaScriptCore.order | 3089 +- JavaScriptCore.pri | 115 +- JavaScriptCore.pro | 11 +- JavaScriptCore.scons | 307 - JavaScriptCorePrefix.h | 9 - JavaScriptCoreSources.bkl | 15 +- SConstruct | 1 - assembler/ARMv7Assembler.h | 1758 + assembler/AbstractMacroAssembler.h | 536 + assembler/AssemblerBuffer.h | 19 +- assembler/AssemblerBufferWithConstantPool.h | 305 + assembler/CodeLocation.h | 186 + assembler/LinkBuffer.h | 195 + assembler/MacroAssembler.h | 1890 +- assembler/MacroAssemblerARMv7.h | 1082 + assembler/MacroAssemblerCodeRef.h | 188 + assembler/MacroAssemblerX86.h | 204 + assembler/MacroAssemblerX86Common.h | 964 + assembler/MacroAssemblerX86_64.h | 494 + assembler/RepatchBuffer.h | 136 + assembler/X86Assembler.h | 495 +- bytecode/CodeBlock.cpp | 148 +- bytecode/CodeBlock.h | 172 +- bytecode/EvalCodeCache.h | 2 +- bytecode/Instruction.h | 27 +- bytecode/JumpTable.h | 13 +- bytecode/Opcode.h | 16 +- bytecode/SamplingTool.cpp | 216 +- bytecode/SamplingTool.h | 222 +- bytecode/StructureStubInfo.h | 16 +- bytecompiler/BytecodeGenerator.cpp | 334 +- bytecompiler/BytecodeGenerator.h | 66 +- config.h | 12 +- create_hash_table | 6 +- debugger/Debugger.cpp | 2 +- debugger/Debugger.h | 4 +- debugger/DebuggerActivation.cpp | 8 +- debugger/DebuggerActivation.h | 10 +- debugger/DebuggerCallFrame.cpp | 15 +- debugger/DebuggerCallFrame.h | 10 +- interpreter/CachedCall.h | 70 + interpreter/CallFrame.cpp | 18 +- interpreter/CallFrame.h | 53 +- interpreter/CallFrameClosure.h | 60 + interpreter/Interpreter.cpp | 3835 +- interpreter/Interpreter.h | 282 +- interpreter/Register.h | 177 +- interpreter/RegisterFile.cpp | 11 + interpreter/RegisterFile.h | 177 +- jit/ExecutableAllocator.h | 83 +- jit/ExecutableAllocatorFixedVMPool.cpp | 447 + jit/ExecutableAllocatorPosix.cpp | 30 +- jit/ExecutableAllocatorWin.cpp | 4 + jit/JIT.cpp | 2026 +- jit/JIT.h | 781 +- jit/JITArithmetic.cpp | 2480 +- jit/JITCall.cpp | 616 +- jit/JITCode.h | 122 + jit/JITInlineMethods.h | 712 +- jit/JITOpcodes.cpp | 3033 ++ jit/JITPropertyAccess.cpp | 1710 +- jit/JITStubCall.h | 236 + jit/JITStubs.cpp | 3036 ++ jit/JITStubs.h | 356 + jsc.cpp | 223 +- jsc.pro | 21 +- jscore.bkl | 24 +- parser/Grammar.y | 459 +- parser/Lexer.cpp | 1491 +- parser/Lexer.h | 142 +- parser/NodeConstructors.h | 911 + parser/NodeInfo.h | 4 +- parser/Nodes.cpp | 1657 +- parser/Nodes.h | 1967 +- parser/Parser.cpp | 24 +- parser/Parser.h | 35 +- parser/ParserArena.cpp | 60 + parser/ParserArena.h | 64 + parser/ResultType.h | 7 +- parser/SourceProvider.h | 10 +- pcre/dftables | 2 +- pcre/pcre_compile.cpp | 2 +- pcre/pcre_exec.cpp | 9 +- profiler/CallIdentifier.h | 37 +- profiler/HeavyProfile.cpp | 115 - profiler/HeavyProfile.h | 63 - profiler/Profile.cpp | 3 +- profiler/Profile.h | 11 - profiler/ProfileGenerator.cpp | 2 +- profiler/ProfileGenerator.h | 1 + profiler/ProfileNode.cpp | 10 +- profiler/ProfileNode.h | 10 - profiler/Profiler.cpp | 22 +- profiler/Profiler.h | 8 +- profiler/ProfilerServer.mm | 2 +- profiler/TreeProfile.cpp | 51 - profiler/TreeProfile.h | 51 - runtime/ArgList.cpp | 17 +- runtime/ArgList.h | 96 +- runtime/Arguments.cpp | 68 +- runtime/Arguments.h | 37 +- runtime/ArrayConstructor.cpp | 11 +- runtime/ArrayPrototype.cpp | 498 +- runtime/BatchedTransitionOptimizer.h | 4 +- runtime/BooleanConstructor.cpp | 8 +- runtime/BooleanConstructor.h | 2 +- runtime/BooleanObject.h | 4 +- runtime/BooleanPrototype.cpp | 13 +- runtime/CallData.cpp | 2 +- runtime/CallData.h | 8 +- runtime/Collector.cpp | 103 +- runtime/Collector.h | 23 +- runtime/CommonIdentifiers.cpp | 5 +- runtime/CommonIdentifiers.h | 10 +- runtime/Completion.cpp | 6 +- runtime/Completion.h | 10 +- runtime/ConstructData.cpp | 2 +- runtime/ConstructData.h | 4 +- runtime/DateConstructor.cpp | 94 +- runtime/DateConversion.cpp | 101 + runtime/DateConversion.h | 60 + runtime/DateInstance.cpp | 8 +- runtime/DateInstance.h | 16 +- runtime/DatePrototype.cpp | 292 +- runtime/DatePrototype.h | 2 +- runtime/Error.cpp | 3 +- runtime/ErrorConstructor.cpp | 6 +- runtime/ErrorPrototype.cpp | 9 +- runtime/ExceptionHelpers.cpp | 16 +- runtime/ExceptionHelpers.h | 15 +- runtime/FunctionConstructor.cpp | 18 +- runtime/FunctionPrototype.cpp | 92 +- runtime/FunctionPrototype.h | 6 +- runtime/GetterSetter.cpp | 6 +- runtime/GetterSetter.h | 8 +- runtime/InitializeThreading.cpp | 5 +- runtime/InternalFunction.cpp | 20 + runtime/InternalFunction.h | 10 +- runtime/JSAPIValueWrapper.cpp | 67 + runtime/JSAPIValueWrapper.h | 63 + runtime/JSActivation.cpp | 18 +- runtime/JSActivation.h | 20 +- runtime/JSArray.cpp | 178 +- runtime/JSArray.h | 39 +- runtime/JSByteArray.cpp | 6 +- runtime/JSByteArray.h | 25 +- runtime/JSCell.cpp | 18 +- runtime/JSCell.h | 205 +- runtime/JSFunction.cpp | 71 +- runtime/JSFunction.h | 67 +- runtime/JSGlobalData.cpp | 124 +- runtime/JSGlobalData.h | 94 +- runtime/JSGlobalObject.cpp | 136 +- runtime/JSGlobalObject.h | 52 +- runtime/JSGlobalObjectFunctions.cpp | 75 +- runtime/JSGlobalObjectFunctions.h | 26 +- runtime/JSImmediate.cpp | 81 - runtime/JSImmediate.h | 446 +- runtime/JSNotAnObject.cpp | 8 +- runtime/JSNotAnObject.h | 10 +- runtime/JSNumberCell.cpp | 47 +- runtime/JSNumberCell.h | 300 +- runtime/JSONObject.cpp | 766 + runtime/JSONObject.h | 58 + runtime/JSObject.cpp | 111 +- runtime/JSObject.h | 345 +- runtime/JSPropertyNameIterator.cpp | 6 +- runtime/JSPropertyNameIterator.h | 16 +- runtime/JSStaticScopeObject.cpp | 9 +- runtime/JSStaticScopeObject.h | 9 +- runtime/JSString.cpp | 10 +- runtime/JSString.h | 20 +- runtime/JSValue.cpp | 102 +- runtime/JSValue.h | 774 +- runtime/JSVariableObject.h | 10 +- runtime/JSWrapperObject.h | 9 +- runtime/LiteralParser.cpp | 449 + runtime/LiteralParser.h | 110 + runtime/Lookup.cpp | 26 +- runtime/Lookup.h | 47 +- runtime/MathObject.cpp | 108 +- runtime/MathObject.h | 2 +- runtime/NativeErrorConstructor.cpp | 8 +- runtime/NativeFunctionWrapper.h | 39 + runtime/NumberConstructor.cpp | 26 +- runtime/NumberConstructor.h | 4 +- runtime/NumberObject.cpp | 4 +- runtime/NumberObject.h | 4 +- runtime/NumberPrototype.cpp | 92 +- runtime/ObjectConstructor.cpp | 5 +- runtime/ObjectPrototype.cpp | 79 +- runtime/ObjectPrototype.h | 2 +- runtime/Operations.cpp | 72 +- runtime/Operations.h | 246 +- runtime/PropertyMapHashTable.h | 7 +- runtime/PropertySlot.cpp | 2 +- runtime/PropertySlot.h | 73 +- runtime/Protect.h | 66 +- runtime/PutPropertySlot.h | 12 +- runtime/RegExp.cpp | 184 +- runtime/RegExp.h | 17 +- runtime/RegExpConstructor.cpp | 139 +- runtime/RegExpConstructor.h | 16 +- runtime/RegExpMatchesArray.h | 4 +- runtime/RegExpObject.cpp | 35 +- runtime/RegExpObject.h | 12 +- runtime/RegExpPrototype.cpp | 29 +- runtime/ScopeChain.h | 19 +- runtime/SmallStrings.cpp | 16 +- runtime/StringConstructor.cpp | 17 +- runtime/StringObject.cpp | 2 +- runtime/StringObject.h | 10 +- .../StringObjectThatMasqueradesAsUndefined.h | 2 +- runtime/StringPrototype.cpp | 313 +- runtime/Structure.cpp | 286 +- runtime/Structure.h | 92 +- runtime/StructureChain.cpp | 12 + runtime/StructureChain.h | 1 + runtime/StructureTransitionTable.h | 47 +- runtime/TimeoutChecker.cpp | 157 + .../TimeoutChecker.h | 59 +- runtime/TypeInfo.h | 15 +- runtime/UString.cpp | 327 +- runtime/UString.h | 152 +- .../ecma_2/instanceof/instanceof-003.js | 19 +- .../mozilla/ecma_2/instanceof/regress-7635.js | 70 +- tests/mozilla/expected.html | 224 +- wrec/WREC.cpp | 2 +- wrec/WRECGenerator.cpp | 94 +- wrec/WRECGenerator.h | 22 +- wtf/ASCIICType.h | 16 +- wtf/AVLTree.h | 2 +- wtf/Assertions.cpp | 4 +- wtf/Assertions.h | 21 +- wtf/ByteArray.h | 3 +- wtf/CrossThreadRefCounted.h | 188 + wtf/CurrentTime.cpp | 80 +- wtf/CurrentTime.h | 2 +- {runtime => wtf}/DateMath.cpp | 117 +- {runtime => wtf}/DateMath.h | 14 +- wtf/Deque.h | 123 +- wtf/DisallowCType.h | 4 + wtf/FastAllocBase.h | 403 + wtf/FastMalloc.cpp | 636 +- wtf/FastMalloc.h | 96 + wtf/GOwnPtr.cpp | 6 + wtf/GOwnPtr.h | 1 + wtf/HashCountedSet.h | 3 +- wtf/HashMap.h | 2 +- wtf/HashSet.h | 3 +- wtf/HashTraits.h | 43 +- wtf/MainThread.cpp | 73 +- wtf/MainThread.h | 4 +- wtf/MathExtras.h | 4 +- wtf/MessageQueue.h | 54 +- wtf/NotFound.h | 2 + wtf/OwnFastMallocPtr.h | 52 + wtf/OwnPtr.h | 93 +- wtf/OwnPtrCommon.h | 61 + wtf/OwnPtrWin.cpp | 7 + wtf/PassOwnPtr.h | 177 + wtf/PassRefPtr.h | 2 +- wtf/Platform.h | 243 +- wtf/PtrAndFlags.h | 15 +- wtf/RefCounted.h | 35 +- wtf/RefPtr.h | 3 +- wtf/RetainPtr.h | 11 +- {bytecompiler => wtf}/SegmentedVector.h | 98 +- wtf/StdLibExtras.h | 11 +- wtf/StringExtras.h | 8 +- wtf/TCPageMap.h | 33 +- wtf/TCSystemAlloc.cpp | 114 +- wtf/TCSystemAlloc.h | 8 +- wtf/ThreadSpecific.h | 59 +- wtf/ThreadSpecificWin.cpp | 17 +- wtf/Threading.cpp | 22 +- wtf/Threading.h | 107 +- wtf/ThreadingNone.cpp | 9 +- wtf/ThreadingPthreads.cpp | 163 +- wtf/ThreadingWin.cpp | 26 +- wtf/TypeTraits.cpp | 120 + wtf/TypeTraits.h | 339 + wtf/VMTags.h | 55 + wtf/Vector.h | 48 +- wtf/VectorTraits.h | 19 +- wtf/chromium/ChromiumThreading.h | 45 + wtf/chromium/MainThreadChromium.cpp | 49 + wtf/dtoa.cpp | 958 +- wtf/dtoa.h | 3 +- wtf/gtk/MainThreadGtk.cpp | 7 +- wtf/{ => gtk}/ThreadingGtk.cpp | 4 + wtf/iphone/MainThreadIPhone.mm | 19 +- wtf/mac/MainThreadMac.mm | 14 +- wtf/qt/MainThreadQt.cpp | 5 +- wtf/{ => qt}/ThreadingQt.cpp | 16 +- wtf/unicode/Unicode.h | 2 + wtf/unicode/glib/UnicodeGLib.cpp | 214 + wtf/unicode/glib/UnicodeGLib.h | 238 + wtf/unicode/glib/UnicodeMacrosFromICU.h | 69 + wtf/unicode/qt4/UnicodeQt4.h | 11 + wtf/win/MainThreadWin.cpp | 8 +- wtf/wx/MainThreadWx.cpp | 6 +- yarr/RegexCompiler.cpp | 728 + yarr/RegexCompiler.h | 45 + yarr/RegexInterpreter.cpp | 1638 + yarr/RegexInterpreter.h | 337 + yarr/RegexJIT.cpp | 1417 + yarr/RegexJIT.h | 91 + yarr/RegexParser.h | 854 + yarr/RegexPattern.h | 356 + 335 files changed, 45699 insertions(+), 50954 deletions(-) delete mode 100644 ChangeLog-2008-08-10 create mode 100644 JavaScriptCore.gypi delete mode 100644 JavaScriptCore.scons delete mode 100644 SConstruct create mode 100644 assembler/ARMv7Assembler.h create mode 100644 assembler/AbstractMacroAssembler.h create mode 100644 assembler/AssemblerBufferWithConstantPool.h create mode 100644 assembler/CodeLocation.h create mode 100644 assembler/LinkBuffer.h create mode 100644 assembler/MacroAssemblerARMv7.h create mode 100644 assembler/MacroAssemblerCodeRef.h create mode 100644 assembler/MacroAssemblerX86.h create mode 100644 assembler/MacroAssemblerX86Common.h create mode 100644 assembler/MacroAssemblerX86_64.h create mode 100644 assembler/RepatchBuffer.h create mode 100644 interpreter/CachedCall.h create mode 100644 interpreter/CallFrameClosure.h create mode 100644 jit/ExecutableAllocatorFixedVMPool.cpp create mode 100644 jit/JITCode.h create mode 100644 jit/JITOpcodes.cpp create mode 100644 jit/JITStubCall.h create mode 100644 jit/JITStubs.cpp create mode 100644 jit/JITStubs.h create mode 100644 parser/NodeConstructors.h create mode 100644 parser/ParserArena.cpp create mode 100644 parser/ParserArena.h create mode 100644 runtime/DateConversion.cpp create mode 100644 runtime/DateConversion.h create mode 100644 runtime/JSAPIValueWrapper.cpp create mode 100644 runtime/JSAPIValueWrapper.h create mode 100644 runtime/JSONObject.cpp create mode 100644 runtime/JSONObject.h create mode 100644 runtime/LiteralParser.cpp create mode 100644 runtime/LiteralParser.h create mode 100644 runtime/NativeFunctionWrapper.h create mode 100644 runtime/TimeoutChecker.cpp rename wtf/iphone/ThreadingNSThread.mm => runtime/TimeoutChecker.h (62%) create mode 100644 wtf/CrossThreadRefCounted.h rename {runtime => wtf}/DateMath.cpp (92%) rename {runtime => wtf}/DateMath.h (95%) create mode 100644 wtf/FastAllocBase.h create mode 100644 wtf/OwnFastMallocPtr.h create mode 100644 wtf/OwnPtrCommon.h create mode 100644 wtf/PassOwnPtr.h rename {bytecompiler => wtf}/SegmentedVector.h (66%) create mode 100644 wtf/TypeTraits.cpp create mode 100644 wtf/TypeTraits.h create mode 100644 wtf/VMTags.h create mode 100644 wtf/chromium/ChromiumThreading.h create mode 100644 wtf/chromium/MainThreadChromium.cpp rename wtf/{ => gtk}/ThreadingGtk.cpp (99%) rename wtf/{ => qt}/ThreadingQt.cpp (94%) create mode 100644 wtf/unicode/glib/UnicodeGLib.cpp create mode 100644 wtf/unicode/glib/UnicodeGLib.h create mode 100644 wtf/unicode/glib/UnicodeMacrosFromICU.h create mode 100644 yarr/RegexCompiler.cpp create mode 100644 yarr/RegexCompiler.h create mode 100644 yarr/RegexInterpreter.cpp create mode 100644 yarr/RegexInterpreter.h create mode 100644 yarr/RegexJIT.cpp create mode 100644 yarr/RegexJIT.h create mode 100644 yarr/RegexParser.h create mode 100644 yarr/RegexPattern.h diff --git a/API/APICast.h b/API/APICast.h index 1344a16..b6d1532 100644 --- a/API/APICast.h +++ b/API/APICast.h @@ -26,14 +26,17 @@ #ifndef APICast_h #define APICast_h +#include "JSAPIValueWrapper.h" #include "JSValue.h" +#include +#include namespace JSC { class ExecState; class PropertyNameArray; class JSGlobalData; class JSObject; - class JSValuePtr; + class JSValue; } typedef const struct OpaqueJSContextGroup* JSContextGroupRef; @@ -55,9 +58,18 @@ inline JSC::ExecState* toJS(JSGlobalContextRef c) return reinterpret_cast(c); } -inline JSC::JSValuePtr toJS(JSValueRef v) +inline JSC::JSValue toJS(JSC::ExecState*, JSValueRef v) { - return JSC::JSValuePtr::decode(reinterpret_cast(const_cast(v))); +#if USE(JSVALUE32_64) + JSC::JSCell* jsCell = reinterpret_cast(const_cast(v)); + if (!jsCell) + return JSC::JSValue(); + if (jsCell->isAPIValueWrapper()) + return static_cast(jsCell)->value(); + return jsCell; +#else + return JSC::JSValue::decode(reinterpret_cast(const_cast(v))); +#endif } inline JSC::JSObject* toJS(JSObjectRef o) @@ -75,14 +87,18 @@ inline JSC::JSGlobalData* toJS(JSContextGroupRef g) return reinterpret_cast(const_cast(g)); } -inline JSValueRef toRef(JSC::JSValuePtr v) +inline JSValueRef toRef(JSC::ExecState* exec, JSC::JSValue v) { - return reinterpret_cast(JSC::JSValuePtr::encode(v)); -} - -inline JSValueRef* toRef(JSC::JSValuePtr* v) -{ - return reinterpret_cast(v); +#if USE(JSVALUE32_64) + if (!v) + return 0; + if (!v.isCell()) + return reinterpret_cast(asCell(JSC::jsAPIValueWrapper(exec, v))); + return reinterpret_cast(asCell(v)); +#else + UNUSED_PARAM(exec); + return reinterpret_cast(JSC::JSValue::encode(v)); +#endif } inline JSObjectRef toRef(JSC::JSObject* o) diff --git a/API/JSBase.cpp b/API/JSBase.cpp index 2ffe345..fc3d0fe 100644 --- a/API/JSBase.cpp +++ b/API/JSBase.cpp @@ -55,15 +55,15 @@ JSValueRef JSEvaluateScript(JSContextRef ctx, JSStringRef script, JSObjectRef th if (completion.complType() == Throw) { if (exception) - *exception = toRef(completion.value()); + *exception = toRef(exec, completion.value()); return 0; } - + if (completion.value()) - return toRef(completion.value()); + return toRef(exec, completion.value()); // happens, for example, when the only statement is an empty (';') statement - return toRef(jsUndefined()); + return toRef(exec, jsUndefined()); } bool JSCheckScriptSyntax(JSContextRef ctx, JSStringRef script, JSStringRef sourceURL, int startingLineNumber, JSValueRef* exception) @@ -76,7 +76,7 @@ bool JSCheckScriptSyntax(JSContextRef ctx, JSStringRef script, JSStringRef sourc Completion completion = checkSyntax(exec->dynamicGlobalObject()->globalExec(), source); if (completion.complType() == Throw) { if (exception) - *exception = toRef(completion.value()); + *exception = toRef(exec, completion.value()); return false; } diff --git a/API/JSBase.h b/API/JSBase.h index f44d4ad..9f3d88e 100644 --- a/API/JSBase.h +++ b/API/JSBase.h @@ -65,14 +65,28 @@ typedef struct OpaqueJSValue* JSObjectRef; /* JavaScript symbol exports */ #undef JS_EXPORT -#if defined(__GNUC__) +#if defined(BUILDING_WX__) + #define JS_EXPORT +#elif defined(__GNUC__) #define JS_EXPORT __attribute__((visibility("default"))) +#elif defined(_WIN32_WCE) + #if defined(JS_BUILDING_JS) + #define JS_EXPORT __declspec(dllexport) + #elif defined(JS_IMPORT_JS) + #define JS_EXPORT __declspec(dllimport) + #else + #define JS_EXPORT + #endif #elif defined(WIN32) || defined(_WIN32) /* * TODO: Export symbols with JS_EXPORT when using MSVC. * See http://bugs.webkit.org/show_bug.cgi?id=16227 */ - #define JS_EXPORT + #if defined(BUILDING_JavaScriptCore) || defined(BUILDING_WTF) + #define JS_EXPORT __declspec(dllexport) + #else + #define JS_EXPORT __declspec(dllimport) + #endif #else #define JS_EXPORT #endif diff --git a/API/JSBasePrivate.h b/API/JSBasePrivate.h index 6beacda..befa316 100644 --- a/API/JSBasePrivate.h +++ b/API/JSBasePrivate.h @@ -43,7 +43,7 @@ owns a large non-GC memory region. Calling this function will encourage the garbage collector to collect soon, hoping to reclaim that large non-GC memory region. */ -JS_EXPORT void JSReportExtraMemoryCost(JSContextRef ctx, size_t size) AVAILABLE_AFTER_WEBKIT_VERSION_3_1; +JS_EXPORT void JSReportExtraMemoryCost(JSContextRef ctx, size_t size) AVAILABLE_IN_WEBKIT_VERSION_4_0; #ifdef __cplusplus } diff --git a/API/JSCallbackConstructor.cpp b/API/JSCallbackConstructor.cpp index e10733e..64c83cb 100644 --- a/API/JSCallbackConstructor.cpp +++ b/API/JSCallbackConstructor.cpp @@ -61,10 +61,17 @@ static JSObject* constructJSCallback(ExecState* exec, JSObject* constructor, con int argumentCount = static_cast(args.size()); Vector arguments(argumentCount); for (int i = 0; i < argumentCount; i++) - arguments[i] = toRef(args.at(exec, i)); - - JSLock::DropAllLocks dropAllLocks(exec); - return toJS(callback(ctx, constructorRef, argumentCount, arguments.data(), toRef(exec->exceptionSlot()))); + arguments[i] = toRef(exec, args.at(i)); + + JSValueRef exception = 0; + JSObjectRef result; + { + JSLock::DropAllLocks dropAllLocks(exec); + result = callback(ctx, constructorRef, argumentCount, arguments.data(), &exception); + } + if (exception) + exec->setException(toJS(exec, exception)); + return toJS(result); } return toJS(JSObjectMake(ctx, static_cast(constructor)->classRef(), 0)); diff --git a/API/JSCallbackConstructor.h b/API/JSCallbackConstructor.h index cb8307f..1f06249 100644 --- a/API/JSCallbackConstructor.h +++ b/API/JSCallbackConstructor.h @@ -39,7 +39,7 @@ public: JSObjectCallAsConstructorCallback callback() const { return m_callback; } static const ClassInfo info; - static PassRefPtr createStructure(JSValuePtr proto) + static PassRefPtr createStructure(JSValue proto) { return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance | HasStandardGetOwnPropertySlot)); } diff --git a/API/JSCallbackFunction.cpp b/API/JSCallbackFunction.cpp index 86a2ebc..1b3217b 100644 --- a/API/JSCallbackFunction.cpp +++ b/API/JSCallbackFunction.cpp @@ -46,7 +46,7 @@ JSCallbackFunction::JSCallbackFunction(ExecState* exec, JSObjectCallAsFunctionCa { } -JSValuePtr JSCallbackFunction::call(ExecState* exec, JSObject* functionObject, JSValuePtr thisValue, const ArgList& args) +JSValue JSCallbackFunction::call(ExecState* exec, JSObject* functionObject, JSValue thisValue, const ArgList& args) { JSContextRef execRef = toRef(exec); JSObjectRef functionRef = toRef(functionObject); @@ -55,10 +55,18 @@ JSValuePtr JSCallbackFunction::call(ExecState* exec, JSObject* functionObject, J int argumentCount = static_cast(args.size()); Vector arguments(argumentCount); for (int i = 0; i < argumentCount; i++) - arguments[i] = toRef(args.at(exec, i)); + arguments[i] = toRef(exec, args.at(i)); - JSLock::DropAllLocks dropAllLocks(exec); - return toJS(static_cast(functionObject)->m_callback(execRef, functionRef, thisObjRef, argumentCount, arguments.data(), toRef(exec->exceptionSlot()))); + JSValueRef exception = 0; + JSValueRef result; + { + JSLock::DropAllLocks dropAllLocks(exec); + result = static_cast(functionObject)->m_callback(execRef, functionRef, thisObjRef, argumentCount, arguments.data(), &exception); + } + if (exception) + exec->setException(toJS(exec, exception)); + + return toJS(exec, result); } CallType JSCallbackFunction::getCallData(CallData& callData) diff --git a/API/JSCallbackFunction.h b/API/JSCallbackFunction.h index 46f6fcc..7dd87b5 100644 --- a/API/JSCallbackFunction.h +++ b/API/JSCallbackFunction.h @@ -39,7 +39,7 @@ public: // InternalFunction mish-mashes constructor and function behavior -- we should // refactor the code so this override isn't necessary - static PassRefPtr createStructure(JSValuePtr proto) + static PassRefPtr createStructure(JSValue proto) { return Structure::create(proto, TypeInfo(ObjectType, HasStandardGetOwnPropertySlot)); } @@ -48,7 +48,7 @@ private: virtual CallType getCallData(CallData&); virtual const ClassInfo* classInfo() const { return &info; } - static JSValuePtr call(ExecState*, JSObject*, JSValuePtr, const ArgList&); + static JSValue JSC_HOST_CALL call(ExecState*, JSObject*, JSValue, const ArgList&); JSObjectCallAsFunctionCallback m_callback; }; diff --git a/API/JSCallbackObject.h b/API/JSCallbackObject.h index 9001c43..9d22ad9 100644 --- a/API/JSCallbackObject.h +++ b/API/JSCallbackObject.h @@ -48,7 +48,7 @@ public: JSClassRef classRef() const { return m_callbackObjectData->jsClass; } bool inherits(JSClassRef) const; - static PassRefPtr createStructure(JSValuePtr proto) + static PassRefPtr createStructure(JSValue proto) { return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance | OverridesHasInstance)); } @@ -59,12 +59,12 @@ private: virtual bool getOwnPropertySlot(ExecState*, const Identifier&, PropertySlot&); virtual bool getOwnPropertySlot(ExecState*, unsigned, PropertySlot&); - virtual void put(ExecState*, const Identifier&, JSValuePtr, PutPropertySlot&); + virtual void put(ExecState*, const Identifier&, JSValue, PutPropertySlot&); virtual bool deleteProperty(ExecState*, const Identifier&); virtual bool deleteProperty(ExecState*, unsigned); - virtual bool hasInstance(ExecState* exec, JSValuePtr value, JSValuePtr proto); + virtual bool hasInstance(ExecState* exec, JSValue value, JSValue proto); virtual void getPropertyNames(ExecState*, PropertyNameArray&); @@ -77,14 +77,14 @@ private: void init(ExecState*); - static JSCallbackObject* asCallbackObject(JSValuePtr); + static JSCallbackObject* asCallbackObject(JSValue); - static JSValuePtr call(ExecState*, JSObject* functionObject, JSValuePtr thisValue, const ArgList&); + static JSValue JSC_HOST_CALL call(ExecState*, JSObject* functionObject, JSValue thisValue, const ArgList&); static JSObject* construct(ExecState*, JSObject* constructor, const ArgList&); - static JSValuePtr staticValueGetter(ExecState*, const Identifier&, const PropertySlot&); - static JSValuePtr staticFunctionGetter(ExecState*, const Identifier&, const PropertySlot&); - static JSValuePtr callbackGetter(ExecState*, const Identifier&, const PropertySlot&); + static JSValue staticValueGetter(ExecState*, const Identifier&, const PropertySlot&); + static JSValue staticFunctionGetter(ExecState*, const Identifier&, const PropertySlot&); + static JSValue callbackGetter(ExecState*, const Identifier&, const PropertySlot&); struct JSCallbackObjectData { JSCallbackObjectData(void* privateData, JSClassRef jsClass) diff --git a/API/JSCallbackObjectFunctions.h b/API/JSCallbackObjectFunctions.h index 23f941d..1abed3f 100644 --- a/API/JSCallbackObjectFunctions.h +++ b/API/JSCallbackObjectFunctions.h @@ -40,7 +40,7 @@ namespace JSC { template -inline JSCallbackObject* JSCallbackObject::asCallbackObject(JSValuePtr value) +inline JSCallbackObject* JSCallbackObject::asCallbackObject(JSValue value) { ASSERT(asObject(value)->inherits(&info)); return static_cast(asObject(value)); @@ -99,7 +99,7 @@ template UString JSCallbackObject::className() const { UString thisClassName = classRef()->className(); - if (!thisClassName.isNull()) + if (!thisClassName.isEmpty()) return thisClassName; return Base::className(); @@ -125,9 +125,19 @@ bool JSCallbackObject::getOwnPropertySlot(ExecState* exec, const Identifie } else if (JSObjectGetPropertyCallback getProperty = jsClass->getProperty) { if (!propertyNameRef) propertyNameRef = OpaqueJSString::create(propertyName.ustring()); - JSLock::DropAllLocks dropAllLocks(exec); - if (JSValueRef value = getProperty(ctx, thisRef, propertyNameRef.get(), toRef(exec->exceptionSlot()))) { - slot.setValue(toJS(value)); + JSValueRef exception = 0; + JSValueRef value; + { + JSLock::DropAllLocks dropAllLocks(exec); + value = getProperty(ctx, thisRef, propertyNameRef.get(), &exception); + } + exec->setException(toJS(exec, exception)); + if (value) { + slot.setValue(toJS(exec, value)); + return true; + } + if (exception) { + slot.setValue(jsUndefined()); return true; } } @@ -157,19 +167,25 @@ bool JSCallbackObject::getOwnPropertySlot(ExecState* exec, unsigned proper } template -void JSCallbackObject::put(ExecState* exec, const Identifier& propertyName, JSValuePtr value, PutPropertySlot& slot) +void JSCallbackObject::put(ExecState* exec, const Identifier& propertyName, JSValue value, PutPropertySlot& slot) { JSContextRef ctx = toRef(exec); JSObjectRef thisRef = toRef(this); RefPtr propertyNameRef; - JSValueRef valueRef = toRef(value); + JSValueRef valueRef = toRef(exec, value); for (JSClassRef jsClass = classRef(); jsClass; jsClass = jsClass->parentClass) { if (JSObjectSetPropertyCallback setProperty = jsClass->setProperty) { if (!propertyNameRef) propertyNameRef = OpaqueJSString::create(propertyName.ustring()); - JSLock::DropAllLocks dropAllLocks(exec); - if (setProperty(ctx, thisRef, propertyNameRef.get(), valueRef, toRef(exec->exceptionSlot()))) + JSValueRef exception = 0; + bool result; + { + JSLock::DropAllLocks dropAllLocks(exec); + result = setProperty(ctx, thisRef, propertyNameRef.get(), valueRef, &exception); + } + exec->setException(toJS(exec, exception)); + if (result || exception) return; } @@ -180,8 +196,14 @@ void JSCallbackObject::put(ExecState* exec, const Identifier& propertyName if (JSObjectSetPropertyCallback setProperty = entry->setProperty) { if (!propertyNameRef) propertyNameRef = OpaqueJSString::create(propertyName.ustring()); - JSLock::DropAllLocks dropAllLocks(exec); - if (setProperty(ctx, thisRef, propertyNameRef.get(), valueRef, toRef(exec->exceptionSlot()))) + JSValueRef exception = 0; + bool result; + { + JSLock::DropAllLocks dropAllLocks(exec); + result = setProperty(ctx, thisRef, propertyNameRef.get(), valueRef, &exception); + } + exec->setException(toJS(exec, exception)); + if (result || exception) return; } else throwError(exec, ReferenceError, "Attempt to set a property that is not settable."); @@ -212,8 +234,14 @@ bool JSCallbackObject::deleteProperty(ExecState* exec, const Identifier& p if (JSObjectDeletePropertyCallback deleteProperty = jsClass->deleteProperty) { if (!propertyNameRef) propertyNameRef = OpaqueJSString::create(propertyName.ustring()); - JSLock::DropAllLocks dropAllLocks(exec); - if (deleteProperty(ctx, thisRef, propertyNameRef.get(), toRef(exec->exceptionSlot()))) + JSValueRef exception = 0; + bool result; + { + JSLock::DropAllLocks dropAllLocks(exec); + result = deleteProperty(ctx, thisRef, propertyNameRef.get(), &exception); + } + exec->setException(toJS(exec, exception)); + if (result || exception) return true; } @@ -266,9 +294,15 @@ JSObject* JSCallbackObject::construct(ExecState* exec, JSObject* construct int argumentCount = static_cast(args.size()); Vector arguments(argumentCount); for (int i = 0; i < argumentCount; i++) - arguments[i] = toRef(args.at(exec, i)); - JSLock::DropAllLocks dropAllLocks(exec); - return toJS(callAsConstructor(execRef, constructorRef, argumentCount, arguments.data(), toRef(exec->exceptionSlot()))); + arguments[i] = toRef(exec, args.at(i)); + JSValueRef exception = 0; + JSObject* result; + { + JSLock::DropAllLocks dropAllLocks(exec); + result = toJS(callAsConstructor(execRef, constructorRef, argumentCount, arguments.data(), &exception)); + } + exec->setException(toJS(exec, exception)); + return result; } } @@ -277,15 +311,22 @@ JSObject* JSCallbackObject::construct(ExecState* exec, JSObject* construct } template -bool JSCallbackObject::hasInstance(ExecState* exec, JSValuePtr value, JSValuePtr) +bool JSCallbackObject::hasInstance(ExecState* exec, JSValue value, JSValue) { JSContextRef execRef = toRef(exec); JSObjectRef thisRef = toRef(this); for (JSClassRef jsClass = classRef(); jsClass; jsClass = jsClass->parentClass) { if (JSObjectHasInstanceCallback hasInstance = jsClass->hasInstance) { - JSLock::DropAllLocks dropAllLocks(exec); - return hasInstance(execRef, thisRef, toRef(value), toRef(exec->exceptionSlot())); + JSValueRef valueRef = toRef(exec, value); + JSValueRef exception = 0; + bool result; + { + JSLock::DropAllLocks dropAllLocks(exec); + result = hasInstance(execRef, thisRef, valueRef, &exception); + } + exec->setException(toJS(exec, exception)); + return result; } } return false; @@ -304,7 +345,7 @@ CallType JSCallbackObject::getCallData(CallData& callData) } template -JSValuePtr JSCallbackObject::call(ExecState* exec, JSObject* functionObject, JSValuePtr thisValue, const ArgList& args) +JSValue JSCallbackObject::call(ExecState* exec, JSObject* functionObject, JSValue thisValue, const ArgList& args) { JSContextRef execRef = toRef(exec); JSObjectRef functionRef = toRef(functionObject); @@ -315,14 +356,20 @@ JSValuePtr JSCallbackObject::call(ExecState* exec, JSObject* functionObjec int argumentCount = static_cast(args.size()); Vector arguments(argumentCount); for (int i = 0; i < argumentCount; i++) - arguments[i] = toRef(args.at(exec, i)); - JSLock::DropAllLocks dropAllLocks(exec); - return toJS(callAsFunction(execRef, functionRef, thisObjRef, argumentCount, arguments.data(), toRef(exec->exceptionSlot()))); + arguments[i] = toRef(exec, args.at(i)); + JSValueRef exception = 0; + JSValue result; + { + JSLock::DropAllLocks dropAllLocks(exec); + result = toJS(exec, callAsFunction(execRef, functionRef, thisObjRef, argumentCount, arguments.data(), &exception)); + } + exec->setException(toJS(exec, exception)); + return result; } } ASSERT_NOT_REACHED(); // getCallData should prevent us from reaching here - return noValue(); + return JSValue(); } template @@ -376,11 +423,19 @@ double JSCallbackObject::toNumber(ExecState* exec) const for (JSClassRef jsClass = classRef(); jsClass; jsClass = jsClass->parentClass) if (JSObjectConvertToTypeCallback convertToType = jsClass->convertToType) { - JSLock::DropAllLocks dropAllLocks(exec); - if (JSValueRef value = convertToType(ctx, thisRef, kJSTypeNumber, toRef(exec->exceptionSlot()))) { - double dValue; - return toJS(value).getNumber(dValue) ? dValue : NaN; + JSValueRef exception = 0; + JSValueRef value; + { + JSLock::DropAllLocks dropAllLocks(exec); + value = convertToType(ctx, thisRef, kJSTypeNumber, &exception); } + if (exception) { + exec->setException(toJS(exec, exception)); + return 0; + } + + double dValue; + return toJS(exec, value).getNumber(dValue) ? dValue : NaN; } return Base::toNumber(exec); @@ -394,13 +449,17 @@ UString JSCallbackObject::toString(ExecState* exec) const for (JSClassRef jsClass = classRef(); jsClass; jsClass = jsClass->parentClass) if (JSObjectConvertToTypeCallback convertToType = jsClass->convertToType) { + JSValueRef exception = 0; JSValueRef value; { JSLock::DropAllLocks dropAllLocks(exec); - value = convertToType(ctx, thisRef, kJSTypeString, toRef(exec->exceptionSlot())); + value = convertToType(ctx, thisRef, kJSTypeString, &exception); } - if (value) - return toJS(value).getString(); + if (exception) { + exec->setException(toJS(exec, exception)); + return ""; + } + return toJS(exec, value).getString(); } return Base::toString(exec); @@ -429,7 +488,7 @@ bool JSCallbackObject::inherits(JSClassRef c) const } template -JSValuePtr JSCallbackObject::staticValueGetter(ExecState* exec, const Identifier& propertyName, const PropertySlot& slot) +JSValue JSCallbackObject::staticValueGetter(ExecState* exec, const Identifier& propertyName, const PropertySlot& slot) { JSCallbackObject* thisObj = asCallbackObject(slot.slotBase()); @@ -442,16 +501,24 @@ JSValuePtr JSCallbackObject::staticValueGetter(ExecState* exec, const Iden if (JSObjectGetPropertyCallback getProperty = entry->getProperty) { if (!propertyNameRef) propertyNameRef = OpaqueJSString::create(propertyName.ustring()); - JSLock::DropAllLocks dropAllLocks(exec); - if (JSValueRef value = getProperty(toRef(exec), thisRef, propertyNameRef.get(), toRef(exec->exceptionSlot()))) - return toJS(value); + JSValueRef exception = 0; + JSValueRef value; + { + JSLock::DropAllLocks dropAllLocks(exec); + value = getProperty(toRef(exec), thisRef, propertyNameRef.get(), &exception); + } + exec->setException(toJS(exec, exception)); + if (value) + return toJS(exec, value); + if (exception) + return jsUndefined(); } return throwError(exec, ReferenceError, "Static value property defined with NULL getProperty callback."); } template -JSValuePtr JSCallbackObject::staticFunctionGetter(ExecState* exec, const Identifier& propertyName, const PropertySlot& slot) +JSValue JSCallbackObject::staticFunctionGetter(ExecState* exec, const Identifier& propertyName, const PropertySlot& slot) { JSCallbackObject* thisObj = asCallbackObject(slot.slotBase()); @@ -476,7 +543,7 @@ JSValuePtr JSCallbackObject::staticFunctionGetter(ExecState* exec, const I } template -JSValuePtr JSCallbackObject::callbackGetter(ExecState* exec, const Identifier& propertyName, const PropertySlot& slot) +JSValue JSCallbackObject::callbackGetter(ExecState* exec, const Identifier& propertyName, const PropertySlot& slot) { JSCallbackObject* thisObj = asCallbackObject(slot.slotBase()); @@ -487,9 +554,17 @@ JSValuePtr JSCallbackObject::callbackGetter(ExecState* exec, const Identif if (JSObjectGetPropertyCallback getProperty = jsClass->getProperty) { if (!propertyNameRef) propertyNameRef = OpaqueJSString::create(propertyName.ustring()); - JSLock::DropAllLocks dropAllLocks(exec); - if (JSValueRef value = getProperty(toRef(exec), thisRef, propertyNameRef.get(), toRef(exec->exceptionSlot()))) - return toJS(value); + JSValueRef exception = 0; + JSValueRef value; + { + JSLock::DropAllLocks dropAllLocks(exec); + value = getProperty(toRef(exec), thisRef, propertyNameRef.get(), &exception); + } + exec->setException(toJS(exec, exception)); + if (value) + return toJS(exec, value); + if (exception) + return jsUndefined(); } return throwError(exec, ReferenceError, "hasProperty callback returned true for a property that doesn't exist."); diff --git a/API/JSContextRef.cpp b/API/JSContextRef.cpp index c331179..a3bdc69 100644 --- a/API/JSContextRef.cpp +++ b/API/JSContextRef.cpp @@ -97,7 +97,7 @@ JSGlobalContextRef JSGlobalContextCreateInGroup(JSContextGroupRef group, JSClass JSGlobalObject* globalObject = new (globalData.get()) JSCallbackObject(globalObjectClass); ExecState* exec = globalObject->globalExec(); - JSValuePtr prototype = globalObjectClass->prototype(exec); + JSValue prototype = globalObjectClass->prototype(exec); if (!prototype) prototype = jsNull(); globalObject->resetPrototype(prototype); diff --git a/API/JSContextRef.h b/API/JSContextRef.h index bc89511..c5c8a71 100644 --- a/API/JSContextRef.h +++ b/API/JSContextRef.h @@ -48,7 +48,7 @@ extern "C" { synchronization is required. @result The created JSContextGroup. */ -JS_EXPORT JSContextGroupRef JSContextGroupCreate() AVAILABLE_AFTER_WEBKIT_VERSION_3_1; +JS_EXPORT JSContextGroupRef JSContextGroupCreate() AVAILABLE_IN_WEBKIT_VERSION_4_0; /*! @function @@ -56,14 +56,14 @@ JS_EXPORT JSContextGroupRef JSContextGroupCreate() AVAILABLE_AFTER_WEBKIT_VERSIO @param group The JSContextGroup to retain. @result A JSContextGroup that is the same as group. */ -JS_EXPORT JSContextGroupRef JSContextGroupRetain(JSContextGroupRef group) AVAILABLE_AFTER_WEBKIT_VERSION_3_1; +JS_EXPORT JSContextGroupRef JSContextGroupRetain(JSContextGroupRef group) AVAILABLE_IN_WEBKIT_VERSION_4_0; /*! @function @abstract Releases a JavaScript context group. @param group The JSContextGroup to release. */ -JS_EXPORT void JSContextGroupRelease(JSContextGroupRef group) AVAILABLE_AFTER_WEBKIT_VERSION_3_1; +JS_EXPORT void JSContextGroupRelease(JSContextGroupRef group) AVAILABLE_IN_WEBKIT_VERSION_4_0; /*! @function @@ -92,7 +92,7 @@ JS_EXPORT JSGlobalContextRef JSGlobalContextCreate(JSClassRef globalObjectClass) @result A JSGlobalContext with a global object of class globalObjectClass and a context group equal to group. */ -JS_EXPORT JSGlobalContextRef JSGlobalContextCreateInGroup(JSContextGroupRef group, JSClassRef globalObjectClass) AVAILABLE_AFTER_WEBKIT_VERSION_3_1; +JS_EXPORT JSGlobalContextRef JSGlobalContextCreateInGroup(JSContextGroupRef group, JSClassRef globalObjectClass) AVAILABLE_IN_WEBKIT_VERSION_4_0; /*! @function @@ -123,7 +123,7 @@ JS_EXPORT JSObjectRef JSContextGetGlobalObject(JSContextRef ctx); @param ctx The JSContext whose group you want to get. @result ctx's group. */ -JS_EXPORT JSContextGroupRef JSContextGetGroup(JSContextRef ctx) AVAILABLE_AFTER_WEBKIT_VERSION_3_1; +JS_EXPORT JSContextGroupRef JSContextGetGroup(JSContextRef ctx) AVAILABLE_IN_WEBKIT_VERSION_4_0; #ifdef __cplusplus } diff --git a/API/JSObjectRef.cpp b/API/JSObjectRef.cpp index e81e512..50ee635 100644 --- a/API/JSObjectRef.cpp +++ b/API/JSObjectRef.cpp @@ -105,10 +105,10 @@ JSObjectRef JSObjectMakeConstructor(JSContextRef ctx, JSClassRef jsClass, JSObje exec->globalData().heap.registerThread(); JSLock lock(exec); - JSValuePtr jsPrototype = jsClass - ? jsClass->prototype(exec) - : exec->lexicalGlobalObject()->objectPrototype(); - + JSValue jsPrototype = jsClass ? jsClass->prototype(exec) : 0; + if (!jsPrototype) + jsPrototype = exec->lexicalGlobalObject()->objectPrototype(); + JSCallbackConstructor* constructor = new (exec) JSCallbackConstructor(exec->lexicalGlobalObject()->callbackConstructorStructure(), jsClass, callAsConstructor); constructor->putDirect(exec->propertyNames().prototype, jsPrototype, DontEnum | DontDelete | ReadOnly); return toRef(constructor); @@ -122,7 +122,7 @@ JSObjectRef JSObjectMakeFunction(JSContextRef ctx, JSStringRef name, unsigned pa Identifier nameID = name ? name->identifier(&exec->globalData()) : Identifier(exec, "anonymous"); - ArgList args; + MarkedArgumentBuffer args; for (unsigned i = 0; i < parameterCount; i++) args.append(jsString(exec, parameterNames[i]->ustring())); args.append(jsString(exec, body->ustring())); @@ -130,7 +130,7 @@ JSObjectRef JSObjectMakeFunction(JSContextRef ctx, JSStringRef name, unsigned pa JSObject* result = constructFunction(exec, args, nameID, sourceURL->ustring(), startingLineNumber); if (exec->hadException()) { if (exception) - *exception = toRef(exec->exception()); + *exception = toRef(exec, exec->exception()); exec->clearException(); result = 0; } @@ -145,9 +145,9 @@ JSObjectRef JSObjectMakeArray(JSContextRef ctx, size_t argumentCount, const JSVa JSObject* result; if (argumentCount) { - ArgList argList; + MarkedArgumentBuffer argList; for (size_t i = 0; i < argumentCount; ++i) - argList.append(toJS(arguments[i])); + argList.append(toJS(exec, arguments[i])); result = constructArray(exec, argList); } else @@ -155,7 +155,7 @@ JSObjectRef JSObjectMakeArray(JSContextRef ctx, size_t argumentCount, const JSVa if (exec->hadException()) { if (exception) - *exception = toRef(exec->exception()); + *exception = toRef(exec, exec->exception()); exec->clearException(); result = 0; } @@ -169,14 +169,14 @@ JSObjectRef JSObjectMakeDate(JSContextRef ctx, size_t argumentCount, const JSVal exec->globalData().heap.registerThread(); JSLock lock(exec); - ArgList argList; + MarkedArgumentBuffer argList; for (size_t i = 0; i < argumentCount; ++i) - argList.append(toJS(arguments[i])); + argList.append(toJS(exec, arguments[i])); JSObject* result = constructDate(exec, argList); if (exec->hadException()) { if (exception) - *exception = toRef(exec->exception()); + *exception = toRef(exec, exec->exception()); exec->clearException(); result = 0; } @@ -190,14 +190,14 @@ JSObjectRef JSObjectMakeError(JSContextRef ctx, size_t argumentCount, const JSVa exec->globalData().heap.registerThread(); JSLock lock(exec); - ArgList argList; + MarkedArgumentBuffer argList; for (size_t i = 0; i < argumentCount; ++i) - argList.append(toJS(arguments[i])); + argList.append(toJS(exec, arguments[i])); JSObject* result = constructError(exec, argList); if (exec->hadException()) { if (exception) - *exception = toRef(exec->exception()); + *exception = toRef(exec, exec->exception()); exec->clearException(); result = 0; } @@ -211,14 +211,14 @@ JSObjectRef JSObjectMakeRegExp(JSContextRef ctx, size_t argumentCount, const JSV exec->globalData().heap.registerThread(); JSLock lock(exec); - ArgList argList; + MarkedArgumentBuffer argList; for (size_t i = 0; i < argumentCount; ++i) - argList.append(toJS(arguments[i])); + argList.append(toJS(exec, arguments[i])); JSObject* result = constructRegExp(exec, argList); if (exec->hadException()) { if (exception) - *exception = toRef(exec->exception()); + *exception = toRef(exec, exec->exception()); exec->clearException(); result = 0; } @@ -226,16 +226,24 @@ JSObjectRef JSObjectMakeRegExp(JSContextRef ctx, size_t argumentCount, const JSV return toRef(result); } -JSValueRef JSObjectGetPrototype(JSContextRef, JSObjectRef object) +JSValueRef JSObjectGetPrototype(JSContextRef ctx, JSObjectRef object) { + ExecState* exec = toJS(ctx); + exec->globalData().heap.registerThread(); + JSLock lock(exec); + JSObject* jsObject = toJS(object); - return toRef(jsObject->prototype()); + return toRef(exec, jsObject->prototype()); } -void JSObjectSetPrototype(JSContextRef, JSObjectRef object, JSValueRef value) +void JSObjectSetPrototype(JSContextRef ctx, JSObjectRef object, JSValueRef value) { + ExecState* exec = toJS(ctx); + exec->globalData().heap.registerThread(); + JSLock lock(exec); + JSObject* jsObject = toJS(object); - JSValuePtr jsValue = toJS(value); + JSValue jsValue = toJS(exec, value); jsObject->setPrototype(jsValue.isObject() ? jsValue : jsNull()); } @@ -259,13 +267,13 @@ JSValueRef JSObjectGetProperty(JSContextRef ctx, JSObjectRef object, JSStringRef JSObject* jsObject = toJS(object); - JSValuePtr jsValue = jsObject->get(exec, propertyName->identifier(&exec->globalData())); + JSValue jsValue = jsObject->get(exec, propertyName->identifier(&exec->globalData())); if (exec->hadException()) { if (exception) - *exception = toRef(exec->exception()); + *exception = toRef(exec, exec->exception()); exec->clearException(); } - return toRef(jsValue); + return toRef(exec, jsValue); } void JSObjectSetProperty(JSContextRef ctx, JSObjectRef object, JSStringRef propertyName, JSValueRef value, JSPropertyAttributes attributes, JSValueRef* exception) @@ -276,7 +284,7 @@ void JSObjectSetProperty(JSContextRef ctx, JSObjectRef object, JSStringRef prope JSObject* jsObject = toJS(object); Identifier name(propertyName->identifier(&exec->globalData())); - JSValuePtr jsValue = toJS(value); + JSValue jsValue = toJS(exec, value); if (attributes && !jsObject->hasProperty(exec, name)) jsObject->putWithAttributes(exec, name, jsValue, attributes); @@ -287,7 +295,7 @@ void JSObjectSetProperty(JSContextRef ctx, JSObjectRef object, JSStringRef prope if (exec->hadException()) { if (exception) - *exception = toRef(exec->exception()); + *exception = toRef(exec, exec->exception()); exec->clearException(); } } @@ -300,13 +308,13 @@ JSValueRef JSObjectGetPropertyAtIndex(JSContextRef ctx, JSObjectRef object, unsi JSObject* jsObject = toJS(object); - JSValuePtr jsValue = jsObject->get(exec, propertyIndex); + JSValue jsValue = jsObject->get(exec, propertyIndex); if (exec->hadException()) { if (exception) - *exception = toRef(exec->exception()); + *exception = toRef(exec, exec->exception()); exec->clearException(); } - return toRef(jsValue); + return toRef(exec, jsValue); } @@ -317,12 +325,12 @@ void JSObjectSetPropertyAtIndex(JSContextRef ctx, JSObjectRef object, unsigned p JSLock lock(exec); JSObject* jsObject = toJS(object); - JSValuePtr jsValue = toJS(value); + JSValue jsValue = toJS(exec, value); jsObject->put(exec, propertyIndex, jsValue); if (exec->hadException()) { if (exception) - *exception = toRef(exec->exception()); + *exception = toRef(exec, exec->exception()); exec->clearException(); } } @@ -338,7 +346,7 @@ bool JSObjectDeleteProperty(JSContextRef ctx, JSObjectRef object, JSStringRef pr bool result = jsObject->deleteProperty(exec, propertyName->identifier(&exec->globalData())); if (exec->hadException()) { if (exception) - *exception = toRef(exec->exception()); + *exception = toRef(exec, exec->exception()); exec->clearException(); } return result; @@ -389,19 +397,19 @@ JSValueRef JSObjectCallAsFunction(JSContextRef ctx, JSObjectRef object, JSObject if (!jsThisObject) jsThisObject = exec->globalThisValue(); - ArgList argList; + MarkedArgumentBuffer argList; for (size_t i = 0; i < argumentCount; i++) - argList.append(toJS(arguments[i])); + argList.append(toJS(exec, arguments[i])); CallData callData; CallType callType = jsObject->getCallData(callData); if (callType == CallTypeNone) return 0; - JSValueRef result = toRef(call(exec, jsObject, callType, callData, jsThisObject, argList)); + JSValueRef result = toRef(exec, call(exec, jsObject, callType, callData, jsThisObject, argList)); if (exec->hadException()) { if (exception) - *exception = toRef(exec->exception()); + *exception = toRef(exec, exec->exception()); exec->clearException(); result = 0; } @@ -428,13 +436,13 @@ JSObjectRef JSObjectCallAsConstructor(JSContextRef ctx, JSObjectRef object, size if (constructType == ConstructTypeNone) return 0; - ArgList argList; + MarkedArgumentBuffer argList; for (size_t i = 0; i < argumentCount; i++) - argList.append(toJS(arguments[i])); + argList.append(toJS(exec, arguments[i])); JSObjectRef result = toRef(construct(exec, jsObject, constructType, constructData, argList)); if (exec->hadException()) { if (exception) - *exception = toRef(exec->exception()); + *exception = toRef(exec, exec->exception()); exec->clearException(); result = 0; } diff --git a/API/JSObjectRef.h b/API/JSObjectRef.h index 461764c..3e8b0eb 100644 --- a/API/JSObjectRef.h +++ b/API/JSObjectRef.h @@ -441,7 +441,7 @@ JS_EXPORT JSObjectRef JSObjectMakeConstructor(JSContextRef ctx, JSClassRef jsCla @discussion The behavior of this function does not exactly match the behavior of the built-in Array constructor. Specifically, if one argument is supplied, this function returns an array with one element. */ -JS_EXPORT JSObjectRef JSObjectMakeArray(JSContextRef ctx, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) AVAILABLE_AFTER_WEBKIT_VERSION_3_1; +JS_EXPORT JSObjectRef JSObjectMakeArray(JSContextRef ctx, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) AVAILABLE_IN_WEBKIT_VERSION_4_0; /*! @function @@ -452,7 +452,7 @@ JS_EXPORT JSObjectRef JSObjectMakeArray(JSContextRef ctx, size_t argumentCount, @param exception A pointer to a JSValueRef in which to store an exception, if any. Pass NULL if you do not care to store an exception. @result A JSObject that is a Date. */ -JS_EXPORT JSObjectRef JSObjectMakeDate(JSContextRef ctx, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) AVAILABLE_AFTER_WEBKIT_VERSION_3_1; +JS_EXPORT JSObjectRef JSObjectMakeDate(JSContextRef ctx, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) AVAILABLE_IN_WEBKIT_VERSION_4_0; /*! @function @@ -463,7 +463,7 @@ JS_EXPORT JSObjectRef JSObjectMakeDate(JSContextRef ctx, size_t argumentCount, c @param exception A pointer to a JSValueRef in which to store an exception, if any. Pass NULL if you do not care to store an exception. @result A JSObject that is a Error. */ -JS_EXPORT JSObjectRef JSObjectMakeError(JSContextRef ctx, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) AVAILABLE_AFTER_WEBKIT_VERSION_3_1; +JS_EXPORT JSObjectRef JSObjectMakeError(JSContextRef ctx, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) AVAILABLE_IN_WEBKIT_VERSION_4_0; /*! @function @@ -474,7 +474,7 @@ JS_EXPORT JSObjectRef JSObjectMakeError(JSContextRef ctx, size_t argumentCount, @param exception A pointer to a JSValueRef in which to store an exception, if any. Pass NULL if you do not care to store an exception. @result A JSObject that is a RegExp. */ -JS_EXPORT JSObjectRef JSObjectMakeRegExp(JSContextRef ctx, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) AVAILABLE_AFTER_WEBKIT_VERSION_3_1; +JS_EXPORT JSObjectRef JSObjectMakeRegExp(JSContextRef ctx, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) AVAILABLE_IN_WEBKIT_VERSION_4_0; /*! @function diff --git a/API/JSValueRef.cpp b/API/JSValueRef.cpp index 7080952..2207181 100644 --- a/API/JSValueRef.cpp +++ b/API/JSValueRef.cpp @@ -41,9 +41,14 @@ #include // for std::min -JSType JSValueGetType(JSContextRef, JSValueRef value) +JSType JSValueGetType(JSContextRef ctx, JSValueRef value) { - JSC::JSValuePtr jsValue = toJS(value); + JSC::ExecState* exec = toJS(ctx); + exec->globalData().heap.registerThread(); + JSC::JSLock lock(exec); + + JSC::JSValue jsValue = toJS(exec, value); + if (jsValue.isUndefined()) return kJSTypeUndefined; if (jsValue.isNull()) @@ -60,45 +65,73 @@ JSType JSValueGetType(JSContextRef, JSValueRef value) using namespace JSC; // placed here to avoid conflict between JSC::JSType and JSType, above. -bool JSValueIsUndefined(JSContextRef, JSValueRef value) +bool JSValueIsUndefined(JSContextRef ctx, JSValueRef value) { - JSValuePtr jsValue = toJS(value); + ExecState* exec = toJS(ctx); + exec->globalData().heap.registerThread(); + JSLock lock(exec); + + JSValue jsValue = toJS(exec, value); return jsValue.isUndefined(); } -bool JSValueIsNull(JSContextRef, JSValueRef value) +bool JSValueIsNull(JSContextRef ctx, JSValueRef value) { - JSValuePtr jsValue = toJS(value); + ExecState* exec = toJS(ctx); + exec->globalData().heap.registerThread(); + JSLock lock(exec); + + JSValue jsValue = toJS(exec, value); return jsValue.isNull(); } -bool JSValueIsBoolean(JSContextRef, JSValueRef value) +bool JSValueIsBoolean(JSContextRef ctx, JSValueRef value) { - JSValuePtr jsValue = toJS(value); + ExecState* exec = toJS(ctx); + exec->globalData().heap.registerThread(); + JSLock lock(exec); + + JSValue jsValue = toJS(exec, value); return jsValue.isBoolean(); } -bool JSValueIsNumber(JSContextRef, JSValueRef value) +bool JSValueIsNumber(JSContextRef ctx, JSValueRef value) { - JSValuePtr jsValue = toJS(value); + ExecState* exec = toJS(ctx); + exec->globalData().heap.registerThread(); + JSLock lock(exec); + + JSValue jsValue = toJS(exec, value); return jsValue.isNumber(); } -bool JSValueIsString(JSContextRef, JSValueRef value) +bool JSValueIsString(JSContextRef ctx, JSValueRef value) { - JSValuePtr jsValue = toJS(value); + ExecState* exec = toJS(ctx); + exec->globalData().heap.registerThread(); + JSLock lock(exec); + + JSValue jsValue = toJS(exec, value); return jsValue.isString(); } -bool JSValueIsObject(JSContextRef, JSValueRef value) +bool JSValueIsObject(JSContextRef ctx, JSValueRef value) { - JSValuePtr jsValue = toJS(value); + ExecState* exec = toJS(ctx); + exec->globalData().heap.registerThread(); + JSLock lock(exec); + + JSValue jsValue = toJS(exec, value); return jsValue.isObject(); } -bool JSValueIsObjectOfClass(JSContextRef, JSValueRef value, JSClassRef jsClass) +bool JSValueIsObjectOfClass(JSContextRef ctx, JSValueRef value, JSClassRef jsClass) { - JSValuePtr jsValue = toJS(value); + ExecState* exec = toJS(ctx); + exec->globalData().heap.registerThread(); + JSLock lock(exec); + + JSValue jsValue = toJS(exec, value); if (JSObject* o = jsValue.getObject()) { if (o->inherits(&JSCallbackObject::info)) @@ -115,25 +148,28 @@ bool JSValueIsEqual(JSContextRef ctx, JSValueRef a, JSValueRef b, JSValueRef* ex exec->globalData().heap.registerThread(); JSLock lock(exec); - JSValuePtr jsA = toJS(a); - JSValuePtr jsB = toJS(b); + JSValue jsA = toJS(exec, a); + JSValue jsB = toJS(exec, b); - bool result = JSValuePtr::equal(exec, jsA, jsB); // false if an exception is thrown + bool result = JSValue::equal(exec, jsA, jsB); // false if an exception is thrown if (exec->hadException()) { if (exception) - *exception = toRef(exec->exception()); + *exception = toRef(exec, exec->exception()); exec->clearException(); } return result; } -bool JSValueIsStrictEqual(JSContextRef, JSValueRef a, JSValueRef b) +bool JSValueIsStrictEqual(JSContextRef ctx, JSValueRef a, JSValueRef b) { - JSValuePtr jsA = toJS(a); - JSValuePtr jsB = toJS(b); - - bool result = JSValuePtr::strictEqual(jsA, jsB); - return result; + ExecState* exec = toJS(ctx); + exec->globalData().heap.registerThread(); + JSLock lock(exec); + + JSValue jsA = toJS(exec, a); + JSValue jsB = toJS(exec, b); + + return JSValue::strictEqual(jsA, jsB); } bool JSValueIsInstanceOfConstructor(JSContextRef ctx, JSValueRef value, JSObjectRef constructor, JSValueRef* exception) @@ -142,32 +178,45 @@ bool JSValueIsInstanceOfConstructor(JSContextRef ctx, JSValueRef value, JSObject exec->globalData().heap.registerThread(); JSLock lock(exec); - JSValuePtr jsValue = toJS(value); + JSValue jsValue = toJS(exec, value); + JSObject* jsConstructor = toJS(constructor); if (!jsConstructor->structure()->typeInfo().implementsHasInstance()) return false; bool result = jsConstructor->hasInstance(exec, jsValue, jsConstructor->get(exec, exec->propertyNames().prototype)); // false if an exception is thrown if (exec->hadException()) { if (exception) - *exception = toRef(exec->exception()); + *exception = toRef(exec, exec->exception()); exec->clearException(); } return result; } -JSValueRef JSValueMakeUndefined(JSContextRef) +JSValueRef JSValueMakeUndefined(JSContextRef ctx) { - return toRef(jsUndefined()); + ExecState* exec = toJS(ctx); + exec->globalData().heap.registerThread(); + JSLock lock(exec); + + return toRef(exec, jsUndefined()); } -JSValueRef JSValueMakeNull(JSContextRef) +JSValueRef JSValueMakeNull(JSContextRef ctx) { - return toRef(jsNull()); + ExecState* exec = toJS(ctx); + exec->globalData().heap.registerThread(); + JSLock lock(exec); + + return toRef(exec, jsNull()); } -JSValueRef JSValueMakeBoolean(JSContextRef, bool value) +JSValueRef JSValueMakeBoolean(JSContextRef ctx, bool value) { - return toRef(jsBoolean(value)); + ExecState* exec = toJS(ctx); + exec->globalData().heap.registerThread(); + JSLock lock(exec); + + return toRef(exec, jsBoolean(value)); } JSValueRef JSValueMakeNumber(JSContextRef ctx, double value) @@ -176,7 +225,7 @@ JSValueRef JSValueMakeNumber(JSContextRef ctx, double value) exec->globalData().heap.registerThread(); JSLock lock(exec); - return toRef(jsNumber(exec, value)); + return toRef(exec, jsNumber(exec, value)); } JSValueRef JSValueMakeString(JSContextRef ctx, JSStringRef string) @@ -185,13 +234,16 @@ JSValueRef JSValueMakeString(JSContextRef ctx, JSStringRef string) exec->globalData().heap.registerThread(); JSLock lock(exec); - return toRef(jsString(exec, string->ustring())); + return toRef(exec, jsString(exec, string->ustring())); } bool JSValueToBoolean(JSContextRef ctx, JSValueRef value) { ExecState* exec = toJS(ctx); - JSValuePtr jsValue = toJS(value); + exec->globalData().heap.registerThread(); + JSLock lock(exec); + + JSValue jsValue = toJS(exec, value); return jsValue.toBoolean(exec); } @@ -201,12 +253,12 @@ double JSValueToNumber(JSContextRef ctx, JSValueRef value, JSValueRef* exception exec->globalData().heap.registerThread(); JSLock lock(exec); - JSValuePtr jsValue = toJS(value); + JSValue jsValue = toJS(exec, value); double number = jsValue.toNumber(exec); if (exec->hadException()) { if (exception) - *exception = toRef(exec->exception()); + *exception = toRef(exec, exec->exception()); exec->clearException(); number = NaN; } @@ -219,12 +271,12 @@ JSStringRef JSValueToStringCopy(JSContextRef ctx, JSValueRef value, JSValueRef* exec->globalData().heap.registerThread(); JSLock lock(exec); - JSValuePtr jsValue = toJS(value); + JSValue jsValue = toJS(exec, value); RefPtr stringRef(OpaqueJSString::create(jsValue.toString(exec))); if (exec->hadException()) { if (exception) - *exception = toRef(exec->exception()); + *exception = toRef(exec, exec->exception()); exec->clearException(); stringRef.clear(); } @@ -237,12 +289,12 @@ JSObjectRef JSValueToObject(JSContextRef ctx, JSValueRef value, JSValueRef* exce exec->globalData().heap.registerThread(); JSLock lock(exec); - JSValuePtr jsValue = toJS(value); + JSValue jsValue = toJS(exec, value); JSObjectRef objectRef = toRef(jsValue.toObject(exec)); if (exec->hadException()) { if (exception) - *exception = toRef(exec->exception()); + *exception = toRef(exec, exec->exception()); exec->clearException(); objectRef = 0; } @@ -255,7 +307,7 @@ void JSValueProtect(JSContextRef ctx, JSValueRef value) exec->globalData().heap.registerThread(); JSLock lock(exec); - JSValuePtr jsValue = toJS(value); + JSValue jsValue = toJS(exec, value); gcProtect(jsValue); } @@ -265,6 +317,6 @@ void JSValueUnprotect(JSContextRef ctx, JSValueRef value) exec->globalData().heap.registerThread(); JSLock lock(exec); - JSValuePtr jsValue = toJS(value); + JSValue jsValue = toJS(exec, value); gcUnprotect(jsValue); } diff --git a/API/WebKitAvailability.h b/API/WebKitAvailability.h index 1273360..8402528 100644 --- a/API/WebKitAvailability.h +++ b/API/WebKitAvailability.h @@ -38,6 +38,7 @@ #define WEBKIT_VERSION_2_0 0x0200 #define WEBKIT_VERSION_3_0 0x0300 #define WEBKIT_VERSION_3_1 0x0310 +#define WEBKIT_VERSION_4_0 0x0400 #define WEBKIT_VERSION_LATEST 0x9999 #ifdef __APPLE__ @@ -640,123 +641,123 @@ /* - * AVAILABLE_AFTER_WEBKIT_VERSION_3_1 + * AVAILABLE_IN_WEBKIT_VERSION_4_0 * - * Used on declarations introduced after WebKit 3.1 + * Used on declarations introduced in WebKit 4.0 */ #if WEBKIT_VERSION_MAX_ALLOWED < WEBKIT_VERSION_LATEST - #define AVAILABLE_AFTER_WEBKIT_VERSION_3_1 UNAVAILABLE_ATTRIBUTE + #define AVAILABLE_IN_WEBKIT_VERSION_4_0 UNAVAILABLE_ATTRIBUTE #elif WEBKIT_VERSION_MIN_REQUIRED < WEBKIT_VERSION_LATEST - #define AVAILABLE_AFTER_WEBKIT_VERSION_3_1 WEAK_IMPORT_ATTRIBUTE + #define AVAILABLE_IN_WEBKIT_VERSION_4_0 WEAK_IMPORT_ATTRIBUTE #else - #define AVAILABLE_AFTER_WEBKIT_VERSION_3_1 + #define AVAILABLE_IN_WEBKIT_VERSION_4_0 #endif /* - * AVAILABLE_AFTER_WEBKIT_VERSION_3_1_BUT_DEPRECATED + * AVAILABLE_IN_WEBKIT_VERSION_4_0_BUT_DEPRECATED * - * Used on declarations introduced after WebKit 3.1, - * and deprecated after WebKit 3.1 + * Used on declarations introduced in WebKit 4.0, + * and deprecated in WebKit 4.0 */ #if WEBKIT_VERSION_MIN_REQUIRED >= WEBKIT_VERSION_LATEST - #define AVAILABLE_AFTER_WEBKIT_VERSION_3_1_BUT_DEPRECATED DEPRECATED_ATTRIBUTE + #define AVAILABLE_IN_WEBKIT_VERSION_4_0_BUT_DEPRECATED DEPRECATED_ATTRIBUTE #else - #define AVAILABLE_AFTER_WEBKIT_VERSION_3_1_BUT_DEPRECATED AVAILABLE_AFTER_WEBKIT_VERSION_3_1 + #define AVAILABLE_IN_WEBKIT_VERSION_4_0_BUT_DEPRECATED AVAILABLE_IN_WEBKIT_VERSION_4_0 #endif /* - * AVAILABLE_WEBKIT_VERSION_1_0_AND_LATER_BUT_DEPRECATED_AFTER_WEBKIT_VERSION_3_1 + * AVAILABLE_WEBKIT_VERSION_1_0_AND_LATER_BUT_DEPRECATED_IN_WEBKIT_VERSION_4_0 * * Used on declarations introduced in WebKit 1.0, - * but later deprecated after WebKit 3.1 + * but later deprecated in WebKit 4.0 */ #if WEBKIT_VERSION_MIN_REQUIRED >= WEBKIT_VERSION_LATEST - #define AVAILABLE_WEBKIT_VERSION_1_0_AND_LATER_BUT_DEPRECATED_AFTER_WEBKIT_VERSION_3_1 DEPRECATED_ATTRIBUTE + #define AVAILABLE_WEBKIT_VERSION_1_0_AND_LATER_BUT_DEPRECATED_IN_WEBKIT_VERSION_4_0 DEPRECATED_ATTRIBUTE #else - #define AVAILABLE_WEBKIT_VERSION_1_0_AND_LATER_BUT_DEPRECATED_AFTER_WEBKIT_VERSION_3_1 AVAILABLE_WEBKIT_VERSION_1_0_AND_LATER + #define AVAILABLE_WEBKIT_VERSION_1_0_AND_LATER_BUT_DEPRECATED_IN_WEBKIT_VERSION_4_0 AVAILABLE_WEBKIT_VERSION_1_0_AND_LATER #endif /* - * AVAILABLE_WEBKIT_VERSION_1_1_AND_LATER_BUT_DEPRECATED_AFTER_WEBKIT_VERSION_3_1 + * AVAILABLE_WEBKIT_VERSION_1_1_AND_LATER_BUT_DEPRECATED_IN_WEBKIT_VERSION_4_0 * * Used on declarations introduced in WebKit 1.1, - * but later deprecated after WebKit 3.1 + * but later deprecated in WebKit 4.0 */ #if WEBKIT_VERSION_MIN_REQUIRED >= WEBKIT_VERSION_LATEST - #define AVAILABLE_WEBKIT_VERSION_1_1_AND_LATER_BUT_DEPRECATED_AFTER_WEBKIT_VERSION_3_1 DEPRECATED_ATTRIBUTE + #define AVAILABLE_WEBKIT_VERSION_1_1_AND_LATER_BUT_DEPRECATED_IN_WEBKIT_VERSION_4_0 DEPRECATED_ATTRIBUTE #else - #define AVAILABLE_WEBKIT_VERSION_1_1_AND_LATER_BUT_DEPRECATED_AFTER_WEBKIT_VERSION_3_1 AVAILABLE_WEBKIT_VERSION_1_1_AND_LATER + #define AVAILABLE_WEBKIT_VERSION_1_1_AND_LATER_BUT_DEPRECATED_IN_WEBKIT_VERSION_4_0 AVAILABLE_WEBKIT_VERSION_1_1_AND_LATER #endif /* - * AVAILABLE_WEBKIT_VERSION_1_2_AND_LATER_BUT_DEPRECATED_AFTER_WEBKIT_VERSION_3_1 + * AVAILABLE_WEBKIT_VERSION_1_2_AND_LATER_BUT_DEPRECATED_IN_WEBKIT_VERSION_4_0 * * Used on declarations introduced in WebKit 1.2, - * but later deprecated after WebKit 3.1 + * but later deprecated in WebKit 4.0 */ #if WEBKIT_VERSION_MIN_REQUIRED >= WEBKIT_VERSION_LATEST - #define AVAILABLE_WEBKIT_VERSION_1_2_AND_LATER_BUT_DEPRECATED_AFTER_WEBKIT_VERSION_3_1 DEPRECATED_ATTRIBUTE + #define AVAILABLE_WEBKIT_VERSION_1_2_AND_LATER_BUT_DEPRECATED_IN_WEBKIT_VERSION_4_0 DEPRECATED_ATTRIBUTE #else - #define AVAILABLE_WEBKIT_VERSION_1_2_AND_LATER_BUT_DEPRECATED_AFTER_WEBKIT_VERSION_3_1 AVAILABLE_WEBKIT_VERSION_1_2_AND_LATER + #define AVAILABLE_WEBKIT_VERSION_1_2_AND_LATER_BUT_DEPRECATED_IN_WEBKIT_VERSION_4_0 AVAILABLE_WEBKIT_VERSION_1_2_AND_LATER #endif /* - * AVAILABLE_WEBKIT_VERSION_1_3_AND_LATER_BUT_DEPRECATED_AFTER_WEBKIT_VERSION_3_1 + * AVAILABLE_WEBKIT_VERSION_1_3_AND_LATER_BUT_DEPRECATED_IN_WEBKIT_VERSION_4_0 * * Used on declarations introduced in WebKit 1.3, - * but later deprecated after WebKit 3.1 + * but later deprecated in WebKit 4.0 */ #if WEBKIT_VERSION_MIN_REQUIRED >= WEBKIT_VERSION_LATEST - #define AVAILABLE_WEBKIT_VERSION_1_3_AND_LATER_BUT_DEPRECATED_AFTER_WEBKIT_VERSION_3_1 DEPRECATED_ATTRIBUTE + #define AVAILABLE_WEBKIT_VERSION_1_3_AND_LATER_BUT_DEPRECATED_IN_WEBKIT_VERSION_4_0 DEPRECATED_ATTRIBUTE #else - #define AVAILABLE_WEBKIT_VERSION_1_3_AND_LATER_BUT_DEPRECATED_AFTER_WEBKIT_VERSION_3_1 AVAILABLE_WEBKIT_VERSION_1_3_AND_LATER + #define AVAILABLE_WEBKIT_VERSION_1_3_AND_LATER_BUT_DEPRECATED_IN_WEBKIT_VERSION_4_0 AVAILABLE_WEBKIT_VERSION_1_3_AND_LATER #endif /* - * AVAILABLE_WEBKIT_VERSION_2_0_AND_LATER_BUT_DEPRECATED_AFTER_WEBKIT_VERSION_3_1 + * AVAILABLE_WEBKIT_VERSION_2_0_AND_LATER_BUT_DEPRECATED_IN_WEBKIT_VERSION_4_0 * * Used on declarations introduced in WebKit 2.0, - * but later deprecated after WebKit 3.1 + * but later deprecated in WebKit 4.0 */ #if WEBKIT_VERSION_MIN_REQUIRED >= WEBKIT_VERSION_LATEST - #define AVAILABLE_WEBKIT_VERSION_2_0_AND_LATER_BUT_DEPRECATED_AFTER_WEBKIT_VERSION_3_1 DEPRECATED_ATTRIBUTE + #define AVAILABLE_WEBKIT_VERSION_2_0_AND_LATER_BUT_DEPRECATED_IN_WEBKIT_VERSION_4_0 DEPRECATED_ATTRIBUTE #else - #define AVAILABLE_WEBKIT_VERSION_2_0_AND_LATER_BUT_DEPRECATED_AFTER_WEBKIT_VERSION_3_1 AVAILABLE_WEBKIT_VERSION_2_0_AND_LATER + #define AVAILABLE_WEBKIT_VERSION_2_0_AND_LATER_BUT_DEPRECATED_IN_WEBKIT_VERSION_4_0 AVAILABLE_WEBKIT_VERSION_2_0_AND_LATER #endif /* - * AVAILABLE_WEBKIT_VERSION_3_0_AND_LATER_BUT_DEPRECATED_AFTER_WEBKIT_VERSION_3_1 + * AVAILABLE_WEBKIT_VERSION_3_0_AND_LATER_BUT_DEPRECATED_IN_WEBKIT_VERSION_4_0 * * Used on declarations introduced in WebKit 3.0, - * but later deprecated after WebKit 3.1 + * but later deprecated in WebKit 4.0 */ #if WEBKIT_VERSION_MIN_REQUIRED >= WEBKIT_VERSION_LATEST - #define AVAILABLE_WEBKIT_VERSION_3_0_AND_LATER_BUT_DEPRECATED_AFTER_WEBKIT_VERSION_3_1 DEPRECATED_ATTRIBUTE + #define AVAILABLE_WEBKIT_VERSION_3_0_AND_LATER_BUT_DEPRECATED_IN_WEBKIT_VERSION_4_0 DEPRECATED_ATTRIBUTE #else - #define AVAILABLE_WEBKIT_VERSION_3_0_AND_LATER_BUT_DEPRECATED_AFTER_WEBKIT_VERSION_3_1 AVAILABLE_WEBKIT_VERSION_3_0_AND_LATER + #define AVAILABLE_WEBKIT_VERSION_3_0_AND_LATER_BUT_DEPRECATED_IN_WEBKIT_VERSION_4_0 AVAILABLE_WEBKIT_VERSION_3_0_AND_LATER #endif /* - * AVAILABLE_WEBKIT_VERSION_3_1_AND_LATER_BUT_DEPRECATED_AFTER_WEBKIT_VERSION_3_1 + * AVAILABLE_WEBKIT_VERSION_3_1_AND_LATER_BUT_DEPRECATED_IN_WEBKIT_VERSION_4_0 * * Used on declarations introduced in WebKit 3.1, - * but later deprecated after WebKit 3.1 + * but later deprecated in WebKit 4.0 */ #if WEBKIT_VERSION_MIN_REQUIRED >= WEBKIT_VERSION_LATEST - #define AVAILABLE_WEBKIT_VERSION_3_1_AND_LATER_BUT_DEPRECATED_AFTER_WEBKIT_VERSION_3_1 DEPRECATED_ATTRIBUTE + #define AVAILABLE_WEBKIT_VERSION_3_1_AND_LATER_BUT_DEPRECATED_IN_WEBKIT_VERSION_4_0 DEPRECATED_ATTRIBUTE #else - #define AVAILABLE_WEBKIT_VERSION_3_1_AND_LATER_BUT_DEPRECATED_AFTER_WEBKIT_VERSION_3_1 AVAILABLE_WEBKIT_VERSION_3_1_AND_LATER + #define AVAILABLE_WEBKIT_VERSION_3_1_AND_LATER_BUT_DEPRECATED_IN_WEBKIT_VERSION_4_0 AVAILABLE_WEBKIT_VERSION_3_1_AND_LATER #endif /* - * DEPRECATED_AFTER_WEBKIT_VERSION_3_1 + * DEPRECATED_IN_WEBKIT_VERSION_4_0 * - * Used on types deprecated after WebKit 3.1 + * Used on types deprecated in WebKit 4.0 */ #if WEBKIT_VERSION_MIN_REQUIRED >= WEBKIT_VERSION_LATEST - #define DEPRECATED_AFTER_WEBKIT_VERSION_3_1 DEPRECATED_ATTRIBUTE + #define DEPRECATED_IN_WEBKIT_VERSION_4_0 DEPRECATED_ATTRIBUTE #else - #define DEPRECATED_AFTER_WEBKIT_VERSION_3_1 + #define DEPRECATED_IN_WEBKIT_VERSION_4_0 #endif diff --git a/API/tests/testapi.c b/API/tests/testapi.c index 48c8583..1f413e1 100644 --- a/API/tests/testapi.c +++ b/API/tests/testapi.c @@ -26,6 +26,7 @@ #include "JavaScriptCore.h" #include "JSBasePrivate.h" #include +#define ASSERT_DISABLED 0 #include #include @@ -41,11 +42,13 @@ static double nan(const char*) #endif static JSGlobalContextRef context = 0; - +static int failed = 0; static void assertEqualsAsBoolean(JSValueRef value, bool expectedValue) { - if (JSValueToBoolean(context, value) != expectedValue) + if (JSValueToBoolean(context, value) != expectedValue) { fprintf(stderr, "assertEqualsAsBoolean failed: %p, %d\n", value, expectedValue); + failed = 1; + } } static void assertEqualsAsNumber(JSValueRef value, double expectedValue) @@ -55,8 +58,10 @@ static void assertEqualsAsNumber(JSValueRef value, double expectedValue) // FIXME - On i386 the isnan(double) macro tries to map to the isnan(float) function, // causing a build break with -Wshorten-64-to-32 enabled. The issue is known by the appropriate team. // After that's resolved, we can remove these casts - if (number != expectedValue && !(isnan((float)number) && isnan((float)expectedValue))) + if (number != expectedValue && !(isnan((float)number) && isnan((float)expectedValue))) { fprintf(stderr, "assertEqualsAsNumber failed: %p, %lf\n", value, expectedValue); + failed = 1; + } } static void assertEqualsAsUTF8String(JSValueRef value, const char* expectedValue) @@ -68,12 +73,17 @@ static void assertEqualsAsUTF8String(JSValueRef value, const char* expectedValue JSStringGetUTF8CString(valueAsString, jsBuffer, jsSize); unsigned i; - for (i = 0; jsBuffer[i]; i++) - if (jsBuffer[i] != expectedValue[i]) + for (i = 0; jsBuffer[i]; i++) { + if (jsBuffer[i] != expectedValue[i]) { fprintf(stderr, "assertEqualsAsUTF8String failed at character %d: %c(%d) != %c(%d)\n", i, jsBuffer[i], jsBuffer[i], expectedValue[i], expectedValue[i]); - - if (jsSize < strlen(jsBuffer) + 1) + failed = 1; + } + } + + if (jsSize < strlen(jsBuffer) + 1) { fprintf(stderr, "assertEqualsAsUTF8String failed: jsSize was too small\n"); + failed = 1; + } free(jsBuffer); JSStringRelease(valueAsString); @@ -94,16 +104,30 @@ static void assertEqualsAsCharactersPtr(JSValueRef value, const char* expectedVa CFStringGetCharacters(expectedValueAsCFString, CFRangeMake(0, cfLength), cfBuffer); CFRelease(expectedValueAsCFString); - if (memcmp(jsBuffer, cfBuffer, cfLength * sizeof(UniChar)) != 0) + if (memcmp(jsBuffer, cfBuffer, cfLength * sizeof(UniChar)) != 0) { fprintf(stderr, "assertEqualsAsCharactersPtr failed: jsBuffer != cfBuffer\n"); + failed = 1; + } - if (jsLength != (size_t)cfLength) + if (jsLength != (size_t)cfLength) { fprintf(stderr, "assertEqualsAsCharactersPtr failed: jsLength(%ld) != cfLength(%ld)\n", jsLength, cfLength); - + failed = 1; + } + free(cfBuffer); JSStringRelease(valueAsString); } +static bool timeZoneIsPST() +{ + char timeZoneName[70]; + struct tm gtm; + memset(>m, 0, sizeof(gtm)); + strftime(timeZoneName, sizeof(timeZoneName), "%Z", >m); + + return 0 == strcmp("PST", timeZoneName); +} + static JSValueRef jsGlobalValue; // non-stack value for testing JSValueProtect() /* MyObject pseudo-class */ @@ -115,6 +139,7 @@ static bool MyObject_hasProperty(JSContextRef context, JSObjectRef object, JSStr if (JSStringIsEqualToUTF8CString(propertyName, "alwaysOne") || JSStringIsEqualToUTF8CString(propertyName, "cantFind") + || JSStringIsEqualToUTF8CString(propertyName, "throwOnGet") || JSStringIsEqualToUTF8CString(propertyName, "myPropertyName") || JSStringIsEqualToUTF8CString(propertyName, "hasPropertyLie") || JSStringIsEqualToUTF8CString(propertyName, "0")) { @@ -140,7 +165,11 @@ static JSValueRef MyObject_getProperty(JSContextRef context, JSObjectRef object, if (JSStringIsEqualToUTF8CString(propertyName, "cantFind")) { return JSValueMakeUndefined(context); } - + + if (JSStringIsEqualToUTF8CString(propertyName, "throwOnGet")) { + return JSEvaluateScript(context, JSStringCreateWithUTF8CString("throw 'an exception'"), object, JSStringCreateWithUTF8CString("test script"), 1, exception); + } + if (JSStringIsEqualToUTF8CString(propertyName, "0")) { *exception = JSValueMakeNumber(context, 1); return JSValueMakeNumber(context, 1); @@ -159,6 +188,10 @@ static bool MyObject_setProperty(JSContextRef context, JSObjectRef object, JSStr if (JSStringIsEqualToUTF8CString(propertyName, "cantSet")) return true; // pretend we set the property in order to swallow it + if (JSStringIsEqualToUTF8CString(propertyName, "throwOnSet")) { + JSEvaluateScript(context, JSStringCreateWithUTF8CString("throw 'an exception'"), object, JSStringCreateWithUTF8CString("test script"), 1, exception); + } + return false; } @@ -171,7 +204,7 @@ static bool MyObject_deleteProperty(JSContextRef context, JSObjectRef object, JS return true; if (JSStringIsEqualToUTF8CString(propertyName, "throwOnDelete")) { - *exception = JSValueMakeNumber(context, 2); + JSEvaluateScript(context, JSStringCreateWithUTF8CString("throw 'an exception'"), object, JSStringCreateWithUTF8CString("test script"), 1, exception); return false; } @@ -201,6 +234,11 @@ static JSValueRef MyObject_callAsFunction(JSContextRef context, JSObjectRef obje UNUSED_PARAM(thisObject); UNUSED_PARAM(exception); + if (argumentCount > 0 && JSValueIsString(context, arguments[0]) && JSStringIsEqualToUTF8CString(JSValueToStringCopy(context, arguments[0], 0), "throwOnCall")) { + JSEvaluateScript(context, JSStringCreateWithUTF8CString("throw 'an exception'"), object, JSStringCreateWithUTF8CString("test script"), 1, exception); + return JSValueMakeUndefined(context); + } + if (argumentCount > 0 && JSValueIsStrictEqual(context, arguments[0], JSValueMakeNumber(context, 0))) return JSValueMakeNumber(context, 1); @@ -212,6 +250,11 @@ static JSObjectRef MyObject_callAsConstructor(JSContextRef context, JSObjectRef UNUSED_PARAM(context); UNUSED_PARAM(object); + if (argumentCount > 0 && JSValueIsString(context, arguments[0]) && JSStringIsEqualToUTF8CString(JSValueToStringCopy(context, arguments[0], 0), "throwOnConstruct")) { + JSEvaluateScript(context, JSStringCreateWithUTF8CString("throw 'an exception'"), object, JSStringCreateWithUTF8CString("test script"), 1, exception); + return object; + } + if (argumentCount > 0 && JSValueIsStrictEqual(context, arguments[0], JSValueMakeNumber(context, 0))) return JSValueToObject(context, JSValueMakeNumber(context, 1), exception); @@ -223,6 +266,11 @@ static bool MyObject_hasInstance(JSContextRef context, JSObjectRef constructor, UNUSED_PARAM(context); UNUSED_PARAM(constructor); + if (JSValueIsString(context, possibleValue) && JSStringIsEqualToUTF8CString(JSValueToStringCopy(context, possibleValue, 0), "throwOnHasInstance")) { + JSEvaluateScript(context, JSStringCreateWithUTF8CString("throw 'an exception'"), constructor, JSStringCreateWithUTF8CString("test script"), 1, exception); + return false; + } + JSStringRef numberString = JSStringCreateWithUTF8CString("Number"); JSObjectRef numberConstructor = JSValueToObject(context, JSObjectGetProperty(context, JSContextGetGlobalObject(context), numberString, exception), exception); JSStringRelease(numberString); @@ -297,6 +345,122 @@ static JSClassRef MyObject_class(JSContextRef context) return jsClass; } +static bool EvilExceptionObject_hasInstance(JSContextRef context, JSObjectRef constructor, JSValueRef possibleValue, JSValueRef* exception) +{ + UNUSED_PARAM(context); + UNUSED_PARAM(constructor); + + JSStringRef hasInstanceName = JSStringCreateWithUTF8CString("hasInstance"); + JSValueRef hasInstance = JSObjectGetProperty(context, constructor, hasInstanceName, exception); + JSStringRelease(hasInstanceName); + if (!hasInstance) + return false; + JSObjectRef function = JSValueToObject(context, hasInstance, exception); + JSValueRef result = JSObjectCallAsFunction(context, function, constructor, 1, &possibleValue, exception); + return result && JSValueToBoolean(context, result); +} + +static JSValueRef EvilExceptionObject_convertToType(JSContextRef context, JSObjectRef object, JSType type, JSValueRef* exception) +{ + UNUSED_PARAM(object); + UNUSED_PARAM(exception); + JSStringRef funcName; + switch (type) { + case kJSTypeNumber: + funcName = JSStringCreateWithUTF8CString("toNumber"); + break; + case kJSTypeString: + funcName = JSStringCreateWithUTF8CString("toStringExplicit"); + break; + default: + return NULL; + break; + } + + JSValueRef func = JSObjectGetProperty(context, object, funcName, exception); + JSStringRelease(funcName); + JSObjectRef function = JSValueToObject(context, func, exception); + if (!function) + return NULL; + JSValueRef value = JSObjectCallAsFunction(context, function, object, 0, NULL, exception); + if (!value) { + JSStringRef errorString = JSStringCreateWithUTF8CString("convertToType failed"); + JSValueRef errorStringRef = JSValueMakeString(context, errorString); + JSStringRelease(errorString); + return errorStringRef; + } + return value; +} + +JSClassDefinition EvilExceptionObject_definition = { + 0, + kJSClassAttributeNone, + + "EvilExceptionObject", + NULL, + + NULL, + NULL, + + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + EvilExceptionObject_hasInstance, + EvilExceptionObject_convertToType, +}; + +static JSClassRef EvilExceptionObject_class(JSContextRef context) +{ + UNUSED_PARAM(context); + + static JSClassRef jsClass; + if (!jsClass) + jsClass = JSClassCreate(&EvilExceptionObject_definition); + + return jsClass; +} + +JSClassDefinition EmptyObject_definition = { + 0, + kJSClassAttributeNone, + + NULL, + NULL, + + NULL, + NULL, + + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, +}; + +static JSClassRef EmptyObject_class(JSContextRef context) +{ + UNUSED_PARAM(context); + + static JSClassRef jsClass; + if (!jsClass) + jsClass = JSClassCreate(&EmptyObject_definition); + + return jsClass; +} + + static JSValueRef Base_get(JSContextRef ctx, JSObjectRef object, JSStringRef propertyName, JSValueRef* exception) { UNUSED_PARAM(object); @@ -539,6 +703,17 @@ static JSValueRef globalObject_call(JSContextRef ctx, JSObjectRef function, JSOb return JSValueMakeNumber(ctx, 3); } +static JSValueRef functionGC(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) +{ + UNUSED_PARAM(function); + UNUSED_PARAM(thisObject); + UNUSED_PARAM(argumentCount); + UNUSED_PARAM(arguments); + UNUSED_PARAM(exception); + JSGarbageCollect(context); + return JSValueMakeUndefined(context); +} + static JSStaticValue globalObject_staticValues[] = { { "globalStaticValue", globalObject_get, globalObject_set, kJSPropertyAttributeNone }, { 0, 0, 0, 0 } @@ -546,6 +721,7 @@ static JSStaticValue globalObject_staticValues[] = { static JSStaticFunction globalObject_staticFunctions[] = { { "globalStaticFunction", globalObject_call, kJSPropertyAttributeNone }, + { "gc", functionGC, kJSPropertyAttributeNone }, { 0, 0, 0 } }; @@ -656,6 +832,16 @@ int main(int argc, char* argv[]) JSObjectSetProperty(context, globalObject, myObjectIString, myObject, kJSPropertyAttributeNone, NULL); JSStringRelease(myObjectIString); + JSObjectRef EvilExceptionObject = JSObjectMake(context, EvilExceptionObject_class(context), NULL); + JSStringRef EvilExceptionObjectIString = JSStringCreateWithUTF8CString("EvilExceptionObject"); + JSObjectSetProperty(context, globalObject, EvilExceptionObjectIString, EvilExceptionObject, kJSPropertyAttributeNone, NULL); + JSStringRelease(EvilExceptionObjectIString); + + JSObjectRef EmptyObject = JSObjectMake(context, EmptyObject_class(context), NULL); + JSStringRef EmptyObjectIString = JSStringCreateWithUTF8CString("EmptyObject"); + JSObjectSetProperty(context, globalObject, EmptyObjectIString, EmptyObject, kJSPropertyAttributeNone, NULL); + JSStringRelease(EmptyObjectIString); + JSValueRef exception; // Conversions that throw exceptions @@ -846,7 +1032,7 @@ int main(int argc, char* argv[]) JSStringRelease(functionBody); string = JSValueToStringCopy(context, function, NULL); - assertEqualsAsUTF8String(JSValueMakeString(context, string), "function foo(foo) {return foo;}"); + assertEqualsAsUTF8String(JSValueMakeString(context, string), "function foo(foo) { return foo;\n}"); JSStringRelease(string); JSStringRef print = JSStringCreateWithUTF8CString("print"); @@ -898,7 +1084,8 @@ int main(int argc, char* argv[]) JSValueRef argumentsDateValues[] = { JSValueMakeNumber(context, 0) }; o = JSObjectMakeDate(context, 1, argumentsDateValues, NULL); - assertEqualsAsUTF8String(o, "Wed Dec 31 1969 16:00:00 GMT-0800 (PST)"); + if (timeZoneIsPST()) + assertEqualsAsUTF8String(o, "Wed Dec 31 1969 16:00:00 GMT-0800 (PST)"); string = JSStringCreateWithUTF8CString("an error message"); JSValueRef argumentsErrorValues[] = { JSValueMakeString(context, string) }; @@ -953,10 +1140,18 @@ int main(int argc, char* argv[]) ASSERT(JSValueIsEqual(context, v, o, NULL)); JSStringRelease(script); + // Verify that creating a constructor for a class with no static functions does not trigger + // an assert inside putDirect or lead to a crash during GC. + nullDefinition = kJSClassDefinitionEmpty; + nullClass = JSClassCreate(&nullDefinition); + myConstructor = JSObjectMakeConstructor(context, nullClass, 0); + JSClassRelease(nullClass); + char* scriptUTF8 = createStringWithContentsOfFile(scriptPath); - if (!scriptUTF8) + if (!scriptUTF8) { printf("FAIL: Test script could not be loaded.\n"); - else { + failed = 1; + } else { script = JSStringCreateWithUTF8CString(scriptUTF8); result = JSEvaluateScript(context, script, NULL, NULL, 1, &exception); if (JSValueIsUndefined(context, result)) @@ -968,6 +1163,7 @@ int main(int argc, char* argv[]) CFShow(exceptionCF); CFRelease(exceptionCF); JSStringRelease(exceptionIString); + failed = 1; } JSStringRelease(script); free(scriptUTF8); @@ -978,6 +1174,7 @@ int main(int argc, char* argv[]) v = NULL; o = NULL; globalObject = NULL; + myConstructor = NULL; JSStringRelease(jsEmptyIString); JSStringRelease(jsOneIString); @@ -991,6 +1188,27 @@ int main(int argc, char* argv[]) JSGlobalContextRelease(context); JSClassRelease(globalObjectClass); + // Test for an infinite prototype chain that used to be created. This test + // passes if the call to JSObjectHasProperty() does not hang. + + JSClassDefinition prototypeLoopClassDefinition = kJSClassDefinitionEmpty; + prototypeLoopClassDefinition.staticFunctions = globalObject_staticFunctions; + JSClassRef prototypeLoopClass = JSClassCreate(&prototypeLoopClassDefinition); + JSGlobalContextRef prototypeLoopContext = JSGlobalContextCreateInGroup(NULL, prototypeLoopClass); + + JSStringRef nameProperty = JSStringCreateWithUTF8CString("name"); + JSObjectHasProperty(prototypeLoopContext, JSContextGetGlobalObject(prototypeLoopContext), nameProperty); + + JSGlobalContextRelease(prototypeLoopContext); + JSClassRelease(prototypeLoopClass); + + printf("PASS: Infinite prototype chain does not occur.\n"); + + if (failed) { + printf("FAIL: Some tests failed.\n"); + return 1; + } + printf("PASS: Program exited normally.\n"); return 0; } diff --git a/API/tests/testapi.js b/API/tests/testapi.js index 9c8ca9e..82756b5 100644 --- a/API/tests/testapi.js +++ b/API/tests/testapi.js @@ -23,6 +23,22 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +function bludgeonArguments() { if (0) arguments; return function g() {} } +h = bludgeonArguments(); +gc(); + +var failed = false; +function pass(msg) +{ + print("PASS: " + msg, "green"); +} + +function fail(msg) +{ + print("FAIL: " + msg, "red"); + failed = true; +} + function shouldBe(a, b) { var evalA; @@ -33,23 +49,22 @@ function shouldBe(a, b) } if (evalA == b || isNaN(evalA) && typeof evalA == 'number' && isNaN(b) && typeof b == 'number') - print("PASS: " + a + " should be " + b + " and is.", "green"); + pass(a + " should be " + b + " and is."); else - print("__FAIL__: " + a + " should be " + b + " but instead is " + evalA + ".", "red"); + fail(a + " should be " + b + " but instead is " + evalA + "."); } function shouldThrow(a) { - var result = "__FAIL__: " + a + " did not throw an exception."; - var evalA; try { eval(a); } catch(e) { - result = "PASS: " + a + " threw: " + e; + pass(a + " threw: " + e); + return; } - - print(result); + + fail(a + " did not throw an exception."); } function globalStaticFunction() @@ -70,9 +85,14 @@ shouldBe("MyObject.alwaysOne", 1); MyObject.cantDelete = 1; delete MyObject.cantDelete; shouldBe("MyObject.cantDelete", 1); -shouldBe("delete MyObject.throwOnDelete", 2); // deleteProperty -- should throw 2 +shouldBe("delete MyObject.throwOnDelete", "an exception"); MyObject.cantSet = 1; shouldBe("MyObject.cantSet", undefined); +shouldBe("MyObject.throwOnGet", "an exception"); +shouldBe("MyObject.throwOnSet = 5", "an exception"); +shouldBe("MyObject('throwOnCall')", "an exception"); +shouldBe("new MyObject('throwOnConstruct')", "an exception"); +shouldBe("'throwOnHasInstance' instanceof MyObject", "an exception"); var foundMyPropertyName = false; var foundRegularType = false; @@ -82,12 +102,16 @@ for (var p in MyObject) { if (p == "regularType") foundRegularType = true; } -print(foundMyPropertyName - ? "PASS: MyObject.myPropertyName was enumerated" - : "__FAIL__: MyObject.myPropertyName was not enumerated"); -print(foundRegularType - ? "PASS: MyObject.regularType was enumerated" - : "__FAIL__: MyObject.regularType was not enumerated"); + +if (foundMyPropertyName) + pass("MyObject.myPropertyName was enumerated"); +else + fail("MyObject.myPropertyName was not enumerated"); + +if (foundRegularType) + pass("MyObject.regularType was enumerated"); +else + fail("MyObject.regularType was not enumerated"); myObject = new MyObject(); @@ -100,7 +124,7 @@ shouldBe("MyObject ? 1 : 0", true); // toBoolean shouldBe("+MyObject", 1); // toNumber shouldBe("(MyObject.toString())", "[object MyObject]"); // toString shouldBe("String(MyObject)", "MyObjectAsString"); // type conversion to string -shouldBe("MyObject - 0", NaN); // toPrimitive +shouldBe("MyObject - 0", 1); // toNumber shouldBe("typeof MyConstructor", "object"); constructedObject = new MyConstructor(1); @@ -130,3 +154,21 @@ shouldBe("derived.baseDup = 0", 2); shouldBe("derived.baseOnly = 0", 1); shouldBe("derived.derivedOnly = 0", 2) shouldBe("derived.protoDup = 0", 2); + +shouldBe("undefined instanceof MyObject", false); +EvilExceptionObject.hasInstance = function f() { return f(); }; +EvilExceptionObject.__proto__ = undefined; +shouldThrow("undefined instanceof EvilExceptionObject"); +EvilExceptionObject.hasInstance = function () { return true; }; +shouldBe("undefined instanceof EvilExceptionObject", true); + +EvilExceptionObject.toNumber = function f() { return f(); } +shouldThrow("EvilExceptionObject*5"); +EvilExceptionObject.toStringExplicit = function f() { return f(); } +shouldThrow("String(EvilExceptionObject)"); + +shouldBe("EmptyObject", "[object CallbackObject]"); + +if (failed) + throw "Some tests failed"; + diff --git a/AllInOneFile.cpp b/AllInOneFile.cpp index 904734f..7b67dbe 100644 --- a/AllInOneFile.cpp +++ b/AllInOneFile.cpp @@ -34,6 +34,7 @@ #include "runtime/JSStaticScopeObject.cpp" #include "runtime/JSFunction.cpp" #include "runtime/Arguments.cpp" +#include "runtime/JSAPIValueWrapper.cpp" #include "runtime/JSGlobalObjectFunctions.cpp" #include "runtime/PrototypeFunction.cpp" #include "runtime/GlobalEvalFunction.cpp" @@ -47,7 +48,7 @@ #include "runtime/Collector.cpp" #include "runtime/CommonIdentifiers.cpp" #include "runtime/DateConstructor.cpp" -#include "runtime/DateMath.cpp" +#include "runtime/DateConversion.cpp" #include "runtime/DatePrototype.cpp" #include "runtime/DateInstance.cpp" #include "wtf/dtoa.cpp" diff --git a/ChangeLog-2008-08-10 b/ChangeLog-2008-08-10 deleted file mode 100644 index 0912aec..0000000 --- a/ChangeLog-2008-08-10 +++ /dev/null @@ -1,31482 +0,0 @@ -2008-08-10 Jan Michael Alonzo - - Reviewed (and updated) by Alp Toker. - - https://bugs.webkit.org/show_bug.cgi?id=16620 - [GTK] Autotools make dist and make check support - - Get make dist working. - - Note that not all possible configurations have been tested yet. - - * GNUmakefile.am: - -2008-08-09 Alexey Proskuryakov - - Reviewed by Sam Weinig. - - Added same heap debug checks to more code paths. - - * kjs/JSActivation.cpp: - (KJS::JSActivation::put): - (KJS::JSActivation::putWithAttributes): - * kjs/JSGlobalObject.cpp: - (KJS::JSGlobalObject::putWithAttributes): - * kjs/JSObject.h: - (KJS::JSObject::putDirect): - * kjs/JSVariableObject.h: - (KJS::JSVariableObject::symbolTablePut): - (KJS::JSVariableObject::symbolTablePutWithAttributes): - -2008-08-09 Cameron Zwarich - - Reviewed by Maciej. - - Fix some style issues in the sampling tool. - - * VM/SamplingTool.cpp: - (KJS::sleepForMicroseconds): - (KJS::SamplingTool::dump): - -2008-08-09 Cameron Zwarich - - Reviewed by Oliver. - - Revision 35651, despite being a rather trivial change, introduced a - large regression on the regexp-dna SunSpider test. This regression - stemmed from an increase in the size of CodeBlock::dump(). There is - no reason for this method (and several related methods) to be compiled - in non-debug builds with the sampling tool disabled. This patch - conditionally compiles them, reversing the regression on SunSpider. - - * JavaScriptCore.exp: - * VM/CodeBlock.cpp: - * VM/CodeBlock.h: - * VM/Machine.cpp: - -2008-08-08 Cameron Zwarich - - Reviewed by Oliver. - - Bug 20330: JSCore crash loading any filehurricane media page - - - Fix a typo in the constant loading patch. Also, add a case for - op_unexpected_load to CodeBlock::dump(). - - * VM/CodeBlock.cpp: - (KJS::CodeBlock::dump): - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::addUnexpectedConstant): - -2008-08-08 Matt Lilek - - Not reviewed, build fix. - - * JavaScriptCore.exp: - -2008-08-08 Oliver Hunt - - Reviewed by Cameron Zwarich. - - Improve performance of arithmetic operators - - Added a fast (non-virtual) mechanism to determine if a non-immediate JSValue* - is a JSNumberCell. We then use this to allow improved specialisation in many - arithmetic operators. SunSpider reports a 2.5% progression overall, with greater - than 10% progressions on a number of arithmetic heavy tests. - - * VM/Machine.cpp: - (KJS::fastIsNumber): - (KJS::fastToInt32): - (KJS::fastToUInt32): - (KJS::jsLess): - (KJS::jsLessEq): - (KJS::jsAdd): - (KJS::Machine::privateExecute): - * kjs/JSNumberCell.h: - (KJS::JSNumberCell::fastToInt32): - (KJS::JSNumberCell::fastToUInt32): - * kjs/collector.cpp: - (KJS::allocateBlock): - (KJS::Heap::heapAllocate): - * kjs/collector.h: - (KJS::Heap::fastIsNumber): - -2008-08-06 Adam Roben - - Try to fix the Windows build bots - - * API/JSBase.cpp: Touch this to force JSC to rebuild and re-copy the - WTF headers. - -2008-08-06 Tor Arne Vestbø - - Revert change 35595. - - * wtf/RetainPtr.h: - -2008-08-06 Ariya Hidayat - - Fix non-Mac build. - - * wtf/RetainPtr.h: CoreFoundation only for PLATFORM(MAC) - -2008-08-06 Ariya Hidayat - - Fix non-Mac build. - - * wtf/RetainPtr.h: CoreFoundation only for PLATFORM(MAC) - -2008-08-06 Csaba Osztrogonac - - Reviewed by Darin. Landed by Cameron. - - Bug 20272: typo in JavaScriptCore - - - Correct the documentation for op_not. (typo) - Fix #undef. (typo) - - * VM/Machine.cpp: - (KJS::Machine::privateExecute): - -2008-08-06 Cameron Zwarich - - Reviewed by Maciej. - - Bug 20286: Load constants all at once instead of using op_load - - - Load constants all at once into temporary registers instead of using - individual instances of op_load. - - This is a 2.6% speedup on SunSpider. - - * JavaScriptCore.exp: - * VM/CodeBlock.cpp: - (KJS::CodeBlock::dump): - (KJS::CodeBlock::mark): - * VM/CodeBlock.h: - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::CodeGenerator): - (KJS::CodeGenerator::newTemporary): - (KJS::CodeGenerator::addConstant): - (KJS::CodeGenerator::addUnexpectedConstant): - (KJS::CodeGenerator::emitLoad): - (KJS::CodeGenerator::emitUnexpectedLoad): - (KJS::CodeGenerator::emitNewError): - * VM/CodeGenerator.h: - * VM/Machine.cpp: - (KJS::slideRegisterWindowForCall): - (KJS::Machine::unwindCallFrame): - (KJS::Machine::throwException): - (KJS::Machine::execute): - (KJS::Machine::privateExecute): - * VM/Machine.h: - * VM/Opcode.h: - * VM/RegisterID.h: - (KJS::RegisterID::RegisterID): - (KJS::RegisterID::makeConstant): - (KJS::RegisterID::isTemporary): - * kjs/NodeInfo.h: - * kjs/Parser.cpp: - (KJS::Parser::didFinishParsing): - * kjs/Parser.h: - (KJS::Parser::parse): - * kjs/grammar.y: - * kjs/nodes.cpp: - (KJS::NullNode::emitCode): - (KJS::BooleanNode::emitCode): - (KJS::NumberNode::emitCode): - (KJS::StringNode::emitCode): - (KJS::ArrayNode::emitCode): - (KJS::DeleteResolveNode::emitCode): - (KJS::DeleteValueNode::emitCode): - (KJS::VoidNode::emitCode): - (KJS::ConstDeclNode::emitCodeSingle): - (KJS::ReturnNode::emitCode): - (KJS::ScopeNode::ScopeNode): - (KJS::ProgramNode::ProgramNode): - (KJS::ProgramNode::create): - (KJS::EvalNode::EvalNode): - (KJS::EvalNode::create): - (KJS::FunctionBodyNode::FunctionBodyNode): - (KJS::FunctionBodyNode::create): - (KJS::FunctionBodyNode::emitCode): - * kjs/nodes.h: - (KJS::ScopeNode::neededConstants): - -2008-08-05 Maciej Stachowiak - - Reviewed by Cameron. - - - add fast path for immediates to % operator, as we have for many other math ops - - This fixes handling for a 0 divisor relative to the last patch. Only an 0.2% speedup on SunSpider but - still a 1.4x win on Oliver's prime test. - - * VM/Machine.cpp: - (KJS::Machine::privateExecute): - -2008-08-05 Cameron Zwarich - - Reviewed by Darin. - - Bug 20293: Crash in JavaScript codegen for eval("const a;") - - - Correctly handle constant declarations in eval code with no initializer. - - * kjs/nodes.cpp: - (KJS::ConstDeclNode::emitCodeSingle): - -2008-08-05 Cameron Zwarich - - Reviewed by Oliver. - - Roll out r35555 because of correctness issues. - - * VM/Machine.cpp: - (KJS::Machine::privateExecute): - -2008-08-05 Maciej Stachowiak - - Reviewed by Geoff. - - - add fast path for immediates to % operator, as we have for many other math ops - - 0.6% speedup on SunSpider. 1.4x speedup on a prime testing torture test that Oliver whipped up. - - * VM/Machine.cpp: - (KJS::Machine::privateExecute): - -2008-07-31 Oliver Hunt - - Reviewed by Cameron Zwarich. - - Bug 19359: JavaScriptCore behaves differently from FF2/3 and IE when handling context in catch statement - - - Make our catch behave like Firefox and IE, we do this by using a StaticScopeObject - instead of a generic JSObject for the scope node. We still don't make use of the - fact that we have a static scope inside the catch block, so the internal performance - of the catch block is not improved, even though technically it would be possible to - do so. - - * VM/CodeBlock.cpp: - (KJS::CodeBlock::dump): - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::emitPushNewScope): - * VM/CodeGenerator.h: - * VM/Machine.cpp: - (KJS::createExceptionScope): - (KJS::Machine::privateExecute): - * VM/Machine.h: - * VM/Opcode.h: - * kjs/JSStaticScopeObject.cpp: - (KJS::JSStaticScopeObject::toThisObject): - (KJS::JSStaticScopeObject::put): - * kjs/JSStaticScopeObject.h: - * kjs/nodes.cpp: - (KJS::TryNode::emitCode): - -2008-08-02 Rob Gowin - - Reviewed by Eric Seidel. - - Added JavaScriptCore/API/WebKitAvailability to list of files in - javascriptcore_h_api. - - * GNUmakefile.am: - -2008-08-01 Alexey Proskuryakov - - Rubber-stamped by Maciej. - - Remove JSGlobalData::DataInstance. It was only needed when we had per-thread JSGlobalData - instances. - - * kjs/JSGlobalData.h: - -2008-07-31 Kevin Ollivier - - Second attempt at Windows/wx build fix. Instead of avoiding inclusion of windows.h, - use defines, etc. to avoid conflicts in each affected file. Also, change PLATFORM(WIN) - to PLATFORM(WIN_OS) so that other ports using Windows headers get the right impls. - - * VM/SamplingTool.cpp: - * wtf/Threading.h: - -2008-07-31 Anders Carlsson - - Reviewed by Adam. - - Fix Windows build. - - * kjs/collector.h: - * wtf/FastMalloc.cpp: - -2008-07-31 Csaba Osztrogonac - - Reviewed by Simon. - - Bug 20170: [Qt] missing namespace defines in JavaScriptCore.pro - - - * JavaScriptCore.pro: Added missing define. - -2008-07-31 Alexey Proskuryakov - - Rubber-stamped by Maciej. - - Eliminate JSLock (it was already disabled, removing the stub implementaion and all - call sites now). - - * API/JSBase.cpp: - (JSEvaluateScript): - (JSCheckScriptSyntax): - (JSGarbageCollect): - * API/JSCallbackConstructor.cpp: - (KJS::constructJSCallback): - * API/JSCallbackFunction.cpp: - (KJS::JSCallbackFunction::call): - * API/JSCallbackObjectFunctions.h: - (KJS::::init): - (KJS::::getOwnPropertySlot): - (KJS::::put): - (KJS::::deleteProperty): - (KJS::::construct): - (KJS::::hasInstance): - (KJS::::call): - (KJS::::getPropertyNames): - (KJS::::toNumber): - (KJS::::toString): - (KJS::::staticValueGetter): - (KJS::::callbackGetter): - * API/JSContextRef.cpp: - (JSGlobalContextCreateInGroup): - (JSGlobalContextRetain): - (JSGlobalContextRelease): - * API/JSObjectRef.cpp: - (JSObjectMake): - (JSObjectMakeFunctionWithCallback): - (JSObjectMakeConstructor): - (JSObjectMakeFunction): - (JSObjectHasProperty): - (JSObjectGetProperty): - (JSObjectSetProperty): - (JSObjectGetPropertyAtIndex): - (JSObjectSetPropertyAtIndex): - (JSObjectDeleteProperty): - (JSObjectCallAsFunction): - (JSObjectCallAsConstructor): - (JSObjectCopyPropertyNames): - (JSPropertyNameArrayRelease): - (JSPropertyNameAccumulatorAddName): - * API/JSStringRef.cpp: - (JSStringRelease): - * API/JSValueRef.cpp: - (JSValueIsEqual): - (JSValueIsInstanceOfConstructor): - (JSValueMakeNumber): - (JSValueMakeString): - (JSValueToNumber): - (JSValueToStringCopy): - (JSValueToObject): - (JSValueProtect): - (JSValueUnprotect): - * ForwardingHeaders/JavaScriptCore/JSLock.h: Removed. - * GNUmakefile.am: - * JavaScriptCore.exp: - * JavaScriptCore.order: - * JavaScriptCore.pri: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - * JavaScriptCoreSources.bkl: - * kjs/AllInOneFile.cpp: - * kjs/JSGlobalData.cpp: - (KJS::JSGlobalData::JSGlobalData): - * kjs/JSGlobalData.h: - * kjs/JSGlobalObject.cpp: - (KJS::JSGlobalObject::~JSGlobalObject): - (KJS::JSGlobalObject::init): - * kjs/JSLock.cpp: Removed. - * kjs/JSLock.h: Removed. - * kjs/Shell.cpp: - (functionGC): - (jscmain): - * kjs/collector.cpp: - (KJS::Heap::~Heap): - (KJS::Heap::heapAllocate): - (KJS::Heap::setGCProtectNeedsLocking): - (KJS::Heap::protect): - (KJS::Heap::unprotect): - (KJS::Heap::collect): - * kjs/identifier.cpp: - * kjs/interpreter.cpp: - (KJS::Interpreter::checkSyntax): - (KJS::Interpreter::evaluate): - -2008-07-31 Alexey Proskuryakov - - Rubber-stamped by Oliver Hunt. - - Fix the Mac project to not display "test/" as part of file name for tests. - - * JavaScriptCore.xcodeproj/project.pbxproj: - -2008-07-31 Eric Seidel - - Reviewed by Alexey Proskuryakov. - - Rename USE(MULTIPLE_THREADS) to ENABLE(JSC_MULTIPLE_THREADS) - to better match the use/enable pattern (and better describe - the usage of the feature in question.) - - I also fixed a couple other ENABLE_ macros to be pre-processor - definition override-able to match the rest of the ENABLE_ macros - since it seems to be our convention that build systems can set - ENABLE_ macros in Makefiles. - - * kjs/InitializeThreading.cpp: - (KJS::initializeThreadingOnce): - * kjs/JSGlobalData.cpp: - (KJS::JSGlobalData::JSGlobalData): - (KJS::JSGlobalData::~JSGlobalData): - * kjs/MathObject.cpp: - * kjs/collector.cpp: - (KJS::Heap::Heap): - (KJS::Heap::~Heap): - (KJS::allocateBlock): - (KJS::Heap::markStackObjectsConservatively): - * kjs/collector.h: - * kjs/dtoa.cpp: - (KJS::pow5mult): - (KJS::rv_alloc): - (KJS::freedtoa): - (KJS::dtoa): - * wtf/FastMalloc.cpp: - * wtf/Platform.h: - * wtf/RefCountedLeakCounter.cpp: - -2008-07-30 Eric Seidel - - Reviewed by Mark Rowe. - - Try to clean up our usage of USE(MULTIPLE_THREADS) vs. USE(PTHREADS) a little. - It looks like JSC assumes that if MULTIPLE_THREADS is defined, then pthreads will always be available - I'm not sure that's always the case for gtk, certainly not for Windows. We should eventually go back - and fix wtf/Threading.h to cover all these cases some day. - - * kjs/JSLock.cpp: - * kjs/collector.h: - * wtf/Platform.h: - -2008-07-30 Eric Seidel - - Reviewed by Oliver. - - MSVC warns when structs are called classes or vice versa. - Make all the source refer to JSGlobalData as a class. - - * kjs/CommonIdentifiers.h: - * kjs/JSGlobalData.h: - * kjs/Parser.h: - * kjs/lexer.h: - -2008-07-30 Alexey Proskuryakov - - Reviewed by Geoff Garen. - - Add consistency checks to UString to document and enforce its design. - - * kjs/ustring.cpp: - (KJS::UString::Rep::create): - (KJS::UString::Rep::destroy): - (KJS::UString::Rep::checkConsistency): - (KJS::UString::expandCapacity): - (KJS::UString::expandPreCapacity): - (KJS::UString::UString): - (KJS::UString::spliceSubstringsWithSeparators): - (KJS::UString::append): - * kjs/ustring.h: - (KJS::UString::Rep::checkConsistency): - -2008-07-30 Gavin Barraclough - - Reviewed by Geoff Garen. - - Fixes for Windows and non-AllInOne file build with SamplingTool, plus review fixes. - - * GNUmakefile.am: Adding SamplingTool.cpp to build. - * JavaScriptCore.exp: Export hooks to init & control SamplingTool. - * JavaScriptCore.pri: Adding SamplingTool.cpp to build. - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Adding SamplingTool.cpp to build. - * JavaScriptCore.xcodeproj/project.pbxproj: Adding SamplingTool.cpp to build. - * JavaScriptCoreSources.bkl: Adding SamplingTool.cpp to build. - * VM/Machine.cpp: MACHINE_SAMPLING_callingNativeFunction renamed MACHINE_SAMPLING_callingHostFunction - * VM/Machine.h: - * VM/Opcode.cpp: SamplingTool moved to SamplingTool.cpp/.h, opcodeNames generated from FOR_EACH_OPCODE_ID. - * VM/Opcode.h: - * VM/SamplingTool.cpp: Added .cpp/.h for SamplingTool. - * VM/SamplingTool.h: - * kjs/Shell.cpp: Switched SAMPLING_TOOL_ENABLED to ENABLE_SAMPLING_TOOL. - * wtf/Platform.h: Added ENABLE_SAMPLING_TOOL config option. - * kjs/nodes.cpp: Header include to fix non-AllInOne builds. - -2008-07-30 Ariya Hidayat - - Reviewed by Alexey Proskuryakov. - - Fix compilation without multi-threading support. - - * kjs/collector.cpp: - (KJS::Heap::Heap): - -2008-07-30 Anders Carlsson - - Add WebKitAvailability.h forwarding header. - - * ForwardingHeaders/JavaScriptCore/WebKitAvailability.h: Added. - -2008-07-30 Anders Carlsson - - Fix the else. - - * API/WebKitAvailability.h: - -2008-07-30 Anders Carlsson - - * API/WebKitAvailability.h: - Fix Windows (and other non-Mac builds). - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - Add WebKitAvailability.h to the project. - -2008-07-30 Anders Carlsson - - One step closer towards fixing the Windows build. - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreGenerated.make: - Make sure to copy WebKitAvailability.h - -2008-07-29 Gavin Barraclough - - Reviewed by Geoff Garen. - - Bug 20209: Atomize constant strings - - - Prevents significant performance degradation seen when a script contains multiple - identical strings that are used as keys to identify properties on objects. - - No performance change on SunSpider. - - * kjs/nodes.cpp: Atomize constant strings. - -2008-07-30 Oliver Hunt - - Reviewed by Alexey Proskuryakov. - - JavaScript exceptions fail if the scope chain includes the global object - - In an attempt to remove the branch I just added to KJS::depth I - used the existence of a Variable Object at a point in the scope - chain as an indicator of function or global scope activation. - However this assumption results in incorrect behaviour if the - global object is injected into the scope chain with 'with'. - - * VM/Machine.cpp: - (KJS::depth): - -2008-07-30 Alexey Proskuryakov - - Reviewed by Geoff Garen. - - Don't call JSGarbageCollect() on a released context. - - * API/testapi.c: (main): - -2008-07-29 Alexey Proskuryakov - - Reviewed by Geoff Garen. - - Implement JSContextGroup APIs to make concurrent execution possible for - JavaScriptCore clients. - - This changes the behavior of JSGlobalContextCreate(), so that it now uses a private context - group for each context, making JSlock implicit locking unnecessary. - - * API/JSContextRef.h: - * API/JSContextRef.cpp: - (JSContextGroupCreate): - (JSContextGroupRetain): - (JSContextGroupRelease): - (JSGlobalContextCreate): - (JSGlobalContextCreateInGroup): - (JSGlobalContextRelease): - (JSContextGetGroup): - Added new methods. JSGlobalContextCreate() calls JSGlobalContextCreateInGroup() now. - - * API/APICast.h: (toJS): (toRef): Added converters for JSContextGroupRef. - * API/JSBase.cpp: (JSGarbageCollect): JSGarbageCollect(0) is now a no-op, and the passed in - context is actually used. - - * API/JSBase.h: Aded a typedef for JSContextGroupRef. Updated documentation for - JSGarbageCollect(). - - * JavaScriptCore.exp: Removed JSGlobalData::sharedInstance(). - - * kjs/JSGlobalData.cpp: - * kjs/JSGlobalData.h: - Removed support for JSGlobalData shared instance. JSGlobalData::isSharedInstance member - variable still remains, to be deleted in a followup patch. - - * kjs/JSLock.cpp: (KJS::JSLock::JSLock): Disabled JSLock, to be deleted in a follow-up patch. - - * kjs/collector.cpp: - (KJS::Heap::markOtherThreadConservatively): Removed an assertion that referenced - JSGlobalData::sharedInstance. - - * kjs/collector.h: Made Heap destructor public, so that JSContextRelease can use it. - -2008-07-29 Alexey Proskuryakov - - Reviewed by Geoff Garen. - - Fix a leak of ThreadRegistrar objects. - - As the heap is usually deleted when registered threads still exist, ThreadSpecific doesn't - have a chance to clean up per-thread object. Switched to native pthread calls, storing a - plain pointer that doesn't require cleanup. - - * kjs/collector.cpp: - (KJS::PlatformThread::PlatformThread): - (KJS::Heap::Thread::Thread): - (KJS::Heap::Heap): - (KJS::Heap::~Heap): - (KJS::Heap::registerThread): - (KJS::Heap::unregisterThread): - * kjs/collector.h: - -2008-07-29 Alexey Proskuryakov - - Reviewed by Sam Weinig. - - https://bugs.webkit.org/show_bug.cgi?id=20169 - Memory allocated with fastMalloc is freed with delete - - * VM/JSPropertyNameIterator.cpp: - (KJS::JSPropertyNameIterator::invalidate): Free the array properly. - (KJS::JSPropertyNameIterator::~JSPropertyNameIterator): Delete the array by calling - invalidate(). - -2008-07-29 Mark Rowe - - Attempt to fix the Qt build. - - * wtf/ThreadingQt.cpp: Add the extra argument to createThread. - -2008-07-29 Adam Roben - - Change Vector::find to return an index instead of an iterator - - Indices are more natural than iterators when working with Vector. - - Reviewed by John Sullivan. - - * wtf/Vector.h: - (WTF::Vector::find): Changed to iterate the Vector manually and return - the index of the found item, rather than an iterator. When the item - could not be found, we return WTF::notFound. - -2008-07-29 Adam Roben - - Windows build fix - - * wtf/ThreadingWin.cpp: - (WTF::setThreadName): Move a misplaced assertion to here... - (WTF::createThread): ...from here. - -2008-07-29 Adam Roben - - Add support for setting thread names on Windows - - These thread names make it much easier to identify particular threads - in Visual Studio's Threads panel. - - WTF::createThread now takes a const char* representing the thread's - name. On Windows, we throw a special exception to set this string as - the thread's name. Other platforms do nothing with this name for now. - - Reviewed by Anders Carlsson. - - * JavaScriptCore.exp: Export the new version of createThread that - takes 3 arguments (the old one continues to be exported for backward - compatibility). - * wtf/Threading.h: Add a threadName argument to createThread. - - * wtf/ThreadingGtk.cpp: - (WTF::createThread): - * wtf/ThreadingNone.cpp: - (WTF::createThread): - Updated for function signature change. - - * wtf/ThreadingPthreads.cpp: - (WTF::createThread): Updated for function signature change. We keep - around the old 2-argument version of createThread for backward - compatibility. - - * wtf/ThreadingWin.cpp: - (WTF::setThreadName): Added. This function's implementation came from - MSDN. - (WTF::initializeThreading): Set the name of the main thread. - (WTF::createThread): Call setThreadName. We keep around the old - 2-argument version of createThread for backward compatibility. - -2008-07-29 Alexey Proskuryakov - - Reviewed by Oliver Hunt. - - Store UString::Rep::isStatic bit in identifierTable pointer instead of reportedCost for - slightly nicer code and a 0.5% SunSpider improvement. - - * API/JSClassRef.cpp: - (OpaqueJSClass::~OpaqueJSClass): - (OpaqueJSClassContextData::OpaqueJSClassContextData): - * API/JSStringRef.cpp: - (JSStringRelease): - * kjs/PropertyNameArray.cpp: - (KJS::PropertyNameArray::add): - * kjs/identifier.cpp: - (KJS::IdentifierTable::~IdentifierTable): - (KJS::IdentifierTable::add): - (KJS::Identifier::addSlowCase): - (KJS::Identifier::remove): - * kjs/identifier.h: - (KJS::Identifier::add): - * kjs/ustring.cpp: - (KJS::): - (KJS::UString::Rep::create): - (KJS::UString::Rep::destroy): - * kjs/ustring.h: - (KJS::UString::Rep::identifierTable): - (KJS::UString::Rep::setIdentifierTable): - (KJS::UString::Rep::isStatic): - (KJS::UString::Rep::setStatic): - (KJS::UString::cost): - -2008-07-28 Geoffrey Garen - - Reviewed by Sam Weinig. - - Renamed "ConstructTypeNative" => "ConstructTypeHost". - -2008-07-26 Mark Rowe - - Speculative fix for the wx build. - - * JavaScriptCoreSources.bkl: Add JSStaticScopeObject.cpp to the list of source files. - -2008-07-25 Oliver Hunt - - RS=Cameron Zwarich. - - Whoops, forgot to save style correction. - - * kjs/JSStaticScopeObject.h: - -2008-07-25 Oliver Hunt - - Reviewed by Cameron Zwarich. - - Bug 19718: Named anonymous functions are slow accessing global variables - - - To fix this we switch over to an activation-like scope object for - on which we attach the function name property, and add logic to - prevent cross scope assignment to read only properties. - - * GNUmakefile.am: - * JavaScriptCore.pri: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::findScopedProperty): - (KJS::CodeGenerator::emitResolve): - * VM/CodeGenerator.h: - * kjs/AllInOneFile.cpp: - * kjs/JSStaticScopeObject.cpp: Added. - (KJS::JSStaticScopeObject::putWithAttributes): - (KJS::JSStaticScopeObject::isDynamicScope): - (KJS::JSStaticScopeObject::~JSStaticScopeObject): - (KJS::JSStaticScopeObject::getOwnPropertySlot): - * kjs/JSStaticScopeObject.h: Added. - (KJS::JSStaticScopeObject::JSStaticScopeObjectData::JSStaticScopeObjectData): - (KJS::JSStaticScopeObject::JSStaticScopeObject): - * kjs/nodes.cpp: - (KJS::FunctionCallResolveNode::emitCode): - (KJS::PostfixResolveNode::emitCode): - (KJS::PrefixResolveNode::emitCode): - (KJS::ReadModifyResolveNode::emitCode): - (KJS::AssignResolveNode::emitCode): - (KJS::FuncExprNode::makeFunction): - -2008-07-25 kevino - - wx build fix for Win. - - On wx/Win, including windows.h in Threading.h causes multiply-defined symbol errors - for libjpeg and wx, and also wx needs to include windows.h itself first for wx - includes to work right. So until we can find a better solution to this problem, - on wx, we work around the need to include windows.h here. - - * wtf/Threading.h: - -2008-07-25 Adam Roben - - Windows build fix - - * JavaScriptCore.vcproj/testapi/testapi.vcproj: Add API/ to the - include path. - -2008-07-25 Simon Hausmann - - Fix the build of jsc on Qt/Windows, make sure os-win32 is in the - include search path (added by WebKit.pri). - - * kjs/jsc.pro: - -2008-07-25 Alexey Proskuryakov - - Reviewed by Simon Hausmann. - - Move JavaScriptCore API tests into a subdirectory of their own to avoid header name - conflicts and developer confusion. - - * API/JSNode.c: Removed. - * API/JSNode.h: Removed. - * API/JSNodeList.c: Removed. - * API/JSNodeList.h: Removed. - * API/Node.c: Removed. - * API/Node.h: Removed. - * API/NodeList.c: Removed. - * API/NodeList.h: Removed. - * API/minidom.c: Removed. - * API/minidom.html: Removed. - * API/minidom.js: Removed. - * API/testapi.c: Removed. - * API/testapi.js: Removed. - * API/tests: Added. - * API/tests/JSNode.c: Copied from JavaScriptCore/API/JSNode.c. - * API/tests/JSNode.h: Copied from JavaScriptCore/API/JSNode.h. - * API/tests/JSNodeList.c: Copied from JavaScriptCore/API/JSNodeList.c. - * API/tests/JSNodeList.h: Copied from JavaScriptCore/API/JSNodeList.h. - * API/tests/Node.c: Copied from JavaScriptCore/API/Node.c. - * API/tests/Node.h: Copied from JavaScriptCore/API/Node.h. - * API/tests/NodeList.c: Copied from JavaScriptCore/API/NodeList.c. - * API/tests/NodeList.h: Copied from JavaScriptCore/API/NodeList.h. - * API/tests/minidom.c: Copied from JavaScriptCore/API/minidom.c. - * API/tests/minidom.html: Copied from JavaScriptCore/API/minidom.html. - * API/tests/minidom.js: Copied from JavaScriptCore/API/minidom.js. - * API/tests/testapi.c: Copied from JavaScriptCore/API/testapi.c. - * API/tests/testapi.js: Copied from JavaScriptCore/API/testapi.js. - * GNUmakefile.am: - * JavaScriptCore.vcproj/testapi/testapi.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - -2008-07-25 Simon Hausmann - - Prospective WX build fix, add JavaScriptCore/API to the include search - path. - - * jscore.bkl: - -2008-07-25 Simon Hausmann - - Rubber-stamped by Lars. - - Fix the build on Windows. operator new for ArgList is implemented using fastMalloc() - but operator delete was not implemented. Unfortunately MSVC decides to call/reference - the function, so a simple implementation using fastFree() fixes the build. - - * kjs/ArgList.h: - (KJS::ArgList::operator delete): - -2008-07-25 Simon Hausmann - - Discussed with and rubber-stamped by Lars. - - Fix the build system for the Qt port. - - Recent JavaScriptCore changes require the addition of JavaScriptCore/API to the - include search path. With a build process that combines JavaScriptCore and - WebCore in one build process/Makefile the existance of - JavaScriptCore/API/Node.h and WebCore/dom/Node.h causes include conflicts. - - This commit solves this by introducing a separate build of JavaScriptCore into - a static library. - - As a result of the split-up a race-condition due to broken dependencies of - regular source files to header files of generated sources showed up very - frequently when doing parallel builds (which the buildbot does). This commit at - the same time tries to address the dependency problem by making the - addExtraCompiler() function also generate a pseudo extra compiler that - represents the header file output, so that qmake is aware of the creation of - the header file for dependency calculation. - - At the same time I removed a lot of cruft from the pro files to ease maintenance. - - * JavaScriptCore.pri: - * JavaScriptCore.pro: Added. - * kjs/jsc.pro: - -2008-07-24 Geoffrey Garen - - Reviewed by Maciej Stachowiak. - - Fixed a strict aliasing violation, which caused hash tables with floating - point keys not to find items that were indeed in the tables - (intermittently, and only in release builds, of course). - - SunSpider reports no change. - - This bug doesn't seem to affect any existing code, but it causes obvious - crashes in some new code I'm working on. - - * wtf/HashFunctions.h: - (WTF::FloatHash::hash): Use a union when punning between a float / double - and an unsigned (bucket of bits). With strict aliasing enabled, unions - are the only safe way to do this kind of type punning. - - * wtf/HashTable.h: When rehashing, ASSERT that the item we just added to - the table is indeed in the table. In the buggy case described above, this - ASSERT fires. - -2008-07-24 Oliver Hunt - - Reviewed by Alexey Proskuryakov. - - Bug 20142: REGRESSION(r35245): /=/ weirdness - - - When adding all the meta data needed for exception error messages - I accidentally clobbered the handling of regex beginning with /=. - - * kjs/grammar.y: - -2008-07-23 Alp Toker - - Build fix after r35293: Add API/ to the include path. - - * GNUmakefile.am: - -2008-07-23 Adam Roben - - Windows build fixes - - Build fix after r35293: - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Add API/ - to the include path. - - Build fix after r35305: - - * VM/Machine.cpp: - * VM/Machine.h: - * VM/Opcode.cpp: - * VM/Opcode.h: - Completely compile out all sampler-related code when - SAMPLING_TOOL_ENABLED is 0. The sampler code can't be compiled 1) on - non-AllInOne configurations due to circular header dependencies, and - 2) on platforms that don't have a usleep() function, such as Windows. - -2008-07-23 Oliver Hunt - - Reviewed by Geoff Garen and Sam Weinig. - - Improve switch performance. - - Improve switch performance by converting to a hashmap based jump - table to avoid the sequence of dispatches that would otherwise be - needed. This results in a 9-19x performance win for string switches - based on ad hoc testing, and a 6x improvement for integer switch - statements. SunSpider reports a 1.2% progression. - - * VM/CodeBlock.cpp: - (KJS::CodeBlock::dump): - (KJS::SimpleJumpTable::offsetForValue): - * VM/CodeBlock.h: - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::beginSwitch): - (KJS::prepareJumpTableForImmediateSwitch): - (KJS::prepareJumpTableForCharacterSwitch): - (KJS::prepareJumpTableForStringSwitch): - (KJS::CodeGenerator::endSwitch): - * VM/CodeGenerator.h: - * VM/Machine.cpp: - (KJS::offsetForStringSwitch): - (KJS::Machine::privateExecute): - * VM/Opcode.cpp: - (KJS::): - * VM/Opcode.h: - * kjs/JSImmediate.h: - * kjs/nodes.cpp: - (KJS::): - (KJS::processClauseList): - (KJS::CaseBlockNode::tryOptimisedSwitch): - (KJS::CaseBlockNode::emitCodeForBlock): - * kjs/nodes.h: - (KJS::SwitchInfo::): - -2008-07-23 Gavin Barraclough - - Reviewed by Geoff Garen. - - Sampling tool to analyze cost of instruction execution and identify hot regions of JS code. - Enable Switches by setting SAMPLING_TOOL_ENABLED in Opcode.h. - - * JavaScriptCore.exp: Export symbols for Shell.cpp. - * VM/Machine.cpp: Added sampling hooks. - * VM/Machine.h: Machine contains a pointer to a sampler, when sampling. - * VM/Opcode.cpp: Tool implementation. - * VM/Opcode.h: Tool declaration. - * kjs/Shell.cpp: Initialize the sampler, if enabled. - * kjs/nodes.cpp: Added sampling hooks. - -2008-07-23 Gabor Loki - - Bug 20097: [Qt] 20% Sunspider slow-down - - - - Reviewed by Simon Hausmann. - - * kjs/jsc.pro: Added missing NDEBUG define for release builds. - -2008-07-23 Alexey Proskuryakov - - Reviewed by Geoff Garen. - - JSClassRef is created context-free, but gets infatuated with the first context it sees. - - The implicit API contract is that JSClassRef can be used with any context on any thread. - This no longer worked, because UStrings in the class were turned into per-context - identifiers, and the cached JSObject prototype was tied to JSGlobalData, too. - - * API/JSClassRef.h: Made a separate struct for context-dependent parts of OpaqueJSClass. - * API/JSClassRef.cpp: - (OpaqueJSClass::OpaqueJSClass): Updated for renames and changed member variable order. - (OpaqueJSClass::~OpaqueJSClass): Assert that string members are not identifiers. - (clearReferenceToPrototype): Update for the new reference location. - (OpaqueJSClassContextData::OpaqueJSClassContextData): Make a deep copy of all strings. - (OpaqueJSClass::contextData): Added a function that finds the per-context part of - OpaqueJSClass in JSGlobalData, or creates it if not found. - (OpaqueJSClass::className): Always make a deep copy. Callers of this function do not have - a way to access JSGlobalData, so a per-context copy could not be made. - (OpaqueJSClass::staticValues): Updated for new data location. - (OpaqueJSClass::staticFunctions): Ditto. - (OpaqueJSClass::prototype): Changed to take an internal type for consistency. - - * kjs/JSGlobalData.cpp: - (KJS::JSGlobalData::JSGlobalData): - (KJS::JSGlobalData::~JSGlobalData): - * kjs/JSGlobalData.h: - Keep a HashMap to access per-context JSClass data given a pointr to the shared part. - - * API/JSCallbackObjectFunctions.h: - (KJS::::className): - (KJS::::getOwnPropertySlot): - (KJS::::put): - (KJS::::deleteProperty): - (KJS::::getPropertyNames): - (KJS::::staticValueGetter): - (KJS::::staticFunctionGetter):j - Use function accessors instead of accessing OpaqueJSClass members directly. - - * API/JSContextRef.cpp: (JSGlobalContextCreate): Updated for the change in - OpaqueJSClass::prototype() argument type. - - * API/JSObjectRef.cpp: - (JSObjectMake): Updated for the change in OpaqueJSClass::prototype() argument type. - (JSObjectMakeConstructor): Ditto. - -2008-07-23 Alexey Proskuryakov - - Build fix. - - * kjs/ArgList.h: (KJS::ArgList::operator new): removed an extraneous "ArgList::" inside the - class definition. - -2008-07-22 Geoffrey Garen - - Reviewed by Oliver Hunt and Sam Weinig. - - Next step toward putting doubles in registers: Prepare the Register class - and its clients for registers that don't contain JSValue*s. - - This means a few things: - - 1. Register::jsValue() clients, including ArgList clients, must now supply - an ExecState* when accessing an entry in an ArgList, in case the entry - will need to create a JSValue* on the fly. - - 2. Register clients that definitely don't want to create a JSValue* on - the fly now use different APIs: getJSValue() for clients that know - the register contains a JSValue*, and v() for clients who just want a - void*. - - 3. I had to change some headers around in order to resolve dependency - problems created by using a Register in the ArgList header. - - SunSpider reports no change. - -2008-07-22 Gavin Barraclough - - Reviewed by Alexey Proskuryakov. - - Prevent integer overflow when reallocating storage vector for arrays. - - Sunspider reports 1.005x as fast (no change expected). - - * kjs/JSArray.cpp: - -2008-07-21 Mark Rowe - - Reviewed by Sam Weinig. - - Revamp the handling of CFBundleShortVersionString to be fixed at the major component of the version number. - - * Configurations/Version.xcconfig: - * Info.plist: - -2008-07-21 Adam Roben - - Add Vector::find - - This is a convenience wrapper around std::find. - - Reviewed by Anders Carlsson. - - * wtf/Vector.h: - -2008-07-19 Oliver Hunt - - Reviewed by Cameron Zwarich. - - Bug 20104: Exception in tables/mozilla_expected_failures/bugs/bug92868_1.html includes the equals operator in the quoted expression - - - To make this correct we make the dot and bracket assign nodes emit the information to indicate - the failure range is the dot/bracket accessor. - - * kjs/grammar.y: - -2008-07-18 Steve Falkenburg - - Windows build fix. - - * kjs/JSGlobalObjectFunctions.cpp: - (KJS::isStrWhiteSpace): - -2008-07-18 Steve Falkenburg - - Windows build fix. - - * kjs/nodes.h: - (KJS::ThrowableExpressionData::ThrowableExpressionData): - -2008-07-18 Oliver Hunt - - Reviewed by Cameron Zwarich. - - Bug 18774: SQUIRRELFISH: print meaningful error messages - SQUIRRELFISH: JavaScript error messages are missing informative text - - Add support for decent error messages in JavaScript. This patch achieves this by providing - ensuring the common errors and exceptions have messages that provide the text of expression - that trigger the exception. In addition it attaches a number of properties to the exception - object detailing where in the source the expression came from. - - * JavaScriptCore.exp: - * VM/CodeBlock.cpp: - (KJS::CodeBlock::lineNumberForVPC): - (KJS::CodeBlock::expressionRangeForVPC): - Function to recover the expression range for an instruction - that triggered an exception. - * VM/CodeBlock.h: - (KJS::ExpressionRangeInfo::): - (KJS::CodeBlock::CodeBlock): - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::emitCall): - (KJS::CodeGenerator::emitCallEval): - Emit call needed to be modified so to place the expression range info internally, - as the CodeGenerator emits the arguments nodes itself, rather than the various call - nodes. - * VM/CodeGenerator.h: - (KJS::CodeGenerator::emitExpressionInfo): - Record the expression range info. - * VM/ExceptionHelpers.cpp: - (KJS::createErrorMessage): - (KJS::createInvalidParamError): - (KJS::createUndefinedVariableError): - (KJS::createNotAConstructorError): - (KJS::createNotAFunctionError): - (KJS::createNotAnObjectErrorStub): - (KJS::createNotAnObjectError): - Rewrite all the code for the error messages so that they make use of the newly available - information. - * VM/ExceptionHelpers.h: - * VM/Machine.cpp: - (KJS::isNotObject): Now needs vPC and codeBlock - (KJS::Machine::throwException): - New logic to handle the NotAnObjectErrorStub and to handle the absurd "no default value" edge case - (KJS::Machine::privateExecute): - * VM/Machine.h: - * kjs/DebuggerCallFrame.cpp: - (KJS::DebuggerCallFrame::evaluate): - * kjs/Error.cpp: - (KJS::Error::create): - * kjs/Error.h: - * kjs/JSGlobalObjectFunctions.cpp: - * kjs/JSImmediate.cpp: - (KJS::JSImmediate::toObject): - (KJS::JSImmediate::prototype): - My changes to the JSNotAnObject constructor needed to be handled here. - * kjs/JSNotAnObject.h: - (KJS::JSNotAnObjectErrorStub::JSNotAnObjectErrorStub): - (KJS::JSNotAnObjectErrorStub::isNull): - (KJS::JSNotAnObjectErrorStub::isNotAnObjectErrorStub): - Added a JSNotAnObjectErrorStub class to ease the handling of toObject failure exceptions, - and potentially allow even more detailed error messages in future. - * kjs/JSObject.h: - * kjs/Parser.h: - (KJS::Parser::parse): - * kjs/SourceRange.h: - * kjs/grammar.y: - Large amounts of position propagation. - * kjs/lexer.cpp: - (KJS::Lexer::Lexer): - (KJS::Lexer::shift): - (KJS::Lexer::lex): - The lexer needed a few changes to be able to correctly track token character positions. - * kjs/lexer.h: - * kjs/nodes.cpp: - (KJS::ThrowableExpressionData::emitThrowError): - (KJS::StatementNode::StatementNode): - (KJS::ResolveNode::emitCode): - (KJS::BracketAccessorNode::emitCode): - (KJS::DotAccessorNode::emitCode): - (KJS::NewExprNode::emitCode): - (KJS::EvalFunctionCallNode::emitCode): - (KJS::FunctionCallValueNode::emitCode): - (KJS::FunctionCallResolveNode::emitCode): - (KJS::FunctionCallBracketNode::emitCode): - (KJS::FunctionCallDotNode::emitCode): - (KJS::PostfixResolveNode::emitCode): - (KJS::PostfixBracketNode::emitCode): - (KJS::PostfixDotNode::emitCode): - (KJS::DeleteResolveNode::emitCode): - (KJS::DeleteBracketNode::emitCode): - (KJS::DeleteDotNode::emitCode): - (KJS::PrefixResolveNode::emitCode): - (KJS::PrefixBracketNode::emitCode): - (KJS::PrefixDotNode::emitCode): - (KJS::ThrowableBinaryOpNode::emitCode): - (KJS::ReadModifyResolveNode::emitCode): - (KJS::AssignResolveNode::emitCode): - (KJS::AssignDotNode::emitCode): - (KJS::ReadModifyDotNode::emitCode): - (KJS::AssignBracketNode::emitCode): - (KJS::ReadModifyBracketNode::emitCode): - (KJS::ForInNode::ForInNode): - (KJS::ForInNode::emitCode): - (KJS::WithNode::emitCode): - (KJS::LabelNode::emitCode): - (KJS::ThrowNode::emitCode): - (KJS::ProgramNode::ProgramNode): - (KJS::ProgramNode::create): - (KJS::EvalNode::generateCode): - (KJS::FunctionBodyNode::create): - (KJS::FunctionBodyNode::generateCode): - (KJS::ProgramNode::generateCode): - All of these methods were handling the position information. - Constructors and create methods were modified to store the information. - All the emitCall implementations listed needed to be updated to actually - record the position information we have so carefully collected. - * kjs/nodes.h: - (KJS::ThrowableExpressionData::ThrowableExpressionData): - (KJS::ThrowableExpressionData::setExceptionSourceRange): - (KJS::ThrowableExpressionData::divot): - (KJS::ThrowableExpressionData::startOffset): - (KJS::ThrowableExpressionData::endOffset): - (KJS::ThrowableSubExpressionData::ThrowableSubExpressionData): - (KJS::ThrowableSubExpressionData::setSubexpressionInfo): - (KJS::ThrowablePrefixedSubExpressionData::ThrowablePrefixedSubExpressionData): - (KJS::ThrowablePrefixedSubExpressionData::setSubexpressionInfo): - ThrowableExpressionData is just a uniform mechanism for storing the position - information. - (KJS::ResolveNode::): - (KJS::PrePostResolveNode::): - (KJS::ThrowableBinaryOpNode::): - (KJS::WithNode::): - -2008-07-18 Geoffrey Garen - - Reviewed by Cameron Zwarich. - - Three renames: - - "CallTypeNative" => "CallTypeHost" - "code" => "byteCode" - "generatedCode" => "generatedByteCode" - -2008-07-18 Geoffrey Garen - - Reviewed by Oliver Hunt. - - Optimized <= for immediate number cases. - - SunSpider reports no overall change, but a 10% speedup on access-nsieve. - -2008-07-18 Mark Rowe - - Rubber-stamped by Sam Weinig. - - Fix some casts added in a previous build fix to match the style used - throughout WebKit. - - * VM/Machine.cpp: - (KJS::Machine::initializeCallFrame): - * VM/Register.h: - (KJS::Register::Register): - -2008-07-18 Landry Breuil - - Bug 19975: [OpenBSD] Patches to enable build of WebKit - - - - Reviewed by David Kilzer. - - Support for OpenBSD, mostly threading and libm tweaks. - - * kjs/collector.cpp: #include - (KJS::currentThreadStackBase): use pthread_stackseg_np() to get stack base - * kjs/config.h: OpenBSD also provides - * wtf/MathExtras.h: #include and - (isfinite), (signbit): as long as we don't have those functions provide fallback implementations - * wtf/Platform.h: Add support for PLATFORM(OPENBSD) and PLATFORM(SPARC64) macro - -2008-07-17 Geoffrey Garen - - Reviewed by Oliver Hunt. - - Next step toward putting doubles in registers: Store constant pool - entries as registers, not JSValue*s. - - SunSpider reports no change. - -2008-07-17 Geoffrey Garen - - Reviewed by John Sullivan and Oliver Hunt. - - A tiny bit of tidying in function call register allocation. - - This patch saves one register when invoking a function expression and/or - a new expression that is stored in a temporary. - - Since it's just one register, I can't make a testcase for it. - - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::emitCall): No need to ref the function we're calling - or its base. We'd like the call frame to overlap with them, if possible. - op_call will read the function and its base before writing the call frame, - so this is safe. - - * kjs/nodes.cpp: - (KJS::NewExprNode::emitCode): No need to ref the function we're new-ing, - for the same reasons stated above. - - (KJS::FunctionCallValueNode::emitCode): ditto - -2008-07-17 Steve Falkenburg - - Build fix. - - * kjs/InternalFunction.cpp: - -2008-07-17 Sam Weinig - - Roll out r35199 as it is causing failures on the PPC build. - -2008-07-17 Geoffrey Garen - - Reviewed by David Kilzer. - - Fixed https://bugs.webkit.org/show_bug.cgi?id=20067 - Support function.name (Firefox extension) - - Pretty straight-forward. - -2008-07-17 Geoffrey Garen - - Reviewed by Oliver Hunt. - - Fixed Functions calls use more temporary - registers than necessary - - Holding a reference to the last statement result register caused each - successive statement to output its result to an even higher register. - - Happily, statements don't actually need to return a result register - at all. I hope to make this clearer in a future cleanup patch, - but this change will fix the major bug for now. - - * kjs/nodes.cpp: - (KJS::statementListEmitCode): - -2008-07-17 Gavin Barraclough - - Reviewed by Sam Weinig. - - Merge pre&post dot nodes to simplify the parse tree. - Sunspider results show 0.6% progression (no performance change expected). - - * kjs/grammar.y: - * kjs/nodes.cpp: - * kjs/nodes.h: - * kjs/nodes2string.cpp: - -2008-07-17 Gavin Barraclough - - Reviewed by Cameron Zwarich. - - Merge pre&post resolve nodes to simplify the parse tree. - Sunspider results show no performance change. - - * kjs/grammar.y: - * kjs/nodes.cpp: - * kjs/nodes.h: - * kjs/nodes2string.cpp: - -2008-07-17 Gavin Barraclough - - Reviewed by Cameron Zwarich. - - Merge logical nodes to simplify the parse tree. - Sunspider results show 0.6% progression (no performance change expected). - - * kjs/grammar.y: - * kjs/nodes.cpp: - * kjs/nodes.h: - * kjs/nodes2string.cpp: - -2008-07-17 Ariya Hidayat - - Reviewed by Simon. - - Fix MinGW build (broken in r35198) and simplify getLocalTime(). - - * kjs/DateMath.cpp: - (KJS::getLocalTime): - -2008-07-17 Gavin Barraclough - - Reviewed by Sam Weinig. - - Merge pre&post bracket nodes to simplify the parse tree. - Sunspider results show no performance change. - - * kjs/grammar.y: - * kjs/nodes.cpp: - * kjs/nodes.h: - * kjs/nodes2string.cpp: - -2008-07-17 Ariya Hidayat - - Reviewed by Simon. - - Fix the 32-bit gcc builds, conversion from "long int" to Register is - ambiguous. Explicitly choose the intptr_t constructor. - - * VM/Machine.cpp: - (KJS::Machine::initializeCallFrame): - * VM/Register.h: - (KJS::Register::Register): - -2008-07-16 Mark Rowe - - Rubber-stamped by Geoff Garen. - - Fix JavaScript in 64-bit by using a pointer-sized integer - type in the Register union. Also includes a rename of - the intType constant to IntType. - - * VM/Machine.cpp: - (KJS::Machine::initializeCallFrame): - * VM/Register.h: - (KJS::Register::): - (KJS::Register::Register): - -2008-07-17 Geoffrey Garen - - Reviewed by Oliver Hunt. - - First step toward putting doubles in registers: Turned Register into a - proper abstraction layer. It is no longer possible to cast a Register - to a JSValue*, or a Register& to a JSValue*&, or to access the union - inside a Register directly. - - SunSpider reports no change. - - In support of this change, I had to make the following mechanical changes - in a lot of places: - - 1. Clients now use explicit accessors to read data out of Registers, and - implicit copy constructors to write data into registers. - - So, assignment that used to look like - - x.u.jsValue = y; - - now looks like - - x = y; - - And access that used to look like - - x = y.u.jsValue; - - now looks like - - x = y.jsValue(); - - 2. I made generic flow control specific in opcodes that made their flow - control generic by treating a Register& as a JSValue*&. This had the - added benefit of removing some exception checking branches from immediate - number code. - - 3. I beefed up PropertySlot to support storing a Register* in a property - slot. For now, only JSVariableObject's symbolTableGet and symbolTablePut - use this functionality, but I expect more clients to use it in the future. - - 4. I changed ArgList to be a buffer of Registers, not JSValue*'s, and I - changed ArgList iterator clients to iterate Registers, not JSValue*'s. - -2008-07-16 Ada Chan - - Fixed build. - - * kjs/JSGlobalObject.cpp: - -2008-07-16 Kevin McCullough - - Reviewed by Sam and Geoff. - - Navigating to another page while profiler is - attached results in slow JavaScript for all time. - - - The UNLIKELY keeps this from being a sunspider performance regression. - - * kjs/JSGlobalObject.cpp: - (KJS::JSGlobalObject::~JSGlobalObject): Stop the profiler associated - with this exec state. - -2008-07-16 Sam Weinig - - Reviewed by Steve Falkenburg. - - Replace adopting UString constructor in favor of explicit - static adopt method. - - * API/JSStringRefCF.cpp: - (JSStringCreateWithCFString): - * kjs/StringConstructor.cpp: - (KJS::stringFromCharCode): - * kjs/StringPrototype.cpp: - (KJS::stringProtoFuncToLowerCase): - (KJS::stringProtoFuncToUpperCase): - (KJS::stringProtoFuncToLocaleLowerCase): - (KJS::stringProtoFuncToLocaleUpperCase): - * kjs/ustring.cpp: - (KJS::UString::adopt): - * kjs/ustring.h: - (KJS::UString::UString): - (KJS::UString::~UString): - -2008-07-16 Ariya Hidayat - - Reviewed by Simon. - - http://trolltech.com/developer/task-tracker/index_html?method=entry&id=216179 - Fix potential crash (on Qt for Windows port) when performing JavaScript date - conversion. - - * kjs/DateMath.cpp: - (KJS::getLocalTime): For the Qt port, prefer to use Windows code, i.e. - localtime_s() instead of localtime() since the latter might crash (on Windows) - given a non-sensible, e.g. NaN, argument. - -2008-07-16 Alexey Proskuryakov - - Reviewed by Anders and Geoff. - - https://bugs.webkit.org/show_bug.cgi?id=20023 - Failed assertion in PropertyNameArray.cpp - - This is already tested by testapi. - - * API/JSObjectRef.cpp: (JSPropertyNameAccumulatorAddName): Add the string to identifier - table to appease PropertyNameArray. - -2008-07-16 Alexey Proskuryakov - - Reviewed by Geoff. - - Dereference identifiers when deleting a hash table (fixes leaks with private JSGlobalData - objects). - - * kjs/JSGlobalData.cpp: (KJS::JSGlobalData::~JSGlobalData): - * kjs/lookup.cpp: (KJS::HashTable::deleteTable): - * kjs/lookup.h: - * kjs/lexer.cpp: (KJS::Lexer::~Lexer) - HashTable cannot have a destructor, because check-for-global-initializers complains about - having a global constructor then. - -2008-07-16 Alexey Proskuryakov - - Reviewed by Geoff. - - Check pthread_key_create return value. - - This check was helpful when debugging a crash in run-webkit-tests --threaded that happened - because JSGlobalData objects were not deleted, and we were running out of pthread keys soon. - It also looks useful for production builds. - - * wtf/ThreadSpecific.h: (WTF::::ThreadSpecific): - -2008-07-15 Kevin McCullough - - Reviewed by Geoff. - - Rename pageGroupIdentifier to profileGroup to keep mention of a - pageGroup out of JavaScriptCore. - - * kjs/JSGlobalObject.cpp: - (KJS::JSGlobalObject::init): - * kjs/JSGlobalObject.h: - (KJS::JSGlobalObject::setProfileGroup): - (KJS::JSGlobalObject::profileGroup): - * profiler/ProfileGenerator.cpp: - (KJS::ProfileGenerator::create): - (KJS::ProfileGenerator::ProfileGenerator): - * profiler/ProfileGenerator.h: - (KJS::ProfileGenerator::profileGroup): - * profiler/Profiler.cpp: - (KJS::Profiler::startProfiling): - (KJS::dispatchFunctionToProfiles): - (KJS::Profiler::willExecute): - (KJS::Profiler::didExecute): - -2008-07-14 Mark Rowe - - Reviewed by Sam Weinig. - - Fix https://bugs.webkit.org/show_bug.cgi?id=20037 - Bug 20037: GCC 4.2 build broken due to strict aliasing violation. - - * kjs/ustring.cpp: - (KJS::UString::Rep::computeHash): Add a version of computeHash that takes a char* and explicit length. - * kjs/ustring.h: - * profiler/CallIdentifier.h: - (WTF::): Use new version of computeHash that takes a char* and explicit length to avoid unsafe aliasing. - -2008-07-14 David Hyatt - - Fix a crashing bug in ListHashSet's -- operator. Make sure that end() can be -- by special-casing the null - position. - - Reviewed by Maciej - - * wtf/ListHashSet.h: - (WTF::ListHashSetConstIterator::operator--): - -2008-07-14 David Hyatt - - Buidl fix. Make sure the second insertBefore method returns a value. - - * wtf/ListHashSet.h: - (WTF::::insertBefore): - -2008-07-14 Adam Roben - - Windows build fix - - * JavaScriptCore.vcproj/jsc/jsc.vcproj: Added include/pthreads to the - include path. - -2008-07-14 Alexey Proskuryakov - - Reviewed by Kevin McCullough. - - Make JSGlobalData refcounted in preparation to adding a way to create contexts that share - global data. - - * JavaScriptCore.exp: - * kjs/JSGlobalData.cpp: - (KJS::JSGlobalData::create): - * kjs/JSGlobalData.h: - Made contructor private, and added a static create() method. Made the class inherit from - RefCounted. - - * kjs/JSGlobalObject.h: - (KJS::JSGlobalObject::globalData): - JSGlobalData is now owned by JSGlobalObject (except for the shared one, and the common - WebCore one, which are never deleted). - - * kjs/Shell.cpp: (main): Create JSGlobalData with create() method. - -2008-07-14 Simon Hausmann - - Fix the single-threaded build. - - * kjs/JSLock.cpp: Removed undeclared registerThread() function. - * kjs/collector.cpp: - (KJS::Heap::registerThread): Added dummy implementation. - -2008-07-14 Alexey Proskuryakov - - Reviewed by Geoff Garen. - - Eliminate per-thread JavaScript global data instance support and make arbitrary - global data/global object combinations possible. - - * kjs/collector.cpp: - (KJS::Heap::Heap): Store a JSGlobalData pointer instead of multiple pointers to its members. - This allows for going from any JS object to its associated global data, currently used in - JSGlobalObject constructor to initialize its JSGlobalData pointer. - (KJS::Heap::registerThread): Changed thread registration data to be per-heap. Previously, - only the shared heap could be used from multiple threads, so it was the only one that needed - thread registration, but now this can happen to any heap. - (KJS::Heap::unregisterThread): Ditto. - (KJS::Heap::markStackObjectsConservatively): Adapt for the above changes. - (KJS::Heap::setGCProtectNeedsLocking): Ditto. - (KJS::Heap::protect): Ditto. - (KJS::Heap::unprotect): Ditto. - (KJS::Heap::collect): Ditto. - (KJS::Heap::globalObjectCount): Use global object list associated with the current heap, - not the late per-thread one. - (KJS::Heap::protectedGlobalObjectCount): Ditto. - - * kjs/collector.h: - (KJS::Heap::ThreadRegistrar): Added a helper object that unregisters a thread when it is - destroyed. - - * kjs/JSLock.cpp: - (KJS::JSLock::JSLock): - * kjs/JSLock.h: - (KJS::JSLock::JSLock): - Don't use JSLock to implicitly register threads. I've added registerThread() calls to most - places that use JSLock - we cannot guarantee absolute safety unless we always mark all - threads in the process, but these implicit registration calls should cover reasonable usage - scenarios, I hope. - - * API/JSBase.cpp: - (JSEvaluateScript): Explicitly register the current thread. - (JSCheckScriptSyntax): Explicitly register the current thread. - (JSGarbageCollect): Changed to use the passed in context. Unfortunately, this creates a race - condition for clients that pass an already released context to JSGarbageCollect - but it is - unlikely to create real life problems. - To maintain compatibility, the shared heap is collected if NULL is passed. - - * API/JSContextRef.cpp: - (JSGlobalContextCreate): Use a new syntax for JSGlobalObject allocation. - (JSGlobalContextRetain): Register the thread. - (JSContextGetGlobalObject): Register the thread. - - * API/JSObjectRef.cpp: - (JSObjectMake): - (JSObjectMakeFunctionWithCallback): - (JSObjectMakeConstructor): - (JSObjectMakeFunction): - (JSObjectHasProperty): - (JSObjectGetProperty): - (JSObjectSetProperty): - (JSObjectGetPropertyAtIndex): - (JSObjectSetPropertyAtIndex): - (JSObjectDeleteProperty): - (JSObjectCallAsFunction): - (JSObjectCallAsConstructor): - (JSObjectCopyPropertyNames): - (JSPropertyNameAccumulatorAddName): - * API/JSValueRef.cpp: - (JSValueIsEqual): - (JSValueIsInstanceOfConstructor): - (JSValueMakeNumber): - (JSValueMakeString): - (JSValueToNumber): - (JSValueToStringCopy): - (JSValueToObject): - (JSValueProtect): - (JSValueUnprotect): - Register the thread. - - * API/JSStringRef.cpp: (JSStringRelease): Changed a comment to not mention per-thread contexts. - - * API/JSStringRefCF.cpp: Removed an unnecessary include of JSLock.h. - - * JavaScriptCore.exp: Export JSGlobalData constructor/destructor, now that anyone can have - their own instances. Adapt to other changes, too. - - * JavaScriptCore.xcodeproj/project.pbxproj: Made ThreadSpecific.h private, as it is now - included by collector.h and is thus needed in other projects. - - * kjs/InitializeThreading.cpp: (KJS::initializeThreadingOnce): Don't initialize per-thread - global data, as it no longer exists. - - * kjs/JSGlobalData.cpp: - (KJS::JSGlobalData::JSGlobalData): - (KJS::JSGlobalData::~JSGlobalData): - * kjs/JSGlobalData.h: - Removed support for per-thread instance. Made constructor and destructor public. - - * kjs/JSGlobalObject.cpp: (KJS::JSGlobalObject::init): Get to now arbitrary JSGlobalData - via the heap. - (KJS::JSGlobalObject::operator new): Changed ot take JSGlobalDatra pointer. - * kjs/JSGlobalObject.h: - - * kjs/Shell.cpp: - (main): - (jscmain): - Changed to maintain a custom JSGlobalData pointer instead of a per-thread one. - -2008-07-13 Ada Chan - - Windows build fix: Add wtf/RefCountedLeakCounter to the project. - - * JavaScriptCore.vcproj/WTF/WTF.vcproj: - -2008-07-12 Jan Michael Alonzo - - Gtk, Qt and Wx build fix: Add wtf/RefCountedLeakCounter in the - build scripts - - * GNUmakefile.am: - * JavaScriptCore.pri: - * JavaScriptCoreSources.bkl: - -2008-07-11 Stephanie Lewis - - Reviewed by Darin Adler and Oliver Hunt. - - Refactor RefCounting Leak counting code into a common class. - - In order to export the symbols I needed to put the debug defines inside the function names - - Before we had a separate channel for each Logging each Leak type. Since the leak channels were only used in one location, and only at quit for simplicity I combined them all into one leak channel. - - * JavaScriptCore.exp: - * JavaScriptCore.xcodeproj/project.pbxproj: add new class - * kjs/nodes.cpp: remove old leak counting code - * wtf/RefCountedLeakCounter.cpp: Added. create a common leak counting class - * wtf/RefCountedLeakCounter.h: Added. - -2008-07-11 David Hyatt - - Add an insertBefore method to ListHashSet to allow for insertions in the middle of the list (rather than just - at the end). - - Reviewed by Anders - - * wtf/ListHashSet.h: - (WTF::::insertBefore): - (WTF::::insertNodeBefore): - -2008-07-11 Sam Weinig - - Rubber-stamped by Darin Adler. - - Move call function to CallData.cpp and construct to ConstructData.cpp. - - * GNUmakefile.am: - * JavaScriptCore.pri: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - * JavaScriptCoreSources.bkl: - * kjs/AllInOneFile.cpp: - * kjs/CallData.cpp: Copied from kjs/JSValue.cpp. - * kjs/ConstructData.cpp: Copied from kjs/JSValue.cpp. - * kjs/JSValue.cpp: - -2008-07-10 Mark Rowe - - Reviewed by Sam Weinig. - - Define WEBKIT_VERSION_MIN_REQUIRED=WEBKIT_VERSION_LATEST when building WebKit to ensure that no symbols end up with the weak_import attribute. - - * Configurations/Base.xcconfig: - -2008-07-10 Mark Rowe - - Reviewed by Sam Weinig. - - Fix the Tiger build by omitting annotations from methods declared in categories when using old versions of GCC. - - * API/WebKitAvailability.h: - -2008-07-10 Kevin McCullough - - Reviewed by Darin. - - -Minor cleanup. Renamed callTree() to head() and no longer use m_head - directly but instead keep it private and access via a method(). - - * profiler/HeavyProfile.cpp: - (KJS::HeavyProfile::HeavyProfile): - (KJS::HeavyProfile::generateHeavyStructure): - (KJS::HeavyProfile::addNode): - * profiler/Profile.h: - (KJS::Profile::head): - * profiler/ProfileGenerator.cpp: - (KJS::ProfileGenerator::ProfileGenerator): - -2008-07-10 Alexey Proskuryakov - - Reviewed by Mark Rowe. - - Eliminate CollectorHeapIntrospector. - - CollectorHeapIntrospector was added primarily in the hopes to improve leaks tool output, - a result that it didn't deliver. Also, it helped by labeling JSC heap regions as reported by - vmmap tool, but at the same time, it made them mislabeled as malloc'd ones - the correct - way to label mapped regions is to use a VM tag. - - So, it makes more sense to remove it completely than to make it work with multiple heaps. - - * JavaScriptCore.exp: - * JavaScriptCore.xcodeproj/project.pbxproj: - * kjs/AllInOneFile.cpp: - * kjs/InitializeThreading.cpp: - (KJS::initializeThreading): - * kjs/collector.cpp: - * kjs/collector.h: - * kjs/CollectorHeapIntrospector.cpp: Removed. - * kjs/CollectorHeapIntrospector.h: Removed. - -2008-07-09 Kevin McCullough - - Reviewed by Darin. - - JSProfiler: Implement heavy (or bottom-up) - view (19228) - - Implemented the time and call count portionof heavy. Now all that we - need is some UI. - - * profiler/CallIdentifier.h: Removed an unused constructor. - * profiler/HeavyProfile.cpp: - (KJS::HeavyProfile::HeavyProfile): Set the initial time of the head - node so that percentages work correctly. - (KJS::HeavyProfile::mergeProfiles): Sum the times and call count of - nodes being merged. - * profiler/ProfileNode.cpp: Set the intital values of time and call - count when copying ProfileNodes. - (KJS::ProfileNode::ProfileNode): - -2008-07-10 Jan Michael Alonzo - - Gtk build fix. - - * GNUmakefile.am: Add HeavyProfile.cpp - -2008-07-09 Mark Rowe - - Reviewed by Geoff Garen. - - Don't warn about deprecated functions in production builds. - - * Configurations/Base.xcconfig: - * Configurations/DebugRelease.xcconfig: - -2008-07-09 Darin Adler - - * JavaScriptCore.pri: Fix Qt build by adding HeavyProfile.cpp. - -2008-07-09 Kevin Ollivier - - wx biuld fix. Add HeavyProfile.cpp to build files. - - * JavaScriptCoreSources.bkl: - -2008-07-09 Kevin McCullough - - - Windows build fix. - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - -2008-07-09 Kevin McCullough - - - Build fix. - - * profiler/HeavyProfile.cpp: - (KJS::HeavyProfile::mergeProfiles): - -2008-07-09 Kevin McCullough - - Reviewed by Geoff and Adam. - - JSProfiler: Implement Bottom-Up view (19228) - - This is the plumbing for bottom-up, but does not include calculating - time, mostly because I'm still undclear about what the end result should - look like. - - This, obviously, does not include the UI to expose this in the - inspector yet. - - * JavaScriptCore.xcodeproj/project.pbxproj: - * profiler/CallIdentifier.h: - (KJS::CallIdentifier::CallIdentifier): - (WTF::): Added HashTraits for CallIdentifiers to be used by a HashMap. - * profiler/HeavyProfile.cpp: Added. - (KJS::HeavyProfile::HeavyProfile): - (KJS::HeavyProfile::generateHeavyStructure): - (KJS::HeavyProfile::addNode): - (KJS::HeavyProfile::mergeProfiles): - (KJS::HeavyProfile::addAncestorsAsChildren): - * profiler/HeavyProfile.h: Added. - (KJS::HeavyProfile::create): - (KJS::HeavyProfile::heavyProfile): - (KJS::HeavyProfile::treeProfile): - * profiler/Profile.cpp: Removed old commented out includes. - * profiler/Profile.h: The m_head is needed by the HeavyProfile so it - is now protected as opposed to private. - * profiler/ProfileNode.cpp: - (KJS::ProfileNode::ProfileNode): Created a constructor to copy - ProfileNodes. - (KJS::ProfileNode::findChild): Added a null check to make HeavyProfile - children finding easier and avoid a potential crasher. - * profiler/ProfileNode.h: Mostly moved things around but also added some - functionality needed by HeavyProfile. - (KJS::ProfileNode::create): - (KJS::ProfileNode::functionName): - (KJS::ProfileNode::url): - (KJS::ProfileNode::lineNumber): - (KJS::ProfileNode::head): - (KJS::ProfileNode::setHead): - (KJS::ProfileNode::setNextSibling): - (KJS::ProfileNode::actualTotalTime): - (KJS::ProfileNode::actualSelfTime): - * profiler/TreeProfile.cpp: Implemented the ability to get a - HeavyProfile. - (KJS::TreeProfile::heavyProfile): - * profiler/TreeProfile.h: - -2008-07-08 Geoffrey Garen - - Reviewed by Oliver Hunt. - - Added support for checking if an object has custom properties in its - property map. WebCore uses this to optimize marking DOM wrappers. - -2008-07-08 Simon Hausmann - - Prospective Gtk/Wx build fixes, add ProfileGenerator.cpp to the build. - - * GNUmakefile.am: - * JavaScriptCoreSources.bkl: - -2008-07-08 Simon Hausmann - - Fix the Qt build, add ProfileGenerator.cpp to the build. - - * JavaScriptCore.pri: - -2008-07-07 David Kilzer - - releaseFastMallocFreeMemory() should always be defined - - Reviewed by Darin. - - * JavaScriptCore.exp: Changed to export C++ binding for - WTF::releaseFastMallocFreeMemory() instead of C binding for - releaseFastMallocFreeMemory(). - * wtf/FastMalloc.cpp: Moved definitions of - releaseFastMallocFreeMemory() to be in the WTF namespace - regardless whether FORCE_SYSTEM_MALLOC is defined. - * wtf/FastMalloc.h: Moved releaseFastMallocFreeMemory() from - extern "C" binding to WTF::releaseFastMallocFreeMemory(). - -2008-07-07 Cameron Zwarich - - Reviewed by Geoff. - - Bug 19926: URL causes crash within a minute - - - Add a check that lastGlobalObject is non-null in Machine::execute() - before copying its globals to the current register file. - - In theory, it is possible to make a test case for this, but it will - take a while to get it right. - - * VM/Machine.cpp: - (KJS::Machine::execute): - -2008-07-07 Darin Adler - - Rubber stamped by Adele. - - * VM/Machine.cpp: - (KJS::Machine::privateExecute): Fix a typo in a comment. - -2008-07-07 Steve Falkenburg - - Build fixes. - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.vcproj/testapi/testapi.vcproj: - -2008-07-07 Kevin McCullough - - Reviewed by Darin. - - When the profiler is running it gathers information and creates a - Profile. After it finishes the Profile can be sorted and have other - data refinements run over it. Both of these were done in the same class - before. Now I split the gathering operations into a new class called - ProfileGenerator. - - * JavaScriptCore.xcodeproj/project.pbxproj: - * profiler/Profile.cpp: Removed code related to the gather stage of a - Profile's creation. - (KJS::Profile::create): - (KJS::Profile::Profile): - * profiler/Profile.h: Ditto. - (KJS::Profile::title): - (KJS::Profile::callTree): - (KJS::Profile::setHead): - * profiler/ProfileGenerator.cpp: Added. This is the class that will - handle the stage of creating a Profile. Once the Profile is finished - being created, this class goes away. - (KJS::ProfileGenerator::create): - (KJS::ProfileGenerator::ProfileGenerator): - (KJS::ProfileGenerator::title): - (KJS::ProfileGenerator::willExecute): - (KJS::ProfileGenerator::didExecute): - (KJS::ProfileGenerator::stopProfiling): - (KJS::ProfileGenerator::didFinishAllExecution): - (KJS::ProfileGenerator::removeProfileStart): - (KJS::ProfileGenerator::removeProfileEnd): - * profiler/ProfileGenerator.h: Added. - (KJS::ProfileGenerator::profile): - (KJS::ProfileGenerator::originatingGlobalExec): - (KJS::ProfileGenerator::pageGroupIdentifier): - (KJS::ProfileGenerator::client): - (KJS::ProfileGenerator::stoppedProfiling): - * profiler/Profiler.cpp: Now operates with the ProfileGenerator instead - of the Profile. - (KJS::Profiler::startProfiling): - (KJS::Profiler::stopProfiling): - (KJS::Profiler::didFinishAllExecution): It is here that the Profile is - handed off to its client and the Profile Generator is no longer needed. - (KJS::dispatchFunctionToProfiles): - (KJS::Profiler::willExecute): - (KJS::Profiler::didExecute): - * profiler/Profiler.h: Cleaned up the includes and subsequently the - forward declarations. Also use the new ProfileGenerator. - (KJS::ProfilerClient::~ProfilerClient): - (KJS::Profiler::currentProfiles): - * profiler/TreeProfile.cpp: Use Profile's new interface. - (KJS::TreeProfile::create): - (KJS::TreeProfile::TreeProfile): - * profiler/TreeProfile.h: - -2008-07-07 Sam Weinig - - Reviewed by Cameron Zwarich. - - Third step in broad cleanup effort. - - [ File list elided ] - -2008-07-06 Sam Weinig - - Reviewed by Cameron Zwarich. - - Second step in broad cleanup effort. - - [ File list elided ] - -2008-07-05 Sam Weinig - - Reviewed by Cameron Zwarich. - - First step in broad cleanup effort. - - [ File list elided ] - -2008-07-05 Sam Weinig - - Rubber-stamped by Cameron Zwarich. - - Rename list.h/cpp to ArgList.h/cpp. - - * GNUmakefile.am: - * JavaScriptCore.pri: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - * JavaScriptCoreSources.bkl: - * VM/Machine.h: - * kjs/AllInOneFile.cpp: - * kjs/ArgList.cpp: Copied from JavaScriptCore/kjs/list.cpp. - * kjs/ArgList.h: Copied from JavaScriptCore/kjs/list.h. - * kjs/IndexToNameMap.cpp: - * kjs/JSGlobalData.cpp: - * kjs/JSGlobalData.h: - * kjs/JSObject.h: - * kjs/collector.cpp: - * kjs/list.cpp: Removed. - * kjs/list.h: Removed. - -2008-07-05 Sam Weinig - - Fix non-AllInOne builds again. - - * kjs/BooleanPrototype.cpp: - * kjs/ErrorPrototype.cpp: - * kjs/FunctionPrototype.cpp: - * kjs/NumberPrototype.cpp: - * kjs/ObjectPrototype.cpp: - -2008-07-05 Sam Weinig - - Fix build on case-sensitive build systems. - - * kjs/IndexToNameMap.cpp: - -2008-07-05 Sam Weinig - - Fix build. - - * kjs/Arguments.cpp: - * kjs/BooleanPrototype.cpp: - * kjs/DateConstructor.cpp: - * kjs/ErrorPrototype.cpp: - * kjs/FunctionPrototype.cpp: - * kjs/NumberPrototype.cpp: - * kjs/ObjectPrototype.cpp: - * kjs/RegExpPrototype.cpp: - * kjs/StringConstructor.cpp: - * kjs/lookup.cpp: - -2008-07-05 Sam Weinig - - Fix non-AllInOne build. - - * kjs/JSGlobalObject.cpp: - -2008-07-05 Sam Weinig - - Rubber-stamped by Cameron Zwarich. - - Split Arguments, IndexToNameMap, PrototypeFunction, GlobalEvalFunction and - the functions on the global object out of JSFunction.h/cpp. - - * GNUmakefile.am: - * JavaScriptCore.pri: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - * JavaScriptCoreSources.bkl: - * VM/Machine.cpp: - * kjs/AllInOneFile.cpp: - * kjs/Arguments.cpp: Copied from JavaScriptCore/kjs/JSFunction.cpp. - * kjs/Arguments.h: Copied from JavaScriptCore/kjs/JSFunction.h. - * kjs/GlobalEvalFunction.cpp: Copied from JavaScriptCore/kjs/JSFunction.cpp. - * kjs/GlobalEvalFunction.h: Copied from JavaScriptCore/kjs/JSFunction.h. - * kjs/IndexToNameMap.cpp: Copied from JavaScriptCore/kjs/JSFunction.cpp. - * kjs/IndexToNameMap.h: Copied from JavaScriptCore/kjs/JSFunction.h. - * kjs/JSActivation.cpp: - * kjs/JSFunction.cpp: - * kjs/JSFunction.h: - * kjs/JSGlobalObject.cpp: - * kjs/JSGlobalObjectFunctions.cpp: Copied from JavaScriptCore/kjs/JSFunction.cpp. - * kjs/JSGlobalObjectFunctions.h: Copied from JavaScriptCore/kjs/JSFunction.h. - The functions on the global object should be in JSGlobalObject.cpp, but putting them there - was a 0.5% regression. - - * kjs/PrototypeFunction.cpp: Copied from JavaScriptCore/kjs/JSFunction.cpp. - * kjs/PrototypeFunction.h: Copied from JavaScriptCore/kjs/JSFunction.h. - * kjs/Shell.cpp: - * kjs/lexer.cpp: - * kjs/ustring.cpp: - -2008-07-04 Sam Weinig - - Really fix the mac build. - - * JavaScriptCore.xcodeproj/project.pbxproj: - -2008-07-04 Sam Weinig - - Fix mac build. - - * JavaScriptCore.xcodeproj/project.pbxproj: - -2008-07-04 Sam Weinig - - Fix non-AllInOne builds. - - * kjs/Error.cpp: - * kjs/GetterSetter.cpp: - * kjs/JSImmediate.cpp: - * kjs/operations.cpp: - -2008-07-04 Sam Weinig - - Rubber-stamped by Dan Bernstein. - - Split Error and GetterSetter out of JSObject.h. - - * API/JSCallbackObjectFunctions.h: - * GNUmakefile.am: - * JavaScriptCore.pri: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - * JavaScriptCoreSources.bkl: - * kjs/AllInOneFile.cpp: - * kjs/ClassInfo.h: Copied from JavaScriptCore/kjs/JSObject.h. - * kjs/Error.cpp: Copied from JavaScriptCore/kjs/JSObject.cpp. - * kjs/Error.h: Copied from JavaScriptCore/kjs/JSObject.h. - * kjs/GetterSetter.cpp: - * kjs/GetterSetter.h: Copied from JavaScriptCore/kjs/JSObject.h. - * kjs/JSObject.cpp: - * kjs/JSObject.h: - * kjs/nodes.h: - -2008-07-04 Simon Hausmann - - Fix the Wx build, added TreeProfile.cpp to the build. - - * JavaScriptCoreSources.bkl: - -2008-07-03 Mark Rowe - - Reviewed by Oliver Hunt. - - Fix output path of recently-added script phase to reference the correct file. - This prevents Xcode from running the script phase unnecessarily, which caused - the generated header to be recreated and lead to AllInOneFile.cpp rebuilding. - - * JavaScriptCore.xcodeproj/project.pbxproj: - -2008-07-03 Mark Rowe - - Follow-up to the 64-bit build fix. Use intptr_t rather than ssize_t as - the latter is non-standard and does not exist on Windows. - - * kjs/JSLock.cpp: - (KJS::JSLock::lockCount): - (KJS::JSLock::lock): - (KJS::JSLock::unlock): - (KJS::JSLock::DropAllLocks::DropAllLocks): - * kjs/JSLock.h: - -2008-07-02 Mark Rowe - - Fix the 64-bit build. pthread_getspecific works with pointer-sized values, - so use ssize_t rather than int to track the lock count to avoid warnings about - truncating the result of pthread_getspecific. - - * kjs/JSLock.cpp: - (KJS::JSLock::lockCount): - (KJS::JSLock::lock): - (KJS::JSLock::unlock): - (KJS::JSLock::DropAllLocks::DropAllLocks): - * kjs/JSLock.h: - -2008-07-03 Geoffrey Garen - - Reviewed by Sam Weinig. - - Removed checking for the array get/put fast case from the array code. - Callers who want the fast case should call getIndex and/or setIndex - instead. (get_by_val and put_by_val already do this.) - - SunSpider reports no change overall, but a 1.4% speedup on fannkuch and - a 3.6% speedup on nsieve. - -2008-07-03 Dan Bernstein - - - Windows build fix - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Added TreeProfile.{h,cpp}. - -2008-07-03 Dan Bernstein - - Reviewed by Anders Carlsson. - - - Windows build fix - - * VM/Machine.cpp: - (KJS::Machine::Machine): - -2008-07-03 Simon Hausmann - - Reviewed by Alexey Proskuryakov. - - Fix the non-threaded build. - - * kjs/JSGlobalData.cpp: - (KJS::JSGlobalData::threadInstanceInternal): - -2008-07-03 Simon Hausmann - - Fix the Qt build, added TreeProfile to the build. - - * JavaScriptCore.pri: - -2008-07-02 Alexey Proskuryakov - - Reviewed by Geoff. - - Don't create unnecessary JSGlobalData instances. - - * kjs/JSGlobalData.h: - * kjs/JSGlobalData.cpp: - (KJS::JSGlobalData::threadInstanceExists): - (KJS::JSGlobalData::sharedInstanceExists): - (KJS::JSGlobalData::threadInstance): - (KJS::JSGlobalData::sharedInstance): - (KJS::JSGlobalData::threadInstanceInternal): - (KJS::JSGlobalData::sharedInstanceInternal): - Added methods to query instance existence. - - * kjs/InitializeThreading.cpp: - (KJS::initializeThreadingOnce): - Initialize thread instance static in a new way. - - * API/JSBase.cpp: - (JSGarbageCollect): - * kjs/collector.cpp: - (KJS::Heap::collect): - Check for instance existence before accessing it. - -2008-07-02 Geoffrey Garen - - Reviewed by Cameron Zwarich. - - Fixed https://bugs.webkit.org/show_bug.cgi?id=19862 - REGRESSION (r34907): Gmail crashes in JavaScriptCore code while editing drafts - - I was never able to reproduce this issue, but Cameron could, and he says - that this patch fixes it. - - The crash seems tied to a timer or event handler callback. In such a case, - the sole reference to the global object may be in the current call frame, - so we can't depend on the global object to mark the call frame area in - the register file. - - The new GC marking rule is: the global object is not responsible for - marking the whole register file -- it's just responsible for the globals - section it's tied to. The heap is responsible for marking the call frame area. - -2008-07-02 Mark Rowe - - Reviewed by Sam Weinig. - - Add the ability to trace JavaScriptCore garabge collections using dtrace. - - * JavaScriptCore.xcodeproj/project.pbxproj: Generate the dtrace probe header - file when building on a new enough version of Mac OS X. - * JavaScriptCorePrefix.h: Add our standard Mac OS X version detection macros. - * kjs/Tracing.d: Declare three dtrace probes. - * kjs/Tracing.h: Include the generated dtrace macros if dtrace is available, - otherwise provide versions that do nothing. - * kjs/collector.cpp: - (KJS::Heap::collect): Fire dtrace probes when starting a collection, after the - mark phase has completed, and when the collection is complete. - * wtf/Platform.h: Define HAVE_DTRACE when building on a new enough version of Mac OS X. - -2008-07-02 Geoffrey Garen - - Rubber stamped by Oliver Hunt. - - Reduced the max register file size from 8MB to 2MB. - - We still allow about 20,000 levels of recursion. - -2008-07-02 Alp Toker - - Build fix for r34960. Add TreeProfile.cpp to build. - - * GNUmakefile.am: - -2008-07-02 Geoffrey Garen - - Reviewed by Oliver Hunt. - - Optimized a[n] get for cases when a is an array or a string. When a is - an array, we optimize both get and put. When a is a string, we only - optimize get, since you can't put to a string. - - SunSpider says 3.4% faster. - -2008-07-02 Kevin McCullough - - Reviewed by Darin. - - -Small cleanup in preparation for implementing Bottom-up. - - * profiler/CallIdentifier.h: Rename debug function to make it clear of - its output and intention to be debug only. - (KJS::CallIdentifier::operator const char* ): Implement in terms of - c_str. - (KJS::CallIdentifier::c_str): - * profiler/ProfileNode.cpp: Impelment findChild() which will be needed - by the bottom-up implementation. - (KJS::ProfileNode::findChild): - * profiler/ProfileNode.h: Added comments to make the collections of - functions more clear. - (KJS::ProfileNode::operator==): - (KJS::ProfileNode::c_str): - -2008-07-02 Cameron Zwarich - - Reviewed by Darin. - - Bug 19776: Number.toExponential() is incorrect for numbers between 0.1 and 1 - - - Perform the sign check for the exponent on the actual exponent value, - which is 1 less than the value of decimalPoint, instead of on the value - of decimalPoint itself. - - * kjs/NumberPrototype.cpp: - (KJS::exponentialPartToString): - -2008-07-02 Kevin McCullough - - Reviewed by Darin. - - JSProfiler: Implement Bottom-Up view (19228) - - Subclass TreeProfile as I prepare for a HeavyProfile to be comming - later. - - * JavaScriptCore.xcodeproj/project.pbxproj: - * profiler/Profile.cpp: By default we create a TreeProfile. - (KJS::Profile::create): - * profiler/Profile.h: Changes to the Profile class to make it amenable - to be inherited from. - (KJS::Profile::~Profile): - * profiler/TreeProfile.cpp: Added. - (KJS::TreeProfile::create): - (KJS::TreeProfile::TreeProfile): - (KJS::TreeProfile::heavyProfile): - * profiler/TreeProfile.h: Added. - (KJS::TreeProfile::treeProfile): - -2008-07-02 Kevin McCullough - - Reviewed by Dan. - - Broke CallIdentifier out into its own file. I did this because it's - going to grow a lot soon and I wanted this to be a separate patch. - - * JavaScriptCore.xcodeproj/project.pbxproj: - * profiler/CallIdentifier.h: Added. - (KJS::CallIdentifier::CallIdentifier): - (KJS::CallIdentifier::operator==): - (KJS::CallIdentifier::operator!=): - (KJS::CallIdentifier::operator const char* ): - (KJS::CallIdentifier::toString): - * profiler/ProfileNode.h: - -2008-07-02 Simon Hausmann - - Build fix. Implemented missing functions for single-threaded build. - - * kjs/JSLock.cpp: - (KJS::JSLock::JSLock): - (KJS::JSLock::lock): - (KJS::JSLock::unlock): - (KJS::JSLock::DropAllLocks::DropAllLocks): - -2008-07-02 Alexey Proskuryakov - - Another non-AllInOne build fix. - - * kjs/JSGlobalObject.cpp: Include JSLock.h here, too. - -2008-07-02 Alexey Proskuryakov - - Non-AllInOne build fix. - - * kjs/interpreter.cpp: Include JSLock.h. - -2008-06-30 Alexey Proskuryakov - - Reviewed by Darin. - - Disable JSLock for per-thread contexts. - - No change on SunSpider. - - * kjs/JSGlobalData.h: - * kjs/JSGlobalData.cpp: - (KJS::JSGlobalData::JSGlobalData): - (KJS::JSGlobalData::sharedInstance): - Added isSharedInstance as a better way to tell whether the instance is shared (legacy). - - * kjs/JSLock.cpp: - (KJS::createJSLockCount): - (KJS::JSLock::lockCount): - (KJS::setLockCount): - (KJS::JSLock::JSLock): - (KJS::JSLock::lock): - (KJS::JSLock::unlock): - (KJS::JSLock::currentThreadIsHoldingLock): - (KJS::JSLock::DropAllLocks::DropAllLocks): - (KJS::JSLock::DropAllLocks::~DropAllLocks): - * kjs/JSLock.h: - (KJS::JSLock::JSLock): - (KJS::JSLock::~JSLock): - Made JSLock and JSLock::DropAllLocks constructors take a parameter to decide whether to - actually lock a mutex, or only to increment recursion count. We cannot turn it into no-op - if we want to keep existing assertions working. - Made recursion count per-thread, now that locks may not lock. - - * API/JSBase.cpp: - (JSEvaluateScript): Take JSLock after casting JSContextRef to ExecState* (which doesn't need - locking in any case), so that a decision whether to actually lock can be made. - (JSCheckScriptSyntax): Ditto. - (JSGarbageCollect): Only lock while collecting the shared heap, not the per-thread one. - - * API/JSObjectRef.cpp: - (JSClassCreate): Don't lock, as there is no reason to. - (JSClassRetain): Ditto. - (JSClassRelease): Ditto. - (JSPropertyNameArrayRetain): Ditto. - (JSPropertyNameArrayRelease): Only lock while deleting the array, as that may touch - identifier table. - (JSPropertyNameAccumulatorAddName): Adding a string also involves an identifier table - lookup, and possibly modification. - - * API/JSStringRef.cpp: - (JSStringCreateWithCharacters): - (JSStringCreateWithUTF8CString): - (JSStringRetain): - (JSStringRelease): - (JSStringGetUTF8CString): - (JSStringIsEqual): - * API/JSStringRefCF.cpp: - (JSStringCreateWithCFString): - JSStringRef operations other than releasing do not need locking. - - * VM/Machine.cpp: Don't include unused JSLock.h. - - * kjs/CollectorHeapIntrospector.cpp: (KJS::CollectorHeapIntrospector::statistics): - Don't take the lock for real, as heap introspection pauses the process anyway. It seems that - the existing code could cause deadlocks. - - * kjs/Shell.cpp: - (functionGC): - (main): - (jscmain): - The test tool uses a per-thread context, so no real locking is required. - - * kjs/collector.h: - (KJS::Heap::setGCProtectNeedsLocking): Optionally protect m_protectedValues access with a - per-heap mutex. This is only needed for WebCore Database code, which violates the "no data - migration between threads" by using ProtectedPtr on a background thread. - (KJS::Heap::isShared): Keep a shared flag here, as well. - - * kjs/protect.h: - (KJS::::ProtectedPtr): - (KJS::::~ProtectedPtr): - (KJS::::operator): - (KJS::operator==): - (KJS::operator!=): - ProtectedPtr is ony used from WebCore, so it doesn't need to take JSLock. An assertion in - Heap::protect/unprotect guards agains possible future unlocked uses of ProtectedPtr in JSC. - - * kjs/collector.cpp: - (KJS::Heap::Heap): Initialize m_isShared. - (KJS::Heap::~Heap): No need to lock for real during destruction, but must keep assertions - in sweep() working. - (KJS::destroyRegisteredThread): Registered thread list is only accessed for shared heap, - so locking is always needed here. - (KJS::Heap::registerThread): Ditto. - (KJS::Heap::markStackObjectsConservatively): Use m_isShared instead of comparing to a shared - instance for a small speedup. - (KJS::Heap::setGCProtectNeedsLocking): Create m_protectedValuesMutex. There is currently no - way to undo this - and ideally, Database code will be fixed to lo longer require this quirk. - (KJS::Heap::protect): Take m_protectedValuesMutex (if it exists) while accessing - m_protectedValues. - (KJS::Heap::unprotect): Ditto. - (KJS::Heap::markProtectedObjects): Ditto. - (KJS::Heap::protectedGlobalObjectCount): Ditto. - (KJS::Heap::protectedObjectCount): Ditto. - (KJS::Heap::protectedObjectTypeCounts): Ditto. - - * kjs/ustring.cpp: - * kjs/ustring.h: - Don't include JSLock.h, which is no longer used here. As a result, an explicit include had - to be added to many files in JavaScriptGlue, WebCore and WebKit. - - * kjs/JSGlobalObject.cpp: - (KJS::JSGlobalObject::init): - * API/JSCallbackConstructor.cpp: - (KJS::constructJSCallback): - * API/JSCallbackFunction.cpp: - (KJS::JSCallbackFunction::call): - * API/JSCallbackObjectFunctions.h: - (KJS::::init): - (KJS::::getOwnPropertySlot): - (KJS::::put): - (KJS::::deleteProperty): - (KJS::::construct): - (KJS::::hasInstance): - (KJS::::call): - (KJS::::getPropertyNames): - (KJS::::toNumber): - (KJS::::toString): - (KJS::::staticValueGetter): - (KJS::::callbackGetter): - * API/JSContextRef.cpp: - (JSGlobalContextCreate): - (JSGlobalContextRetain): - (JSGlobalContextRelease): - * API/JSValueRef.cpp: - (JSValueIsEqual): - (JSValueIsStrictEqual): - (JSValueIsInstanceOfConstructor): - (JSValueMakeNumber): - (JSValueMakeString): - (JSValueToNumber): - (JSValueToStringCopy): - (JSValueToObject): - (JSValueProtect): - (JSValueUnprotect): - * JavaScriptCore.exp: - * kjs/PropertyNameArray.h: - (KJS::PropertyNameArray::globalData): - * kjs/interpreter.cpp: - (KJS::Interpreter::checkSyntax): - (KJS::Interpreter::evaluate): - Pass a parameter to JSLock/JSLock::DropAllLocks to decide whether the lock needs to be taken. - -2008-07-01 Alexey Proskuryakov - - Reviewed by Darin. - - https://bugs.webkit.org/show_bug.cgi?id=19834 - Failed assertion in JavaScriptCore/VM/SegmentedVector.h:82 - - Creating a global object with a custom prototype resets it twice (wasteful!). - So, addStaticGlobals() was called twice, but JSGlobalObject::reset() didn't reset - the register array. - - * kjs/JSGlobalObject.cpp: (KJS::JSGlobalObject::reset): Call setRegisterArray(0, 0). - - * kjs/JSVariableObject.h: Changed registerArray to OwnArrayPtr. Also, added private copy - constructor and operator= to ensure that no one attempts to copy this object (for whatever - reason, I couldn't make Noncopyable work). - - * kjs/JSGlobalObject.h: (KJS::JSGlobalObject::addStaticGlobals): Allocate registerArray - with new[]. - - * kjs/JSVariableObject.cpp: - (KJS::JSVariableObject::copyRegisterArray): Allocate registerArray with new[]. - (KJS::JSVariableObject::setRegisterArray): Avoid hitting an assertion in OwnArrayPtr when - "changing" the value from 0 to 0. - -2008-07-01 Geoffrey Garen - - Reviewed by Oliver Hunt. - - Removed and/or reordered exception checks in array-style a[n] access. - - SunSpider says 1.4% faster. - - * VM/Machine.cpp: - (KJS::Machine::privateExecute): No need to check for exceptions before - calling toString, toNumber and/or get. If the call ends up being observable - through toString, valueOf, or a getter, we short-circuit it there, instead. - In the op_del_by_val case, I removed the incorrect comment without actually - removing the code, since I didn't want to tempt the GCC fates! - - * kjs/JSObject.cpp: - (KJS::callDefaultValueFunction): Added exception check to prevent - toString and valueOf functions from observing execution after an exception - has been thrown. This removes some of the burden of exception checking - from the machine. - - (KJS::JSObject::defaultValue): Removed redundant exception check here. - - * kjs/PropertySlot.cpp: - (KJS::PropertySlot::functionGetter): Added exception check to prevent - getter functions from observing execution after an exception has been - thrown. This removes some of the burden of exception checking from the - machine. - -2008-07-01 Geoffrey Garen - - Reviewed by Oliver Hunt. - - Optimized a[n] get and put for cases where n is an immediate unsigned - value. - - SunSpider says 3.5% faster. - -2008-07-01 Cameron Zwarich - - Reviewed by Darin. - - Bug 19844: JavaScript Switch statement modifies "this" - - - Use a temporary when generating code for switch clauses to avoid - overwriting 'this' or a local variable. - - * kjs/nodes.cpp: - (KJS::CaseBlockNode::emitCodeForBlock): - -2008-07-01 Christian Dywan - - Gtk+ build fix. - - * kjs/list.cpp: Include "JSCell.h" - -2008-07-01 Kevin McCullough - - Build fix. - - * JavaScriptCore.xcodeproj/project.pbxproj: - -2008-07-01 Dan Bernstein - - Reviewed by Anders Carlsson. - - - Mac release build fix - - * JavaScriptCore.exp: - -2008-07-01 Sam Weinig - - Try and fix mac builds. - - * JavaScriptCore.exp: - -2008-07-01 Sam Weinig - - Fix non-AllInOne builds. - - * kjs/DateMath.cpp: - -2008-07-01 Sam Weinig - - Reviewed by Darin Adler. - - Split JSCell and JSNumberCell class declarations out of JSValue.h - - * GNUmakefile.am: - * JavaScriptCore.pri: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - * JavaScriptCoreSources.bkl: - * VM/JSPropertyNameIterator.h: - * kjs/AllInOneFile.cpp: - * kjs/JSCell.cpp: Copied from JavaScriptCore/kjs/JSValue.cpp. - * kjs/JSCell.h: Copied from JavaScriptCore/kjs/JSValue.h. - (KJS::JSValue::getJSNumber): - * kjs/JSNumberCell.cpp: - * kjs/JSNumberCell.h: Copied from JavaScriptCore/kjs/JSValue.h. - * kjs/JSObject.h: - * kjs/JSString.cpp: - (KJS::jsString): - (KJS::jsOwnedString): - * kjs/JSString.h: - (KJS::JSValue::toThisJSString): - * kjs/JSValue.cpp: - * kjs/JSValue.h: - -2008-07-01 Anders Carlsson - - Build fixes. - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * kjs/JSGlobalObject.h: - (KJS::JSGlobalObject::addStaticGlobals): - -2008-07-01 Simon Hausmann - - Build fix, include OwnPtr.h. - - * kjs/RegExpConstructor.h: - -2008-06-30 Geoffrey Garen - - Reviewed by Oliver Hunt. - - Fixed a global object leak caused by the switch to one register file. - - Don't unconditionally mark the register file, since that logically - makes all global variables GC roots, even when their global object is - no longer reachable. - - Instead, make the global object associated with the register file - responsible for marking the register file. - -2008-06-30 Geoffrey Garen - - Reviewed by Oliver Hunt. - - Removed the "registerBase" abstraction. Since the register file never - reallocates, we can keep direct pointers into it, instead of - tuples. - - SunSpider says 0.8% faster. - -2008-06-30 Oliver Hunt - - Reviewed by NOBODY (build fix). - - Fix build by adding all (hopefully) the missing includes. - - * kjs/BooleanPrototype.cpp: - * kjs/DateConstructor.cpp: - * kjs/ErrorPrototype.cpp: - * kjs/FunctionPrototype.cpp: - * kjs/NativeErrorConstructor.cpp: - * kjs/NumberPrototype.cpp: - * kjs/ObjectPrototype.cpp: - * kjs/RegExpConstructor.cpp: - * kjs/StringConstructor.cpp: - * kjs/StringPrototype.cpp: - -2008-06-30 Cameron Zwarich - - Reviewed by Oliver. - - Bug 19830: REGRESSION (r34883): Google Reader doesn't show up feed list on sidebar - - - Ensure that we do not eliminate a write to a local register when doing - peephole optimizations. - - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::emitJumpIfTrue): - (KJS::CodeGenerator::emitJumpIfFalse): - -2008-06-30 Sam Weinig - - Rubber-stamped by Darin Alder. - - Split InternalFunction into its own header file. - - * API/JSCallbackFunction.h: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - * kjs/ArrayConstructor.h: - * kjs/BooleanConstructor.h: - * kjs/DateConstructor.h: - * kjs/ErrorConstructor.h: - * kjs/FunctionConstructor.h: - * kjs/FunctionPrototype.h: - * kjs/InternalFunction.h: Copied from kjs/JSFunction.h. - * kjs/JSFunction.h: - * kjs/NativeErrorConstructor.h: - * kjs/NumberConstructor.h: - * kjs/ObjectConstructor.h: - * kjs/RegExpConstructor.h: - * kjs/StringConstructor.h: - * profiler/Profiler.cpp: - -2008-06-30 Sam Weinig - - Reviewed by Kevin McCullough. - - Remove empty files Instruction.cpp, LabelID.cpp, Register.cpp and RegisterID.cpp. - - * GNUmakefile.am: - * JavaScriptCore.pri: - * JavaScriptCore.xcodeproj/project.pbxproj: - * JavaScriptCoreSources.bkl: - * VM/Instruction.cpp: Removed. - * VM/LabelID.cpp: Removed. - * VM/Register.cpp: Removed. - * VM/RegisterID.cpp: Removed. - -2008-06-30 Sam Weinig - - Rubber-stamped (reluctantly) by Kevin McCullough. - - Rename date_object.h/cpp to DateInstance.h/cpp - - * GNUmakefile.am: - * JavaScriptCore.pri: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - * JavaScriptCoreSources.bkl: - * kjs/AllInOneFile.cpp: - * kjs/DateConstructor.cpp: - * kjs/DateInstance.cpp: Copied from kjs/date_object.cpp. - * kjs/DateInstance.h: Copied from kjs/date_object.h. - * kjs/DatePrototype.cpp: - * kjs/DatePrototype.h: - * kjs/date_object.cpp: Removed. - * kjs/date_object.h: Removed. - -2008-06-30 Sam Weinig - - Rubber-stamped by Darin Adler. - - Remove internal.cpp and move its contents to there own .cpp files. - - * GNUmakefile.am: - * JavaScriptCore.pri: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - * JavaScriptCoreSources.bkl: - * kjs/AllInOneFile.cpp: - * kjs/GetterSetter.cpp: Copied from kjs/internal.cpp. - * kjs/InternalFunction.cpp: Copied from kjs/internal.cpp. - * kjs/JSNumberCell.cpp: Copied from kjs/internal.cpp. - * kjs/JSString.cpp: Copied from kjs/internal.cpp. - * kjs/JSString.h: - * kjs/LabelStack.cpp: Copied from kjs/internal.cpp. - * kjs/NumberConstructor.cpp: - * kjs/NumberObject.cpp: - (KJS::constructNumber): - (KJS::constructNumberFromImmediateNumber): - * kjs/internal.cpp: Removed. - -2008-06-30 Adam Roben - - Fix Assertion failure due to HashTable's use of - operator& - - HashTable was passing &value to constructDeletedValue, which in - classes like WebCore::COMPtr would cause an assertion. We now pass - value by reference instead of by address so that the HashTraits - implementations have more flexibility in constructing the deleted - value. - - Reviewed by Ada Chan. - - * VM/CodeGenerator.h: Updated for changes to HashTraits. - * wtf/HashTable.h: - (WTF::::deleteBucket): Changed to pass bucket by reference instead of - by address. - (WTF::::checkKey): Ditto. - * wtf/HashTraits.h: - (WTF::): Updated HashTraits for HashTable change. - -2008-07-01 Alexey Proskuryakov - - Reviewed by Cameron Zwarich. - - Make RegisterFile really unmap memory on destruction. - - This fixes run-webkit-tests --threaded, which ran out of address space in a few seconds. - - * VM/RegisterFile.cpp: (KJS::RegisterFile::~RegisterFile): Unmap all the memory, not just - 1/4 of it. - - * kjs/JSGlobalObject.h: Don't include RegisterFile.h, so that changes to it don't make - half of WebCore rebuild. - - * VM/Machine.h: Don't forward declare RegisterFile, as RegisterFile.h is included already. - - * VM/RegisterFile.h: (KJS::RegisterFile::RegisterFile): Assert that the allocation succeeded. - -2008-06-30 Cameron Zwarich - - Rubber-stamped by Oliver. - - Correct the documentation for op_put_by_index. - - * VM/Machine.cpp: - (KJS::Machine::privateExecute): - -2008-06-29 Cameron Zwarich - - Reviewed by Oliver. - - Bug 19821: Merge the instruction pair (less, jfalse) - - - This is a 2.4% win on SunSpider. I needed to add an ALWAYS_INLINE - intrinisc to CodeGenerator::rewindBinaryOp() to avoid a massive - regression in regexp-dna. - - * VM/CodeBlock.cpp: - (KJS::CodeBlock::dump): - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::rewindBinaryOp): - (KJS::CodeGenerator::emitJumpIfFalse): - * VM/Machine.cpp: - (KJS::Machine::privateExecute): - * VM/Opcode.cpp: - (KJS::): - * VM/Opcode.h: - -2008-06-29 Sam Weinig - - Fix non-AllInOne builds. - - * kjs/JSObject.cpp: - * kjs/JSValue.cpp: - -2008-06-29 Sam Weinig - - Build fix for Qt. - - * kjs/DateMath.cpp: - * kjs/DatePrototype.cpp: - -2008-06-29 Sam Weinig - - Rubber-stamped by Cameron Zwarich. - - Splits ErrorConstructor, ErrorPrototype, NativeErrorConstructor and - NativeErrorPrototype out of error_object.h/cpp and renames it ErrorInstance. - - * GNUmakefile.am: - * JavaScriptCore.pri: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - * JavaScriptCoreSources.bkl: - * kjs/AllInOneFile.cpp: - * kjs/ArrayConstructor.cpp: - * kjs/ArrayPrototype.cpp: - * kjs/BooleanPrototype.cpp: - * kjs/DatePrototype.cpp: - * kjs/ErrorConstructor.cpp: Copied from kjs/error_object.cpp. - * kjs/ErrorConstructor.h: Copied from kjs/error_object.h. - * kjs/ErrorInstance.cpp: Copied from kjs/error_object.cpp. - * kjs/ErrorInstance.h: Copied from kjs/error_object.h. - * kjs/ErrorPrototype.cpp: Copied from kjs/error_object.cpp. - * kjs/ErrorPrototype.h: Copied from kjs/error_object.h. - * kjs/JSGlobalObject.cpp: - * kjs/JSObject.cpp: - * kjs/JSValue.cpp: - * kjs/NativeErrorConstructor.cpp: Copied from kjs/error_object.cpp. - * kjs/NativeErrorConstructor.h: Copied from kjs/error_object.h. - * kjs/NativeErrorPrototype.cpp: Copied from kjs/error_object.cpp. - * kjs/NativeErrorPrototype.h: Copied from kjs/error_object.h. - * kjs/NumberPrototype.cpp: - * kjs/RegExpConstructor.cpp: - * kjs/RegExpObject.cpp: - * kjs/RegExpPrototype.cpp: - * kjs/StringPrototype.cpp: - * kjs/error_object.cpp: Removed. - * kjs/error_object.h: Removed. - * kjs/internal.cpp: - -2008-06-29 Sam Weinig - - Fix non-AllInOne build. - - * kjs/DateConstructor.cpp: - * kjs/DateMath.cpp: - * kjs/JSObject.cpp: - -2008-06-29 Sam Weinig - - Rubber-stamped by Oliver Hunt. - - Splits DateConstructor and DatePrototype out of date_object.h/cpp - Moves shared Date code into DateMath. - - * DerivedSources.make: - * GNUmakefile.am: - * JavaScriptCore.pri: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - * JavaScriptCoreSources.bkl: - * kjs/AllInOneFile.cpp: - * kjs/DateConstructor.cpp: Copied from kjs/date_object.cpp. - * kjs/DateConstructor.h: Copied from kjs/date_object.h. - * kjs/DateMath.cpp: - (KJS::ymdhmsToSeconds): - (KJS::): - (KJS::skipSpacesAndComments): - (KJS::findMonth): - (KJS::parseDate): - (KJS::timeClip): - (KJS::formatDate): - (KJS::formatDateUTCVariant): - (KJS::formatTime): - * kjs/DateMath.h: - (KJS::gmtoffset): - * kjs/DatePrototype.cpp: Copied from kjs/date_object.cpp. - * kjs/DatePrototype.h: Copied from kjs/date_object.h. - * kjs/JSGlobalObject.cpp: - * kjs/JSObject.cpp: - * kjs/date_object.cpp: - * kjs/date_object.h: - * kjs/internal.cpp: - -2008-06-29 Jan Michael Alonzo - - Rubber-stamped by Cameron Zwarich - - Fix Gtk non-AllInOne build - - * GNUmakefile.am: include JSVariableObject.cpp - * kjs/RegExpConstructor.cpp: include RegExpObject.h - * kjs/RegExpObject.h: forward declare RegExpPrototype - -2008-06-28 Darin Adler - - Reviewed by Sam and Cameron. - - - fix https://bugs.webkit.org/show_bug.cgi?id=19805 - Array.concat turns missing array elements into "undefined" - - Test: fast/js/array-holes.html - - * JavaScriptCore.exp: No longer export JSArray::getItem. - - * kjs/ArrayPrototype.cpp: - (KJS::arrayProtoFuncConcat): Changed to use getProperty instead of - JSArray::getItem -- need to handle properties from the prototype chain - instead of ignoring them. - - * kjs/JSArray.cpp: Removed getItem. - * kjs/JSArray.h: Ditto. - -2008-06-28 Darin Adler - - Reviewed by Cameron. - - - https://bugs.webkit.org/show_bug.cgi?id=19804 - optimize access to arrays without "holes" - - SunSpider says 1.8% faster. - - * kjs/JSArray.cpp: - (KJS::JSArray::JSArray): Initialize m_fastAccessCutoff when creating - arrays. Also updated for new location of m_vectorLength. - (KJS::JSArray::getItem): Updated for new location of m_vectorLength. - (KJS::JSArray::getSlowCase): Added. Broke out the non-hot parts of - getOwnPropertySlot to make the hot part faster. - (KJS::JSArray::getOwnPropertySlot): Added a new faster case for - indices lower than m_fastAccessCutoff. We can do theese with no - additional checks or branches. - (KJS::JSArray::put): Added a new faster case for indices lower than - m_fastAccessCutoff. We can do theese with no additional checks or - branches. Moved the maxArrayIndex handling out of this function. - Added code to set m_fastAccessCutoff when the very last hole in - an array is filled; this is how the cutoff gets set for most arrays. - (KJS::JSArray::putSlowCase): Moved the rest of the put function logic - in here, to make the hot part of the put function faster. - (KJS::JSArray::deleteProperty): Added code to lower m_fastAccessCutoff - when a delete makes a new hole in the array. - (KJS::JSArray::getPropertyNames): Updated for new location of - m_vectorLength. - (KJS::JSArray::increaseVectorLength): Ditto. - (KJS::JSArray::setLength): Added code to lower m_fastAccessCutoff - when setLength makes the array smaller. - (KJS::JSArray::mark): Updated for new location of m_vectorLength. - (KJS::JSArray::sort): Ditto. Set m_fastAccessCutoff after moving - all the holes to the end of the array. - (KJS::JSArray::compactForSorting): Ditto. - (KJS::JSArray::checkConsistency): Added consistency checks fro - m_fastAccessCutoff and updated for the new location of m_vectorLength. - - * kjs/JSArray.h: Added declarations for slow case functions. - Replaced m_vectorLength with m_fastAccessCutoff. - -2008-06-28 Cameron Zwarich - - Reviewed by Sam. - - When executing a native call, check for an exception before writing the - return value. - - * VM/Machine.cpp: - (KJS::Machine::privateExecute): - -2008-06-28 Mark Rowe - - Build fix. Flag headers as private or public as is appropriate. - These settings were accidentally removed during some project file cleanup. - - * JavaScriptCore.xcodeproj/project.pbxproj: - -2008-06-28 Sam Weinig - - Rubber-stamped by Darin Adler. - - Splits RegExpConstructor and RegExpPrototype out of RegExpObject.h/cpp - - * DerivedSources.make: - * GNUmakefile.am: - * JavaScriptCore.pri: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - * JavaScriptCoreSources.bkl: - * VM/Machine.cpp: - * kjs/AllInOneFile.cpp: - * kjs/JSGlobalObject.cpp: - * kjs/RegExpConstructor.cpp: Copied from kjs/RegExpObject.cpp. - * kjs/RegExpConstructor.h: Copied from kjs/RegExpObject.h. - * kjs/RegExpObject.cpp: - * kjs/RegExpObject.h: - * kjs/RegExpPrototype.cpp: Copied from kjs/RegExpObject.cpp. - * kjs/RegExpPrototype.h: Copied from kjs/RegExpObject.h. - * kjs/StringPrototype.cpp: - * kjs/internal.cpp: - -2008-06-28 Sam Weinig - - Fix non-AllInOne builds. - - * kjs/StringConstructor.cpp: - -2008-06-28 Sam Weinig - - Rubber-stamped by Darin Adler. - - Rename string_object.h/cpp to StringObject.h/cpp and split out StringObjectThatMasqueradesAsUndefined, - StringConstructor and StringPrototype. - - * DerivedSources.make: - * GNUmakefile.am: - * JavaScriptCore.pri: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - * JavaScriptCoreSources.bkl: - * kjs/AllInOneFile.cpp: - * kjs/JSGlobalObject.cpp: - * kjs/StringConstructor.cpp: Copied from JavaScriptCore/kjs/string_object.cpp. - * kjs/StringConstructor.h: Copied from JavaScriptCore/kjs/string_object.h. - * kjs/StringObject.cpp: Copied from JavaScriptCore/kjs/string_object.cpp. - * kjs/StringObject.h: Copied from JavaScriptCore/kjs/string_object.h. - * kjs/StringObjectThatMasqueradesAsUndefined.h: Copied from JavaScriptCore/kjs/string_object.h. - * kjs/StringPrototype.cpp: Copied from JavaScriptCore/kjs/string_object.cpp. - * kjs/StringPrototype.h: Copied from JavaScriptCore/kjs/string_object.h. - * kjs/internal.cpp: - * kjs/string_object.cpp: Removed. - * kjs/string_object.h: Removed. - -2008-06-28 Jan Michael Alonzo - - Gtk build fix: JSVariableObject is now part of AllInOne - - * GNUmakefile.am: - -2008-06-28 Darin Adler - - Reviewed by Oliver. - - - https://bugs.webkit.org/show_bug.cgi?id=19801 - add a feature so we can tell what regular expressions are taking time - - * pcre/pcre_compile.cpp: - (jsRegExpCompile): Compile in the string if REGEXP_HISTOGRAM is on. - - * pcre/pcre_exec.cpp: - (jsRegExpExecute): Add hook to time execution. - (Histogram::~Histogram): Print a sorted list of what took time. - (Histogram::add): Accumulate records of what took time. - (HistogramTimeLogger::~HistogramTimeLogger): Hook that calls - Histogram::add at the right moment and creates the global histogram - object. - - * pcre/pcre_internal.h: Define REGEXP_HISTOGRAM. - - * pcre/pcre_tables.cpp: Added missing include of "config.h". Not needed - any more, but an omissions an earlier version of this patch detected. - * pcre/pcre_ucp_searchfuncs.cpp: Ditto. - * pcre/pcre_xclass.cpp: Ditto. - -2008-06-28 Sam Weinig - - Try and fix the Windows build again. - - * kjs/RegExpObject.cpp: - * kjs/date_object.cpp: - * kjs/error_object.cpp: - -2008-06-28 Sam Weinig - - Rubber-stamped by Darin Adler. - - Remove unused StringConstructorFunction class. - - * kjs/string_object.h: - -2008-06-28 Sam Weinig - - Fix windows build. - - * kjs/ArrayPrototype.cpp: - * kjs/BooleanPrototype.cpp: - * kjs/BooleanPrototype.h: - * kjs/FunctionPrototype.cpp: - * kjs/JSImmediate.cpp: - * kjs/JSObject.cpp: - * kjs/MathObject.cpp: - * kjs/NumberPrototype.cpp: - * kjs/NumberPrototype.h: - * kjs/ObjectConstructor.cpp: - * kjs/RegExpObject.h: - * kjs/error_object.h: - * kjs/string_object.cpp: - -2008-06-28 Sam Weinig - - Rubber-stamped by Oliver Hunt. - - Splits FunctionConstructor out of FunctionPrototype.h/cpp - Splits NumberConstructor and NumberPrototype out of NumberObject.h/cpp - Rename object_object.h/cpp to ObjectPrototype.h/cpp and split out ObjectConstructor. - - * API/JSCallbackConstructor.cpp: - * API/JSClassRef.cpp: - * API/JSObjectRef.cpp: - * DerivedSources.make: - * GNUmakefile.am: - * JavaScriptCore.pri: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - * JavaScriptCoreSources.bkl: - * VM/Machine.cpp: - * kjs/AllInOneFile.cpp: - * kjs/ArrayConstructor.cpp: - * kjs/ArrayConstructor.h: - * kjs/FunctionConstructor.cpp: Copied from JavaScriptCore/kjs/FunctionPrototype.cpp. - * kjs/FunctionConstructor.h: Copied from JavaScriptCore/kjs/FunctionPrototype.h. - * kjs/FunctionPrototype.cpp: - * kjs/FunctionPrototype.h: - * kjs/JSFunction.cpp: - * kjs/JSGlobalObject.cpp: - * kjs/JSImmediate.cpp: - * kjs/MathObject.h: - * kjs/NumberConstructor.cpp: Copied from JavaScriptCore/kjs/NumberObject.cpp. - * kjs/NumberConstructor.h: Copied from JavaScriptCore/kjs/NumberObject.h. - * kjs/NumberObject.cpp: - * kjs/NumberObject.h: - * kjs/NumberPrototype.cpp: Copied from JavaScriptCore/kjs/NumberObject.cpp. - * kjs/NumberPrototype.h: Copied from JavaScriptCore/kjs/NumberObject.h. - * kjs/ObjectConstructor.cpp: Copied from JavaScriptCore/kjs/object_object.cpp. - * kjs/ObjectConstructor.h: Copied from JavaScriptCore/kjs/object_object.h. - * kjs/ObjectPrototype.cpp: Copied from JavaScriptCore/kjs/object_object.cpp. - * kjs/ObjectPrototype.h: Copied from JavaScriptCore/kjs/object_object.h. - * kjs/RegExpObject.h: - * kjs/Shell.cpp: - * kjs/error_object.h: - * kjs/internal.cpp: - * kjs/nodes.cpp: - * kjs/object_object.cpp: Removed. - * kjs/object_object.h: Removed. - * kjs/string_object.h: - -2008-06-28 Darin Adler - - Reviewed by Oliver. - - - fix https://bugs.webkit.org/show_bug.cgi?id=19796 - optimize expressions with ignored results (especially post-increment) - - SunSpider says 0.9% faster. - - * VM/CodeGenerator.h: - (KJS::CodeGenerator::tempDestination): Create a new temporary for - ignoredResult() too, just as we would for 0. - (KJS::CodeGenerator::finalDestination): Use the temporary if the - register passed in is ignoredResult() too, just as we would for 0. - (KJS::CodeGenerator::destinationForAssignResult): Return 0 if the - passed in register is ignoredResult(), just as we would for 0. - (KJS::CodeGenerator::moveToDestinationIfNeeded): Return 0 if the - register passed in is ignoredResult(). What matters is that we - don't want to emit a move. The return value won't be looked at. - (KJS::CodeGenerator::emitNode): Allow ignoredResult() and pass it - through to the node's emitCode function. - - * VM/RegisterID.h: - (KJS::ignoredResult): Added. Special value to indicate the result of - a node will be ignored and need not be put in any register. - - * kjs/nodes.cpp: - (KJS::NullNode::emitCode): Do nothing if dst == ignoredResult(). - (KJS::BooleanNode::emitCode): Ditto. - (KJS::NumberNode::emitCode): Ditto. - (KJS::StringNode::emitCode): Ditto. - (KJS::RegExpNode::emitCode): Ditto. - (KJS::ThisNode::emitCode): Ditto. - (KJS::ResolveNode::emitCode): Do nothing if dst == ignoredResult() and - the identifier resolves to a local variable. - (KJS::ObjectLiteralNode::emitCode): Do nothing if dst == ignoredResult() - and the object is empty. - (KJS::PostIncResolveNode::emitCode): If dst == ignoredResult(), then do - nothing for the local constant case, and do a pre-increment in all the - other cases. - (KJS::PostDecResolveNode::emitCode): Ditto. - (KJS::PostIncBracketNode::emitCode): Ditto. - (KJS::PostDecBracketNode::emitCode): Ditto. - (KJS::PostIncDotNode::emitCode): Ditto. - (KJS::PostDecDotNode::emitCode): Ditto. - (KJS::DeleteValueNode::emitCode): Pass ignoredResult() when evaluating - the expression. - (KJS::VoidNode::emitCode): Ditto. - (KJS::TypeOfResolveNode::emitCode): If dst == ignoredResult(), do nothing - if the identifier resolves to a local variable, and don't bother generating - a typeof opcode in the other case. - (KJS::TypeOfValueNode::emitCode): Ditto. - (KJS::PreIncResolveNode::emitCode): Do nothing if dst == ignoredResult() and - the identifier resolves to a local constant. - (KJS::PreDecResolveNode::emitCode): Ditto. - (KJS::AssignResolveNode::emitCode): Turn ignoredResult() into 0 in a couple - places, because we need to put the result into a register so we can assign - it. At other sites this is taken care of by functions like finalDestination. - (KJS::CommaNode::emitCode): Pass ignoredResult() when evaluating the first - expression. - (KJS::ForNode::emitCode): Pass ignoredResult() when evaluating the first and - third expressions. - (KJS::ForInNode::emitCode): Pass ignoredResult() when evaluating the first - expression. - -2008-06-28 Darin Adler - - Reviewed by Oliver. - - - https://bugs.webkit.org/show_bug.cgi?id=19787 - create most arrays from values in registers rather than with multiple put operations - - SunSpider says 0.8% faster. - - * VM/CodeBlock.cpp: - (KJS::CodeBlock::dump): Added argv and argc parameters to new_array. - * VM/Machine.cpp: - (KJS::Machine::privateExecute): Ditto. - - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::emitNewArray): Added. - * VM/CodeGenerator.h: Added ElementNode* argument to emitNewArray. - - * kjs/nodes.cpp: - (KJS::ArrayNode::emitCode): Pass the ElementNode to emitNewArray so it can be - initialized with as many elements as possible. If the array doesn't have any - holes in it, that's all that's needed. If there are holes, then emit some separate - put operations for the other values in the array and for the length as needed. - - * kjs/nodes.h: Added some accessors to ElementNode so the code generator can - iterate through elements and generate code to evaluate them. Now ArrayNode does - not need to be a friend. Also took out some unused PlacementNewAdoptType - constructors. - -2008-06-28 Darin Adler - - Reviewed by Oliver. - - * kjs/nodes.h: Remove obsolete PlacementNewAdopt constructors. - We no longer mutate the AST in place. - -2008-06-28 Jan Michael Alonzo - - Reviewed by Oliver Hunt. - - Build fix - - * VM/Machine.cpp: include stdio.h for printf - -2008-06-27 Sam Weinig - - Reviewed by Oliver Hunt. - - Fix platforms that don't use AllInOne.cpp - - * kjs/BooleanConstructor.h: - * kjs/BooleanPrototype.h: - * kjs/FunctionPrototype.cpp: - -2008-06-27 Sam Weinig - - Rubber-stamped by Oliver Hunt. - - Splits ArrayConstructor out of ArrayPrototype.h/cpp - Splits BooleanConstructor and BooleanPrototype out of BooleanObject.h/cpp - - * GNUmakefile.am: - * JavaScriptCore.pri: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - * JavaScriptCoreSources.bkl: - * VM/Machine.cpp: - * kjs/AllInOneFile.cpp: - * kjs/ArrayConstructor.cpp: Copied from kjs/ArrayPrototype.cpp. - * kjs/ArrayConstructor.h: Copied from kjs/ArrayPrototype.h. - * kjs/ArrayPrototype.cpp: - * kjs/ArrayPrototype.h: - * kjs/BooleanConstructor.cpp: Copied from kjs/BooleanObject.cpp. - * kjs/BooleanConstructor.h: Copied from kjs/BooleanObject.h. - * kjs/BooleanObject.cpp: - * kjs/BooleanObject.h: - * kjs/BooleanPrototype.cpp: Copied from kjs/BooleanObject.cpp. - * kjs/BooleanPrototype.h: Copied from kjs/BooleanObject.h. - * kjs/CommonIdentifiers.h: - * kjs/FunctionPrototype.cpp: - * kjs/JSArray.cpp: - * kjs/JSGlobalObject.cpp: - * kjs/JSImmediate.cpp: - * kjs/Shell.cpp: - * kjs/internal.cpp: - * kjs/nodes.cpp: - * kjs/string_object.cpp: - -2008-06-27 Oliver Hunt - - Reviewed by Sam. - - Bug 18626: SQUIRRELFISH: support the "slow script" dialog - Slow script dialog needs to be reimplemented for squirrelfish - - Adds support for the slow script dialog in squirrelfish. This requires the addition - of three new op codes, op_loop, op_loop_if_true, and op_loop_if_less which have the - same behaviour as their simple jump equivalents but have an additional time out check. - - Additional assertions were added to other jump instructions to prevent accidentally - creating loops with jump types that do not support time out checks. - - Sunspider does not report a regression, however this appears very sensitive to code - layout and hardware, so i would expect up to a 1% regression on other systems. - - Part of this required moving the old timeout logic from JSGlobalObject and into Machine - which is the cause of a number of the larger diff blocks. - - * JavaScriptCore.exp: - * VM/CodeBlock.cpp: - (KJS::CodeBlock::dump): - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::emitJumpIfTrue): - (KJS::CodeGenerator::emitJumpScopes): - * VM/ExceptionHelpers.cpp: - (KJS::InterruptedExecutionError::isWatchdogException): - (KJS::createInterruptedExecutionException): - * VM/ExceptionHelpers.h: - * VM/LabelID.h: - * VM/Machine.cpp: - (KJS::Machine::Machine): - (KJS::Machine::throwException): - (KJS::Machine::resetTimeoutCheck): - (KJS::getCurrentTime): - (KJS::Machine::checkTimeout): - (KJS::Machine::privateExecute): - * VM/Machine.h: - (KJS::Machine::setTimeoutTime): - (KJS::Machine::startTimeoutCheck): - (KJS::Machine::stopTimeoutCheck): - (KJS::Machine::initTimeout): - * VM/Opcode.cpp: - (KJS::): - * VM/Opcode.h: - * kjs/JSGlobalObject.cpp: - (KJS::JSGlobalObject::init): - (KJS::JSGlobalObject::setTimeoutTime): - (KJS::JSGlobalObject::startTimeoutCheck): - * kjs/JSGlobalObject.h: - * kjs/JSObject.h: - * kjs/interpreter.cpp: - (KJS::Interpreter::evaluate): - -2008-06-27 Jan Michael Alonzo - - Gtk and Qt build fix: Remove RegisterFileStack from the build - scripts. - - * GNUmakefile.am: - * JavaScriptCore.pri: - -2008-06-27 Adele Peterson - - Reviewed by Geoff. - - Build fixes. - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * VM/RegisterFile.h: - (KJS::RegisterFile::RegisterFile): - * kjs/JSGlobalObject.cpp: - * kjs/collector.cpp: - -2008-06-27 Geoffrey Garen - - Reviewed by Oliver Hunt. - - One RegisterFile to rule them all! - - SunSpider reports a 0.2% speedup. - - This patch removes the RegisterFileStack abstraction and replaces it with - a single register file that - - (a) allocates a fixed storage area, including a fixed area for global - vars, so that no operation may cause the register file to reallocate - - and - - (b) swaps between global storage areas when executing code in different - global objects. - - This patch also changes the layout of the register file so that all call - frames, including call frames for global code, get a header. This is - required to support re-entrant global code. It also just makes things simpler. - - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::addGlobalVar): New function. Differs from addVar in - that - - (a) global vars don't contribute to a CodeBlock's numLocals count, since - global storage is fixed and allocated at startup - - and - - (b) references to global vars get shifted to elide intermediate stack - between "r" and the global storage area. - - * VM/Machine.cpp: - (KJS::Machine::dumpRegisters): Updated this function to match the new - register file layout, and added the ability to dump exact identifiers - for the different parts of a call frame. - - (KJS::Machine::unwindCallFrame): Updated this function to match the new - register file layout. - - (KJS::Machine::execute): Updated this function to initialize a call frame - header for global code, and to swap global storage areas when switching - to execution in a new global object. - - (KJS::Machine::privateExecute): Got rid of "safeForReentry" and re-reading - of registerBase because the register file is always safe for reentry now, - and registerBase never changes. - - * VM/Machine.h: Moved the call frame header enum from Machine to RegisterFile, - to resolve a header dependency problem (a good sign that the enum belonged - in RegisterFile all along!) - - * VM/RegisterFile.cpp: - * VM/RegisterFile.h: Changed RegisterFile to mmap a fixed size register - area. This allows us to avoid re-allocting the register file later on. - Instead, we rely on the OS to allocate physical pages to the register - file as necessary. - - * VM/RegisterFileStack.cpp: Removed. Tada! - * VM/RegisterFileStack.h: Removed. Tada! - - * kjs/DebuggerCallFrame.cpp: Updated this class to match the new - register file layout, greatly simplifying it in the process. - - * kjs/JSActivation.h: - * kjs/JSActivation.cpp: Moved some of this logic up to JSVariableObject, - since the global object now needs to be able to tear off its registers - just like the activation object. - - * kjs/JSFunction.cpp: No need to fiddle with the register file anymore. - - * kjs/JSGlobalObject.h: - * kjs/JSGlobalObject.cpp: Updated JSGlobalObject to support moving its - global storage area into and out of the register file. - - * kjs/PropertySlot.cpp: No need to fiddle with the register file anymore. - - * kjs/collector.cpp: Renamed markStackObjectConservatively to - markConservatively, since we don't just mark stack objects this way. - - Also, added code to mark the machine's register file. - - * kjs/config.h: Moved some platforms #defines from here... - * wtf/Platform.h: ...to here, to support mmap/VirtualAlloc detection - in RegisterFile.h. - -2008-06-26 Mark Rowe - - Speculative fix for the Windows build. - - * kjs/JSImmediate.cpp: - -2008-06-26 Mark Rowe - - Reviewed by Darin Adler and Geoff Garen. - - Fix the malloc zone introspection functions so that malloc_zone_statistics does not give - bogus output in an application that uses JavaScriptCore. - - * kjs/CollectorHeapIntrospector.cpp: - (KJS::CollectorHeapIntrospector::statistics): Return statistics about memory allocated by the collector. - * kjs/CollectorHeapIntrospector.h: - * wtf/FastMalloc.cpp: Zero out the statistics. FastMalloc doesn't track this information at present. - Returning zero for all values is preferable to returning bogus data. - -2008-06-26 Darin Adler - - Reviewed by Geoff. - - - https://bugs.webkit.org/show_bug.cgi?id=19721 - speed up JavaScriptCore by not wrapping strings in objects just - to call functions on them - - - optimize UString append and the replace function a bit - - SunSpider says 1.8% faster. - - * JavaScriptCore.exp: Updated. - - * VM/JSPropertyNameIterator.cpp: Added include of JSString.h, now needed - because jsString returns a JSString*. - - * VM/Machine.cpp: - (KJS::Machine::privateExecute): Removed the toObject call from native - function calls. Also removed code to put the this value into a register. - - * kjs/BooleanObject.cpp: - (KJS::booleanProtoFuncToString): Rewrite to handle false and true - separately. - - * kjs/FunctionPrototype.cpp: - (KJS::constructFunction): Use single-character append rather than building - a string for each character. - * kjs/JSFunction.cpp: - (KJS::globalFuncUnescape): Ditto. - - * kjs/JSImmediate.cpp: - (KJS::JSImmediate::prototype): Added. Gets the appropriate prototype for - use with an immediate value. To be used instead of toObject when doing a - get on an immediate value. - * kjs/JSImmediate.h: Added prototype. - - * kjs/JSObject.cpp: - (KJS::JSObject::toString): Tweaked formatting. - - * kjs/JSObject.h: - (KJS::JSValue::get): Use prototype instead of toObject to avoid creating - an object wrapper just to search for properties. This also saves an - unnecessary hash table lookup since the object wrappers themselves don't - have any properties. - - * kjs/JSString.h: Added toThisString and toThisJSString. - - * kjs/JSValue.cpp: - (KJS::JSCell::toThisString): Added. - (KJS::JSCell::toThisJSString): Added. - (KJS::JSCell::getJSNumber): Added. - (KJS::jsString): Changed return type to JSString*. - (KJS::jsOwnedString): Ditto. - - * kjs/JSValue.h: - (KJS::JSValue::toThisString): Added. - (KJS::JSValue::toThisJSString): Added. - (KJS::JSValue::getJSNumber): Added. - - * kjs/NumberObject.cpp: - (KJS::NumberObject::getJSNumber): Added. - (KJS::integer_part_noexp): Append C string directly rather than first - turning it into a UString. - (KJS::numberProtoFuncToString): Use getJSNumber to check if the value - is a number rather than isObject(&NumberObject::info). This works for - immediate numbers, number cells, and NumberObject instances. - (KJS::numberProtoFuncToLocaleString): Ditto. - (KJS::numberProtoFuncValueOf): Ditto. - (KJS::numberProtoFuncToFixed): Ditto. - (KJS::numberProtoFuncToExponential): Ditto. - (KJS::numberProtoFuncToPrecision): Ditto. - * kjs/NumberObject.h: Added getJSNumber. - - * kjs/PropertySlot.cpp: Tweaked comment. - - * kjs/internal.cpp: - (KJS::JSString::toThisString): Added. - (KJS::JSString::toThisJSString): Added. - (KJS::JSString::getOwnPropertySlot): Changed code that searches the - prototype chain to start with the string prototype and not create a - string object. - (KJS::JSNumberCell::toThisString): Added. - (KJS::JSNumberCell::getJSNumber): Added. - - * kjs/lookup.cpp: - (KJS::staticFunctionGetter): Moved here, because there's no point in - having a function that's only used for a function pointer be inline. - (KJS::setUpStaticFunctionSlot): New function for getStaticFunctionSlot. - - * kjs/lookup.h: - (KJS::staticValueGetter): Don't mark this inline. It doesn't make sense - to have a function that's only used for a function pointer be inline. - (KJS::getStaticFunctionSlot): Changed to get properties from the parent - first before doing any handling of functions. This is the fastest way - to return the function once the initial setup is done. - - * kjs/string_object.cpp: - (KJS::StringObject::getPropertyNames): Call value() instead of getString(), - avoiding an unnecessary virtual function call (the call to the type() - function in the implementation of the isString() function). - (KJS::StringObject::toString): Added. - (KJS::StringObject::toThisString): Added. - (KJS::StringObject::toThisJSString): Added. - (KJS::substituteBackreferences): Rewrote to use a appending algorithm - instead of a the old one that tried to replace in place. - (KJS::stringProtoFuncReplace): Merged this function and the replace function. - Replaced the hand-rolled dynamic arrays for source ranges and replacements - with Vector. - (KJS::stringProtoFuncToString): Handle JSString as well as StringObject. - Removed the separate valueOf implementation, since it can just share this. - (KJS::stringProtoFuncCharAt): Use toThisString, which handles JSString as - well as StringObject, and is slightly more efficient than the old code too. - (KJS::stringProtoFuncCharCodeAt): Ditto. - (KJS::stringProtoFuncConcat): Ditto. - (KJS::stringProtoFuncIndexOf): Ditto. - (KJS::stringProtoFuncLastIndexOf): Ditto. - (KJS::stringProtoFuncMatch): Ditto. - (KJS::stringProtoFuncSearch): Ditto. - (KJS::stringProtoFuncSlice): Ditto. - (KJS::stringProtoFuncSplit): Ditto. - (KJS::stringProtoFuncSubstr): Ditto. - (KJS::stringProtoFuncSubstring): Ditto. - (KJS::stringProtoFuncToLowerCase): Use toThisJSString. - (KJS::stringProtoFuncToUpperCase): Ditto. - (KJS::stringProtoFuncToLocaleLowerCase): Ditto. - (KJS::stringProtoFuncToLocaleUpperCase): Ditto. - (KJS::stringProtoFuncLocaleCompare): Ditto. - (KJS::stringProtoFuncBig): Use toThisString. - (KJS::stringProtoFuncSmall): Ditto. - (KJS::stringProtoFuncBlink): Ditto. - (KJS::stringProtoFuncBold): Ditto. - (KJS::stringProtoFuncFixed): Ditto. - (KJS::stringProtoFuncItalics): Ditto. - (KJS::stringProtoFuncStrike): Ditto. - (KJS::stringProtoFuncSub): Ditto. - (KJS::stringProtoFuncSup): Ditto. - (KJS::stringProtoFuncFontcolor): Ditto. - (KJS::stringProtoFuncFontsize): Ditto. - (KJS::stringProtoFuncAnchor): Ditto. - (KJS::stringProtoFuncLink): Ditto. - - * kjs/string_object.h: Added toString, toThisString, and toThisJSString. - - * kjs/ustring.cpp: - (KJS::UString::append): Added a version that takes a character pointer and - size, so we don't have to create a UString just to append to another UString. - * kjs/ustring.h: - -2008-06-26 Alexey Proskuryakov - - Reviewed by Maciej. - - Make JSGlobalData per-thread. - - No change on SunSpider total. - - * wtf/ThreadSpecific.h: Re-enabled the actual implementation. - - * kjs/JSGlobalObject.cpp: - (KJS::JSGlobalObject::~JSGlobalObject): Re-added a JSLock-related assertion. We'll probably - want to preserve these somehow to keep legacy behavior in working condition. - (KJS::JSGlobalObject::init): Initialize globalData pointer earlier, so that it is ready - when updating JSGlobalObject linked list. - - * kjs/JSGlobalObject.h: (KJS::JSGlobalObject::head): Changed head() to be non-static, and - to use JSGlobalData associated with the current object. - - * kjs/InitializeThreading.cpp: (KJS::initializeThreadingOnce): Removed a no longer needed - Heap::registerAsMainThread() call. - - * kjs/JSGlobalData.h: Removed a lying lie comment - parserObjectExtraRefCounts is not - transient, and while newParserObjects may conceptually be such, there is still some node - manipulation going on outside Parser::parse which touches it. - - * kjs/JSGlobalData.cpp: - (KJS::JSGlobalData::~JSGlobalData): Delete recently added members. - (KJS::JSGlobalData::sharedInstance): Actually use a separate instance. - - * kjs/collector.cpp: - (KJS::Heap::Heap): - (KJS::Heap::~Heap): Added a destructor, which unconditionally deletes everything. - (KJS::Heap::sweep): Removed code related to "collect on main thread only" logic. - (KJS::Heap::collect): Ditto. - (KJS::Heap::globalObjectCount): Explicitly use per-thread instance of JSGlobalObject linked - list now that JSGlobalObject::head() is not static. Curently, WebCoreStatistics methods only - work with the main thread currently anyway. - (KJS::Heap::protectedGlobalObjectCount): Ditto. - - * kjs/collector.h: Removed code related to "collect on main thread only" logic. - - * JavaScriptCore.exp: Removed Heap::collectOnMainThreadOnly. - -2008-06-26 Alexey Proskuryakov - - Reviewed by Darin. - - https://bugs.webkit.org/show_bug.cgi?id=19767 - REGRESSION: Crash in sort() when visiting http://www.onnyturf.com/subway/ - - * kjs/JSArray.cpp: (KJS::AVLTreeAbstractorForArrayCompare::set_balance_factor): - Made changing balance factor from -1 to +1 work correctly. - - * wtf/AVLTree.h: (KJS::AVLTreeDefaultBSet::operator[]): Added an assertion that catches - this slightly earlier. - -2008-06-25 Timothy Hatcher - - Fixes an ASSERT in the profiler when starting multiple profiles - with the same name inside the same function/program. - - Reviewed by Kevin McCullough. - - * profiler/Profile.cpp: - (KJS::Profile::Profile): Initialize m_stoppedCallDepth to zero. - (KJS::Profile::stopProfiling): Set the current node to the parent, - because we are in a call that will not get a didExecute call. - (KJS::Profile::removeProfile): Increment m_stoppedCallDepth to - account for didExecute not being called for profile. - (KJS::Profile::willExecute): Increment m_stoppedCallDepth if stopped. - (KJS::Profile::didExecute): Decrement m_stoppedCallDepth if stopped and - greater than zero, and return early. - * profiler/Profile.h: Added stoppedProfiling(). - * profiler/Profiler.cpp: - (KJS::Profiler::findProfile): Removed. - (KJS::Profiler::startProfiling): Don't return early for stopped profiles. - (KJS::Profiler::stopProfiling): Skipp stopped profiles. - (KJS::Profiler::didFinishAllExecution): Code clean-up. - * profiler/Profiler.h: Removed findProfile. - -2008-06-25 Cameron Zwarich - - Reviewed by Alexey Proskuryakov. - - Attempt to fix Windows debug build. The compiler gives a warning when - Structured Exception Handling and destructors are used in the same - function. Using manual locking and unlocking instead of constructors - and destructors should fix the warning. - - * kjs/Shell.cpp: - (main): - -2008-06-25 Alexey Proskuryakov - - Forgot to address a review comment about better names for tracked objects, doing it now. - - * kjs/JSGlobalData.cpp: - (KJS::JSGlobalData::JSGlobalData): - * kjs/JSGlobalData.h: - * kjs/nodes.cpp: - (KJS::ParserRefCounted::ParserRefCounted): - (KJS::ParserRefCounted::ref): - (KJS::ParserRefCounted::deref): - (KJS::ParserRefCounted::hasOneRef): - (KJS::ParserRefCounted::deleteNewObjects): - -2008-06-25 Alexey Proskuryakov - - Reviewed by Geoff. - - Remove more threadInstance() calls. - - * kjs/JSFunction.cpp: - (KJS::JSFunction::getParameterName): - (KJS::IndexToNameMap::unMap): - (KJS::Arguments::deleteProperty): - * kjs/JSFunction.h: - Access nullIdentifier without going to thread specific storage. - - * JavaScriptCore.exp: - * kjs/JSGlobalData.cpp: - (KJS::JSGlobalData::JSGlobalData): - * kjs/JSGlobalData.h: - * kjs/Parser.cpp: - (KJS::Parser::parse): - * kjs/Parser.h: - (KJS::ParserRefCountedData::ParserRefCountedData): - (KJS::Parser::parse): - * kjs/grammar.y: - * kjs/nodes.cpp: - (KJS::ParserRefCounted::ParserRefCounted): - (KJS::ParserRefCounted::ref): - (KJS::ParserRefCounted::deref): - (KJS::ParserRefCounted::hasOneRef): - (KJS::ParserRefCounted::deleteNewObjects): - (KJS::Node::Node): - (KJS::StatementNode::StatementNode): - (KJS::BreakpointCheckStatement::BreakpointCheckStatement): - (KJS::ConstDeclNode::ConstDeclNode): - (KJS::BlockNode::BlockNode): - (KJS::ForInNode::ForInNode): - (KJS::ScopeNode::ScopeNode): - (KJS::ProgramNode::ProgramNode): - (KJS::ProgramNode::create): - (KJS::EvalNode::EvalNode): - (KJS::EvalNode::create): - (KJS::FunctionBodyNode::FunctionBodyNode): - (KJS::FunctionBodyNode::create): - * kjs/nodes.h: - (KJS::ExpressionNode::): - (KJS::NullNode::): - (KJS::BooleanNode::): - (KJS::NumberNode::): - (KJS::ImmediateNumberNode::): - (KJS::StringNode::): - (KJS::RegExpNode::): - (KJS::ThisNode::): - (KJS::ResolveNode::): - (KJS::ElementNode::): - (KJS::ArrayNode::): - (KJS::PropertyNode::): - (KJS::PropertyListNode::): - (KJS::ObjectLiteralNode::): - (KJS::BracketAccessorNode::): - (KJS::DotAccessorNode::): - (KJS::ArgumentListNode::): - (KJS::ArgumentsNode::): - (KJS::NewExprNode::): - (KJS::EvalFunctionCallNode::): - (KJS::FunctionCallValueNode::): - (KJS::FunctionCallResolveNode::): - (KJS::FunctionCallBracketNode::): - (KJS::FunctionCallDotNode::): - (KJS::PrePostResolveNode::): - (KJS::PostIncResolveNode::): - (KJS::PostDecResolveNode::): - (KJS::PostfixBracketNode::): - (KJS::PostIncBracketNode::): - (KJS::PostDecBracketNode::): - (KJS::PostfixDotNode::): - (KJS::PostIncDotNode::): - (KJS::PostDecDotNode::): - (KJS::PostfixErrorNode::): - (KJS::DeleteResolveNode::): - (KJS::DeleteBracketNode::): - (KJS::DeleteDotNode::): - (KJS::DeleteValueNode::): - (KJS::VoidNode::): - (KJS::TypeOfResolveNode::): - (KJS::TypeOfValueNode::): - (KJS::PreIncResolveNode::): - (KJS::PreDecResolveNode::): - (KJS::PrefixBracketNode::): - (KJS::PreIncBracketNode::): - (KJS::PreDecBracketNode::): - (KJS::PrefixDotNode::): - (KJS::PreIncDotNode::): - (KJS::PreDecDotNode::): - (KJS::PrefixErrorNode::): - (KJS::UnaryOpNode::UnaryOpNode): - (KJS::UnaryPlusNode::): - (KJS::NegateNode::): - (KJS::BitwiseNotNode::): - (KJS::LogicalNotNode::): - (KJS::BinaryOpNode::BinaryOpNode): - (KJS::ReverseBinaryOpNode::ReverseBinaryOpNode): - (KJS::MultNode::): - (KJS::DivNode::): - (KJS::ModNode::): - (KJS::AddNode::): - (KJS::SubNode::): - (KJS::LeftShiftNode::): - (KJS::RightShiftNode::): - (KJS::UnsignedRightShiftNode::): - (KJS::LessNode::): - (KJS::GreaterNode::): - (KJS::LessEqNode::): - (KJS::GreaterEqNode::): - (KJS::InstanceOfNode::): - (KJS::InNode::): - (KJS::EqualNode::): - (KJS::NotEqualNode::): - (KJS::StrictEqualNode::): - (KJS::NotStrictEqualNode::): - (KJS::BitAndNode::): - (KJS::BitOrNode::): - (KJS::BitXOrNode::): - (KJS::LogicalAndNode::): - (KJS::LogicalOrNode::): - (KJS::ConditionalNode::): - (KJS::ReadModifyResolveNode::): - (KJS::AssignResolveNode::): - (KJS::ReadModifyBracketNode::): - (KJS::AssignBracketNode::): - (KJS::AssignDotNode::): - (KJS::ReadModifyDotNode::): - (KJS::AssignErrorNode::): - (KJS::CommaNode::): - (KJS::VarDeclCommaNode::): - (KJS::ConstStatementNode::): - (KJS::SourceElements::SourceElements): - (KJS::EmptyStatementNode::): - (KJS::DebuggerStatementNode::): - (KJS::ExprStatementNode::): - (KJS::VarStatementNode::): - (KJS::IfNode::): - (KJS::IfElseNode::): - (KJS::DoWhileNode::): - (KJS::WhileNode::): - (KJS::ForNode::): - (KJS::ContinueNode::): - (KJS::BreakNode::): - (KJS::ReturnNode::): - (KJS::WithNode::): - (KJS::LabelNode::): - (KJS::ThrowNode::): - (KJS::TryNode::): - (KJS::ParameterNode::): - (KJS::FuncExprNode::): - (KJS::FuncDeclNode::): - (KJS::CaseClauseNode::): - (KJS::ClauseListNode::): - (KJS::CaseBlockNode::): - (KJS::SwitchNode::): - Changed ParserRefCounted to hold a JSGlobalData pointer, and used it to replace - threadInstance calls. - -2008-06-24 Cameron Zwarich - - Reviewed by Alexey Proskuryakov. - - Make the JavaScript shell collect the heap from main() instead of - jscmain() to suppress leak messages in debug builds. - - * kjs/Shell.cpp: - (main): - (jscmain): - -2008-06-24 Cameron Zwarich - - Reviewed by Maciej. - - Make the conversion of the pair (less, jtrue) to jless use register - reference counting information for safety instead of requiring callers - to decide whether it is safe. - - No changes on SunSpider codegen. - - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::emitJumpIfTrue): - * VM/CodeGenerator.h: - * kjs/nodes.cpp: - (KJS::DoWhileNode::emitCode): - (KJS::WhileNode::emitCode): - (KJS::ForNode::emitCode): - (KJS::CaseBlockNode::emitCodeForBlock): - -2008-06-24 Kevin McCullough - - Reviewed by Tim. - - JSProfiler: Profiler goes into an infinite - loop sometimes. - JSProfiler: Profiler asserts in debug and - give the wrong times in release - - Fixed two issues found by Tim in the same test. - - * profiler/Profile.cpp: - (KJS::Profile::removeProfileStart): No longer take profile's time from - all ancestors, but instead attribute it to its parent. Also add an - Assert to ensure we only delete the child we mean to. - (KJS::Profile::removeProfileEnd): Ditto for profileEnd. - (KJS::Profile::didExecute): Cleaned up the execution order and correctly - attribute all of the parent's time to the new node. - * profiler/ProfileNode.cpp: If this node does not have a startTime it - should not get a giant total time, but instead be 0. - (KJS::ProfileNode::endAndRecordCall): - * profiler/ProfileNode.h: - (KJS::ProfileNode::removeChild): Should reset the sibling pointers since - one of them has been removed. - -2008-06-24 Darin Adler - - Reviewed by Cameron. - - - fix https://bugs.webkit.org/show_bug.cgi?id=19739 - REGRESSION: fast/js/property-getters-and-setters.html fails - - * kjs/JSObject.cpp: - (KJS::JSObject::put): Remove an untested optimization I checked in by accident. - The two loops up the prototype chain both need to start from this; instead the - second loop was starting where the first loop left off. - -2008-06-24 Steve Falkenburg - - Build fix. - - * kjs/nodes.cpp: - -2008-06-24 Joerg Bornemann - - Reviewed by Simon. - - For the Qt build on Windows don't depend on the presence of GNU CPP - but use MSVC's preprocessor instead. - dftables accepts a --preprocessor option which is set in pcre.pri for MSVC platforms. - - * pcre/dftables: Added support for specifying the preprocessor command - to use via --preprocessor, similar to - WebCore/bindings/scripts/generate-bindings.pl. - * pcre/pcre.pri: Pass --preprocessor='cl /e' to dftables, or more - generally speaking QMAKE_CC /E for the win32-msvc buildspecs. - -2008-06-24 Simon Hausmann - - Fix the Qt build, added missing include. - - * kjs/PropertySlot.cpp: - -2008-06-24 Alexey Proskuryakov - - Reviewed by Cameron Zwarich. - - Make ParserRefCountedCounter actually perform a leak check. - - * kjs/nodes.cpp: - (KJS::ParserRefCountedCounter::~ParserRefCountedCounter): Check for leaks in destructor, - not in constructor. - (KJS::ParserRefCountedCounter::increment): - (KJS::ParserRefCountedCounter::decrement): - (KJS::ParserRefCounted::ParserRefCounted): - (KJS::ParserRefCounted::~ParserRefCounted): - While at it, also made counting thread-safe. - -2008-06-24 Cameron Zwarich - - Reviewed by Oliver. - - Bug 19730: REGRESSION (r34497): Text in alerts in "Leisure suit Larry" is not wrapped - - - Do not convert the pair (less, jtrue) to jless when jtrue is a jump - target. An example of this is when the condition of a while loop is a - LogicalOrNode. - - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::emitLabel): - -2008-06-20 Ariya Hidayat - - Reviewed by Adam Roben. - - Fix compile with MinGW. - - * kjs/Shell.cpp: - * wtf/Threading.h: - (WTF::atomicIncrement): - (WTF::atomicDecrement): - -2008-06-23 Mark Rowe - - Reviewed by Oliver Hunt. - - Prepration for returning memory to the OS on Windows. Track whether a portion of a span of memory was returned to the OS. - If it was, ask that it be recommitted before returning it to the application as an allocated region. - - * wtf/FastMalloc.cpp: - (WTF::TCMalloc_PageHeap::New): If the span was decommitted, ask that it be recommitted before returning it. - (WTF::TCMalloc_PageHeap::AllocLarge): Ditto. - (WTF::TCMalloc_PageHeap::Carve): When splitting a span, ensure that the decommitted state propogates to the two new spans. - (WTF::TCMalloc_PageHeap::Delete): When merging a span, ensure that the resulting span is marked as decommitted if any of the - spans being merged were marked as decommitted. - (WTF::TCMalloc_PageHeap::IncrementalScavenge): Mark as decommitted after releasing the span. - (WTF::TCMalloc_Central_FreeList::FetchFromSpans): Add an assertion to catch a decommitted span being returned to the application - without first being recommitted. - (WTF::TCMalloc_Central_FreeList::Populate): Ditto. - * wtf/TCSystemAlloc.cpp: Stub out TCMalloc_SystemCommit. - * wtf/TCSystemAlloc.h: - -2008-06-23 Mark Rowe - - Reviewed by Sam Weinig. - - Remove the sample member of Span when NO_TCMALLOC_SAMPLES is defined. - - * wtf/FastMalloc.cpp: - (WTF::TCMalloc_PageHeap::Delete): Only update Span::sample if NO_TCMALLOC_SAMPLES is not defined. - (WTF::TCMallocStats::do_free): Ditto. - -2008-06-23 Darin Adler - - Reviewed by Geoff. - - - work toward https://bugs.webkit.org/show_bug.cgi?id=19721 - - More preparation toward making functions work on primitive types without - creating wrapper objects. No speedup this time, but prepares for a future - speedup without slowing things down. - - SunSpider reports no change. - - - Eliminated the implementsCall, callAsFunction and construct virtual - functions from JSObject. Instead, the CallData and ConstructData for - a native function includes a function pointer that the caller can use - directly. Changed all call sites to use CallData and ConstructData. - - - Changed the "this" argument to native functions to be a JSValue rather - than a JSObject. This prepares us for passing primitives into these - functions. The conversion to an object now must be done inside the - function. Critically, if it's a function that can be called on a DOM - window object, then we have to be sure to call toThisObject on the - argument before we use it for anything even if it's already an object. - - - Eliminated the practice of using constructor objects in the global - object to make objects of the various basic types. Since these - constructors can't be replaced by script, there's no reason to involve - a constructor object at all. Added functions to do the construction - directly. - - - Made some more class members private and protected, including virtual - function overrides. This can catch code using unnecessarily slow virtual - function code paths when the type of an object is known statically. If we - later find a new reason use the members outside the class it's easy to - make them public again. - - - Moved the declarations of the native implementations for functions out - of header files. These can have internal linkage and be declared inside - the source file. - - - Changed PrototypeFunction to take function pointers with the right - arguments to be put directly into CallData. This eliminates the - need to have a separate PrototypeReflexiveFunction, and reveals that the - real purpose of that class included something else specific to eval -- - storage of a cached global object. So renamed PrototypeReflexiveFunction - to GlobalEvalFunction. - - * API/JSCallbackConstructor.cpp: - (KJS::constructJSCallback): - (KJS::JSCallbackConstructor::getConstructData): - * API/JSCallbackConstructor.h: - * API/JSCallbackFunction.cpp: - (KJS::JSCallbackFunction::implementsHasInstance): - (KJS::JSCallbackFunction::call): - (KJS::JSCallbackFunction::getCallData): - * API/JSCallbackFunction.h: - (KJS::JSCallbackFunction::classInfo): - * API/JSCallbackObject.h: - (KJS::JSCallbackObject::classRef): - (KJS::JSCallbackObject::classInfo): - * API/JSCallbackObjectFunctions.h: - (KJS::::getConstructData): - (KJS::::construct): - (KJS::::getCallData): - (KJS::::call): - * API/JSObjectRef.cpp: - (JSObjectMakeFunction): - (JSObjectIsFunction): - (JSObjectCallAsFunction): - (JSObjectCallAsConstructor): - * JavaScriptCore.exp: - * VM/Machine.cpp: - (KJS::jsTypeStringForValue): - (KJS::Machine::privateExecute): - * kjs/ArrayPrototype.cpp: - (KJS::arrayProtoFuncToString): - (KJS::arrayProtoFuncToLocaleString): - (KJS::arrayProtoFuncJoin): - (KJS::arrayProtoFuncConcat): - (KJS::arrayProtoFuncPop): - (KJS::arrayProtoFuncPush): - (KJS::arrayProtoFuncReverse): - (KJS::arrayProtoFuncShift): - (KJS::arrayProtoFuncSlice): - (KJS::arrayProtoFuncSort): - (KJS::arrayProtoFuncSplice): - (KJS::arrayProtoFuncUnShift): - (KJS::arrayProtoFuncFilter): - (KJS::arrayProtoFuncMap): - (KJS::arrayProtoFuncEvery): - (KJS::arrayProtoFuncForEach): - (KJS::arrayProtoFuncSome): - (KJS::arrayProtoFuncIndexOf): - (KJS::arrayProtoFuncLastIndexOf): - (KJS::ArrayConstructor::ArrayConstructor): - (KJS::constructArrayWithSizeQuirk): - (KJS::constructWithArrayConstructor): - (KJS::ArrayConstructor::getConstructData): - (KJS::callArrayConstructor): - (KJS::ArrayConstructor::getCallData): - * kjs/ArrayPrototype.h: - * kjs/BooleanObject.cpp: - (KJS::booleanProtoFuncToString): - (KJS::booleanProtoFuncValueOf): - (KJS::constructBoolean): - (KJS::constructWithBooleanConstructor): - (KJS::BooleanConstructor::getConstructData): - (KJS::callBooleanConstructor): - (KJS::BooleanConstructor::getCallData): - (KJS::constructBooleanFromImmediateBoolean): - * kjs/BooleanObject.h: - * kjs/CallData.h: - (KJS::): - * kjs/ConstructData.h: - (KJS::): - * kjs/FunctionPrototype.cpp: - (KJS::callFunctionPrototype): - (KJS::FunctionPrototype::getCallData): - (KJS::functionProtoFuncToString): - (KJS::functionProtoFuncApply): - (KJS::functionProtoFuncCall): - (KJS::constructWithFunctionConstructor): - (KJS::FunctionConstructor::getConstructData): - (KJS::callFunctionConstructor): - (KJS::FunctionConstructor::getCallData): - (KJS::constructFunction): - * kjs/FunctionPrototype.h: - * kjs/JSArray.cpp: - (KJS::AVLTreeAbstractorForArrayCompare::compare_key_key): - (KJS::JSArray::sort): - (KJS::constructEmptyArray): - (KJS::constructArray): - * kjs/JSArray.h: - (KJS::JSArray::classInfo): - * kjs/JSFunction.cpp: - (KJS::JSFunction::call): - (KJS::globalFuncEval): - (KJS::globalFuncParseInt): - (KJS::globalFuncParseFloat): - (KJS::globalFuncIsNaN): - (KJS::globalFuncIsFinite): - (KJS::globalFuncDecodeURI): - (KJS::globalFuncDecodeURIComponent): - (KJS::globalFuncEncodeURI): - (KJS::globalFuncEncodeURIComponent): - (KJS::globalFuncEscape): - (KJS::globalFuncUnescape): - (KJS::globalFuncKJSPrint): - (KJS::PrototypeFunction::PrototypeFunction): - (KJS::PrototypeFunction::getCallData): - (KJS::GlobalEvalFunction::GlobalEvalFunction): - (KJS::GlobalEvalFunction::mark): - * kjs/JSFunction.h: - (KJS::InternalFunction::classInfo): - (KJS::InternalFunction::functionName): - (KJS::JSFunction::classInfo): - (KJS::GlobalEvalFunction::cachedGlobalObject): - * kjs/JSGlobalObject.cpp: - (KJS::JSGlobalObject::reset): - (KJS::JSGlobalObject::mark): - * kjs/JSGlobalObject.h: - (KJS::JSGlobalObject::JSGlobalObject): - (KJS::JSGlobalObject::evalFunction): - * kjs/JSImmediate.cpp: - (KJS::JSImmediate::toObject): - * kjs/JSNotAnObject.cpp: - * kjs/JSNotAnObject.h: - * kjs/JSObject.cpp: - (KJS::JSObject::put): - (KJS::callDefaultValueFunction): - (KJS::JSObject::defaultValue): - (KJS::JSObject::lookupGetter): - (KJS::JSObject::lookupSetter): - (KJS::JSObject::hasInstance): - (KJS::JSObject::fillGetterPropertySlot): - (KJS::Error::create): - (KJS::constructEmptyObject): - * kjs/JSObject.h: - (KJS::GetterSetter::GetterSetter): - (KJS::GetterSetter::getter): - (KJS::GetterSetter::setGetter): - (KJS::GetterSetter::setter): - (KJS::GetterSetter::setSetter): - * kjs/JSValue.cpp: - (KJS::JSCell::deleteProperty): - (KJS::call): - (KJS::construct): - * kjs/JSValue.h: - * kjs/MathObject.cpp: - (KJS::mathProtoFuncAbs): - (KJS::mathProtoFuncACos): - (KJS::mathProtoFuncASin): - (KJS::mathProtoFuncATan): - (KJS::mathProtoFuncATan2): - (KJS::mathProtoFuncCeil): - (KJS::mathProtoFuncCos): - (KJS::mathProtoFuncExp): - (KJS::mathProtoFuncFloor): - (KJS::mathProtoFuncLog): - (KJS::mathProtoFuncMax): - (KJS::mathProtoFuncMin): - (KJS::mathProtoFuncPow): - (KJS::mathProtoFuncRandom): - (KJS::mathProtoFuncRound): - (KJS::mathProtoFuncSin): - (KJS::mathProtoFuncSqrt): - (KJS::mathProtoFuncTan): - * kjs/MathObject.h: - * kjs/NumberObject.cpp: - (KJS::numberProtoFuncToString): - (KJS::numberProtoFuncToLocaleString): - (KJS::numberProtoFuncValueOf): - (KJS::numberProtoFuncToFixed): - (KJS::numberProtoFuncToExponential): - (KJS::numberProtoFuncToPrecision): - (KJS::NumberConstructor::NumberConstructor): - (KJS::constructWithNumberConstructor): - (KJS::NumberConstructor::getConstructData): - (KJS::callNumberConstructor): - (KJS::NumberConstructor::getCallData): - (KJS::constructNumber): - (KJS::constructNumberFromImmediateNumber): - * kjs/NumberObject.h: - (KJS::NumberObject::classInfo): - (KJS::NumberConstructor::classInfo): - * kjs/PropertySlot.cpp: - (KJS::PropertySlot::functionGetter): - * kjs/RegExpObject.cpp: - (KJS::regExpProtoFuncTest): - (KJS::regExpProtoFuncExec): - (KJS::regExpProtoFuncCompile): - (KJS::regExpProtoFuncToString): - (KJS::callRegExpObject): - (KJS::RegExpObject::getCallData): - (KJS::constructRegExp): - (KJS::constructWithRegExpConstructor): - (KJS::RegExpConstructor::getConstructData): - (KJS::callRegExpConstructor): - (KJS::RegExpConstructor::getCallData): - * kjs/RegExpObject.h: - (KJS::RegExpConstructor::classInfo): - * kjs/Shell.cpp: - (GlobalObject::GlobalObject): - (functionPrint): - (functionDebug): - (functionGC): - (functionVersion): - (functionRun): - (functionLoad): - (functionReadline): - (functionQuit): - * kjs/date_object.cpp: - (KJS::gmtoffset): - (KJS::formatLocaleDate): - (KJS::fillStructuresUsingDateArgs): - (KJS::DateInstance::getTime): - (KJS::DateInstance::getUTCTime): - (KJS::DateConstructor::DateConstructor): - (KJS::constructDate): - (KJS::DateConstructor::getConstructData): - (KJS::callDate): - (KJS::DateConstructor::getCallData): - (KJS::dateParse): - (KJS::dateNow): - (KJS::dateUTC): - (KJS::dateProtoFuncToString): - (KJS::dateProtoFuncToUTCString): - (KJS::dateProtoFuncToDateString): - (KJS::dateProtoFuncToTimeString): - (KJS::dateProtoFuncToLocaleString): - (KJS::dateProtoFuncToLocaleDateString): - (KJS::dateProtoFuncToLocaleTimeString): - (KJS::dateProtoFuncValueOf): - (KJS::dateProtoFuncGetTime): - (KJS::dateProtoFuncGetFullYear): - (KJS::dateProtoFuncGetUTCFullYear): - (KJS::dateProtoFuncToGMTString): - (KJS::dateProtoFuncGetMonth): - (KJS::dateProtoFuncGetUTCMonth): - (KJS::dateProtoFuncGetDate): - (KJS::dateProtoFuncGetUTCDate): - (KJS::dateProtoFuncGetDay): - (KJS::dateProtoFuncGetUTCDay): - (KJS::dateProtoFuncGetHours): - (KJS::dateProtoFuncGetUTCHours): - (KJS::dateProtoFuncGetMinutes): - (KJS::dateProtoFuncGetUTCMinutes): - (KJS::dateProtoFuncGetSeconds): - (KJS::dateProtoFuncGetUTCSeconds): - (KJS::dateProtoFuncGetMilliSeconds): - (KJS::dateProtoFuncGetUTCMilliseconds): - (KJS::dateProtoFuncGetTimezoneOffset): - (KJS::dateProtoFuncSetTime): - (KJS::setNewValueFromTimeArgs): - (KJS::setNewValueFromDateArgs): - (KJS::dateProtoFuncSetMilliSeconds): - (KJS::dateProtoFuncSetUTCMilliseconds): - (KJS::dateProtoFuncSetSeconds): - (KJS::dateProtoFuncSetUTCSeconds): - (KJS::dateProtoFuncSetMinutes): - (KJS::dateProtoFuncSetUTCMinutes): - (KJS::dateProtoFuncSetHours): - (KJS::dateProtoFuncSetUTCHours): - (KJS::dateProtoFuncSetDate): - (KJS::dateProtoFuncSetUTCDate): - (KJS::dateProtoFuncSetMonth): - (KJS::dateProtoFuncSetUTCMonth): - (KJS::dateProtoFuncSetFullYear): - (KJS::dateProtoFuncSetUTCFullYear): - (KJS::dateProtoFuncSetYear): - (KJS::dateProtoFuncGetYear): - * kjs/date_object.h: - (KJS::DateInstance::internalNumber): - (KJS::DateInstance::classInfo): - * kjs/error_object.cpp: - (KJS::errorProtoFuncToString): - (KJS::constructError): - (KJS::constructWithErrorConstructor): - (KJS::ErrorConstructor::getConstructData): - (KJS::callErrorConstructor): - (KJS::ErrorConstructor::getCallData): - (KJS::NativeErrorConstructor::construct): - (KJS::constructWithNativeErrorConstructor): - (KJS::NativeErrorConstructor::getConstructData): - (KJS::callNativeErrorConstructor): - (KJS::NativeErrorConstructor::getCallData): - * kjs/error_object.h: - (KJS::NativeErrorConstructor::classInfo): - * kjs/internal.cpp: - (KJS::JSNumberCell::toObject): - (KJS::JSNumberCell::toThisObject): - (KJS::GetterSetter::mark): - (KJS::GetterSetter::toPrimitive): - (KJS::GetterSetter::toBoolean): - (KJS::GetterSetter::toNumber): - (KJS::GetterSetter::toString): - (KJS::GetterSetter::toObject): - (KJS::InternalFunction::InternalFunction): - (KJS::InternalFunction::implementsHasInstance): - * kjs/lookup.h: - (KJS::HashEntry::): - * kjs/nodes.cpp: - (KJS::FuncDeclNode::makeFunction): - (KJS::FuncExprNode::makeFunction): - * kjs/object_object.cpp: - (KJS::objectProtoFuncValueOf): - (KJS::objectProtoFuncHasOwnProperty): - (KJS::objectProtoFuncIsPrototypeOf): - (KJS::objectProtoFuncDefineGetter): - (KJS::objectProtoFuncDefineSetter): - (KJS::objectProtoFuncLookupGetter): - (KJS::objectProtoFuncLookupSetter): - (KJS::objectProtoFuncPropertyIsEnumerable): - (KJS::objectProtoFuncToLocaleString): - (KJS::objectProtoFuncToString): - (KJS::ObjectConstructor::ObjectConstructor): - (KJS::constructObject): - (KJS::constructWithObjectConstructor): - (KJS::ObjectConstructor::getConstructData): - (KJS::callObjectConstructor): - (KJS::ObjectConstructor::getCallData): - * kjs/object_object.h: - * kjs/string_object.cpp: - (KJS::replace): - (KJS::stringProtoFuncToString): - (KJS::stringProtoFuncValueOf): - (KJS::stringProtoFuncCharAt): - (KJS::stringProtoFuncCharCodeAt): - (KJS::stringProtoFuncConcat): - (KJS::stringProtoFuncIndexOf): - (KJS::stringProtoFuncLastIndexOf): - (KJS::stringProtoFuncMatch): - (KJS::stringProtoFuncSearch): - (KJS::stringProtoFuncReplace): - (KJS::stringProtoFuncSlice): - (KJS::stringProtoFuncSplit): - (KJS::stringProtoFuncSubstr): - (KJS::stringProtoFuncSubstring): - (KJS::stringProtoFuncToLowerCase): - (KJS::stringProtoFuncToUpperCase): - (KJS::stringProtoFuncToLocaleLowerCase): - (KJS::stringProtoFuncToLocaleUpperCase): - (KJS::stringProtoFuncLocaleCompare): - (KJS::stringProtoFuncBig): - (KJS::stringProtoFuncSmall): - (KJS::stringProtoFuncBlink): - (KJS::stringProtoFuncBold): - (KJS::stringProtoFuncFixed): - (KJS::stringProtoFuncItalics): - (KJS::stringProtoFuncStrike): - (KJS::stringProtoFuncSub): - (KJS::stringProtoFuncSup): - (KJS::stringProtoFuncFontcolor): - (KJS::stringProtoFuncFontsize): - (KJS::stringProtoFuncAnchor): - (KJS::stringProtoFuncLink): - (KJS::stringFromCharCode): - (KJS::StringConstructor::StringConstructor): - (KJS::constructWithStringConstructor): - (KJS::StringConstructor::getConstructData): - (KJS::callStringConstructor): - (KJS::StringConstructor::getCallData): - * kjs/string_object.h: - -2008-06-23 Cameron Zwarich - - Reviewed by Oliver. - - Bug 19716: REGRESSION (SquirrelFish): Reproducible crash after entering a username at mint.com - - - When unwinding callframes for exceptions, check whether the callframe - was created by a reentrant native call to JavaScript after tearing off - the local variables instead of before. - - * VM/Machine.cpp: - (KJS::Machine::unwindCallFrame): - -2008-06-23 Mark Rowe - - Reviewed by Oliver Hunt. - - Get testapi passing again in a debug build. - - * API/testapi.c: - (main): Update the expected output of calling JSValueMakeString on a function object. - -2008-06-21 Mark Rowe - - Reviewed by Sam Weinig. - - Print a blank line when exiting the jsc interactive mode to ensure that the shell - prompt will start on a new line. - - * kjs/Shell.cpp: - (runInteractive): - -2008-06-21 Mark Rowe - - Rubber-stamped by Sam Weinig. - - Tweak the paths of the items in the "tests" group to clean things up a little. - - * JavaScriptCore.xcodeproj/project.pbxproj: - -2008-06-21 Mark Rowe - - Rubber-stamped by Sam Weinig. - - Fix jsc to link against libedit.dylib rather than libedit.2.dylib. - - * JavaScriptCore.xcodeproj/project.pbxproj: - -2008-06-21 Mark Rowe - - Reviewed by Sam Weinig. - - Copy the JavaScriptCore shell (jsc) into JavaScriptCore.framework so that it will - be included in nightly builds. - https://bugs.webkit.org/show_bug.cgi?id=19691 - - * JavaScriptCore.xcodeproj/project.pbxproj: - -2008-06-21 Cameron Zwarich - - Reviewed by Mark Rowe. - - Fix the build for non-Mac Darwin platforms by disabling their support - for readline in the JavaScript shell. - - * kjs/config.h: - -2008-06-20 Timothy Hatcher - - Use member function pointers for the Profile::forEach function. - Eliminating a few static functions and simplified things a little. - - Reviewed by Alexey Proskuryakov. - - * JavaScriptCore.exp: Change the symbol for forEach. - * profiler/Profile.cpp: - (KJS::Profile::forEach): Use a member function pointer. - * profiler/Profile.h: - (KJS::Profile::sortTotalTimeDescending): Pass a function pointer. - (KJS::Profile::sortTotalTimeAscending): Ditto. - (KJS::Profile::sortSelfTimeDescending): Ditto. - (KJS::Profile::sortSelfTimeAscending): Ditto. - (KJS::Profile::sortCallsDescending): Ditto. - * profiler/ProfileNode.h: - (KJS::ProfileNode::sortTotalTimeDescending): No longer static. - (KJS::ProfileNode::sortTotalTimeAscending): Ditto. - (KJS::ProfileNode::sortSelfTimeDescending): Ditto. - (KJS::ProfileNode::sortSelfTimeAscending): Ditto. - (KJS::ProfileNode::sortCallsDescending): Ditto. - -2008-06-20 Cameron Zwarich - - Reviewed by Oliver. - - Remove unused destructors. - - * kjs/nodes.cpp: - * kjs/nodes.h: - -2008-06-20 Timothy Hatcher - - Fixed an ASSERT(m_actualSelfTime <= m_actualTotalTime) when starting - and stopping a profile from the Develop menu. Also prevents - inserting an incorrect parent node as the new head after profiling - is stopped from the Develop menu. - - Reviewed by Dan Bernstein. - - * profiler/Profile.cpp: - (KJS::Profile::stopProfiling): If the current node is already the head - then there is no more need to record future nodes in didExecute. - (KJS::Profile::didExecute): Move the code of setupCurrentNodeAsStopped - into here since this was the only caller. When setting the total time - keep any current total time while adding the self time of the head. - (KJS::Profile::setupCurrentNodeAsStopped): Removed. - * profiler/Profile.h: Removed setupCurrentNodeAsStopped. - -2008-06-20 Kevin Ollivier - - !USE(MULTIPLE_THREADS) on Darwin build fix - - * kjs/InitializeThreading.cpp: - (KJS::initializeThreading): - * kjs/collector.h: - -2008-06-20 Kevin McCullough - - -Leopard Build Fix. - - * profiler/Profile.cpp: - (KJS::Profile::removeProfileStart): - (KJS::Profile::removeProfileEnd): - -2008-06-20 Kevin McCullough - - Just giving credit. - - * ChangeLog: - -2008-06-20 Kevin McCullough - - Reviewed by Tim and Dan. - - JSProfiler: ASSERT hit in Profiler. - - Because InspectorController can call startProfiling() and - stopProfiling() we cannot assert that console.profile() and - console.profileEnd() will be in the profile tree. - - * profiler/Profile.cpp: - (KJS::Profile::removeProfileStart): - (KJS::Profile::removeProfileEnd): - -2008-06-20 Kevin McCullough - - Reviewed by Tim. - - JSProfiler: Time incorrectly given to (idle) - if profiling is started and finished within the same function. (19230) - - Now we profile one more stack frame up from the last frame to allocate - the time spent in it, if it exists. - - * JavaScriptCore.exp: - * VM/Machine.cpp: We need to let the profiler know when the JS program - has finished since that is what will actually stop the profiler instead - of just calling stopProfiling(). - (KJS::Machine::execute): - * profiler/Profile.cpp: - (KJS::Profile::create): Moved from Profile.h since it was getting pretty - long. - (KJS::Profile::Profile): We now have a client, which is a listener who - we will return this profile to, once it has actually finished. - (KJS::Profile::stopProfiling): Instead of fully stopping the profiler - here, we set the flag and keep it profiling in the background. - (KJS::Profile::didFinishAllExecution): This is where the profiler - actually finishes and creates the (idle) node if one should be made. - (KJS::Profile::removeProfileStart): Don't use m_currentNode since it is - needed by the profiler as it runs silently in the background. - (KJS::Profile::removeProfileEnd): Ditto. - (KJS::Profile::willExecute): Don't profile new functions if we have - stopped profiling. - (KJS::Profile::didExecute): Only record one more return as all the - remaining time will be attributed to that function. - (KJS::Profile::setupCurrentNodeAsStopped): Sets the current node's time. - * profiler/Profile.h: Added functions and variables for the above - changes. - (KJS::Profile::client): - * profiler/ProfileNode.h: - (KJS::CallIdentifier::toString): Debug method. - * profiler/Profiler.cpp: Added support for the ProfilerClient. - (KJS::Profiler::startProfiling): - (KJS::Profiler::stopProfiling): No longer return sthe profile. - (KJS::Profiler::didFinishAllExecution): Now returns the profile to the - client instead of stopProfiling. - * profiler/Profiler.h: - (KJS::ProfilerClient::~ProfilerClient): Clients will implement this - interface. - -2008-06-19 Ariya Hidayat - - Reviewed by Simon. - - Surpress compiler warning (int vs unsigned comparison). - - * wtf/unicode/qt4/UnicodeQt4.h: - (WTF::Unicode::toLower): - -2008-06-19 Ariya Hidayat - - Reviewed by Timothy Hatcher. - - Introduce compiler define for MinGW, to have COMPILER(MINGW). - - * wtf/Platform.h: - -2008-06-19 Alexey Proskuryakov - - Reviewed by Geoff. - - Make Machine per-JSGlobalData. - - * VM/CodeBlock.cpp: - (KJS::CodeBlock::dump): - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::emitOpcode): - * VM/Machine.cpp: - (KJS::callEval): - (KJS::Machine::unwindCallFrame): - (KJS::Machine::throwException): - (KJS::Machine::execute): - (KJS::Machine::debug): - * VM/Machine.h: - * kjs/DebuggerCallFrame.cpp: - (KJS::DebuggerCallFrame::evaluate): - * kjs/DebuggerCallFrame.h: - (KJS::DebuggerCallFrame::DebuggerCallFrame): - * kjs/ExecState.cpp: - (KJS::ExecState::ExecState): - * kjs/ExecState.h: - (KJS::ExecState::machine): - * kjs/JSFunction.cpp: - (KJS::JSFunction::callAsFunction): - (KJS::JSFunction::argumentsGetter): - (KJS::JSFunction::callerGetter): - (KJS::JSFunction::construct): - (KJS::globalFuncEval): - * kjs/JSGlobalData.cpp: - (KJS::JSGlobalData::JSGlobalData): - * kjs/JSGlobalData.h: - * kjs/interpreter.cpp: - (KJS::Interpreter::evaluate): - -2008-06-19 Alp Toker - - GTK+/autotools build fix. JSGlobalObject.cpp in now in - AllInOneFile.cpp and shouldn't be built separately. - - * GNUmakefile.am: - -2008-06-19 Alexey Proskuryakov - - Reviewed by Darin. - - Get rid of some threadInstance calls. - - * kjs/JSGlobalObject.cpp: - (KJS::JSGlobalObject::init): - * kjs/Parser.cpp: - (KJS::Parser::parse): - * kjs/Shell.cpp: - (jscmain): - -2008-06-19 Alexey Proskuryakov - - Reviewed by Sam. - - Fix an assertion failure at startup. - - * kjs/JSObject.h: (KJS::JSObject::JSObject): Allow jsNull prototype in an assertion (I had - it fixed in a wrong copy of the file, so I wasn't getting the failure). - -2008-06-19 Alexey Proskuryakov - - Build fix. - - * kjs/collector.cpp: - (KJS::Heap::Heap): - (KJS::allocateBlock): - * kjs/collector.h: - No, #if PLATFORM(UNIX) was not right. I've just moved the unsafe initialization back for now, - as the platforms that use that code path do not use multiple threads yet. - -2008-06-19 Alexey Proskuryakov - - Windows and Qt build fixes. - - * kjs/collector.h: - * kjs/collector.cpp: - (KJS::Heap::Heap): - Wrapped m_pagesize in #if PLATFORM(UNIX), which should better match the sequence of #elifs - in allocateBlock(). Changed MIN_ARRAY_SIZE to be explicitly size_t, as this type is different - on different platforms. - -2008-06-17 Alexey Proskuryakov - - Reviewed by Darin. - - Prepare JavaScript heap for being per-thread. - - * kjs/ExecState.h: Shuffle includes, making it possible to include ExecState.h in JSValue.h. - (KJS::ExecState::heap): Added an accessor. - - * API/JSBase.cpp: (JSGarbageCollect): Collect both shared and per-thread heaps. - - * API/JSContextRef.cpp: (JSGlobalContextCreate): When allocating JSGlobalObject, indicate - that it belongs to a shared heap. - - * JavaScriptCore.xcodeproj/project.pbxproj: - * kjs/AllInOneFile.cpp: - Moved JSGlobalObject.cpp to AllInOneFile, as a build fix for inlineAllocate magic. - - * VM/CodeGenerator.h: (KJS::CodeGenerator::globalExec): Added an accessor (working via - m_scopeChain). - - * VM/RegisterFile.h: - (KJS::RegisterFile::mark): - * VM/RegisterFileStack.h: - (KJS::RegisterFileStack::mark): - Made these pseudo-mark functions take Heap*. - - * kjs/InitializeThreading.cpp: - (KJS::initializeThreading): Initialize heap introspector. - - * kjs/JSGlobalData.h: Added Heap to the structure. - - * kjs/JSGlobalData.cpp: - (KJS::JSGlobalData::JSGlobalData): Initialize Heap. - (KJS::JSGlobalData::sharedInstance): Added a method to access shared global data instance - for legacy clients. - - * kjs/JSGlobalObject.cpp: - (KJS::JSGlobalObject::~JSGlobalObject): Changed to work with per-thread head; fixed list - maintenance logic. - (KJS::JSGlobalObject::init): Changed to work with per-thread head. - (KJS::JSGlobalObject::put): Assert that a cross-heap operation is not being attempted. - (KJS::JSGlobalObject::reset): Pass ExecState* where now required. - (KJS::JSGlobalObject::mark): Pass the current heap to RegisterFileStack::mark. - (KJS::JSGlobalObject::operator new): Overload operator new to use per-thread or shared heap. - * kjs/JSGlobalObject.h: Removed static s_head member. - - * kjs/PropertyMap.h: (KJS::PropertyMap::PropertyMap): Removed unused SavedProperty. - - * kjs/collector.h: Turned Collector into an actual object with its own data, renamed to Heap. - (KJS::Heap::initializeHeapIntrospector): Added. - (KJS::Heap::heap): Added a method to determine which heap a JSValue is in, if any. - (KJS::Heap::allocate): Made non-static. - (KJS::Heap::inlineAllocateNumber): Ditto. - (KJS::Heap::markListSet): Ditto. - (KJS::Heap::cellBlock): Ditto. - (KJS::Heap::cellOffset): Ditto. - (KJS::Heap::isCellMarked): Ditto. - (KJS::Heap::markCell): Ditto. - (KJS::Heap::reportExtraMemoryCost): Ditto. - (KJS::CollectorBlock): Added a back-reference to Heap for Heap::heap() method. - (KJS::SmallCellCollectorBlock): Ditto. - - * kjs/collector.cpp: Changed MIN_ARRAY_SIZE to a #define to avoid a PIC branch. Removed - main thread related machinery. - (KJS::Heap::Heap): Initialize the newly added data members. - (KJS::allocateBlock): Marked NEVER_INLINE, as this is a rare case that uses a PIC branch. - Moved static pagesize to the class to make it safely initialized. - (KJS::Heap::heapAllocate): Initialize heap back reference after a new block is allocated. - (KJS::Heap::registerThread): Removed introspector initialization, as it is now performed - in InitializeThreading.cpp. - (KJS::Heap::markOtherThreadConservatively): Assert that the "other thread" case only occurs - for legacy clients using a shared heap. - (KJS::Heap::markStackObjectsConservatively): Moved fastMallocForbid/Allow down here, since - it doesn't need to be forbidden during other GC phases. - - * kjs/JSImmediate.h: - (KJS::jsUndefined): - (KJS::jsNull): - (KJS::jsBoolean): - Moved from JSvalue.h, to make these usable in files that cannot include JSValue.h (such - as list.h). - - * API/JSCallbackObjectFunctions.h: - (KJS::::staticFunctionGetter): - * API/JSClassRef.cpp: - (OpaqueJSClass::prototype): - * API/JSObjectRef.cpp: - (JSObjectMake): - (JSObjectMakeFunctionWithCallback): - (JSObjectMakeConstructor): - (JSObjectMakeFunction): - * API/JSValueRef.cpp: - (JSValueMakeNumber): - (JSValueMakeString): - * JavaScriptCore.exp: - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::emitLoad): - * VM/JSPropertyNameIterator.cpp: - (KJS::JSPropertyNameIterator::create): - (KJS::JSPropertyNameIterator::next): - * VM/Machine.cpp: - (KJS::jsAddSlowCase): - (KJS::jsAdd): - (KJS::jsTypeStringForValue): - (KJS::scopeChainForCall): - (KJS::Machine::throwException): - (KJS::Machine::execute): - (KJS::Machine::privateExecute): - (KJS::Machine::retrieveArguments): - * kjs/ArrayPrototype.cpp: - (KJS::arrayProtoFuncToString): - (KJS::arrayProtoFuncToLocaleString): - (KJS::arrayProtoFuncJoin): - (KJS::arrayProtoFuncConcat): - (KJS::arrayProtoFuncPop): - (KJS::arrayProtoFuncPush): - (KJS::arrayProtoFuncShift): - (KJS::arrayProtoFuncSlice): - (KJS::arrayProtoFuncSplice): - (KJS::arrayProtoFuncUnShift): - (KJS::arrayProtoFuncFilter): - (KJS::arrayProtoFuncMap): - (KJS::arrayProtoFuncEvery): - (KJS::arrayProtoFuncForEach): - (KJS::arrayProtoFuncSome): - (KJS::arrayProtoFuncIndexOf): - (KJS::arrayProtoFuncLastIndexOf): - (KJS::ArrayConstructor::ArrayConstructor): - (KJS::ArrayConstructor::construct): - (KJS::ArrayConstructor::callAsFunction): - * kjs/BooleanObject.cpp: - (KJS::BooleanPrototype::BooleanPrototype): - (KJS::booleanProtoFuncToString): - (KJS::BooleanConstructor::BooleanConstructor): - (KJS::BooleanConstructor::construct): - * kjs/FunctionPrototype.cpp: - (KJS::FunctionPrototype::FunctionPrototype): - (KJS::functionProtoFuncToString): - (KJS::FunctionConstructor::FunctionConstructor): - (KJS::FunctionConstructor::construct): - * kjs/JSActivation.cpp: - (KJS::JSActivation::createArgumentsObject): - * kjs/JSArray.cpp: - (KJS::JSArray::JSArray): - (KJS::JSArray::lengthGetter): - * kjs/JSFunction.cpp: - (KJS::JSFunction::lengthGetter): - (KJS::JSFunction::construct): - (KJS::Arguments::Arguments): - (KJS::encode): - (KJS::decode): - (KJS::globalFuncParseInt): - (KJS::globalFuncParseFloat): - (KJS::globalFuncEscape): - (KJS::globalFuncUnescape): - (KJS::PrototypeFunction::PrototypeFunction): - (KJS::PrototypeReflexiveFunction::PrototypeReflexiveFunction): - * kjs/JSImmediate.cpp: - (KJS::JSImmediate::toObject): - * kjs/JSLock.cpp: - (KJS::JSLock::registerThread): - * kjs/JSObject.cpp: - (KJS::JSObject::put): - (KJS::JSObject::defineGetter): - (KJS::JSObject::defineSetter): - (KJS::Error::create): - * kjs/JSObject.h: - (KJS::JSObject::putDirect): - * kjs/JSString.h: - (KJS::JSString::JSString): - * kjs/JSValue.cpp: - (KJS::JSCell::operator new): - (KJS::jsString): - (KJS::jsOwnedString): - * kjs/JSValue.h: - (KJS::JSNumberCell::operator new): - (KJS::jsNumberCell): - (KJS::jsNaN): - (KJS::jsNumber): - (KJS::JSCell::marked): - (KJS::JSCell::mark): - (KJS::JSValue::toJSNumber): - * kjs/MathObject.cpp: - (KJS::MathObject::getValueProperty): - (KJS::mathProtoFuncAbs): - (KJS::mathProtoFuncACos): - (KJS::mathProtoFuncASin): - (KJS::mathProtoFuncATan): - (KJS::mathProtoFuncATan2): - (KJS::mathProtoFuncCeil): - (KJS::mathProtoFuncCos): - (KJS::mathProtoFuncExp): - (KJS::mathProtoFuncFloor): - (KJS::mathProtoFuncLog): - (KJS::mathProtoFuncMax): - (KJS::mathProtoFuncMin): - (KJS::mathProtoFuncPow): - (KJS::mathProtoFuncRandom): - (KJS::mathProtoFuncRound): - (KJS::mathProtoFuncSin): - (KJS::mathProtoFuncSqrt): - (KJS::mathProtoFuncTan): - * kjs/NumberObject.cpp: - (KJS::NumberPrototype::NumberPrototype): - (KJS::numberProtoFuncToString): - (KJS::numberProtoFuncToLocaleString): - (KJS::numberProtoFuncToFixed): - (KJS::numberProtoFuncToExponential): - (KJS::numberProtoFuncToPrecision): - (KJS::NumberConstructor::NumberConstructor): - (KJS::NumberConstructor::getValueProperty): - (KJS::NumberConstructor::construct): - (KJS::NumberConstructor::callAsFunction): - * kjs/RegExpObject.cpp: - (KJS::RegExpPrototype::RegExpPrototype): - (KJS::regExpProtoFuncToString): - (KJS::RegExpObject::getValueProperty): - (KJS::RegExpConstructor::RegExpConstructor): - (KJS::RegExpMatchesArray::fillArrayInstance): - (KJS::RegExpConstructor::arrayOfMatches): - (KJS::RegExpConstructor::getBackref): - (KJS::RegExpConstructor::getLastParen): - (KJS::RegExpConstructor::getLeftContext): - (KJS::RegExpConstructor::getRightContext): - (KJS::RegExpConstructor::getValueProperty): - (KJS::RegExpConstructor::construct): - * kjs/RegExpObject.h: - * kjs/Shell.cpp: - (GlobalObject::GlobalObject): - (functionGC): - (functionRun): - (functionReadline): - (jscmain): - * kjs/date_object.cpp: - (KJS::formatLocaleDate): - (KJS::DatePrototype::DatePrototype): - (KJS::DateConstructor::DateConstructor): - (KJS::DateConstructor::construct): - (KJS::DateConstructor::callAsFunction): - (KJS::DateFunction::DateFunction): - (KJS::DateFunction::callAsFunction): - (KJS::dateProtoFuncToString): - (KJS::dateProtoFuncToUTCString): - (KJS::dateProtoFuncToDateString): - (KJS::dateProtoFuncToTimeString): - (KJS::dateProtoFuncToLocaleString): - (KJS::dateProtoFuncToLocaleDateString): - (KJS::dateProtoFuncToLocaleTimeString): - (KJS::dateProtoFuncValueOf): - (KJS::dateProtoFuncGetTime): - (KJS::dateProtoFuncGetFullYear): - (KJS::dateProtoFuncGetUTCFullYear): - (KJS::dateProtoFuncToGMTString): - (KJS::dateProtoFuncGetMonth): - (KJS::dateProtoFuncGetUTCMonth): - (KJS::dateProtoFuncGetDate): - (KJS::dateProtoFuncGetUTCDate): - (KJS::dateProtoFuncGetDay): - (KJS::dateProtoFuncGetUTCDay): - (KJS::dateProtoFuncGetHours): - (KJS::dateProtoFuncGetUTCHours): - (KJS::dateProtoFuncGetMinutes): - (KJS::dateProtoFuncGetUTCMinutes): - (KJS::dateProtoFuncGetSeconds): - (KJS::dateProtoFuncGetUTCSeconds): - (KJS::dateProtoFuncGetMilliSeconds): - (KJS::dateProtoFuncGetUTCMilliseconds): - (KJS::dateProtoFuncGetTimezoneOffset): - (KJS::dateProtoFuncSetTime): - (KJS::setNewValueFromTimeArgs): - (KJS::setNewValueFromDateArgs): - (KJS::dateProtoFuncSetYear): - (KJS::dateProtoFuncGetYear): - * kjs/error_object.cpp: - (KJS::ErrorPrototype::ErrorPrototype): - (KJS::errorProtoFuncToString): - (KJS::ErrorConstructor::ErrorConstructor): - (KJS::ErrorConstructor::construct): - (KJS::NativeErrorPrototype::NativeErrorPrototype): - (KJS::NativeErrorConstructor::NativeErrorConstructor): - (KJS::NativeErrorConstructor::construct): - * kjs/identifier.h: - * kjs/internal.cpp: - (KJS::StringObject::create): - (KJS::JSString::lengthGetter): - (KJS::JSString::indexGetter): - (KJS::JSString::indexNumericPropertyGetter): - * kjs/interpreter.cpp: - * kjs/list.cpp: - (KJS::ArgList::slowAppend): - * kjs/list.h: - * kjs/lookup.h: - (KJS::staticFunctionGetter): - (KJS::cacheGlobalObject): - * kjs/nodes.cpp: - (KJS::Node::emitThrowError): - (KJS::StringNode::emitCode): - (KJS::ArrayNode::emitCode): - (KJS::FuncDeclNode::makeFunction): - (KJS::FuncExprNode::makeFunction): - * kjs/nodes.h: - * kjs/object_object.cpp: - (KJS::ObjectPrototype::ObjectPrototype): - (KJS::objectProtoFuncToLocaleString): - (KJS::objectProtoFuncToString): - (KJS::ObjectConstructor::ObjectConstructor): - (KJS::ObjectConstructor::construct): - * kjs/protect.h: - (KJS::gcProtect): - (KJS::gcUnprotect): - * kjs/string_object.cpp: - (KJS::StringObject::StringObject): - (KJS::StringPrototype::StringPrototype): - (KJS::replace): - (KJS::stringProtoFuncCharAt): - (KJS::stringProtoFuncCharCodeAt): - (KJS::stringProtoFuncConcat): - (KJS::stringProtoFuncIndexOf): - (KJS::stringProtoFuncLastIndexOf): - (KJS::stringProtoFuncMatch): - (KJS::stringProtoFuncSearch): - (KJS::stringProtoFuncReplace): - (KJS::stringProtoFuncSlice): - (KJS::stringProtoFuncSplit): - (KJS::stringProtoFuncSubstr): - (KJS::stringProtoFuncSubstring): - (KJS::stringProtoFuncToLowerCase): - (KJS::stringProtoFuncToUpperCase): - (KJS::stringProtoFuncToLocaleLowerCase): - (KJS::stringProtoFuncToLocaleUpperCase): - (KJS::stringProtoFuncLocaleCompare): - (KJS::stringProtoFuncBig): - (KJS::stringProtoFuncSmall): - (KJS::stringProtoFuncBlink): - (KJS::stringProtoFuncBold): - (KJS::stringProtoFuncFixed): - (KJS::stringProtoFuncItalics): - (KJS::stringProtoFuncStrike): - (KJS::stringProtoFuncSub): - (KJS::stringProtoFuncSup): - (KJS::stringProtoFuncFontcolor): - (KJS::stringProtoFuncFontsize): - (KJS::stringProtoFuncAnchor): - (KJS::stringProtoFuncLink): - (KJS::StringConstructor::StringConstructor): - (KJS::StringConstructor::construct): - (KJS::StringConstructor::callAsFunction): - (KJS::StringConstructorFunction::StringConstructorFunction): - (KJS::StringConstructorFunction::callAsFunction): - * kjs/string_object.h: - (KJS::StringObjectThatMasqueradesAsUndefined::StringObjectThatMasqueradesAsUndefined): - * kjs/ustring.h: - Updated for the above changes. - -2008-06-17 Timothy Hatcher - - Added a type to DebuggerCallFrame so the under interface can - distinguish anonymous functions and program call frames. - - https://bugs.webkit.org/show_bug.cgi?id=19585 - - Reviewed by Geoff Garen. - - * JavaScriptCore.exp: Export the DebuggerCallFrame::type symbol. - * kjs/DebuggerCallFrame.cpp: - (KJS::DebuggerCallFrame::type): Added. - * kjs/DebuggerCallFrame.h: - -2008-06-17 Eric Seidel - - Reviewed by Tim H. - - Remove bogus ASSERT which tripped every time for those who use PAC files. - - * kjs/Parser.cpp: - (KJS::Parser::parse): - -2008-06-17 Kevin McCullough - - Reviewed by Geoff. - - JSProfiler: Don't profile console.profile() - or console.profileEnd() - - * profiler/Profile.cpp: - (KJS::Profile::stopProfiling): Moved the creation of the (idle) node to - the Profile (not ProfileNode). This makes sense since the Profile - should be the one to modify the profile tree. Also each stopProfiling() - does not need to check if it's the head node anymore. Also fixed an - oddity where I was using willExecute to create the node. - (KJS::Profile::removeProfileStart): Removes the call to console.profile - that started this profile. - (KJS::Profile::removeProfileEnd): Removes the call to console.profileEnd - that ended this profile. - * profiler/Profile.h: - * profiler/ProfileNode.cpp: Moved the creation of the (idle) node to - the Profile object. - (KJS::ProfileNode::stopProfiling): - * profiler/ProfileNode.h: Added some helper functions and whitespace to - facilitate readability and the removal of profile() and profileEnd() - from the Profile tree. - (KJS::CallIdentifier::operator const char* ): - (KJS::ProfileNode::firstChild): - (KJS::ProfileNode::lastChild): - (KJS::ProfileNode::removeChild): - (KJS::ProfileNode::toString): - -2008-06-17 Ariya Hidayat - - Rubber stamped by Adam Roben. - - Include JSGlobalObject.h to fix the build. - - * kjs/ScopeChain.cpp: - -2008-06-17 Cameron Zwarich - - Reviewed by Oliver. - - Reduce code duplication in emitReadModifyAssignment(). - - * kjs/nodes.cpp: - (KJS::emitReadModifyAssignment): - -2008-06-17 Cameron Zwarich - - Reviewed by Oliver. - - Sort includes alphabetically. - - * kjs/nodes.cpp: - -2008-06-16 Cameron Zwarich - - Reviewed by Maciej. - - Bug 19596: LEAK: Gmail leaks SegmentedVector - - - When growing SegmentedVector, we start adding segments at the position - of the last segment, overwriting it. The destructor frees allocated - segments starting at the segment of index 1, because the segment of - index 0 is assumed to be the initial inline segment. This causes a leak - of the segment that is referenced by index 0. Modifying grow() so that - it starts adding segments at the position after the last segment fixes - the leak. - - Since the initial segment is a special case in the lookup code, this - bug never manifested itself via incorrect results. - - * VM/SegmentedVector.h: - (KJS::SegmentedVector::grow): - -2008-06-16 Maciej Stachowiak - - Reviewed by Alexey. - - - removed nearly unused types.h and LocalStorageEntry.h headers - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - * kjs/ExecState.h: - * kjs/LocalStorageEntry.h: Removed. - * kjs/RegExpObject.cpp: - * kjs/error_object.cpp: - * kjs/grammar.y: - * kjs/nodes.cpp: - * kjs/types.h: Removed. - -2008-06-16 Alp Toker - - Rubber-stamped by Geoff. - - Change c++ to c in minidom and testapi emacs mode line comments. - - * API/Node.h: - * API/NodeList.c: - * API/NodeList.h: - * API/testapi.c: - -2008-06-16 Alexey Proskuryakov - - Trying to fix Windows build. - - * kjs/PropertyNameArray.h: - * kjs/identifier.cpp: - Include ExecState.h - -2008-06-16 Geoffrey Garen - - Reviewed by Oliver Hunt. - - Slight cleanup to the SymbolTableEntry class. - - Renamed isEmpty to isNull, since we usually use "empty" to mean "holds - the valid, empty value", and "null" to mean "holds no value". - - Changed an "== 0" to a "!", to match our style guidelines. - - Added some ASSERTs to verify the (possibly questionable) assumption that - all register indexes will have their high two bits set. Also clarified a - comment to make that assumption clear. - -2008-06-16 Alexey Proskuryakov - - Reviewed by Darin. - - Initialize functionQueueMutex in a safe manner. - - * wtf/MainThread.cpp: - (WTF::functionQueueMutex): Made it an AtomicallyInitializedStatic. - - (WTF::dispatchFunctionsFromMainThread): - (WTF::setMainThreadCallbacksPaused): - Assert that the current thread is main, meaning that the callbacksPaused static can be - accessed. - -2008-06-16 Alexey Proskuryakov - - Reviewed by Geoff Garen. - - Make Identifier construction use an explicitly passed IdentifierTable. - - No change on SunSpider total. - - * API/JSCallbackObjectFunctions.h: - (KJS::::getOwnPropertySlot): - (KJS::::put): - (KJS::::deleteProperty): - (KJS::::getPropertyNames): - * API/JSObjectRef.cpp: - (JSObjectMakeFunctionWithCallback): - (JSObjectMakeFunction): - (JSObjectHasProperty): - (JSObjectGetProperty): - (JSObjectSetProperty): - (JSObjectDeleteProperty): - (OpaqueJSPropertyNameArray::OpaqueJSPropertyNameArray): - (JSObjectCopyPropertyNames): - * JavaScriptCore.exp: - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::CodeGenerator): - (KJS::CodeGenerator::registerForLocal): - (KJS::CodeGenerator::isLocal): - (KJS::CodeGenerator::addConstant): - (KJS::CodeGenerator::findScopedProperty): - * VM/CodeGenerator.h: - (KJS::CodeGenerator::globalData): - (KJS::CodeGenerator::propertyNames): - * VM/JSPropertyNameIterator.cpp: - (KJS::JSPropertyNameIterator::create): - * VM/Machine.cpp: - (KJS::Machine::throwException): - (KJS::Machine::privateExecute): - * kjs/ArrayPrototype.cpp: - (KJS::ArrayConstructor::ArrayConstructor): - * kjs/BooleanObject.cpp: - (KJS::BooleanConstructor::BooleanConstructor): - * kjs/FunctionPrototype.cpp: - (KJS::FunctionConstructor::FunctionConstructor): - (KJS::FunctionConstructor::construct): - * kjs/JSArray.cpp: - (KJS::JSArray::inlineGetOwnPropertySlot): - (KJS::JSArray::put): - (KJS::JSArray::deleteProperty): - (KJS::JSArray::getPropertyNames): - * kjs/JSFunction.cpp: - (KJS::Arguments::Arguments): - * kjs/JSGlobalData.cpp: - (KJS::JSGlobalData::JSGlobalData): - * kjs/JSGlobalObject.cpp: - (KJS::JSGlobalObject::reset): - * kjs/JSObject.cpp: - (KJS::JSObject::getOwnPropertySlot): - (KJS::JSObject::put): - (KJS::JSObject::putWithAttributes): - (KJS::JSObject::deleteProperty): - (KJS::JSObject::findPropertyHashEntry): - (KJS::JSObject::getPropertyNames): - (KJS::Error::create): - * kjs/JSVariableObject.cpp: - (KJS::JSVariableObject::getPropertyNames): - * kjs/NumberObject.cpp: - (KJS::NumberConstructor::NumberConstructor): - * kjs/PropertyNameArray.cpp: - (KJS::PropertyNameArray::add): - * kjs/PropertyNameArray.h: - (KJS::PropertyNameArray::PropertyNameArray): - (KJS::PropertyNameArray::addKnownUnique): - * kjs/PropertySlot.h: - (KJS::PropertySlot::getValue): - * kjs/RegExpObject.cpp: - (KJS::RegExpConstructor::RegExpConstructor): - * kjs/ScopeChain.cpp: - (KJS::ScopeChainNode::print): - * kjs/Shell.cpp: - (GlobalObject::GlobalObject): - * kjs/date_object.cpp: - (KJS::DateConstructor::DateConstructor): - * kjs/error_object.cpp: - (KJS::ErrorConstructor::ErrorConstructor): - (KJS::NativeErrorConstructor::NativeErrorConstructor): - * kjs/grammar.y: - * kjs/identifier.cpp: - (KJS::Identifier::add): - (KJS::Identifier::addSlowCase): - * kjs/identifier.h: - (KJS::Identifier::Identifier): - (KJS::Identifier::from): - (KJS::Identifier::equal): - (KJS::Identifier::add): - (KJS::operator==): - (KJS::operator!=): - * kjs/internal.cpp: - (KJS::JSString::getOwnPropertySlot): - * kjs/lexer.cpp: - (KJS::Lexer::Lexer): - (KJS::Lexer::lex): - (KJS::Lexer::makeIdentifier): - * kjs/lexer.h: - * kjs/lookup.cpp: - (KJS::HashTable::createTable): - * kjs/lookup.h: - (KJS::HashTable::initializeIfNeeded): - (KJS::HashTable::entry): - (KJS::getStaticPropertySlot): - (KJS::getStaticFunctionSlot): - (KJS::getStaticValueSlot): - (KJS::lookupPut): - * kjs/object_object.cpp: - (KJS::objectProtoFuncHasOwnProperty): - (KJS::objectProtoFuncDefineGetter): - (KJS::objectProtoFuncDefineSetter): - (KJS::objectProtoFuncLookupGetter): - (KJS::objectProtoFuncLookupSetter): - (KJS::objectProtoFuncPropertyIsEnumerable): - (KJS::ObjectConstructor::ObjectConstructor): - * kjs/string_object.cpp: - (KJS::StringObject::getOwnPropertySlot): - (KJS::StringObject::getPropertyNames): - (KJS::StringConstructor::StringConstructor): - Just pass ExecState or JSGlobalData everywhere. Identifier construction is now always - explicit. - - * kjs/nodes.cpp: (KJS::RegExpNode::emitCode): Here, Identifier was created from a non-literal - char*, which was incorrect, as that uses the pointer value as a key. - -2008-06-16 Thiago Macieira - - Reviewed by Darin. - - https://bugs.webkit.org/show_bug.cgi?id=19577 - - Fix compilation in C++ environments where C99 headers are not present - - The stdbool.h header is a C99 feature, defining the "_Bool" type as well as the - "true" and "false" constants. But it's completely unnecessary in C++ as the - language already defines the "bool" type and its two values. - - * API/JSBase.h: - * API/JSContextRef.h: - * API/JSObjectRef.h: - * API/JSStringRef.h: - * API/JSValueRef.h: - -2008-06-16 Kevin McCullough - - Reviewed by John. - - JSProfiler: %s are incorrect if you exclude a - top level node like (idle) - - * profiler/Profile.cpp: - (KJS::Profile::focus): - (KJS::Profile::exclude): Subtract the selfTime from the totalTime of the - head since its self time will only be non-zero when one of its children - were excluded. Since the head's totalTime is used to calculate %s when - its totalTime is the same as the sum of all its visible childrens' times - their %s will sum to 100%. - -2008-06-16 Kevin McCullough - - Reviewed by Sam Weinig. - - JSProfiler: Remove the recursion limit in the profiler. - - * profiler/Profile.cpp: - (KJS::Profile::willExecute): - -2008-06-16 Kevin McCullough - - Reviewed by Sam. - - JSProfiler: Remove the recursion limit in the - profiler. - - Remove the last of the uses of recursion in the profiler. - - * JavaScriptCore.exp: Export the new function's signature. - * profiler/Profile.cpp: - (KJS::calculateVisibleTotalTime): Added a new static method for - recalculating the visibleTotalTime of methods after focus has changed - which are visible. - (KJS::stopProfiling): - (KJS::Profile::focus): Implemented focus without recursion. - * profiler/Profile.h: Moved implementation into the definition file. - * profiler/ProfileNode.cpp: - (KJS::ProfileNode::traverseNextNodePreOrder): Added an argument for - whether or not to process the children nodes, this allows focus to skip - sub trees which have been set as not visible. - (KJS::ProfileNode::calculateVisibleTotalTime): This function set's a - node's total visible time to the sum of its self time and its children's - total times. - (KJS::ProfileNode::focus): Implemented focus without recursion. - * profiler/ProfileNode.h: - (KJS::CallIdentifier::operator!= ): - (KJS::ProfileNode::setActualTotalTime): Expanded setting the total time - so that focus could modify only the visible total time. - (KJS::ProfileNode::setVisibleTotalTime): - -2008-06-16 Christian Dywan - - Reviewed by Sam. - - https://bugs.webkit.org/show_bug.cgi?id=19552 - JavaScriptCore headers use C++ style comments - - Replace all C++ style comments with C style multiline - comments and remove all "mode" lines. - - * API/JSBase.h: - * API/JSClassRef.h: - * API/JSContextRef.h: - * API/JSObjectRef.h: - * API/JSStringRef.h: - * API/JSStringRefBSTR.h: - * API/JSStringRefCF.h: - * API/JSValueRef.h: - * API/JavaScript.h: - * API/JavaScriptCore.h: - -2008-06-16 Christian Dywan - - Reviewed by Sam. - - https://bugs.webkit.org/show_bug.cgi?id=19557 - (JavaScriptCore) minidom uses C++ style comments - - Use only C style comments in minidom sources - - * API/JSNode.c: - (JSNode_appendChild): - (JSNode_removeChild): - * API/JSNode.h: - * API/JSNodeList.c: - (JSNodeList_getProperty): - * API/JSNodeList.h: - * API/Node.c: - * API/Node.h: - * API/NodeList.c: - (NodeList_new): - (NodeList_item): - * API/NodeList.h: - * API/minidom.c: - (createStringWithContentsOfFile): - * wtf/Assertions.h: - * wtf/UnusedParam.h: - -2008-06-16 Adriaan de Groot - - Reviewed by Simon. - - Fix compilation on Solaris - - On some systems, munmap takes a char* instead of a void* (contrary to POSIX and - Single Unix Specification). Since you can always convert from char* to void* - but not vice-versa, do the casting to char*. - - * kjs/collector.cpp: - (KJS::allocateBlock): - (KJS::freeBlock): - -2008-06-16 Cameron Zwarich - - Reviewed by Maciej. - - Make a UnaryOpNode class to reduce boilerplate code for UnaryPlusNode, - NegateNode, BitwiseNotNode, and LogicalNotNode. - - * VM/CodeGenerator.h: - (KJS::CodeGenerator::emitToJSNumber): - * kjs/nodes.cpp: - (KJS::UnaryOpNode::emitCode): - * kjs/nodes.h: - (KJS::UnaryOpNode::UnaryOpNode): - (KJS::UnaryPlusNode::): - (KJS::NegateNode::): - (KJS::NegateNode::precedence): - (KJS::BitwiseNotNode::): - (KJS::BitwiseNotNode::precedence): - (KJS::LogicalNotNode::): - (KJS::LogicalNotNode::precedence): - -2008-06-16 Jan Michael Alonzo - - Gtk build fix - - * GNUmakefile.am: - -2008-06-15 Darin Adler - - - rename KJS::List to KJS::ArgList - - * API/JSCallbackConstructor.cpp: - (KJS::JSCallbackConstructor::construct): - * API/JSCallbackConstructor.h: - * API/JSCallbackFunction.cpp: - (KJS::JSCallbackFunction::callAsFunction): - * API/JSCallbackFunction.h: - * API/JSCallbackObject.h: - * API/JSCallbackObjectFunctions.h: - (KJS::::construct): - (KJS::::callAsFunction): - * API/JSObjectRef.cpp: - (JSObjectMakeFunction): - (JSObjectCallAsFunction): - (JSObjectCallAsConstructor): - * JavaScriptCore.exp: - * VM/Machine.cpp: - (KJS::Machine::execute): - (KJS::Machine::privateExecute): - * VM/Machine.h: - * kjs/ArrayPrototype.cpp: - (KJS::arrayProtoFuncToString): - (KJS::arrayProtoFuncToLocaleString): - (KJS::arrayProtoFuncJoin): - (KJS::arrayProtoFuncConcat): - (KJS::arrayProtoFuncPop): - (KJS::arrayProtoFuncPush): - (KJS::arrayProtoFuncReverse): - (KJS::arrayProtoFuncShift): - (KJS::arrayProtoFuncSlice): - (KJS::arrayProtoFuncSort): - (KJS::arrayProtoFuncSplice): - (KJS::arrayProtoFuncUnShift): - (KJS::arrayProtoFuncFilter): - (KJS::arrayProtoFuncMap): - (KJS::arrayProtoFuncEvery): - (KJS::arrayProtoFuncForEach): - (KJS::arrayProtoFuncSome): - (KJS::arrayProtoFuncIndexOf): - (KJS::arrayProtoFuncLastIndexOf): - (KJS::ArrayConstructor::construct): - (KJS::ArrayConstructor::callAsFunction): - * kjs/ArrayPrototype.h: - * kjs/BooleanObject.cpp: - (KJS::booleanProtoFuncToString): - (KJS::booleanProtoFuncValueOf): - (KJS::BooleanConstructor::construct): - (KJS::BooleanConstructor::callAsFunction): - * kjs/BooleanObject.h: - * kjs/CommonIdentifiers.h: - * kjs/ExecState.h: - (KJS::ExecState::emptyList): - * kjs/FunctionPrototype.cpp: - (KJS::FunctionPrototype::callAsFunction): - (KJS::functionProtoFuncToString): - (KJS::functionProtoFuncApply): - (KJS::functionProtoFuncCall): - (KJS::FunctionConstructor::construct): - (KJS::FunctionConstructor::callAsFunction): - * kjs/FunctionPrototype.h: - * kjs/JSActivation.cpp: - (KJS::JSActivation::createArgumentsObject): - * kjs/JSArray.cpp: - (KJS::JSArray::JSArray): - (KJS::AVLTreeAbstractorForArrayCompare::compare_key_key): - * kjs/JSArray.h: - * kjs/JSFunction.cpp: - (KJS::JSFunction::callAsFunction): - (KJS::JSFunction::construct): - (KJS::IndexToNameMap::IndexToNameMap): - (KJS::Arguments::Arguments): - (KJS::encode): - (KJS::decode): - (KJS::globalFuncEval): - (KJS::globalFuncParseInt): - (KJS::globalFuncParseFloat): - (KJS::globalFuncIsNaN): - (KJS::globalFuncIsFinite): - (KJS::globalFuncDecodeURI): - (KJS::globalFuncDecodeURIComponent): - (KJS::globalFuncEncodeURI): - (KJS::globalFuncEncodeURIComponent): - (KJS::globalFuncEscape): - (KJS::globalFuncUnescape): - (KJS::globalFuncKJSPrint): - (KJS::PrototypeFunction::callAsFunction): - (KJS::PrototypeReflexiveFunction::callAsFunction): - * kjs/JSFunction.h: - * kjs/JSGlobalData.h: - * kjs/JSImmediate.cpp: - (KJS::JSImmediate::toObject): - * kjs/JSNotAnObject.cpp: - (KJS::JSNotAnObject::construct): - (KJS::JSNotAnObject::callAsFunction): - * kjs/JSNotAnObject.h: - * kjs/JSObject.cpp: - (KJS::JSObject::put): - (KJS::JSObject::construct): - (KJS::JSObject::callAsFunction): - (KJS::Error::create): - * kjs/JSObject.h: - * kjs/MathObject.cpp: - (KJS::mathProtoFuncAbs): - (KJS::mathProtoFuncACos): - (KJS::mathProtoFuncASin): - (KJS::mathProtoFuncATan): - (KJS::mathProtoFuncATan2): - (KJS::mathProtoFuncCeil): - (KJS::mathProtoFuncCos): - (KJS::mathProtoFuncExp): - (KJS::mathProtoFuncFloor): - (KJS::mathProtoFuncLog): - (KJS::mathProtoFuncMax): - (KJS::mathProtoFuncMin): - (KJS::mathProtoFuncPow): - (KJS::mathProtoFuncRandom): - (KJS::mathProtoFuncRound): - (KJS::mathProtoFuncSin): - (KJS::mathProtoFuncSqrt): - (KJS::mathProtoFuncTan): - * kjs/MathObject.h: - * kjs/NumberObject.cpp: - (KJS::numberProtoFuncToString): - (KJS::numberProtoFuncToLocaleString): - (KJS::numberProtoFuncValueOf): - (KJS::numberProtoFuncToFixed): - (KJS::numberProtoFuncToExponential): - (KJS::numberProtoFuncToPrecision): - (KJS::NumberConstructor::construct): - (KJS::NumberConstructor::callAsFunction): - * kjs/NumberObject.h: - * kjs/RegExpObject.cpp: - (KJS::regExpProtoFuncTest): - (KJS::regExpProtoFuncExec): - (KJS::regExpProtoFuncCompile): - (KJS::regExpProtoFuncToString): - (KJS::RegExpObject::match): - (KJS::RegExpObject::test): - (KJS::RegExpObject::exec): - (KJS::RegExpObject::callAsFunction): - (KJS::RegExpConstructor::construct): - (KJS::RegExpConstructor::callAsFunction): - * kjs/RegExpObject.h: - * kjs/Shell.cpp: - (functionPrint): - (functionDebug): - (functionGC): - (functionVersion): - (functionRun): - (functionLoad): - (functionReadline): - (functionQuit): - * kjs/collector.cpp: - (KJS::Collector::collect): - * kjs/collector.h: - (KJS::Collector::markListSet): - * kjs/date_object.cpp: - (KJS::formatLocaleDate): - (KJS::fillStructuresUsingTimeArgs): - (KJS::fillStructuresUsingDateArgs): - (KJS::DateConstructor::construct): - (KJS::DateConstructor::callAsFunction): - (KJS::DateFunction::callAsFunction): - (KJS::dateProtoFuncToString): - (KJS::dateProtoFuncToUTCString): - (KJS::dateProtoFuncToDateString): - (KJS::dateProtoFuncToTimeString): - (KJS::dateProtoFuncToLocaleString): - (KJS::dateProtoFuncToLocaleDateString): - (KJS::dateProtoFuncToLocaleTimeString): - (KJS::dateProtoFuncValueOf): - (KJS::dateProtoFuncGetTime): - (KJS::dateProtoFuncGetFullYear): - (KJS::dateProtoFuncGetUTCFullYear): - (KJS::dateProtoFuncToGMTString): - (KJS::dateProtoFuncGetMonth): - (KJS::dateProtoFuncGetUTCMonth): - (KJS::dateProtoFuncGetDate): - (KJS::dateProtoFuncGetUTCDate): - (KJS::dateProtoFuncGetDay): - (KJS::dateProtoFuncGetUTCDay): - (KJS::dateProtoFuncGetHours): - (KJS::dateProtoFuncGetUTCHours): - (KJS::dateProtoFuncGetMinutes): - (KJS::dateProtoFuncGetUTCMinutes): - (KJS::dateProtoFuncGetSeconds): - (KJS::dateProtoFuncGetUTCSeconds): - (KJS::dateProtoFuncGetMilliSeconds): - (KJS::dateProtoFuncGetUTCMilliseconds): - (KJS::dateProtoFuncGetTimezoneOffset): - (KJS::dateProtoFuncSetTime): - (KJS::setNewValueFromTimeArgs): - (KJS::setNewValueFromDateArgs): - (KJS::dateProtoFuncSetMilliSeconds): - (KJS::dateProtoFuncSetUTCMilliseconds): - (KJS::dateProtoFuncSetSeconds): - (KJS::dateProtoFuncSetUTCSeconds): - (KJS::dateProtoFuncSetMinutes): - (KJS::dateProtoFuncSetUTCMinutes): - (KJS::dateProtoFuncSetHours): - (KJS::dateProtoFuncSetUTCHours): - (KJS::dateProtoFuncSetDate): - (KJS::dateProtoFuncSetUTCDate): - (KJS::dateProtoFuncSetMonth): - (KJS::dateProtoFuncSetUTCMonth): - (KJS::dateProtoFuncSetFullYear): - (KJS::dateProtoFuncSetUTCFullYear): - (KJS::dateProtoFuncSetYear): - (KJS::dateProtoFuncGetYear): - * kjs/date_object.h: - * kjs/debugger.h: - * kjs/error_object.cpp: - (KJS::errorProtoFuncToString): - (KJS::ErrorConstructor::construct): - (KJS::ErrorConstructor::callAsFunction): - (KJS::NativeErrorConstructor::construct): - (KJS::NativeErrorConstructor::callAsFunction): - * kjs/error_object.h: - * kjs/internal.cpp: - (KJS::JSNumberCell::toObject): - (KJS::JSNumberCell::toThisObject): - * kjs/list.cpp: - (KJS::ArgList::getSlice): - (KJS::ArgList::markLists): - (KJS::ArgList::slowAppend): - * kjs/list.h: - (KJS::ArgList::ArgList): - (KJS::ArgList::~ArgList): - * kjs/object_object.cpp: - (KJS::objectProtoFuncValueOf): - (KJS::objectProtoFuncHasOwnProperty): - (KJS::objectProtoFuncIsPrototypeOf): - (KJS::objectProtoFuncDefineGetter): - (KJS::objectProtoFuncDefineSetter): - (KJS::objectProtoFuncLookupGetter): - (KJS::objectProtoFuncLookupSetter): - (KJS::objectProtoFuncPropertyIsEnumerable): - (KJS::objectProtoFuncToLocaleString): - (KJS::objectProtoFuncToString): - (KJS::ObjectConstructor::construct): - (KJS::ObjectConstructor::callAsFunction): - * kjs/object_object.h: - * kjs/string_object.cpp: - (KJS::replace): - (KJS::stringProtoFuncToString): - (KJS::stringProtoFuncValueOf): - (KJS::stringProtoFuncCharAt): - (KJS::stringProtoFuncCharCodeAt): - (KJS::stringProtoFuncConcat): - (KJS::stringProtoFuncIndexOf): - (KJS::stringProtoFuncLastIndexOf): - (KJS::stringProtoFuncMatch): - (KJS::stringProtoFuncSearch): - (KJS::stringProtoFuncReplace): - (KJS::stringProtoFuncSlice): - (KJS::stringProtoFuncSplit): - (KJS::stringProtoFuncSubstr): - (KJS::stringProtoFuncSubstring): - (KJS::stringProtoFuncToLowerCase): - (KJS::stringProtoFuncToUpperCase): - (KJS::stringProtoFuncToLocaleLowerCase): - (KJS::stringProtoFuncToLocaleUpperCase): - (KJS::stringProtoFuncLocaleCompare): - (KJS::stringProtoFuncBig): - (KJS::stringProtoFuncSmall): - (KJS::stringProtoFuncBlink): - (KJS::stringProtoFuncBold): - (KJS::stringProtoFuncFixed): - (KJS::stringProtoFuncItalics): - (KJS::stringProtoFuncStrike): - (KJS::stringProtoFuncSub): - (KJS::stringProtoFuncSup): - (KJS::stringProtoFuncFontcolor): - (KJS::stringProtoFuncFontsize): - (KJS::stringProtoFuncAnchor): - (KJS::stringProtoFuncLink): - (KJS::StringConstructor::construct): - (KJS::StringConstructor::callAsFunction): - (KJS::StringConstructorFunction::callAsFunction): - * kjs/string_object.h: - -2008-06-15 Darin Adler - - - new names for more JavaScriptCore files - - * API/JSCallbackFunction.cpp: - * API/JSObjectRef.cpp: - * DerivedSources.make: - * GNUmakefile.am: - * JavaScriptCore.exp: - * JavaScriptCore.pri: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - * JavaScriptCoreSources.bkl: - * VM/Machine.cpp: - * kjs/AllInOneFile.cpp: - * kjs/ArrayPrototype.cpp: Copied from JavaScriptCore/kjs/array_object.cpp. - * kjs/ArrayPrototype.h: Copied from JavaScriptCore/kjs/array_object.h. - * kjs/BooleanObject.cpp: Copied from JavaScriptCore/kjs/bool_object.cpp. - * kjs/BooleanObject.h: Copied from JavaScriptCore/kjs/bool_object.h. - * kjs/ExecState.cpp: - * kjs/ExecState.h: - * kjs/FunctionPrototype.cpp: Copied from JavaScriptCore/kjs/function_object.cpp. - * kjs/FunctionPrototype.h: Copied from JavaScriptCore/kjs/function_object.h. - * kjs/JSArray.cpp: Copied from JavaScriptCore/kjs/array_instance.cpp. - * kjs/JSArray.h: Copied from JavaScriptCore/kjs/array_instance.h. - * kjs/JSFunction.cpp: - * kjs/JSFunction.h: - * kjs/JSGlobalObject.cpp: - * kjs/JSImmediate.cpp: - * kjs/JSObject.h: - * kjs/JSString.h: - * kjs/JSValue.h: - * kjs/JSVariableObject.cpp: - * kjs/MathObject.cpp: Copied from JavaScriptCore/kjs/math_object.cpp. - * kjs/MathObject.h: Copied from JavaScriptCore/kjs/math_object.h. - * kjs/NumberObject.cpp: Copied from JavaScriptCore/kjs/number_object.cpp. - * kjs/NumberObject.h: Copied from JavaScriptCore/kjs/number_object.h. - * kjs/PropertyMap.cpp: Copied from JavaScriptCore/kjs/property_map.cpp. - * kjs/PropertyMap.h: Copied from JavaScriptCore/kjs/property_map.h. - * kjs/PropertySlot.cpp: Copied from JavaScriptCore/kjs/property_slot.cpp. - * kjs/PropertySlot.h: Copied from JavaScriptCore/kjs/property_slot.h. - * kjs/RegExpObject.cpp: Copied from JavaScriptCore/kjs/regexp_object.cpp. - * kjs/RegExpObject.h: Copied from JavaScriptCore/kjs/regexp_object.h. - * kjs/ScopeChain.cpp: Copied from JavaScriptCore/kjs/scope_chain.cpp. - * kjs/ScopeChain.h: Copied from JavaScriptCore/kjs/scope_chain.h. - * kjs/ScopeChainMark.h: Copied from JavaScriptCore/kjs/scope_chain_mark.h. - * kjs/Shell.cpp: - * kjs/array_instance.cpp: Removed. - * kjs/array_instance.h: Removed. - * kjs/array_object.cpp: Removed. - * kjs/array_object.h: Removed. - * kjs/bool_object.cpp: Removed. - * kjs/bool_object.h: Removed. - * kjs/error_object.h: - * kjs/function_object.cpp: Removed. - * kjs/function_object.h: Removed. - * kjs/internal.cpp: - * kjs/math_object.cpp: Removed. - * kjs/math_object.h: Removed. - * kjs/nodes.cpp: - * kjs/number_object.cpp: Removed. - * kjs/number_object.h: Removed. - * kjs/object_object.cpp: - * kjs/property_map.cpp: Removed. - * kjs/property_map.h: Removed. - * kjs/property_slot.cpp: Removed. - * kjs/property_slot.h: Removed. - * kjs/regexp_object.cpp: Removed. - * kjs/regexp_object.h: Removed. - * kjs/scope_chain.cpp: Removed. - * kjs/scope_chain.h: Removed. - * kjs/scope_chain_mark.h: Removed. - * kjs/string_object.cpp: - * kjs/string_object.h: - -2008-06-15 Darin Adler - - - new names for a few key JavaScriptCore files - - * API/JSBase.cpp: - * API/JSCallbackConstructor.h: - * API/JSCallbackFunction.cpp: - * API/JSCallbackFunction.h: - * API/JSCallbackObject.h: - * API/JSCallbackObjectFunctions.h: - * API/JSClassRef.h: - * API/JSContextRef.cpp: - * API/JSObjectRef.cpp: - * API/JSStringRef.cpp: - * API/JSStringRefCF.cpp: - * API/JSValueRef.cpp: - * GNUmakefile.am: - * JavaScriptCore.pri: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - * JavaScriptCoreSources.bkl: - * VM/CodeBlock.cpp: - * VM/CodeGenerator.cpp: - * VM/ExceptionHelpers.cpp: - * VM/ExceptionHelpers.h: - * VM/JSPropertyNameIterator.cpp: - * VM/JSPropertyNameIterator.h: - * VM/Machine.cpp: - * kjs/AllInOneFile.cpp: - * kjs/DateMath.cpp: - * kjs/DebuggerCallFrame.cpp: - * kjs/ExecState.cpp: - * kjs/JSActivation.cpp: - * kjs/JSFunction.cpp: Copied from JavaScriptCore/kjs/function.cpp. - * kjs/JSFunction.h: Copied from JavaScriptCore/kjs/function.h. - * kjs/JSImmediate.cpp: - * kjs/JSNotAnObject.h: - * kjs/JSObject.cpp: Copied from JavaScriptCore/kjs/object.cpp. - * kjs/JSObject.h: Copied from JavaScriptCore/kjs/object.h. - * kjs/JSString.h: Copied from JavaScriptCore/kjs/internal.h. - * kjs/JSValue.cpp: Copied from JavaScriptCore/kjs/value.cpp. - * kjs/JSValue.h: Copied from JavaScriptCore/kjs/value.h. - * kjs/JSVariableObject.h: - * kjs/JSWrapperObject.h: - * kjs/Shell.cpp: - * kjs/SymbolTable.h: - * kjs/array_instance.h: - * kjs/collector.cpp: - * kjs/date_object.cpp: - * kjs/date_object.h: - * kjs/error_object.cpp: - * kjs/function.cpp: Removed. - * kjs/function.h: Removed. - * kjs/function_object.cpp: - * kjs/function_object.h: - * kjs/grammar.y: - * kjs/internal.cpp: - * kjs/internal.h: Removed. - * kjs/lexer.cpp: - * kjs/list.h: - * kjs/lookup.h: - * kjs/nodes.h: - * kjs/object.cpp: Removed. - * kjs/object.h: Removed. - * kjs/object_object.h: - * kjs/operations.cpp: - * kjs/property_map.cpp: - * kjs/property_slot.cpp: - * kjs/property_slot.h: - * kjs/protect.h: - * kjs/regexp_object.cpp: - * kjs/scope_chain.cpp: - * kjs/string_object.h: - * kjs/ustring.cpp: - * kjs/value.cpp: Removed. - * kjs/value.h: Removed. - * profiler/Profile.cpp: - * profiler/Profiler.cpp: - -2008-06-15 Darin Adler - - Rubber stamped by Sam. - - - cut down on confusing uses of "Object" and "Imp" in - JavaScriptCore class names - - * API/JSCallbackFunction.cpp: - (KJS::JSCallbackFunction::JSCallbackFunction): - * API/JSCallbackFunction.h: - * VM/Machine.cpp: - (KJS::Machine::privateExecute): - * kjs/ExecState.h: - (KJS::ExecState::regExpTable): - (KJS::ExecState::regExpConstructorTable): - * kjs/JSGlobalData.cpp: - (KJS::JSGlobalData::JSGlobalData): - (KJS::JSGlobalData::~JSGlobalData): - * kjs/JSGlobalData.h: - * kjs/JSGlobalObject.cpp: - (KJS::JSGlobalObject::reset): - * kjs/JSGlobalObject.h: - (KJS::JSGlobalObject::objectConstructor): - (KJS::JSGlobalObject::functionConstructor): - (KJS::JSGlobalObject::arrayConstructor): - (KJS::JSGlobalObject::booleanConstructor): - (KJS::JSGlobalObject::stringConstructor): - (KJS::JSGlobalObject::numberConstructor): - (KJS::JSGlobalObject::dateConstructor): - (KJS::JSGlobalObject::regExpConstructor): - (KJS::JSGlobalObject::errorConstructor): - (KJS::JSGlobalObject::evalErrorConstructor): - (KJS::JSGlobalObject::rangeErrorConstructor): - (KJS::JSGlobalObject::referenceErrorConstructor): - (KJS::JSGlobalObject::syntaxErrorConstructor): - (KJS::JSGlobalObject::typeErrorConstructor): - (KJS::JSGlobalObject::URIErrorConstructor): - * kjs/array_object.cpp: - (KJS::ArrayConstructor::ArrayConstructor): - (KJS::ArrayConstructor::getConstructData): - (KJS::ArrayConstructor::construct): - (KJS::ArrayConstructor::callAsFunction): - * kjs/array_object.h: - * kjs/bool_object.cpp: - (KJS::BooleanObject::BooleanObject): - (KJS::BooleanPrototype::BooleanPrototype): - (KJS::booleanProtoFuncToString): - (KJS::booleanProtoFuncValueOf): - (KJS::BooleanConstructor::BooleanConstructor): - (KJS::BooleanConstructor::getConstructData): - (KJS::BooleanConstructor::construct): - (KJS::BooleanConstructor::callAsFunction): - * kjs/bool_object.h: - * kjs/date_object.cpp: - (KJS::DatePrototype::DatePrototype): - (KJS::DateConstructor::DateConstructor): - (KJS::DateConstructor::getConstructData): - (KJS::DateConstructor::construct): - (KJS::DateConstructor::callAsFunction): - (KJS::DateFunction::DateFunction): - (KJS::DateFunction::callAsFunction): - * kjs/date_object.h: - * kjs/error_object.cpp: - (KJS::ErrorPrototype::ErrorPrototype): - (KJS::ErrorConstructor::ErrorConstructor): - (KJS::ErrorConstructor::getConstructData): - (KJS::ErrorConstructor::construct): - (KJS::ErrorConstructor::callAsFunction): - (KJS::NativeErrorConstructor::NativeErrorConstructor): - (KJS::NativeErrorConstructor::getConstructData): - (KJS::NativeErrorConstructor::construct): - (KJS::NativeErrorConstructor::callAsFunction): - (KJS::NativeErrorConstructor::mark): - * kjs/error_object.h: - * kjs/function.cpp: - (KJS::JSFunction::JSFunction): - (KJS::JSFunction::mark): - (KJS::JSFunction::getOwnPropertySlot): - (KJS::JSFunction::put): - (KJS::JSFunction::deleteProperty): - (KJS::PrototypeFunction::PrototypeFunction): - (KJS::PrototypeReflexiveFunction::PrototypeReflexiveFunction): - (KJS::PrototypeReflexiveFunction::mark): - * kjs/function.h: - * kjs/function_object.cpp: - (KJS::functionProtoFuncToString): - (KJS::FunctionConstructor::FunctionConstructor): - (KJS::FunctionConstructor::getConstructData): - (KJS::FunctionConstructor::construct): - (KJS::FunctionConstructor::callAsFunction): - * kjs/function_object.h: - * kjs/internal.cpp: - (KJS::StringObject::create): - (KJS::JSString::toObject): - (KJS::JSString::toThisObject): - (KJS::JSString::getOwnPropertySlot): - (KJS::InternalFunction::InternalFunction): - (KJS::InternalFunction::getCallData): - (KJS::InternalFunction::implementsHasInstance): - * kjs/math_object.cpp: - (KJS::MathObject::MathObject): - (KJS::MathObject::getOwnPropertySlot): - (KJS::MathObject::getValueProperty): - * kjs/math_object.h: - * kjs/number_object.cpp: - (KJS::NumberObject::NumberObject): - (KJS::NumberPrototype::NumberPrototype): - (KJS::numberProtoFuncToString): - (KJS::numberProtoFuncToLocaleString): - (KJS::numberProtoFuncValueOf): - (KJS::numberProtoFuncToFixed): - (KJS::numberProtoFuncToExponential): - (KJS::numberProtoFuncToPrecision): - (KJS::NumberConstructor::NumberConstructor): - (KJS::NumberConstructor::getOwnPropertySlot): - (KJS::NumberConstructor::getValueProperty): - (KJS::NumberConstructor::getConstructData): - (KJS::NumberConstructor::construct): - (KJS::NumberConstructor::callAsFunction): - * kjs/number_object.h: - * kjs/object.cpp: - (KJS::JSObject::putDirectFunction): - * kjs/object.h: - * kjs/object_object.cpp: - (KJS::ObjectConstructor::ObjectConstructor): - (KJS::ObjectConstructor::getConstructData): - (KJS::ObjectConstructor::construct): - (KJS::ObjectConstructor::callAsFunction): - * kjs/object_object.h: - * kjs/regexp.cpp: - (KJS::RegExp::RegExp): - * kjs/regexp_object.cpp: - (KJS::regExpProtoFuncTest): - (KJS::regExpProtoFuncExec): - (KJS::regExpProtoFuncCompile): - (KJS::regExpProtoFuncToString): - (KJS::RegExpObject::RegExpObject): - (KJS::RegExpObject::~RegExpObject): - (KJS::RegExpObject::getOwnPropertySlot): - (KJS::RegExpObject::getValueProperty): - (KJS::RegExpObject::put): - (KJS::RegExpObject::putValueProperty): - (KJS::RegExpObject::match): - (KJS::RegExpObject::test): - (KJS::RegExpObject::exec): - (KJS::RegExpObject::getCallData): - (KJS::RegExpObject::callAsFunction): - (KJS::RegExpConstructorPrivate::RegExpConstructorPrivate): - (KJS::RegExpConstructor::RegExpConstructor): - (KJS::RegExpConstructor::performMatch): - (KJS::RegExpMatchesArray::RegExpMatchesArray): - (KJS::RegExpMatchesArray::~RegExpMatchesArray): - (KJS::RegExpMatchesArray::fillArrayInstance): - (KJS::RegExpConstructor::arrayOfMatches): - (KJS::RegExpConstructor::getBackref): - (KJS::RegExpConstructor::getLastParen): - (KJS::RegExpConstructor::getLeftContext): - (KJS::RegExpConstructor::getRightContext): - (KJS::RegExpConstructor::getOwnPropertySlot): - (KJS::RegExpConstructor::getValueProperty): - (KJS::RegExpConstructor::put): - (KJS::RegExpConstructor::putValueProperty): - (KJS::RegExpConstructor::getConstructData): - (KJS::RegExpConstructor::construct): - (KJS::RegExpConstructor::callAsFunction): - (KJS::RegExpConstructor::input): - * kjs/regexp_object.h: - * kjs/string_object.cpp: - (KJS::StringObject::StringObject): - (KJS::StringObject::getOwnPropertySlot): - (KJS::StringObject::put): - (KJS::StringObject::deleteProperty): - (KJS::StringObject::getPropertyNames): - (KJS::StringPrototype::StringPrototype): - (KJS::StringPrototype::getOwnPropertySlot): - (KJS::replace): - (KJS::stringProtoFuncToString): - (KJS::stringProtoFuncValueOf): - (KJS::stringProtoFuncCharAt): - (KJS::stringProtoFuncCharCodeAt): - (KJS::stringProtoFuncConcat): - (KJS::stringProtoFuncIndexOf): - (KJS::stringProtoFuncLastIndexOf): - (KJS::stringProtoFuncMatch): - (KJS::stringProtoFuncSearch): - (KJS::stringProtoFuncReplace): - (KJS::stringProtoFuncSlice): - (KJS::stringProtoFuncSplit): - (KJS::stringProtoFuncSubstr): - (KJS::stringProtoFuncSubstring): - (KJS::stringProtoFuncToLowerCase): - (KJS::stringProtoFuncToUpperCase): - (KJS::stringProtoFuncToLocaleLowerCase): - (KJS::stringProtoFuncToLocaleUpperCase): - (KJS::stringProtoFuncLocaleCompare): - (KJS::stringProtoFuncBig): - (KJS::stringProtoFuncSmall): - (KJS::stringProtoFuncBlink): - (KJS::stringProtoFuncBold): - (KJS::stringProtoFuncFixed): - (KJS::stringProtoFuncItalics): - (KJS::stringProtoFuncStrike): - (KJS::stringProtoFuncSub): - (KJS::stringProtoFuncSup): - (KJS::stringProtoFuncFontcolor): - (KJS::stringProtoFuncFontsize): - (KJS::stringProtoFuncAnchor): - (KJS::stringProtoFuncLink): - (KJS::StringConstructor::StringConstructor): - (KJS::StringConstructor::getConstructData): - (KJS::StringConstructor::construct): - (KJS::StringConstructor::callAsFunction): - (KJS::StringConstructorFunction::StringConstructorFunction): - (KJS::StringConstructorFunction::callAsFunction): - * kjs/string_object.h: - (KJS::StringObjectThatMasqueradesAsUndefined::StringObjectThatMasqueradesAsUndefined): - * profiler/Profiler.cpp: - (KJS::createCallIdentifier): - -2008-06-15 Darin Adler - - Rubber stamped by Sam. - - - use JS prefix and simpler names for basic JavaScriptCore types, - to complement JSValue and JSObject - - * JavaScriptCore.exp: - * VM/Machine.cpp: - (KJS::jsLess): - (KJS::jsLessEq): - (KJS::jsAdd): - (KJS::callEval): - (KJS::Machine::execute): - (KJS::Machine::retrieveArguments): - (KJS::Machine::retrieveCaller): - (KJS::Machine::getCallFrame): - (KJS::Machine::getFunctionAndArguments): - * VM/Machine.h: - * VM/Register.h: - * kjs/DebuggerCallFrame.cpp: - (KJS::DebuggerCallFrame::functionName): - * kjs/ExecState.h: - * kjs/JSActivation.cpp: - (KJS::JSActivation::createArgumentsObject): - * kjs/array_instance.cpp: - (KJS::JSArray::checkConsistency): - (KJS::JSArray::JSArray): - (KJS::JSArray::~JSArray): - (KJS::JSArray::getItem): - (KJS::JSArray::lengthGetter): - (KJS::JSArray::inlineGetOwnPropertySlot): - (KJS::JSArray::getOwnPropertySlot): - (KJS::JSArray::put): - (KJS::JSArray::deleteProperty): - (KJS::JSArray::getPropertyNames): - (KJS::JSArray::increaseVectorLength): - (KJS::JSArray::setLength): - (KJS::JSArray::mark): - (KJS::JSArray::sort): - (KJS::JSArray::compactForSorting): - (KJS::JSArray::lazyCreationData): - (KJS::JSArray::setLazyCreationData): - * kjs/array_instance.h: - * kjs/array_object.cpp: - (KJS::ArrayPrototype::ArrayPrototype): - (KJS::ArrayPrototype::getOwnPropertySlot): - (KJS::arrayProtoFuncToString): - (KJS::arrayProtoFuncToLocaleString): - (KJS::arrayProtoFuncConcat): - (KJS::arrayProtoFuncSort): - (KJS::ArrayObjectImp::construct): - * kjs/array_object.h: - * kjs/completion.h: - * kjs/function.cpp: - (KJS::JSFunction::JSFunction): - (KJS::JSFunction::mark): - (KJS::JSFunction::getCallData): - (KJS::JSFunction::callAsFunction): - (KJS::JSFunction::argumentsGetter): - (KJS::JSFunction::callerGetter): - (KJS::JSFunction::lengthGetter): - (KJS::JSFunction::getOwnPropertySlot): - (KJS::JSFunction::put): - (KJS::JSFunction::deleteProperty): - (KJS::JSFunction::getParameterName): - (KJS::JSFunction::getConstructData): - (KJS::JSFunction::construct): - (KJS::IndexToNameMap::IndexToNameMap): - (KJS::Arguments::Arguments): - * kjs/function.h: - * kjs/function_object.cpp: - (KJS::functionProtoFuncToString): - (KJS::functionProtoFuncApply): - (KJS::FunctionObjectImp::construct): - * kjs/internal.cpp: - (KJS::JSString::toPrimitive): - (KJS::JSString::getPrimitiveNumber): - (KJS::JSString::toBoolean): - (KJS::JSString::toNumber): - (KJS::JSString::toString): - (KJS::StringInstance::create): - (KJS::JSString::toObject): - (KJS::JSString::toThisObject): - (KJS::JSString::lengthGetter): - (KJS::JSString::indexGetter): - (KJS::JSString::indexNumericPropertyGetter): - (KJS::JSString::getOwnPropertySlot): - (KJS::JSNumberCell::type): - (KJS::JSNumberCell::toPrimitive): - (KJS::JSNumberCell::getPrimitiveNumber): - (KJS::JSNumberCell::toBoolean): - (KJS::JSNumberCell::toNumber): - (KJS::JSNumberCell::toString): - (KJS::JSNumberCell::toObject): - (KJS::JSNumberCell::toThisObject): - (KJS::JSNumberCell::getUInt32): - (KJS::JSNumberCell::getTruncatedInt32): - (KJS::JSNumberCell::getTruncatedUInt32): - (KJS::GetterSetter::mark): - (KJS::GetterSetter::toPrimitive): - (KJS::GetterSetter::getPrimitiveNumber): - (KJS::GetterSetter::toBoolean): - (KJS::GetterSetter::toNumber): - (KJS::GetterSetter::toString): - (KJS::GetterSetter::toObject): - (KJS::GetterSetter::getOwnPropertySlot): - (KJS::GetterSetter::put): - (KJS::GetterSetter::toThisObject): - * kjs/internal.h: - (KJS::JSString::JSString): - (KJS::JSString::getStringPropertySlot): - * kjs/nodes.cpp: - (KJS::FuncDeclNode::makeFunction): - (KJS::FuncExprNode::makeFunction): - * kjs/nodes.h: - * kjs/object.cpp: - (KJS::JSObject::put): - (KJS::JSObject::deleteProperty): - (KJS::JSObject::defineGetter): - (KJS::JSObject::defineSetter): - (KJS::JSObject::lookupGetter): - (KJS::JSObject::lookupSetter): - (KJS::JSObject::fillGetterPropertySlot): - * kjs/object.h: - (KJS::GetterSetter::GetterSetter): - * kjs/operations.cpp: - (KJS::equal): - (KJS::strictEqual): - * kjs/property_map.cpp: - (KJS::PropertyMap::containsGettersOrSetters): - * kjs/regexp_object.cpp: - (KJS::RegExpMatchesArray::getOwnPropertySlot): - (KJS::RegExpMatchesArray::put): - (KJS::RegExpMatchesArray::deleteProperty): - (KJS::RegExpMatchesArray::getPropertyNames): - (KJS::RegExpMatchesArray::RegExpMatchesArray): - (KJS::RegExpMatchesArray::fillArrayInstance): - * kjs/string_object.cpp: - (KJS::StringInstance::StringInstance): - (KJS::replace): - (KJS::stringProtoFuncReplace): - (KJS::stringProtoFuncToLowerCase): - (KJS::stringProtoFuncToUpperCase): - (KJS::stringProtoFuncToLocaleLowerCase): - (KJS::stringProtoFuncToLocaleUpperCase): - * kjs/string_object.h: - (KJS::StringInstance::internalValue): - * kjs/value.cpp: - (KJS::JSCell::getNumber): - (KJS::JSCell::getString): - (KJS::JSCell::getObject): - (KJS::jsString): - (KJS::jsOwnedString): - * kjs/value.h: - (KJS::JSNumberCell::JSNumberCell): - (KJS::jsNumberCell): - (KJS::JSValue::uncheckedGetNumber): - * profiler/Profiler.cpp: - (KJS::createCallIdentifier): - (KJS::createCallIdentifierFromFunctionImp): - -2008-06-15 Maciej Stachowiak - - Reviewed by Alexey. - - - add emitUnaryOp, emitNullaryOp and emitUnaryOpNoDst; use them - - This removes some boilerplate code and also reduces the number of - places that will need to be changed to do on-demand emit of - loads (and thus support k operands). - - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::emitUnaryOp): - (KJS::CodeGenerator::emitNullaryOp): - (KJS::CodeGenerator::emitUnaryOpNoDst): - (KJS::CodeGenerator::emitPushScope): - * VM/CodeGenerator.h: - (KJS::CodeGenerator::emitNewObject): - (KJS::CodeGenerator::emitNewArray): - (KJS::CodeGenerator::emitNot): - (KJS::CodeGenerator::emitBitNot): - (KJS::CodeGenerator::emitToJSNumber): - (KJS::CodeGenerator::emitNegate): - (KJS::CodeGenerator::emitInstanceOf): - (KJS::CodeGenerator::emitTypeOf): - (KJS::CodeGenerator::emitIn): - (KJS::CodeGenerator::emitReturn): - (KJS::CodeGenerator::emitEnd): - (KJS::CodeGenerator::emitGetPropertyNames): - -2008-06-15 Alp Toker - - Rubber-stamped by Maciej. - - Install 'jsc' application by default. - - * GNUmakefile.am: - -2008-06-15 Maciej Stachowiak - - Reviewed by Oliver. - - - rename testkjs to jsc - - * GNUmakefile.am: - * JavaScriptCore.vcproj/JavaScriptCore.sln: - * JavaScriptCore.vcproj/jsc: Added. - * JavaScriptCore.vcproj/jsc/jsc.vcproj: Copied from JavaScriptCore.vcproj/testkjs/testkjs.vcproj. - * JavaScriptCore.vcproj/testkjs: Removed. - * JavaScriptCore.vcproj/testkjs/testkjs.vcproj: Removed. - * JavaScriptCore.xcodeproj/project.pbxproj: - * jscore.bkl: - * kjs/Shell.cpp: Copied from kjs/testkjs.cpp. - (main): - (printUsageStatement): - (jscmain): - * kjs/jsc.pro: Copied from kjs/testkjs.pro. - * kjs/testkjs.cpp: Removed. - * kjs/testkjs.pro: Removed. - * tests/mozilla/expected.html: - * tests/mozilla/js1_2/Array/tostring_1.js: - * tests/mozilla/js1_2/Array/tostring_2.js: - * tests/mozilla/jsDriver.pl: - -2008-06-15 Cameron Zwarich - - Reviewed by Maciej. - - Mac build fix. - - * JavaScriptCore.xcodeproj/project.pbxproj: - * kjs/nodes.h: - -2008-06-15 Cameron Zwarich - - Reviewed by Maciej. - - Change the spelling of PrecMultiplicitave to PrecMultiplicative. - - * kjs/nodes.h: - (KJS::MultNode::precedence): - (KJS::DivNode::precedence): - (KJS::ModNode::precedence): - -2008-06-15 Cameron Zwarich - - Reviewed by Maciej. - - Remove unused preprocessor macros related to exceptions in the old - interpreter. - - * kjs/nodes.cpp: - -2008-06-15 Cameron Zwarich - - Reviewed by Maciej. - - Bug 19484: More instructions needs to use temporary registers - - - Fix codegen for all binary operations so that temporaries are used if - necessary. This was done by making BinaryOpNode and ReverseBinaryOpNode - subclasses of ExpressionNode, and eliminating the custom emitCode() - methods for the individual node classes. - - This only adds 3 new instructions to SunSpider code, and there is no - difference in SunSpider execution time. - - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::emitBitNot): - (KJS::CodeGenerator::emitBinaryOp): - * VM/CodeGenerator.h: - * kjs/grammar.y: - * kjs/nodes.cpp: - (KJS::PreIncResolveNode::emitCode): - (KJS::PreDecResolveNode::emitCode): - (KJS::BinaryOpNode::emitCode): - (KJS::ReverseBinaryOpNode::emitCode): - (KJS::emitReadModifyAssignment): - (KJS::CaseBlockNode::emitCodeForBlock): - * kjs/nodes.h: - (KJS::BinaryOpNode::BinaryOpNode): - (KJS::ReverseBinaryOpNode::ReverseBinaryOpNode): - (KJS::MultNode::): - (KJS::DivNode::): - (KJS::DivNode::precedence): - (KJS::ModNode::): - (KJS::ModNode::precedence): - (KJS::AddNode::): - (KJS::AddNode::precedence): - (KJS::SubNode::): - (KJS::SubNode::precedence): - (KJS::LeftShiftNode::): - (KJS::LeftShiftNode::precedence): - (KJS::RightShiftNode::): - (KJS::RightShiftNode::precedence): - (KJS::UnsignedRightShiftNode::): - (KJS::UnsignedRightShiftNode::precedence): - (KJS::LessNode::): - (KJS::LessNode::precedence): - (KJS::GreaterNode::): - (KJS::GreaterNode::precedence): - (KJS::LessEqNode::): - (KJS::LessEqNode::precedence): - (KJS::GreaterEqNode::): - (KJS::GreaterEqNode::precedence): - (KJS::InstanceOfNode::): - (KJS::InstanceOfNode::precedence): - (KJS::InNode::): - (KJS::InNode::precedence): - (KJS::EqualNode::): - (KJS::EqualNode::precedence): - (KJS::NotEqualNode::): - (KJS::NotEqualNode::precedence): - (KJS::StrictEqualNode::): - (KJS::StrictEqualNode::precedence): - (KJS::NotStrictEqualNode::): - (KJS::NotStrictEqualNode::precedence): - (KJS::BitAndNode::): - (KJS::BitAndNode::precedence): - (KJS::BitOrNode::): - (KJS::BitOrNode::precedence): - (KJS::BitXOrNode::): - (KJS::BitXOrNode::precedence): - * kjs/nodes2string.cpp: - (KJS::LessNode::streamTo): - (KJS::GreaterNode::streamTo): - (KJS::LessEqNode::streamTo): - (KJS::GreaterEqNode::streamTo): - (KJS::InstanceOfNode::streamTo): - (KJS::InNode::streamTo): - (KJS::EqualNode::streamTo): - (KJS::NotEqualNode::streamTo): - (KJS::StrictEqualNode::streamTo): - (KJS::NotStrictEqualNode::streamTo): - (KJS::BitAndNode::streamTo): - (KJS::BitXOrNode::streamTo): - (KJS::BitOrNode::streamTo): - -2008-06-14 Darin Adler - - Rubber stamped by Sam. - - - rename a bunch of local symbols within the regular expression code to - follow our usual coding style, and do a few other name tweaks - - * pcre/pcre_compile.cpp: - (CompileData::CompileData): - (checkEscape): - (readRepeatCounts): - (compileBranch): - (compileBracket): - (calculateCompiledPatternLength): - (returnError): - (jsRegExpCompile): - * pcre/pcre_exec.cpp: - (MatchStack::MatchStack): - (MatchStack::canUseStackBufferForNextFrame): - (MatchStack::popCurrentFrame): - (match): - (tryFirstByteOptimization): - (tryRequiredByteOptimization): - (jsRegExpExecute): - * pcre/pcre_internal.h: - -2008-06-14 Cameron Zwarich - - Reviewed by Darin. - - Remove redundant uses of get(). - - * kjs/nodes.cpp: - (KJS::BracketAccessorNode::emitCode): - (KJS::AddNode::emitCode): - (KJS::SubNode::emitCode): - (KJS::ReadModifyResolveNode::emitCode): - (KJS::AssignDotNode::emitCode): - (KJS::ReadModifyDotNode::emitCode): - (KJS::AssignBracketNode::emitCode): - (KJS::ReadModifyBracketNode::emitCode): - -2008-06-14 Cameron Zwarich - - Reviewed by Maciej. - - Make code generation not use a temporary for the left-hand side of an - expression if the right-hand side is a local variable. - - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::isLocal): - * VM/CodeGenerator.h: - (KJS::CodeGenerator::leftHandSideNeedsCopy): - (KJS::CodeGenerator::emitNodeForLeftHandSide): - * kjs/nodes.cpp: - (KJS::ResolveNode::isPure): - (KJS::BracketAccessorNode::emitCode): - (KJS::AddNode::emitCode): - (KJS::SubNode::emitCode): - (KJS::ReadModifyResolveNode::emitCode): - (KJS::AssignDotNode::emitCode): - (KJS::ReadModifyDotNode::emitCode): - (KJS::AssignBracketNode::emitCode): - (KJS::ReadModifyBracketNode::emitCode): - * kjs/nodes.h: - (KJS::ExpressionNode::): - (KJS::BooleanNode::): - (KJS::NumberNode::): - (KJS::StringNode::): - -2008-06-14 Darin Adler - - Reviewed by Sam. - - - more of https://bugs.webkit.org/show_bug.cgi?id=17257 - start ref counts at 1 instead of 0 for speed - - * kjs/nodes.cpp: - (KJS::ParserRefCounted::hasOneRef): Added. Replaces refcount. - * kjs/nodes.h: Replaced refcount with hasOneRef. - - * wtf/ListRefPtr.h: - (WTF::ListRefPtr::~ListRefPtr): Changed to use hasOneRef instead of - refcount, so this class can be used with the RefCounted template. - - * wtf/RefCounted.h: - (WTF::RefCounted::hasOneRef): Made const, since there's no reason for - it to be non-const. - -2008-06-14 Maciej Stachowiak - - Reviewed by Oliver. - - - initialize local vars as side effect of call instead of in bytecode - 1.004x speedup on SunSpider. - - This removes just the dispatch overhead for these loads - in the - future, dead store elimination might be able to eliminate them - entirely. - - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::CodeGenerator): For function blocks, don't - emit loads of undefined for var initialization. - * VM/Machine.cpp: - (KJS::slideRegisterWindowForCall): Instead, initialize locals - as part of the call. - -2008-06-14 Cameron Zwarich - - Reviewed by Oliver. - - Remove helper functions in the parser that are no longer needed. - - * kjs/grammar.y: - -2008-06-14 Cameron Zwarich - - Reviewed by Oliver. - - Bug 19484: More instructions needs to use temporary registers - - - Make code generation for AddNode and SubNode use temporaries when - necessary. - - * kjs/grammar.y: - * kjs/nodes.cpp: - (KJS::AddNode::emitCode): - (KJS::SubNode::emitCode): - * kjs/nodes.h: - (KJS::AddNode::): - (KJS::SubNode::): - -2008-06-13 Cameron Zwarich - - Reviewed by Maciej. - - Combine TrueNode and FalseNode to make BooleanNode, and remove the - unused class PlaceholderTrueNode. - - * kjs/grammar.y: - * kjs/nodes.cpp: - (KJS::BooleanNode::emitCode): - * kjs/nodes.h: - (KJS::BooleanNode::): - (KJS::BooleanNode::precedence): - * kjs/nodes2string.cpp: - (KJS::BooleanNode::streamTo): - -2008-06-13 Cameron Zwarich - - Reviewed by Maciej. - - Eliminate the use of temporaries to store the left hand side of an - expression when the right hand side is a constant. This slightly - improves the generated bytecode for a few SunSpider tests, but it is - mostly in preparation for fixing - - Bug 19484: More instructions needs to use temporary registers - - - * VM/CodeGenerator.h: - (KJS::CodeGenerator::leftHandSideNeedsCopy): - (KJS::CodeGenerator::emitNodeForLeftHandSide): - * kjs/nodes.cpp: - (KJS::BracketAccessorNode::emitCode): - (KJS::ReadModifyResolveNode::emitCode): - (KJS::AssignDotNode::emitCode): - (KJS::ReadModifyDotNode::emitCode): - (KJS::AssignBracketNode::emitCode): - (KJS::ReadModifyBracketNode::emitCode): - * kjs/nodes.h: - (KJS::ExpressionNode::): - (KJS::FalseNode::): - (KJS::TrueNode::): - (KJS::NumberNode::): - (KJS::StringNode::): - -2008-06-13 Maciej Stachowiak - - Reviewed by Oliver. - - - prettify opcode stats output - - I changed things to be a bit more aligned, also there is a new - section listing most common opcodes and most common sequences that - include them. - - * VM/Opcode.cpp: - (KJS::OpcodeStats::~OpcodeStats): - * VM/Opcode.h: - -2008-06-13 Kevin McCullough - - Reviewed by Geoff. - - JSProfiler: Remove the recursion limit in the - profiler. - - Remove recursion from exclude(). This leaves only focus() to fix. - - * JavaScriptCore.exp: Change the signatures of the exported functions. - * profiler/Profile.cpp: - (KJS::Profile::forEach): I added a traverseNextNodePreOrder() function - and so needed to distinguish the other function by labeling it - traverseNextNodePostOrder(). - (KJS::Profile::exclude): All new exclude that iteratively walks the tree - * profiler/Profile.h: - (KJS::Profile::focus): Add a null check for m_head. - * profiler/ProfileNode.cpp: - (KJS::ProfileNode::traverseNextNodePostOrder): Renamed - (KJS::ProfileNode::traverseNextNodePreOrder): Walks the tree in pre- - order, where the parent is processed before the children. - (KJS::ProfileNode::setTreeVisible): Iterate over the sub-tree and set - all of the nodes visible value. This changes another function that used - recursion. - (KJS::ProfileNode::exclude): Remove recursion from this function. - Because we now check for m_visible and we are walking the tree in pre- - order we do not need to check if an excluded node is in an excluded - sub-tree. - * profiler/ProfileNode.h: Added specific selfTime functions to - facilitate exclude(). - (KJS::ProfileNode::setSelfTime): - (KJS::ProfileNode::setActualSelfTime): - (KJS::ProfileNode::setVisibleSelfTime): - -2008-06-12 Darin Adler - - Reviewed by Maciej. - - - https://bugs.webkit.org/show_bug.cgi?id=19434 - speed up SunSpider by avoiding some string boxing - - Speeds up SunSpider by 1.1%. - - Optimized code path for getting built-in properties from strings -- avoid - boxing with a string object in that case. We can make further changes to avoid - even more boxing, but this change alone is a win. - - * API/JSCallbackObjectFunctions.h: - (KJS::JSCallbackObject::staticValueGetter): Use isObject instead of inherits - in asssert, since the type of slotBase() is now JSValue, not JSObject. - (KJS::JSCallbackObject::staticFunctionGetter): Ditto. - (KJS::JSCallbackObject::callbackGetter): Ditto. - - * kjs/internal.cpp: - (KJS::StringImp::getPrimitiveNumber): Updated for change of data member name. - (KJS::StringImp::toBoolean): Ditto. - (KJS::StringImp::toNumber): Ditto. - (KJS::StringImp::toString): Ditto. - (KJS::StringInstance::create): Added; avoids a bit of cut and paste code. - (KJS::StringImp::toObject): Use StringInstance::create. - (KJS::StringImp::toThisObject): Ditto. - (KJS::StringImp::lengthGetter): Added. Replaces the getter that used to live in - the StringInstance class. - (KJS::StringImp::indexGetter): Ditto. - (KJS::StringImp::indexNumericPropertyGetter): Ditto. - (KJS::StringImp::getOwnPropertySlot): Added. Deals with built in properties of - the string class without creating a StringInstance. - - * kjs/internal.h: - (KJS::StringImp::getStringPropertySlot): Added. To be used by both the string - and string object getOwnPropertySlot function. - - * kjs/lookup.h: - (KJS::staticFunctionGetter): Updated since slotBase() is now a JSValue rather - than a JSObject. - - * kjs/object.h: Removed PropertySlot::slotBase() function, which can now move - back into property_slot.h where it belongs since it doesn't have to cast to - JSObject*. - - * kjs/property_slot.cpp: - (KJS::PropertySlot::functionGetter): Updated since slot.slotBase() is now a JSValue* - instead of JSObject*. setGetterSlot still guarantees the base is a JSObject*. - * kjs/property_slot.h: - (KJS::PropertySlot::PropertySlot): Changed base to JSValue* intead of JSCell*. - (KJS::PropertySlot::setStaticEntry): Ditto. - (KJS::PropertySlot::setCustom): Ditto. - (KJS::PropertySlot::setCustomIndex): Ditto. - (KJS::PropertySlot::setCustomNumeric): Ditto. - (KJS::PropertySlot::slotBase): Moved inline here since it no longer involves a - downcast to JSObject*. - (KJS::PropertySlot::setBase): Changed to JSValue*. - - * kjs/string_object.cpp: - (KJS::StringInstance::getOwnPropertySlot): Changed to use getStringPropertySlot - instead of coding the properties here. This allows sharing the code with StringImp. - - * kjs/string_object.h: Removed inlineGetOwnPropertySlot, lengthGetter, and indexGetter. - Made one of the constructors protected. - - * kjs/value.h: Made getOwnPropertySlot private in the JSCell class -- this is better - since it's not the real JSObject getOwnPropertySlot semantic and most callers shouldn't - use it. - -2008-06-12 Alexey Proskuryakov - - Reviewed by Maciej. - - Preparation to making JavaScript heap per-thread. - - * kjs/collector.cpp: - (KJS::Collector::collect): - * kjs/collector.h: - (KJS::Collector::markListSet): - The collector now holds the list of protected lists itself, to be made per-instance. - - * kjs/list.h: Changed to hold a pointer to a mark set this list is in, if any. - (KJS::List::List): Explicitly initialize m_size with zero, as m_vector.size() is - guaranteed to be such anyway. - (KJS::List::append): Changed the fast case to only be executed as long as inline buffer - is used, because otherwise, we now do more expensive checks. - - * kjs/list.cpp: - (KJS::List::markLists): Renamed from markProtectedListsSlowCase, made it take the list set - as a parameter. - (KJS::List::slowAppend): If a non-immediate value is appended, the list needs to be added - to an appropriate Heap's protected list. For now, a static Collector::markListSet() is - used, but the code is layed out in preparation to making the switch to multiple heaps. - - * JavaScriptCore.exp: Updated export list. - -2008-06-12 Cameron Zwarich - - Reviewed by Maciej. - - Bug 19510: CodeBlock::needsFullScopeChain not always set for global code - - - This fixes the symptoms by using CodeGenerator::m_codeType to determine - when to use temporaries instead of CodeBlock::needsFullScopeChain, but - it does not fix the problem itself. - - * VM/CodeGenerator.h: - (KJS::CodeGenerator::leftHandSideNeedsCopy): - -2008-06-11 Cameron Zwarich - - Reviewed by Maciej. - - Bug 19498: REGRESSION (r34497): crash while loading GMail - - - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::emitJumpIfTrueMayCombine): - (KJS::CodeGenerator::emitJumpIfTrue): - * VM/CodeGenerator.h: - * kjs/nodes.cpp: - (KJS::DoWhileNode::emitCode): - (KJS::WhileNode::emitCode): - (KJS::ForNode::emitCode): - (KJS::CaseBlockNode::emitCodeForBlock): - -2008-06-11 Darin Adler - - Reviewed by Maciej. - - - a little bit of cleanup and prep for some upcoming optimizations - - * JavaScriptCore.exp: Re-sorted this file (with sort command line tool). - * VM/CodeBlock.cpp: - (KJS::CodeBlock::dump): Fixed printf to avoid warnings -- to use %lu we - need to make sure the type is unsigned long. - * kjs/object.cpp: - (KJS::Error::create): Eliminated unused error names array, and also put - the strings into the code since there was already a switch statment. - This also avoids having to contemplate a hypothetical access past the - end of the array. - * kjs/object.h: Got rid of errorNames. - * kjs/property_slot.cpp: Deleted unused ungettableGetter. - * kjs/property_slot.h: Ditto. - * wtf/AlwaysInline.h: Added LIKELY alongside UNLIKELY. - -2008-06-11 Cameron Zwarich - - Reviewed by Darin. - - Bug 19457: Create fused opcodes for tests and conditional jumps - - - Add a new jless instruction, and modify the code generator to emit it - instead of the pair (less, jtrue). - - Gives a 3.6% improvement on SunSpider. - - * VM/CodeBlock.cpp: - (KJS::CodeBlock::dump): - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::CodeGenerator): - (KJS::CodeGenerator::emitOpcode): - (KJS::CodeGenerator::retrieveLastBinaryOp): - (KJS::CodeGenerator::rewindBinaryOp): - (KJS::CodeGenerator::emitJump): - (KJS::CodeGenerator::emitJumpIfTrue): - (KJS::CodeGenerator::emitJumpIfFalse): - (KJS::CodeGenerator::emitMove): - (KJS::CodeGenerator::emitNot): - (KJS::CodeGenerator::emitEqual): - (KJS::CodeGenerator::emitNotEqual): - (KJS::CodeGenerator::emitStrictEqual): - (KJS::CodeGenerator::emitNotStrictEqual): - (KJS::CodeGenerator::emitLess): - (KJS::CodeGenerator::emitLessEq): - (KJS::CodeGenerator::emitPreInc): - (KJS::CodeGenerator::emitPreDec): - (KJS::CodeGenerator::emitPostInc): - (KJS::CodeGenerator::emitPostDec): - (KJS::CodeGenerator::emitToJSNumber): - (KJS::CodeGenerator::emitNegate): - (KJS::CodeGenerator::emitAdd): - (KJS::CodeGenerator::emitMul): - (KJS::CodeGenerator::emitDiv): - (KJS::CodeGenerator::emitMod): - (KJS::CodeGenerator::emitSub): - (KJS::CodeGenerator::emitLeftShift): - (KJS::CodeGenerator::emitRightShift): - (KJS::CodeGenerator::emitUnsignedRightShift): - (KJS::CodeGenerator::emitBitAnd): - (KJS::CodeGenerator::emitBitXOr): - (KJS::CodeGenerator::emitBitOr): - (KJS::CodeGenerator::emitBitNot): - (KJS::CodeGenerator::emitInstanceOf): - (KJS::CodeGenerator::emitTypeOf): - (KJS::CodeGenerator::emitIn): - (KJS::CodeGenerator::emitLoad): - (KJS::CodeGenerator::emitNewObject): - (KJS::CodeGenerator::emitNewArray): - (KJS::CodeGenerator::emitResolve): - (KJS::CodeGenerator::emitGetScopedVar): - (KJS::CodeGenerator::emitPutScopedVar): - (KJS::CodeGenerator::emitResolveBase): - (KJS::CodeGenerator::emitResolveWithBase): - (KJS::CodeGenerator::emitResolveFunction): - (KJS::CodeGenerator::emitGetById): - (KJS::CodeGenerator::emitPutById): - (KJS::CodeGenerator::emitPutGetter): - (KJS::CodeGenerator::emitPutSetter): - (KJS::CodeGenerator::emitDeleteById): - (KJS::CodeGenerator::emitGetByVal): - (KJS::CodeGenerator::emitPutByVal): - (KJS::CodeGenerator::emitDeleteByVal): - (KJS::CodeGenerator::emitPutByIndex): - (KJS::CodeGenerator::emitNewFunction): - (KJS::CodeGenerator::emitNewRegExp): - (KJS::CodeGenerator::emitNewFunctionExpression): - (KJS::CodeGenerator::emitCall): - (KJS::CodeGenerator::emitReturn): - (KJS::CodeGenerator::emitEnd): - (KJS::CodeGenerator::emitConstruct): - (KJS::CodeGenerator::emitPushScope): - (KJS::CodeGenerator::emitPopScope): - (KJS::CodeGenerator::emitDebugHook): - (KJS::CodeGenerator::emitComplexJumpScopes): - (KJS::CodeGenerator::emitJumpScopes): - (KJS::CodeGenerator::emitNextPropertyName): - (KJS::CodeGenerator::emitGetPropertyNames): - (KJS::CodeGenerator::emitCatch): - (KJS::CodeGenerator::emitThrow): - (KJS::CodeGenerator::emitNewError): - (KJS::CodeGenerator::emitJumpSubroutine): - (KJS::CodeGenerator::emitSubroutineReturn): - * VM/CodeGenerator.h: - * VM/Machine.cpp: - (KJS::Machine::privateExecute): - * VM/Opcode.cpp: - * VM/Opcode.h: - -2008-06-11 Darin Adler - - Reviewed by Alexey. - - - fix https://bugs.webkit.org/show_bug.cgi?id=19442 - JavaScript array implementation doesn't maintain m_numValuesInVector when sorting - - * kjs/array_instance.cpp: - (KJS::ArrayInstance::checkConsistency): Added. Empty inline version for when - consistency checks are turned off. - (KJS::ArrayInstance::ArrayInstance): Check consistency after construction. - (KJS::ArrayInstance::~ArrayInstance): Check consistency before destruction. - (KJS::ArrayInstance::put): Check consistency before and after. - (KJS::ArrayInstance::deleteProperty): Ditto. - (KJS::ArrayInstance::setLength): Ditto. - (KJS::compareByStringPairForQSort): Use typedef for clarity. - (KJS::ArrayInstance::sort): Check consistency before and after. Also broke the loop - to set up sorting into two separate passes. Added FIXMEs about various exception - safety issues. Added code to set m_numValuesInVector after sorting. - (KJS::ArrayInstance::compactForSorting): Ditto. - - * kjs/array_instance.h: Added a definition of an enum for the types of consistency - check and a declaration of the consistency checking function. - -2008-06-10 Kevin Ollivier - - wx build fix. Link against libedit on Mac since HAVE(READLINE) is defined there. - - * jscore.bkl: - -2008-06-10 Alexey Proskuryakov - - Reviewed by Darin. - - https://bugs.webkit.org/show_bug.cgi?id=16503 - match limit takes at least 13% of the time on the SunSpider regexp-dna test - - Make the limit test slightly more efficient. It is not clear how much of a win it is, - as the improvement on regexp-dna varies from 2.3% to 0.6% depending on what revision I - apply the patch to. Today, the win on regexp-dna was minimal, but the total win was whopping - 0.5%, due to random code generation changes. - - * pcre/pcre_exec.cpp: (match): Avoid loading a constant on each iteration. - -2008-06-09 Alp Toker - - gcc3/autotools build fix. Add explicit -O2 -fno-strict-aliasing to - each of the tools since these are no longer set globally. - - * GNUmakefile.am: - -2008-06-09 Cameron Zwarich - - Reviewed by Sam. - - Add an include for readline/history.h to fix the build for Darwin users - with the GNU readline library installed. Also, clean up the style of - the HAVE(READLINE) check. - - * kjs/testkjs.cpp: - (runInteractive): - -2008-06-09 Cameron Zwarich - - Reviewed by Darin. - - Bug 17531: Add interactive mode to testkjs - - - This is a cleaned up version of Sam's earlier patch to add an - interactive mode to testkjs. - - Readline support is only enabled on Darwin platforms for now, but - other ports can enable it by defining HAVE_READLINE in kjs/config.h. - - * JavaScriptCore.xcodeproj/project.pbxproj: - * kjs/config.h: - * kjs/testkjs.cpp: - (Options::Options): - (runWithScripts): - (runInteractive): - (printUsageStatement): - (parseArguments): - (kjsmain): - -2008-06-08 Cameron Zwarich - - Reviewed by Darin. - - Bug 19346: REGRESSION: Mootools 1.2 Class inheritance broken in post-SquirrelFish merge - - - A check for whether a function's caller is eval code accidentally included - the case where the caller's caller is native code. Add a CodeType field to - CodeBlock and use this for the eval caller test instead. - - * VM/CodeBlock.h: - (KJS::CodeBlock::CodeBlock): - (KJS::ProgramCodeBlock::ProgramCodeBlock): - (KJS::EvalCodeBlock::EvalCodeBlock): - * VM/Machine.cpp: - (KJS::getCallerFunctionOffset): - * kjs/nodes.cpp: - (KJS::FunctionBodyNode::generateCode): - (KJS::ProgramNode::generateCode): - -2008-06-07 Cameron Zwarich - - Reviewed by Dan Bernstein. - - Bug 17928: testkjs shouldn't require "-f" - - - * kjs/testkjs.cpp: - (printUsageStatement): - (parseArguments): - -2008-06-07 Cameron Zwarich - - Reviewed by Eric. - - Bug 17548: JavaScriptCore print(a, b) differs from Spidermonkey Behavior - - - * kjs/testkjs.cpp: - (functionPrint): - -2008-06-07 Cameron Zwarich - - Reviewed by Sam. - - Bug 17547: JavaScriptCore print() differs from Spidermonkey Behavior - - - * kjs/testkjs.cpp: - (functionPrint): - -2008-06-07 Alexey Proskuryakov - - More build fixes. - - * kjs/JSGlobalData.cpp: Fixed an included file name for case-sensitive file systems, fixed - JSGlobalData::threadInstance() for non-multithreaded builds. - -2008-06-07 Alexey Proskuryakov - - Build fix - actually adding JSGlobalData.cpp to non-Mac builds! - - * GNUmakefile.am: - * JavaScriptCore.pri: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCoreSources.bkl: - -2008-06-07 Alexey Proskuryakov - - Try to fix Gtk/gcc 4.3 build. - - * kjs/JSGlobalData.h: Include ustring.h instead of forward-declaring UString::Rep. - -2008-06-06 Alexey Proskuryakov - - Reviewed by Darin. - - Combine per-thread objects into one, to make it easier to support legacy clients (for - which they shouldn't be really per-thread). - - No change on SunSpider total. - - * JavaScriptCore.xcodeproj/project.pbxproj: Added JSGlobalData.{h,cpp} - - * kjs/JSGlobalData.cpp: Added. - (KJS::JSGlobalData::JSGlobalData): - (KJS::JSGlobalData::~JSGlobalData): - (KJS::JSGlobalData::threadInstance): - * kjs/JSGlobalData.h: Added. - This class encapsulates all data that should be per-thread (or shared between legacy clients). - It will also keep a Heap pointer, but right now, Heap (Collector) methods are all static. - - * kjs/identifier.h: - (KJS::Identifier::Identifier): - Added a constructor explicitly taking JSGlobalData to access IdentifierTable. Actually, - all of them should, but this will be a separate patch. - - * kjs/identifier.cpp: - (KJS::IdentifierTable::literalTable): - (KJS::createIdentifierTable): - (KJS::deleteIdentifierTable): - (KJS::Identifier::add): - (KJS::Identifier::addSlowCase): - Combined IdentifierTable and LiteralIdentifierTable into a single class for simplicity. - - * kjs/grammar.y: kjsyyparse now takes JSGlobalData, not just a Lexer. - - * kjs/nodes.cpp: - (KJS::Node::Node): - (KJS::EvalFunctionCallNode::emitCode): - (KJS::ScopeNode::ScopeNode): - Changed to access Lexer and Parser via JSGlobalData::threadInstance(). This is also a - temporary measure, they will need to use JSGlobalData explicitly. - - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::CodeGenerator): - * VM/CodeGenerator.h: - * VM/Machine.cpp: - (KJS::callEval): - * kjs/CommonIdentifiers.cpp: - (KJS::CommonIdentifiers::CommonIdentifiers): - * kjs/CommonIdentifiers.h: - * kjs/DebuggerCallFrame.cpp: - (KJS::DebuggerCallFrame::evaluate): - * kjs/ExecState.cpp: - (KJS::ExecState::ExecState): - * kjs/ExecState.h: - (KJS::ExecState::globalData): - (KJS::ExecState::identifierTable): - (KJS::ExecState::propertyNames): - (KJS::ExecState::emptyList): - (KJS::ExecState::lexer): - (KJS::ExecState::parser): - (KJS::ExecState::arrayTable): - (KJS::ExecState::dateTable): - (KJS::ExecState::mathTable): - (KJS::ExecState::numberTable): - (KJS::ExecState::RegExpImpTable): - (KJS::ExecState::RegExpObjectImpTable): - (KJS::ExecState::stringTable): - * kjs/InitializeThreading.cpp: - (KJS::initializeThreadingOnce): - * kjs/JSGlobalObject.cpp: - (KJS::JSGlobalObject::init): - * kjs/JSGlobalObject.h: - (KJS::JSGlobalObject::JSGlobalObjectData::JSGlobalObjectData): - (KJS::JSGlobalObject::head): - (KJS::JSGlobalObject::globalData): - * kjs/Parser.cpp: - (KJS::Parser::parse): - * kjs/Parser.h: - * kjs/function.cpp: - (KJS::FunctionImp::getParameterName): - (KJS::IndexToNameMap::unMap): - (KJS::globalFuncEval): - * kjs/function_object.cpp: - (KJS::FunctionObjectImp::construct): - * kjs/interpreter.cpp: - (KJS::Interpreter::checkSyntax): - (KJS::Interpreter::evaluate): - * kjs/lexer.cpp: - (kjsyylex): - * kjs/lexer.h: - * kjs/testkjs.cpp: - (prettyPrintScript): - Updated for the above changes. Most of threadInstance uses here will need to be replaced with - explicitly passed pointers to support legacy JSC clients. - - * JavaScriptCore.exp: Removed KJS::parser(). - -2008-06-06 Cameron Zwarich - - Reviewed by Oliver. - - Bug 19424: Add support for logging opcode pair counts - - - * VM/Machine.cpp: - (KJS::Machine::privateExecute): - * VM/Opcode.cpp: - (KJS::OpcodeStats::OpcodeStats): - (KJS::compareOpcodeIndices): - (KJS::compareOpcodePairIndices): - (KJS::OpcodeStats::~OpcodeStats): - (KJS::OpcodeStats::recordInstruction): - (KJS::OpcodeStats::resetLastInstruction): - * VM/Opcode.h: - -2008-06-06 Kevin McCullough - - Reviewed by Adam. - - JSProfiler: Remove the recursion limit in the - profiler. - - Change the remaining functions that do not take arguments, from using - recursion to using iteration. - - * JavaScriptCore.exp: - * profiler/Profile.cpp: - (KJS::stopProfiling): - (KJS::restoreAll): - (KJS::Profile::stopProfiling): Use foreach instead of recursion. - (KJS::Profile::restoreAll): Ditto. - * profiler/Profile.h: - * profiler/ProfileNode.cpp: Remove recursion. - (KJS::ProfileNode::stopProfiling): - (KJS::ProfileNode::restore): - * profiler/ProfileNode.h: - -2008-06-05 Oliver Hunt - - Reviewed by Alexey. - - Fix Greater and GreaterEq nodes to emit code for the left - and right sub-expressions in the correct order. - - * kjs/nodes.cpp: - (KJS::GreaterNode::emitCode): - (KJS::GreaterEqNode::emitCode): - -2008-06-05 Antti Koivisto - - Reviewed by Alp Toker. - - Fix whitespaces. - - * kjs/collector.cpp: - (KJS::getPlatformThreadRegisters): - -2008-06-05 Antti Koivisto - - Reviewed by Darin. - - Support compiling JavaScriptCore for ARM. - - * kjs/collector.cpp: - (KJS::getPlatformThreadRegisters): - (KJS::otherThreadStackPointer): - -2008-06-05 Kevin McCullough - - Reviewed by Jon. - - - Name changes. - - * JavaScriptCore.exp: - * profiler/Profile.cpp: - (KJS::Profile::Profile): - (KJS::Profile::stopProfiling): - (KJS::Profile::didExecute): - (KJS::Profile::forEach): - (KJS::Profile::debugPrintData): - (KJS::Profile::debugPrintDataSampleStyle): - * profiler/Profile.h: - (KJS::Profile::callTree): - (KJS::Profile::totalTime): - (KJS::Profile::sortTotalTimeDescending): - (KJS::Profile::sortTotalTimeAscending): - (KJS::Profile::sortSelfTimeDescending): - (KJS::Profile::sortSelfTimeAscending): - (KJS::Profile::sortCallsDescending): - (KJS::Profile::sortCallsAscending): - (KJS::Profile::sortFunctionNameDescending): - (KJS::Profile::sortFunctionNameAscending): - (KJS::Profile::focus): - (KJS::Profile::exclude): - (KJS::Profile::restoreAll): - -2008-06-05 Geoffrey Garen - - Reviewed by Stephanie Lewis. - - Added the -fno-move-loop-invariants flag to the pcre_exec.cpp build, to - tell GCC not to perform loop invariant motion, since GCC's loop - invariant motion doesn't do very well with computed goto code. - - SunSpider reports no change. - -2008-06-05 Geoffrey Garen - - Reviewed by Stephanie Lewis. - - Added the -fno-tree-pre flag to the Machine.cpp build, to tell GCC not - to perform Partial Redundancy Elimination (PRE) on trees in Machine.cpp, - since GCC's PRE doesn't do very well with computed goto code. - - SunSpider reports a .7% speedup. - -2008-06-05 Geoffrey Garen - - Reviewed by Stephanie Lewis (or maybe the other way around). - - Minor change to PCRE to help out certain compilers. - - SunSpider reports no change, maybe a small speedup. - - * pcre/pcre_exec.cpp: - (match): Use instructionPtr++ a little less, to avoid confusing the - optimizer. - -2008-06-05 Alexey Proskuryakov - - Re-landing an independent part of a previously rolled out threading patch. - - * wtf/ThreadSpecific.h: Make sure to initialize POD thread-specific varaibles, too - (replaced "new T" with "new T()"). - -2008-06-05 Maciej Stachowiak - - Reviewed by Hyatt. - - - force inlining of a template function that only has one call site per specialization - 1.3% speedup on SunSpider - - * kjs/collector.cpp: - (KJS::Collector::heapAllocate): This template function is only - called from allocate() and allocateNumber() (once per - specialization) and the extra call overhead for GC allocation - shows up, so force inlining. - -2008-06-05 Maciej Stachowiak - - Reviewed by Alexey and Oliver. - - - remove profiler fetch hack - I measure an 0.5% progression from this, others show a wash. It seems not needed any more. - - * VM/Machine.cpp: - (KJS::Machine::privateExecute): - -2008-06-05 Cameron Zwarich - - Reviewed by Maciej. - - Bug 19400: subscript operator does not protect base when necessary - - - Use a temporary for the base in BracketAccessorNode if the subscript - might possibly modify it. - - * kjs/grammar.y: - * kjs/nodes.cpp: - (KJS::BracketAccessorNode::emitCode): - * kjs/nodes.h: - (KJS::BracketAccessorNode::): - -2008-06-04 Sam Weinig - - Reviewed by Maciej Stachowiak. - - Big cleanup of formatting and whitespace. - -2008-06-04 Cameron Zwarich - - Reviewed by Oliver. - - Add an option to dump statistics on executed instructions. - - * VM/Machine.cpp: - (KJS::Machine::privateExecute): - * VM/Opcode.cpp: - (KJS::OpcodeStats::~OpcodeStats): - (KJS::OpcodeStats::recordInstruction): - * VM/Opcode.h: - -2008-06-04 Kevin McCullough - - Reviewed by Geoff. - - JSProfiler: Remove the recursion limit in the - profiler. - - This patch removes the use of recursion for the sort functions. - - * JavaScriptCore.exp: Change the signatures of the functions being - exported. - * profiler/Profile.cpp: - (KJS::Profile::sort): This generic function will accept any of the - static sort functions and apply them to the whole tree. - * profiler/Profile.h: All of the sorting functions now call the new - sort() function. - (KJS::Profile::sortTotalTimeDescending): - (KJS::Profile::sortTotalTimeAscending): - (KJS::Profile::sortSelfTimeDescending): - (KJS::Profile::sortSelfTimeAscending): - (KJS::Profile::sortCallsDescending): - (KJS::Profile::sortCallsAscending): - (KJS::Profile::sortFunctionNameDescending): - (KJS::Profile::sortFunctionNameAscending): - * profiler/ProfileNode.cpp: - (KJS::ProfileNode::ProfileNode): m_head used to point to the head node - if this was the head node. It now points to null to make iteration easy - (KJS::ProfileNode::willExecute): Now must check if m_head is null, this - check used to happend in the constructor. - (KJS::ProfileNode::stopProfiling): Again the check is slightly different - to determine if this is the head. - (KJS::ProfileNode::traverseNextNode): This function returns the next - node in post order. - (KJS::ProfileNode::sort): This generic function will sort according to - the comparator passed in, then reset the children pointers to macth the - new order. - * profiler/ProfileNode.h: The sorting function were removed from the - definition file and instead use the new generic sort() function - (KJS::ProfileNode::totalPercent): because the head can now be empty we - need to check here too for the head node. - (KJS::ProfileNode::selfPercent): Ditto - (KJS::ProfileNode::firstChild): This function is necessary for the - iterative algorithm in Profile.cpp. - (KJS::ProfileNode::sortTotalTimeDescending): - (KJS::ProfileNode::sortTotalTimeAscending): - (KJS::ProfileNode::sortSelfTimeDescending): - (KJS::ProfileNode::sortSelfTimeAscending): - (KJS::ProfileNode::sortCallsDescending): - (KJS::ProfileNode::sortCallsAscending): - (KJS::ProfileNode::sortFunctionNameDescending): - (KJS::ProfileNode::sortFunctionNameAscending): - (KJS::ProfileNode::childrenBegin): - (KJS::ProfileNode::childrenEnd): - (KJS::ProfileNode::totalTimeDescendingComparator): - (KJS::ProfileNode::totalTimeAscendingComparator): - (KJS::ProfileNode::selfTimeDescendingComparator): - (KJS::ProfileNode::selfTimeAscendingComparator): - (KJS::ProfileNode::callsDescendingComparator): - (KJS::ProfileNode::callsAscendingComparator): - (KJS::ProfileNode::functionNameDescendingComparator): - (KJS::ProfileNode::functionNameAscendingComparator): - -2008-06-04 Alexey Proskuryakov - - Reviewed by Darin. - - Fix JSClassCreate to work with old JSCore API threading model. - - No change on SunSpider. - - * API/JSClassRef.cpp: (OpaqueJSClass::OpaqueJSClass): Since JSClass is constructed without - a context, there is no way for it to create Identifiers. - Also, added initializeThreading(), just for good measure. - - * API/JSCallbackObjectFunctions.h: (KJS::::getPropertyNames): Make an Identifier out of the - string here, because propertyNames.add() needs that. - - * kjs/identifier.cpp: - * kjs/identifier.h: - (KJS::Identifier::equal): - * kjs/ustring.cpp: - (KJS::equal): - Moved equal() from identifier.h to ustring.h, because it's not really about Identifiers, - and to make it possible to use it from StrHash. - Include StrHash.h from ustring.h to avoid having the behavior depend on headers that happen - to be included. - - * wtf/StrHash.h: Removed. - * kjs/ustring.h: Made RefPtr use the same default hash as UString::Rep* (it - used to default to pointer equality). Moved the whole StrHash header into ustring.h. - - * JavaScriptCore.exp: Export equal() for WebCore use (this StrHash is used in c_class.cpp, - jni_class.cpp, and npruntime.cpp). - -2008-06-04 Alexey Proskuryakov - - Rubber-stamped by Darin. - - Fix spacing in collector.{h,cpp}. - - * kjs/collector.cpp: - * kjs/collector.h: - -2008-06-03 Cameron Zwarich - - Reviewed by Maciej. - - Build fix. The cleanup in r34355 missed a method. - - * kjs/nodes.cpp: - * kjs/nodes.h: - -2008-06-03 Darin Adler - - Reviewed by Geoff. - - - https://bugs.webkit.org/show_bug.cgi?id=19269 - speed up SunSpider by eliminating the toObject call for most get/put/delete - - Makes standalone SunSpider 1.025x as fast as before. - - The getOwnPropertySlot virtual function now takes care of the toObject call - for get. Similarly, the put function (and later deleteProperty) does the - same for those operations. To do this, the virtual functions were moved from - the JSObject class to the JSCell class. Also, since the caller no longer knows - the identity of the "original object", which is used by JavaScript-function - based getters, changed the PropertySlot class so the original object is - already stored in the slot when getOwnPropertySlot is called, if the caller - intends to call getValue. - - This affected the old interpreter code enough that the easiest thing for me - was to just delete it. While I am not certain the mysterious slowdown is not - still occurring, the net change is definitely a significant speedup. - - * JavaScriptCore.exp: Updated. - - * VM/Machine.cpp: Moved the UNLIKELY macro into AlwaysInline.h. - (KJS::resolve): Set up the originalObject in the PropertySlot before - calling getPropertySlot. Also removed the originalObject argument from - getValue. - (KJS::resolve_skip): Ditto. - (KJS::resolveBaseAndProperty): Ditto. - (KJS::resolveBaseAndFunc): Ditto. - (KJS::Machine::privateExecute): Removed the toObject calls from the get and - put functions where possible, instead calling directly with JSValue and letting - the JSValue and JSCell calls handle toObject. Same for toThisObject. - - * kjs/ExecState.h: Removed OldInterpreterExecState. - - * API/JSBase.cpp: Updated includes. - - * kjs/LocalStorageEntry.h: Removed contents. Later we can remove the file too. - - * kjs/array_instance.cpp: - (KJS::ArrayInstance::lengthGetter): Removed originalObject argumet. - (KJS::ArrayInstance::inlineGetOwnPropertySlot): Don't pass a base value to - setValueSlot. Also use UNLIKELY around the "getting elements past the end of - the array" code path; less common than successfully getting an element. - - * kjs/array_object.cpp: - (KJS::getProperty): Initialize the PropertySlot with the original object. - Don't pass the original object to the get function. - (KJS::arrayProtoFuncFilter): Ditto. - (KJS::arrayProtoFuncMap): Ditto. - (KJS::arrayProtoFuncEvery): Ditto. - (KJS::arrayProtoFuncForEach): Ditto. - (KJS::arrayProtoFuncSome): Ditto. - - * kjs/function_object.cpp: - (KJS::FunctionObjectImp::construct): Removed an obsolete comment. - - * kjs/grammar.y: Eliminated support for some of the node types that were - used to optimize executing from the syntax tree. - - * kjs/internal.cpp: - (KJS::StringImp::toThisObject): Added. Same as toObject. - (KJS::NumberImp::toThisObject): Ditto. - (KJS::GetterSetterImp::getOwnPropertySlot): Added. Not reached. - (KJS::GetterSetterImp::put): Ditto. - (KJS::GetterSetterImp::toThisObject): Ditto. - - * kjs/internal.h: Added toThisObject to NumberImp for speed. - - * kjs/lexer.cpp: - (KJS::Lexer::shift): Changed shift to just do a single character, to unroll - the loop and especially to make the one character case faster. - (KJS::Lexer::setCode): Call shift multiple times instead of passing a number. - (KJS::Lexer::lex): Ditto. - (KJS::Lexer::matchPunctuator): Ditto. Also removed unneeded elses after returns. - (KJS::Lexer::scanRegExp): Ditto. - * kjs/lexer.h: Removed the count argument from shift. - - * kjs/math_object.cpp: - (KJS::mathProtoFuncPow): Call jsNaN instead of jsNumber(NaN). - - * kjs/nodes.cpp: Removed some of the things needed only for the pre-SquirrelFish - execution model. - (KJS::ForNode::emitCode): Handle cases where some expressions are missing by - not emitting any code at all. The old way was to emit code for "true", but - this is an unnecessary remnant of the old way of doing things. - - * kjs/nodes.h: Removed some of the things needed only for the pre-SquirrelFish - execution model. - - * kjs/object.cpp: - (KJS::JSObject::fillGetterPropertySlot): Changed to only pass in the getter - function. The old code passed in a base, but it was never used when - actually getting the property; the toThisObject call was pointless. Also - changed to not pass a base for setUndefined. - - * kjs/object.h: Added the new JSCell operations to GetterSetterImp. - Never called. - (KJS::JSObject::get): Initialize the object in the PropertySlot and don't - pass it in getValue. - (KJS::JSObject::getOwnPropertySlotForWrite): Removed the base argument - in calls to setValueSlot. - (KJS::JSObject::getOwnPropertySlot): Ditto. - (KJS::JSValue::get): Added. Here because it calls through to JSObject. - A version of JSObject::get that also handles the other types of JSValue - by creating the appropriate wrapper. Saves the virtual call to toObject. - (KJS::JSValue::put): Ditto. - (KJS::JSValue::deleteProperty): Ditto. - - * kjs/property_slot.cpp: - (KJS::PropertySlot::undefinedGetter): Removed the originalObject argument. - (KJS::PropertySlot::ungettableGetter): Ditto. - (KJS::PropertySlot::functionGetter): Ditto. Use the value in the base - as the "this" object, which will be set to the original object by the new - PropertySlot initialization code. Also call toThisObject. The old code did - not do this, but needed to so we can properly handle the activation object - like the other similar code paths. - - * kjs/property_slot.h: - (KJS::PropertySlot::PropertySlot): Added a constructor that takes a base - object. In debug builds, set the base to 0 if you don't pass one. - (KJS::PropertySlot::getValue): Don't take or pass the originalObject. - (KJS::PropertySlot::setValueSlot): Don't take a base object, and clear the - base object in debug builds. - (KJS::PropertySlot::setGetterSlot): Ditto. - (KJS::PropertySlot::setUndefined): Ditto. - (KJS::PropertySlot::setUngettable): Ditto. - (KJS::PropertySlot::slotBase): Assert that a base object is present. - This will fire if someone actually calls the get function without having - passed in a base object and the getter needs it. - (KJS::PropertySlot::setBase): Added. Used by the code that implements - toObject so it can supply the original object after the fact. - (KJS::PropertySlot::clearBase): Added. Clears the base, but is debug-only - code because it's an error to fetch the base if you don't have a guarantee - it was set. - - * API/JSCallbackObject.h: - * API/JSCallbackObjectFunctions.h: - (KJS::JSCallbackObject::cachedValueGetter): - (KJS::JSCallbackObject::staticValueGetter): - (KJS::JSCallbackObject::staticFunctionGetter): - (KJS::JSCallbackObject::callbackGetter): - * kjs/JSActivation.cpp: - (KJS::JSActivation::getOwnPropertySlot): - (KJS::JSActivation::argumentsGetter): - * kjs/JSActivation.h: - * kjs/JSVariableObject.h: - (KJS::JSVariableObject::symbolTableGet): - * kjs/array_instance.h: - * kjs/function.cpp: - (KJS::FunctionImp::argumentsGetter): - (KJS::FunctionImp::callerGetter): - (KJS::FunctionImp::lengthGetter): - (KJS::Arguments::mappedIndexGetter): - * kjs/function.h: - * kjs/lookup.h: - (KJS::staticFunctionGetter): - (KJS::staticValueGetter): - * kjs/string_object.cpp: - (KJS::StringInstance::lengthGetter): - (KJS::StringInstance::indexGetter): - (KJS::stringInstanceNumericPropertyGetter): - * kjs/string_object.h: - Removed originalObject arguments from getters. Don't pass base values to - the various PropertySlot functions that no longer take them. - - * kjs/value.cpp: - (KJS::JSCell::getOwnPropertySlot): Added. Calls toObject and then sets the slot. - This function has to always return true, because the caller can't walk the prototype - chain. Because of that, we do a getPropertySlot, not getOwnPropertySlot, which works - for the caller. This is private, only called by getOwnPropertySlotInternal. - (KJS::JSCell::put): Added. Calls toObject and then put. - (KJS::JSCell::toThisObject): Added. Calls toObject. - - * kjs/value.h: Added get, put, and toThisObject to both JSValue - and JSCell. These take care of the toObject operation without an additional virtual - function call, and so make the common "already an object" case faster. - - * wtf/AlwaysInline.h: Moved the UNLIKELY macro here for now. Maybe we can find a - better place later, or rename this header. - -2008-06-03 Oliver Hunt - - Reviewed by Tim. - - Bug 12983: Web Inspector break on the debugger keyword - - - Added a DebuggerStatementNode to handle codegen, and added a new - DidReachBreakPoint debug event (which will hopefully be useful - if we ever move breakpoint management into JSC proper). Also - added didReachBreakpoint to Debugger to allow us to actually respond - to this event. - - * VM/CodeBlock.cpp: - (KJS::debugHookName): - * VM/Machine.cpp: - (KJS::Machine::debug): - * VM/Machine.h: - * kjs/debugger.h: - * kjs/grammar.y: - * kjs/nodes.cpp: - (KJS::DebuggerStatementNode::emitCode): - (KJS::DebuggerStatementNode::execute): - * kjs/nodes.h: - (KJS::DebuggerStatementNode::): - * kjs/nodes2string.cpp: - (KJS::DebuggerStatementNode::streamTo): - -2008-06-03 Maciej Stachowiak - - Reviewed by Oliver. - - - document remaining opcodes. - - * VM/Machine.cpp: - (KJS::Machine::privateExecute): Document call, call_eval, - construct, ret and end opcodes. - -2008-06-03 Maciej Stachowiak - - Reviewed by Oliver. - - * VM/Machine.cpp: - (KJS::Machine::privateExecute): Document throw and catch opcodes. - -2008-06-02 Geoffrey Garen - - Reviewed by Alexey Proskuryakov. - - Removed JSObject::call, since it just called JSObject::callAsFunction. - - SunSpider reports no change. - -2008-06-02 Geoffrey Garen - - Reviewed by Darin Adler. - - A little cleanup in the CodeGenerator. - - * VM/CodeGenerator.cpp: A few changes here. - - (1) Removed remaining cases of the old hack of putting "this" into the - symbol table; replaced with explicit tracking of m_thisRegister. - - (2) Made m_thisRegister behave the same for function, eval, and program - code, removing the static programCodeThis() function. - - (3) Added a feature to nix a ScopeNode's declaration stacks when done - compiling, to save memory. - - (4) Removed code that copied eval declarations into special vectors: we - just use the originals in the ScopeNode now. - - * VM/CodeGenerator.h: Removed unneded parameters from the CodeGenerator - constructor: we just use get that data from the ScopeNode now. - - * VM/Machine.cpp: - (KJS::Machine::execute): When executing an eval node, don't iterate a - special copy of its declarations; iterate the originals, instead. - - * kjs/nodes.cpp: Moved responsibility for knowing what AST data to throw - away into the CodeGenerator. Nodes no longer call shrinkCapacity on - their data directly. - - * kjs/nodes.h: Changed FunctionStack to ref its contents, so declaration - data stays around even after we've thrown away the AST, unless we explicitly - throw away the declaration data, too. This is useful for eval code, which - needs to reference its declaration data at execution time. (Soon, it will - be useful for program code, too, since program code should do the same.) - -2008-06-02 Adam Roben - - Build fix for non-AllInOne builds - - * kjs/array_object.cpp: Added a missing #include. - -2008-06-02 Kevin McCullough - - Took out accidental confilct lines I checked in. - - * ChangeLog: - -2008-06-02 Kevin McCullough - - Reviewed by Darin. - - JSProfiler: Remove the recursion limit in the - profiler - Implement Next Sibling pointers as groundwork for removing the recursion - limit in the profiler. - - * profiler/ProfileNode.cpp: Also I renamed parentNode and headNode since - 'node' is redundant. - (KJS::ProfileNode::ProfileNode): Initialize the nextSibling. - (KJS::ProfileNode::willExecute): If there are already children then the - new child needs to be the nextSibling of the last child. - (KJS::ProfileNode::didExecute): - (KJS::ProfileNode::addChild): Ditto. - (KJS::ProfileNode::stopProfiling): - (KJS::ProfileNode::sortTotalTimeDescending): For all of the sorting - algorithms once the children are sorted their nextSibling pointers need - to be reset to reflect the new order. - (KJS::ProfileNode::sortTotalTimeAscending): - (KJS::ProfileNode::sortSelfTimeDescending): - (KJS::ProfileNode::sortSelfTimeAscending): - (KJS::ProfileNode::sortCallsDescending): - (KJS::ProfileNode::sortCallsAscending): - (KJS::ProfileNode::sortFunctionNameDescending): - (KJS::ProfileNode::sortFunctionNameAscending): - (KJS::ProfileNode::resetChildrensSiblings): This new function simply - loops over all of the children and sets their nextSibling pointers to - the next child in the Vector - (KJS::ProfileNode::debugPrintData): - * profiler/ProfileNode.h: - (KJS::ProfileNode::parent): - (KJS::ProfileNode::setParent): - (KJS::ProfileNode::nextSibling): - (KJS::ProfileNode::setNextSibling): - (KJS::ProfileNode::totalPercent): - (KJS::ProfileNode::selfPercent): - -2008-06-02 Geoffrey Garen - - Reviewed by Maciej Stachowiak. - - Removed the recursion limit from JSObject::call, since the VM does - recursion checking now. - - This should allow us to remove JSObject::call entirely, netting a small - speedup. - - * kjs/object.cpp: - (KJS::JSObject::call): - -2008-06-02 Geoffrey Garen - - Reviewed by Adele Peterson. - - Added a specific affordance for avoiding stack overflow when converting - recursive arrays to string, in preparation for removing generic stack - overflow checking from JSObject::call. - - Tested by fast/js/toString-stack-overflow.html. - -2008-06-02 Geoffrey Garen - - Reviewed by Alice Liu. - - Refactored some hand-rolled code to call ScopeChain::globalObject instead. - -2008-06-02 Geoffrey Garen - - Reviewed by Darin Adler. - - Fixed ASSERT due to execution continuing after an exception is thrown - during array sort. - - * kjs/array_instance.cpp: - (KJS::AVLTreeAbstractorForArrayCompare::compare_key_key): Don't call the - custom comparator function if an exception has been thrown. Just return - 1 for everything, so the sort completes quickly. (The result will be - thrown away.) - -2008-05-30 Timothy Hatcher - - Made the starting line number of scripts be 1-based throughout the engine. - This cleans up script line numbers so they are all consistent now and fixes - some cases where script execution was shown as off by one line in the debugger. - - No change in SunSpider. - - Reviewed by Oliver Hunt. - - * API/minidom.c: - (main): Pass a line number of 1 instead of 0 to parser().parse(). - * API/testapi.c: - (main): Ditto. And removes a FIXME and changed an assertEqualsAsNumber - to use 1 instead of 2 for the line number. - * VM/Machine.cpp: - (KJS::callEval): Pass a line number of 1 instead of 0. - (KJS::Machine::debug): Use firstLine for WillExecuteProgram instead of - lastLine. Use lastLine for DidExecuteProgram instead of firstLine. - * kjs/DebuggerCallFrame.cpp: - (KJS::DebuggerCallFrame::evaluate): Pass a line number of 1 instead of - 0 to parser().parse(). - * kjs/Parser.cpp: - (KJS::Parser::parse): ASSERT startingLineNumber is greatter than 0. Change - the startingLineNumber to be 1 if it was less than or equal to 0. This is needed - for release builds to maintain compatibility with the JavaScriptCore API. - * kjs/function.cpp: - (KJS::globalFuncEval): Pass a line number of 1 instead of 0 to parser().parse(). - * kjs/function_object.cpp: - (FunctionObjectImp::construct): Pass a line number of 1 instead of 0 to construct(). - * kjs/lexer.cpp: - (Lexer::setCode): Made yylineno = startingLineNumber instead of adding 1. - * kjs/testkjs.cpp: - (functionRun): Pass a line number of 1 instead of 0 to Interpreter::evaluate(). - (functionLoad): Ditto. - (prettyPrintScript): Ditto. - (runWithScripts): Ditto. - * profiler/Profiler.cpp: - (WebCore::createCallIdentifier): Removed a plus 1 of startingLineNumber. - -2008-05-30 Alexey Proskuryakov - - Reviewed by Darin. - - https://bugs.webkit.org/show_bug.cgi?id=19180 - speed up SunSpider by optimizing immediate number cases - - Also fixed a JavaScriptCore regression seen on PowerPC - we didn't clip left shift - parameter to 0...31. - - 0.5% improvement on SunSpider overall, although a 8.5 regression on bitops-3bit-bits-in-byte. - - * VM/Machine.cpp: - (KJS::Machine::privateExecute): - - * kjs/JSImmediate.h: - (KJS::JSImmediate::toTruncatedUInt32): Added. Same as getTruncatedInt32, but casts the result - to unsigned. - -2008-05-30 Alexey Proskuryakov - - Reviewed by Oliver Hunt. - - https://bugs.webkit.org/show_bug.cgi?id=19180 - speed up SunSpider by optimizing immediate number cases - - Also fixed two JavaScriptCore regressions seen on PowerPC - we didn't clip right shift - parameter to 0...31. - - 1.6% improvement on SunSpider, without significant regressions on any tests. - - * VM/Machine.cpp: - (KJS::Machine::privateExecute): - Added fast paths for >>, ==, ===, !=, !==. Changed order of memory accesses in many - cases, making them less dependent on gcc's ability to properly assign registers. With this, - I could move exception checks back into slow code paths, and saw less randomness in general. - - * kjs/JSImmediate.h: - (KJS::JSImmediate::rightShiftImmediateNumbers): - Added. - -2008-05-29 Maciej Stachowiak - - Reviewed by Oliver. - - - fixed REGRESSION(r33979): Flash clips do not play on cnn.com - - Finally blocks could clobber registers that had to remain live - until they returned. This patch takes a conservative approach and - makes sure that finally blocks do not reuse any registers that - were previously allocated for the function. In the future this - could probably be tightened up to be less profligate with the - register allocation. - - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::highestUsedRegister): - * VM/CodeGenerator.h: - * kjs/nodes.cpp: - (KJS::TryNode::emitCode): - -2008-05-29 Steve Falkenburg - - Build fix. - - * kjs/array_instance.cpp: - -2008-05-29 Alexey Proskuryakov - - Reviewed by Darin. - - https://bugs.webkit.org/show_bug.cgi?id=19294 - A crash when iterating over a sparse array backwards. - - * kjs/array_instance.cpp: Turned sparseArrayCutoff into a macro, so that using max() on it - doesn't cause a PIC branch. - (KJS::ArrayInstance::increaseVectorLength): Added a comment about this function not - preserving class invariants. - (KJS::ArrayInstance::put): Update m_storage after reallocation. Move values that fit to - the vector from the map in all code paths. - -2008-05-29 Thiago Macieira - - Reviewed by Simon. - - Fix compilation in Solaris with Sun CC - - Lots of WebKit code uses C99 functions that, strict as it - is, the Solaris system doesn't provide in C++. So we must define them - for both GCC and the Sun CC. - - * wtf/MathExtras.h: - -2008-05-28 Oliver Hunt - - Reviewed by Anders. - - Fix codegen for assignment being used as a function. - - FunctionCallValueNode::emitCode failed to account for the - potential of the function expression to allocate arbitrary - registers. - - * kjs/nodes.cpp: - (KJS::FunctionCallValueNode::emitCode): - -2008-05-27 Geoffrey Garen - - Reviewed by Tim Hatcher. - - Fixed https://bugs.webkit.org/show_bug.cgi?id=19183 - REGRESSION (r33979): Crash in DebuggerCallFrame::functionName when - clicking button in returnEvent-crash.html - - Added two new debugger hooks, willExecuteProgram and didExecuteProgram, - along with code to generate them, code to invoke them when unwinding - due to an exception, and code to dump them. - - SunSpider reports no change. - - * VM/CodeBlock.cpp: - (KJS::debugHookName): I had to mark this function NEVER_INLINE to avoid - a .4% performance regression. The mind boggles. - -2008-05-28 Adam Roben - - Fix JavaScriptCore tests on OS X - - We were quoting the path to testkjs too late, after it had already - been combined with spaces and other options. - - * tests/mozilla/jsDriver.pl: - (top level): Move path quoting from here... - (sub get_kjs_engine_command): ...to here. - -2008-05-28 Anders Carlsson - - Reviewed by Oliver. - - "const f" crashes in JavaScriptCore - - Make sure to null check the initializer. - - * kjs/nodes.cpp: - (KJS::ConstDeclNode::emitCodeSingle): - -2008-05-28 Adam Roben - - Make run-javascriptcore-tests work with a space in the path to testkjs - - Reviewed by Alexey Proskuryakov. - - * tests/mozilla/jsDriver.pl: Quote the path to the engine so that - spaces will be interpreted correctly. - -2008-05-28 Alexey Proskuryakov - - Fixed a misguiding comment - my measurement for negative numbers only included cases - where both operands were negative, which is not very interesting. - - * VM/Machine.cpp: - -2008-05-28 Alexey Proskuryakov - - Reviewed by Maciej. - - Based on a patch by Oliver Hunt. - - https://bugs.webkit.org/show_bug.cgi?id=19180 - speed up SunSpider by optimizing immediate number cases - - 1.4% speedup on SunSpider. - - * VM/Machine.cpp: - (KJS::Machine::privateExecute): - * kjs/JSImmediate.h: - (KJS::JSImmediate::incImmediateNumber): - (KJS::JSImmediate::decImmediateNumber): - Added fast paths for ++ and --. - - (KJS::JSImmediate::canDoFastAdditiveOperations): Corrected a comment. - -2008-05-28 Alexey Proskuryakov - - Reviewed by Darin. - - https://bugs.webkit.org/show_bug.cgi?id=19180 - speed up SunSpider by optimizing immediate number cases - - 2% speedup overall, maximum 10% on controlflow-recursive and bitops-3bit-bits-in-byte, - but a 4% regression on bitops-bits-in-byte and bitops-bitwise-and. - - * kjs/JSImmediate.h: - (KJS::JSImmediate::canDoFastAdditiveOperations): - (KJS::JSImmediate::addImmediateNumbers): - (KJS::JSImmediate::subImmediateNumbers): - Added fast cases that work with positive values less than 2^30. - - * VM/Machine.cpp: - (KJS::Machine::privateExecute): Use the above operations. Also updated SunSpider frequencies - with my results (looks like tag values have changed, not sure what caused the minor variation - in actual frequencies). - -2008-05-27 Adam Roben - - Windows build fix - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreGenerated.make: - Remove code that appended Cygwin's /bin directory to PATH. - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreGenerated.vcproj: - Prepend Cygwin's /bin directory to PATH. We prepend instead of append - so that Cygwin's utilities will win out over Win32 versions of the - same utilities (particularly perl). We do the prepend here instead of - in the Makefile because nmake doesn't seem to like prepending to PATH - inside the Makefile. This also matches the way WebCoreGenerated works. - -2008-05-27 Adam Roben - - Roll out r34163 - - A better fix is on the way. - - * DerivedSources.make: - * JavaScriptCore.vcproj/JavaScriptCore/build-generated-files.sh: - -2008-05-27 Adam Roben - - Windows build fix - - * DerivedSources.make: Don't generate the bytecode docs if - OMIT_BYTECODE_DOCS is set to 1. - * JavaScriptCore.vcproj/JavaScriptCore/build-generated-files.sh: Set - OMIT_BYTECODE_DOCS for production builds. - -2008-05-27 Anders Carlsson - - Reviewed by Geoff and Maciej. - - - https://bugs.webkit.org/show_bug.cgi?id=17925 - Crash in KJS::JSObject::put after setting this.__proto__ - - Set slotIsWriteable to false for __proto__, we want setting __proto__ to go through JSObject::put instead. - - * kjs/object.h: - (KJS::JSObject::getOwnPropertySlotForWrite): - -2008-05-27 Kevin Ollivier - - wx build fixes to catch up with SquirrelFish, etc. - - * JavaScriptCoreSources.bkl: - * jscore.bkl: - * wtf/Platform.h: - -2008-05-27 Darin Adler - - Reviewed by Tim Hatcher. - - - https://bugs.webkit.org/show_bug.cgi?id=19180 - speed up SunSpider by optimizing immediate number cases - - Add immediate number cases for the &, |, and ^ operators. - Makes standalone SunSpider 1.010x faster. - - * VM/Machine.cpp: - (KJS::Machine::privateExecute): Add areBothImmediateNumbers special cases - for the &, |, and ^ operators. - - * kjs/JSImmediate.h: - (KJS::JSImmediate::xorImmediateNumbers): Added. - (KJS::JSImmediate::orImmediateNumbers): Added. - -2008-05-26 Stephanie Lewis - - Windows build fix. - - * kjs/testkjs.cpp: - -2008-05-26 Maciej Stachowiak - - Reviewed by Anders. - - - make addStaticGlobals protected instead of private so subclasses can use it - - * JavaScriptCore.exp: - * kjs/JSGlobalObject.h: - -2008-05-26 Geoffrey Garen - - Reviewed by Darin Adler. - - Fixed After an eval of a non-string or a syntax - error, all profile stack frames are incorrect - - SunSpider reports a .3% speedup, possibly because eval of a string is a - little more efficient now. - - * VM/Machine.cpp: - (KJS::callEval): Make sure to call didExecute when returning early. I - simplified this function to remove one early return, making the job - of adding special code to early returns easier. - - (KJS::Machine::execute): Use the new function ExecState when notifying - the profiler. (This doesn't change behavior now, but it might prevent - subtle errors in the future.) - -2008-05-23 Tor Arne Vestbø - - Reviewed by Simon. - - Fixed toLower and toUpper implementations to allow being called - with a null result pointer and resultLength, to determine the - number of characters needed for the case conversion. - - * wtf/unicode/qt4/UnicodeQt4.h: - (WTF::Unicode::toLower): - (WTF::Unicode::toUpper): - -2008-05-25 Alexey Proskuryakov - - Fixing a typo in the previous commit made as a last minute change. - - * kjs/regexp_object.cpp: - -2008-05-24 Alexey Proskuryakov - - Reviewed by Darin. - - Changed regular expression matching result array to be lazily filled, because many callers - only care about it being non-null. - - 2% improvement on Acid3 test 26. - - * kjs/array_instance.cpp: Added a void* member to ArrayStorage for ArrayInstance subclasses - to use. - * kjs/array_instance.h: - (KJS::ArrayInstance::lazyCreationData): - (KJS::ArrayInstance::setLazyCreationData): - Added methods to access it from subclasses. - - * kjs/regexp_object.cpp: - (KJS::RegExpMatchesArray::RegExpMatchesArray): - (KJS::RegExpMatchesArray::getOwnPropertySlot): - (KJS::RegExpMatchesArray::put): - (KJS::RegExpMatchesArray::deleteProperty): - (KJS::RegExpMatchesArray::getPropertyNames): - (KJS::RegExpMatchesArray::fillArrayInstanceIfNeeded): - (KJS::RegExpMatchesArray::~RegExpMatchesArray): - (KJS::RegExpObjectImp::arrayOfMatches): - RegExpMatchesArray is a subclass of ArrayInstance that isn't filled until - accessed for the first time. - -2008-05-24 Alp Toker - - Win32/gcc build fix. Remove MSVC assumption. - - * wtf/TCSpinLock.h: - (TCMalloc_SlowLock): - -2008-05-24 Oleg Finkelshteyn - - Rubber-stamped, tweaked and landed by Alexey. - - Build fix for gcc 4.3. - - * JavaScriptCore/kjs/testkjs.cpp: - * JavaScriptCore/VM/CodeBlock.cpp: - Add missing standard includes. - -2008-05-23 Anders Carlsson - - Reviewed by Geoff. - - REGRESSION: Assertion failure in JSImmediate::toString when loading GMail (19217) - - Change List to store a JSValue*** pointer + an offset instead of a JSValue** pointer to protect against the case where - a register file changes while a list object points to its buffer. - - * VM/Machine.cpp: - (KJS::Machine::privateExecute): - * kjs/JSActivation.cpp: - (KJS::JSActivation::createArgumentsObject): - * kjs/list.cpp: - (KJS::List::getSlice): - * kjs/list.h: - (KJS::List::List): - (KJS::List::at): - (KJS::List::append): - (KJS::List::begin): - (KJS::List::end): - (KJS::List::buffer): - -2008-05-23 Kevin McCullough - - Reviewed by Sam. - - JSProfiler: Stack overflow if recursion is - too deep. - -Use a simple depth limit to restrict too deep of recursion. - - * profiler/Profile.cpp: - (KJS::Profile::willExecute): - (KJS::Profile::didExecute): - * profiler/Profile.h: - -2008-05-23 Geoffrey Garen - - Rolling back in r34085, with performance resolved. - - Apparently, passing the eval function to callEval gave GCC a hernia. - - Reviewed by Darin Adler, Kevin McCullough, and Oliver Hunt. - - Fixed Crashes and incorrect reporting in the - JavaScript profiler - - * VM/Machine.cpp: - (KJS::Machine::unwindCallFrame): Fixed incorrect reporting / a crash - when unwinding from inside eval and/or program code: detect the - difference, and do the right thing. Also, be sure to notify the profiler - *before* deref'ing the scope chain, since the profiler uses the scope chain. - - (KJS::Machine::execute): Fixed incorrect reporting / crash when calling - a JS function re-entrently: Machine::execute(FunctionBodyNode*...) - should not invoke the didExecute hook, because op_ret already does that. - Also, use the new function's ExecState when calling out to the profiler. - (Not important now, but could have become a subtle bug later.) - - (KJS::Machine::privateExecute): Fixed a hard to reproduce crash when - profiling JS functions: notify the profiler *before* deref'ing the scope - chain, since the profiler uses the scope chain. - - * kjs/object.cpp: - (KJS::JSObject::call): Removed these hooks, because they are now unnecessary. - - * profiler/Profile.cpp: Added a comment to explain a subtlety that only - Kevin and I understood previously. (Now, the whole world can understand!) - - * profiler/Profiler.cpp: - (KJS::shouldExcludeFunction): Don't exclude .call and .apply. That was - a hack to fix bugs that no longer exist. - - Finally, sped things up a little bit by changing the "Is the profiler - running?" check into an ASSERT, since we only call into the profiler - when it's running: - - (KJS::Profiler::willExecute): - (KJS::Profiler::didExecute): - -2008-05-23 Geoffrey Garen - - Reviewed by Oliver Hunt. - - - fixed REGRESSION(r33943-r33980): Can't send email , attach file or save as draft from hotmail.com - - SunSpider reports no change. - - This is a reworking of r34073, which I rolled out because it caused - lots of crashes. - - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::CodeGenerator): Use removeDirect to nix old - properties whose names collide with new functions. (Don't use putWithAttributes - because that tries to write to the register file, which hasn't grown to - fit this program yet.) - -2008-05-23 Darin Adler - - Reviewed by Mark Rowe. - - As allocateNumber is used via jsNumberCell outside of JavaScriptCore, - we need to provide a non-inlined version of it to avoid creating a - weak external symbol. - - * JavaScriptCore.exp: - * kjs/AllInOneFile.cpp: - * kjs/collector.cpp: - (KJS::Collector::allocate): - (KJS::Collector::allocateNumber): - * kjs/collector.h: - (KJS::Collector::allocate): - (KJS::Collector::inlineAllocateNumber): - * kjs/value.h: - (KJS::NumberImp::operator new): - -2008-05-23 Geoffrey Garen - - Rolled out r34073 because it caused lots of layout test crashes. - -2008-05-23 Geoffrey Garen - - Rolled out r34085 because it measured as a 7.6% performance regression. - -2008-05-23 Adam Roben - - Windows build fix - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Add the - profiler directory to the include path. - -2008-05-23 Oliver Hunt - - Reviewed by Anders. - - SQUIRRELFISH: JavaScript error messages are missing informative text - - Partial fix. - Tidy up error messages, makes a couple of them provide slightly more info. - Inexplicably leads to a 1% SunSpider Progression. - - * VM/ExceptionHelpers.cpp: - (KJS::createError): - (KJS::createInvalidParamError): - (KJS::createNotAConstructorError): - (KJS::createNotAFunctionError): - * VM/ExceptionHelpers.h: - * VM/Machine.cpp: - (KJS::isNotObject): - -2008-05-23 Oliver Hunt - - Reviewed by Tim H. - - Fix call stack reported by profiler when entering event handlers. - - JSObject::call was arbitrarily notifying the profiler when it was - called, even if it was JS code, which notifies the profile on entry - in any case. - - * kjs/object.cpp: - (KJS::JSObject::call): - -2008-05-16 Alp Toker - - Build fix for gcc 3. Default constructor required in ExecState, - used by OldInterpreterExecState. - - * kjs/ExecState.h: - (KJS::ExecState::ExecState): - -2008-05-23 Mark Rowe - - Reviewed by Oliver Hunt. - - Fix global-recursion-on-full-stack.html crashes under guardmalloc. - - Growing the register file with uncheckedGrow from within Machine::execute is not safe as the - register file may be too close to its maximum size to grow successfully. By using grow, - checking the result and throwing a stack overflow error we can avoid crashing. - - * VM/Machine.cpp: - (KJS::Machine::execute): - * VM/RegisterFile.h: Remove the now-unused uncheckedGrow. - -2008-05-23 Oliver Hunt - - RS=Kevin McCullough - - Remove JAVASCRIPT_PROFILER define - - * VM/Machine.cpp: - (KJS::callEval): - (KJS::Machine::unwindCallFrame): - (KJS::Machine::execute): - (KJS::Machine::privateExecute): - * kjs/config.h: - * kjs/object.cpp: - (KJS::JSObject::call): - -2008-05-23 Oliver Hunt - - Turn on JavaScript Profiler - - Reviewed by Kevin McCullough. - - Flipped the switch on the profiler, rearranged how we - signal the the profiler is active so that calls aren't - needed in the general case. - - Also fixed the entry point for Machine::execute(FunctionBodyNode..) - to correctly indicate function exit. - - Results in a 0.7-1.0% regression in SunSpider :-( - - * VM/Machine.cpp: - (KJS::callEval): - (KJS::Machine::unwindCallFrame): - (KJS::Machine::execute): - (KJS::Machine::privateExecute): - * kjs/config.h: - * profiler/Profiler.cpp: - (KJS::Profiler::profiler): - (KJS::Profiler::startProfiling): - (KJS::Profiler::stopProfiling): - * profiler/Profiler.h: - (KJS::Profiler::enabledProfilerReference): - -2008-05-23 Simon Hausmann - - Fix the Qt build by adding profiler/ to the include search path. - - * JavaScriptCore.pri: - -2008-05-22 Kevin McCullough - - Reviewed by Adam. - - Fix a bug in the profiler where time in the current function is given to - (idle). - - * profiler/Profile.cpp: - (KJS::Profile::didExecute): Set the start time and then call didExecute - to calculate the time spent in this function. - * profiler/ProfileNode.cpp: Remove confusing calculations that are no - longer necessary. - (KJS::ProfileNode::insertNode): - * profiler/ProfileNode.h: Expose access to the start time to allow the - simpler time calculations above. - (KJS::ProfileNode::startTime): - (KJS::ProfileNode::setStartTime): - -2008-05-22 Adam Roben - - Show "(Function object)" instead of "(JSInpectorCallbackWrapper - object)" in profiles - - Reviewed by Kevin McCullough. - - * profiler/Profiler.cpp: - (KJS::createCallIdentifier): Use JSObject::className instead of - getting the class name from the ClassInfo directly. JSObject - subclasses can override className to provide a custom class name, and - it seems like we should honor that. - -2008-05-22 Timothy Hatcher - - Added Profile::restoreAll and added ProfileNode::restoreAll - to the export file. - - Reviewed by Adam Roben. - - * JavaScriptCore.exp: - * profiler/Profile.h: - -2008-05-22 Alp Toker - - GTK+ build fix. Add JavaScriptCore/profiler to include path. - - * GNUmakefile.am: - -2008-05-22 Adam Roben - - Implement sub-millisecond profiling on Windows - - Reviewed by Kevin McCullough. - - * profiler/ProfileNode.cpp: - (KJS::getCount): Added. On Windows, we use QueryPerformanceCounter. On - other platforms, we use getCurrentUTCTimeWithMicroseconds. - (KJS::ProfileNode::endAndRecordCall): Use getCount instead of - getCurrentUTCTimeWithMicroseconds. - (KJS::ProfileNode::startTimer): Ditto. - -2008-05-22 Adam Roben - - Fix a profiler assertion when calling a NodeList as a function - - Reviewed by Kevin McCullough. - - * profiler/Profiler.cpp: - (KJS::createCallIdentifier): Don't assert when a non-function object - is called as a function. Instead, build up a CallIdentifier using the - object's class name. - -2008-05-22 Kevin McCullough - - Reviewed by Darin. - - JSProfiler: Allow the profiler to "Exclude" a - profile node. - -Implement 'exclude'; where the excluded node attributes its time to its - parent's self time. - - * JavaScriptCore.exp: Export the exclude function. - * profiler/Profile.h: - (KJS::Profile::exclude): - * profiler/ProfileNode.cpp: - (KJS::ProfileNode::setTreeVisible): New function that allows a change in - visiblitiy to be propogated to all the children of a node. - (KJS::ProfileNode::exclude): If the node matches the callIdentifier then - set the visiblity of this node and all of its children to false and - attribute it's total time to it's caller's self time. - * profiler/ProfileNode.h: - -2008-05-22 Mark Rowe - - Reviewed by Oliver Hunt. - - Fix access to static global variables in Windows release builds. - - * kjs/JSGlobalObject.h: Don't store a reference to an Identifier - in GlobalPropertyInfo as the Identifier is likely to be a temporary - and therefore may be destroyed before the GlobalPropertyInfo. - -2008-05-22 Kevin McCullough - - Build fix. - - * VM/Machine.cpp: - (KJS::callEval): - -2008-05-22 Kevin McCullough - - Reviewed by Sam. - - Turn on JavaScript Profiler - Get basic JS profiling working. - Even with this patch the profiler will not be compiled in because we do - not know the extend, if any, of the performance regression it would cause - when it is not in use. However with these changes, if the profiler were - on, it would not crash and show good profiling data. - - * VM/Machine.cpp: Instrument the calls sites that are needed for profiling. - (KJS::callEval): - (KJS::Machine::unwindCallFrame): - (KJS::Machine::execute): - (KJS::Machine::privateExecute): - * kjs/function.cpp: Ditto. - (KJS::globalFuncEval): - * kjs/interpreter.cpp: Ditto. - (KJS::Interpreter::evaluate): - * profiler/Profile.cpp: - (KJS::Profile::willExecute): - (KJS::Profile::didExecute): Because we do not get a good context when - startProfiling is called it is possible that m_currentNode will be at the - top of the known stack when a didExecute() is called. What we then do is - create a new node that represents the function being exited and insert - it between the head and the currently known children, since they should - be children of this new node. - * profiler/ProfileNode.cpp: - (KJS::ProfileNode::ProfileNode): - (KJS::ProfileNode::willExecute): Rename the add function for consistency. - (KJS::ProfileNode::addChild): Appends the child to this node but also - sets the parent pointer of the children to this node. - (KJS::ProfileNode::insertNode): Insert a node between this node and its - children. Also set the time for the new node since it is now exiting - and we don't really know when it started. - (KJS::ProfileNode::stopProfiling): - (KJS::ProfileNode::startTimer): - * profiler/ProfileNode.h: - (KJS::CallIdentifier::toString): Added for debugging. - (KJS::ProfileNode::setParent): - (KJS::ProfileNode::setSelfTime): Fixed an old bug where we set the - visibleTotalTime not the visibleSelfTime. - (KJS::ProfileNode::children): - (KJS::ProfileNode::toString): Added for debugging. - * profiler/Profiler.cpp: remove unecessary calls. - (KJS::Profiler::startProfiling): - -2008-05-22 Sam Weinig - - Reviewed by Oliver Hunt. - - Rename register arguments for op_call, op_call_eval, op_end, and op_construct - to document what they are for. - - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::emitCall): - (KJS::CodeGenerator::emitCallEval): - (KJS::CodeGenerator::emitEnd): - (KJS::CodeGenerator::emitConstruct): - * VM/CodeGenerator.h: - * VM/Machine.cpp: - (KJS::Machine::privateExecute): - -2008-05-22 Oliver Hunt - - Reviewed by Darin. - - Bug 19116: SquirrelFish shouldn't regress on variable lookups - - - Last of the multiscope look up optimisations. This is a wash overall on SunSpider - but is a factor of 5-10 improvement in multiscope read/write/modify (eg. ++, --, +=, - ... applied to any non-local var). - - * kjs/nodes.cpp: - (KJS::PostIncResolveNode::emitCode): - (KJS::PostDecResolveNode::emitCode): - (KJS::PreIncResolveNode::emitCode): - (KJS::PreDecResolveNode::emitCode): - (KJS::ReadModifyResolveNode::emitCode): - -2008-05-22 David Kilzer - - Add method to release free memory from FastMalloc - - Patch suggested by Mark Rowe. Rubber-stamped by Maciej. - - * JavaScriptCore.exp: Export _releaseFastMallocFreeMemory. - * wtf/FastMalloc.cpp: - (WTF::TCMallocStats::): Added releaseFastMallocFreeMemory() for both - system malloc and FastMalloc code paths. - * wtf/FastMalloc.h: Define releaseFastMallocFreeMemory(). - -2008-05-22 Oliver Hunt - - RS=Maciej. - - Roll out r34020 as it causes recursion tests to fail. - - * kjs/object.cpp: - (KJS::JSObject::call): - -2008-05-22 Oliver Hunt - - Reviewed by Mark. - - Don't leak the SymbolTable when compiling eval code. - - * kjs/nodes.cpp: - (KJS::EvalNode::generateCode): - -2008-05-22 Simon Hausmann - - Reviewed by Oliver. - - Qt build fix. - - * JavaScriptCore.pri: Added DebuggerCallFrame to the build. - * VM/LabelID.h: Include limits.h for UINT_MAX. - * wtf/VectorTraits.h: Include memory for std::auto_ptr. - -2008-05-22 Geoffrey Garen - - Reviewed by Adam Roben. - - Removed the old recursion guard mechanism, since squirrelfish has its - own mechanism. Also removed some old JS call tracing code, since we - have other ways to do that, too. - - SunSpider reports no change. - - * kjs/object.cpp: - (KJS::JSObject::call): - -2008-05-22 Maciej Stachowiak - - Reviewed by Oliver. - - - fixed crash on celtic kane JS benchmark - - * kjs/nodes.cpp: - (KJS::WithNode::emitCode): - (KJS::TryNode::emitCode): - -2008-05-21 Kevin McCullough - - Reviewed by Maciej and Geoff. - - Turn on JavaScript Profiler - -As part of the effort to turn on the profiler it would be helpful if it - did not need ExecStates to represent the stack location of the currently - executing statement. - -We now create each node as necessary with a reference to the current - node and each node knows its parent so that the tree can be made without - the entire stack. - - * profiler/Profile.cpp: - (KJS::Profile::Profile): The current node starts at the head. - (KJS::Profile::stopProfiling): The current node is cleared when profiling - stops. - (KJS::Profile::willExecute): The current node either adds a new child or - starts and returns a reference to an already existing child if the call - ID that is requested already exists. - (KJS::Profile::didExecute): The current node finishes and returns its - parent. - * profiler/Profile.h: Use a single callIdentifier instead of a vector - since we no longer use the whole stack. - * profiler/ProfileNode.cpp: Now profile nodes keep a reference to their - parent. - (KJS::ProfileNode::ProfileNode): Initialize the parent. - (KJS::ProfileNode::didExecute): Record the time and return the parent. - (KJS::ProfileNode::addOrStartChild): If the given callIdentifier is - already a child, start it and return it, otherwise create a new one and - return that. - (KJS::ProfileNode::stopProfiling): Same logic, just use the new function. - * profiler/ProfileNode.h: Utilize the parent. - (KJS::ProfileNode::create): - (KJS::ProfileNode::parent): - * profiler/Profiler.cpp: - (KJS::Profiler::startProfiling): Here is the only place where the - ExecState is used to figure out where in the stack the profiler is - currently profiling. - (KJS::dispatchFunctionToProfiles): Only send one CallIdentifier instead - of a vector of them. - (KJS::Profiler::willExecute): Ditto. - (KJS::Profiler::didExecute): Ditto. - (KJS::createCallIdentifier): Create only one CallIdentifier. - (KJS::createCallIdentifierFromFunctionImp): Ditto. - * profiler/Profiler.h: - -2008-05-21 Darin Adler - - Reviewed by Maciej. - - - https://bugs.webkit.org/show_bug.cgi?id=19180 - speed up the < operator for the case when both values are integers - - Makes standalone SunSpider 1.022x faster. - - * VM/Machine.cpp: - (KJS::jsLess): Add a special case for when both are numbers that fit in a JSImmediate. - -2008-05-21 Maciej Stachowiak - - Reviewed by Oliver and Sam. - - - fixed REGRESSION (r31239): Multiscope optimisation of function calls results in incorrect this value (breaks tvtv.de) - - Track global this value in the scope chain so we can retrieve it - efficiently but it follows lexical scope properly. - - * kjs/ExecState.h: - (KJS::ExecState::globalThisValue): - * kjs/JSGlobalObject.h: - (KJS::JSGlobalObject::JSGlobalObjectData::JSGlobalObjectData): - * kjs/function_object.cpp: - (KJS::FunctionObjectImp::construct): - * kjs/scope_chain.h: - (KJS::ScopeChainNode::ScopeChainNode): - (KJS::ScopeChainNode::globalThisObject): - (KJS::ScopeChainNode::push): - (KJS::ScopeChain::ScopeChain): - -2008-05-21 Kevin McCullough - - Sadness :( - - * kjs/config.h: - -2008-05-21 Kevin McCullough - - Reviewed by Maciej. - - JSProfiler: Allow the profiler to "Focus" a - profile node. - - This patch updatest the times of the visible nodes correctly, but to do - so, some of the design of the ProfileNode changed. - - * JavaScriptCore.exp: export focus' symbol. - * profiler/Profile.cpp: ProfileNodes now take a reference to the head of - the profile tree to get up-to-date accurate total profile time. - (KJS::Profile::Profile): Pass 0 for the head node. - (KJS::Profile::stopProfiling): stopProfiling no longer needs the time - passed into it, since it can get it from the head and it does not need to - be told it is the head because it can figure it out on it's own. - (KJS::Profile::willExecute): Set the head node for each created node. - * profiler/Profile.h: - (KJS::Profile::focus): Instead of taking a CallIdentifier that the caller - would have to create, now focus() takes a ProfileNode that they should - already have a reference to and focus() can extract the CallIdentifier - from it. - * profiler/ProfileNode.cpp: Create actual and visible versions fo the - total and self times for focus and exclude. Also add a head node - reference so that nodes can get information from their head. - (KJS::ProfileNode::ProfileNode): - (KJS::ProfileNode::stopProfiling): Rename the total and self time - variables and set the visual ones to the actual ones, so that without any - changes to the visual versions of these variables, their times will match - the actual times. - (KJS::ProfileNode::focus): Now focus() has a bool to force it's children - to be visible if this node is visible. If this node does not match the - CallIdentifier being focused then the visibleTotalTime is only updated if - one or more of it's children is the CallIdentifier being focused. - (KJS::ProfileNode::restoreAll): Restores all variables with respect to - the visible data in the ProfileNode. - (KJS::ProfileNode::endAndRecordCall): Name change. - (KJS::ProfileNode::debugPrintData): Dump the new variables. - (KJS::ProfileNode::debugPrintDataSampleStyle): Name change. - * profiler/ProfileNode.h: Use the new variables and reference to the head - node. - (KJS::ProfileNode::create): - (KJS::ProfileNode::totalTime): - (KJS::ProfileNode::setTotalTime): - (KJS::ProfileNode::selfTime): - (KJS::ProfileNode::setSelfTime): - (KJS::ProfileNode::totalPercent): - (KJS::ProfileNode::selfPercent): - (KJS::ProfileNode::setVisible): - -2008-05-21 Alp Toker - - GTK+/UNIX testkjs build fix. Include signal.h. - - * kjs/testkjs.cpp: - -2008-05-21 Oliver Hunt - - Yet more windows build fixes - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - -2008-05-21 Oliver Hunt - - Yet more windows build fixes - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - -2008-05-21 Alp Toker - - GTK+ build fix. Add DebuggerCallFrame.cpp and take AllInOneFile.cpp - changes into account. - - * GNUmakefile.am: - -2008-05-21 Oliver Hunt - - Add DebuggerCallFrame.{h,cpp} to the project file - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - -2008-05-21 Alp Toker - - GTK+ port build fixes following squirrelfish merge r33979. - - * GNUmakefile.am: - -2008-05-21 Maciej Stachowiak - - Reviewed by Darin. - - - save a hash lookup wne writing to global properties - 0.3% speedup on SunSpider, 7% on bitops-bitwise-and - - * VM/Machine.cpp: - (KJS::resolveBase): Check for being a the end of the scope chain - before hash lookup. - -2008-05-21 Alp Toker - - Rubber-stamped by Maciej. - - Replace non-standard #pragma marks with comments to avoid compiler - warnings. - - * profiler/ProfileNode.cpp: - -2008-05-21 Geoffrey Garen - - Reviewed by Mark Rowe. - - Fix layout test failure in fast/dom/getter-on-window-object2 introduced in r33961. - - * JavaScriptCore.exp: - * kjs/JSGlobalObject.cpp: - (KJS::JSGlobalObject::defineGetter): - (KJS::JSGlobalObject::defineSetter): - * kjs/JSGlobalObject.h: - -=== End merge of squirrelfish === - -2008-05-21 Geoffrey Garen - - Reviewed by Tim Hatcher. - - Merged with trunk WebCore's new debugger. - - * kjs/DebuggerCallFrame.cpp: - (KJS::DebuggerCallFrame::evaluate): Changed this function to separate - the exception value from the return value. The WebKit debugger treats - them as one, but the WebCore debugger doesn't. - - * kjs/DebuggerCallFrame.h: - (KJS::DebuggerCallFrame::dynamicGlobalObject): Added a new accessor for - the dynamic global object, since the debugger doesn't want the lexical - global object. - -2008-05-21 Oliver Hunt - - Reviewed by Maciej. - - Bug 19116: SquirrelFish shouldn't regress on variable lookups - - - Optimise cross scope assignment, 0.4% progression in sunspider. - - * VM/CodeBlock.cpp: - (KJS::CodeBlock::dump): - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::emitPutScopedVar): - * VM/CodeGenerator.h: - * VM/Machine.cpp: - (KJS::Machine::privateExecute): - * VM/Opcode.h: - * kjs/nodes.cpp: - (KJS::AssignResolveNode::emitCode): - -2008-05-21 Maciej Stachowiak - - Reviewed by Oliver. - - - check property map before symbol table in JSGlobalObject::getOwnPropertySlot - 0.5% speedup on SunSpider - - * kjs/JSGlobalObject.h: - (KJS::JSGlobalObject::getOwnPropertySlot): Check property map before symbol table - because symbol table access is likely to have been optimized. - -2008-05-21 Oliver Hunt - - Reviewed by Maciej. - - Bug 19116: SquirrelFish shouldn't regress on variable lookups - - - Optimise multiscope lookup of statically resolvable function calls. - SunSpider reports a 1.5% improvement, including 37% on - controlflow-recursive for some reason :D - - * VM/CodeBlock.cpp: - (KJS::CodeBlock::dump): - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::emitResolve): - * VM/CodeGenerator.h: - * kjs/nodes.cpp: - (KJS::FunctionCallResolveNode::emitCode): - -2008-05-21 Maciej Stachowiak - - Reviewed by Oliver. - - - give JSGlobalObject a special version of getOwnPropertySlot that tells you if the slot is directly writable - (WebCore change using this is a 2.6% speedup on in-browser SunSpider). - - * JavaScriptCore.exp: - * kjs/JSGlobalObject.h: - (KJS::JSGlobalObject::getOwnPropertySlot): - * kjs/JSVariableObject.h: - (KJS::JSVariableObject::symbolTableGet): - * kjs/object.h: - (KJS::JSObject::getDirectLocation): - (KJS::JSObject::getOwnPropertySlotForWrite): - * kjs/property_map.cpp: - (KJS::PropertyMap::getLocation): - * kjs/property_map.h: - * kjs/property_slot.h: - (KJS::PropertySlot::putValue): - -2008-05-20 Oliver Hunt - - Reviewed by Maciej. - - Bug 19116: SquirrelFish shouldn't regress on variable lookups - - - This restores multiscope optimisation to simple resolve, producing - a 2.6% progression in SunSpider. Have verified that none of the - sites broken by the multiscope optimisation in trunk were effected - by this change. - - * VM/CodeBlock.cpp: - (KJS::CodeBlock::dump): - * VM/CodeBlock.h: - (KJS::CodeBlock::CodeBlock): - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::findScopedProperty): - (KJS::CodeGenerator::emitResolve): - * VM/CodeGenerator.h: - * VM/Machine.cpp: - (KJS::resolve_n): - (KJS::Machine::privateExecute): - * VM/Opcode.h: - * kjs/JSVariableObject.h: - -2008-05-20 Oliver Hunt - - Fixerate the windows build. - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * VM/CodeGenerator.cpp: - * VM/RegisterFile.h: - * kjs/JSGlobalObject.h: - * kjs/Parser.cpp: - * kjs/interpreter.h: - -2008-05-20 Oliver Hunt - - Reviewed by Geoff. - - Bug 19110: SquirrelFish: Google Maps - no maps - - - Correct a comedy of errors present in my original patch to "fix" - exceptions occurring midway through pre and post increment. This - solution is cleaner than the original, doesn't need the additional - opcodes, and as an added benefit does not break Google Maps. - - Sunspider reports a 0.4% progression. - - * VM/CodeBlock.cpp: - (KJS::CodeBlock::dump): - * VM/CodeGenerator.cpp: - * VM/CodeGenerator.h: - * VM/Machine.cpp: - (KJS::Machine::privateExecute): - * VM/Opcode.h: - * kjs/nodes.cpp: - (KJS::PreIncResolveNode::emitCode): - (KJS::PreDecResolveNode::emitCode): - (KJS::PreIncBracketNode::emitCode): - (KJS::PreDecBracketNode::emitCode): - (KJS::PreIncDotNode::emitCode): - (KJS::PreDecDotNode::emitCode): - -2008-05-20 Maciej Stachowiak - - Reviewed by Oliver. - - - inline JSGlobalObject::getOwnPropertySlot - 1% improvement on in-browser SunSpider (a wash command-line) - - * kjs/JSGlobalObject.cpp: - * kjs/JSGlobalObject.h: - (KJS::JSGlobalObject::getOwnPropertySlot): - -2008-05-18 Oliver Hunt - - Reviewed by Maciej. - - Bug 18752: SQUIRRELFISH: exceptions are not always handled by the vm - - - Handle exceptions thrown by toString conversion in subscript operators, - this should basically complete exception handling in SquirrelFish. - - Sunspider reports no regression. - - * VM/Machine.cpp: - (KJS::Machine::privateExecute): - -2008-05-17 Geoffrey Garen - - Reviewed by Oliver Hunt. - - [Reapplying patch with previously missing files from r33553 -- Oliver] - - Behold: debugging. - - SunSpider reports no change. - - * JavaScriptCore.xcodeproj/project.pbxproj: Added DebuggerCallFrame.h/.cpp, - and created a debugger folder. - - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::generate): If the debugger is attached, always - generate full scope chains for its sake. - - * VM/Machine.cpp: - (KJS::Machine::unwindCallFrame): Notify the debugger when unwinding - due to an exception, so it doesn't keep stale call frames around. - - (KJS::Machine::execute): Set Callee to 0 in eval frames, so the - debugger can distinguish them from function call frames. - - (KJS::Machine::debug): Simplified this function, since the debugger - doesn't actually need all the information we used to provide. - - (KJS::Machine::privateExecute): Treat debugging hooks like other function - calls, so the code we hook into (the debugger UI) can be optimized. - - * kjs/debugger.cpp: Nixed these default callback implementations and - made the callbacks pure virtual instead, so the compiler could tell me - if I made a mistake in one of the subclasses. - - * kjs/debugger.h: Removed a bunch of irrelevent data from the debugger - callbacks. Changed from passing an ExecState* to passing a - DebuggerCallFrame*, since an ExecState* doesn't contain sufficient - information anymore. - - * kjs/function.cpp: - (KJS::globalFuncEval): Easiest bug fix evar! - - [Previously missing files from r33553] - * kjs/DebuggerCallFrame.cpp: Copied from JavaScriptCore/profiler/FunctionCallProfile.h. - (KJS::DebuggerCallFrame::functionName): - (KJS::DebuggerCallFrame::thisObject): - (KJS::DebuggerCallFrame::evaluateScript): - * kjs/DebuggerCallFrame.h: Copied from JavaScriptCore/VM/Register.h. - (KJS::DebuggerCallFrame::DebuggerCallFrame): - (KJS::DebuggerCallFrame::scopeChain): - (KJS::DebuggerCallFrame::exception): - -2008-05-17 Cameron Zwarich - - Reviewed by Oliver. - - Bug 18991: SquirrelFish: Major codegen issue in a.b=expr, a[b]=expr - - - Fix the last remaining blocking cases of this bug. - - * kjs/grammar.y: - * kjs/nodes.cpp: - (KJS::ReadModifyResolveNode::emitCode): - -2008-05-17 Cameron Zwarich - - Reviewed by Oliver. - - Partial fix for: - - Bug 18991: SquirrelFish: Major codegen issue in a.b=expr, a[b]=expr - - - Ensure that the code generated for assignments uses temporaries whenever - necessary. This patch covers the vast majority of situations, but there - are still a few left. - - This patch also adds some missing cases to CodeBlock::dump(). - - * VM/CodeBlock.cpp: - (KJS::CodeBlock::dump): - * VM/CodeGenerator.h: - (KJS::CodeGenerator::destinationForAssignResult): - (KJS::CodeGenerator::leftHandSideNeedsCopy): - (KJS::CodeGenerator::emitNodeForLeftHandSide): - * kjs/NodeInfo.h: - * kjs/grammar.y: - * kjs/nodes.cpp: - (KJS::AssignDotNode::emitCode): - (KJS::ReadModifyDotNode::emitCode): - (KJS::AssignBracketNode::emitCode): - (KJS::ReadModifyBracketNode::emitCode): - (KJS::ForInNode::ForInNode): - * kjs/nodes.h: - (KJS::ReadModifyResolveNode::): - (KJS::AssignResolveNode::): - (KJS::ReadModifyBracketNode::): - (KJS::AssignBracketNode::): - (KJS::AssignDotNode::): - (KJS::ReadModifyDotNode::): - -2008-05-17 Oliver Hunt - - Reviewed by Maciej. - - Bug 19106: SquirrelFish: Activation is not marked correctly - - - We can't rely on the symbol table for a count of the number of globals - we need to mark as that misses duplicate parameters and 'this'. Now we - use the actual local register count from the codeBlock. - - * kjs/JSActivation.cpp: - (KJS::JSActivation::mark): - -2008-05-16 Oliver Hunt - - Reviewed by Geoff. - - Bug 19076: SquirrelFish: RegisterFile can be corrupted if implictly reenter global scope with no declared vars - - - Don't delay allocation of initial global RegisterFile, as we can't guarantee we will be able - to allocate the global 'this' register safely at any point after initialisation of the Global - Object. - - Unfortunately this initial allocation caused a regression of 0.2-0.3%, however this patch adds - support for the static slot optimisation for the global Math object which brings it to a 0.3% - progression. - - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::programCodeThis): - (KJS::CodeGenerator::CodeGenerator): - (KJS::CodeGenerator::addParameter): - * VM/CodeGenerator.h: - * VM/Machine.cpp: - (KJS::Machine::execute): - * kjs/ExecState.h: - * kjs/JSGlobalObject.cpp: - (KJS::JSGlobalObject::reset): - * kjs/JSGlobalObject.h: - (KJS::JSGlobalObject::GlobalPropertyInfo::GlobalPropertyInfo): - (KJS::JSGlobalObject::addStaticGlobals): - * kjs/nodes.cpp: - -2008-05-16 Cameron Zwarich - - Reviewed by Oliver Hunt. - - Bug 19098: SquirrelFish: Ref'd temporaries can be clobbered - - - When doing code generation for a statement list, increase the reference - count on a register that might eventually be returned, so that it doesn't - get clobbered by a request for a new temporary. - - * kjs/nodes.cpp: - (KJS::statementListEmitCode): - -2008-05-16 Maciej Stachowiak - - Reviewed by Oliver. - - - fixed Bug 19044: SquirrelFish: Bogus values enter evaluation when closing over scope with parameter and var with same name - https://bugs.webkit.org/show_bug.cgi?id=19044 - - * kjs/JSActivation.cpp: - (KJS::JSActivation::copyRegisters): Use numLocals from the code - block rather than the size of the symbol table for the number of - registers to copy, to account for duplicate parameters and vars - with the same name as parameters (we still have potentially - suboptimal codegen in that we allocate a local register for the - var in the latter case but it is never used). - -2008-05-15 Geoffrey Garen - - Not reviewed. - - We regret to inform you that your program is crashing because you were - stupid. - - * VM/Machine.cpp: - (KJS::Machine::privateExecute): Math is hard. - -2008-05-14 Geoffrey Garen - - Reviewed by Oliver Hunt. - - A little more debugger action: filled in op_debug. All debugger control - flow works now, but variable inspection and backtraces still don't. - - SunSpider reports no change. - - * VM/CodeGenerator.cpp: Changed op_debug to accept line number parameters. - - * VM/Machine.cpp: - (KJS::Machine::getFunctionAndArguments): Moved op_debug into a - NEVER_INLINE function to avoid a stunning 10% performance regression. - Also factored out a common function for retrieving the function and - arguments from a call frame. - - * kjs/JSActivation.cpp: - (KJS::JSActivation::createArgumentsObject): Use the new factored out - function mentioned above. - - * kjs/Parser.cpp: - (KJS::Parser::parse): Increment m_sourceId before assigning it, so the - sourceId we send to the debugger matches the sourceId recorded in the - node. - - * kjs/nodes.cpp: Emit debugging hooks. - -2008-05-14 Oliver Hunt - - Reviewed by Maciej. - - Bug 19024: SQUIRRELFISH: ASSERTION FAILED: activation->isActivationObject() in Machine::unwindCallFrame - - - This fixes a number of issues. The most important is that we now check every register - file for tainting rather than just looking for function register files as that was - insufficient. Additionally guarded against implicit re-entry into Eval code. - - Also added a few additional assertions to reduce the amout of time between something - going wrong and us seeing the error. - - * VM/Machine.cpp: - (KJS::Machine::execute): - (KJS::Machine::privateExecute): - * VM/RegisterFile.cpp: - (KJS::RegisterFile::growBuffer): - (KJS::RegisterFile::addGlobalSlots): - * VM/RegisterFileStack.cpp: - (KJS::RegisterFileStack::pushGlobalRegisterFile): - (KJS::RegisterFileStack::pushFunctionRegisterFile): - * VM/RegisterFileStack.h: - (KJS::RegisterFileStack::inImplicitCall): - -2008-05-14 Geoffrey Garen - - Reviewed by Oliver Hunt. - - A little more debugger action: emit opcodes for debugger hooks. Right - now, the opcode implementation is just a stub. - - SunSpider reports no change. - - Some example codegen for "function f() { 1; }": - - [ 0] dbg DidEnterCallFrame - [ 2] dbg WillExecuteStatement - [ 4] load tr0, 1(@k0) - [ 7] load tr0, undefined(@k1) - [ 10] dbg WillLeaveCallFrame - [ 12] ret tr0 - -2008-05-14 Oliver Hunt - - Reviewed by Geoff. - - Bug 19025: SQUIRRELFISH: malformed syntax in onload handler causes crash - - - Simple fix -- move the use of functionBodyNode to after the null check. - - * kjs/function_object.cpp: - (KJS::FunctionObjectImp::construct): - -2008-05-13 Geoffrey Garen - - Reviewed by Oliver Hunt. - - Fixed a codegen crash with run-time parse errors. - - SunSpider reports no change. - - emitThrowError needs to return the temporary holding the error, not dst, - since dst may be NULL. In fact, emitThrowError shouldn't take a dst - parameter at all, since exceptions should not modify the destination - register. - -2008-05-13 Oliver Hunt - - Reviewed by Geoff. - - Bug 19027: SquirrelFish: Incorrect codegen for pre-increment - - - This fixes the codegen issues for the pre-inc/decrement operators - to prevent incorrectly clobbering the destination in the event of - an exception. - - * VM/CodeBlock.cpp: - (KJS::CodeBlock::dump): - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::emitPreInc): - (KJS::CodeGenerator::emitPreDec): - * VM/CodeGenerator.h: - * VM/Machine.cpp: - (KJS::Machine::privateExecute): - * VM/Opcode.h: - * kjs/nodes.cpp: - (KJS::PreIncResolveNode::emitCode): - (KJS::PreDecResolveNode::emitCode): - (KJS::PreIncBracketNode::emitCode): - (KJS::PreDecBracketNode::emitCode): - (KJS::PreIncDotNode::emitCode): - (KJS::PreDecDotNode::emitCode): - -2008-05-13 Geoffrey Garen - - Reviewed by Oliver Hunt. - - A little more debugger action: supply a real line number, sourceId, - and sourceURL in op_new_error. - - SunSpider reports a .2% speedup. Not sure what that's about. - - * VM/Machine.cpp: - (KJS::Machine::privateExecute): Use the new good stuff in op_new_error. - - * kjs/nodes.cpp: - (KJS::RegExpNode::emitCode): Use the shared emitThrowError instead of - rolling our own. - -2008-05-13 Geoffrey Garen - - Reviewed by Oliver Hunt. - - A little more debugger action: implemented the exception callback. - - SunSpider reports a .2% speedup. Not sure what that's about. - - * VM/CodeBlock.h: A little refactoring here. Store a pointer to our - owner ScopeNode so we can retrieve data from it. This allows us to - stop storing copies of the data ourselves. Also, store a "this" register - instead of a code type, since we were only using the code type to - calculate the "this" register. - - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::generate): Calculate the "this" register mentioned - above. Also, take care of removing "this" from the symbol table after - codegen is done, since relying on the timing of a destructor for correct - behavior is not so good. - - * VM/Machine.cpp: - (KJS::Machine::throwException): Invoke the debugger's exception callback. - (KJS::Machine::privateExecute): Use the "this" register mentioned above. - -2008-05-13 Geoffrey Garen - - Reviewed by Oliver Hunt. - - Removed some unused exception machinery. - - SunSpider reports a .3% speedup. - - * API/JSCallbackObject.h: - * API/JSCallbackObjectFunctions.h: - * JavaScriptCore.exp: - * VM/Machine.cpp: - (KJS::Machine::privateExecute): - * kjs/internal.cpp: - * kjs/object.cpp: - * kjs/object.h: - * kjs/value.h: - -2008-05-13 Geoffrey Garen - - Reviewed by Oliver Hunt. - - A little more debugger action. - - * kjs/debugger.cpp: - * kjs/debugger.h: Removed debuggersPresent because it was unused. - Replaced AttachedGlobalObject linked list with a HashSet because HashSet - is faster and simpler. Changed all functions to return void instead of - bool, because no clients ever return false, and we don't want to support - it. - - * kjs/nodes.cpp: Did some up-keep to avoid build bustage. - (KJS::Node::handleException): - (KJS::BreakpointCheckStatement::execute): - (KJS::FunctionBodyNodeWithDebuggerHooks::execute): - -2008-05-13 Oliver Hunt - - Reviewed by Darin. - - Bug 18752: SQUIRRELFISH: exceptions are not always handled by the vm - - - Replace old attempt at "branchless" exceptions as the extra information - being passed made gcc an unhappy compiler, replacing these custom toNumber - calls with ordinary toNumber logic (by relying on toNumber now preventing - side effects after an exception has been thrown) provided sufficient leeway - to add the additional checks for the remaining unchecked cases. - - This leaves only toString conversions in certain contexts as possibly - misbehaving. - - * VM/Machine.cpp: - (KJS::jsAdd): - (KJS::resolve): - (KJS::resolveBaseAndProperty): - (KJS::resolveBaseAndFunc): - (KJS::Machine::privateExecute): - * VM/Opcode.h: - * kjs/value.h: - (KJS::JSValue::safeGetNumber): - -2008-05-13 Geoffrey Garen - - Reviewed by Oliver Hunt. - - First steps toward supporting the debugger API: support the sourceParsed - callback; plus some minor fixups. - - SunSpider reports no regression. - - * VM/CodeGenerator.h: Removed a misleading comment. - - * kjs/Parser.h: Changed the parser to take an ExecState*, so it can - implement the sourceParsed callback -- that way, we only have to - implement the callback in one place. - - * kjs/debugger.cpp: Nixed DebuggerImp, because its sole purpose in life - was to demonstrate the misapplication of design patterns. - - * kjs/debugger.h: Changed sourceParsed to take a SourceProvider, to - reduce copying, and not to return a value, because pausing execution - after parsing is complicated, and no clients needed that ability, anyway. - - * kjs/grammar.y: Make sure never to pass a NULL SourceElements* to - didFinishParsing -- that simplifies some code down the road. - - * kjs/nodes.cpp: Don't generate special AST nodes just because the - debugger is attached -- that's a relic of the old AST execution model, - and those nodes haven't been maintained. - -2008-05-13 Oliver Hunt - - Reviewed by Geoff. - - Bug 18752: SQUIRRELFISH: exceptions are not always handled by the vm - - - First step: prevent incorrect evaluation of valueOf/toString conversion - in right hand side of expression after earlier conversion throws. - - * API/JSCallbackObjectFunctions.h: - (KJS::::toNumber): - * kjs/object.cpp: - (KJS::JSObject::defaultValue): - -2008-05-12 Oliver Hunt - - Reviewed by Geoff. - - Bug 18934: SQUIRRELFISH: ASSERT @ nytimes.com due to RegisterFile being clobbered - - - Unfortunately we cannot create new statically optimised globals if there are any - tainted RegisterFiles on the RegisterFileStack. To handle this we re-introduce - (in a slightly cleaner form) the inImplicitCall concept to the RegisterFileStack. - - * VM/Machine.cpp: - (KJS::Machine::execute): - * VM/RegisterFileStack.cpp: - (KJS::RegisterFileStack::pushFunctionRegisterFile): - * VM/RegisterFileStack.h: - -2008-05-12 Geoffrey Garen - - Reviewed by Maciej Stachowiak. - - Introduced support for function.caller. - - Improved support for walking interesting scopes for function introspection. - - This fixes all remaining layout tests not blocked by rebasing to trunk. - - SunSpider reports no change. - - * VM/Machine.cpp: - (KJS::Machine::dumpRegisters): Fixed a spacing issue. - -2008-05-11 Cameron Zwarich - - Reviewed by Oliver. - - Bug 18961: SQUIRRELFISH: Gmail doesn't load - - - Fix codegen for logical nodes so that they don't use their destination - as a temporary. - - * kjs/nodes.cpp: - (KJS::LogicalAndNode::emitCode): - (KJS::LogicalOrNode::emitCode): - -2008-05-10 Maciej Stachowiak - - Reviewed by Oliver. - - - JavaScriptCore part of fix for: "SQUIRRELFISH: function toString broken after calling" - https://bugs.webkit.org/show_bug.cgi?id=18869 - - Three layout tests are fixed: - fast/js/toString-elision-trailing-comma.html - fast/js/toString-prefix-postfix-preserve-parens.html - fast/js/kde/lval-exceptions.html - - Functions now save a shared subrange of the original source used - to make them (so in the common case this adds no storage above the - memory cache). - - * kjs/SourceProvider.h: Added. - (KJS::SourceProvider): New abstract base class for classes that provide on-demand access - to the source for a JavaScript program. This allows function objects to have access to their - original source without copying. - (KJS::UStringSourceProvider): SourceProvider subclass backed by a KJS::UString. - (KJS::UStringSourceProvider::create): - (KJS::UStringSourceProvider::getRange): - (KJS::UStringSourceProvider::data): - (KJS::UStringSourceProvider::length): - (KJS::UStringSourceProvider::UStringSourceProvider): - * kjs/SourceRange.h: Added. - (KJS::SourceRange::SourceRange): Class that holds a SourceProvider and a character range into - the source, to encapsulate on-demand access to the source of a function. - (KJS::SourceRange::toString): - * VM/Machine.cpp: - (KJS::eval): Pass a UStringSourceProvider to the parser. - * kjs/Parser.cpp: - (KJS::Parser::parse): Take a SourceProvider and pass it on to the lexer. - * kjs/Parser.h: - (KJS::Parser::parse): Take a SourceProvider. - * kjs/lexer.cpp: - (KJS::Lexer::setCode): Take a SourceProvider; keep it around, and - use it to get the raw buffer and length. - * kjs/lexer.h: - (KJS::Lexer::sourceRange): Convenience function to get a source - range based on the lexer's source provieder, and char offsets - right before and after the desired range. - * kjs/function.cpp: - (KJS::globalFuncEval): Pass a UStringSourceProvider to the parser. - * kjs/function_object.cpp: - (KJS::functionProtoFuncToString): Use toSourceString to get the source. - (KJS::FunctionObjectImp::construct): Give the parser a UStringSourceProvider. - * kjs/grammar.y: When parsing a function declaration, function - expression, or getter or setter, tell the function body about its - SourceRange. - * kjs/interpreter.cpp: - (KJS::Interpreter::checkSyntax): Pass a SourceProvider to the parser. - (KJS::Interpreter::evaluate): Pass a SourceProvider to the parser. - * kjs/interpreter.h: - * kjs/nodes.h: - (KJS::FunctionBodyNode::setSource): Establish a SourceRange for this function. - (KJS::FunctionBodyNode::toSourceString): Get the source string out - of the SourceRange. - (KJS::FuncExprNode::): Take a SourceRange and set it on the body. - (KJS::FuncDeclNode::): ditto - * kjs/testkjs.cpp: - (prettyPrintScript): Use a SourceProvider appropriately. - * JavaScriptCore.exp: Export new symbols. - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Add new files. - * JavaScriptCore.xcodeproj/project.pbxproj: Add new files. - -2008-05-09 Oliver Hunt - - Reviewed by Maciej. - - Bring back RegisterFile tainting in order to correctly handle - natively implemented getters and setters that re-enter JavaScript - - * VM/Machine.cpp: - (KJS::Machine::privateExecute): - * VM/RegisterFile.h: - * kjs/function.cpp: - (KJS::FunctionImp::callAsFunction): - * kjs/object.cpp: - (KJS::JSObject::put): - (KJS::tryGetAndCallProperty): - * kjs/property_slot.cpp: - (KJS::PropertySlot::functionGetter): - -2008-05-09 Maciej Stachowiak - - Reviewed by Oliver. - - - track character offsets of open and close braces, in preparation for saving function source - - I verified that there is no performance regression from this change. - - * kjs/grammar.y: - * kjs/lexer.cpp: - (KJS::Lexer::lex): - (KJS::Lexer::matchPunctuator): - * kjs/lexer.h: - -2008-05-09 Oliver Hunt - - Debug build fix - - * kjs/JSGlobalObject.cpp: - (KJS::JSGlobalObject::restoreLocalStorage): - -2008-05-09 Oliver Hunt - - Reviewed by Geoff. - - Build fixes for SquirrelFish on windows. - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.vcproj/testkjs/testkjs.vcproj: - * VM/Register.h: - * kjs/JSGlobalObject.cpp: - (KJS::JSGlobalObject::restoreLocalStorage): - * kjs/collector.cpp: - (KJS::Collector::allocate): - (KJS::Collector::allocateNumber): - * kjs/collector.h: - (KJS::Collector::allocate): - (KJS::Collector::allocateNumber): - * kjs/property_slot.cpp: - -2008-05-08 Maciej Stachowiak - - Reviewed by Geoff. - - - fix activation tearoff in the case where functions are called with too many arguments - - Fixes: - fast/canvas/patternfill-repeat.html - fast/dom/SelectorAPI/bug-17313.html - - * VM/Machine.cpp: - (KJS::slideRegisterWindowForCall): - (KJS::scopeChainForCall): - (KJS::Machine::execute): - (KJS::Machine::privateExecute): - -2008-05-08 Geoffrey Garen - - Reviewed by Oliver Hunt. - - Fixed failure in fast/canvas/canvas-pattern-behaviour.html. - - SunSpider reports a small speedup. Not sure what that's about. - - * VM/CodeBlock.cpp: - (KJS::CodeBlock::dump): Fixed op_call_eval to dump as "op_call_eval". - This helped me while debugging. - - * VM/Machine.cpp: - (KJS::Machine::unwindCallFrame): When looking for an activation to tear - off, don't use the scope chain. Inside eval, the scope chain doesn't - belong to us; it belongs to our calling function. - - Also, don't use the needsFullScopeChain flag to decide whether to tear - off the activation. "function.arguments" can create an activation - for a function whose needsFullScopeChain flag is set to false. - -2008-05-08 Maciej Stachowiak - - Reviewed by Oliver. - - - fix function.call for calls of more than 8 arguments - - Fixes svg/carto.net/button.svg - - * kjs/list.cpp: - (KJS::List::getSlice): properly set up the m_buffer of the target list. - -2008-05-08 Maciej Stachowiak - - Reviewed by Oliver. - - - don't return a null RegisterID from RegExpNode in the exception case, since the caller may need a real register - - Fixes: - - fast/regex/early-acid3-86.html - - http/tests/misc/acid3.html - - * kjs/nodes.cpp: - (KJS::RegExpNode::emitCode): - -2008-05-07 Cameron Zwarich - - Reviewed by Oliver. - - Fix a performance regression caused by the introduction of property - attributes to SymbolTable in r32859 by encoding the attributes and the - register index into a single field of SymbolTableEntry. - - This leaves Node::optimizeVariableAccess() definitely broken, although - it was probably not entirely correct in SquirrelFish before this change. - - * VM/CodeBlock.h: - (KJS::missingThisObjectMarker): - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::addVar): - (KJS::CodeGenerator::CodeGenerator): - (KJS::CodeGenerator::registerForLocal): - (KJS::CodeGenerator::registerForLocalConstInit): - (KJS::CodeGenerator::isLocalConstant): - (KJS::CodeGenerator::addConstant): - (KJS::CodeGenerator::emitCall): - * VM/CodeGenerator.h: - (KJS::CodeGenerator::IdentifierMapIndexHashTraits::emptyValue): - * VM/Machine.cpp: - (KJS::Machine::privateExecute): - * kjs/JSGlobalObject.cpp: - (KJS::JSGlobalObject::saveLocalStorage): - * kjs/JSVariableObject.cpp: - (KJS::JSVariableObject::getPropertyNames): - (KJS::JSVariableObject::getPropertyAttributes): - * kjs/JSVariableObject.h: - (KJS::JSVariableObject::symbolTableGet): - (KJS::JSVariableObject::symbolTablePut): - (KJS::JSVariableObject::symbolTablePutWithAttributes): - * kjs/SymbolTable.h: - (KJS::SymbolTableEntry::SymbolTableEntry): - (KJS::SymbolTableEntry::isEmpty): - (KJS::SymbolTableEntry::getIndex): - (KJS::SymbolTableEntry::getAttributes): - (KJS::SymbolTableEntry::setAttributes): - (KJS::SymbolTableEntry::isReadOnly): - * kjs/nodes.cpp: - (KJS::getSymbolTableEntry): - (KJS::PostIncResolveNode::optimizeVariableAccess): - (KJS::PostDecResolveNode::optimizeVariableAccess): - (KJS::DeleteResolveNode::optimizeVariableAccess): - (KJS::TypeOfResolveNode::optimizeVariableAccess): - (KJS::PreIncResolveNode::optimizeVariableAccess): - (KJS::PreDecResolveNode::optimizeVariableAccess): - (KJS::ReadModifyResolveNode::optimizeVariableAccess): - (KJS::AssignResolveNode::optimizeVariableAccess): - (KJS::ProgramNode::initializeSymbolTable): - -2008-05-06 Maciej Stachowiak - - Rubber stamped by Oliver. - - - add missing ! in an assert that I failed to reverse - - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::CodeGenerator): - -2008-05-06 Maciej Stachowiak - - Reviewed by Oliver. - - - fixed "SQUIRRELFISH: window.this shows up as a property, but it shouldn't" - https://bugs.webkit.org/show_bug.cgi?id=18868 - - The basic approach is to have "this" only be present in the symbol - table at compile time, not runtime. - - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::~CodeGenerator): Remove "this" from symbol table. - (KJS::CodeGenerator::CodeGenerator): Add "this" back when re-using - a symbol table. - * VM/CodeGenerator.h: - * VM/Machine.cpp: - (KJS::Machine::execute): Don't assert that "this" is in the symbol table. - -2008-05-06 Geoffrey Garen - - Reviewed by Oliver Hunt. - - Trivial support for function.arguments: Currently, we only support - function.arguments from within the scope of function. - - This fixes the remaining Mozilla JS test failures. - - SunSpider reports no change. - - * JavaScriptCore.exp: - - * VM/Machine.cpp: - (KJS::Machine::privateExecute): Separated scope chain deref from - activation register copying: since it is now possible for client code - to create an activation on behalf of a function that otherwise wouldn't - need one, having an activation no longer necessarily means that you need - to deref the scope chain. - - (KJS::Machine::getCallFrame): For now, this function only examines the - current scope. Walking parent scopes requires some refactoring in the - way we track execution stacks. - - * kjs/ExecState.cpp: - (KJS::ExecState::ExecState): We use a negative call frame offset to - indicate that a given scope is not a function call scope. - -2008-05-05 Oliver Hunt - - Reviewed by Geoff. - - Fix call frame set up for native -> JS function calls. - - * VM/Machine.cpp: - (KJS::Machine::execute): - -2008-05-05 Geoffrey Garen - - Reviewed by Maciej Stachowiak. - - Fixed ecma_3/Object/8.6.2.6-001.js, and similar bugs. - - SunSpider reports a .4% speedup. Not sure what that's about. - - * VM/Machine.cpp: - (KJS::Machine::privateExecute): Check for exception return from equal, - since toPrimitive can throw. - - * kjs/operations.cpp: - (KJS::strictEqual): In response to an error I made in an earlier version - of this patch, I changed strictEqual to make clear the fact that it - performs no conversions and can't throw, making it slightly more efficient - in the process. - -2008-05-05 Maciej Stachowiak - - Reviewed by Oliver. - - - fix some dumb mistakes in my last patch - - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::emitPushScope): - (KJS::CodeGenerator::emitGetPropertyNames): - * VM/Machine.cpp: - (KJS::Machine::privateExecute): - -2008-05-05 Maciej Stachowiak - - Reviewed by Oliver. - - - document opcodes relating to jumps, scopes, and property name iteration - - Documented jmp, jtrue, false, push_scope, pop_scope, get_pnames, - next_pname and jmp_scopes. - - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::emitJump): - (KJS::CodeGenerator::emitJumpIfTrue): - (KJS::CodeGenerator::emitJumpIfFalse): - (KJS::CodeGenerator::emitPushScope): - (KJS::CodeGenerator::emitNextPropertyName): - (KJS::CodeGenerator::emitGetPropertyNames): - * VM/CodeGenerator.h: - * VM/Machine.cpp: - (KJS::Machine::privateExecute): - * kjs/nodes.cpp: - (KJS::LogicalAndNode::emitCode): - (KJS::LogicalOrNode::emitCode): - (KJS::ConditionalNode::emitCode): - (KJS::IfNode::emitCode): - (KJS::IfElseNode::emitCode): - (KJS::DoWhileNode::emitCode): - (KJS::WhileNode::emitCode): - (KJS::ForNode::emitCode): - (KJS::ForInNode::emitCode): - (KJS::WithNode::emitCode): - -2008-05-05 Cameron Zwarich - - Reviewed by Oliver. - - Bug 18749: SQUIRRELFISH: const support is broken - - - Adds support for const during code generation. - - Fixes 2 layout tests. - - * ChangeLog: - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::addVar): - (KJS::CodeGenerator::CodeGenerator): - (KJS::CodeGenerator::isLocalConstant): - * VM/CodeGenerator.h: - (KJS::CodeGenerator::addVar): - * kjs/nodes.cpp: - (KJS::PostIncResolveNode::emitCode): - (KJS::PostDecResolveNode::emitCode): - (KJS::PreIncResolveNode::emitCode): - (KJS::PreDecResolveNode::emitCode): - (KJS::ReadModifyResolveNode::emitCode): - (KJS::AssignResolveNode::emitCode): - -2008-05-04 Maciej Stachowiak - - Reviewed by Geoff. - - - document some more opcodes (and fix argument names) - - Added docs for eq, neq, stricteq, nstriceq, less and lesseq. - - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::emitEqual): - (KJS::CodeGenerator::emitNotEqual): - (KJS::CodeGenerator::emitStrictEqual): - (KJS::CodeGenerator::emitNotStrictEqual): - (KJS::CodeGenerator::emitLess): - (KJS::CodeGenerator::emitLessEq): - * VM/CodeGenerator.h: - * VM/Machine.cpp: - (KJS::Machine::privateExecute): - * kjs/nodes.cpp: - (KJS::LessNode::emitCode): - (KJS::GreaterNode::emitCode): - (KJS::LessEqNode::emitCode): - (KJS::GreaterEqNode::emitCode): - (KJS::EqualNode::emitCode): - (KJS::NotEqualNode::emitCode): - (KJS::StrictEqualNode::emitCode): - (KJS::NotStrictEqualNode::emitCode): - (KJS::CaseBlockNode::emitCodeForBlock): - -2008-05-04 Geoffrey Garen - - Reviewed by Maciej Stachowiak. - - More scaffolding for f.arguments. - - Track the offset of the last call frame in the ExecState, so we can - produce a backtrace at any time. - - Also, record numLocals, the sum of numVars + numParameters, in each code - block, to make updates to the ExecState a little cheaper than they - would be otherwise. - - We now use numLocals in a bunch of places where we used to calculate - numVars + numParameters or -numVars - numParameters. - - Reports are mixed, but all in all, this seems to be a wash on SunSpider. - -2008-05-04 Oliver Hunt - - Reviewed by Geoff. - - Whoops, correctly handle properties that don't exist in the - symbol table. - - * kjs/JSVariableObject.h: - (KJS::JSVariableObject::symbolTablePutWithAttributes): - -2008-05-04 Oliver Hunt - - Reviewed by Geoff. - - Add attribute information to SymbolTable as ground work for - various DontEnum and ReadOnly issues. - - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::addVar): - (KJS::CodeGenerator::CodeGenerator): - (KJS::CodeGenerator::registerForLocal): - (KJS::CodeGenerator::registerForLocalConstInit): - (KJS::CodeGenerator::addConstant): - * VM/Machine.cpp: - (KJS::Machine::execute): - * kjs/JSGlobalObject.cpp: - (KJS::JSGlobalObject::saveLocalStorage): - * kjs/JSVariableObject.cpp: - (KJS::JSVariableObject::getPropertyNames): - (KJS::JSVariableObject::getPropertyAttributes): - * kjs/JSVariableObject.h: - (KJS::JSVariableObject::symbolTablePut): - (KJS::JSVariableObject::symbolTablePutWithAttributes): - * kjs/SymbolTable.h: - (KJS::SymbolTableEntry::SymbolTableEntry): - (KJS::SymbolTableIndexHashTraits::emptyValue): - * kjs/nodes.cpp: - (KJS::getSymbolTableEntry): - (KJS::ReadModifyResolveNode::optimizeVariableAccess): - (KJS::AssignResolveNode::optimizeVariableAccess): - (KJS::ProgramNode::initializeSymbolTable): - -2008-05-04 Geoffrey Garen - - Reviewed by Oliver Hunt. - - More scaffolding for f.arguments. - - Store the register file associated with an ExecState in the ExecState. - - SunSpider reports no change. - - * kjs/JSGlobalObject.h: - (KJS::JSGlobalObject::JSGlobalObjectData::JSGlobalObjectData): Moved - registerFileStack above globalExec, so it gets initialized first. - Removed remnants of old activation scheme. - -2008-05-04 Maciej Stachowiak - - Rubber stamped by Oliver. - - - renamed a few opcodes and fixed assembly formatting to accomodate the longest opcode - - equal --> eq - nequal --> neq - resolve_base_and_property --> resolve_with_base - resolve_base_and_func --> resolve_func - get_prop_id --> get_by_id - put_prop_id --> put_by_id - delete_prop_id --> del_by_id - get_prop_val --> get_by_val - put_prop_val --> put_by_val - delete_prop_val --> del_by_val - put_prop_index --> put_by_index - - * VM/CodeBlock.cpp: - (KJS::printUnaryOp): - (KJS::printBinaryOp): - (KJS::printConditionalJump): - (KJS::CodeBlock::dump): - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::emitEqual): - (KJS::CodeGenerator::emitNotEqual): - (KJS::CodeGenerator::emitResolveWithBase): - (KJS::CodeGenerator::emitResolveFunction): - (KJS::CodeGenerator::emitGetById): - (KJS::CodeGenerator::emitPutById): - (KJS::CodeGenerator::emitDeleteById): - (KJS::CodeGenerator::emitGetByVal): - (KJS::CodeGenerator::emitPutByVal): - (KJS::CodeGenerator::emitDeleteByVal): - (KJS::CodeGenerator::emitPutByIndex): - * VM/CodeGenerator.h: - * VM/Machine.cpp: - (KJS::Machine::privateExecute): - * VM/Opcode.h: - * kjs/nodes.cpp: - (KJS::ArrayNode::emitCode): - (KJS::PropertyListNode::emitCode): - (KJS::BracketAccessorNode::emitCode): - (KJS::DotAccessorNode::emitCode): - (KJS::EvalFunctionCallNode::emitCode): - (KJS::FunctionCallResolveNode::emitCode): - (KJS::FunctionCallBracketNode::emitCode): - (KJS::FunctionCallDotNode::emitCode): - (KJS::PostIncResolveNode::emitCode): - (KJS::PostDecResolveNode::emitCode): - (KJS::PostIncBracketNode::emitCode): - (KJS::PostDecBracketNode::emitCode): - (KJS::PostIncDotNode::emitCode): - (KJS::PostDecDotNode::emitCode): - (KJS::DeleteResolveNode::emitCode): - (KJS::DeleteBracketNode::emitCode): - (KJS::DeleteDotNode::emitCode): - (KJS::TypeOfResolveNode::emitCode): - (KJS::PreIncResolveNode::emitCode): - (KJS::PreDecResolveNode::emitCode): - (KJS::PreIncBracketNode::emitCode): - (KJS::PreDecBracketNode::emitCode): - (KJS::PreIncDotNode::emitCode): - (KJS::PreDecDotNode::emitCode): - (KJS::ReadModifyResolveNode::emitCode): - (KJS::AssignResolveNode::emitCode): - (KJS::AssignDotNode::emitCode): - (KJS::ReadModifyDotNode::emitCode): - (KJS::AssignBracketNode::emitCode): - (KJS::ReadModifyBracketNode::emitCode): - (KJS::ConstDeclNode::emitCodeSingle): - (KJS::ForInNode::emitCode): - (KJS::TryNode::emitCode): - -2008-05-04 Oliver Hunt - - Reviewed by Maciej. - - Fix assertion when accessing arguments object with too many arguments provided - - The arguments constructor was assuming that the register offset given for argv - was an absolute offset into the registerfile, rather than the offset from the - frame. This patches corrects that issue. - - * kjs/JSActivation.cpp: - (KJS::JSActivation::createArgumentsObject): - -2008-05-04 Geoffrey Garen - - Rubber stamped by Sam Weinig. - - Cleaned up Machine.cpp according to our style guidelines: moved static - data to the top of the file; moved stand-alone functions below that; - moved the Machine constructor above other Machine member functions. - -2008-05-03 Maciej Stachowiak - - Reviewed by Sam. - - - fix accidental breakage from last patch - - * VM/Machine.cpp: - (KJS::Machine::privateExecute): - -2008-05-03 Maciej Stachowiak - - Reviewed by Geoff. - - - a bunch more opcode documentation and corresponding parameter name fixes - - I renamed a few opcodes: - - type_of --> typeof (that's what the JS operator is named) - instance_of --> instanceof (ditto) - create_error --> new_error (for consistency with other new_* opcodes) - - I documented the following opcodes: - - - load - - new_object - - new_array - - new_regexp - - mov - - pre_inc - - pre_dec - - post_inc - - post_dec - - to_jsnumber - - negate - - bitnot - - not - - instanceof - - typeof - - in - - new_func - - new_funcexp - - new_error - - I also fixed formatting on some existing opcode docs. - - * VM/CodeBlock.cpp: - (KJS::CodeBlock::dump): - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::emitMove): - (KJS::CodeGenerator::emitNot): - (KJS::CodeGenerator::emitPreInc): - (KJS::CodeGenerator::emitPreDec): - (KJS::CodeGenerator::emitPostInc): - (KJS::CodeGenerator::emitPostDec): - (KJS::CodeGenerator::emitToJSNumber): - (KJS::CodeGenerator::emitNegate): - (KJS::CodeGenerator::emitBitNot): - (KJS::CodeGenerator::emitInstanceOf): - (KJS::CodeGenerator::emitTypeOf): - (KJS::CodeGenerator::emitIn): - (KJS::CodeGenerator::emitLoad): - (KJS::CodeGenerator::emitNewObject): - (KJS::CodeGenerator::emitNewArray): - (KJS::CodeGenerator::emitNewRegExp): - (KJS::CodeGenerator::emitNewError): - * VM/CodeGenerator.h: - (KJS::CodeGenerator::scopeDepth): - (KJS::CodeGenerator::addVar): - * VM/Machine.cpp: - (KJS::Machine::privateExecute): - * VM/Opcode.h: - * kjs/nodes.cpp: - (KJS::Node::emitThrowError): - (KJS::RegExpNode::emitCode): - (KJS::TypeOfValueNode::emitCode): - (KJS::UnaryPlusNode::emitCode): - (KJS::NegateNode::emitCode): - (KJS::BitwiseNotNode::emitCode): - (KJS::LogicalNotNode::emitCode): - (KJS::InstanceOfNode::emitCode): - (KJS::InNode::emitCode): - -2008-05-03 Maciej Stachowiak - - Reviewed by Geoff and Sam. - - - generate HTML bytecode docs at build time - - * DerivedSources.make: - * docs: Added. - * docs/make-bytecode-docs.pl: Added. - -2008-05-03 Geoffrey Garen - - Reviewed by Sam Weinig. - - Update ExecState::m_scopeChain when switching scope chains inside the - machine. - - This fixes uses of lexicalGlobalObject, such as, in a subframe - - alert(top.makeArray() instanceof Array ? "FAIL" : "PASS"); - - and a bunch of the security failures listed in - https://bugs.webkit.org/show_bug.cgi?id=18870. (Those tests still fail, - seemingly because of regressions in exception messages). - - SunSpider reports no change. - - * VM/Machine.cpp: Factored out scope chain updating into a common - function that takes care to update ExecState::m_scopeChain, too. - - * kjs/ExecState.h: I made Machine a friend of ExecState so that Machine - could update ExecState::m_scopeChain, even though that value is - read-only for everyone else. - - * kjs/JSGlobalObject.h: - (KJS::JSGlobalObject::JSGlobalObjectData::JSGlobalObjectData): Changed - this client to be a little friendlier to ExecState's internal - storage type for scope chain data. - -2008-05-03 Geoffrey Garen - - Reviewed by Sam Weinig. - - Fixed https://bugs.webkit.org/show_bug.cgi?id=18876 - Squirrelfish: ScopeChainNode leak in op_jmp_scopes. - - SunSpider reports no change. - - * VM/Machine.cpp: - (KJS::Machine::privateExecute): Don't construct a ScopeChain object, - since the direct threaded interpreter will goto across its destructor. - -2008-05-03 Geoffrey Garen - - Reviewed by Oliver Hunt. - - A bit more efficient fix than r32832: Don't copy globals into function - register files; instead, have the RegisterFileStack track only the base - of the last *global* register file, so the global object's register - references stay good. - - SunSpider reports a .3% speedup. Not sure what that's about. - -2008-05-03 Oliver Hunt - - Reviewed by Maciej. - - Bug 18864: SquirrelFish: Support getter and setter definition in object literals - - - Add new opcodes to allow us to add getters and setters to an object. These are - only used by the codegen for object literals. - - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::emitPutGetter): - (KJS::CodeGenerator::emitPutSetter): - * VM/CodeGenerator.h: - * VM/Machine.cpp: - (KJS::Machine::privateExecute): - * VM/Opcode.h: - * kjs/nodes.cpp: - (KJS::PropertyListNode::emitCode): - -2008-05-02 Maciej Stachowiak - - Reviewed by Oliver. - - - properly copy globals into and out of implicit call register - files, otherwise they will fail at global lookup - - Fixes fast/js/array-tostring-and-join.html layout test. - - * VM/RegisterFileStack.cpp: - (KJS::RegisterFileStack::pushGlobalRegisterFile): - (KJS::RegisterFileStack::popGlobalRegisterFile): - (KJS::RegisterFileStack::pushFunctionRegisterFile): - (KJS::RegisterFileStack::popFunctionRegisterFile): - -2008-05-02 Geoffrey Garen - - Reviewed by Oliver Hunt. - - Fixed https://bugs.webkit.org/show_bug.cgi?id=18822 - SQUIRRELFISH: incorrect eval used in some cases - - Changed all code inside the machine to fetch the lexical global object - directly from the scope chain, instead of from the ExecState. - - Clients who fetch the lexical global object through the ExecState - still don't work. - - SunSpider reports no change. - - * VM/Machine.cpp: - (KJS::Machine::privateExecute): Fetch the lexical global object from - the scope chain. - - * kjs/ExecState.h: - (KJS::ExecState::ExecState::lexicalGlobalObject): Moved the logic for - this function into ScopeChainNode, but kept this function around to - support existing clients. - -2008-05-02 Geoffrey Garen - - Rubber stamped by Oliver Hunt. - - Removed ExecState.cpp from AllInOneFile.cpp, for a .2% speedup. - - * JavaScriptCore.xcodeproj/project.pbxproj: - * kjs/AllInOneFile.cpp: - -2008-05-01 Oliver Hunt - - Reviewed by Geoff and Maciej. - - Bug 18827: SquirrelFish: Prevent getters and setters from destroying the current RegisterFile - - - Remove safe/unsafe RegisterFile concept, and instead just add additional - logic to ensure we always push/pop RegisterFiles when executing getters - and setters, similar to the logic for valueOf and toString. - - * VM/Machine.cpp: - (KJS::Machine::privateExecute): - * VM/RegisterFile.h: - * kjs/function.cpp: - (KJS::FunctionImp::callAsFunction): - * kjs/object.cpp: - (KJS::JSObject::put): - * kjs/property_slot.cpp: - (KJS::PropertySlot::functionGetter): - -2008-05-01 Oliver Hunt - - RS=Geoff - - Rename unsafeForReentry to safeForReentry to avoid double negatives. - - * VM/Machine.cpp: - (KJS::Machine::privateExecute): - * VM/RegisterFile.h: - * kjs/function.cpp: - (KJS::FunctionImp::callAsFunction): - -2008-05-01 Oliver Hunt - - Reviewed by Maciej. - - Bug 18827: SquirrelFish: Prevent getters and setters from destroying the current RegisterFile - - - This patch makes getters and setters work. It does this by - tracking whether the RegisterFile is "safe", that is whether - the interpreter is in a state that in which it can handle - the RegisterFile being reallocated. - - * VM/Machine.cpp: - (KJS::resolve): - (KJS::Machine::privateExecute): - * VM/RegisterFile.h: - * kjs/function.cpp: - (KJS::FunctionImp::callAsFunction): - -2008-04-30 Geoffrey Garen - - Release build fix: Always compile in "isGlobalObject", since it's - listed in our .exp file. - - * kjs/ExecState.cpp: - (KJS::ExecState::isGlobalObject): - * kjs/ExecState.h: - -2008-04-30 Oliver Hunt - - Reviewed by Maciej. - - Minor code restructuring to prepare for getters and setters, - also helps exception semantics a bit. - - * VM/Machine.cpp: - (KJS::Machine::privateExecute): - -2008-04-30 Geoffrey Garen - - Fixed tyop. - - * kjs/ExecState.h: - -2008-04-30 Geoffrey Garen - - Debug build fix: export a missing symbol. - - * JavaScriptCore.exp: - -2008-04-30 Geoffrey Garen - - Reviewed by Oliver Hunt. - - A little more ExecState refactoring: Now, only the global object creates - an ExecState. - - Also inlined ExecState::lexicalGlobalObject(). - - SunSpider reports no change. - -2008-04-30 Geoffrey Garen - - WebCore build fix: forward-declare ScopeChain. - - * kjs/interpreter.h: - -2008-04-30 Geoffrey Garen - - Build fix for JavaScriptGlue: export a missing symbol. - - * JavaScriptCore.exp: - -2008-04-30 Geoffrey Garen - - Reviewed by Oliver Hunt. - - Removed a lot of unused bits from ExecState, moving them into - OldInterpreterExecState, the fake scaffolding class. - - The clutter was making it hard to see the forest from the trees. - - .4% SunSpider speedup, probably because ExecState::lexicalGlobalObject() - is faster now. - -2008-04-29 Oliver Hunt - - Reviewed by Maciej. - - Bug 18643: SQUIRRELFISH: need to support implicit function calls (valueOf, toString, getters/setters) - - - Prevent static slot optimisation for new variables and functions in - globally re-entrant code called from an an implicit function call. - - This is necessary to prevent us from needing to resize the global - slot portion of the root RegisterFile during an implicit (and hence - unguarded) function call. - - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::CodeGenerator): - * VM/CodeGenerator.h: - * VM/Machine.cpp: - (KJS::Machine::execute): - * VM/RegisterFile.h: - * VM/RegisterFileStack.cpp: - (KJS::RegisterFileStack::pushGlobalRegisterFile): - (KJS::RegisterFileStack::popGlobalRegisterFile): - (KJS::RegisterFileStack::pushFunctionRegisterFile): - (KJS::RegisterFileStack::popFunctionRegisterFile): - * VM/RegisterFileStack.h: - (KJS::RegisterFileStack::inImplicitFunctionCall): - (KJS::RegisterFileStack::lastGlobal): - * kjs/nodes.cpp: - (KJS::ProgramNode::generateCode): - * kjs/nodes.h: - (KJS::ProgramNode::): - -2008-04-29 Geoffrey Garen - - Reviewed by Oliver Hunt. - - In nested program code, don't propogate "this" back to the parent - register file. ("this" should remain constant in the parent register - file, regardless of the scripts it invokes.) - - * VM/RegisterFile.cpp: - (KJS::RegisterFile::copyGlobals): - -2008-04-28 Oliver Hunt - - Reviewed by Geoff. - - Restore base pointer when popping a global RegisterFile - - * VM/RegisterFileStack.cpp: - (KJS::RegisterFileStack::popGlobalRegisterFile): - -2008-04-28 Oliver Hunt - - Reviewed by Geoff. - - Bug 18643: SQUIRRELFISH: need to support implicit function calls (valueOf, toString, getters/setters) - - - Partial fix. This results in all implicit calls to toString or valueOf - executing in a separate RegisterFile, so ensuring that the the pointers - in the triggering interpreter don't get trashed. This still leaves the - task of preventing new global re-entry from toString and valueOf from - clobbering the RegisterFile. - - * VM/Machine.cpp: - (KJS::Machine::execute): - * VM/RegisterFileStack.cpp: - (KJS::RegisterFileStack::pushFunctionRegisterFile): - (KJS::RegisterFileStack::popFunctionRegisterFile): - * VM/RegisterFileStack.h: - * kjs/object.cpp: - (KJS::tryGetAndCallProperty): - -2008-04-28 Geoffrey Garen - - Reviewed by Maciej Stachowiak. - - Simplified activation object a bit: No need to store the callee - in the activation object -- we can pull it out of the call frame - when needed, instead. - - SunSpider reports no change. - -2008-04-28 Geoffrey Garen - - Reviewed by Maciej Stachowiak. - - RS by Oliver Hunt on moving JSArguments.cpp out of AllInOneFile.cpp. - - Substantially more handling of "arguments": "arguments" works fully - now, but "f.arguments" still doesn't work. - - Fixes 10 regression tests. - - SunSpider reports no regression. - - * kjs/JSActivation.cpp: - (KJS::JSActivation::createArgumentsObject): Reconstruct an arguments - List to pass to the arguments object constructor. - - * JavaScriptCore.xcodeproj/project.pbxproj: - * kjs/AllInOneFile.cpp: Removed JSActivation.cpp from AllInOneFile.cpp - because that seems to make GCC happy. (Previously, I had added - JSActivation.cpp to AllInOneFile.cpp because *that* seemed to make GCC - happy. So it goes.) - -2008-04-28 Geoffrey Garen - - Reviewed by Maciej Stachowiak. - - Groundwork for more handling of "arguments". I'm not checking in the - actual handling of "arguments" yet, because it still needs a little - fiddling to avoid a performance regression. - - SunSpider reports no change. - - * VM/Machine.cpp: - (KJS::initializeCallFrame): Put argc in the register file, so the - arguments object can find it later, to determine arguments.length. - - * kjs/nodes.h: - (KJS::FunctionBodyNode::): Added a special code accessor for when you - know the code has already been generated, and you don't have a scopeChain - to supply for potential code generation. (This is the case when the - activation object creates the arguments object.) - -2008-04-28 Oliver Hunt - - Reviewed by Geoff. - - Replace unsafe use of auto_ptr in Vector with manual memory - management. - - * VM/RegisterFileStack.cpp: - (KJS::RegisterFileStack::~RegisterFileStack): - (KJS::RegisterFileStack::popRegisterFile): - * VM/RegisterFileStack.h: - -2008-04-27 Cameron Zwarich - - Reviewed by Maciej. - - Bug 18746: SQUIRRELFISH: indirect eval used when direct eval should be used - - - Change the base to the correct value of the 'this' object after the direct - eval test instead of before. - - Fixes 5 layout tests. - - * VM/Machine.cpp: - (KJS::Machine::privateExecute): - * kjs/nodes.cpp: - (KJS::EvalFunctionCallNode::emitCode): - -2008-04-26 Maciej Stachowiak - - Reviewed by Oliver. - - - document all property getting, setting and deleting opcodes - - (And fix function parameter names to match corresponding opcode parameter names.) - - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::emitResolve): - (KJS::CodeGenerator::emitResolveBase): - (KJS::CodeGenerator::emitResolveBaseAndProperty): - (KJS::CodeGenerator::emitResolveBaseAndFunc): - (KJS::CodeGenerator::emitGetPropId): - (KJS::CodeGenerator::emitPutPropId): - (KJS::CodeGenerator::emitDeletePropId): - (KJS::CodeGenerator::emitPutPropVal): - * VM/CodeGenerator.h: - * VM/Machine.cpp: - (KJS::resolve): - (KJS::resolveBase): - (KJS::resolveBaseAndProperty): - (KJS::resolveBaseAndFunc): - (KJS::Machine::privateExecute): - * kjs/nodes.cpp: - (KJS::ResolveNode::emitCode): - (KJS::ArrayNode::emitCode): - (KJS::PropertyListNode::emitCode): - (KJS::BracketAccessorNode::emitCode): - (KJS::EvalFunctionCallNode::emitCode): - (KJS::FunctionCallResolveNode::emitCode): - (KJS::FunctionCallBracketNode::emitCode): - (KJS::PostIncResolveNode::emitCode): - (KJS::PostDecResolveNode::emitCode): - (KJS::PostIncBracketNode::emitCode): - (KJS::PostDecBracketNode::emitCode): - (KJS::PostIncDotNode::emitCode): - (KJS::PostDecDotNode::emitCode): - (KJS::DeleteResolveNode::emitCode): - (KJS::TypeOfResolveNode::emitCode): - (KJS::PreIncResolveNode::emitCode): - (KJS::PreDecResolveNode::emitCode): - (KJS::PreIncBracketNode::emitCode): - (KJS::PreDecBracketNode::emitCode): - (KJS::AssignResolveNode::emitCode): - (KJS::AssignDotNode::emitCode): - (KJS::ReadModifyDotNode::emitCode): - (KJS::AssignBracketNode::emitCode): - (KJS::ReadModifyBracketNode::emitCode): - (KJS::ConstDeclNode::emitCodeSingle): - -2008-04-26 Oliver Hunt - - Reviewed by Maciej. - - Bug 18628: SQUIRRELFISH: need to support recursion limit - - - Basically completes recursion limiting. There is still some - tuning we may want to do to make things better in the face of - very bad code, but certainly nothing worse than anything already - possible in trunk. - - Also fixes a WebKit test by fixing the exception text :D - - * JavaScriptCore.exp: - * VM/ExceptionHelpers.cpp: - * VM/Machine.cpp: - (KJS::Machine::execute): - * VM/RegisterFile.cpp: - (KJS::RegisterFile::growBuffer): - (KJS::RegisterFile::addGlobalSlots): - * VM/RegisterFile.h: - (KJS::RegisterFile::grow): - (KJS::RegisterFile::uncheckedGrow): - * VM/RegisterFileStack.cpp: - (KJS::RegisterFileStack::pushRegisterFile): - * VM/RegisterFileStack.h: - -2008-04-25 Oliver Hunt - - Reviewed by Geoff. - - Bug 18628: SQUIRRELFISH: need to support recursion limit - - - Put a limit on the level of reentry recursion. 128 levels of re-entrant recursion - seems reasonable as it is greater than the old eval limit, and a long way short of - the reentry depth needed to overflow the stack. - - * VM/Machine.cpp: - (KJS::Machine::execute): - * VM/Machine.h: - -2008-04-25 Geoffrey Garen - - Reviewed by Sam Weinig. - - A tiny bit of cleanup to the regexp code. - - Removed some static_cast. - - Removed createRegExpImp because it's no longer used. - -2008-04-25 Oliver Hunt - - Reviewed by Maciej. - - Bug 18736: SQUIRRELFISH: switch statements with no default have incorrect codegen - - - Ensure the "default" target is correct in the absence of an explicit default handler. - - * kjs/nodes.cpp: - (KJS::CaseBlockNode::emitCodeForBlock): - -2008-04-25 Oliver Hunt - - Reviewed by Maciej. - - Bug 18628: SQUIRRELFISH: need to support recursion limit - - - More bounds checking. - - * VM/Machine.cpp: - (KJS::Machine::execute): - * VM/RegisterFile.cpp: - (KJS::RegisterFile::growBuffer): - * VM/RegisterFile.h: - -2008-04-25 Maciej Stachowiak - - Reviewed by Oliver. - - - fix signal catching magic - - The signal handlers are restored to _exit but are only set when - running under run-javascriptcore-tests. fprintf from a signal - handler is not safe. - - * kjs/testkjs.cpp: - (main): - (parseArguments): - * tests/mozilla/jsDriver.pl: - -2008-04-25 Cameron Zwarich - - Reviewed by Maciej. - - Bug 18732: SQUIRRELFISH: exceptions thrown by native constructors are ignored - - - Fixes another regression test. - - * VM/Machine.cpp: - (KJS::Machine::privateExecute): - -2008-04-25 Cameron Zwarich - - Reviewed by Maciej. - - Bug 18728: SQUIRRELFISH: invalid regular expression constants should throw exceptions - - - Fixes another regression test. - - * kjs/nodes.cpp: - (KJS::RegExpNode::emitCode): - -2008-04-24 Cameron Zwarich - - Reviewed by Geoffrey Garen. - - Bug 18735: SQUIRRELFISH: closures are sometimes given an incorrect 'this' value when called - - - The overloaded toThisObject method was not copied over to JSActivation. - - Fixes two regression tests. - - * kjs/JSActivation.cpp: - (KJS::JSActivation::toThisObject): - * kjs/JSActivation.h: - -2008-04-24 Geoffrey Garen - - Reviewed by Oliver Hunt. - - Added support for arguments.callee. - -2008-04-24 Oliver Hunt - - Reviewed by Maciej. - - Bug 18628: SQUIRRELFISH: need to support recursion limit - - - Partial fix -- this gets us some of the required bounds checking, but not - complete coverage. But it does manage to do them without regressing :D - - * VM/ExceptionHelpers.cpp: - (KJS::createError): - (KJS::createStackOverflowError): - * VM/ExceptionHelpers.h: - * VM/Machine.cpp: - (KJS::slideRegisterWindowForCall): - (KJS::Machine::execute): - (KJS::Machine::privateExecute): - * VM/RegisterFile.cpp: - * VM/RegisterFile.h: - (KJS::RegisterFile::): - (KJS::RegisterFile::RegisterFile): - (KJS::RegisterFile::grow): - -2008-04-24 Geoffrey Garen - - Reviewed by Oliver Hunt. - - A tiny bit more handling of "arguments": create a real, but mostly - hollow, arguments object. - - Fixes 2 regression tests. - -2008-04-24 Cameron Zwarich - - Reviewed by Oliver. - - Bug 18717: SQUIRRELFISH: eval returns the wrong value for a variable declaration statement - - - Fixes a regression test, but exposes the failure of another due to the - lack of getters and setters. - - * kjs/nodes.cpp: - (KJS::ConstDeclNode::emitCodeSingle): - (KJS::ConstDeclNode::emitCode): - (KJS::ConstStatementNode::emitCode): - (KJS::VarStatementNode::emitCode): - * kjs/nodes.h: - -2008-04-24 Geoffrey Garen - - Reviewed by Sam Weinig. - - Print a CRASH statement when crashing, so test failures are not a - mystery. - - * kjs/testkjs.cpp: - (handleCrash): - (main): - -2008-04-24 Cameron Zwarich - - Reviewed by Geoffrey Garen. - - Bug 18716: SQUIRRELFISH: typeof should return undefined for an undefined variable reference - - - This fixes 2 more regression tests. - - * kjs/nodes.cpp: - (KJS::TypeOfResolveNode::emitCode): - -2008-04-24 Geoffrey Garen - - Reviewed by Sam Weinig. - - Put the callee in the call frame. - - Necessary in order to support "arguments" and "arguments.callee". - - Also fixes a latent GC bug, where an executing function could be - subject to GC if the register holding it were overwritten. Here's - an example that would have caused problems: - - function f() - { - // Flood the machine stack to eliminate any old pointers to f. - g.call({}); - - // Overwrite f in the register file. - f = 1; - - // Force a GC. - for (var i = 0; i < 5000; ++i) { - ({}); - } - - // Welcome to crash-ville. - } - - function g() - { - } - - f(); - - * VM/Machine.h: Changed the order of arguments to - execute(FunctionBodyNode*...) to match the other execute functions. - * kjs/function.cpp: Updated to match new argument requirements from - execute(FunctionBodyNode*...). Renamed newObj to thisObj to match the - rest of JavaScriptCore. - - SunSpider reports no change. - -2008-04-23 Cameron Zwarich - - Reviewed by Maciej. - - Bug 18707: SQUIRRELFISH: eval always performs toString() on its argument - - - This fixes 4 more regression tests. - - * VM/Machine.cpp: - (KJS::eval): - -2008-04-23 Maciej Stachowiak - - Reviewed by Oliver. - - - fix logic bug in SegmentedVector::grow which would sometimes fail to resize a segment when needed - - Fixes 3 JSC tests. - - * VM/SegmentedVector.h: - (KJS::SegmentedVector::grow): - -2008-04-23 Geoffrey Garen - - Reviewed by Maciej Stachowiak. - - Degenerate handling of "arguments" as a property of the activation - object. Currently, we just return a vanilla object. - - SunSpider reports no change. - - Fixes: - - ecma_3/Function/regress-94506.js. - - Reveals to have been secretly broken: - - ecma_3/Function/15.3.4.3-1.js - ecma_3/Function/15.3.4.4-1.js - - These tests were passing incorrectly. testkjs creates a global array - named "arguments" to hold command-line arguments. That array was - tricking these tests into thinking that an arguments object with length - 0 had been created. Since our new vanilla object shadows the global - property named arguments, that object no longer fools these tests into - passing. - - Net change: +1 failing test. - - * kjs/AllInOneFile.cpp: Had to put JSActivation.cpp into AllInOneFile.cpp - to solve a surprising 8.6% regression in bitops-3bit-bits-in-byte. - -2008-04-23 Maciej Stachowiak - - Reviewed by Oliver. - - - save and restore callFrame - - * VM/Machine.cpp: - (KJS::slideRegisterWindowForCall): - (KJS::Machine::execute): - (KJS::Machine::privateExecute): - * kjs/testkjs.cpp: - (main): - -2008-04-23 Geoffrey Garen - - Reviewed by Maciej Stachowiak. - - Fixed scopes for named function expressions. - - Fixes one regression test. - - Two changes here: - - (1) The function's name is supposed to have attributes DontDelete, - ReadOnly, regardless of the type of code executing. - - (2) Push the name object on the function's scope chain, rather than - the ExecState's scope chain because, well, that's where it belongs. - -2008-04-23 Geoffrey Garen - - Reviewed by Oliver Hunt. - - Inlined JSObject::putDirect, for a .4% SunSpider speedup. - - I did this as a first step toward removing nodes.cpp from - AllInOneFile.cpp, but I'm putting that larger project aside for now. - -2008-04-23 Maciej Stachowiak - - Rubber stamped by Geoff. - - - add OldInterpreterExecState class and use it in dead code - - This will allow removing things from the real ExecState class - without having to figure out how to remove all this code without - getting a perf regression. - - * kjs/nodes.cpp: - (KJS::ExpressionNode::evaluateToNumber): - (KJS::ExpressionNode::evaluateToBoolean): - (KJS::ExpressionNode::evaluateToInt32): - (KJS::ExpressionNode::evaluateToUInt32): - (KJS::Node::setErrorCompletion): - (KJS::Node::throwError): - (KJS::Node::throwUndefinedVariableError): - (KJS::Node::handleException): - (KJS::Node::rethrowException): - (KJS::BreakpointCheckStatement::execute): - (KJS::BreakpointCheckStatement::optimizeVariableAccess): - (KJS::NullNode::evaluate): - (KJS::FalseNode::evaluate): - (KJS::TrueNode::evaluate): - (KJS::NumberNode::evaluate): - (KJS::NumberNode::evaluateToNumber): - (KJS::NumberNode::evaluateToBoolean): - (KJS::NumberNode::evaluateToInt32): - (KJS::NumberNode::evaluateToUInt32): - (KJS::ImmediateNumberNode::evaluate): - (KJS::ImmediateNumberNode::evaluateToInt32): - (KJS::ImmediateNumberNode::evaluateToUInt32): - (KJS::StringNode::evaluate): - (KJS::StringNode::evaluateToNumber): - (KJS::StringNode::evaluateToBoolean): - (KJS::RegExpNode::evaluate): - (KJS::ThisNode::evaluate): - (KJS::ResolveNode::inlineEvaluate): - (KJS::ResolveNode::evaluate): - (KJS::ResolveNode::evaluateToNumber): - (KJS::ResolveNode::evaluateToBoolean): - (KJS::ResolveNode::evaluateToInt32): - (KJS::ResolveNode::evaluateToUInt32): - (KJS::getSymbolTableEntry): - (KJS::ResolveNode::optimizeVariableAccess): - (KJS::LocalVarAccessNode::inlineEvaluate): - (KJS::LocalVarAccessNode::evaluate): - (KJS::LocalVarAccessNode::evaluateToNumber): - (KJS::LocalVarAccessNode::evaluateToBoolean): - (KJS::LocalVarAccessNode::evaluateToInt32): - (KJS::LocalVarAccessNode::evaluateToUInt32): - (KJS::getNonLocalSymbol): - (KJS::ScopedVarAccessNode::inlineEvaluate): - (KJS::ScopedVarAccessNode::evaluate): - (KJS::ScopedVarAccessNode::evaluateToNumber): - (KJS::ScopedVarAccessNode::evaluateToBoolean): - (KJS::ScopedVarAccessNode::evaluateToInt32): - (KJS::ScopedVarAccessNode::evaluateToUInt32): - (KJS::NonLocalVarAccessNode::inlineEvaluate): - (KJS::NonLocalVarAccessNode::evaluate): - (KJS::NonLocalVarAccessNode::evaluateToNumber): - (KJS::NonLocalVarAccessNode::evaluateToBoolean): - (KJS::NonLocalVarAccessNode::evaluateToInt32): - (KJS::NonLocalVarAccessNode::evaluateToUInt32): - (KJS::ElementNode::optimizeVariableAccess): - (KJS::ElementNode::evaluate): - (KJS::ArrayNode::optimizeVariableAccess): - (KJS::ArrayNode::evaluate): - (KJS::ObjectLiteralNode::optimizeVariableAccess): - (KJS::ObjectLiteralNode::evaluate): - (KJS::PropertyListNode::optimizeVariableAccess): - (KJS::PropertyListNode::evaluate): - (KJS::PropertyNode::optimizeVariableAccess): - (KJS::PropertyNode::evaluate): - (KJS::BracketAccessorNode::optimizeVariableAccess): - (KJS::BracketAccessorNode::inlineEvaluate): - (KJS::BracketAccessorNode::evaluate): - (KJS::BracketAccessorNode::evaluateToNumber): - (KJS::BracketAccessorNode::evaluateToBoolean): - (KJS::BracketAccessorNode::evaluateToInt32): - (KJS::BracketAccessorNode::evaluateToUInt32): - (KJS::DotAccessorNode::optimizeVariableAccess): - (KJS::DotAccessorNode::inlineEvaluate): - (KJS::DotAccessorNode::evaluate): - (KJS::DotAccessorNode::evaluateToNumber): - (KJS::DotAccessorNode::evaluateToBoolean): - (KJS::DotAccessorNode::evaluateToInt32): - (KJS::DotAccessorNode::evaluateToUInt32): - (KJS::ArgumentListNode::optimizeVariableAccess): - (KJS::ArgumentListNode::evaluateList): - (KJS::ArgumentsNode::optimizeVariableAccess): - (KJS::NewExprNode::optimizeVariableAccess): - (KJS::NewExprNode::inlineEvaluate): - (KJS::NewExprNode::evaluate): - (KJS::NewExprNode::evaluateToNumber): - (KJS::NewExprNode::evaluateToBoolean): - (KJS::NewExprNode::evaluateToInt32): - (KJS::NewExprNode::evaluateToUInt32): - (KJS::ExpressionNode::resolveAndCall): - (KJS::EvalFunctionCallNode::optimizeVariableAccess): - (KJS::EvalFunctionCallNode::evaluate): - (KJS::FunctionCallValueNode::optimizeVariableAccess): - (KJS::FunctionCallValueNode::evaluate): - (KJS::FunctionCallResolveNode::optimizeVariableAccess): - (KJS::FunctionCallResolveNode::inlineEvaluate): - (KJS::FunctionCallResolveNode::evaluate): - (KJS::FunctionCallResolveNode::evaluateToNumber): - (KJS::FunctionCallResolveNode::evaluateToBoolean): - (KJS::FunctionCallResolveNode::evaluateToInt32): - (KJS::FunctionCallResolveNode::evaluateToUInt32): - (KJS::LocalVarFunctionCallNode::inlineEvaluate): - (KJS::LocalVarFunctionCallNode::evaluate): - (KJS::LocalVarFunctionCallNode::evaluateToNumber): - (KJS::LocalVarFunctionCallNode::evaluateToBoolean): - (KJS::LocalVarFunctionCallNode::evaluateToInt32): - (KJS::LocalVarFunctionCallNode::evaluateToUInt32): - (KJS::ScopedVarFunctionCallNode::inlineEvaluate): - (KJS::ScopedVarFunctionCallNode::evaluate): - (KJS::ScopedVarFunctionCallNode::evaluateToNumber): - (KJS::ScopedVarFunctionCallNode::evaluateToBoolean): - (KJS::ScopedVarFunctionCallNode::evaluateToInt32): - (KJS::ScopedVarFunctionCallNode::evaluateToUInt32): - (KJS::NonLocalVarFunctionCallNode::inlineEvaluate): - (KJS::NonLocalVarFunctionCallNode::evaluate): - (KJS::NonLocalVarFunctionCallNode::evaluateToNumber): - (KJS::NonLocalVarFunctionCallNode::evaluateToBoolean): - (KJS::NonLocalVarFunctionCallNode::evaluateToInt32): - (KJS::NonLocalVarFunctionCallNode::evaluateToUInt32): - (KJS::FunctionCallBracketNode::optimizeVariableAccess): - (KJS::FunctionCallBracketNode::evaluate): - (KJS::FunctionCallDotNode::optimizeVariableAccess): - (KJS::FunctionCallDotNode::inlineEvaluate): - (KJS::FunctionCallDotNode::evaluate): - (KJS::FunctionCallDotNode::evaluateToNumber): - (KJS::FunctionCallDotNode::evaluateToBoolean): - (KJS::FunctionCallDotNode::evaluateToInt32): - (KJS::FunctionCallDotNode::evaluateToUInt32): - (KJS::PostIncResolveNode::optimizeVariableAccess): - (KJS::PostIncResolveNode::evaluate): - (KJS::PostIncLocalVarNode::evaluate): - (KJS::PostDecResolveNode::optimizeVariableAccess): - (KJS::PostDecResolveNode::evaluate): - (KJS::PostDecLocalVarNode::evaluate): - (KJS::PostDecLocalVarNode::inlineEvaluateToNumber): - (KJS::PostDecLocalVarNode::evaluateToNumber): - (KJS::PostDecLocalVarNode::evaluateToBoolean): - (KJS::PostDecLocalVarNode::evaluateToInt32): - (KJS::PostDecLocalVarNode::evaluateToUInt32): - (KJS::PostfixBracketNode::optimizeVariableAccess): - (KJS::PostIncBracketNode::evaluate): - (KJS::PostDecBracketNode::evaluate): - (KJS::PostfixDotNode::optimizeVariableAccess): - (KJS::PostIncDotNode::evaluate): - (KJS::PostDecDotNode::evaluate): - (KJS::PostfixErrorNode::evaluate): - (KJS::DeleteResolveNode::optimizeVariableAccess): - (KJS::DeleteResolveNode::evaluate): - (KJS::LocalVarDeleteNode::evaluate): - (KJS::DeleteBracketNode::optimizeVariableAccess): - (KJS::DeleteBracketNode::evaluate): - (KJS::DeleteDotNode::optimizeVariableAccess): - (KJS::DeleteDotNode::evaluate): - (KJS::DeleteValueNode::optimizeVariableAccess): - (KJS::DeleteValueNode::evaluate): - (KJS::VoidNode::optimizeVariableAccess): - (KJS::VoidNode::evaluate): - (KJS::TypeOfValueNode::optimizeVariableAccess): - (KJS::TypeOfResolveNode::optimizeVariableAccess): - (KJS::LocalVarTypeOfNode::evaluate): - (KJS::TypeOfResolveNode::evaluate): - (KJS::TypeOfValueNode::evaluate): - (KJS::PreIncResolveNode::optimizeVariableAccess): - (KJS::PreIncLocalVarNode::evaluate): - (KJS::PreIncResolveNode::evaluate): - (KJS::PreDecResolveNode::optimizeVariableAccess): - (KJS::PreDecLocalVarNode::evaluate): - (KJS::PreDecResolveNode::evaluate): - (KJS::PreIncConstNode::evaluate): - (KJS::PreDecConstNode::evaluate): - (KJS::PostIncConstNode::evaluate): - (KJS::PostDecConstNode::evaluate): - (KJS::PrefixBracketNode::optimizeVariableAccess): - (KJS::PreIncBracketNode::evaluate): - (KJS::PreDecBracketNode::evaluate): - (KJS::PrefixDotNode::optimizeVariableAccess): - (KJS::PreIncDotNode::evaluate): - (KJS::PreDecDotNode::evaluate): - (KJS::PrefixErrorNode::evaluate): - (KJS::UnaryPlusNode::optimizeVariableAccess): - (KJS::UnaryPlusNode::evaluate): - (KJS::UnaryPlusNode::evaluateToBoolean): - (KJS::UnaryPlusNode::evaluateToNumber): - (KJS::UnaryPlusNode::evaluateToInt32): - (KJS::UnaryPlusNode::evaluateToUInt32): - (KJS::NegateNode::optimizeVariableAccess): - (KJS::NegateNode::evaluate): - (KJS::NegateNode::evaluateToNumber): - (KJS::BitwiseNotNode::optimizeVariableAccess): - (KJS::BitwiseNotNode::inlineEvaluateToInt32): - (KJS::BitwiseNotNode::evaluate): - (KJS::BitwiseNotNode::evaluateToNumber): - (KJS::BitwiseNotNode::evaluateToBoolean): - (KJS::BitwiseNotNode::evaluateToInt32): - (KJS::BitwiseNotNode::evaluateToUInt32): - (KJS::LogicalNotNode::optimizeVariableAccess): - (KJS::LogicalNotNode::evaluate): - (KJS::LogicalNotNode::evaluateToBoolean): - (KJS::MultNode::optimizeVariableAccess): - (KJS::MultNode::inlineEvaluateToNumber): - (KJS::MultNode::evaluate): - (KJS::MultNode::evaluateToNumber): - (KJS::MultNode::evaluateToBoolean): - (KJS::MultNode::evaluateToInt32): - (KJS::MultNode::evaluateToUInt32): - (KJS::DivNode::optimizeVariableAccess): - (KJS::DivNode::inlineEvaluateToNumber): - (KJS::DivNode::evaluate): - (KJS::DivNode::evaluateToNumber): - (KJS::DivNode::evaluateToInt32): - (KJS::DivNode::evaluateToUInt32): - (KJS::ModNode::optimizeVariableAccess): - (KJS::ModNode::inlineEvaluateToNumber): - (KJS::ModNode::evaluate): - (KJS::ModNode::evaluateToNumber): - (KJS::ModNode::evaluateToBoolean): - (KJS::ModNode::evaluateToInt32): - (KJS::ModNode::evaluateToUInt32): - (KJS::throwOutOfMemoryErrorToNumber): - (KJS::addSlowCase): - (KJS::addSlowCaseToNumber): - (KJS::add): - (KJS::addToNumber): - (KJS::AddNode::optimizeVariableAccess): - (KJS::AddNode::evaluate): - (KJS::AddNode::inlineEvaluateToNumber): - (KJS::AddNode::evaluateToNumber): - (KJS::AddNode::evaluateToInt32): - (KJS::AddNode::evaluateToUInt32): - (KJS::AddNumbersNode::inlineEvaluateToNumber): - (KJS::AddNumbersNode::evaluate): - (KJS::AddNumbersNode::evaluateToNumber): - (KJS::AddNumbersNode::evaluateToInt32): - (KJS::AddNumbersNode::evaluateToUInt32): - (KJS::AddStringsNode::evaluate): - (KJS::AddStringLeftNode::evaluate): - (KJS::AddStringRightNode::evaluate): - (KJS::SubNode::optimizeVariableAccess): - (KJS::SubNode::inlineEvaluateToNumber): - (KJS::SubNode::evaluate): - (KJS::SubNode::evaluateToNumber): - (KJS::SubNode::evaluateToInt32): - (KJS::SubNode::evaluateToUInt32): - (KJS::LeftShiftNode::optimizeVariableAccess): - (KJS::LeftShiftNode::inlineEvaluateToInt32): - (KJS::LeftShiftNode::evaluate): - (KJS::LeftShiftNode::evaluateToNumber): - (KJS::LeftShiftNode::evaluateToInt32): - (KJS::LeftShiftNode::evaluateToUInt32): - (KJS::RightShiftNode::optimizeVariableAccess): - (KJS::RightShiftNode::inlineEvaluateToInt32): - (KJS::RightShiftNode::evaluate): - (KJS::RightShiftNode::evaluateToNumber): - (KJS::RightShiftNode::evaluateToInt32): - (KJS::RightShiftNode::evaluateToUInt32): - (KJS::UnsignedRightShiftNode::optimizeVariableAccess): - (KJS::UnsignedRightShiftNode::inlineEvaluateToUInt32): - (KJS::UnsignedRightShiftNode::evaluate): - (KJS::UnsignedRightShiftNode::evaluateToNumber): - (KJS::UnsignedRightShiftNode::evaluateToInt32): - (KJS::UnsignedRightShiftNode::evaluateToUInt32): - (KJS::lessThan): - (KJS::lessThanEq): - (KJS::LessNode::optimizeVariableAccess): - (KJS::LessNode::inlineEvaluateToBoolean): - (KJS::LessNode::evaluate): - (KJS::LessNode::evaluateToBoolean): - (KJS::LessNumbersNode::inlineEvaluateToBoolean): - (KJS::LessNumbersNode::evaluate): - (KJS::LessNumbersNode::evaluateToBoolean): - (KJS::LessStringsNode::inlineEvaluateToBoolean): - (KJS::LessStringsNode::evaluate): - (KJS::LessStringsNode::evaluateToBoolean): - (KJS::GreaterNode::optimizeVariableAccess): - (KJS::GreaterNode::inlineEvaluateToBoolean): - (KJS::GreaterNode::evaluate): - (KJS::GreaterNode::evaluateToBoolean): - (KJS::LessEqNode::optimizeVariableAccess): - (KJS::LessEqNode::inlineEvaluateToBoolean): - (KJS::LessEqNode::evaluate): - (KJS::LessEqNode::evaluateToBoolean): - (KJS::GreaterEqNode::optimizeVariableAccess): - (KJS::GreaterEqNode::inlineEvaluateToBoolean): - (KJS::GreaterEqNode::evaluate): - (KJS::GreaterEqNode::evaluateToBoolean): - (KJS::InstanceOfNode::optimizeVariableAccess): - (KJS::InstanceOfNode::evaluate): - (KJS::InstanceOfNode::evaluateToBoolean): - (KJS::InNode::optimizeVariableAccess): - (KJS::InNode::evaluate): - (KJS::InNode::evaluateToBoolean): - (KJS::EqualNode::optimizeVariableAccess): - (KJS::EqualNode::inlineEvaluateToBoolean): - (KJS::EqualNode::evaluate): - (KJS::EqualNode::evaluateToBoolean): - (KJS::NotEqualNode::optimizeVariableAccess): - (KJS::NotEqualNode::inlineEvaluateToBoolean): - (KJS::NotEqualNode::evaluate): - (KJS::NotEqualNode::evaluateToBoolean): - (KJS::StrictEqualNode::optimizeVariableAccess): - (KJS::StrictEqualNode::inlineEvaluateToBoolean): - (KJS::StrictEqualNode::evaluate): - (KJS::StrictEqualNode::evaluateToBoolean): - (KJS::NotStrictEqualNode::optimizeVariableAccess): - (KJS::NotStrictEqualNode::inlineEvaluateToBoolean): - (KJS::NotStrictEqualNode::evaluate): - (KJS::NotStrictEqualNode::evaluateToBoolean): - (KJS::BitAndNode::optimizeVariableAccess): - (KJS::BitAndNode::evaluate): - (KJS::BitAndNode::inlineEvaluateToInt32): - (KJS::BitAndNode::evaluateToNumber): - (KJS::BitAndNode::evaluateToBoolean): - (KJS::BitAndNode::evaluateToInt32): - (KJS::BitAndNode::evaluateToUInt32): - (KJS::BitXOrNode::optimizeVariableAccess): - (KJS::BitXOrNode::inlineEvaluateToInt32): - (KJS::BitXOrNode::evaluate): - (KJS::BitXOrNode::evaluateToNumber): - (KJS::BitXOrNode::evaluateToBoolean): - (KJS::BitXOrNode::evaluateToInt32): - (KJS::BitXOrNode::evaluateToUInt32): - (KJS::BitOrNode::optimizeVariableAccess): - (KJS::BitOrNode::inlineEvaluateToInt32): - (KJS::BitOrNode::evaluate): - (KJS::BitOrNode::evaluateToNumber): - (KJS::BitOrNode::evaluateToBoolean): - (KJS::BitOrNode::evaluateToInt32): - (KJS::BitOrNode::evaluateToUInt32): - (KJS::LogicalAndNode::optimizeVariableAccess): - (KJS::LogicalAndNode::evaluate): - (KJS::LogicalAndNode::evaluateToBoolean): - (KJS::LogicalOrNode::optimizeVariableAccess): - (KJS::LogicalOrNode::evaluate): - (KJS::LogicalOrNode::evaluateToBoolean): - (KJS::ConditionalNode::optimizeVariableAccess): - (KJS::ConditionalNode::evaluate): - (KJS::ConditionalNode::evaluateToBoolean): - (KJS::ConditionalNode::evaluateToNumber): - (KJS::ConditionalNode::evaluateToInt32): - (KJS::ConditionalNode::evaluateToUInt32): - (KJS::valueForReadModifyAssignment): - (KJS::ReadModifyResolveNode::optimizeVariableAccess): - (KJS::AssignResolveNode::optimizeVariableAccess): - (KJS::ReadModifyLocalVarNode::evaluate): - (KJS::AssignLocalVarNode::evaluate): - (KJS::ReadModifyConstNode::evaluate): - (KJS::AssignConstNode::evaluate): - (KJS::ReadModifyResolveNode::evaluate): - (KJS::AssignResolveNode::evaluate): - (KJS::AssignDotNode::optimizeVariableAccess): - (KJS::AssignDotNode::evaluate): - (KJS::ReadModifyDotNode::optimizeVariableAccess): - (KJS::ReadModifyDotNode::evaluate): - (KJS::AssignErrorNode::evaluate): - (KJS::AssignBracketNode::optimizeVariableAccess): - (KJS::AssignBracketNode::evaluate): - (KJS::ReadModifyBracketNode::optimizeVariableAccess): - (KJS::ReadModifyBracketNode::evaluate): - (KJS::CommaNode::optimizeVariableAccess): - (KJS::CommaNode::evaluate): - (KJS::ConstDeclNode::optimizeVariableAccess): - (KJS::ConstDeclNode::handleSlowCase): - (KJS::ConstDeclNode::evaluateSingle): - (KJS::ConstDeclNode::evaluate): - (KJS::ConstStatementNode::optimizeVariableAccess): - (KJS::ConstStatementNode::execute): - (KJS::statementListExecute): - (KJS::BlockNode::optimizeVariableAccess): - (KJS::BlockNode::execute): - (KJS::EmptyStatementNode::execute): - (KJS::ExprStatementNode::optimizeVariableAccess): - (KJS::ExprStatementNode::execute): - (KJS::VarStatementNode::optimizeVariableAccess): - (KJS::VarStatementNode::execute): - (KJS::IfNode::optimizeVariableAccess): - (KJS::IfNode::execute): - (KJS::IfElseNode::optimizeVariableAccess): - (KJS::IfElseNode::execute): - (KJS::DoWhileNode::optimizeVariableAccess): - (KJS::DoWhileNode::execute): - (KJS::WhileNode::optimizeVariableAccess): - (KJS::WhileNode::execute): - (KJS::ForNode::optimizeVariableAccess): - (KJS::ForNode::execute): - (KJS::ForInNode::optimizeVariableAccess): - (KJS::ForInNode::execute): - (KJS::ContinueNode::execute): - (KJS::BreakNode::execute): - (KJS::ReturnNode::optimizeVariableAccess): - (KJS::ReturnNode::execute): - (KJS::WithNode::optimizeVariableAccess): - (KJS::WithNode::execute): - (KJS::CaseClauseNode::optimizeVariableAccess): - (KJS::CaseClauseNode::evaluate): - (KJS::CaseClauseNode::executeStatements): - (KJS::ClauseListNode::optimizeVariableAccess): - (KJS::CaseBlockNode::optimizeVariableAccess): - (KJS::CaseBlockNode::executeBlock): - (KJS::SwitchNode::optimizeVariableAccess): - (KJS::SwitchNode::execute): - (KJS::LabelNode::optimizeVariableAccess): - (KJS::LabelNode::execute): - (KJS::ThrowNode::optimizeVariableAccess): - (KJS::ThrowNode::execute): - (KJS::TryNode::optimizeVariableAccess): - (KJS::TryNode::execute): - (KJS::ProgramNode::initializeSymbolTable): - (KJS::ScopeNode::optimizeVariableAccess): - (KJS::ProgramNode::processDeclarations): - (KJS::EvalNode::processDeclarations): - (KJS::ProgramNode::execute): - (KJS::EvalNode::execute): - (KJS::FunctionBodyNodeWithDebuggerHooks::execute): - (KJS::FuncDeclNode::execute): - (KJS::FuncExprNode::evaluate): - * kjs/nodes.h: - (KJS::Node::): - (KJS::FalseNode::): - (KJS::TrueNode::): - (KJS::ArgumentsNode::): - -2008-04-23 Oliver Hunt - - Reviewed by Geoff. - - Bug 18672: SQUIRRELFISH: codegen fails with a large number of temporaries - - - Add a SegmentedVector type, which provides a Vector which maintains - existing memory locations during resize. This allows dynamically sizing - local, temporary and label "vectors" in CodeGenerator. - - * JavaScriptCore.xcodeproj/project.pbxproj: - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::addVar): - (KJS::CodeGenerator::CodeGenerator): - (KJS::CodeGenerator::newTemporary): - (KJS::CodeGenerator::newLabel): - * VM/CodeGenerator.h: - * VM/SegmentedVector.h: Added. - (KJS::SegmentedVector::SegmentedVector): - (KJS::SegmentedVector::~SegmentedVector): - (KJS::SegmentedVector::last): - (KJS::SegmentedVector::append): - (KJS::SegmentedVector::removeLast): - (KJS::SegmentedVector::size): - (KJS::SegmentedVector::operator[]): - (KJS::SegmentedVector::resize): - (KJS::SegmentedVector::shrink): - (KJS::SegmentedVector::grow): - -2008-04-23 Geoffrey Garen - - Reviewed by Maciej Stachowiak. - - A little refactoring in preparation for supporting 'arguments'. - - Fixes 2 regression tests. - - SunSpider reports no change. - - We now check the activation register, instead of the codeBlock, to - determine whether we need to tear off the activation. This is to support - "f.arguments", which will create an activation/arguments pair for f, - even though the needsFullScopeChain flag is false for f's codeBlock. - - The test fixes resulted from calling initializeCallFrame for re-entrant - function code, instead of initializing (not enough) parts of the call - frame by hand. - -2008-04-22 Maciej Stachowiak - - Reviewed by Sam. - - - propagate the "this" value properly to local eval - - (fixes a measly one regression test) - - * VM/CodeBlock.h: - (KJS::CodeBlock::CodeBlock): - (KJS::ProgramCodeBlock::ProgramCodeBlock): - (KJS::EvalCodeBlock::EvalCodeBlock): - * VM/Machine.cpp: - (KJS::Machine::privateExecute): - -2008-04-22 Cameron Zwarich - - Reviewed by Maciej. - - Add support for function declarations in eval code. - - (this fixes 12 more regression tests) - - * VM/CodeBlock.h: - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::CodeGenerator): - * VM/CodeGenerator.h: - * VM/Machine.cpp: - (KJS::Machine::execute): - * kjs/nodes.cpp: - (KJS::EvalNode::generateCode): - -2008-04-22 Cameron Zwarich - - Reviewed by Oliver. - - Implement LabelNode. - - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::pushJumpContext): - (KJS::CodeGenerator::jumpContextForContinue): - (KJS::CodeGenerator::jumpContextForBreak): - * VM/CodeGenerator.h: - * kjs/nodes.cpp: - (KJS::DoWhileNode::emitCode): - (KJS::WhileNode::emitCode): - (KJS::ForNode::emitCode): - (KJS::ForInNode::emitCode): - (KJS::ContinueNode::emitCode): - (KJS::BreakNode::emitCode): - (KJS::SwitchNode::emitCode): - (KJS::LabelNode::emitCode): - -2008-04-22 Geoffrey Garen - - Reviewed by Oliver Hunt. - - Fixed crash when unwinding from exceptions inside eval. - - * VM/Machine.cpp: - (KJS::Machine::unwindCallFrame): Don't assume that the top of the - current call frame's scope chain is an activation: it can be the global - object, instead. - -2008-04-22 Maciej Stachowiak - - Reviewed by Geoff. - - * kjs/testkjs.cpp: - (main): Convert signals to exit codes, so that crashing tests are - detected as regression test failures. - -2008-04-22 Geoffrey Garen - - Reviewed by Oliver Hunt and Maciej Stachowiak. - - Renamed "needsActivation" to "needsFullScopeChain" because lying will - make hair grow on the backs of your hands. - -2008-04-21 Geoffrey Garen - - Reviewed by Maciej Stachowiak. - - Fixed ScopeChainNode lifetime problems: - - (1) In "with" and "catch" scopes, we would construct a ScopeChain - object and then jump across its destructor, leaking the ScopeChainNode - we had pushed. - - (2) In global and eval scopes, we would fail to initially ref - "scopeChain", causing us to overrelease it later. Now that we ref - "scopeChain" properly, we also need to deref it when the script - terminates. - - SunSpider reports a .2% regression, but an earlier round of ScopeChain - refactoring was a .4% speedup, so there. - -2008-04-22 Maciej Stachowiak - - Reviewed by Alexey. - - - use global object instead of null for "this" on unqualified calls - - This fixes 10 more JSC test regressions. - - * VM/Machine.cpp: - (KJS::Machine::privateExecute): - -2008-04-22 Maciej Stachowiak - - Reviewed by Oliver. - - - throw proper exceptions for objects that don't implement call or construct - - This fixes 21 more JSC test regressions. It is also seemingly an - 0.5% progression. - - * VM/ExceptionHelpers.cpp: - (KJS::createNotAnObjectError): - (KJS::createNotAConstructorError): - (KJS::createNotAFunctionError): - * VM/ExceptionHelpers.h: - * VM/Machine.cpp: - (KJS::Machine::privateExecute): - -2008-04-21 Oliver Hunt - - Reviewed by Geoff. - - Implement emitCode for ConstDeclNode. - - This fixes the crash (assertion) in js1_5/Scope/scope-001.js - - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::registerForLocalConstInit): - * VM/CodeGenerator.h: - * kjs/nodes.cpp: - (KJS::AssignResolveNode::emitCode): - (KJS::ConstDeclNode::emitCodeSingle): - (KJS::ConstDeclNode::emitCode): - (KJS::ConstStatementNode::emitCode): - * kjs/nodes.h: - -2008-04-21 Maciej Stachowiak - - Reviewed by Sam. - - - add some support for the split window object - - This fixes many layout tests. - - * VM/Machine.cpp: - (KJS::resolveBaseAndFunc): Use toThisObject() to ensure we get the - wrapper global, if one exists, as the "this" object. - * kjs/function.cpp: - (KJS::globalFuncEval): Use toGlobalObject() to handle the wrapper - case properly. - -2008-04-21 Maciej Stachowiak - - Reviewed by Oliver. - - - restore ScopeChain::operator= to avoid crash on many layout tests - - Otherwise, FunctionImp::setScope would cause a reference - underflow. I implemented using the copy construct and swap idiom. - - * kjs/scope_chain.h: - (KJS::ScopeChain::swap): - (KJS::ScopeChain::operator=): - -2008-04-21 Oliver Hunt - - Reviewed by Geoff. - - Bug 18649: SQUIRRELFISH: correctly handle exceptions in eval code - - - Allocate a callframe for eval() and initialise with a null codeBlock to - indicate native code. This prevents the unwinder from clobbering the - register stack. - - * VM/Machine.cpp: - (KJS::Machine::execute): - -2008-04-21 Geoffrey Garen - - Reviewed by Sam Weinig. - - Removed ScopeChain::push(ScopeChain&) because it was unused. Moved - ScopeChain::print to ScopeChainNode. - - ScopeChain is now nothing more than a resource-handling wrapper around - ScopeChainNode. - -2008-04-21 Cameron Zwarich - - Reviewed by Maciej. - - Bug 18671: SquirrelFish: continue inside switch fails - - - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::jumpContextForLabel): - * VM/CodeGenerator.h: - * kjs/nodes.cpp: - (KJS::ContinueNode::emitCode): - -2008-04-21 Geoffrey Garen - - Reviewed by Sam Weinig. - - Moved push(JSObject*) and pop() from ScopeChain to ScopeChainNode, - rearranging scope_chain.h a bit. - - SunSpider reports no change. - -2008-04-21 Geoffrey Garen - - Reviewed by Sam Weinig. - - Moved bottom() from ScopeChain to ScopeChainNode, simplifying it based - on the knowledge that the ScopeChain is never empty. - - SunSpider reports no change. - -2008-04-21 Geoffrey Garen - - Reviewed by Oliver Hunt. - - Moved begin() and end() from ScopeChain to ScopeChainNode. - - Also marked a few methods "const". - - SunSpider reports no change. - -2008-04-21 Geoffrey Garen - - Reviewed by Maciej Stachowiak. - - Turned ScopeChain::depth into a stand-alone function, and simplified it - a bit. - - I also moved ScopeChain::depth to Machine.cpp because it doesn't report - the true depth of the ScopeChain -- just the Machine's perspective of - its depth within a given call frame. - - SunSpider reports no change. - -2008-04-21 Geoffrey Garen - - Reviewed by Maciej Stachowiak. - - Removed indirection in ScopeChain::ref / ScopeChain::deref. - - SunSpider reports no change. - - * kjs/scope_chain.h: - (KJS::ScopeChain::ScopeChain): - (KJS::ScopeChain::~ScopeChain): - (KJS::ScopeChain::clear): - -2008-04-21 Oliver Hunt - - Fix debug build - - * kjs/nodes.cpp: - (KJS::ConstDeclNode::evaluateSingle): - -2008-04-21 Cameron Zwarich - - Reviewed by Oliver. - - Bug 18664: SQUIRRELFISH: correctly throw a SyntaxError when parsing of eval code fails - - - Correctly throw a SyntaxError when parsing of eval code fails. - - * VM/Machine.cpp: - (KJS::eval): - -2008-04-21 Oliver Hunt - - Reviewed by Geoff. - - Partial fix for Bug 18649: SQUIRRELFISH: correctly handle exceptions in eval code - - Make sure we correct the register state before jumping to vm_throw. - - * VM/Machine.cpp: - (KJS::Machine::privateExecute): - -2008-04-21 Geoffrey Garen - - Reviewed by Maciej Stachowiak. - - Simplified ScopeChain ref/deref. - - SunSpider reports a .4% speedup. - - * kjs/scope_chain.h: - (KJS::ScopeChainNode::ref): Removed this function because it was nonsense. - ScopeChainNodes are initialized with a refCount of 1, so the loop was - guaranteed to iterate exactly once. - -2008-04-21 Geoffrey Garen - - Reviewed by Maciej Stachowiak. - - Removed support for empty ScopeChains. - - SunSpider reports no change. - -2008-04-21 Geoffrey Garen - - Reviewed by Maciej Stachowiak. - - Removed some completely unused ScopeChain member functions. - - SunSpider reports no change. - -2008-04-21 Geoffrey Garen - - Reviewed by Maciej Stachowiak. - - Avoid creating unnecessary ScopeChain objects, to reduce refcount churn. - - SunSpider reports no change. - -2008-04-21 Maciej Stachowiak - - Rubber stamped by Alexey. - - Add some braces.x - - * kjs/testkjs.cpp: - (runWithScripts): - -2008-04-21 Maciej Stachowiak - - Reviewed by Oliver. - - - only print "End:" output when -d flag is passed. - - This fixes half of our failing JSC regression tests. - - * kjs/testkjs.cpp: - (runWithScripts): - -2008-04-21 Cameron Zwarich - - Reviewed by Maciej. - - Add support for variable declarations in eval code. - - * VM/CodeBlock.h: - (KJS::EvalCodeBlock::EvalCodeBlock): - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::CodeGenerator): - * VM/CodeGenerator.h: - * VM/Machine.cpp: - (KJS::Machine::execute): - * VM/Machine.h: - * kjs/function.cpp: - (KJS::globalFuncEval): - * kjs/nodes.cpp: - (KJS::EvalNode::generateCode): - * kjs/nodes.h: - (KJS::EvalNode::): - -2008-04-20 Oliver Hunt - - Reviewed by Maciej. - - Throw exceptions for invalid continue, break, and return statements. - - Simple refactoring and extension of Cameron's AssignErrorNode, etc patch - - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::CodeGenerator): - (KJS::CodeGenerator::pushJumpContext): - (KJS::CodeGenerator::popJumpContext): - (KJS::CodeGenerator::jumpContextForLabel): - * VM/CodeGenerator.h: - * kjs/nodes.cpp: - (KJS::Node::emitThrowError): - (KJS::ContinueNode::emitCode): - (KJS::BreakNode::emitCode): - (KJS::ReturnNode::emitCode): - * kjs/nodes.h: - -2008-04-20 Geoffrey Garen - - Reviewed by Oliver Hunt. - - Removed Machine.cpp from AllInOneFile.cpp, and manually inlined a few - things that used to be inlined automatically. - - 1.9% speedup on SunSpider. - - My hope is that we'll face fewer surprises in Machine.cpp codegen, now - that GCC is making fewer decisions. The speedup seems to confirm that. - -2008-04-20 Oliver Hunt - - Reviewed by Maciej. - - Bug 18642: Iterator context may get placed into the return register, leading to much badness - - - To prevent incorrectly reusing what will become the result register for - eval and global code execution, we need to request and ref the destination - in advance of codegen. Unfortunately this may lead to unnecessary copying, - although in future we can probably limit this. Curiously SunSpider shows - a progression in a number of tests, although it comes out as a wash overall. - - * kjs/nodes.cpp: - (KJS::EvalNode::emitCode): - (KJS::ProgramNode::emitCode): - -2008-04-20 Cameron Zwarich - - Reviewed by Maciej. - - Add support for AssignErrorNode, PrefixErrorNode, and PostfixErrorNode. - - * VM/CodeBlock.cpp: - (KJS::CodeBlock::dump): - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::emitCreateError): - * VM/CodeGenerator.h: - * VM/Machine.cpp: - (KJS::Machine::privateExecute): - * VM/Opcode.h: - * kjs/nodes.cpp: - (KJS::PostfixErrorNode::emitCode): - (KJS::PrefixErrorNode::emitCode): - (KJS::AssignErrorNode::emitCode): - * kjs/nodes.h: - -2008-04-20 Oliver Hunt - - Reviewed by Geoff and Mark. - - Provide line number information in exceptions - - Simple patch, adds line number information metadata to CodeBlock - and a simple method to get the line number responsible for a given - Instruction*. - - * VM/CodeBlock.cpp: - (KJS::CodeBlock::lineNumberForVPC): - * VM/CodeBlock.h: - * VM/CodeGenerator.h: - (KJS::CodeGenerator::emitNode): - * VM/Machine.cpp: - (KJS::Machine::throwException): - -2008-04-20 Oliver Hunt - - Reviewed by Maciej. - - Provide "sourceURL" in exceptions - - * VM/CodeBlock.h: - * VM/Machine.cpp: - (KJS::Machine::throwException): - * kjs/nodes.cpp: - (KJS::EvalNode::generateCode): - (KJS::ProgramNode::generateCode): - -2008-04-19 Oliver Hunt - - Reviewed by Maciej. - - Don't call emitCode directly on subnodes, instead use CodeGenerator::emitNode - - This patch just a preparation for tracking line numbers. - - * kjs/nodes.cpp: - (KJS::ObjectLiteralNode::emitCode): - (KJS::PropertyListNode::emitCode): - (KJS::ArgumentListNode::emitCode): - (KJS::TryNode::emitCode): - -2008-04-19 Oliver Hunt - - Reviewed by Maciej. - - Bug 18619: Support continue, break, and return in try .. finally blocks - - - This patch replaces the current partial finally support (which uses code - duplication to achieve what it does) with a subroutine based approach. - This has a number of advantages over code duplication: - * Reduced code size - * Simplified exception handling as the finaliser code only exists in - one place, so no "magic" is needed to get the correct handler for a - finaliser. - * When we support instruction to line number mapping we won't need to - worry about the dramatic code movement caused by duplication - - On the downside it is necessary to add two new opcodes, op_jsr and op_sret - to enter and exit the finaliser subroutines, happily SunSpider reports - a performance progression (gcc amazes me) and ubench reports a wash. - - While jsr and sret provide a mechanism that allows us to enter and exit - any arbitrary finaliser we need to, it was still necessary to increase - the amount of information tracked when entering and exiting both finaliser - scopes and dynamic scopes ("with"). This means "scopeDepth" is now - the combination of "finaliserDepth" and "dynamicScopeDepth". We also - now use a scopeContextStack to ensure that we pop scopes and execute - finalisers in the correct order. This increases the cost of "with" nodes - during codegen, but it should not be significant enough to effect real - world performance and greatly simplifies codegen for return, break and - continue when interacting with finalisers. - - * VM/CodeBlock.cpp: - (KJS::CodeBlock::dump): - Pretty printing of jsr/sret opcodes - - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::CodeGenerator): - (KJS::CodeGenerator::emitPushScope): - (KJS::CodeGenerator::emitPopScope): - Dynamic scopes need to be tracked on the scopeContextStack now - - (KJS::CodeGenerator::pushFinallyContext): - (KJS::CodeGenerator::popFinallyContext): - Handle entry and exit from code regions with finalisers. This is - needed solely to support return, continue and break inside finaliser - regions. - - (KJS::CodeGenerator::emitComplexJumpScopes): - Helper function for emitJumpScopes to handle the complex codegen - needed to handle return, continue and break inside a finaliser region - - (KJS::CodeGenerator::emitJumpScopes): - Updated to be aware of finalisers, if a cross-scope jump occurs inside - a finaliser we hand off codegen to emitComplexJumpScopes, otherwise - we can handle the normal (trivial) case with a single instruction. - - (KJS::CodeGenerator::emitJumpSubroutine): - (KJS::CodeGenerator::emitSubroutineReturn): - Trivial opcode emitter functions. - - * VM/CodeGenerator.h: - (KJS::CodeGenerator::scopeDepth): - * VM/Machine.cpp: - (KJS::Machine::privateExecute): - Implement op_jsr and op_sret. - - * VM/Opcode.h: - Ad op_jsr and op_sret - - * kjs/nodes.cpp: - (KJS::TryNode::emitCode): - Fix codegen for new finaliser model. - -2008-04-17 Mark Rowe - - Rubber-stamped by Oliver Hunt. - - Remove unnecessary files from testkjs, testapi and minidom targets. - - * JavaScriptCore.xcodeproj/project.pbxproj: - -2008-04-17 Geoffrey Garen - - Reviewed by Oliver Hunt. - - Fixed ASSERT seen during run-sunspider of a debug build. - - * VM/CodeGenerator.h: Made the default codegen buffers bigger. SunSpider - runs all tests in one global environment, so you end up with more than - 128 locals. This is just a stop-gap until we code up a real - solution to arbitrary symbol and label limits. - -2008-04-17 Geoffrey Garen - - Reviewed by Oliver Hunt. - - Fixed a bug in exception unwinding, where we wouldn't deref the scope - chain in global scope, so we would leak ScopeChainNodes when exceptions - were thrown inside "with" and "catch" scopes. - - Also did some cleanup of the unwinding code along the way. - - Scope chain reference counting is still wrong in a few ways. I thought - I would fix this portion of it first. - - run-sunspider shows no change. - - * VM/Machine.cpp: - (KJS::Machine::unwindCallFrame): - (KJS::Machine::throwException): - (KJS::Machine::privateExecute): - * VM/Machine.h: - -2008-04-17 Oliver Hunt - - Reviewed by Maciej. - - Add more exception checking to toNumber conversions - - This corrects op_pre_dec, op_negate, op_mod and op_sub. - - * VM/Machine.cpp: - (KJS::Machine::privateExecute): - -2008-04-17 Geoffrey Garen and Cameron Zwarich - - Reviewed by Oliver Hunt. - - Behold: eval. - - Introduced a new opcode: op_call_eval. In the normal case, it performs - an eval. In the case where eval has been overridden in some way, it - performs a function call. - - * VM/CodeGenerator.h: Added a feature so the code generator knows not - to optimized locals in eval code. - -2008-04-17 Geoffrey Garen - - Reviewed by Sam Weinig. - - Added some ASSERTs to document codegen failures in - run-javascriptcore-tests. - - For all tests, program-level codegen now either succeeds, or fails with - an ASSERT. - - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::addVar): - (KJS::CodeGenerator::CodeGenerator): - (KJS::CodeGenerator::newTemporary): - (KJS::CodeGenerator::newLabel): - -2008-04-17 Geoffrey Garen - - Reviewed by Maciej Stachowiak. - - Fixed another case of a dst register being an unreferenced temporary - (caused an ASSERT when running the full sunspider suite). - - * kjs/nodes.cpp: - (KJS::CaseBlockNode::emitCodeForBlock): - -2008-04-16 Maciej Stachowiak - - Reviewed by Geoff. - - - add documentation (and meaningful parameter names) for arithmetic and bitwise binary ops - - * VM/CodeBlock.cpp: - (KJS::CodeBlock::dump): - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::emitMul): - (KJS::CodeGenerator::emitDiv): - (KJS::CodeGenerator::emitMod): - (KJS::CodeGenerator::emitSub): - (KJS::CodeGenerator::emitLeftShift): - (KJS::CodeGenerator::emitRightShift): - (KJS::CodeGenerator::emitUnsignedRightShift): - (KJS::CodeGenerator::emitBitAnd): - (KJS::CodeGenerator::emitBitXOr): - (KJS::CodeGenerator::emitBitOr): - * VM/CodeGenerator.h: - * VM/Machine.cpp: - (KJS::Machine::privateExecute): - * VM/Opcode.h: - * kjs/nodes.cpp: - (KJS::MultNode::emitCode): - (KJS::DivNode::emitCode): - (KJS::ModNode::emitCode): - (KJS::SubNode::emitCode): - (KJS::LeftShiftNode::emitCode): - (KJS::RightShiftNode::emitCode): - (KJS::UnsignedRightShiftNode::emitCode): - (KJS::BitAndNode::emitCode): - (KJS::BitXOrNode::emitCode): - (KJS::BitOrNode::emitCode): - (KJS::emitReadModifyAssignment): - (KJS::ReadModifyResolveNode::emitCode): - -2008-04-16 Oliver Hunt - - Reviewed by Geoff. - - Exception checks for toNumber in op_pre_inc - - This is somewhat more convoluted than the simple hadException checks - we currently use. Instead we use special toNumber conversions that - select between the exception and ordinary vPC. This allows us to - remove any branches in the common case (incrementing a number). - - * API/JSCallbackObject.h: - * API/JSCallbackObjectFunctions.h: - (KJS::::toNumber): - * ChangeLog: - * JavaScriptCore.exp: - * JavaScriptCore.xcodeproj/project.pbxproj: - * VM/JSPropertyNameIterator.cpp: - (KJS::JSPropertyNameIterator::toNumber): - * VM/JSPropertyNameIterator.h: - * VM/Machine.cpp: - (KJS::Machine::privateExecute): - * VM/Opcode.h: - * kjs/ExecState.cpp: - (KJS::ExecState::ExecState): - * kjs/ExecState.h: - * kjs/JSNotAnObject.cpp: - (KJS::JSNotAnObject::toNumber): - * kjs/JSNotAnObject.h: - * kjs/internal.cpp: - (KJS::StringImp::toNumber): - (KJS::NumberImp::toNumber): - (KJS::GetterSetterImp::toNumber): - * kjs/internal.h: - * kjs/object.cpp: - (KJS::JSObject::toNumber): - * kjs/object.h: - * kjs/value.h: - (KJS::JSValue::toNumber): - -2008-04-16 Maciej Stachowiak - - Reviewed by Geoff. - - - ensure that activations are kept in a register to protect them from GC - - Also renamed OptionalCalleeScopeChain constant to OptionalCalleeActivation, since - that is what is now kept there, and there is no more need to keep the scope chain in - the register file. - - * VM/Machine.cpp: - (KJS::initializeCallFrame): - (KJS::scopeChainForCall): - * VM/Machine.h: - (KJS::Machine::): - -2008-04-16 Geoffrey Garen - - Reviewed by Oliver Hunt. - - Made "this" work in program code / global scope. - - The machine can initialize "this" prior to execution because it knows - that, for program code, "this" is always stored in lr1. - - * VM/Machine.cpp: - (KJS::Machine::execute): - * VM/Machine.h: - (KJS::Machine::): - * kjs/interpreter.cpp: - (KJS::Interpreter::evaluate): - -2008-04-16 Geoffrey Garen - - Reviewed by Oliver Hunt. - - Fixed a codegen bug when returning from inside a dynamic scope (a with - or catch block): we need to pop any dynamic scope(s) that have been - added so op_ret can find the activation object at the top of the scope - chain. - - * kjs/nodes.cpp: - (KJS::ReturnNode::emitCode): If we're returning from inside a dynamic - scope, emit a jmp_scopes to take care of popping any dynamic scope(s) - and then branching to the return instruction. - -2008-04-16 Maciej Stachowiak - - Reviewed by Geoff. - - - document the add and get_prop_id opcodes - - In addition to adding documentation in comments, I changed - references to register IDs or indices relating to these opcodes to - have meaningful names instead of r0 r1 r2. - - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::emitAdd): - * VM/CodeGenerator.h: - * VM/Machine.cpp: - (KJS::Machine::privateExecute): - * kjs/nodes.cpp: - (KJS::DotAccessorNode::emitCode): - (KJS::FunctionCallDotNode::emitCode): - (KJS::PostIncDotNode::emitCode): - (KJS::PostDecDotNode::emitCode): - (KJS::PreIncDotNode::emitCode): - (KJS::PreDecDotNode::emitCode): - (KJS::AddNode::emitCode): - (KJS::ReadModifyDotNode::emitCode): - -2008-04-15 Geoffrey Garen - - Reviewed by Oliver Hunt and Maciej Stachowiak. - - Fixed a codegen bug in with and switch, and added an ASSERT to - make sure it doesn't happen again. - - emitCode() assumes that dst, if non-zero, is either referenced or - non-temporary (i.e., it assumes that newTemporary() will return a - register not equal to dst). Certain callers to emitCode() weren't - guaranteeing that to be so, so temporary register values were being - overwritten. - - * VM/CodeGenerator.h: - (KJS::CodeGenerator::emitNode): ASSERT that dst is referenced or non-temporary. - - * kjs/nodes.cpp: - (KJS::CommaNode::emitCode): Reference the dst we pass. - - (KJS::WithNode::emitCode): No need to pass an explicit dst register. - - (KJS::CaseBlockNode::emitCodeForBlock): No need to pass an explicit dst register. - (KJS::SwitchNode::emitCode): No need to pass an explicit dst register. - - * kjs/nodes.h: Made dst the last parameter to emitCodeForBlock, to match - emitCode. - -2008-04-15 Oliver Hunt - - Reviewed by Maciej. - - Bug 18526: Throw exceptions when resolve fails for op_resolve_base_and_func. - - - Very simple fix, sunspider shows a 0.7% progression, ubench shows a 0.4% regression. - - * VM/Machine.cpp: - (KJS::resolveBaseAndFunc): - (KJS::Machine::privateExecute): - -2008-04-15 Maciej Stachowiak - - Reviewed by Oliver. - - - fix incorrect result on 3d-raytrace test - - Oliver found and tracked down this bug, I just typed in the fix. - - * VM/Machine.cpp: - (KJS::slideRegisterWindowForCall): When setting omitted parameters to undefined, - account for the space for local variables. - -2008-04-15 Maciej Stachowiak - - Reviewed by Oliver. - - - fix codegen handling of dst registers - - 1.006x speedup (not sure why). - - Most emitCode functions take an optional "dst" parameter that says - where the output of the instruction should be written. I made some - functions for convenient handling of the dst register: - - * VM/CodeGenerator.h: - (KJS::CodeGenerator::tempDestination): Takes the dst register. Returns it if - it is not null and is a temporary, otherwise allocates a new temporary. This is - intended for cases where an intermediate value might be written into the dst - - (KJS::CodeGenerator::finalDestination): Takes the dst register and an optional - register that was used as a temp destination. Picks the right thing for the final - output. Intended to be used as the output register for the instruction that generates - the final value of a particular node. - - (KJS::CodeGenerator::moveToDestinationIfNeeded): Takes dst and a - RegisterID; moves from the register to dst if dst is defined and - different from the register. This is intended for cases where the - result of a node is already in a specific register (likely a - local), and so no code needs to be generated unless a specific - destination has been requested, in which case a move is needed. - - I also applied these methods throughout emitCode functions. In - some cases this was just cleanup, in other cases I fixed actual - codegen bugs. Below I have given specific comments for the cases - where I believe I fixed a codegen bug, or improved quality of codegen. - - * kjs/nodes.cpp: - (KJS::NullNode::emitCode): - (KJS::FalseNode::emitCode): - (KJS::TrueNode::emitCode): - (KJS::NumberNode::emitCode): - (KJS::StringNode::emitCode): - (KJS::RegExpNode::emitCode): - (KJS::ThisNode::emitCode): Now avoids emitting a mov when dst is - the same as the this register (the unlikely case of "this = this"); - (KJS::ResolveNode::emitCode): Now avoids emitting a mov when dst - is the same as the local regiester, in the local var case (the - unlikely case of "x = x"); - (KJS::ArrayNode::emitCode): Fixed a codegen bug where array - literal element expressions may have observed an intermediate - value of constructing the array. - (KJS::ObjectLiteralNode::emitCode): - (KJS::PropertyListNode::emitCode): Fixed a codegen bug where object literal - property definition expressions may have obesrved an intermediate value of - constructing the object. - (KJS::BracketAccessorNode::emitCode): - (KJS::DotAccessorNode::emitCode): - (KJS::NewExprNode::emitCode): - (KJS::FunctionCallValueNode::emitCode): - (KJS::FunctionCallBracketNode::emitCode): - (KJS::FunctionCallDotNode::emitCode): - (KJS::PostIncResolveNode::emitCode): - (KJS::PostDecResolveNode::emitCode): - (KJS::PostIncBracketNode::emitCode): - (KJS::PostDecBracketNode::emitCode): - (KJS::PostIncDotNode::emitCode): - (KJS::PostDecDotNode::emitCode): - (KJS::DeleteResolveNode::emitCode): - (KJS::DeleteBracketNode::emitCode): - (KJS::DeleteDotNode::emitCode): - (KJS::DeleteValueNode::emitCode): - (KJS::VoidNode::emitCode): - (KJS::TypeOfResolveNode::emitCode): - (KJS::TypeOfValueNode::emitCode): - (KJS::PreIncResolveNode::emitCode): Fixed a codegen bug where the final - value would not be output to the dst register in the local var case. - (KJS::PreDecResolveNode::emitCode): Fixed a codegen bug where the final - value would not be output to the dst register in the local var case. - (KJS::PreIncBracketNode::emitCode): - (KJS::PreDecBracketNode::emitCode): - (KJS::PreIncDotNode::emitCode): - (KJS::PreDecDotNode::emitCode): - (KJS::UnaryPlusNode::emitCode): - (KJS::NegateNode::emitCode): - (KJS::BitwiseNotNode::emitCode): - (KJS::LogicalNotNode::emitCode): - (KJS::MultNode::emitCode): - (KJS::DivNode::emitCode): - (KJS::ModNode::emitCode): - (KJS::AddNode::emitCode): - (KJS::SubNode::emitCode): - (KJS::LeftShiftNode::emitCode): - (KJS::RightShiftNode::emitCode): - (KJS::UnsignedRightShiftNode::emitCode): - (KJS::LessNode::emitCode): - (KJS::GreaterNode::emitCode): - (KJS::LessEqNode::emitCode): - (KJS::GreaterEqNode::emitCode): - (KJS::InstanceOfNode::emitCode): - (KJS::InNode::emitCode): - (KJS::EqualNode::emitCode): - (KJS::NotEqualNode::emitCode): - (KJS::StrictEqualNode::emitCode): - (KJS::NotStrictEqualNode::emitCode): - (KJS::BitAndNode::emitCode): - (KJS::BitXOrNode::emitCode): - (KJS::BitOrNode::emitCode): - (KJS::LogicalAndNode::emitCode): - (KJS::LogicalOrNode::emitCode): - (KJS::ConditionalNode::emitCode): - (KJS::emitReadModifyAssignment): Allow an out argument separate from the operands, - needed for fixes below. - (KJS::ReadModifyResolveNode::emitCode): Fixed a codegen bug where the right side of - the expression may observe an intermediate value. - (KJS::AssignResolveNode::emitCode): Fixed a codegen bug where the right side of the - expression may observe an intermediate value. - (KJS::ReadModifyDotNode::emitCode): Fixed a codegen bug where the right side of the - expression may observe an intermediate value. - (KJS::ReadModifyBracketNode::emitCode): Fixed a codegen bug where the right side of the - expression may observe an intermediate value. - (KJS::CommaNode::emitCode): Avoid writing temporary value to dst register. - (KJS::ReturnNode::emitCode): Void return should return undefined, not null. - (KJS::FuncExprNode::emitCode): - -2008-04-15 Maciej Stachowiak - - Reviewed by Geoff. - - - fix huge performance regression (from trunk) in string-unpack-code - - This restores string-unpack-code performance to parity with - trunk (2.27x speedup relative to previous SquirrelFish) - - * VM/Machine.cpp: - (KJS::Machine::execute): Shrink register file after call to avoid - growing repeatedly. - -2008-04-15 Geoffrey Garen - - Reviewed by Sam Weinig. - - Fixed dumpCallFrame to match our new convention of passing around a - ScopeChainNode* instead of a ScopeChain*. - - * JavaScriptCore.exp: - * VM/Machine.cpp: - (KJS::Machine::dumpCallFrame): - * VM/Machine.h: - -2008-04-15 Oliver Hunt - - Reviewed by Maciej. - - Bug 18436: Need to throw exception on read/modify/write or similar resolve for nonexistent property - - - Add op_resolve_base_and_property for read/modify/write operations, - this adds a "superinstruction" to resolve the base and value of a - property simultaneously. Just using resolveBase and resolve results - in an 5% regression in ubench, 30% in loop-empty-resolve (which is - expected). 1.3% progression in sunspider, 2.1% in ubench, with a - 21% gain in loop-empty-resolve. The only outlier is function-missing-args - which gets a 3% regression that I could never resolve. - - * VM/CodeBlock.cpp: - (KJS::CodeBlock::dump): - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::emitResolveBaseAndProperty): - * VM/CodeGenerator.h: - * VM/Machine.cpp: - (KJS::resolveBaseAndProperty): - (KJS::Machine::privateExecute): - * VM/Opcode.h: - * kjs/nodes.cpp: - (KJS::PostIncResolveNode::emitCode): - (KJS::PostDecResolveNode::emitCode): - (KJS::PreIncResolveNode::emitCode): - (KJS::PreDecResolveNode::emitCode): - (KJS::ReadModifyResolveNode::emitCode): - -2008-04-15 Maciej Stachowiak - - Reviewed by Oliver. - - - fixed "SquirrelFish crashes due to bad scope chain on some SunSpider tests" - https://bugs.webkit.org/show_bug.cgi?id=18508 - - 3d-raytrace and string-unpack-code now run. - - The basic approach is to pass around ScopeChainNode* instead of - ScopeChain*, which in addition to not becoming suddenly an invalid - pointer also saves an indirection. - - This is an 0.4% speedup on SunSpider --squirrelfish (1.8% on --ubench) - - * VM/Machine.cpp: - (KJS::resolve): - (KJS::resolveBase): - (KJS::resolveBaseAndFunc): - (KJS::initializeCallFrame): - (KJS::scopeChainForCall): - (KJS::Machine::unwindCallFrame): - (KJS::Machine::throwException): - (KJS::Machine::execute): - (KJS::Machine::privateExecute): - * VM/Machine.h: - * VM/Register.h: - (KJS::Register::): - * kjs/nodes.cpp: - (KJS::EvalNode::generateCode): - (KJS::FunctionBodyNode::generateCode): - (KJS::ProgramNode::generateCode): - (KJS::ProgramNode::processDeclarations): - (KJS::EvalNode::processDeclarations): - (KJS::FuncDeclNode::makeFunction): - (KJS::FuncExprNode::makeFunction): - * kjs/nodes.h: - (KJS::ProgramNode::): - (KJS::EvalNode::): - (KJS::FunctionBodyNode::): - * kjs/object.h: - * kjs/scope_chain.h: - (KJS::ScopeChainNode::ScopeChainNode): - (KJS::ScopeChainNode::deref): - (KJS::ScopeChainIterator::ScopeChainIterator): - (KJS::ScopeChainIterator::operator*): - (KJS::ScopeChainIterator::operator->): - (KJS::ScopeChain::ScopeChain): - (KJS::ScopeChain::node): - (KJS::ScopeChain::deref): - (KJS::ScopeChain::ref): - (KJS::ScopeChainNode::ref): - (KJS::ScopeChainNode::release): - (KJS::ScopeChainNode::begin): - (KJS::ScopeChainNode::end): - -2008-04-14 Geoffrey Garen - - Reviewed by Oliver Hunt. - - Fixed crash when accessing registers in a torn-off activation object. - - * kjs/JSActivation.cpp: - (KJS::JSActivation::copyRegisters): Update our registerOffset after - copying our registers, since our offset should now be relative to - our private register array, not the shared register file. - -2008-04-14 Maciej Stachowiak - - Reviewed by Oliver. - - - fix a codegen flaw that makes some tests run way too fast or way too slow - - The basic problem was that FunctionCallResolveNode results in - codegen which can incorrectly write an intermediate value into the - dst register even when that is a local. I added convenience - functions to CodeGenerator for getting this right, but for now I - only fixed FunctionCallResolve. - - * VM/CodeGenerator.h: - (KJS::CodeGenerator::tempDestination): - (KJS::CodeGenerator::): - * kjs/nodes.cpp: - (KJS::FunctionCallResolveNode::emitCode): - -2008-04-14 Gabor Loki - - Reviewed and slightly tweaked by Geoffrey Garen. - - Bug 18489: Squirrelfish doesn't build on linux - - - * JavaScriptCore.pri: Add VM into include path and its files into - source set - * VM/JSPropertyNameIterator.cpp: Fix include name - * VM/Machine.cpp: Add UNLIKELY macro for GCC - * VM/Machine.h: Add missing includes - * VM/RegisterFile.cpp: Add missing include - * kjs/testkjs.pro: Add VM into include path - -2008-04-14 Geoffrey Garen - - Reviewed by Sam Weinig. - - Restored OwnPtr in some places where I had removed it previously. We - can have an OwnPtr to an undefined class in a header as long as the - class's destructor isn't in the header. - -2008-04-14 Geoffrey Garen - - Reviewed by Sam Weinig. - - Fixed access to "this" inside dynamic scopes. - - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::registerForLocal): Always return a register for - "this", even if we're not optimizing access to other locals. Because - "this" is a keyword, it's always in a register and always accessible. - - * VM/CodeGenerator.h: - (KJS::CodeGenerator::shouldOptimizeLocals): Factored out a function - for determining whether we should optimize access to locals, since - eval will need to make this test a little more complicated. - -2008-04-14 Maciej Stachowiak - - Reviewed by Adam. - - - fix crash when running SunSpider full harness - - When growing the register file's buffer to make space for new globals, - make sure to copy accounting for the fact that the new space is logically - at the beginning of the buffer in this case, instead of at the end as when - growing for a new call frame. - - * VM/RegisterFile.cpp: - (KJS::RegisterFile::newBuffer): - (KJS::RegisterFile::growBuffer): - (KJS::RegisterFile::addGlobalSlots): - * VM/RegisterFile.h: - -2008-04-11 Geoffrey Garen - - Reviewed by Sam Weinig. - - Mark constant pools for global and eval code (collectively known as - "program code"). (Constant pools for function code are already marked by - their functions.) - - The global object is responsible for marking program code constant - pools. Code blocks add themselves to the mark set at creation time, and - remove themselves from the mark set at destruction time. - - sunspider --squirrelfish reports a 1% speedup, perhaps because - generateCode() is now non-virtual. - - * kjs/nodes.cpp: I had to use manual init and delete in this file - because putting an OwnPtr into the header would have created a circular - header dependency. - -2008-04-10 Cameron Zwarich - - Reviewed by Maciej. - - Bug 18231: Improve support for function call nodes in SquirrelFish - - - Use correct value of 'this' for function calls. - - * VM/CodeBlock.cpp: - (KJS::CodeBlock::dump): - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::emitResolveBaseAndFunc): - * VM/CodeGenerator.h: - * VM/Machine.cpp: - (KJS::resolveBaseAndFunc): - (KJS::Machine::privateExecute): - * VM/Opcode.h: - * kjs/nodes.cpp: - (KJS::FunctionCallResolveNode::emitCode): - -2008-04-10 Geoffrey Garen - - This time for sure. - - * kjs/interpreter.cpp: - (KJS::Interpreter::evaluate): - -2008-04-10 Geoffrey Garen - - Reviewed by Sam Weinig. - - Fixed Interpreter::execute to honor the new model for returning non-NULL - values when an exception is thrown. - - * kjs/interpreter.cpp: - (KJS::Interpreter::evaluate): - -2008-04-10 Oliver Hunt - - Reviewed by Geoff. - - Fix SquirrelFish interpreter to pass internal exceptions back to - native code correctly. - - * JavaScriptCore.xcodeproj/project.pbxproj: - * VM/Machine.cpp: - (KJS::Machine::privateExecute): - -2008-04-10 Sam Weinig - - Reviewed by Geoffrey Garen. - - Replace the use of getCallData in op_construct with the new - getConstructData function that replaces implementsConstruct. - - * API/JSCallbackConstructor.cpp: - (KJS::JSCallbackConstructor::getConstructData): - * API/JSCallbackConstructor.h: - * API/JSCallbackObject.h: - * API/JSCallbackObjectFunctions.h: - (KJS::::getConstructData): - (KJS::::construct): - * API/JSObjectRef.cpp: - (JSObjectIsConstructor): - * JavaScriptCore.exp: - * JavaScriptCore.xcodeproj/project.pbxproj: - * VM/Machine.cpp: - (KJS::Machine::privateExecute): - * kjs/CallData.h: - * kjs/ConstructData.h: Copied from JavaScriptCore/kjs/CallData.h. - * kjs/array_object.cpp: - (KJS::ArrayObjectImp::getConstructData): - * kjs/array_object.h: - * kjs/bool_object.cpp: - (KJS::BooleanObjectImp::getConstructData): - * kjs/bool_object.h: - * kjs/date_object.cpp: - (KJS::DateObjectImp::getConstructData): - * kjs/date_object.h: - * kjs/error_object.cpp: - (KJS::ErrorObjectImp::getConstructData): - (KJS::NativeErrorImp::getConstructData): - * kjs/error_object.h: - * kjs/function.cpp: - (KJS::FunctionImp::getCallData): - (KJS::FunctionImp::getConstructData): - (KJS::FunctionImp::construct): - * kjs/function.h: - * kjs/function_object.cpp: - (KJS::FunctionObjectImp::getConstructData): - * kjs/function_object.h: - * kjs/nodes.cpp: - (KJS::NewExprNode::inlineEvaluate): - * kjs/number_object.cpp: - (KJS::NumberObjectImp::getConstructData): - * kjs/number_object.h: - * kjs/object.cpp: - * kjs/object.h: - * kjs/object_object.cpp: - (KJS::ObjectObjectImp::getConstructData): - * kjs/object_object.h: - * kjs/regexp_object.cpp: - (KJS::RegExpObjectImp::getConstructData): - * kjs/regexp_object.h: - * kjs/string_object.cpp: - (KJS::StringObjectImp::getConstructData): - * kjs/string_object.h: - * kjs/value.cpp: - (KJS::JSCell::getConstructData): - * kjs/value.h: - (KJS::JSValue::getConstructData): - -2008-04-10 Oliver Hunt - - Reviewed by Geoff. - - Bug 18420: SquirrelFish: need to throw Reference and Type errors - when attempting invalid operations on JSValues - - Add validation and exception checks to SquirrelFish so that the - correct exceptions are thrown for undefined variables, type errors - and toObject failure. Also handle exceptions thrown by native - function calls. - - * JavaScriptCore.xcodeproj/project.pbxproj: - * VM/ExceptionHelpers.cpp: Added. - (KJS::substitute): - (KJS::createError): - (KJS::createUndefinedVariableError): - * VM/ExceptionHelpers.h: Added. - Helper functions - * VM/Machine.cpp: - (KJS::resolve): - Modified to signal failure - (KJS::isNotObject): - Wrapper for JSValue::isObject and exception creation (these need - to be merged, lest GCC go off the deep end) - (KJS::Machine::privateExecute): - Adding the many exception and validity checks. - - * kjs/JSNotAnObject.cpp: Added. - Stub object used to reduce the need for multiple exception checks - when toObject fails. - (KJS::JSNotAnObject::toPrimitive): - (KJS::JSNotAnObject::getPrimitiveNumber): - (KJS::JSNotAnObject::toBoolean): - (KJS::JSNotAnObject::toNumber): - (KJS::JSNotAnObject::toString): - (KJS::JSNotAnObject::toObject): - (KJS::JSNotAnObject::mark): - (KJS::JSNotAnObject::getOwnPropertySlot): - (KJS::JSNotAnObject::put): - (KJS::JSNotAnObject::deleteProperty): - (KJS::JSNotAnObject::defaultValue): - (KJS::JSNotAnObject::construct): - (KJS::JSNotAnObject::callAsFunction): - (KJS::JSNotAnObject::getPropertyNames): - * kjs/JSNotAnObject.h: Added. - (KJS::JSNotAnObject::JSNotAnObject): - * kjs/JSImmediate.cpp: - (KJS::JSImmediate::toObject): - modified to create an JSNotAnObject rather than throwing an exception - directly. - -2008-04-10 Geoffrey Garen - - Reviewed by Oliver Hunt. - - Pass a function body node its function's scope chain, rather than the - current execution context's scope chain, when compiling it. - - This doesn't matter yet, but it will once we start using the scope - chain during compilation. - - sunspider --squirrelfish notes a tiny speedup. - - * VM/Machine.cpp: - (KJS::Machine::privateExecute): - -2008-04-10 Geoffrey Garen - - Reviewed by Oliver Hunt. - - Fix two bugs when throwing exceptions from re-entrant JS calls: - - (1) Don't shrink the register file to 0, since our caller may still - be using it. - - (2) In case of exception, return jsNull() instead of 0 because, - surprisingly, some JavaScriptCore clients rely on a function's return - value being safe to operate on even if the function threw an exception. - - Also: - - - Changed FunctionImp::callAsFunction to honor the new semantics of - exceptions not returning 0. - - - Renamed "handlerPC" to "handlerVPC" to match other uses of "VPC". - - - Renamed "exceptionData" to "exceptionValue", because "data" seemed to - imply something more than just a JSValue. - - - Merged prepareException into throwException, since throwException was - its only caller, and it seemed weird that throwException didn't take - an exception as an argument. - - sunspider --squirrelfish does not seem to complain on my machine, but it - complains a little (.6%) on Oliver's. - -2008-04-10 Geoffrey Garen - - Reviewed by Maciej Stachowiak. - - Fixed op_construct for CallTypeNative to reacquire "r" before setting - its return value, since registerBase can theoretically change during the - execution of arbitrary code. (Not sure if any native constructors - actually make this possible.) - - sunspider --squirrelfish does not seem to complain. - - * VM/Machine.cpp: - (KJS::Machine::privateExecute): - -2008-04-10 Geoffrey Garen - - Reviewed by Oliver Hunt and Sam Weinig. - - Re-entrant execution of function code (global code -> built-in function - -> JS function): - - Miraculously, sunspider --squirrelfish does not seem to complain. - - A re-entrant function call is the same as a normal function call with - one exception: the re-entrant call leaves everything except for - CallerCodeBlock in the call frame header uninitialized, since the call - doesn't need to return to JS code. (It sets CallerCodeBlock to 0, to - indicate that the call shouldn't return to JS code.) - - Also fixed a few issues along the way: - - - Fixed two bugs in the read-write List implementation that caused - m_size and m_buffer to go stale. - - - Changed native call code to update "r" *before* setting the return - value, since the call may in turn call JS code, which changes the value - of "r". - - - Migrated initialization of "r" outside of Machine::privateExecute, - because global code and function code initialize "r" differently. - - - Migrated a codegen warning from Machine::privateExecute to the wiki. - - - Removed unnecessary "r" parameter from slideRegisterWindowForCall - - * VM/Machine.cpp: - (KJS::slideRegisterWindowForCall): - (KJS::scopeChainForCall): - (KJS::Machine::execute): - (KJS::Machine::privateExecute): - * VM/Machine.h: - * kjs/function.cpp: - (KJS::FunctionImp::callAsFunction): - * kjs/list.cpp: - (KJS::List::getSlice): - * kjs/list.h: - (KJS::List::clear): - -2008-04-10 Maciej Stachowiak - - Reviewed by Oliver. - - - fix problem with code generation for return with no argument - - 3d-cube now runs - - * kjs/nodes.cpp: - (KJS::ReturnNode::emitCode): - -2008-04-10 Maciej Stachowiak - - Reviewed by Oliver. - - - Implement support for JS constructors - - access-binary-trees and access-nbody now run. - - Inexplicably a 1% speedup. - - * VM/Machine.cpp: - (KJS::initializeCallFrame): - (KJS::Machine::privateExecute): - * VM/Machine.h: - (KJS::Machine::): - -2008-04-10 Maciej Stachowiak - - Reviewed by Oliver. - - - More code cleanup in preparation for JS constructors - - Factor the remaining interesting parts of JS function calls into - slideRegisterWindowForCall and scopeChainForCall. - - * VM/Machine.cpp: - (KJS::slideRegisterWindowForCall): - (KJS::scopeChainForCall): - (KJS::Machine::privateExecute): - -2008-04-10 Maciej Stachowiak - - Reviewed by Geoff. - - - Code cleanup in preparation for JS constructors - - - Renamed returnInfo to callFrame. - - Made an enum which defines what goes where in the call frame. - - Factored out initializeCallFrame function from op_call - - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::emitCall): - (KJS::CodeGenerator::emitConstruct): - * VM/Machine.cpp: - (KJS::Machine::dumpRegisters): - (KJS::initializeCallFrame): - (KJS::Machine::unwindCallFrame): - (KJS::Machine::execute): - (KJS::Machine::privateExecute): - * VM/Machine.h: - (KJS::Machine::): - -2008-04-10 Geoffrey Garen - - Reviewed by Oliver Hunt. - - Fixed two bugs in register allocation for function calls: - - (1) op_call used to allocate codeBlock->numVars too many registers for - each call frame, due to duplicated math. Fixing this revealed... - - (2) By unconditionally calling resize(), op_call used to truncate the - register file when calling a function whose registers fit wholly within - the register file already allocated by its caller. - - sunspider --squirrelfish reports no regression. - - I also threw in a little extra formatting to dumpCallFrame, because it - helped me debug these issues. - - * VM/Machine.cpp: - (KJS::Machine::dumpRegisters): - (KJS::Machine::execute): - (KJS::Machine::privateExecute): - * VM/RegisterFile.h: - (KJS::RegisterFile::shrink): - (KJS::RegisterFile::grow): - * VM/RegisterFileStack.cpp: - (KJS::RegisterFileStack::popRegisterFile): - -2008-04-09 Geoffrey Garen - - Reviewed by Oliver Hunt. - - Next step toward re-entrant execution of function code (global code -> - built-in function -> JS function): - - Made op_ret return from Machine::privateExecute if its calling codeBlock - is NULL. - - I'm checking this in by itself to demonstrate that a more clever - mechanism is not necessary for performance. - - sunspider --squirrelfish reports no regression. - - * ChangeLog: - * VM/Machine.cpp: - (KJS::Machine::execute): - (KJS::Machine::privateExecute): - -2008-04-09 Geoffrey Garen - - Reviewed by Maciej Stachowiak. - - Next step toward re-entrant execution of function code (global code -> - built-in function -> JS function): - - Made Machine::execute return a value. - - Sketched out some code for Machine::execute for functions -- still - doesn't work yet, though. - - sunspider --squirrelfish reports no regression. - - * VM/Machine.cpp: - (KJS::Machine::execute): - (KJS::Machine::privateExecute): - * VM/Machine.h: - * kjs/interpreter.cpp: - (KJS::Interpreter::evaluate): - * kjs/testkjs.cpp: - (runWithScripts): - -2008-04-09 Geoffrey Garen - - Reviewed by Sam Weinig. - - First step toward re-entrant execution of function code (global code -> - built-in function -> JS function): - - Tiny bit of refactoring in the Machine class. - - sunspider --squirrelfish reports no regression. - - * VM/Machine.cpp: - (KJS::Machine::dumpRegisters): - (KJS::Machine::unwindCallFrame): - (KJS::Machine::execute): - (KJS::Machine::privateExecute): - * VM/Machine.h: - (KJS::Machine::isGlobalCallFrame): - * kjs/interpreter.cpp: - (KJS::Interpreter::evaluate): - -2008-04-08 Geoffrey Garen - - Reviewed by Oliver Hunt. - - Support for re-entrant execution of global code (global code -> built-in - function -> global code). - - Keep a stack of register files instead of just one. Globals propogate - between register files as the register files enter and exit the stack. - - An activation still uses its own register file's base as its - registerBase, but the global object uses the register file *stack*'s - registerBase, which updates dynamically to match the register file at - the top of the stack. - - sunspider --squirrelfish reports no regression. - -2008-04-08 Maciej Stachowiak - - Reviewed by Geoff. - - - initial preparatory work for JS constructors - - 1) Allocate registers for the returnInfo block and "this" value when generating code for - op_construct. These are not used yet, but the JS branch of op_construct will use them. - - 2) Adjust argc and argv appropriately for native constructor calls. - - 3) Assign return value in a more straightforward way in op_ret since this is actually - a bit faster (and makes up for the allocation of extra registers above). - - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::emitConstruct): - * VM/Machine.cpp: - (KJS::Machine::privateExecute): - -2008-04-07 Geoffrey Garen - - Reviewed by Maciej Stachowiak. - - Fixed crashing SunSpider tests. - - Let's just pretend this never happened, bokay? - - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::CodeGenerator): - * VM/CodeGenerator.h: - * VM/RegisterFile.cpp: - (KJS::RegisterFile::addGlobals): - -2008-04-07 Geoffrey Garen - - Reviewed by Oliver Hunt. - - Restored dumping of generated code as a command-line switch: - run-testkjs -d will do it. - -2008-04-07 Geoffrey Garen - - Reviewed by Oliver Hunt. - - Next step toward supporting re-entrant evaluation: Moved register file - maintenance code into a proper "RegisterFile" class. - - There's a subtle change to the register file's internal layout: for - global code / the global object, registerOffset is always 0 now. In - other words, all register counting starts at 0, not 0 + (number of - global variables). The helps simplify accounting when the number of - global variables changes. - -2008-04-07 Oliver Hunt - - Reviewed by Geoff. - - Bug 18338: Support exceptions in SquirrelFish - - Initial support for exceptions in SquirrelFish, only supports finalisers in the - simple cases (eg. exceptions and non-goto/return across finaliser boundaries). - This doesn't add the required exception checks to existing code, it merely adds - support for throw, catch, and the required stack unwinding. - - * VM/CodeBlock.cpp: - (KJS::CodeBlock::dump): - (KJS::CodeBlock::getHandlerForVPC): - * VM/CodeBlock.h: - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::emitCatch): - (KJS::CodeGenerator::emitThrow): - * VM/CodeGenerator.h: - * VM/JSPropertyNameIterator.cpp: - (KJS::JSPropertyNameIterator::create): - * VM/Machine.cpp: - (KJS::prepareException): - (KJS::Machine::unwindCallFrame): - (KJS::Machine::throwException): - (KJS::Machine::privateExecute): - * VM/Machine.h: - * VM/Opcode.h: - * kjs/nodes.cpp: - (KJS::ThrowNode::emitCode): - (KJS::TryNode::emitCode): - * kjs/nodes.h: - * kjs/scope_chain.cpp: - (KJS::ScopeChain::depth): - * kjs/scope_chain.h: - -2008-04-06 Geoffrey Garen - - Reviewed by Oliver Hunt. - - First step toward supporting re-entrant evaluation: Switch register - clients from using "registers", a pointer to a register vector, to - "registerBase", an indirect pointer to the logical first entry in the - register file. (The logical first entry is the first entry that is not - a global variable). - - With a vector, offsets into the register file remain good when the - underlying buffer reallocates, but they go bad when the logical - first entry moves. (The logical first entry moves when new global - variables get added to the beginning of the register file.) With an - indirect pointer to the logical first entry, offsets will remain good - regardless. - - 1.4% speedup on sunspider --squirrelfish. I suspect this is due to - reduced allocation when creating closures, and reduced indirection - through the register vector. - - * wtf/Vector.h: Added an accessor for an indirect pointer to the vector's - buffer, which we currently use (incorrectly) for registerBase. This is - temporary scaffolding to allow us to change client code without - changing behavior. - -2008-04-06 Sam Weinig - - Reviewed by Oliver Hunt. - - Implement codegen for ReadModifyDotNode. - - * kjs/nodes.cpp: - (KJS::ReadModifyDotNode::emitCode): - * kjs/nodes.h: - -2008-04-06 Sam Weinig - - Reviewed by Oliver Hunt. - - Fix codegen for PostIncDotNode and implement codegen for PostIncBracketNode, - PostDecBracketNode and PostDecDotNode. - - * kjs/nodes.cpp: - (KJS::PostIncBracketNode::emitCode): - (KJS::PostDecBracketNode::emitCode): - (KJS::PostIncDotNode::emitCode): - (KJS::PostDecDotNode::emitCode): - * kjs/nodes.h: - -2008-04-06 Sam Weinig - - Reviewed by Geoffrey Garen. - - Implement codegen for PreDecResolveNode, PreIncBracketNode, PreDecBracketNode, - PreIncDotNode and PreDecDotNode. This required adding one new op code, op_pre_dec. - - * VM/CodeBlock.cpp: - (KJS::CodeBlock::dump): - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::emitPreDec): - * VM/CodeGenerator.h: - * VM/Machine.cpp: - (KJS::Machine::privateExecute): - * VM/Opcode.h: - * kjs/nodes.cpp: - (KJS::PreDecResolveNode::emitCode): - (KJS::PreIncBracketNode::emitCode): - (KJS::PreDecBracketNode::emitCode): - (KJS::PreIncDotNode::emitCode): - (KJS::PreDecDotNode::emitCode): - * kjs/nodes.h: - -2008-04-06 Geoffrey Garen - - Reviewed by Sam Weinig. - - Improved register dumping, plus a liberal smattering of "const". Here's - what the new format looks like: - - (gdb) call (void)dumpCallFrame(codeBlock, scopeChain, registers->begin(), r) - 4 instructions; 48 bytes at 0x509210; 3 locals (2 parameters); 1 temporaries - - [ 0] load lr1, undefined(@k0) - [ 3] load lr1, 2(@k1) - [ 6] add tr0, lr2, lr1 - [ 10] ret tr0 - - Constants: - k0 = undefined - k1 = 2 - - Register frame: - - ---------------------------------------- - use | address | value - ---------------------------------------- - [return info] | 0x80ac08 | 0x5081c0 - [return info] | 0x80ac0c | 0x508e90 - [return info] | 0x80ac10 | 0x504acc - [return info] | 0x80ac14 | 0x2 - [return info] | 0x80ac18 | 0x0 - [return info] | 0x80ac1c | 0x7 - [return info] | 0x80ac20 | 0x0 - ---------------------------------------- - [param] | 0x80ac24 | 0x1 - [param] | 0x80ac28 | 0x7 - [var] | 0x80ac2c | 0xb - [temp] | 0x80ac30 | 0xf - -2008-04-06 Geoffrey Garen - - Reviewed by Sam Weinig. - - Support for evaluating multiple scripts in the same global environment. - (Still don't support re-entrant evaluation yet.) - - The main changes here are: - - (1) Obey the ECMA 10.1.3 rules regarding how to resolve collisions when - a given symbol is declared more than once. (This patch fixes the same - issue for function code, too.) - - (2) In the case of var and/or function collisions, reuse the existing - storage slot. For global code, this is required for previously - generated instructions to continue to work. For function code, it's - more of a "nice to have": it makes register layout in the case of - collisions easier to understand, and has the added benefit of saving - memory. - - (3) Allocate slots in the CodeGenerator's m_locals vector in parallel - to register indexes in the symbol table. This ensures that, given an - index in the symbol table, we can find the corresponding RegisterID - without hashing, which speeds up codegen. - - I moved responsibility for emitting var and function initialization - instructions into the CodeGenerator, because bookkeeping in cases where - var, function, and/or parameter names collide requires a lot of - internal knowledge about the CodeGenerator. - - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::addVar): Removed responsibility for checking whether - a var declaration overwrites "arguments", because the check is - inappropriate for global code, which may not have a pre-existing - "arguments" symbol in scope. Also changed this function to return a - boolean indicating whether addVar actually created a new RegisterID, - or just reused an old one. - - (KJS::CodeGenerator::CodeGenerator): Split out the constructors for - function code and global code, since they're quite different now. - - (KJS::CodeGenerator::registerForLocal): This function does its job - without any hashing now. - - * VM/Machine.cpp: Move old globals and update "r" before executing a - new script. That way, old globals stay at a constant offset from "r", - and previously optimized code still works. - - * VM/RegisterID.h: Added the ability to allocate a RegisterID before - initializing its index field. We use this for parameters now. - - * kjs/JSVariableObject.h: - (KJS::JSVariableObject::symbolTableGet): Changed the ungettable getter - ASSERT to account for the fact that symbol indexes are all negative. - -2008-04-05 Sam Weinig - - Reviewed by Geoffrey Garen. - - Implement codegen for InNode. - - * VM/CodeBlock.cpp: - (KJS::CodeBlock::dump): - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::emitIn): - * VM/CodeGenerator.h: - * VM/Machine.cpp: - (KJS::Machine::privateExecute): - * VM/Opcode.h: - * kjs/nodes.cpp: - (KJS::InNode::emitCode): - * kjs/nodes.h: - -2008-04-05 Sam Weinig - - Reviewed by Oliver Hunt. - - - Implement codegen for DeleteResolveNode, DeleteBracketNode, DeleteDotNode and DeleteValueNode. - - * VM/CodeBlock.cpp: - (KJS::CodeBlock::dump): - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::emitGetPropId): - (KJS::CodeGenerator::emitPutPropId): - (KJS::CodeGenerator::emitDeletePropId): - (KJS::CodeGenerator::emitDeletePropVal): - (KJS::CodeGenerator::emitPutPropIndex): - * VM/CodeGenerator.h: - * VM/Machine.cpp: - (KJS::Machine::privateExecute): - * VM/Opcode.h: - * kjs/nodes.cpp: - (KJS::DeleteResolveNode::emitCode): - (KJS::DeleteBracketNode::emitCode): - (KJS::DeleteDotNode::emitCode): - (KJS::DeleteValueNode::emitCode): - * kjs/nodes.h: - -2008-04-04 Sam Weinig - - Reviewed by Oliver Hunt. - - - Implement codegen for Switch statements. - - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::pushJumpContext): - (KJS::CodeGenerator::popJumpContext): - (KJS::CodeGenerator::jumpContextForLabel): - * VM/CodeGenerator.h: - Rename LoopContext to JumpContext now that it used of Switch statements in addition - to loops. - - * kjs/nodes.cpp: - (KJS::DoWhileNode::emitCode): - (KJS::WhileNode::emitCode): - (KJS::ForNode::emitCode): - (KJS::ForInNode::emitCode): - (KJS::ContinueNode::emitCode): - (KJS::BreakNode::emitCode): - (KJS::CaseBlockNode::emitCodeForBlock): - (KJS::SwitchNode::emitCode): - * kjs/nodes.h: - (KJS::CaseClauseNode::expr): - (KJS::CaseClauseNode::children): - (KJS::CaseBlockNode::): - -2008-04-03 Maciej Stachowiak - - Reviewed by Sam. - - - fix crash in codegen from new nodes - - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::emitConstruct): - * kjs/nodes.h: - -2008-04-03 Maciej Stachowiak - - Reviewed by Geoff. - - * kjs/nodes.cpp: - (KJS::ReadModifyResolveNode::emitCode): - (KJS::ReadModifyBracketNode::emitCode): - * kjs/nodes.h: - -2008-04-02 Maciej Stachowiak - - Reviewed by Geoff. - - - take a shot at marking constant pools for global and eval code - - Geoff says this won't really work in all cases but is an ok stopgap. - - * kjs/JSGlobalObject.cpp: - (KJS::JSGlobalObject::mark): - -2008-04-02 Maciej Stachowiak - - Reviewed by Geoff. - - - fix 2x perf regression in 3d-morph - - * VM/Machine.cpp: - (KJS::Machine::privateExecute): If we subbed in null for the global object, - don't toObject it, since that will throw an exception (very slowly). - -2008-04-02 Maciej Stachowiak - - Rubber stamped by Geoff - - - fix Release build - - * kjs/nodes.cpp: - (KJS::getNonLocalSymbol): - -2008-04-02 Geoffrey Garen - - Reviewed by Oliver Hunt. - - Removed the last vestiges of LocalStorage from JSVariableObject and - JSGlobalObject. - - * kjs/JSGlobalObject.cpp: - (KJS::JSGlobalObject::saveLocalStorage): Save and restore from/to - registers. Use stub isReadOnly and isDontEnum methods for now, until - we really implement attributes in the symbol table. - (KJS::JSGlobalObject::restoreLocalStorage): - (KJS::JSGlobalObject::reset): - - * kjs/JSVariableObject.cpp: - (KJS::JSVariableObject::getPropertyNames): Use stub isDontEnum method - for now, as above. - (KJS::JSVariableObject::getPropertyAttributes): ditto - - * kjs/JSVariableObject.h: Removed LocalStorage from JSVariableObjectData. - Removed mark method, because subclasses implement different strategies for - marking registers. - (KJS::JSVariableObject::isReadOnly): Stub method - (KJS::JSVariableObject::isDontEnum): ditto - - Changed the code below to ASSERT_NOT_REACHED() and return 0, since it - can no longer retrieve LocalStorage from the ExecState. (Eventually, - we'll just remove this code and all its friends, but that's a task for - later.) - - * kjs/ExecState.cpp: - (KJS::ExecState::ExecState): - * kjs/function.cpp: - (KJS::ActivationImp::markChildren): - * kjs/function.h: - * kjs/nodes.cpp: - (KJS::getNonLocalSymbol): - (KJS::ScopeNode::optimizeVariableAccess): - (KJS::ProgramNode::processDeclarations): - -2008-04-01 Geoffrey Garen - - Reviewed by Maciej Stachowiak. - - Got globals? - - To get things working, I had to roll out - http://trac.webkit.org/projects/webkit/changeset/31226 for the time - being. - - * VM/CodeBlock.h: Removed obsolete function. - - * VM/Machine.cpp: - (KJS::Machine::privateExecute): For the sake of re-entrancy, we track - and restore the global object's old rOffset value. (No way to test this - yet, but I think it will work.) - -2008-04-01 Maciej Stachowiak - - Reviewed by Geoff. - - - mark the constant pool (at least for function code blocks) - - * VM/CodeBlock.cpp: - (KJS::CodeBlock::mark): - * VM/CodeBlock.h: - * kjs/function.cpp: - (KJS::FunctionImp::mark): - * kjs/nodes.cpp: - (KJS::ScopeNode::mark): - * kjs/nodes.h: - (KJS::FuncExprNode::body): - (KJS::FuncDeclNode::body): - -2008-04-01 Geoffrey Garen - - Reviewed by Beth Dakin. - - Cleaned up a few loose ends. - - * JavaScriptCore.exp: Export dumpRegisters, so it's visible to gdb even - if we don't explicitly call it in the source text. - - * VM/Machine.cpp: - (KJS::Machine::privateExecute): No need to call dumpRegisters anymore, - since that was just a hack for gdb's sake. - - * kjs/JSActivation.h: Removed obsolete comment. - - * VM/CodeGenerator.cpp: Added ASSERTs to verify that the localCount - we're given matches the number of locals actually allocated. - - * VM/CodeGenerator.h: - (KJS::CodeGenerator::CodeGenerator): Changed "localCount" to include - the parameter count, since we're using the word "local" to mean - parameter, var, function, or "this". Renamed "m_nextLocal" to - "m_nextVar", since "m_nextLocal" doesn't contrast well with - "m_nextParameter". - - Also moved tracking of implicit "this" parameter from here... - - * kjs/nodes.cpp: - (KJS::FunctionBodyNode::generateCode): ... to here - (KJS::ProgramNode::generateCode): ... and here - - * VM/CodeBlock.cpp: - (KJS::CodeBlock::dump): Added missing "\n". - -2008-04-01 Cameron Zwarich - - Reviewed by Oliver. - - Bug 18274: ResolveNode::emitCode() doesn't make a new temporary when dst - is 0, leading to incorrect codegen - - - * kjs/nodes.cpp: - (KJS::FunctionCallBracketNode::emitCode): - (KJS::FunctionCallDotNode::emitCode): - -2008-04-01 Maciej Stachowiak - - Reviewed by Oliver. - - - fix bug in for..in codegen (gotta use ident, not m_ident) - - * kjs/nodes.cpp: - (KJS::ForInNode::emitCode): - -2008-04-01 Maciej Stachowiak - - Reviewed by Oliver. - - - Add suport for regexp literals - - * VM/CodeBlock.cpp: - (KJS::regexpToSourceString): - (KJS::regexpName): - (KJS::CodeBlock::dump): - * VM/CodeBlock.h: - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::addRegExp): - (KJS::CodeGenerator::emitNewRegExp): - * VM/CodeGenerator.h: - * VM/Machine.cpp: - (KJS::Machine::privateExecute): - * VM/Opcode.h: - * kjs/nodes.cpp: - (KJS::RegExpNode::emitCode): - * kjs/nodes.h: - -2008-04-01 Oliver Hunt - - Reviewed by Geoff - - Add support for for..in nodes - - Added two new opcodes to get_pnames and next_pname to handle iterating - over the set of properties on an object. This iterator is explicitly - invalidated and the property name array is released on standard exit - from the loop, otherwise we rely on GC to do the clean up for us. - - * JavaScriptCore.xcodeproj/project.pbxproj: - * VM/CodeBlock.cpp: - (KJS::CodeBlock::dump): - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::emitNextPropertyName): - (KJS::CodeGenerator::emitGetPropertyNames): - * VM/CodeGenerator.h: - * VM/JSPropertyNameIterator.cpp: Added. - (KJS::JSPropertyNameIterator::JSPropertyNameIterator): - (KJS::JSPropertyNameIterator::type): - (KJS::JSPropertyNameIterator::toPrimitive): - (KJS::JSPropertyNameIterator::getPrimitiveNumber): - (KJS::JSPropertyNameIterator::toBoolean): - (KJS::JSPropertyNameIterator::toNumber): - (KJS::JSPropertyNameIterator::toString): - (KJS::JSPropertyNameIterator::toObject): - (KJS::JSPropertyNameIterator::mark): - (KJS::JSPropertyNameIterator::next): - (KJS::JSPropertyNameIterator::invalidate): - (KJS::JSPropertyNameIterator::~JSPropertyNameIterator): - (KJS::JSPropertyNameIterator::create): - * VM/JSPropertyNameIterator.h: Added. - * VM/Machine.cpp: - (KJS::Machine::privateExecute): - * VM/Opcode.h: - * VM/Register.h: - (KJS::Register::): - * kjs/PropertyNameArray.h: - * kjs/nodes.cpp: - (KJS::ForInNode::emitCode): - * kjs/nodes.h: - * kjs/value.h: - -2008-04-01 Cameron Zwarich - - Reviewed by Maciej. - - Change CodeGenerator::emitCall() so it increments the reference count of - registers passed to it, and change its callers so they don't needlessly - increment the reference count of the registers they are passing. - - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::emitCall): - * kjs/nodes.cpp: - (KJS::FunctionCallResolveNode::emitCode): - (KJS::FunctionCallDotNode::emitCode): - -2008-04-01 Maciej Stachowiak - - Reviewed by Oliver. - - - generate call for PostIncDotNode - - * kjs/nodes.cpp: - (KJS::PostIncDotNode::emitCode): - * kjs/nodes.h: - -2008-04-01 Maciej Stachowiak - - Build fix. - - - fix build (not sure how this ever worked?) - - * kjs/nodes.cpp: - (KJS::FunctionCallBracketNode::emitCode): - -2008-04-01 Maciej Stachowiak - - Reviewed by Geoff. - - - generate code for FunctionCallBracketNode - - * kjs/nodes.cpp: - (KJS::FunctionCallBracketNode::emitCode): - * kjs/nodes.h: - -2008-04-01 Maciej Stachowiak - - Reviewed by Geoff. - - - Fix two crashing SunSpider tests - - * VM/Machine.cpp: - (KJS::Machine::privateExecute): set up 'this' properly for native calls. - * kjs/list.h: - (KJS::List::List): Fix intialization of buffer and size from - vector, the initialization order was wrong. - -2008-04-01 Geoffrey Garen - - Build fix: marked ASSERT-only variables as UNUSED_PARAMs. - - * VM/Machine.cpp: - (KJS::Machine::privateExecute): - * kjs/JSVariableObject.h: - (KJS::JSVariableObject::symbolTableInitializeVariable): - -2008-04-01 Geoffrey Garen - - Reviewed by Oliver Hunt. - - Next step toward global code: Moved get, put, and initializeVariable - functionality up into JSVariableObject, and changed JSActivation to - rely on it. - - * kjs/JSActivation.cpp: - (KJS::JSActivation::JSActivation): - (KJS::JSActivation::getOwnPropertySlot): - (KJS::JSActivation::put): - (KJS::JSActivation::initializeVariable): - * kjs/JSVariableObject.h: - (KJS::JSVariableObject::valueAt): - (KJS::JSVariableObject::isReadOnly): - (KJS::JSVariableObject::symbolTableGet): - (KJS::JSVariableObject::symbolTablePut): - (KJS::JSVariableObject::symbolTableInitializeVariable): - -2008-04-01 Maciej Stachowiak - - Reviewed by Sam. - - - fix HashTable assertion on some SunSpider tests - - Don't use -1 as the deleted value for JSValue*-keyed hashtables, - since it is a valid value (it's the immediate for -1). - - * VM/CodeGenerator.h: - (KJS::CodeGenerator::JSValueHashTraits::emptyValue): - (KJS::CodeGenerator::JSValueHashTraits::deletedValue): - * kjs/JSImmediate.h: - (KJS::JSImmediate::impossibleValue): - -2008-04-01 Sam Weinig - - Reviewed by Maciej Stachowiak. - - Add support for calling Native constructors like new Array(). - - * VM/CodeBlock.cpp: - (KJS::CodeBlock::dump): - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::emitConstruct): - * VM/CodeGenerator.h: - * VM/Machine.cpp: - (KJS::Machine::privateExecute): - * VM/Opcode.h: - * kjs/nodes.cpp: - (KJS::NewExprNode::emitCode): - * kjs/nodes.h: - -2008-04-01 Maciej Stachowiak - - Reviewed by Sam. - - - add some missing toOpbject calls to avoid crashing when calling methods on primitives - - * VM/Machine.cpp: - (KJS::Machine::privateExecute): - -2008-04-01 Geoffrey Garen - - Reviewed by Oliver Hunt. - - Changed Machine::dumpRegisters to take a pointer instead of a reference, - so gdb understands how to call it. - - * VM/Machine.cpp: - (KJS::Machine::dumpRegisters): - (KJS::Machine::privateExecute): - * VM/Machine.h: - -2008-03-31 Cameron Zwarich - - Reviewed by Maciej. - - Fix CodeGenerator::addConstant() so it uses the functionExpressions - counter for function expressions, not the functions counter. - - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::addConstant): - -2008-03-31 Sam Weinig - - Reviewed by Geoffrey Garen. - - Add emitCode support for TypeOfResolveNode and TypeOfValueNode. - Added new opcode op_type_of to handle them. - - * VM/CodeBlock.cpp: - (KJS::CodeBlock::dump): - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::emitNot): - (KJS::CodeGenerator::emitInstanceOf): - (KJS::CodeGenerator::emitTypeOf): - * VM/CodeGenerator.h: - * VM/Machine.cpp: - (KJS::jsTypeStringForValue): - (KJS::Machine::privateExecute): - * VM/Opcode.h: - * kjs/nodes.cpp: - (KJS::TypeOfResolveNode::emitCode): - (KJS::TypeOfValueNode::emitCode): - * kjs/nodes.h: - -2008-03-31 Sam Weinig - - Reviewed by Oliver Hunt. - - Fix non-computed goto version of isOpcode. op_end is a valid opcode. - - * VM/Machine.cpp: - (KJS::Machine::isOpcode): - -2008-03-31 Geoffrey Garen - - Reviewed by Maciej Stachowiak. - - Added op_post_dec. - -2008-03-31 Cameron Zwarich - - Reviewed by Geoffrey Garen. - - Add support for FunctionCallDotNode. - - * kjs/nodes.cpp: - (KJS::FunctionCallDotNode::emitCode): - * kjs/nodes.h: - -2008-03-31 Geoffrey Garen - - Reviewed by Beth Dakin. - - Next step toward global code: Removed more obsolete API, moved - saveLocalStorage and restoreLocalStorage to JSGlobalObject subclass, - since it's only intended for use there. - - * ChangeLog: - * JavaScriptCore.exp: - * kjs/Activation.h: - * kjs/JSGlobalObject.cpp: - (KJS::JSGlobalObject::saveLocalStorage): - (KJS::JSGlobalObject::restoreLocalStorage): - * kjs/JSGlobalObject.h: - * kjs/JSVariableObject.cpp: - * kjs/JSVariableObject.h: - (KJS::JSVariableObject::JSVariableObjectData::JSVariableObjectData): - * kjs/function.cpp: - (KJS::ActivationImp::ActivationImp): - -2008-03-31 Geoffrey Garen - - Reviewed by Beth Dakin. - - Next step toward global code: subclass JSActivation + JSActivationData - from JSVariableObject + JSVariableObjectData. - - JSActivation now relies on JSVariableObject for access to registers and - symbol table, and for some delete functionality, but not for anything - else yet. - - (KJS::JSActivation::mark): Cleaned up the style here a little bit. - -2008-03-31 Geoffrey Garen - - Reviewed by Beth Dakin. - - Next step toward global code: store "rOffset" in JSVariableObjectData. - - * kjs/JSGlobalObject.h: - (KJS::JSGlobalObject::JSGlobalObjectData::JSGlobalObjectData): - * kjs/JSVariableObject.h: - (KJS::JSVariableObject::JSVariableObjectData::JSVariableObjectData): - -2008-03-31 Geoffrey Garen - - Reviewed by Maciej Stachowiak. - - Next steps toward global code: - - * Moved access to the register file into JSVariableObject. - - * Added more ASSERTs to indicate obsolete APIs there are just hanging - around to stave off build failures. - - * kjs/JSGlobalObject.h: - (KJS::JSGlobalObject::JSGlobalObjectData::JSGlobalObjectData): - * kjs/JSVariableObject.h: - (KJS::JSVariableObject::registers): - (KJS::JSVariableObject::JSVariableObjectData::JSVariableObjectData): - (KJS::JSVariableObject::JSVariableObject): - -2008-03-31 Sam Weinig - - Reviewed by Oliver. Tweaked somewhat by Maciej. - - - implement codegen for ReadModifyResolveNode - - * kjs/nodes.cpp: - (KJS::emitReadModifyAssignment): - (KJS::ReadModifyResolveNode::emitCode): - * kjs/nodes.h: - -2008-03-31 Cameron Zwarich - - Reviewed by Geoff. - - Fix the build -- r31492 removed activation tear-off, but r31493 used it. - - * kjs/nodes.cpp: - (KJS::FuncExprNode::makeFunction): - -2008-03-31 Cameron Zwarich - - Reviewed by Maciej. - - Add support for FuncExprNode to SquirrelFish. - - * VM/CodeBlock.cpp: - (KJS::CodeBlock::dump): - * VM/CodeBlock.h: - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::addConstant): - (KJS::CodeGenerator::emitNewFunctionExpression): - * VM/CodeGenerator.h: - * VM/Machine.cpp: - (KJS::Machine::privateExecute): - * VM/Opcode.h: - * kjs/nodes.cpp: - (KJS::FuncExprNode::emitCode): - (KJS::FuncExprNode::makeFunction): - * kjs/nodes.h: - -2008-03-31 Geoffrey Garen - - Reviewed by Maciej Stachowiak. - - First step toward global code: removed some obsolete JSGlobalObject - APIs, changing clients to ASSERT_NOT_REACHED. - - Activation tear-off and scope chain pushing is obsolete because we - statically detect whether an activation + scope node is required. - - The variableObject() and activationObject() accessors are obsolete - because they haven't been maintained, and they're mostly used by - node evaluation code, anyway. - - The localStorage() accessor is obsolete because everything is in - registers now, and it's mostly used by node evaluation code, anyway. - -2008-03-31 Maciej Stachowiak - - Reviewed by Darin. - - - implement codegen for bracket accessor and bracket assign - - * VM/CodeBlock.cpp: - (KJS::CodeBlock::dump): - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::emitGetPropVal): - (KJS::CodeGenerator::emitPutPropVal): - * VM/CodeGenerator.h: - * VM/Machine.cpp: - (KJS::Machine::privateExecute): - * VM/Opcode.h: - * kjs/nodes.cpp: - (KJS::BracketAccessorNode::emitCode): - (KJS::AssignBracketNode::emitCode): - * kjs/nodes.h: - -2008-03-31 Geoffrey Garen - - Not reviewed. - - Removed FIXME that I just fixed. - - Added ASSERT to cover an error previously only covered by a FIXME. - - * kjs/JSActivation.cpp: - (KJS::JSActivation::getOwnPropertySlot): - -2008-03-31 Geoffrey Garen - - Not reviewed. - - Fixed indentation inside op_call. (I had left this code badly indented - to make the behavior-changing diff clearer.) - - * VM/Machine.cpp: - (KJS::Machine::privateExecute): - -2008-03-31 Geoffrey Garen - - Reviewed by Sam Weinig. - - Fixed up logging of jump instructions to follow the following style: - - jump offset(->absoluteTarget) - - * VM/CodeBlock.cpp: - (KJS::CodeBlock::dump): - -2008-03-31 Geoffrey Garen - - Reviewed by Sam Weinig. - - Changed the SymbolTable API to use int instead of size_t. It has been - using int internally for a while now (since squirrelfish symbols can - have negative indices). - -2008-03-31 Cameron Zwarich - - Reviewed by Maciej. - - Add support for FunctionCallValueNode. - - * kjs/nodes.cpp: - (KJS::FunctionCallValueNode::emitCode): - * kjs/nodes.h: - -2008-03-31 Maciej Stachowiak - - Reviewed by Oliver. - - 1) Implemented array literals - - 2) Renamed op_object_get and op_object_put to op_get_prop_id and - op_put_prop_id in preparation for new variants. - - * VM/CodeBlock.cpp: - (KJS::CodeBlock::dump): - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::emitNewArray): - (KJS::CodeGenerator::emitGetPropId): - (KJS::CodeGenerator::emitPutPropId): - (KJS::CodeGenerator::emitPutPropIndex): - * VM/CodeGenerator.h: - (KJS::CodeGenerator::CodeGenerator): - (KJS::CodeGenerator::propertyNames): - * VM/Machine.cpp: - (KJS::Machine::privateExecute): - * VM/Opcode.h: - * kjs/nodes.cpp: - (KJS::ArrayNode::emitCode): - (KJS::PropertyListNode::emitCode): - (KJS::DotAccessorNode::emitCode): - (KJS::PostIncResolveNode::emitCode): - (KJS::PreIncResolveNode::emitCode): - (KJS::AssignResolveNode::emitCode): - (KJS::AssignDotNode::emitCode): - * kjs/nodes.h: - -2008-03-30 Geoffrey Garen - - Reviewed by Oliver Hunt. - - Implemented native function calls. (Re-entering from native code back - to JS doesn't work yet, though.) - - 0.2% speedup overall, due to some inlining tweaks. 3.6% regression on - function-empty.js, since we're making a new virtual call and taking a - new branch inside every op_call. - - I adjusted the JavaScriptCore calling convention to minimize overhead, - like so: - - The machine calls a single virtual function, "getCallData", to get all - the data it needs for a function call. Native code still uses the old - "isObject()" check followed by an "implementsCall()" check, which - aliases to "getCallData". (We can optimize native code to use getCallData - at our leisure.) - - To supply a list of arguments, the machine calls a new List constructor - that just takes a pointer and a length, without copying. Native code - still appends to the list one argument at a time. (We can optimize - native code to use the new List constructor at our leisure.) - - * VM/Machine.cpp: - (KJS::Machine::privateExecute): Changed resize() call to grow() call, - to encourage the compiler to inline the Vector code. - - * kjs/CallData.h: Added. - (KJS::): CallData is a union because eventually native calls will stuff - a function pointer into it, to eliminate the callAsFunction virtual call. - - * kjs/function.cpp: - (KJS::FunctionImp::callAsFunction): Changed this to an ASSERT since - it's not implemented yet. - - * kjs/list.h: Made the List class two-faced, to support the old way and - the new way during this transition phase: lists can be made read-only - with just a pointer and a legnth, or you can append to them one item - at a time. - - * kjs/value.h: - (KJS::jsUndefined): Marked this function ALWAYS_INLINE for the benefit - of a certain compiler that doesn't know what's best for it. - -2008-03-30 Maciej Stachowiak - - Reviewed by Oliver. - - Dump code that codegen can't handle yet, so it's easier to prioritize missing nodes. - - * kjs/nodes.h: - (KJS::Node::emitCode): - -2008-03-30 Maciej Stachowiak - - Reviewed by Oliver. - - Improve dumping of bytecode and fix coding style accordingly. - - Registers are printed as lr1 for locals, tr1 for temp registers. Identifiers print as - foobar(@id0) and constants print as "foo"(@k1) or 312.4(@k2) or the like. Constant and - identifier tables are dumped for reference. - - * VM/CodeBlock.cpp: - (KJS::escapeQuotes): - (KJS::valueToSourceString): - (KJS::registerName): - (KJS::constantName): - (KJS::idName): - (KJS::printUnaryOp): - (KJS::printBinaryOp): - (KJS::CodeBlock::dump): - * VM/Machine.cpp: - (KJS::resolve): - (KJS::resolveBase): - (KJS::Machine::privateExecute): - -2008-03-30 Maciej Stachowiak - - Reviewed by Oliver. - - Implement StringNode and VoidNode (both pretty trivial). - - * kjs/nodes.cpp: - (KJS::StringNode::emitCode): - (KJS::VoidNode::emitCode): - * kjs/nodes.h: - -2008-03-30 Maciej Stachowiak - - Reviewed by Sam. - - Implement CommaNode. - - * kjs/nodes.cpp: - (KJS::CommaNode::emitCode): - * kjs/nodes.h: - -2008-03-30 Cameron Zwarich - - Reviewed by Maciej. - - Adds support for dot notation and object literals. - - * VM/CodeBlock.cpp: - (KJS::CodeBlock::dump): - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::emitNewObject): - * VM/CodeGenerator.h: - * VM/Machine.cpp: - (KJS::Machine::privateExecute): - * VM/Opcode.h: - * kjs/nodes.cpp: - (KJS::ObjectLiteralNode::emitCode): - (KJS::PropertyListNode::emitCode): - (KJS::DotAccessorNode::emitCode): - (KJS::AssignDotNode::emitCode): - * kjs/nodes.h: - -2008-03-29 Geoffrey Garen - - Reviewed by Maciej Stachowiak. - - Mark the register file. - - It's a conservative mark for now, but once registers are typed, we can - do an exact mark. - - 1.4% regression regardless of whether we actually do the marking. - GCC is is worth every penny. - - * VM/Machine.cpp: - (KJS::Machine::privateExecute): Most of the changes here are just for - the fact that "registers" is a pointer now. - - * kjs/JSGlobalObject.cpp: The global object owns the register file now. - -2008-03-28 Oliver Hunt - - Reviewed by Maciej. - - Bug 18204: SquirrelFish: continue/break do not correctly handle scope popping - - - We now track the scope depth as part of a loop context, and add an - extra instruction op_jump_scopes that is used to perform a jump across - dynamic scope boundaries. - - * VM/CodeBlock.cpp: - (KJS::CodeBlock::dump): - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::emitJumpScopes): - * VM/CodeGenerator.h: - * VM/Machine.cpp: - (KJS::Machine::privateExecute): - * VM/Opcode.h: - * kjs/nodes.cpp: - (KJS::ContinueNode::emitCode): - (KJS::BreakNode::emitCode): - -2008-03-28 Sam Weinig - - Reviewed by Geoffrey Garen. - - Add emitCode support for ConditionalNode. - - * kjs/nodes.cpp: - (KJS::ConditionalNode::emitCode): - * kjs/nodes.h: - -2008-03-28 Geoffrey Garen - - Reviewed by Oliver Hunt. - - Responding to feedback, added some comments, fixed up a few names, and - clarified that "locals" always means all local variables, functions, - and parameters. - -2008-03-28 Geoffrey Garen - - Reviewed by Oliver Hunt. - - Added support for "this". - - Supply an implicit "this" value as the first argument to every function. - Alias the "this" keyword to that argument. - - 1% regression overall, 2.5% regression on empty function calls. Seems - like a reasonable cost for now, since we're doing more work. - (Eventually, we might decide to create a version of op_call specialized - for a known null "this" value.) - - * VM/CodeBlock.cpp: - (KJS::CodeBlock::dump): - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::emitCall): - * VM/CodeGenerator.h: - (KJS::CodeGenerator::CodeGenerator): - * VM/Machine.cpp: - (KJS::Machine::privateExecute): - * kjs/CommonIdentifiers.cpp: - (KJS::CommonIdentifiers::CommonIdentifiers): - * kjs/CommonIdentifiers.h: - * kjs/nodes.cpp: - (KJS::ThisNode::emitCode): - (KJS::FunctionCallResolveNode::emitCode): - * kjs/nodes.h: - -2008-03-28 Oliver Hunt - - Reviewed by Geoff. - - Bug 18192: Squirrelfish needs support for break and continue - - - Added a loop context stack to the code generator to provide the - correct jump labels for continue and goto. Added logic to the - currently implemented loop constructs to manage entry and exit - from the loop contexts. Finally, implemented codegen for break - and continue (and a pass through for LabelNode) - - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::pushLoopContext): - (KJS::CodeGenerator::popLoopContext): - (KJS::CodeGenerator::loopContextForIdentifier): - (KJS::CodeGenerator::labelForContinue): - (KJS::CodeGenerator::labelForBreak): - * VM/CodeGenerator.h: - * kjs/nodes.cpp: - (KJS::DoWhileNode::emitCode): - (KJS::WhileNode::emitCode): - (KJS::ForNode::emitCode): - (KJS::ContinueNode::emitCode): - (KJS::BreakNode::emitCode): - (KJS::LabelNode::emitCode): - * kjs/nodes.h: - -2008-03-27 Sam Weinig - - Reviewed by Geoffrey Garen. - - Add emitCode support for UnaryPlusNode, NegateNode, BitwiseNotNode and LogicalNotNode. - - * VM/CodeBlock.cpp: - (KJS::printUnaryOp): - (KJS::CodeBlock::dump): - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::emitToJSNumber): - (KJS::CodeGenerator::emitNegate): - (KJS::CodeGenerator::emitBitNot): - (KJS::CodeGenerator::emitNot): - * VM/CodeGenerator.h: - * VM/Machine.cpp: - (KJS::Machine::privateExecute): - * VM/Opcode.h: - * kjs/nodes.cpp: - (KJS::UnaryPlusNode::emitCode): - (KJS::NegateNode::emitCode): - (KJS::BitwiseNotNode::emitCode): - (KJS::LogicalNotNode::emitCode): - * kjs/nodes.h: - -2008-03-27 Cameron Zwarich - - Reviewed by Maciej Stachowiak. - - Add support for LogicalAndNode and LogicalOrNode. - - * kjs/nodes.cpp: - (KJS::LogicalAndNode::emitCode): - (KJS::LogicalOrNode::emitCode): - * kjs/nodes.h: - -2008-03-27 Sam Weinig - - Clean up code and debug output. - - * VM/CodeBlock.cpp: - (KJS::CodeBlock::dump): - * VM/Machine.cpp: - (KJS::Machine::privateExecute): - -2008-03-27 Geoffrey Garen - - Moved an ASSERT to a more logical place. - - * VM/Machine.cpp: - (KJS::Machine::privateExecute): - -2008-03-27 Sam Weinig - - Reviewed by Oliver Hunt. - - Add emitCode support for InstanceOfNode. - - * VM/CodeBlock.cpp: - (KJS::CodeBlock::dump): - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::emitInstanceOf): - * VM/CodeGenerator.h: - * VM/Machine.cpp: - (KJS::Machine::privateExecute): - * VM/Opcode.h: - * kjs/nodes.cpp: - (KJS::InstanceOfNode::emitCode): - * kjs/nodes.h: - -2008-03-27 Oliver Hunt - - Reviewed by Maciej. - - Bug 18142: squirrelfish needs to support dynamic scoping/with - - - Add support for dynamic scoping and add code to handle 'with' - statements. - - * VM/CodeBlock.cpp: - (KJS::CodeBlock::dump): - * VM/CodeBlock.h: - (KJS::CodeBlock::CodeBlock): - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::getRegister): - (KJS::CodeGenerator::emitPushScope): - (KJS::CodeGenerator::emitPopScope): - * VM/CodeGenerator.h: - (KJS::CodeGenerator::CodeGenerator): - * VM/Machine.cpp: - (KJS::Machine::privateExecute): - * VM/Opcode.h: - * kjs/nodes.cpp: - (KJS::WithNode::emitCode): - * kjs/nodes.h: - -2008-03-27 Sam Weinig - - Reviewed by Geoffrey Garen. - - Add emitCode support for NullNode, FalseNode, TrueNode, IfNode, IfElseNode, DoWhileNode and WhileNode - - * VM/CodeBlock.cpp: - (KJS::CodeBlock::dump): Dump op_jfalse opcode. - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::emitJumpIfFalse): Identical to emitJumpIfTrue except it emits the op_jfalse opcode. - (KJS::CodeGenerator::emitLoad): Add and emitLoad override for booleans. - * VM/CodeGenerator.h: - * VM/Machine.cpp: - (KJS::Machine::privateExecute): Adds execution of op_jfalse. It is identical to op_jtrue, except the - the condition is reversed. - * VM/Opcode.h: Add op_jfalse. - * kjs/nodes.cpp: - (KJS::NullNode::emitCode): Added. - (KJS::FalseNode::emitCode): Added. - (KJS::TrueNode::emitCode): Added. - (KJS::IfNode::emitCode): Added. - (KJS::IfElseNode::emitCode): Added. - (KJS::DoWhileNode::emitCode): Added. - (KJS::WhileNode::emitCode): Added. - * kjs/nodes.h: - -2008-03-26 Geoffrey Garen - - Nixed an unused List. - - The calm before my stormy war against the List class. - - * kjs/function_object.cpp: - (KJS::FunctionObjectImp::construct): - -2008-03-26 Cameron Zwarich - - Reviewed by Geoffrey Garen. - - Adds support for EqualNode, NotEqualNode, StrictEqualNode, NotStrictEqualNode, - LessEqNode, GreaterNode, GreaterEqNode, MultNode, DivNode, ModNode, SubNode, - LeftShiftNode, RightShiftNode, UnsignedRightShiftNode, BitAndNode, BitXOrNode, - and BitOrNode. - - * VM/CodeBlock.cpp: - (KJS::CodeBlock::dump): - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::emitEqual): - (KJS::CodeGenerator::emitNotEqual): - (KJS::CodeGenerator::emitStrictEqual): - (KJS::CodeGenerator::emitNotStrictEqual): - (KJS::CodeGenerator::emitLessEq): - (KJS::CodeGenerator::emitMult): - (KJS::CodeGenerator::emitDiv): - (KJS::CodeGenerator::emitMod): - (KJS::CodeGenerator::emitSub): - (KJS::CodeGenerator::emitLeftShift): - (KJS::CodeGenerator::emitRightShift): - (KJS::CodeGenerator::emitUnsignedRightShift): - (KJS::CodeGenerator::emitBitAnd): - (KJS::CodeGenerator::emitBitXOr): - (KJS::CodeGenerator::emitBitOr): - * VM/CodeGenerator.h: - * VM/Machine.cpp: - (KJS::jsLessEq): - (KJS::Machine::privateExecute): - * VM/Opcode.h: - * kjs/nodes.cpp: - (KJS::MultNode::emitCode): - (KJS::DivNode::emitCode): - (KJS::ModNode::emitCode): - (KJS::SubNode::emitCode): - (KJS::LeftShiftNode::emitCode): - (KJS::RightShiftNode::emitCode): - (KJS::UnsignedRightShiftNode::emitCode): - (KJS::GreaterNode::emitCode): - (KJS::LessEqNode::emitCode): - (KJS::GreaterEqNode::emitCode): - (KJS::EqualNode::emitCode): - (KJS::NotEqualNode::emitCode): - (KJS::StrictEqualNode::emitCode): - (KJS::NotStrictEqualNode::emitCode): - (KJS::BitAndNode::emitCode): - (KJS::BitXOrNode::emitCode): - (KJS::BitOrNode::emitCode): - * kjs/nodes.h: - -2008-03-26 Geoffrey Garen - - Reviewed by Oliver Hunt. - - Only print debug dumps in debug builds. - - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::generate): - * VM/Machine.cpp: - (KJS::Machine::privateExecute): - -2008-03-26 Geoffrey Garen - - Reviewed by Oliver Hunt. - - Moved a few files around in the XCode project. - - * JavaScriptCore.xcodeproj/project.pbxproj: - -2008-03-26 Geoffrey Garen - - Reviewed by Oliver Hunt. - - Made closures work. - - An activation object aliases to the register file until its associated - function returns, at which point it copies the registers for locals and - parameters into an independent storage buffer. - -2008-03-24 Geoffrey Garen - - Reviewed by Oliver Hunt. - - Fixed recent 25% regression on simple for loop test. GCC seems to be - very finicky about the code that gets inlined into - Machine::privateExecute. - - Everything in this patch is simply the result of experiment. - - The resolve and resolve_base opcodes do not seem to have gotten slower - from this change. - - * VM/Machine.cpp: - (KJS::resolve): - (KJS::resolveBase): - (KJS::Machine::privateExecute): - * kjs/nodes.h: - -2008-03-24 Oliver Hunt - - Reviewed by Geoff Garen. - - Bug 18059: squirrelfish needs to compile on platforms without computed goto - - - "Standard" macro style support for conditionalising the use of computed goto. - - * JavaScriptCore.xcodeproj/project.pbxproj: - * VM/Machine.cpp: - (KJS::Machine::isOpcode): - (KJS::Machine::privateExecute): - * VM/Machine.h: - (KJS::Machine::getOpcode): - (KJS::Machine::getOpcodeID): - * VM/Opcode.h: - * wtf/Platform.h: - -2008-03-24 Geoffrey Garen - - Moved my notes from nodes.h to the wiki. - - * kjs/nodes.h: - -2008-03-24 Geoffrey Garen - - SquirrelFish lives. - - Initial check-in of the code I've been carrying around. Lots of stuff - doesn't work. Plus a bunch of empty files. - -=== Start merge of squirrelfish === - -2008-05-21 Darin Adler - - - try to fix the Windows build - - * profiler/Profiler.cpp: - (KJS::Profiler::stopProfiling): Use ptrdiff_t instead of the less-common but incredibly - similar ssize_t type. - * wtf/AVLTree.h: - (KJS::AVLTree::search): Added a typename for a dependent name that's a type. - -2008-05-21 Darin Adler - - Reviewed by Anders. - - - fix bug in JavaScript arguments object property lookup - - Test: fast/js/arguments-bad-index.html - - * kjs/function.cpp: - (KJS::IndexToNameMap::IndexToNameMap): Use unsigned instead of int. - (KJS::IndexToNameMap::isMapped): Use unsigned instead of int, and also use the - strict version of the numeric conversion function, since we don't want to allow - trailing junk. - (KJS::IndexToNameMap::unMap): Ditto. - (KJS::IndexToNameMap::operator[]): Ditto. - * kjs/function.h: Changed IndexToNameMap::size type from int to unsigned. - -2008-05-21 Timothy Hatcher - - Change the Profiler to allow multiple profiles to be running at - the same time. This can happen when you have nested console.profile() - calls. This required two changes. First, the Profiler needed to keep a - Vector of current profiles, instead of one. Second, a Profile needs - to keep track of the global ExecState it started in and the page group - identifier it is tracking. - - The stopProfiling call now takes the same arguments as startProfiling. - This makes sure the correct profile is stopped. Passing a null UString - as the title will stop the last profile for the matching ExecState. - - Multiple pages profiling can interfere with each other - - Reviewed by Kevin McCullough. - - * JavaScriptCore.exp: Added new exports. Removed old symbols. - * profiler/Profile.cpp: - (KJS::Profile::Profile): New constructor arguments for the - originatingGlobalExec and pageGroupIdentifier. - (KJS::Profile::stopProfiling): Set the m_originatingGlobalExec to null. - * profiler/Profile.h: - (KJS::Profile::create): Additional arguments. - (KJS::Profile::originatingGlobalExec): Return m_originatingGlobalExec. - (KJS::Profile::pageGroupIdentifier): Return m_pageGroupIdentifier. - * profiler/Profiler.cpp: - (KJS::Profiler::findProfile): Added. Finds a Profile that matches - the ExecState and title. - (KJS::Profiler::startProfiling): Return early if there is already - a Profile with the ExecState and title. If not, create a new profile - and append it to m_currentProfiles. - (KJS::Profiler::stopProfiling): Loops through m_currentProfiles - and find the one matching the ExecState and title. If one is found - call stopProfiling and return the Profile after removing it - from m_currentProfiles. - (KJS::dispatchFunctionToProfiles): Helper inline function to loop through - m_currentProfiles and call a Profile function. - (KJS::Profiler::willExecute): Call dispatchFunctionToProfiles. - (KJS::Profiler::didExecute): Ditto. - * profiler/Profiler.h: - -2008-05-21 Alexey Proskuryakov - - Reviewed by Darin. - - REGRESSION (3.1.1-r33033): Crash in WebKit when opening or - refreshing page on people.com - - The problem was that STL algorithms do not work with non-conformant comparators, and the - site used sort(function() { return 0.5 - Math.random(); } to randomly shuffle an array. - - https://bugs.webkit.org/show_bug.cgi?id=18687 - REGRESSION(r32220): ecma/Array/15.4.4.5-3.js test now fails in GMT(BST) - - Besides relying on sort stability, this test was just broken, and kept failing with the - new stable sort. - - Tests: fast/js/sort-randomly.html - fast/js/sort-stability.html - fast/js/comparefn-sort-stability.html - - * kjs/avl_tree.h: Added an AVL tree implementation. - - * JavaScriptCore.xcodeproj/project.pbxproj: - * wtf/AVLTree.h: Added. - Added an AVL tree implementation. - - * kjs/array_instance.cpp: - (KJS::ArrayInstance::increaseVectorLength): - (KJS::ArrayInstance::sort): - (KJS::AVLTreeAbstractorForArrayCompare::get_less): - (KJS::AVLTreeAbstractorForArrayCompare::set_less): - (KJS::AVLTreeAbstractorForArrayCompare::get_greater): - (KJS::AVLTreeAbstractorForArrayCompare::set_greater): - (KJS::AVLTreeAbstractorForArrayCompare::get_balance_factor): - (KJS::AVLTreeAbstractorForArrayCompare::set_balance_factor): - (KJS::AVLTreeAbstractorForArrayCompare::compare_key_key): - (KJS::AVLTreeAbstractorForArrayCompare::compare_key_node): - (KJS::AVLTreeAbstractorForArrayCompare::compare_node_node): - (KJS::AVLTreeAbstractorForArrayCompare::null): - (KJS::ArrayInstance::compactForSorting): - - * kjs/array_instance.h: increaseVectorLength() now returns a bool to indicate whether it was - successful. - - * wtf/Vector.h: - (WTF::Vector::Vector): - (WTF::::operator=): - (WTF::::fill): - Make these methods fail instead of crash when allocation fails, matching resize() and - reserveCapacity(), which already had this behavior. Callers need to check for null buffer - after making any Vector call that can try to allocate. - - * tests/mozilla/ecma/Array/15.4.4.5-3.js: Fixed the test to use a consistent sort function, - as suggested in comments to a Mozilla bug filed about it (I'll keep tracking the bug to see - what the final resolution is). - -2008-05-20 Kevin McCullough - - Reviewed by Tim. - - JSProfiler: Allow the profiler to "Focus" a - profile node. - - Implements focus by adding the idea of a profileNode being visible and - adding the ability to reset all of the visible flags. - - * profiler/Profile.h: - (KJS::Profile::focus): - * profiler/ProfileNode.cpp: - (KJS::ProfileNode::ProfileNode): Initialize the visible flag. - (KJS::ProfileNode::setTreeVisible): Set the visibility of this node and - all of its descendents. - (KJS::ProfileNode::focus): Determine if this node should be visible when - focusing, if the functionName matches this node's function name or if any - of this node's children are visible. - (KJS::ProfileNode::restoreAll): Restore all nodes' visible flag. - (KJS::ProfileNode::debugPrintData): - * profiler/ProfileNode.h: - (KJS::ProfileNode::visible): - (KJS::ProfileNode::setVisible): - -2008-05-20 Timothy Hatcher - - Fixes a couple performance issues with the profiler. Also fixes - a regression where some nodes wouldn't be added to the tree. - - Reviewed by Kevin McCullough. - - * profiler/ProfileNode.cpp: - (KJS::ProfileNode::addChild): Compare callIdentifier instead - of functionName. - * profiler/ProfileNode.h: - (CallIdentifier.operator==): Compare the CallIdentifiers in - an order that fails sooner for non-matches. - (CallIdentifier.callIdentifier): Return the CallIdentifier by - reference to prevent making a new copy each time. - -2008-05-20 Kevin McCullough - - Reviewed by Darin. - - JSProfiler: dump functions are in the code - Removed dump and logging functions from the Release version of the code - and renamed them to be obviously for debugging only. - - * JavaScriptCore.exp: - * profiler/Profile.cpp: - (KJS::Profile::debugPrintData): - (KJS::Profile::debugPrintDataSampleStyle): - * profiler/Profile.h: - * profiler/ProfileNode.cpp: - (KJS::ProfileNode::debugPrintData): - (KJS::ProfileNode::debugPrintDataSampleStyle): - * profiler/ProfileNode.h: - * profiler/Profiler.cpp: - * profiler/Profiler.h: - -2008-05-20 Kevin McCullough - - Reviewed by Adam. - - JSProfiler: Keep track of non-JS execution time - We now have an extra node that represents the excess non-JS time. - - Also changed "SCRIPT" and "anonymous function" to be more consistent - with the debugger. - - * profiler/ProfileNode.cpp: - (KJS::ProfileNode::stopProfiling): If this ProfileNode is the head node - create a new child that has the excess execution time. - (KJS::ProfileNode::calculatePercentages): Moved calculation of the - percentages into a function since it's called from multiple places. - * profiler/ProfileNode.h: Add the newly needed functions used above. - (KJS::ProfileNode::setTotalTime): - (KJS::ProfileNode::setSelfTime): - (KJS::ProfileNode::setNumberOfCalls): - * profiler/Profiler.cpp: renamed "SCRIPT" and "anonymous function" to be - consistent with the debugger and use constants that can be localized - more easily. - (KJS::getCallIdentifiers): - (KJS::getCallIdentifierFromFunctionImp): - -2008-05-20 Kevin McCullough - - Reviewed by Tim. - - JavaScript profiler (10928) - Removed only profiler-internal use of currentProfile since that concept - is changing. - - * profiler/Profile.h: Now stopProfiling takes a time and bool as - arguments. The time is used to calculate %s from and the bool tells - if this node is the head node and should be the one calculating the time. - (KJS::Profile::stopProfiling): - * profiler/ProfileNode.cpp: Ditto. - (KJS::ProfileNode::stopProfiling): - * profiler/ProfileNode.h: Ditto. - -2008-05-20 Kevin McCullough - - Accidentally turned on the profiler. - - * kjs/config.h: - - -2008-05-20 Kevin McCullough - - Reviewed by Tim. - - JavaScript profiler (10928) - Split function name into 3 parts so that the Web Inspector can link it to - the resource location from whence it came. - - * kjs/ustring.cpp: Implemented operator> for UStrings - (KJS::operator>): - * kjs/ustring.h: - * profiler/Profile.cpp: - (KJS::Profile::Profile): Initialize all 3 values. - (KJS::Profile::willExecute): Use CallIdentifier struct. - (KJS::Profile::didExecute): Ditto. - * profiler/Profile.h: Ditto and remove unused function. - * profiler/ProfileNode.cpp: - (KJS::ProfileNode::ProfileNode): Use CallIdentifier struct. - (KJS::ProfileNode::willExecute): Ditto and fix an issue where we - restarted the m_startTime even though it was already started. - (KJS::ProfileNode::didExecute): Ditto. - (KJS::ProfileNode::findChild): Ditto. - (KJS::functionNameDescendingComparator): Ditto and use new comparator. - (KJS::functionNameAscendingComparator): Ditto. - (KJS::ProfileNode::printDataInspectorStyle): Use CallIdentifier struct. - (KJS::ProfileNode::printDataSampleStyle): Ditto. - * profiler/ProfileNode.h: - (KJS::CallIdentifier::CallIdentifier): Describe the CallIdentifier struct - (KJS::CallIdentifier::operator== ): - (KJS::ProfileNode::create): Use the CallIdentifier struct. - (KJS::ProfileNode::callIdentifier): - (KJS::ProfileNode::functionName): Now only return the function name, not - the url and line number too. - (KJS::ProfileNode::url): - (KJS::ProfileNode::lineNumber): - * profiler/Profiler.cpp: Use the CallIdentifier struct. - (KJS::Profiler::startProfiling): - (KJS::Profiler::willExecute): - (KJS::Profiler::didExecute): - (KJS::getCallIdentifiers): - (KJS::getCallIdentifierFromFunctionImp): - -2008-05-20 Timothy Hatcher - - Rename sortFileName{Ascending,Descending} to - sortFunctionName{Ascending,Descending}. - - Reviewed by Kevin McCullough. - - * JavaScriptCore.exp: - * kjs/config.h: - * profiler/Profile.h: - * profiler/ProfileNode.cpp: - (KJS::functionNameDescendingComparator): - (KJS::ProfileNode::sortFunctionNameDescending): - (KJS::functionNameAscendingComparator): - (KJS::ProfileNode::sortFunctionNameAscending): - * profiler/ProfileNode.h: - -2008-05-19 Timothy Hatcher - - Make the profiler use higher than millisecond resolution time-stamps. - - Reviewed by Kevin McCullough. - - * kjs/DateMath.cpp: - (KJS::getCurrentUTCTime): Call getCurrentUTCTimeWithMicroseconds and - floor the result. - (KJS::getCurrentUTCTimeWithMicroseconds): Copied from the previous - implementation of getCurrentUTCTime without the floor call. - * kjs/DateMath.h: Addded getCurrentUTCTimeWithMicroseconds. - * profiler/ProfileNode.cpp: - (KJS::ProfileNode::ProfileNode): Use getCurrentUTCTimeWithMicroseconds. - -2008-05-19 Timothy Hatcher - - Fixes a bug in the profiler where call and apply would show up - and double the time spent in a function. We don't want to show call - and apply at all in the profiles. This change excludes them. - - Reviewed by Kevin McCullough. - - * profiler/ProfileNode.cpp: - (KJS::ProfileNode::stopProfiling): Remove a second for loop and - calculate self time in the existing loop. - * profiler/Profiler.cpp: - (KJS::shouldExcludeFunction): Helper inline function that returns - true in the current function in an InternalFunctionImp and it is - has the functionName call or apply. - (KJS::Profiler::willExecute): Call shouldExcludeFunction and return - early if if returns true. - (KJS::Profiler::didExecute): Ditto. - -2008-05-19 Kevin McCullough - - Reviewed by Tim. - - JavaScript profiler (10928) - - Implement sorting by function name. - - * JavaScriptCore.exp: - * profiler/Profile.h: - (KJS::Profile::sortFileNameDescending): - (KJS::Profile::sortFileNameAscending): - * profiler/ProfileNode.cpp: - (KJS::fileNameDescendingComparator): - (KJS::ProfileNode::sortFileNameDescending): - (KJS::fileNameAscendingComparator): - (KJS::ProfileNode::sortFileNameAscending): - * profiler/ProfileNode.h: - -2008-05-19 Kevin McCullough - - Reviewed by Adam. - - JavaScript profiler (10928) - - Pass the exec state to profiler when calling startProfiling so that if - profiling is started within an execution context that location is - recorded correctly. - - * JavaScriptCore.exp: - * profiler/ProfileNode.cpp: - (KJS::ProfileNode::printDataInspectorStyle): Dump more info for debugging - purposes. - * profiler/Profiler.cpp: - (KJS::Profiler::startProfiling): - * profiler/Profiler.h: - -2008-05-19 Kevin McCullough - - Rubberstamped by Geoff. - - Turn off the profiler because it is a performance regression. - - * kjs/config.h: - -2008-05-19 Alp Toker - - Reviewed by Anders and Beth. - - http://bugs.webkit.org/show_bug.cgi?id=16495 - [GTK] Accessibility support with ATK/AT-SPI - - Initial ATK/AT-SPI accessibility support for the GTK+ port. - - * wtf/Platform.h: - -2008-05-19 Kevin McCullough - - Reviewed by Tim. - - JavaScript profiler (10928) - -In an effort to make the profiler as efficient as possible instead of - prepending to a vector we keep the vector in reverse order and operate - over it backwards. - - * profiler/Profile.cpp: - (KJS::Profile::willExecute): - (KJS::Profile::didExecute): - * profiler/ProfileNode.cpp: - (KJS::ProfileNode::didExecute): - (KJS::ProfileNode::endAndRecordCall): - * profiler/ProfileNode.h: - * profiler/Profiler.cpp: - (KJS::getStackNames): - -2008-05-16 Kevin McCullough - - Reviewed by Tim. - - JavaScript profiler (10928) - Implement sorting for the profiler. - I chose to sort the profileNodes in place since there is no reason they - need to retain their original order. - - * JavaScriptCore.exp: Export the symbols. - * profiler/Profile.h: Add the different ways a profile can be sorted. - (KJS::Profile::sortTotalTimeDescending): - (KJS::Profile::sortTotalTimeAscending): - (KJS::Profile::sortSelfTimeDescending): - (KJS::Profile::sortSelfTimeAscending): - (KJS::Profile::sortCallsDescending): - (KJS::Profile::sortCallsAscending): - * profiler/ProfileNode.cpp: Implement those ways. - (KJS::totalTimeDescendingComparator): - (KJS::ProfileNode::sortTotalTimeDescending): - (KJS::totalTimeAscendingComparator): - (KJS::ProfileNode::sortTotalTimeAscending): - (KJS::selfTimeDescendingComparator): - (KJS::ProfileNode::sortSelfTimeDescending): - (KJS::selfTimeAscendingComparator): - (KJS::ProfileNode::sortSelfTimeAscending): - (KJS::callsDescendingComparator): - (KJS::ProfileNode::sortCallsDescending): - (KJS::callsAscendingComparator): - (KJS::ProfileNode::sortCallsAscending): - * profiler/ProfileNode.h: No longer use a Deque since it cannot be - sorted by std::sort and there was no reason not to use a Vector. I - previously had though I would do prepending but am not. - (KJS::ProfileNode::selfTime): - (KJS::ProfileNode::totalPercent): - (KJS::ProfileNode::selfPercent): - (KJS::ProfileNode::children): - * profiler/Profiler.cpp: Removed these functions as they can be called - directoy on the Profile object after getting the Vector of them. - (KJS::getStackNames): - * profiler/Profiler.h: - -2008-05-15 Ariya Hidayat - - Reviewed by Simon. - - Since WebKitGtk is fully using autotools now, clean-up the .pro/.pri files - from gtk-port. - - * JavaScriptCore.pro: - * kjs/testkjs.pro: - -2008-05-15 Kevin McCullough - - - Build fix. - - * JavaScriptCore.exp: - -2008-05-15 Kevin McCullough - - Reviewed by Tim. - - JavaScript profiler (10928) - - Cache some values to save on computing them repetitively. This will be - a big savings when we sort since we won't have to walk the tree for - every comparison! - - We cache these values when we end profiling because otherwise we won't - know which profile to get the totalTime for the whole profile from without - retaining a reference to the head profile or looking up the profile from - the list of all profiles. - - Also it's safe to assume we won't be asked for these values while we - are still profiling since the WebInspector only get's profileNodes from - profiles that are in the allProfiles() list and a profile is only added - to that list after it has finished and these values will no longer - change. - - * JavaScriptCore.exp: - * profiler/ProfileNode.cpp: - (KJS::ProfileNode::ProfileNode): - (KJS::ProfileNode::stopProfiling): - (KJS::ProfileNode::printDataInspectorStyle): - (KJS::ProfileNode::printDataSampleStyle): - (KJS::ProfileNode::endAndRecordCall): - * profiler/ProfileNode.h: - (KJS::ProfileNode::totalTime): - (KJS::ProfileNode::selfTime): - (KJS::ProfileNode::totalPercent): - (KJS::ProfileNode::selfPercent): - * profiler/Profiler.cpp: - (KJS::Profiler::stopProfiling): - -2008-05-15 Simon Hausmann - - Reviewed by Holger. - - Fix compilation when compiling with MSVC and wchar_t support. - - * wtf/unicode/qt4/UnicodeQt4.h: - (WTF::Unicode::foldCase): - (WTF::Unicode::umemcasecmp): - -2008-05-14 Kevin McCullough - - Reviewed by Tim. - - JavaScript profiler (10928) - - Turn on the profiler. - - * kjs/config.h: - -2008-05-14 Kevin McCullough - - Reviewed by Tim. - - JavaScript profiler (10928) - - Expose the new profiler functions to the WebInspector. - - * JavaScriptCore.exp: - -2008-05-14 Kevin McCullough - - Giving credit where credit is due. - - * ChangeLog: - -2008-05-14 Kevin McCullough - - Reviewed by Geoff and Sam. - - JavaScript profiler (10928) - Add the ability to get percentages of total and self time for displaying - in the WebInspector. - - * profiler/Profile.h: - (KJS::Profile::totalProfileTime): - * profiler/ProfileNode.cpp: - (KJS::ProfileNode::totalPercent): - (KJS::ProfileNode::selfPercent): - * profiler/ProfileNode.h: - * profiler/Profiler.h: - (KJS::Profiler::currentProfile): - -2008-05-14 Kevin McCullough - - Reviewed by Sam. - - JavaScript profiler (10928) - - Rename FunctionCallProfile to ProfileNode. - - * GNUmakefile.am: - * JavaScriptCore.exp: - * JavaScriptCore.pri: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - * JavaScriptCoreSources.bkl: - * profiler/FunctionCallProfile.cpp: Removed. - * profiler/FunctionCallProfile.h: Removed. - * profiler/Profile.cpp: - (KJS::Profile::Profile): - (KJS::Profile::willExecute): - * profiler/Profile.h: - (KJS::Profile::callTree): - * profiler/ProfileNode.cpp: Copied from profiler/FunctionCallProfile.cpp. - (KJS::ProfileNode::ProfileNode): - (KJS::ProfileNode::willExecute): - (KJS::ProfileNode::didExecute): - (KJS::ProfileNode::addChild): - (KJS::ProfileNode::findChild): - (KJS::ProfileNode::stopProfiling): - (KJS::ProfileNode::selfTime): - (KJS::ProfileNode::printDataInspectorStyle): - (KJS::ProfileNode::printDataSampleStyle): - (KJS::ProfileNode::endAndRecordCall): - * profiler/ProfileNode.h: Copied from profiler/FunctionCallProfile.h. - (KJS::ProfileNode::create): - (KJS::ProfileNode::children): - * profiler/Profiler.cpp: - -2008-05-14 Kevin McCullough - - Reviewed by John. - - JavaScript profiler (10928) - - Have each FunctionCallProfile be able to return it's total and self time. - - * JavaScriptCore.exp: - * profiler/FunctionCallProfile.cpp: - (KJS::FunctionCallProfile::selfTime): - * profiler/FunctionCallProfile.h: - (KJS::FunctionCallProfile::totalTime): - -2008-05-14 Alexey Proskuryakov - - Reviewed by Darin. - - REGRESSION: A script fails because of a straw BOM character in it. - - - Unicode format characters (Cf) should be removed from JavaScript source - - Of all Cf characters, we are only removing BOM, because this is what Firefox trunk has - settled upon, after extensive discussion and investigation. - - Based on Darin's work on this bug. - - Test: fast/js/removing-Cf-characters.html - - * kjs/lexer.cpp: - (KJS::Lexer::setCode): Tweak formatting. Use a call to shift(4) to read in the - first characters, instead of having special case code here. - (KJS::Lexer::shift): Add a loop when reading a character to skip BOM characters. - -2008-05-13 Matt Lilek - - Not reviewed, build fix. - - * kjs/date_object.cpp: - (KJS::DateObjectFuncImp::callAsFunction): - -2008-05-13 Anders Carlsson - - Reviewed by Sam. - - Implement Date.now - - Implement Date.now which returns the number of milliseconds since the epoch. - - * kjs/CommonIdentifiers.h: - * kjs/date_object.cpp: - (KJS::DateObjectFuncImp::): - (KJS::DateObjectImp::DateObjectImp): - (KJS::DateObjectFuncImp::callAsFunction): - -2008-05-13 Kevin McCullough - - Giving credit where credit is due. - - * ChangeLog: - -2008-05-13 Kevin McCullough - - Reviewed by Adam and Geoff. - - JavaScript profiler (10928) - Use PassRefPtrs instead of RefPtrs when appropriate. - - * profiler/FunctionCallProfile.cpp: - (KJS::FunctionCallProfile::addChild): - * profiler/FunctionCallProfile.h: - * profiler/Profile.h: - (KJS::Profile::callTree): - -2008-05-13 Kevin McCullough - - Reviewed by Sam. - - JavaScript profiler (10928) - - Made some functions static (as per Adam) and changed from using raw - pointers to RefPtr for making these JavaScript Objects. - - * profiler/FunctionCallProfile.cpp: - (KJS::FunctionCallProfile::addChild): - (KJS::FunctionCallProfile::findChild): - * profiler/FunctionCallProfile.h: - (KJS::FunctionCallProfile::create): - * profiler/Profile.cpp: - (KJS::Profile::Profile): - (KJS::Profile::willExecute): - (KJS::Profile::didExecute): - (KJS::functionNameCountPairComparator): - * profiler/Profile.h: - (KJS::Profile::create): - (KJS::Profile::title): - (KJS::Profile::callTree): - * profiler/Profiler.cpp: - (KJS::Profiler::startProfiling): - * profiler/Profiler.h: - (KJS::Profiler::allProfiles): - (KJS::Profiler::clearProfiles): - -2008-05-13 Alexey Proskuryakov - - Reviewed by Geoffrey Garen. - - JavaScriptCore API claims to work with UTF8 strings, but only works - with ASCII strings - - * kjs/ustring.h: - * kjs/ustring.cpp: - (KJS::UString::Rep::createFromUTF8): - Added. Implementation adapted from JSStringCreateWithUTF8CString(). - - * API/JSStringRef.cpp: - (JSStringCreateWithUTF8CString): - * API/JSClassRef.cpp: - (OpaqueJSClass::OpaqueJSClass): - Use UString::Rep::createFromUTF8(). - -2008-05-12 Mark Rowe - - Reviewed by Tim Hatcher. - - WebKit needs availability macros in order to deprecate APIs - - Create WebKit availability macros that key off the Mac OS X version being targeted to - determine the WebKit version being targeted. Applications can define - WEBKIT_VERSION_MIN_REQUIRED before including WebKit headers in order to target a specific - version of WebKit. - - The availability header is being added to JavaScriptCore rather than WebKit as JavaScriptCore - is the lowest-level portion of the public WebKit API. - - * API/WebKitAvailability.h: Added. - * JavaScriptCore.xcodeproj/project.pbxproj: - -2008-05-12 Alexey Proskuryakov - - Reviewed by Maciej. - - https://bugs.webkit.org/show_bug.cgi?id=18828 - Reproducible crash with PAC file - - Naively moving JavaScriptCore into thread-specific data was inappropriate in the face of - exiting JavaScriptCore API clients, which expect a different therading model. Temporarily - disabling ThreadSpecific implementation until this can be sorted out. - - * wtf/ThreadSpecific.h: - (WTF::::ThreadSpecific): - (WTF::::~ThreadSpecific): - (WTF::::get): - (WTF::::set): - -2008-05-12 Alexey Proskuryakov - - Roll out recent threading changes (r32807, r32810, r32819, r32822) to simplify - SquirrelFish merging. - - * API/JSBase.cpp: - (JSGarbageCollect): - * API/JSCallbackObjectFunctions.h: - (KJS::::staticFunctionGetter): - * API/JSClassRef.cpp: - (OpaqueJSClass::prototype): - * API/JSObjectRef.cpp: - (JSObjectMake): - (JSObjectMakeFunctionWithCallback): - (JSObjectMakeConstructor): - (JSObjectMakeFunction): - * API/JSValueRef.cpp: - (JSValueMakeNumber): - (JSValueMakeString): - * JavaScriptCore.exp: - * kjs/ExecState.h: - * kjs/InitializeThreading.cpp: - (KJS::initializeThreadingOnce): - * kjs/JSGlobalObject.cpp: - (KJS::JSGlobalObject::~JSGlobalObject): - (KJS::JSGlobalObject::init): - (KJS::JSGlobalObject::put): - (KJS::JSGlobalObject::reset): - (KJS::JSGlobalObject::tearOffActivation): - * kjs/JSGlobalObject.h: - (KJS::JSGlobalObject::head): - (KJS::JSGlobalObject::perThreadData): - * kjs/JSLock.cpp: - (KJS::JSLock::registerThread): - * kjs/JSLock.h: - (KJS::JSLock::JSLock): - * kjs/array_instance.cpp: - (KJS::ArrayInstance::ArrayInstance): - (KJS::ArrayInstance::lengthGetter): - * kjs/array_object.cpp: - (KJS::arrayProtoFuncToString): - (KJS::arrayProtoFuncToLocaleString): - (KJS::arrayProtoFuncJoin): - (KJS::arrayProtoFuncConcat): - (KJS::arrayProtoFuncPop): - (KJS::arrayProtoFuncPush): - (KJS::arrayProtoFuncShift): - (KJS::arrayProtoFuncSlice): - (KJS::arrayProtoFuncSplice): - (KJS::arrayProtoFuncUnShift): - (KJS::arrayProtoFuncFilter): - (KJS::arrayProtoFuncMap): - (KJS::arrayProtoFuncEvery): - (KJS::arrayProtoFuncForEach): - (KJS::arrayProtoFuncSome): - (KJS::arrayProtoFuncIndexOf): - (KJS::arrayProtoFuncLastIndexOf): - (KJS::ArrayObjectImp::ArrayObjectImp): - (KJS::ArrayObjectImp::construct): - * kjs/bool_object.cpp: - (KJS::BooleanPrototype::BooleanPrototype): - (KJS::booleanProtoFuncToString): - (KJS::BooleanObjectImp::BooleanObjectImp): - (KJS::BooleanObjectImp::construct): - * kjs/collector.cpp: - (KJS::allocateBlock): - (KJS::Collector::recordExtraCost): - (KJS::Collector::heapAllocate): - (KJS::Collector::allocate): - (KJS::Collector::allocateNumber): - (KJS::Collector::registerAsMainThread): - (KJS::onMainThread): - (KJS::PlatformThread::PlatformThread): - (KJS::getCurrentPlatformThread): - (KJS::Collector::Thread::Thread): - (KJS::destroyRegisteredThread): - (KJS::initializeRegisteredThreadKey): - (KJS::Collector::registerThread): - (KJS::Collector::markStackObjectsConservatively): - (KJS::Collector::markCurrentThreadConservativelyInternal): - (KJS::Collector::markCurrentThreadConservatively): - (KJS::suspendThread): - (KJS::resumeThread): - (KJS::getPlatformThreadRegisters): - (KJS::otherThreadStackPointer): - (KJS::Collector::markOtherThreadConservatively): - (KJS::protectedValues): - (KJS::Collector::protect): - (KJS::Collector::unprotect): - (KJS::Collector::collectOnMainThreadOnly): - (KJS::Collector::markProtectedObjects): - (KJS::Collector::markMainThreadOnlyObjects): - (KJS::Collector::sweep): - (KJS::Collector::collect): - (KJS::Collector::size): - (KJS::Collector::globalObjectCount): - (KJS::Collector::protectedGlobalObjectCount): - (KJS::Collector::protectedObjectCount): - (KJS::Collector::protectedObjectTypeCounts): - (KJS::Collector::isBusy): - (KJS::Collector::reportOutOfMemoryToAllExecStates): - * kjs/collector.h: - (KJS::Collector::cellBlock): - (KJS::Collector::cellOffset): - (KJS::Collector::isCellMarked): - (KJS::Collector::markCell): - (KJS::Collector::reportExtraMemoryCost): - * kjs/date_object.cpp: - (KJS::formatLocaleDate): - (KJS::DatePrototype::DatePrototype): - (KJS::DateObjectImp::DateObjectImp): - (KJS::DateObjectImp::construct): - (KJS::DateObjectImp::callAsFunction): - (KJS::DateObjectFuncImp::DateObjectFuncImp): - (KJS::DateObjectFuncImp::callAsFunction): - (KJS::dateProtoFuncToString): - (KJS::dateProtoFuncToUTCString): - (KJS::dateProtoFuncToDateString): - (KJS::dateProtoFuncToTimeString): - (KJS::dateProtoFuncToLocaleString): - (KJS::dateProtoFuncToLocaleDateString): - (KJS::dateProtoFuncToLocaleTimeString): - (KJS::dateProtoFuncValueOf): - (KJS::dateProtoFuncGetTime): - (KJS::dateProtoFuncGetFullYear): - (KJS::dateProtoFuncGetUTCFullYear): - (KJS::dateProtoFuncToGMTString): - (KJS::dateProtoFuncGetMonth): - (KJS::dateProtoFuncGetUTCMonth): - (KJS::dateProtoFuncGetDate): - (KJS::dateProtoFuncGetUTCDate): - (KJS::dateProtoFuncGetDay): - (KJS::dateProtoFuncGetUTCDay): - (KJS::dateProtoFuncGetHours): - (KJS::dateProtoFuncGetUTCHours): - (KJS::dateProtoFuncGetMinutes): - (KJS::dateProtoFuncGetUTCMinutes): - (KJS::dateProtoFuncGetSeconds): - (KJS::dateProtoFuncGetUTCSeconds): - (KJS::dateProtoFuncGetMilliSeconds): - (KJS::dateProtoFuncGetUTCMilliseconds): - (KJS::dateProtoFuncGetTimezoneOffset): - (KJS::dateProtoFuncSetTime): - (KJS::setNewValueFromTimeArgs): - (KJS::setNewValueFromDateArgs): - (KJS::dateProtoFuncSetYear): - (KJS::dateProtoFuncGetYear): - * kjs/error_object.cpp: - (KJS::ErrorPrototype::ErrorPrototype): - (KJS::errorProtoFuncToString): - (KJS::ErrorObjectImp::ErrorObjectImp): - (KJS::ErrorObjectImp::construct): - (KJS::NativeErrorPrototype::NativeErrorPrototype): - (KJS::NativeErrorImp::NativeErrorImp): - (KJS::NativeErrorImp::construct): - * kjs/function.cpp: - (KJS::FunctionImp::lengthGetter): - (KJS::FunctionImp::construct): - (KJS::Arguments::Arguments): - (KJS::ActivationImp::createArgumentsObject): - (KJS::encode): - (KJS::decode): - (KJS::globalFuncParseInt): - (KJS::globalFuncParseFloat): - (KJS::globalFuncEscape): - (KJS::globalFuncUnescape): - (KJS::PrototypeFunction::PrototypeFunction): - (KJS::PrototypeReflexiveFunction::PrototypeReflexiveFunction): - * kjs/function_object.cpp: - (KJS::FunctionPrototype::FunctionPrototype): - (KJS::functionProtoFuncToString): - (KJS::FunctionObjectImp::FunctionObjectImp): - (KJS::FunctionObjectImp::construct): - * kjs/internal.cpp: - (KJS::StringImp::toObject): - * kjs/internal.h: - (KJS::StringImp::StringImp): - (KJS::NumberImp::operator new): - * kjs/list.cpp: - (KJS::List::markSet): - (KJS::List::markProtectedListsSlowCase): - (KJS::List::expandAndAppend): - * kjs/list.h: - (KJS::List::List): - (KJS::List::~List): - (KJS::List::markProtectedLists): - * kjs/lookup.h: - (KJS::staticFunctionGetter): - (KJS::cacheGlobalObject): - * kjs/math_object.cpp: - (KJS::MathObjectImp::getValueProperty): - (KJS::mathProtoFuncAbs): - (KJS::mathProtoFuncACos): - (KJS::mathProtoFuncASin): - (KJS::mathProtoFuncATan): - (KJS::mathProtoFuncATan2): - (KJS::mathProtoFuncCeil): - (KJS::mathProtoFuncCos): - (KJS::mathProtoFuncExp): - (KJS::mathProtoFuncFloor): - (KJS::mathProtoFuncLog): - (KJS::mathProtoFuncMax): - (KJS::mathProtoFuncMin): - (KJS::mathProtoFuncPow): - (KJS::mathProtoFuncRandom): - (KJS::mathProtoFuncRound): - (KJS::mathProtoFuncSin): - (KJS::mathProtoFuncSqrt): - (KJS::mathProtoFuncTan): - * kjs/nodes.cpp: - (KJS::ParserRefCounted::ParserRefCounted): - (KJS::ParserRefCounted::ref): - (KJS::ParserRefCounted::deref): - (KJS::ParserRefCounted::refcount): - (KJS::ParserRefCounted::deleteNewObjects): - (KJS::Node::handleException): - (KJS::NumberNode::evaluate): - (KJS::StringNode::evaluate): - (KJS::ArrayNode::evaluate): - (KJS::PostIncResolveNode::evaluate): - (KJS::PostIncLocalVarNode::evaluate): - (KJS::PostDecResolveNode::evaluate): - (KJS::PostDecLocalVarNode::evaluate): - (KJS::PostDecLocalVarNode::inlineEvaluateToNumber): - (KJS::PostIncBracketNode::evaluate): - (KJS::PostDecBracketNode::evaluate): - (KJS::PostIncDotNode::evaluate): - (KJS::PostDecDotNode::evaluate): - (KJS::typeStringForValue): - (KJS::LocalVarTypeOfNode::evaluate): - (KJS::TypeOfResolveNode::evaluate): - (KJS::TypeOfValueNode::evaluate): - (KJS::PreIncLocalVarNode::evaluate): - (KJS::PreIncResolveNode::evaluate): - (KJS::PreDecLocalVarNode::evaluate): - (KJS::PreDecResolveNode::evaluate): - (KJS::PreIncConstNode::evaluate): - (KJS::PreDecConstNode::evaluate): - (KJS::PostIncConstNode::evaluate): - (KJS::PostDecConstNode::evaluate): - (KJS::PreIncBracketNode::evaluate): - (KJS::PreDecBracketNode::evaluate): - (KJS::PreIncDotNode::evaluate): - (KJS::PreDecDotNode::evaluate): - (KJS::NegateNode::evaluate): - (KJS::BitwiseNotNode::evaluate): - (KJS::MultNode::evaluate): - (KJS::DivNode::evaluate): - (KJS::ModNode::evaluate): - (KJS::addSlowCase): - (KJS::add): - (KJS::AddNumbersNode::evaluate): - (KJS::AddStringsNode::evaluate): - (KJS::AddStringLeftNode::evaluate): - (KJS::AddStringRightNode::evaluate): - (KJS::SubNode::evaluate): - (KJS::LeftShiftNode::evaluate): - (KJS::RightShiftNode::evaluate): - (KJS::UnsignedRightShiftNode::evaluate): - (KJS::BitXOrNode::evaluate): - (KJS::BitOrNode::evaluate): - (KJS::valueForReadModifyAssignment): - (KJS::ForInNode::execute): - (KJS::TryNode::execute): - (KJS::FuncDeclNode::makeFunction): - (KJS::FuncExprNode::evaluate): - * kjs/nodes.h: - * kjs/number_object.cpp: - (KJS::NumberPrototype::NumberPrototype): - (KJS::numberProtoFuncToString): - (KJS::numberProtoFuncToLocaleString): - (KJS::numberProtoFuncToFixed): - (KJS::numberProtoFuncToExponential): - (KJS::numberProtoFuncToPrecision): - (KJS::NumberObjectImp::NumberObjectImp): - (KJS::NumberObjectImp::getValueProperty): - (KJS::NumberObjectImp::construct): - (KJS::NumberObjectImp::callAsFunction): - * kjs/object.cpp: - (KJS::JSObject::call): - (KJS::JSObject::get): - (KJS::JSObject::put): - (KJS::JSObject::defineGetter): - (KJS::JSObject::defineSetter): - (KJS::JSObject::putDirect): - (KJS::Error::create): - * kjs/object.h: - * kjs/object_object.cpp: - (KJS::ObjectPrototype::ObjectPrototype): - (KJS::objectProtoFuncToLocaleString): - (KJS::objectProtoFuncToString): - (KJS::ObjectObjectImp::ObjectObjectImp): - (KJS::ObjectObjectImp::construct): - * kjs/property_map.h: - (KJS::SavedProperty::SavedProperty): - (KJS::SavedProperty::init): - (KJS::SavedProperty::~SavedProperty): - (KJS::SavedProperty::name): - (KJS::SavedProperty::value): - (KJS::SavedProperty::attributes): - * kjs/protect.h: - (KJS::gcProtect): - (KJS::gcUnprotect): - * kjs/regexp_object.cpp: - (KJS::RegExpPrototype::RegExpPrototype): - (KJS::regExpProtoFuncToString): - (KJS::RegExpImp::getValueProperty): - (KJS::RegExpObjectImp::RegExpObjectImp): - (KJS::RegExpObjectImp::arrayOfMatches): - (KJS::RegExpObjectImp::getBackref): - (KJS::RegExpObjectImp::getLastParen): - (KJS::RegExpObjectImp::getLeftContext): - (KJS::RegExpObjectImp::getRightContext): - (KJS::RegExpObjectImp::getValueProperty): - (KJS::RegExpObjectImp::createRegExpImp): - * kjs/regexp_object.h: - * kjs/string_object.cpp: - (KJS::StringInstance::StringInstance): - (KJS::StringInstance::lengthGetter): - (KJS::StringInstance::indexGetter): - (KJS::stringInstanceNumericPropertyGetter): - (KJS::StringPrototype::StringPrototype): - (KJS::replace): - (KJS::stringProtoFuncCharAt): - (KJS::stringProtoFuncCharCodeAt): - (KJS::stringProtoFuncConcat): - (KJS::stringProtoFuncIndexOf): - (KJS::stringProtoFuncLastIndexOf): - (KJS::stringProtoFuncMatch): - (KJS::stringProtoFuncSearch): - (KJS::stringProtoFuncReplace): - (KJS::stringProtoFuncSlice): - (KJS::stringProtoFuncSplit): - (KJS::stringProtoFuncSubstr): - (KJS::stringProtoFuncSubstring): - (KJS::stringProtoFuncToLowerCase): - (KJS::stringProtoFuncToUpperCase): - (KJS::stringProtoFuncToLocaleLowerCase): - (KJS::stringProtoFuncToLocaleUpperCase): - (KJS::stringProtoFuncLocaleCompare): - (KJS::stringProtoFuncBig): - (KJS::stringProtoFuncSmall): - (KJS::stringProtoFuncBlink): - (KJS::stringProtoFuncBold): - (KJS::stringProtoFuncFixed): - (KJS::stringProtoFuncItalics): - (KJS::stringProtoFuncStrike): - (KJS::stringProtoFuncSub): - (KJS::stringProtoFuncSup): - (KJS::stringProtoFuncFontcolor): - (KJS::stringProtoFuncFontsize): - (KJS::stringProtoFuncAnchor): - (KJS::stringProtoFuncLink): - (KJS::StringObjectImp::StringObjectImp): - (KJS::StringObjectImp::construct): - (KJS::StringObjectImp::callAsFunction): - (KJS::StringObjectFuncImp::StringObjectFuncImp): - (KJS::StringObjectFuncImp::callAsFunction): - * kjs/string_object.h: - (KJS::StringInstanceThatMasqueradesAsUndefined::StringInstanceThatMasqueradesAsUndefined): - * kjs/testkjs.cpp: - (GlobalObject::GlobalObject): - (functionGC): - (functionRun): - (functionReadline): - (kjsmain): - * kjs/ustring.h: - * kjs/value.cpp: - (KJS::JSCell::operator new): - (KJS::jsString): - (KJS::jsOwnedString): - (KJS::jsNumberCell): - * kjs/value.h: - (KJS::jsNaN): - (KJS::jsNumber): - (KJS::jsNumberFromAnd): - (KJS::JSCell::marked): - (KJS::JSCell::mark): - (KJS::JSValue::toJSNumber): - * wtf/ThreadSpecific.h: - (WTF::T): - -2008-05-10 Julien Chaffraix - - Qt & wx build fix. - - * JavaScriptCore.pri: Add profiler/Profile.cpp. - * JavaScriptCoreSources.bkl: Ditto. - -2008-05-10 Jan Michael Alonzo - - Reviewed by Maciej. - - Gtk+ build fix - - * GNUmakefile.am: Add Profile.cpp in _sources - -2008-05-09 Brady Eidson - - Build Fix. Kevin is an idiot. - ("My name is Kevin McCullough and I approve this message.") - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - -2008-05-09 Kevin McCullough - - Reviewed by Tim. - - - JavaScript profiler (10928) - -Add Profile class so that all profiles can be stored and retrieved by - the WebInspector when that time comes. - - * JavaScriptCore.exp: Export the new function signatures. - * JavaScriptCore.xcodeproj/project.pbxproj: Add the new files to the - project - * profiler/Profile.cpp: Added. This class represents a single run of the - profiler. - (KJS::Profile::Profile): - (KJS::Profile::willExecute): - (KJS::Profile::didExecute): - (KJS::Profile::printDataInspectorStyle): - (KJS::functionNameCountPairComparator): - (KJS::Profile::printDataSampleStyle): - * profiler/Profile.h: Added. Ditto - (KJS::Profile::stopProfiling): - * profiler/Profiler.cpp: Now the profiler keeps track of many profiles - but only runs one at a time. - (KJS::Profiler::startProfiling): - (KJS::Profiler::stopProfiling): - (KJS::Profiler::willExecute): - (KJS::Profiler::didExecute): - (KJS::Profiler::printDataInspectorStyle): - (KJS::Profiler::printDataSampleStyle): - * profiler/Profiler.h: Ditto. - (KJS::Profiler::~Profiler): - (KJS::Profiler::allProfiles): - (KJS::Profiler::clearProfiles): - -2008-05-08 Anders Carlsson - - Reviewed by Mark. - - Enable NPAPI plug-ins on 64-bit. - - * wtf/Platform.h: - -2008-05-07 Julien Chaffraix - - Reviewed by Adam Roben. - - wx & Gtk build fix. - - Add SIZE_MAX definition for the wx port. - - * os-win32/stdint.h: - -2008-05-07 Ariya Hidayat - - Reviewed by Simon. - - Support for isMainThread in the Qt port. - - * wtf/ThreadingQt.cpp: - (WTF::initializeThreading): Adjusted. - (WTF::isMainThread): Added. - -2008-05-05 Darin Adler - - Reviewed by John Sullivan. - - - fix debug-only leak seen on buildbot - - * wtf/HashTable.h: - (WTF::HashTable::checkKey): After writing an empty value in, but before constructing a - deleted value on top of it, call the destructor so the empty value doesn't leak. - -2008-05-02 Alexey Proskuryakov - - Reviewed by Geoffrey Garen. - - Get rid of static data in nodes.cpp (well, at least of non-debug one). - - No measurable change on SunSpider. - - * kjs/InitializeThreading.cpp: - (KJS::initializeThreadingOnce): - * kjs/nodes.cpp: - (KJS::newTrackedObjects): - (KJS::trackedObjectExtraRefCounts): - (KJS::initializeNodesThreading): - (KJS::ParserRefCounted::ParserRefCounted): - (KJS::ParserRefCounted::ref): - (KJS::ParserRefCounted::deref): - (KJS::ParserRefCounted::refcount): - (KJS::ParserRefCounted::deleteNewObjects): - * kjs/nodes.h: - Made newTrackedObjects and trackedObjectExtraRefCounts per-thread. - -2008-05-02 Alexey Proskuryakov - - Reviewed by Darin. - - Move call stack depth counter to global object. - - * kjs/ExecState.h: (KJS::ExecState::functionCallDepth): Added a recursion depth counter to - per-thread data. - * kjs/JSGlobalObject.cpp: (KJS::JSGlobalObject::init): Initialize PerThreadData.functionCallDepth. - * kjs/JSGlobalObject.h: (KJS::JSGlobalObject::perThreadData): Made the result non-const. - - * kjs/object.cpp: - (KJS::throwStackSizeExceededError): Moved throwError to a separate function, since it is now - the only thing in JSObject::call that needs a PIC branch. - (KJS::JSObject::call): Use a per-thread variable instead of local static for recursion depth - tracking. - -2008-05-02 Alexey Proskuryakov - - Reviewed by Darin. - - Make JavaScriptGlue and JavaScriptCore API functions implicitly call initializeThreading - for the sake of non-WebKit clients. - - * API/JSBase.cpp: - (JSGarbageCollect): - * API/JSContextRef.cpp: - (JSGlobalContextCreate): - These are the JavaScriptCore API bottlenecks. There are a few other JSStringRef - and JSClassRef functions that can be called earlier, but they do not do anything that - requires initializeThreading. - - * kjs/InitializeThreading.cpp: - (KJS::doInitializeThreading): - (KJS::initializeThreading): - On Darwin, make the initialization happen under pthread_once, since there is no guarantee - that non-WebKit clients won't try to call this function re-entrantly. - - * kjs/InitializeThreading.h: - * wtf/Threading.h: - Spell out initializeThreading contract. - - * wtf/ThreadingPthreads.cpp: (WTF::isMainThread): Make sure that results are correct on - Darwin, even if threading was initialized from a secondary thread. - -2008-05-02 Alexey Proskuryakov - - Reviewed by Geoffrey Garen. - - https://bugs.webkit.org/show_bug.cgi?id=18826 - Make JavaScript heap per-thread - - * wtf/ThreadSpecific.h: Make sure to initialize POD thread-specific varaibles, too - (replaced "new T" with "new T()"). - - * kjs/collector.h: Renamed Collector to Heap, made the heap per-thread. Removed support for - multithreaded access to a heap. - (KJS::CollectorBlock): Removed collectOnMainThreadOnly bitmap, added a reference to owner heap. - (KJS::SmallCellCollectorBlock): Ditto. - (KJS::Heap::markListSet): Moved from a static variable in List.cpp to a per-thread one here. - (KJS::Heap::heap): Added a method to find which heap a JSValue is allocated in. - - * kjs/collector.cpp: Changed "const size_t" constants to #defines, to avoid a PIC branch - (gcc was using one to access a constant used in std::max(), because it takes a reference, - even though std::max() itself was inlined). - (KJS::Heap::threadHeap): JS heap is now per-thread. - (KJS::Heap::Heap): Zero-initialize the heap. - (KJS::allocateBlock): Added NEVER_INLINE, because this function uses a PIC branch, so - inlining it in Heap::heapAllocate() is bad for performance, now that the latter doesn't - use any global data. - (KJS::Heap::heapAllocate): Initialize Block::heap. - (KJS::Heap::markCurrentThreadConservatively): Moved into markStackObjectsConservatively(), - as GC only works with a current thread's heap now. - (KJS::Heap::sweep): Removed collectOnMainThreadOnly checks. - (KJS::Heap::collect): Ditto. - - * kjs/JSLock.cpp: - * kjs/JSLock.h: - (KJS::JSLock::JSLock): - Removed registerThread(), as the heap no longer cares. - - * kjs/InitializeThreading.cpp: (KJS::initializeThreading): Initialize new per-thread - variables in Heap and JSGlobalObject. - - * kjs/ExecState.h: (KJS::ExecState::heap): Added a heap pointer for faster access to - per-thread heap, and an accessor for it. - - * kjs/JSGlobalObject.h: Made JSGlobalObject linked list per-thread. - * kjs/JSGlobalObject.cpp: - (KJS::JSGlobalObject::~JSGlobalObject): Fixed a bug in linked list handling. It only worked - right if the removed object was the head one! - (KJS::JSGlobalObject::head): Return a per-thread list head. - (KJS::JSGlobalObject::init): Store a reference to per-thread heap. - (KJS::JSGlobalObject::reset): Pass ExecState to functions that need it. - (KJS::JSGlobalObject::tearOffActivation): Ditto. - (KJS::JSGlobalObject::operator new): JSGlobalObject allocation cannot use an ExecState, - so it needs a custom operator new that directly accesses per-thread heap. - - * kjs/list.h: - (KJS::List::List): Replaced m_isInMarkSet boolean with an actual pointer to the set, since it - is no longer a single static object. - (KJS::List::~List): Ditto. - * kjs/list.cpp: - (KJS::List::markSet): Removed, this is now stored in Heap. - (KJS::List::markProtectedLists): Take a reference to the list. - (KJS::List::expandAndAppend): Ask the current thread heap for a mark set reference. - - * kjs/protect.h: - (KJS::gcProtect): - (KJS::gcUnprotect): - Use the newly added Heap::heap() method to find out which heap the value to be (un)protected - belongs to. - - * kjs/property_map.h: Removed unused SavedProperty class. - - * JavaScriptCore.exp: - * API/JSBase.cpp: - (JSGarbageCollect): - * API/JSCallbackObjectFunctions.h: - (KJS::::staticFunctionGetter): - * API/JSClassRef.cpp: - (OpaqueJSClass::prototype): - * API/JSObjectRef.cpp: - (JSObjectMake): - (JSObjectMakeFunctionWithCallback): - (JSObjectMakeConstructor): - (JSObjectMakeFunction): - * API/JSValueRef.cpp: - (JSValueMakeNumber): - (JSValueMakeString): - * kjs/array_instance.cpp: - (KJS::ArrayInstance::ArrayInstance): - (KJS::ArrayInstance::lengthGetter): - * kjs/array_object.cpp: - (KJS::arrayProtoFuncToString): - (KJS::arrayProtoFuncToLocaleString): - (KJS::arrayProtoFuncJoin): - (KJS::arrayProtoFuncConcat): - (KJS::arrayProtoFuncPop): - (KJS::arrayProtoFuncPush): - (KJS::arrayProtoFuncShift): - (KJS::arrayProtoFuncSlice): - (KJS::arrayProtoFuncSplice): - (KJS::arrayProtoFuncUnShift): - (KJS::arrayProtoFuncFilter): - (KJS::arrayProtoFuncMap): - (KJS::arrayProtoFuncEvery): - (KJS::arrayProtoFuncForEach): - (KJS::arrayProtoFuncSome): - (KJS::arrayProtoFuncIndexOf): - (KJS::arrayProtoFuncLastIndexOf): - (KJS::ArrayObjectImp::ArrayObjectImp): - (KJS::ArrayObjectImp::construct): - * kjs/bool_object.cpp: - (KJS::BooleanPrototype::BooleanPrototype): - (KJS::booleanProtoFuncToString): - (KJS::BooleanObjectImp::BooleanObjectImp): - (KJS::BooleanObjectImp::construct): - * kjs/date_object.cpp: - (KJS::formatLocaleDate): - (KJS::DatePrototype::DatePrototype): - (KJS::DateObjectImp::DateObjectImp): - (KJS::DateObjectImp::construct): - (KJS::DateObjectImp::callAsFunction): - (KJS::DateObjectFuncImp::DateObjectFuncImp): - (KJS::DateObjectFuncImp::callAsFunction): - (KJS::dateProtoFuncToString): - (KJS::dateProtoFuncToUTCString): - (KJS::dateProtoFuncToDateString): - (KJS::dateProtoFuncToTimeString): - (KJS::dateProtoFuncToLocaleString): - (KJS::dateProtoFuncToLocaleDateString): - (KJS::dateProtoFuncToLocaleTimeString): - (KJS::dateProtoFuncValueOf): - (KJS::dateProtoFuncGetTime): - (KJS::dateProtoFuncGetFullYear): - (KJS::dateProtoFuncGetUTCFullYear): - (KJS::dateProtoFuncToGMTString): - (KJS::dateProtoFuncGetMonth): - (KJS::dateProtoFuncGetUTCMonth): - (KJS::dateProtoFuncGetDate): - (KJS::dateProtoFuncGetUTCDate): - (KJS::dateProtoFuncGetDay): - (KJS::dateProtoFuncGetUTCDay): - (KJS::dateProtoFuncGetHours): - (KJS::dateProtoFuncGetUTCHours): - (KJS::dateProtoFuncGetMinutes): - (KJS::dateProtoFuncGetUTCMinutes): - (KJS::dateProtoFuncGetSeconds): - (KJS::dateProtoFuncGetUTCSeconds): - (KJS::dateProtoFuncGetMilliSeconds): - (KJS::dateProtoFuncGetUTCMilliseconds): - (KJS::dateProtoFuncGetTimezoneOffset): - (KJS::dateProtoFuncSetTime): - (KJS::setNewValueFromTimeArgs): - (KJS::setNewValueFromDateArgs): - (KJS::dateProtoFuncSetYear): - (KJS::dateProtoFuncGetYear): - * kjs/error_object.cpp: - (KJS::ErrorPrototype::ErrorPrototype): - (KJS::errorProtoFuncToString): - (KJS::ErrorObjectImp::ErrorObjectImp): - (KJS::ErrorObjectImp::construct): - (KJS::NativeErrorPrototype::NativeErrorPrototype): - (KJS::NativeErrorImp::NativeErrorImp): - (KJS::NativeErrorImp::construct): - * kjs/function.cpp: - (KJS::FunctionImp::lengthGetter): - (KJS::FunctionImp::construct): - (KJS::Arguments::Arguments): - (KJS::ActivationImp::createArgumentsObject): - (KJS::encode): - (KJS::decode): - (KJS::globalFuncParseInt): - (KJS::globalFuncParseFloat): - (KJS::globalFuncEscape): - (KJS::globalFuncUnescape): - (KJS::PrototypeFunction::PrototypeFunction): - (KJS::PrototypeReflexiveFunction::PrototypeReflexiveFunction): - * kjs/function_object.cpp: - (KJS::FunctionPrototype::FunctionPrototype): - (KJS::functionProtoFuncToString): - (KJS::FunctionObjectImp::FunctionObjectImp): - (KJS::FunctionObjectImp::construct): - * kjs/internal.cpp: - (KJS::StringImp::toObject): - * kjs/internal.h: - (KJS::StringImp::StringImp): - (KJS::NumberImp::operator new): - * kjs/lookup.h: - (KJS::staticFunctionGetter): - (KJS::cacheGlobalObject): - * kjs/math_object.cpp: - (KJS::MathObjectImp::getValueProperty): - (KJS::mathProtoFuncAbs): - (KJS::mathProtoFuncACos): - (KJS::mathProtoFuncASin): - (KJS::mathProtoFuncATan): - (KJS::mathProtoFuncATan2): - (KJS::mathProtoFuncCeil): - (KJS::mathProtoFuncCos): - (KJS::mathProtoFuncExp): - (KJS::mathProtoFuncFloor): - (KJS::mathProtoFuncLog): - (KJS::mathProtoFuncMax): - (KJS::mathProtoFuncMin): - (KJS::mathProtoFuncPow): - (KJS::mathProtoFuncRandom): - (KJS::mathProtoFuncRound): - (KJS::mathProtoFuncSin): - (KJS::mathProtoFuncSqrt): - (KJS::mathProtoFuncTan): - * kjs/nodes.cpp: - (KJS::Node::handleException): - (KJS::NumberNode::evaluate): - (KJS::StringNode::evaluate): - (KJS::ArrayNode::evaluate): - (KJS::PostIncResolveNode::evaluate): - (KJS::PostIncLocalVarNode::evaluate): - (KJS::PostDecResolveNode::evaluate): - (KJS::PostDecLocalVarNode::evaluate): - (KJS::PostDecLocalVarNode::inlineEvaluateToNumber): - (KJS::PostIncBracketNode::evaluate): - (KJS::PostDecBracketNode::evaluate): - (KJS::PostIncDotNode::evaluate): - (KJS::PostDecDotNode::evaluate): - (KJS::typeStringForValue): - (KJS::LocalVarTypeOfNode::evaluate): - (KJS::TypeOfResolveNode::evaluate): - (KJS::TypeOfValueNode::evaluate): - (KJS::PreIncLocalVarNode::evaluate): - (KJS::PreIncResolveNode::evaluate): - (KJS::PreDecLocalVarNode::evaluate): - (KJS::PreDecResolveNode::evaluate): - (KJS::PreIncConstNode::evaluate): - (KJS::PreDecConstNode::evaluate): - (KJS::PostIncConstNode::evaluate): - (KJS::PostDecConstNode::evaluate): - (KJS::PreIncBracketNode::evaluate): - (KJS::PreDecBracketNode::evaluate): - (KJS::PreIncDotNode::evaluate): - (KJS::PreDecDotNode::evaluate): - (KJS::NegateNode::evaluate): - (KJS::BitwiseNotNode::evaluate): - (KJS::MultNode::evaluate): - (KJS::DivNode::evaluate): - (KJS::ModNode::evaluate): - (KJS::addSlowCase): - (KJS::add): - (KJS::AddNumbersNode::evaluate): - (KJS::AddStringsNode::evaluate): - (KJS::AddStringLeftNode::evaluate): - (KJS::AddStringRightNode::evaluate): - (KJS::SubNode::evaluate): - (KJS::LeftShiftNode::evaluate): - (KJS::RightShiftNode::evaluate): - (KJS::UnsignedRightShiftNode::evaluate): - (KJS::BitXOrNode::evaluate): - (KJS::BitOrNode::evaluate): - (KJS::valueForReadModifyAssignment): - (KJS::ForInNode::execute): - (KJS::TryNode::execute): - (KJS::FuncDeclNode::makeFunction): - (KJS::FuncExprNode::evaluate): - * kjs/number_object.cpp: - (KJS::NumberPrototype::NumberPrototype): - (KJS::numberProtoFuncToString): - (KJS::numberProtoFuncToLocaleString): - (KJS::numberProtoFuncToFixed): - (KJS::numberProtoFuncToExponential): - (KJS::numberProtoFuncToPrecision): - (KJS::NumberObjectImp::NumberObjectImp): - (KJS::NumberObjectImp::getValueProperty): - (KJS::NumberObjectImp::construct): - (KJS::NumberObjectImp::callAsFunction): - * kjs/object.cpp: - (KJS::JSObject::defineGetter): - (KJS::JSObject::defineSetter): - (KJS::JSObject::putDirect): - (KJS::Error::create): - * kjs/object.h: - * kjs/object_object.cpp: - (KJS::ObjectPrototype::ObjectPrototype): - (KJS::objectProtoFuncToLocaleString): - (KJS::objectProtoFuncToString): - (KJS::ObjectObjectImp::ObjectObjectImp): - (KJS::ObjectObjectImp::construct): - * kjs/regexp_object.cpp: - (KJS::RegExpPrototype::RegExpPrototype): - (KJS::regExpProtoFuncToString): - (KJS::RegExpImp::getValueProperty): - (KJS::RegExpObjectImp::RegExpObjectImp): - (KJS::RegExpObjectImp::arrayOfMatches): - (KJS::RegExpObjectImp::getBackref): - (KJS::RegExpObjectImp::getLastParen): - (KJS::RegExpObjectImp::getLeftContext): - (KJS::RegExpObjectImp::getRightContext): - (KJS::RegExpObjectImp::getValueProperty): - (KJS::RegExpObjectImp::createRegExpImp): - * kjs/regexp_object.h: - * kjs/string_object.cpp: - (KJS::StringInstance::StringInstance): - (KJS::StringInstance::lengthGetter): - (KJS::StringInstance::indexGetter): - (KJS::stringInstanceNumericPropertyGetter): - (KJS::StringPrototype::StringPrototype): - (KJS::replace): - (KJS::stringProtoFuncCharAt): - (KJS::stringProtoFuncCharCodeAt): - (KJS::stringProtoFuncConcat): - (KJS::stringProtoFuncIndexOf): - (KJS::stringProtoFuncLastIndexOf): - (KJS::stringProtoFuncMatch): - (KJS::stringProtoFuncSearch): - (KJS::stringProtoFuncReplace): - (KJS::stringProtoFuncSlice): - (KJS::stringProtoFuncSplit): - (KJS::stringProtoFuncSubstr): - (KJS::stringProtoFuncSubstring): - (KJS::stringProtoFuncToLowerCase): - (KJS::stringProtoFuncToUpperCase): - (KJS::stringProtoFuncToLocaleLowerCase): - (KJS::stringProtoFuncToLocaleUpperCase): - (KJS::stringProtoFuncLocaleCompare): - (KJS::stringProtoFuncBig): - (KJS::stringProtoFuncSmall): - (KJS::stringProtoFuncBlink): - (KJS::stringProtoFuncBold): - (KJS::stringProtoFuncFixed): - (KJS::stringProtoFuncItalics): - (KJS::stringProtoFuncStrike): - (KJS::stringProtoFuncSub): - (KJS::stringProtoFuncSup): - (KJS::stringProtoFuncFontcolor): - (KJS::stringProtoFuncFontsize): - (KJS::stringProtoFuncAnchor): - (KJS::stringProtoFuncLink): - (KJS::StringObjectImp::StringObjectImp): - (KJS::StringObjectImp::construct): - (KJS::StringObjectImp::callAsFunction): - (KJS::StringObjectFuncImp::StringObjectFuncImp): - (KJS::StringObjectFuncImp::callAsFunction): - * kjs/string_object.h: - (KJS::StringInstanceThatMasqueradesAsUndefined::StringInstanceThatMasqueradesAsUndefined): - * kjs/testkjs.cpp: - (GlobalObject::GlobalObject): - (functionGC): - (functionRun): - (functionReadline): - (kjsmain): - * kjs/ustring.h: - * kjs/value.cpp: - (KJS::JSCell::operator new): - (KJS::jsString): - (KJS::jsOwnedString): - (KJS::jsNumberCell): - * kjs/value.h: - (KJS::jsNaN): - (KJS::jsNumber): - (KJS::jsNumberFromAnd): - (KJS::JSCell::marked): - (KJS::JSCell::mark): - (KJS::JSValue::toJSNumber): - Removed collectOnMainThreadOnly, as this is the only way to collect now. Replaced calls to - static Collector methods with calls to per-thread Heap ones. - -2008-05-02 Dan Bernstein - - Reviewed by Maciej Stachowiak. - - - Mac build fix - - * wtf/StrHash.h: Added header guards and removed #include "config.h". - -2008-05-01 Ada Chan - - #include in identifier.cpp. - - Reviewed by Maciej. - - * kjs/identifier.cpp: - -2008-05-01 Steve Falkenburg - - Build fix. - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - -2008-05-01 Sam Weinig - - Fix build. - - * JavaScriptCore.xcodeproj/project.pbxproj: - -2008-05-01 Kevin McCullough - - Reviewed by Darin. - - JavaScript profiler (10928) - - Fix "sample" output so that it can be imported into Instruments - - Also keep track of number of times a function is profiled. - - * JavaScriptCore.xcodeproj/project.pbxproj: Add StrHash.h which needed - to be pulled out of identifier.cpp so that it could be used by the - profiler and identifiers. - * kjs/identifier.cpp: Ditto. - * profiler/FunctionCallProfile.cpp: - (KJS::FunctionCallProfile::printDataInspectorStyle): Inspector style - printing should show microseconds. - (KJS::FunctionCallProfile::printDataSampleStyle): Sample style printing - now counts the number of times a function is in the stack tree and does - not print microseconds since that does not make sense for a sampler. - * profiler/FunctionCallProfile.h: Keep track of number of times a - function is profiled. - (KJS::FunctionCallProfile::numberOfCalls): - * profiler/Profiler.cpp: - (KJS::functionNameCountPairComparator): Comparator for sort function in - printDataSampleStyle. - (KJS::Profiler::printDataSampleStyle): Print the number of times that a - function is listed in the stack tree in order of most times listed. - * wtf/HashCountedSet.h: Added copyToVector since it didn't exist and is - a more standard way to copy a HashSet to a Vector. I added on variant - that takes a pair as the Vector's type and so the HashCountedSet simply - fills in that pair with its internal pair, and another variant that - takes a Vector of the type of the HashCountedSet and only fills in the - Vector with the first element of the pair. - (WTF::copyToVector): - * wtf/StrHash.h: Added. - (WTF::): - -2008-04-29 David Kilzer - - BUILD FIX for ENABLE(DASHBOARD_SUPPORT) - - * wtf/Platform.h: Defined ENABLE(DASHBOARD_SUPPORT) to 1 only for - PLATFORM(MAC) and PLATFORM(WIN). Changed default to 0 for other - ports. - -2008-04-29 Greg Bolsinga - - Reviewed by Darin. - - Wrapped Dashboard code with ENABLE(DASHBOARD_SUPPORT) - - * wtf/Platform.h: - -2008-04-29 Kevin McCullough - - Reviewed by Geoff. - - - JavaScript profiler (10928) - -Keep call count. - - * profiler/FunctionCallProfile.cpp: - (KJS::FunctionCallProfile::FunctionCallProfile): - (KJS::FunctionCallProfile::didExecute): Implements call count and fixed a bug where a stackIndex - of 0 was causing the assert to be hit. - (KJS::FunctionCallProfile::stopProfiling): - (KJS::FunctionCallProfile::endAndRecordCall): - * profiler/FunctionCallProfile.h: - -2008-04-29 Simon Hausmann - - Qt/Windows build fix. The externally declared hash tables are actually - declared const and the const is mangled in the symbol name, so when - importing they also need to be marked const. - - When compiling without MULTIPLE_THREADS use a const HashTable& - instead of a HashTable& in ThreadClassInfoHashTables to avoid - initializing the latter with a const reference. - - * kjs/JSGlobalObject.cpp: - -2008-04-28 Alexey Proskuryakov - - Windows build fix. - - * kjs/ExecState.h: For whatever reason, MSVC couldn't generate a default constructor for - a struct that had a "const List" member. Removing the const qulifier makes the problem go away. - -2008-04-28 Alexey Proskuryakov - - Reviewed by Darin. - - Fix run-webkit-tests --threading - and provisionally fix - Proxy server issue in Sunday's Nightly - - Changed ClassInfo objects for built-in objects to hold a getter function returning - a per-thread instance. This makes it safe to share these ClassInfo objects between threads - - and these are the only ones that need to be shared. - - * kjs/lexer.cpp: - (KJS::Lexer::Lexer): - (KJS::Lexer::~Lexer): - * kjs/lexer.h: - Made mainTable a member of Lexer, so that it no longer needs to be shared between threads. - - * kjs/object.cpp: - (KJS::JSObject::deleteProperty): - (KJS::JSObject::findPropertyHashEntry): - (KJS::JSObject::propertyIsEnumerable): - (KJS::JSObject::getPropertyAttributes): - (KJS::JSObject::getPropertyNames): - * kjs/object.h: - (KJS::ClassInfo::propHashTable): - Added a new classPropHashTableGetterFunction field to ClassInfo. If it is non-zero, the - static table is not used. - - * kjs/JSGlobalObject.cpp: - (KJS::ThreadClassInfoHashTables::ThreadClassInfoHashTables): This new class holds per-thread - HashTables for built-in classes. The old static structs are copied to create per-thread - instances. - (KJS::JSGlobalObject::threadClassInfoHashTables): An accessor/initializer for the above. - (KJS::JSGlobalObject::init): Copy per-thread data into a single structure for faster access. - Also, construct globalExec. - (KJS::JSGlobalObject::reset): Adapted for globalExec now being an OwnPtr. - (KJS::JSGlobalObject::mark): Ditto. - (KJS::JSGlobalObject::globalExec): Ditto. - * kjs/JSGlobalObject.h: - (KJS::JSGlobalObject::JSGlobalObjectData::JSGlobalObjectData): Made JSGlobalObject::JSGlobalObjectData::globalExec an OwnPtr, so that it can - be initialized from JSGlobalObject::init() after them. Otherwise, ExecState constructor was - trying to access half-initialized JSGlobalObject to make its own copy of these table - references, and failed. - (KJS::JSGlobalObject::JSGlobalObject): Pass "this" value to init() to create globalExec. - (KJS::JSGlobalObject::perThreadData): An accessor for per-thread data. - - * kjs/ExecState.cpp: - (KJS::ExecState::ExecState): - * kjs/ExecState.h: - (KJS::ExecState::propertyNames): - (KJS::ExecState::emptyList): - (KJS::ExecState::arrayTable): - (KJS::ExecState::dateTable): - (KJS::ExecState::mathTable): - (KJS::ExecState::numberTable): - (KJS::ExecState::RegExpImpTable): - (KJS::ExecState::RegExpObjectImpTable): - (KJS::ExecState::stringTable): - * kjs/ExecStateInlines.h: - (KJS::ExecState::ExecState): - Each ExecState holds its own reference to per-thread data, for even faster access. Moved - m_emptyList and m_propertyNames to the same structure, making ExecState faster to construct - and take less space on the stack. - - * kjs/InitializeThreading.cpp: (KJS::initializeThreading): Initialize thread-static data - added to JSGlobalObject. - - * API/JSCallbackConstructor.cpp: - * API/JSCallbackFunction.cpp: - * API/JSCallbackObject.cpp: - * JavaScriptCore.exp: - * kjs/JSVariableObject.cpp: - (KJS::JSVariableObject::getPropertyAttributes): - * kjs/JSVariableObject.h: - * kjs/array_instance.cpp: - * kjs/array_object.cpp: - (KJS::ArrayPrototype::getOwnPropertySlot): - * kjs/bool_object.cpp: - * kjs/create_hash_table: - * kjs/date_object.cpp: - (KJS::DatePrototype::getOwnPropertySlot): - (KJS::DateObjectImp::DateObjectImp): - * kjs/error_object.cpp: - * kjs/function.cpp: - * kjs/function_object.cpp: - (KJS::FunctionPrototype::FunctionPrototype): - * kjs/internal.cpp: - * kjs/lookup.h: - * kjs/math_object.cpp: - (KJS::MathObjectImp::getOwnPropertySlot): - * kjs/number_object.cpp: - (KJS::NumberObjectImp::getOwnPropertySlot): - * kjs/object_object.cpp: - (KJS::ObjectPrototype::ObjectPrototype): - * kjs/regexp_object.cpp: - (KJS::RegExpPrototype::RegExpPrototype): - (KJS::RegExpImp::getOwnPropertySlot): - (KJS::RegExpImp::put): - (KJS::RegExpObjectImp::getOwnPropertySlot): - (KJS::RegExpObjectImp::put): - * kjs/string_object.cpp: - (KJS::StringPrototype::getOwnPropertySlot): - Adjust for the above changes. - -2008-04-28 Darin Adler - - Reviewed by Adam. - - - make sure RefPtr's default hash doesn't ref/deref when computing the hash - - remove remnants of the hash table storage type optimization - - * wtf/HashFunctions.h: Used "using" to get the hash and equal functions - from PtrHash into PtrHash>. - - * wtf/HashMap.h: Replaced uses of PairBaseHashTraits with PairHashTraits. - Eliminated storage-related typedefs. Removed constructor, destructor, - copy constructor, and destructor since the compiler-generated ones are - fine. Removed refAll and derefAll. Took out unnnecessary typecasts. - Removed use of RefCounter. - - * wtf/HashSet.h: Eliminated storage-related typedefs. Removed constructor, - destructor, copy constructor, and destructor since the compiler-generated - ones are fine. Removed refAll and derefAll. Removed unneeded template - arguents from HashSetTranslatorAdapter. Eliminated unneeded HashSetTranslator - template. - - * wtf/HashTable.h: Tweaked formatting. Removed NeedsRef, RefCounterBase, - RefCounter, HashTableRefCounterBase, HashTableRefCounter, and Assigner - class templates. - - * wtf/HashTraits.h: Removed StorageTraits, needsRef, PairBaseHashTraits, - and HashKeyStorageTraits. - - * wtf/RefPtrHashMap.h: Made all the same fixes as in HashMap. Also made - the corresponding changes to RefPtrHashMapRawKeyTranslator. - -2008-04-28 Darin Adler - - Reviewed by Mitz. - - - fix assertion hit every time you view www.apple.com - - * kjs/PropertyNameArray.cpp: - (KJS::PropertyNameArray::add): Changed assertion to allow null and empty strings. - Now to find out why we have a property named "" and if that's a bug! - -2008-04-27 Mark Rowe - - Reviewed by Maciej Stachowiak. - - Fix crash inside PtrHash::hash when loading a page. - - * wtf/HashFunctions.h: Explicitly use the superclass implementation of hash to avoid infinite recursion. - -2008-04-27 Darin Adler - - Reviewed by Maciej. - - - fix REGRESSION: JavaScriptCore no longer builds with - GCC 4.2 due to pointer aliasing warnings - - Fix this by removing the HashTable optimizations that allowed us to share a back end - implementation between hash tables with integers, pointers, RefPtr, and String objects - as keys. The way it worked was incompatible with strict aliasing. - - This increases code size. On Mac OS X we'll have to regenerate .order files to avoid - slowing down Safari startup times. - - This creates a slight slowdown in SunSpider, mitigated by the following four speedups: - - - speed up array put slightly by moving a branch (was already done for get) - - - speed up symbol table access by adding a function named inlineGet to HashMap - and using that in symbolTableGet/Put - - - speed up PropertyNameArray creation by reducing the amount of reference count - churn and uniqueness checking when adding names and not doing any allocation at - all when building small arrays - - - speed up conversion of strings to floating point numbers by eliminating the - malloc/free of the buffer for the ASCII copy of the string; a way to make - things even faster would be to change strtod to take a UTF-16 string - - Note that there is considerable unused complexity now in HashSet/Map/Table to support - "storage types", which is no longer used. Will do in a separate patch. - - * API/JSCallbackObjectFunctions.h: - (KJS::JSCallbackObject::getPropertyNames): Removed explicit cast to Identifier to - take advantage of the new PropertyNameArray::add overload and avoid reference count churn. - * API/JSObjectRef.cpp: - (JSPropertyNameAccumulatorAddName): Ditto. - * JavaScriptCore.exp: Updated PropertyNameArray::add entry point name. - - * kjs/JSVariableObject.cpp: Removed now-unneeded IdentifierRepHashTraits::nullRepPtr - definition (see below). - (KJS::JSVariableObject::getPropertyNames): Removed explicit cast to Identifier. - - * kjs/JSVariableObject.h: - (KJS::JSVariableObject::symbolTableGet): Use inlineGet for speed. Also changed to do - early exit instead of nesting the body inside an if. - (KJS::JSVariableObject::symbolTablePut): Ditto. - - * kjs/PropertyNameArray.cpp: - (KJS::PropertyNameArray::add): Changed implementation to take a raw pointer instead of - a reference to an identifier. Do uniqueness checking by searching the vector when the - vector is short, only building the set once the vector is large enough. - - * kjs/PropertyNameArray.h: Added an overload of add for a raw pointer, and made the old - add function call that one. Added an addKnownUnique function for use when the new - name is known to be different from any other in the array. Changed the vector to have - an inline capacity of 20. - - * kjs/SymbolTable.h: Changed IdentifierRepHash to inherit from the default hash for - a RefPtr so we don't have to define so much. Added an overload of the hash function for - a raw pointer as required by the new RefPtrHashMap. Got rid of the now-unneeded - IdentifierRepHashTraits -- the default traits now work fine. Added a definition of - empthValueIsZero to SymbolTableIndexHashTraits; not having it was incorrect, but harmless. - - * kjs/array_instance.cpp: - (KJS::ArrayInstance::put): Move the maxArrayIndex check inside the branch that checks - the index against the length, as done in the get function. - - * kjs/function.cpp: - (KJS::globalFuncKJSPrint): Changed to use the new getCString instead of cstring. - - * kjs/internal.cpp: Removed printInfo debugging function, a client of cstring. - If we need a debugging function we can easily make a better one and we haven't - used this one in a long time. - * kjs/internal.h: Ditto. - - * kjs/object.cpp: - (KJS::JSObject::getPropertyNames): Removed explicit cast to Identifier. - * kjs/property_map.cpp: - (KJS::PropertyMap::getEnumerablePropertyNames): Ditto. Also added a special case for - the case where the propertyNames array is empty -- in that case we know we're adding - a set of names that are non-overlapping so we can use addKnownUnique. - * kjs/ustring.cpp: - (KJS::UString::getCString): Replaces cstring. Puts the C string into a CStringBuffer, - which is a char Vector with an inline capacity. Also returns a boolean to indicate if - the converion was lossy, which eliminates the need for a separate is8Bit call. - (KJS::UString::toDouble): Changed to call getCString instead of cstring. - * kjs/ustring.h: Ditto. - - * wtf/HashFunctions.h: Overload the hash and equal functions for RefPtr's default - hash to take raw pointers. This works with the changes to RefPtrHashMap to avoid - introducing refcount churn. - - * wtf/HashMap.h: Removed special code to convert the deleted value to the empty value - when writing a new value into the map. This is now handled elsewhere. - (WTF::HashMap::get): Removed code that checks for an empty hash table before calling - HashTable::lookup; it's slightly more efficient to do this check inside lookup. - - * wtf/HashTable.h: - (WTF::HashTable::isDeletedBucket): Changed to use isDeletedValue instead of using - deletedValue and the equality operator. - (WTF::HashTable::deleteBucket): Changed to use constructDeletedValue instead of - using deletedValue and the assignment operator. - (WTF::HashTable::checkKey): Added. Factors out the check for values that are empty - or deleted keys that's used in various functions below. - (WTF::HashTable::lookup): Changed to use checkKey, check for a 0 table, and also - made public for use by RefPtrHashMap. - (WTF::HashTable::lookupForWriting): Changed to use checkKey. - (WTF::HashTable::fullLookupForWriting): Changed to use checkKey. - (WTF::HashTable::add): Changed to use checkKey, and call initializeBucket on a - deleted bucket before putting a new entry into it. - (WTF::HashTable::addPassingHashCode): Ditto. - (WTF::HashTable::deallocateTable): Check isDeletedBucket before calling ~ValueType. - - * wtf/HashTraits.h: Got ridd of all the HashTraits specialization for the integer - types, since GeneicHashTraitsBase already deals with integers separately. Put the - deleted value support into GenericHashTraitsBase. Changed FloatHashTraits to - inherit from GenericHashTraits, and define construct/isDeletedValue rather than - deletedValue. Removed the ref and deref functions from RefPtr's HashTraits, and - defined construct/isDeletedValue. Eliminated DeletedValueAssigner. Changed - PairHashTraits to define construct/isDeletedValue, and also merged - PairBaseHashTraits in with PairHashTraits. Got rid of all specialization of - HashKeyStorageTraits. We'll remove that, and the needsRef data member, later. - - * wtf/RefPtr.h: Added HashTableDeletedValueType, an enum type with a single value, - HashTableDeletedValue. Used that type to make a new constructor to construct - deleted values and also added an isHashTableDeletedValue function. - - * wtf/RefPtrHashMap.h: Added RefPtrHashMapRawKeyTranslator and used it to implement - the raw pointer functions. This is a way to continue to avoid refcount thrash. We - can't use the old way because it depended on the underlying map using a non-RefPtr - type. - (WTF::HashMap::find): Use find with RefPtrHashMapRawKeyTranslator. - (WTF::HashMap::contains): Use contains with RefPtrHashMapRawKeyTranslator. - (WTF::HashMap::inlineAdd): Use add with RefPtrHashMapRawKeyTranslator. - (WTF::HashMap::get): Removed code that checks for an empty hash table before calling - HashTable::lookup; it's slightly more efficient to do this check inside lookup. - (WTF::HashMap::inlineGet): Added. Just like get, but marked inline for use in the - symbol table code. - -2008-04-25 Sam Weinig - - Rubber-stamped by Mark Rowe. - - Remove SavedBuiltins and SavedProperties classes and the methods used to - save data to them. The CachedPage now stores a the JSGlobalObject in full. - - * JavaScriptCore.exp: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - * kjs/JSGlobalObject.cpp: - * kjs/JSGlobalObject.h: - * kjs/JSVariableObject.cpp: - * kjs/JSVariableObject.h: - (KJS::JSVariableObject::localStorage): - * kjs/SavedBuiltins.h: Removed. - * kjs/object.h: - * kjs/property_map.cpp: - * kjs/property_map.h: - -2008-04-25 Mark Rowe - - Rubber-stamped by Sam Weinig. - - Add some content to an empty ICU header file to prevent verification errors. - - * icu/unicode/utf_old.h: - -2008-04-25 David Kilzer - - REGRESSION: Wrong line number passed to -willLeaveCallFrame - - Patch by George Dicker and Michael Kahl. Reviewed by Darin. - - When -[NSObject(WebScriptDebugDelegate) webView:willLeaveCallFrame:sourceId:line:forWebFrame:] - is invoked, the first line number of the function is returned instead of the last - line number. This regressed in r28458. - - * kjs/nodes.cpp: - (KJS::FunctionBodyNodeWithDebuggerHooks::execute): Pass lastLine() instead of lineNo() - when calling Debugger::returnEvent(). - -2008-04-25 Darin Adler - - Done with Stephanie Lewis. - - * JavaScriptCore.xcodeproj/project.pbxproj: Prepare for compilation with gcc 4.2 by - adding -fno-strict-aliasing to CollatorICU.cpp. - -2008-04-24 Sam Weinig - - Reviewed by Geoffrey Garen. - - Add a #define to easily enable collecting on every allocation to aid - debugging GC bugs. - - * kjs/collector.cpp: - (KJS::Collector::heapAllocate): - -2008-04-24 Kevin McCullough - - Reviewed by Adam and Sam. - - - JavaScript profiler (10928) - -Only profile the page group that starts profiling to avoid profiling - tools that shouldn't be profiled unless explicitly requested to. - - * JavaScriptCore.exp: Export new signature. - * kjs/JSGlobalObject.cpp: Add unique identifiers to the JSGlobalObject. - (KJS::JSGlobalObject::init): - * kjs/JSGlobalObject.h: Ditto. - (KJS::JSGlobalObject::setPageGroupIdentifier): - (KJS::JSGlobalObject::pageGroupIdentifier): - * profiler/Profiler.cpp: Check the identifier of the page group of the - lexical global exec state and only profile if it matches the given page - group identifier. - (KJS::Profiler::startProfiling): - (KJS::Profiler::willExecute): - (KJS::Profiler::didExecute): - * profiler/Profiler.h: Ditto. - (KJS::Profiler::Profiler): - -2008-04-24 Julien Chaffraix - - Reviewed by Simon. - - Bug 15940: Implement threading API for Qt - https://bugs.webkit.org/show_bug.cgi?id=15940 - - Original patch by Justin Haygood, tweaked by me. - - * JavaScriptCore.pri: - * wtf/ThreadingQt.cpp: Added. - (WTF::threadMapMutex): - (WTF::threadMap): - (WTF::establishIdentifierForThread): - (WTF::clearThreadForIdentifier): - (WTF::threadForIdentifier): - (WTF::initializeThreading): - (WTF::ThreadPrivate::getReturnValue): - (WTF::ThreadPrivate::ThreadPrivate): - (WTF::ThreadPrivate::run): - (WTF::createThread): - (WTF::waitForThreadCompletion): return !res to return - 0 on success (to match the pthreads implementation). - (WTF::detachThread): - (WTF::identifierByQthreadHandle): - (WTF::currentThread): - (WTF::Mutex::Mutex): - (WTF::Mutex::~Mutex): - (WTF::Mutex::lock): - (WTF::Mutex::tryLock): - (WTF::Mutex::unlock): - (WTF::ThreadCondition::ThreadCondition): - (WTF::ThreadCondition::~ThreadCondition): - (WTF::ThreadCondition::wait): - (WTF::ThreadCondition::timedWait): - (WTF::ThreadCondition::signal): - -2008-04-22 Darin Adler - - Reviewed by Anders. - - - simplify use of HashTraits to prepare for some upcoming hash table changes - - * kjs/SymbolTable.h: Made SymbolTableIndexHashTraits derive from HashTraits - and specialize only the empty value. - -2008-04-23 Holger Hans Peter Freyther - - Reviewed by Simon. - - Removed the #define for USE_SYSTEM_MALLOC that we set in WebKit.pri - already. - - * wtf/Platform.h: - -2008-04-21 Kevin McCullough - - Reviewed by Adam. - - JavaScript profiler (10928) - - When stop profiling is called we need to stop the timers on all the - functions that are still running. - - * profiler/FunctionCallProfile.cpp: - (KJS::FunctionCallProfile::didExecute): - (KJS::FunctionCallProfile::stopProfiling): - * profiler/FunctionCallProfile.h: - * profiler/Profiler.cpp: - (KJS::Profiler::stopProfiling): - -2008-04-21 Alexey Proskuryakov - - Reviewed by Darin. - - Move collector main thread initialization from WebKit/win to KJS::initializeThreading. - - * kjs/InitializeThreading.cpp: - (KJS::initializeThreading): - -2008-04-21 Adam Roben - - MSVC build fix - - Reviewed by Alexey Proskuryakov. - - * kjs/ustring.h: - (KJS::UString::cost): Disable a warning about assigning a 32-bit - size_t into a 31-bit size_t. - -2008-04-21 Simon Hausmann - - Reviewed by Lars. - - Made convertValueToQVariant accessible from within WebKit/qt/Api - - * bindings/qt/qt_runtime.h: - -2008-04-21 Holger Hans Peter Freyther - - Reviewed by Simon. - - Build fix for Qt 4.3 - - * When building WebCore/internal make sure the QT_[BEGIN,END]_NAMESPACE is - always defined. Do this by adding defines to the compiler line - * For users of our API this is not feasible. Every public header file should - include qwebkitglobal.h. Define the QT_BEGIN_NAMESPACE and QT_END_NAMESPACE - when we are building everything < 4.4.0 and don't have them defined. - - * kjs/testkjs.pro: - -2008-04-19 Matt Lilek - - Not reviewed, Windows build fix - copy the profiler headers in all - configurations, not just Debug_Internal. - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - -2008-04-19 Mike Hommey - - Reviewed by Alp Toker. - - Don't build testkjs with rpath. - - * GNUmakefile.am: - -2008-04-18 Kevin Ollivier - - wx build fixes. Rename LocalStorage.h to LocalStorageEntry.h - to avoid header detection issues between WebCore/storage/LocalStorage.h - and it, and add $(PROFILER_SOURCES) to the wx JSCore build. - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - * jscore.bkl: - * kjs/ExecState.h: - * kjs/JSVariableObject.h: - * kjs/LocalStorage.h: Removed. - * kjs/LocalStorageEntry.h: Copied from JavaScriptCore/kjs/LocalStorage.h. - * kjs/function.h: - -2008-04-18 Jan Michael Alonzo - - Reviewed by Alp Toker. - - http://bugs.webkit.org/show_bug.cgi?id=16620 - [GTK] Autotools make dist and make check support - - Cleanups. - - * GNUmakefile.am: - -2008-04-18 Jon Honeycutt - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Windows - build fix. - -2008-04-11 Mark Rowe - - Rubber-stamped by Antti Koivisto. - - Silence GCC 4.3 warnings by removing extraneous consts. - - * kjs/ustring.cpp: - * kjs/ustring.h: - -2008-04-18 Kevin McCullough - - Reviewed by Sam. - - - JavaScript profiler (10928) - - Use Deque instead of Vector since the profiler uses prepend a lot - and deque is faster at that. - - * profiler/FunctionCallProfile.h: - (KJS::FunctionCallProfile::milliSecs): Corrected the name to match - its output. - * wtf/Deque.h: - (WTF::deleteAllValues): - -2008-04-18 Kevin McCullough - - Reviewed by Sam and Adam. - - - JavaScript profiler (10928) - - Cleaned up the header file and made some functions static, added - a new, sane, printing function, and fixed a few minor bugs. - - * JavaScriptCore.exp: - * JavaScriptCore.xcodeproj/project.pbxproj: - * profiler/FunctionCallProfile.cpp: - (KJS::FunctionCallProfile::didExecute): Removed assertion that time is - > 0 because at ms resolution that may not be true and only cross- - platform way to get time differences is in ms. - (KJS::FunctionCallProfile::printDataInspectorStyle): Added a new - printing function for dumping data in a sane style. - (KJS::FunctionCallProfile::printDataSampleStyle): Fixed a bug where we - displayed too much precision when printing our floats. Also added logic - to make sure we don't display 0 because that doesn't make sense for a - sampling profile. - * profiler/FunctionCallProfile.h: - * profiler/Profiler.cpp: Moved functions that could be static into the - implementation, and chaned the ASSERTs to early returns. I did this - because console.profile() is a JS function and so was being profiled - but asserting because the profiler had not been started! In the future - I would like to put the ASSERTs back and not profile the calls to - console.profile() and console.profileEnd(). - (KJS::Profiler::willExecute): - (KJS::Profiler::didExecute): - (KJS::getStackNames): Fixed a bug where the wrong ExecState was being - used. - (KJS::getFunctionName): - (KJS::Profiler::printDataInspectorStyle): - * profiler/Profiler.h: - -2008-04-18 Alexey Proskuryakov - - Reviewed by Darin. - - Fix leaks during plugin tests (which actually excercise background JS), and potential - PAC brokenness that was not reported, but very likely. - - The leaks shadowed a bigger problem with Identifier destruction. Identifier::remove involves - an IdentifierTable lookup, which is now a per-thread instance. Since garbage collection can - currently happen on a different thread than allocation, a wrong table was used. - - No measurable change on SunSpider total, ~1% variation on individual tests. - - * kjs/ustring.cpp: - (KJS::UString::Rep::create): - (KJS::UString::Rep::destroy): - * kjs/ustring.h: - Replaced isIdentifier with a pointer to IdentifierTable, so that destruction can be done - correctly. Took one bit from reportedCost, to avoid making UString::Rep larger (performance - effect was measurable on SunSpider). - - * kjs/identifier.cpp: - (KJS::IdentifierTable::IdentifierTable): - (KJS::IdentifierTable::~IdentifierTable): - (KJS::IdentifierTable::add): - (KJS::IdentifierTable::remove): - Make IdentifierTable a real class. Its destructor needs to zero out outstanding references, - because some identifiers may briefly outlive it during thread destruction, and we don't want - them to use their stale pointers. - - (KJS::LiteralIdentifierTable): - (KJS::Identifier::add): - Now that LiteralIdentifierTable is per-thread and can be destroyed not just during application - shutdown, it is not appropriate to simply bump refcount for strings that get there; changed - the table to hold RefPtrs. - - (KJS::CStringTranslator::translate): - (KJS::UCharBufferTranslator::translate): - (KJS::Identifier::addSlowCase): - (KJS::Identifier::remove): - * kjs/identifier.h: - (KJS::Identifier::add): - Use and update UString::Rep::identifierTable as appropriate. Updating it is now done in - IdentifierTable::add, not in translators. - -2008-04-18 Alexey Proskuryakov - - Reviewed by Darin. - - Get rid of static compareWithCompareFunctionArguments in array_instance.cpp. - - No change on SunSpider, CelticKane or iBench JavaScript. It is probable that in some cases, - merge sort is still faster, but more investigation is needed to determine a new cutoff. - Or possibly, it would be better to do what FIXME says (change to tree sort). - - Also, made arguments a local variable - not sure why it was a member of - CompareWithCompareFunctionArguments. - - * kjs/array_instance.cpp: - (KJS::CompareWithCompareFunctionArguments::CompareWithCompareFunctionArguments): - (KJS::CompareWithCompareFunctionArguments::operator()): - (KJS::ArrayInstance::sort): - -2008-04-18 Simon Hausmann - - Build fix for gcc 4.3. Include stdio.h for printf. - - * profiler/FunctionCallProfile.cpp: - * profiler/Profiler.cpp: - -2008-04-17 Jon Honeycutt - - Reviewed by mrowe. - - * wtf/Platform.h: Add HAVE_ACCESSIBILITY to Platform.h. - -2008-04-17 Alexey Proskuryakov - - Reviewed by Maciej. - - Thread static data destructors are not guaranteed to be called in any particular order; - turn ThreadSpecific into a phoenix-style singleton to avoid accessing freed memory when - deleted objects are interdependent (e.g. CommonIdentifiers and internal identifier tables). - - No change on SunSpider. - - * wtf/ThreadSpecific.h: - (WTF::ThreadSpecific::Data::Data): - (WTF::::get): - (WTF::::set): - (WTF::::destroy): - -2008-04-15 Srinivas Rao. M Hamse - - Reviewed by Maciej Stachowiak. - - - gcc 3.x build fix - - * kjs/nodes.h: CallerType definition made public for gcc 3.x compilation - -2008-04-16 Brady Eidson - - Reviewed by Sam Weinig - - Change ThreadSafeShared to act like RefCounted by starting out with a single ref by default - - * wtf/Threading.h: - (WTF::ThreadSafeShared::ThreadSafeShared): - -2008-04-16 Sam Weinig - - Reviewed by Geoffrey Garen. - - - To keep the behavior of the WebKit and JavaScriptCore API's the same, - we need to hide the fact that the global object and the window object - are no longer the same thing, and the the global object now changes on - navigations. To do this, only the wrapper should ever be exposed. This - fixes the two remaining spots where the internal global object is exposed, - the windowScriptObject returned from [WebFrame windowObject] and the object - return by calling JSContextGetGlobalObject on [WebFrame globalContext]. - - * API/JSContextRef.cpp: - (JSContextGetGlobalObject): - This is a bit of a hack, this returns the "this" representation of the globalObject - which will be the WrapperWindow for WebCore and the globalObject for non-WebCore. - - * API/JSObjectRef.cpp: - (JSObjectSetProperty): - Call the new putWithAttributes method instead of relying on lower-level calls. - This is needed so that the window wrapper can forward the calls. - - * JavaScriptCore.exp: - * kjs/Activation.h: - * kjs/JSGlobalObject.cpp: - (KJS::JSGlobalObject::putWithAttributes): - * kjs/JSGlobalObject.h: - * kjs/JSVariableObject.h: - (KJS::JSVariableObject::symbolTablePutWithAttributes): - * kjs/function.cpp: - (KJS::ActivationImp::putWithAttributes): - * kjs/nodes.cpp: - (KJS::ConstDeclNode::handleSlowCase): - (KJS::ConstDeclNode::evaluateSingle): - (KJS::EvalNode::processDeclarations): - * kjs/object.cpp: - (KJS::JSObject::putWithAttributes): - * kjs/object.h: - Rename initializeVariable to putWithAttributes and move it down to JSObject so it - can be used for JSObjectSetProperty. - -2008-04-16 Kevin McCullough - - Reviewed by Sam and Geoff. - - - JavaScript profiler (10928) - Inital profiler prototype - - * GNUmakefile.am: Added new files to project - * JavaScriptCore.pri: Ditto - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Ditto - * JavaScriptCore.xcodeproj/project.pbxproj: Ditto - * JavaScriptCoreSources.bkl: Ditto - * kjs/config.h: Put compiling flag in here. - * kjs/function.cpp: Instrument calling the function eval(). - (KJS::eval): - * kjs/interpreter.cpp: Instrument evaluating global scopes. - (KJS::Interpreter::evaluate): - * kjs/object.cpp: Instrument JS function calls. - (KJS::JSObject::call): - * profiler: Added. - * profiler/FunctionCallProfile.cpp: Added. - (KJS::FunctionCallProfile::FunctionCallProfile): - (KJS::FunctionCallProfile::~FunctionCallProfile): - (KJS::FunctionCallProfile::willExecute): Call right before the JS function or executing context is executed to start the profiler's timer. - (KJS::FunctionCallProfile::didExecute): Call right after the JS function or executing context is executed to stop the profiler's timer. - (KJS::FunctionCallProfile::addChild): Add a child to the current FunctionCallProfile if it isn't already a child of the current FunctionalCallProfile. - (KJS::FunctionCallProfile::findChild): Return the child that matches the given name if there is one. - (KJS::FunctionCallProfile::printDataSampleStyle): Print the current profiled information in a format that matches sample's output. - * profiler/FunctionCallProfile.h: Added. - (KJS::FunctionCallProfile::FunctionCallProfile): - (KJS::FunctionCallProfile::~FunctionCallProfile): - (KJS::FunctionCallProfile::functionName): - (KJS::FunctionCallProfile::microSecs): - * profiler/Profiler.cpp: Added. - (KJS::Profiler::profiler): - (KJS::Profiler::sharedProfiler): Return global singleton (may change due to multi-threading concerns) - (KJS::Profiler::startProfiling): Don't start collecting profiling information until the user starts the profiler. Also don't clear old prfiled data until the profiler is restarted. - (KJS::Profiler::stopProfiling): Stop collecting profile information. - (KJS::Profiler::willExecute): Same as above. - (KJS::Profiler::didExecute): Same as above. - (KJS::Profiler::insertStackNamesInTree): Follow the stack of the given names and if a sub-stack is not in the current tree, add it. - (KJS::Profiler::getStackNames): Get the names from the different passed in parameters and order them as a stack. - (KJS::Profiler::getFunctionName): Get the function name from the given parameter. - (KJS::Profiler::printDataSampleStyle): Print the current profiled information in a format that matches sample's output. - (KJS::Profiler::debugLog): - * profiler/Profiler.h: Added. - (KJS::Profiler::Profiler): - -2008-04-16 Sam Weinig - - Reviewed by Darin Adler. - - - Remove kjs_ prefix from strtod, dtoa, and freedtoa and put it - in the KJS namespace. - - Make strtod, dtoa, and freedtoa c++ functions instead of extern "C". - - Remove mode switching from dtoa. ~2% improvement on test 26. - - Removes all unnecessary #defines from dtoa code. - - * JavaScriptCore.exp: - * kjs/dtoa.cpp: - (KJS::ulp): - (KJS::b2d): - (KJS::d2b): - (KJS::ratio): - (KJS::strtod): - (KJS::freedtoa): - (KJS::dtoa): - * kjs/dtoa.h: - * kjs/function.cpp: - (KJS::parseInt): - * kjs/lexer.cpp: - (KJS::Lexer::lex): - * kjs/number_object.cpp: - (KJS::integer_part_noexp): - (KJS::numberProtoFuncToExponential): - * kjs/ustring.cpp: - (KJS::UString::from): - (KJS::UString::toDouble): - -2008-04-16 Alexey Proskuryakov - - Reviewed by Darin. - - Get rid of static execForCompareByStringForQSort in array_instance.cpp. - - No change on SunSpider, CelticKane or iBench JavaScript. - - * kjs/array_instance.cpp: - (KJS::ArraySortComparator::ArraySortComparator): - (KJS::ArraySortComparator::operator()): - (KJS::ArrayInstance::sort): - Switch slow case to std::sort, so that ExecState can be passed in a comparator. - -2008-04-16 Alexey Proskuryakov - - Reviewed by Adam Roben. - - MSVC build fix. - - * kjs/CommonIdentifiers.cpp: - * kjs/CommonIdentifiers.h: - * kjs/Parser.cpp: - * kjs/Parser.h: - * kjs/identifier.cpp: - * kjs/lexer.h: - * wtf/ThreadSpecific.h: - -2008-04-16 Alexey Proskuryakov - - Build fix. - - * kjs/date_object.cpp: - * kjs/date_object.h: - Don't include DateMath.h from date_object.h, as the latter is used from WebCore, while - where the former is not available. - -2008-04-16 Holger Hans Peter Freyther - - Unreviewed build fix for MSVC. It does not want to have - WTF in the KJS namespace. - - * kjs/CommonIdentifiers.h: - -2008-04-16 Holger Hans Peter Freyther - - Unreviewed build fix for gcc. - - ::msToGregorianDateTime is not known to it. - - * kjs/date_object.cpp: - (KJS::DateInstance::msToGregorianDateTime): - -2008-04-16 Alexey Proskuryakov - - Reviewed by Oliver Hunt. - - Initialize threadMapMutex safely (as already done in ThreadingWin). - - * wtf/ThreadingGtk.cpp: - (WTF::threadMapMutex): - (WTF::initializeThreading): - * wtf/ThreadingPthreads.cpp: - (WTF::threadMapMutex): - (WTF::initializeThreading): - -2008-04-16 Alexey Proskuryakov - - Reviewed by Adam Roben. - - Cache Gregorian date/time structure on DateInstance objects for 1.027x SunSpider speedup - (1.65x on date-format-xparb, 1.13x on date-format-tofte). - - * kjs/DateMath.h: - (KJS::GregorianDateTime::copyFrom): Added. It presumably makes sense to keep GregorianDateTime - Noncopyable, so it's not just operator=. - - * kjs/date_object.h: Added a per-object cache. - - * kjs/date_object.cpp: - (KJS::DateInstance::DateInstance): - (KJS::DateInstance::msToGregorianDateTime): - (KJS::dateProtoFuncToString): - (KJS::dateProtoFuncToUTCString): - (KJS::dateProtoFuncToDateString): - (KJS::dateProtoFuncToTimeString): - (KJS::dateProtoFuncToLocaleString): - (KJS::dateProtoFuncToLocaleDateString): - (KJS::dateProtoFuncToLocaleTimeString): - (KJS::dateProtoFuncGetFullYear): - (KJS::dateProtoFuncGetUTCFullYear): - (KJS::dateProtoFuncToGMTString): - (KJS::dateProtoFuncGetMonth): - (KJS::dateProtoFuncGetUTCMonth): - (KJS::dateProtoFuncGetDate): - (KJS::dateProtoFuncGetUTCDate): - (KJS::dateProtoFuncGetDay): - (KJS::dateProtoFuncGetUTCDay): - (KJS::dateProtoFuncGetHours): - (KJS::dateProtoFuncGetUTCHours): - (KJS::dateProtoFuncGetMinutes): - (KJS::dateProtoFuncGetUTCMinutes): - (KJS::dateProtoFuncGetSeconds): - (KJS::dateProtoFuncGetUTCSeconds): - (KJS::dateProtoFuncGetTimezoneOffset): - (KJS::setNewValueFromTimeArgs): - (KJS::setNewValueFromDateArgs): - (KJS::dateProtoFuncSetYear): - (KJS::dateProtoFuncGetYear): - Use the cache when converting. - -2008-04-16 Alexey Proskuryakov - - Reviewed by Darin. - - Implement an abstraction for thread-specific storage, use it to get rid of some static objects. - - SunSpider results were not conclusive, possibly up to 0.2% slowdown. - - * JavaScriptCore.xcodeproj/project.pbxproj: - * JavaScriptCore.vcproj/WTF/WTF.vcproj: - Added ThreadSpecific.h - - * wtf/ThreadSpecific.h: Added. - (WTF::::ThreadSpecific): - (WTF::::~ThreadSpecific): - (WTF::::get): - (WTF::::set): - (WTF::::destroy): - (WTF::T): - (WTF::::operator): - Only implemented for platforms that use pthreads. - - * kjs/CommonIdentifiers.cpp: - (KJS::CommonIdentifiers::shared): - * kjs/CommonIdentifiers.h: - * kjs/InitializeThreading.cpp: - (KJS::initializeThreading): - * kjs/Parser.cpp: - (KJS::parser): - * kjs/Parser.h: - * kjs/identifier.cpp: - (KJS::identifierTable): - (KJS::literalIdentifierTable): - (KJS::Identifier::initializeIdentifierThreading): - * kjs/identifier.h: - * kjs/lexer.cpp: - (KJS::lexer): - * kjs/lexer.h: - Make static instances per-thread. - -2008-04-15 Anders Carlsson - - Reviewed by Adam. - - Add ENABLE_OFFLINE_WEB_APPLICATIONS to FEATURE_DEFINES. - - * Configurations/JavaScriptCore.xcconfig: - -2008-04-15 Andre Poenitz - - Reviewed by Simon. - - Fix compilation with Qt namespaces - - Qt can be configured to have all of its classes inside a specified namespaces. - This is for example used in plugin/component environments like Eclipse. - - This change makes it possible to let the Qt port compile against a namespaced - Qt by the use of macros Qt provides to properly forward declare Qt classes in - the namespace. - - * wtf/unicode/qt4/UnicodeQt4.h: - -2008-04-14 Anders Carlsson - - Reviewed by Adam. - - Don't leak the prototype class. - - * API/JSClassRef.cpp: - (OpaqueJSClass::create): - -2008-04-14 Steve Falkenburg - - Fix build. - - * wtf/ThreadingWin.cpp: - -2008-04-14 Alexey Proskuryakov - - Reviewed by Adam Roben. - - https://bugs.webkit.org/show_bug.cgi?id=18488 - FastMalloc doesn't release thread-specific data on Windows - - * wtf/ThreadingWin.cpp: - (WTF::threadMapMutex): (WTF::initializeThreading): Call threadMapMutex once to initialize the static safely. - (WTF::ThreadFunctionInvocation::ThreadFunctionInvocation): Added a structure to wrap thread entry point and arguments. - (WTF::wtfThreadEntryPoint): Make sure to end all WTF threads with pthread_exit(), to give pthreads-win32 a chance to call - destructors of thread-specific data. - (WTF::createThread): Use _beginthreadex instead of CreateThread, because MSDN says so. Also removed a call to CreateEvent, - for which I could see no reason at all. - -2008-04-14 Alexey Proskuryakov - - Touched a file to make JavaScriptCore.vcproj rebuild. - - * wtf/MathExtras.h: - -2008-04-14 Adam Roben - - Windows build fix - - Rubberstamped by Alexey Proskuryakov. - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Disable - the "potentially uninitialized variable" warning for grammar.cpp, as - it seems to be incorrect. yylval gets initialized by the lexer, but - MSVC doesn't seem to understand this. - -2008-04-11 Antti Koivisto - - Reviewed by Maciej. - - Add default hash for pairs of hashable types. - - * wtf/HashFunctions.h: - (WTF::PairHash::hash): - (WTF::PairHash::equal): - (WTF::): - -2008-04-11 Alexey Proskuryakov - - Reviewed by Geoff. - - Make DateMath.cpp thread safe. - - No measurable change on SunSpider (should be a very small speedup). - - * kjs/DateMath.cpp: - (KJS::mimimumYearForDST): (KJS::equivalentYearForDST): Got rid of double caching of the - same precomputed value. - (KJS::calculateUTCOffset): (KJS::getUTCOffset): Factored actual UTC offset calculation code - out of getUTCOffset(), and notification setup into initDateMath(). - - (KJS::initDateMath): Added. - - * kjs/DateMath.h: - * kjs/InitializeThreading.cpp: - (KJS::initializeThreading): - Added initDateMath(). - -2008-04-11 Alexey Proskuryakov - - Windows build fix. - - * kjs/grammar.y: - -2008-04-11 Alexey Proskuryakov - - Tiger build fix. Forward declaring a union didn't work for whatever reason, make the - parameters void*. - - * kjs/grammar.y: - * kjs/lexer.cpp: - (kjsyylex): - (KJS::Lexer::lex): - * kjs/lexer.h: - -2008-04-11 Alexey Proskuryakov - - Reviewed by Geoff. - - Generate a pure (re-entrant) parser with Bison. - - No change on SunSpider. - - * kjs/Parser.cpp: - (KJS::Parser::parse): - * kjs/grammar.y: - * kjs/lexer.cpp: - (kjsyylex): - (KJS::Lexer::lex): - * kjs/lexer.h: - Pass state as function arguments, instead of global data. Don't call lexer() as often as - before, as this function is about to become slower due to thread-specific storage. - - * kjs/function.cpp: - (KJS::isStrWhiteSpace): Don't call isSeparatorSpace() for 8-bit characters, as these are - already taken care of. This is a small speedup, compensating for a small slowdown caused - by switching Bison mode. - -2008-04-10 Alexey Proskuryakov - - Reviewed by Geoff. - - https://bugs.webkit.org/show_bug.cgi?id=18402 - REGRESSION: visited element handling is incorrect in nested join/toString calls - - No change on SunSpider total, possibly a tiny improvement (about 0.1%). - - Test: fast/js/array-tostring-and-join.html - - * kjs/JSGlobalObject.h: - (KJS::JSGlobalObject::visitedElements): Store visited elements HashSet here, making it - common to toString/toLocalizedString/join again. - - * kjs/array_object.cpp: - (KJS::arrayProtoFuncToString): - (KJS::arrayProtoFuncToLocaleString): - (KJS::arrayProtoFuncJoin): - Got rid of static variables. Replaced UString with Vector to avoid O(n^2) behavior and - regain performance. - - * wtf/Vector.h: - (WTF::::resize): - (WTF::::grow): - (WTF::::reserveCapacity): - (WTF::::append): - (WTF::::insert): - Added null checks, so that Vector methods don't crash when out of memory. The caller should - check that data pointer is not null before proceeding. - -2008-04-10 Mark Rowe - - Reviewed by Maciej Stachowiak. - - Fix https://bugs.webkit.org/show_bug.cgi?id=18367 and the many dupes. - Bug 18367: Crash during celtic kane js speed 2007 test - - GCC 4.2 on x86_64 Linux decided to reorder the local variables in markCurrentThreadConservatively's - stack frame. This lead to the range of addresses the collector treated as stack to exclude the - contents of volatile registers that markCurrentThreadConservatively forces onto the stack. This was - leading to objects being prematurely collected if the only reference to them was via a register at - the time a collection occurred. - - The fix for this is to move the calculation of the top of the stack into a NEVER_INLINE function - that is called from markCurrentThreadConservatively. This forces the dummy variable we use for - determining the top of stack to be in a different stack frame which prevents the compiler from - reordering it relative to the registers that markCurrentThreadConservatively forces onto the stack. - - * kjs/collector.cpp: - (KJS::Collector::markCurrentThreadConservativelyInternal): - (KJS::Collector::markCurrentThreadConservatively): - * kjs/collector.h: - -2008-04-10 Adam Roben - - VC++ Express build fix - - * JavaScriptCore.vcproj/WTF/WTF.vcproj: Link against user32.lib so - that anyone who links against WTF.lib will get user32.lib - automatically. - -2008-04-09 Adam Roben - - VC++ Express build fix - - * JavaScriptCore.vcproj/testkjs/testkjs.vcproj: Link against - user32.lib. - -2008-04-09 Adam Roben - - Build fix - - * JavaScriptCore.exp: Export isMainThread. - -2008-04-09 Adam Roben - - Build fix - - * wtf/AlwaysInline.h: Make sure to #include Platform.h before using - the macros it defines. - -2008-04-08 Mark Rowe - - Export WTF::initializeThreading() from JavaScriptCore. - - * JavaScriptCore.exp: - -2008-04-04 Sam Weinig - - Reviewed by Geoffrey Garen. - - First step in implementing the "split window" - - - Add a GlobalThisValue to ExecState which should be used - in places that used to implement the "use the global object - as this if null" rule. - - Factor out lookupGetter/lookupSetter into virtual methods - on JSObject so that they can be forwarded. - - Make defineGetter/defineSetter virtual methods for the same - reason. - - Have PrototypeReflexiveFunction store the globalObject used - to create it so that it can be used to get the correct thisObject - for eval. - - * API/JSObjectRef.cpp: - (JSObjectCallAsFunction): - * JavaScriptCore.exp: - * kjs/Activation.h: - * kjs/ExecState.cpp: - (KJS::ExecState::ExecState): - (KJS::GlobalExecState::GlobalExecState): - * kjs/ExecState.h: - (KJS::ExecState::globalThisValue): - * kjs/ExecStateInlines.h: - (KJS::ExecState::ExecState): - (KJS::FunctionExecState::FunctionExecState): - * kjs/JSGlobalObject.cpp: - (KJS::JSGlobalObject::reset): - (KJS::JSGlobalObject::toGlobalObject): - * kjs/JSGlobalObject.h: - (KJS::JSGlobalObject::JSGlobalObjectData::JSGlobalObjectData): - (KJS::JSGlobalObject::JSGlobalObject): - * kjs/array_instance.cpp: - (KJS::CompareWithCompareFunctionArguments::CompareWithCompareFunctionArguments): - (KJS::compareWithCompareFunctionForQSort): - * kjs/array_object.cpp: - (KJS::arrayProtoFuncSort): - (KJS::arrayProtoFuncFilter): - (KJS::arrayProtoFuncMap): - (KJS::arrayProtoFuncEvery): - (KJS::arrayProtoFuncForEach): - (KJS::arrayProtoFuncSome): - * kjs/function.cpp: - (KJS::FunctionImp::callAsFunction): - (KJS::ActivationImp::toThisObject): - (KJS::globalFuncEval): - (KJS::PrototypeReflexiveFunction::PrototypeReflexiveFunction): - (KJS::PrototypeReflexiveFunction::mark): - * kjs/function.h: - (KJS::PrototypeReflexiveFunction::cachedGlobalObject): - * kjs/function_object.cpp: - (KJS::functionProtoFuncApply): - (KJS::functionProtoFuncCall): - * kjs/nodes.cpp: - (KJS::ExpressionNode::resolveAndCall): - (KJS::FunctionCallValueNode::evaluate): - (KJS::LocalVarFunctionCallNode::inlineEvaluate): - (KJS::ScopedVarFunctionCallNode::inlineEvaluate): - (KJS::FunctionCallBracketNode::evaluate): - (KJS::FunctionCallDotNode::inlineEvaluate): - * kjs/object.cpp: - (KJS::JSObject::call): - (KJS::JSObject::put): - (KJS::tryGetAndCallProperty): - (KJS::JSObject::lookupGetter): - (KJS::JSObject::lookupSetter): - (KJS::JSObject::toThisObject): - (KJS::JSObject::toGlobalObject): - (KJS::JSObject::fillGetterPropertySlot): - * kjs/object.h: - * kjs/object_object.cpp: - (KJS::objectProtoFuncLookupGetter): - (KJS::objectProtoFuncLookupSetter): - * kjs/string_object.cpp: - (KJS::replace): - -2008-04-08 Brady Eidson - - Encourage Windows to rebuild - AGAIN... - - * kjs/DateMath.cpp: - -2008-04-08 Adam Roben - - Mac build fix - - * JavaScriptCore.exp: Add callOnMainThread, and sorted the list. - -2008-04-08 Brady Eidson - - Rubberstamped by Adam Roben - - Touch some files to *strongly* encourage Windows to rebuilt with DOM_STORAGE enabled - - * kjs/DateMath.cpp: - -2008-04-08 Adam Roben - - Move callOnMainThread to WTF - - Reviewed by Alexey Proskuryakov. - - * GNUmakefile.am: - * JavaScriptCore.pri: - * JavaScriptCore.vcproj/WTF/WTF.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - * JavaScriptCoreSources.bkl: - Added new files. - - * wtf/MainThread.cpp: - * wtf/MainThread.h: - * wtf/gtk/MainThreadGtk.cpp: - * wtf/mac/MainThreadMac.mm: - * wtf/qt/MainThreadQt.cpp: - * wtf/win/MainThreadWin.cpp: - * wtf/wx/MainThreadWx.cpp: - Moved here from WebCore/platform. Replaced all instances of "WebCore" - with "WTF". - - * kjs/bool_object.cpp: Touched to force JavaScriptCore.vcproj to - build. - to the WTF namespace. - * wtf/ThreadingWin.cpp: - (WTF::initializeThreading): Call initializeMainThread. - -2008-04-07 Brady Eidson - - Add "ENABLE_DOM_STORAGE" to keep in sync with the rest of the project - - * Configurations/JavaScriptCore.xcconfig: - -2008-04-07 Adam Roben - - Windows build fix - - * wtf/ThreadingWin.cpp: Back out some changes I didn't mean to land. - -2008-04-07 Adam Roben - - Add WTF::isMainThread - - Reviewed by Alexey Proskuryakov. - - * wtf/Threading.h: Declare the new function. - * wtf/ThreadingGtk.cpp: - (WTF::initializeThreading): Initialize the main thread identifier. - (WTF::isMainThread): Added. - * wtf/ThreadingNone.cpp: Ditto ThreadingGtk.cpp. - (WTF::initializeThreading): - (WTF::isMainThread): - * wtf/ThreadingPthreads.cpp: Ditto. - (WTF::initializeThreading): - (WTF::isMainThread): - * wtf/ThreadingWin.cpp: Ditto. - (WTF::initializeThreading): - (WTF::isMainThread): - -2008-04-06 Alexey Proskuryakov - - Reviewed by Darin. - - Make UString thread-safe. - - No change on SunSpider total, although individual tests have changed a lot, up to 3%. - - * kjs/InitializeThreading.cpp: (KJS::initializeThreading): Call UString::null() to initialize - a static. - - * kjs/identifier.cpp: - (KJS::CStringTranslator::translate): - (KJS::UCharBufferTranslator::translate): - Use "true" for a boolean value instead of 1, because it's C++. - - * kjs/ustring.h: - (KJS::CString::adopt): Added a method to create from a char* buffer without copying. - (KJS::UString::Rep::ref): Removed an assertion for JSLock::lockCount, as it's no longer - necessary to hold JSLock when working with strings. - (KJS::UString::Rep::deref): Ditto. - (KJS::UString::Rep::isStatic): Added a field to quickly determine that this is an empty - or null static string. - - * kjs/ustring.cpp: - (KJS::): Removed normalStatBufferSize and statBufferSize, as there is no reason to have such - an advanced implementation of a debug-only ascii() method. Removed a long-obsolete comment - about UChar. - (KJS::UString::Rep::createCopying): Removed an assertion for JSLock::lockCount. - (KJS::UString::Rep::create): Ditto. - (KJS::UString::Rep::destroy): Ditto. Do not do anything for static null and empty strings, - as refcounting is not reliable for those. Reordered branches for a noticeable speed gain - - apparently this functiton is hot enough for SunSpider to see an effect from this! - (KJS::UString::null): Moved a star, added a comment. - (KJS::UString::cstring): Reimplemented to not call ascii(), which is not thread-safe. - (KJS::UString::ascii): Simplified statBuffer handling logic. - (KJS::UString::toDouble): Use cstring() instead of ascii(). - -2008-04-02 Mark Rowe - - Reviewed by Oliver Hunt. - - Ensure that debug symbols are generated for x86_64 and ppc64 builds. - - * Configurations/Base.xcconfig: - -2008-04-01 Christian Dywan - - Build fix for GCC 4.3. - - * wtf/unicode/icu/CollatorICU.cpp: include string.h - -2008-04-01 Alexey Proskuryakov - - Rubber-stamped by Darin. - - Turn off using 64-bit arithmetic on 32-bit hardware, as dtoa own code is faster than - compiler-provided emulation. - - 1% speedup on Acid3 test 26. - - * kjs/dtoa.cpp: - -2008-04-01 Alexey Proskuryakov - - Reviewed by Darin. - - Make MathExtras.h thread safe. - - * kjs/math_object.cpp: - (KJS::mathProtoFuncRandom): If threading is enabled, rely on initializeThreading to call - wtf_random_init(). - - * wtf/Threading.h: - * wtf/ThreadingGtk.cpp: - (WTF::initializeThreading): - * wtf/ThreadingNone.cpp: - (WTF::initializeThreading): - * wtf/ThreadingPthreads.cpp: - (WTF::initializeThreading): - * wtf/ThreadingWin.cpp: - (WTF::initializeThreading): - Call wtf_random_init(); made the function non-inline to avoid having to include too many - headers in Threading.h. - -2008-03-31 Eric Seidel - - Reviewed by darin. - - Make matching of regexps using ^ much faster - http://bugs.webkit.org/show_bug.cgi?id=18086 - - * pcre/pcre_compile.cpp: - (compileBranch): - (branchNeedsLineStart): - * pcre/pcre_exec.cpp: - (match): - (jsRegExpExecute): - * pcre/pcre_internal.h: - -2008-03-29 Alexey Proskuryakov - - Reviewed by Oliver Hunt. - - REGRESSION: Leak in KJS::initializeThreading() - - * kjs/InitializeThreading.cpp: (KJS::initializeThreading): There is no guarantee that - initializeThreading() is called only once; check that the mutex hasn't been already allocated. - -2008-03-29 Oliver Hunt - - Reviewed by Geoff. - - Bug 17924: Crash in KJS::ConstDeclNode::evaluate with |with| and |const| - - - - It turns out this is trivially avoidable if we just match firefox's - semantics and ensure that an assignment in a const declaration always - writes to the variable object. - - * kjs/nodes.cpp: - (KJS::ConstDeclNode::handleSlowCase): - -2008-03-28 Alexey Proskuryakov - - Reviewed by Sam Weinig. - - Fix a dtoa thread safety issue. - - WebCore can call kjs_strtod without holding JS lock, but we didn't have thread safety - compiled in for dtoa. - - This is a 0.5% regression on SunSpider, which Sam Weinig has volunteered to cover with - his recent improvement. - - * kjs/dtoa.cpp: - (Bigint::Balloc): - (Bigint::Bfree): - Changed to use fastMalloc/fastDelete - they are much faster than the dtoa custom version was - in the presence of locking (but somewhat slower in single-threaded case). - (Bigint::pow5mult): Got rid of the dreaded double-checked locking anti-pattern (had to - restructure the code to avoid significant performance implications). - (Bigint::lshift): Rewrote to avoid an allocation, if possible. - - (Bigint::rv_alloc): - (Bigint::kjs_freedtoa): - (Bigint::kjs_dtoa): - Check for USE(MULTIPLE_THREADS), not dtoa legacy MULTIPLE_THREADS. - - * kjs/InitializeThreading.cpp: Added. - (KJS::initializeThreading): - * kjs/InitializeThreading.h: Added. - Initialize threading at KJS level, if enabled. - - * kjs/dtoa.h: Expose dtoa mutex for KJS::initializeThreading. - - * kjs/testkjs.cpp: (kjsmain): Call initializeThreading. - - * JavaScriptCore.exp: Export KJS::initializeThreading. - - * GNUmakefile.am: - * JavaScriptCore.exp: - * JavaScriptCore.pri: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCoreSources.bkl: - * JavaScriptCore.xcodeproj/project.pbxproj: - Added InitializeThreading.{h,cpp}. - - * wtf/Threading.h: Removed a using directive for WTF::initializeThreading - it is only - to be called from KJS::initializeThreading, and having it in the global namespace is useless. - -2008-03-28 Brady Eidson - - Reviewed by Darin - - Export Unicode/UTF8.h and convertUTF16ToUTF8() for more flexible conversion in WebCore - - * JavaScriptCore.exp: - * JavaScriptCore.xcodeproj/project.pbxproj: - -2008-03-27 Darin Adler - - Reviewed by Mark Rowe. - - Regular expressions with large nested repetition counts can have their - compiled length calculated incorrectly. - - * pcre/pcre_compile.cpp: - (multiplyWithOverflowCheck): - (calculateCompiledPatternLength): Check for overflow when dealing with nested repetition counts - and bail with an error rather than returning incorrect results. - -2008-03-26 Mark Rowe - - Rubber-stamped by Brady Eidson. - - Update FEATURE_DEFINES to be consistent with the other locations in which it is defined. - - * Configurations/JavaScriptCore.xcconfig: - -2008-03-26 Adam Roben - - Fix Bug 18060: Assertion failure (JSLock not held) beneath - JSCallbackObject::toString - - - - Reviewed by Geoff Garen. - - Bug fix: - - * API/JSCallbackObjectFunctions.h: - (KJS::JSCallbackObject::toString): Make the DropAllLocks - instance only be in scope while calling convertToType. - - Test: - - * API/testapi.c: - (MyObject_convertToType): Implement type conversion to string. - * API/testapi.js: Add a test for type conversion to string. - -2008-03-26 Adam Roben - - Windows build fix - - * kjs/array_instance.cpp: Touched this. - * wtf/HashFunctions.h: - (WTF::intHash): Added 8- and 16-bit versions of intHash. - -2008-03-26 Adam Roben - - Force JSC headers to be copied by touching a file - - * kjs/array_instance.cpp: - (KJS::ArrayInstance::getPropertyNames): - -2008-03-26 Adam Roben - - Windows build fix after r31324 - - Written with Darin. - - Added HashTable plumbing to support using wchar_t as a key type. - - * wtf/HashFunctions.h: - * wtf/HashTraits.h: - (WTF::): - -2008-03-26 Maciej Stachowiak - - Reviewed by Darin. - - - JSC part of fix for "SVG multichar glyph matching matches longest instead of first (affects Acid3 test 79)" - http://bugs.webkit.org/show_bug.cgi?id=18118 - - * wtf/HashFunctions.h: - (WTF::): - * wtf/HashTraits.h: - (WTF::): - -2008-03-26 Alexey Proskuryakov - - Reviewed by Darin. - - Cache C string identifiers by address, not value, assuming that C strings can only - be literals. - - 1% speedup on Acid3 test 26. - - * kjs/identifier.cpp: - (KJS::literalIdentifierTable): - (KJS::Identifier::add): - Added a new table to cache UString::Reps created from C strings by address. Elements are - never removed from this cache, as only predefined identifiers can get there. - - * kjs/identifier.h: - (KJS::Identifier::Identifier): Added a warning. - -2008-03-26 Alexey Proskuryakov - - Rubber-stamped by Maciej. - - An assertion was failing in function-toString-object-literals.html when parsing 1e-500. - The condition existed before, and got uncovered by turning compiled-out dtoa checks into - ASSERTs. - - The assertion was verifying that the caller wasn't constructing a Bigint from 0. - This might have had some reason behind it originally, but I couldn't find any, - and this doesn't look like a reasonable requirement. - - * kjs/dtoa.cpp: (d2b): Removed the assertion (two copies in different code paths). - -2008-03-25 Adam Roben - - Fix Bug 18077: Integrate testapi.c into the Windows build - - - - Reviewed by Steve Falkenburg. - - * JavaScriptCore.vcproj/testapi/testapi.vcproj: Added. - -2008-03-25 Adam Roben - - Make testapi.c compile under MSVC - - Currently you must compile testapi.c as C++ code since MSVC does not - support many C features that GCC does. - - Reviewed by Steve Falkenburg. - - * API/testapi.c: - (nan): Added an implementation of this for MSVC. - (assertEqualsAsUTF8String): Use malloc instead of dynamically-sized - stack arrays. - (assertEqualsAsCharactersPtr): Ditto. - (print_callAsFunction): Ditto. - (main): Ditto, and explicitly cast from UniChar* to JSChar*. - -2008-03-25 Adam Roben - - Stop using JavaScriptCore's custom stdbool.h and stdint.h on Windows - - We can't remove the os-win32 directory yet because other ports (at - least wx) are still relying on it. - - Reviewed by Steve Falkenburg. - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - - Made all the include paths match the one for the Debug - configuration (these got out of sync in r30797) - - Removed os-win32 from the include path - - Removed os-win32 from the directories we copy to $WebKitOutputDir. - - Removed stdint.h from the project - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreGenerated.make: - Delete the files that we may have previously copied from the os-win32 - directory. - -2008-03-25 Alexey Proskuryakov - - Windows build fix. - - * kjs/dtoa.cpp: Include stdint.h. - -2008-03-25 Alexey Proskuryakov - - Rubber-stamped by Darin. - - Cleanup dtoa.cpp style. - - * kjs/dtoa.cpp: - (Bigint::Balloc): - (Bigint::Bfree): - (Bigint::multadd): - (Bigint::s2b): - (Bigint::hi0bits): - (Bigint::lo0bits): - (Bigint::i2b): - (Bigint::mult): - (Bigint::pow5mult): - (Bigint::lshift): - (Bigint::cmp): - (Bigint::diff): - (Bigint::ulp): - (Bigint::b2d): - (Bigint::d2b): - (Bigint::ratio): - (Bigint::): - (Bigint::match): - (Bigint::hexnan): - (Bigint::kjs_strtod): - (Bigint::quorem): - (Bigint::rv_alloc): - (Bigint::nrv_alloc): - (Bigint::kjs_freedtoa): - (Bigint::kjs_dtoa): - * kjs/dtoa.h: - -2008-03-24 Darin Adler - - Reviewed by Sam. - - - convert a JavaScript immediate number to a string more efficiently - - 2% speedup of Acid3 test 26 - - * kjs/JSImmediate.cpp: - (KJS::JSImmediate::toString): Take advantage of the fact that all immediate - numbers are integers, and use the faster UString function for formatting integers - instead of the slower one that works for floating point. I think this is a leftover - from when immediate numbers were floating point. - -2008-03-23 Sam Weinig - - Reviewed by Darin Adler. - - Fix http://bugs.webkit.org/show_bug.cgi?id=18048 - The "thisObject" parameter to JSEvaluateScript is not used properly - - Making passing a thisObject to JSEvaluateScript actually set the thisObject of the created - ExecState. - - * API/testapi.c: - (main): Add tests for setting the thisObject when calling JSEvaluateScript. - - * kjs/ExecState.cpp: - (KJS::ExecState::ExecState): Assign the thisObject to m_thisValue and remove the comment. - -2008-03-22 Jesse Ruderman - - Reviewed by Sam Weinig. Landed by eseidel. - - Make testkjs flush stdout after printing. - - * JavaScriptCore.xcodeproj/project.pbxproj: - * kjs/testkjs.cpp: - (functionPrint): - -2008-03-21 Oliver Hunt - - Reviewed by Maciej. - - Optimise lookup of Math, undefined, NaN and Infinity - - Added a method to JSVariableObject to allow us to inject DontDelete properties - into the symbol table and localStorage. This results in a 0.4% progression in - SunSpider, with a 8% gain in math-partial-sums. - - * kjs/JSGlobalObject.cpp: - (KJS::JSGlobalObject::reset): - * kjs/JSVariableObject.h: - (KJS::JSVariableObject::symbolTableInsert): - -2008-03-21 Oliver Hunt - - Reviewed by Geoff Garen. - - Global properties that use LocalStorage are not correctly listed as enumerable. - - The problem was caused by JSObject::getPropertyAttributes not being aware - of the JSVariableObject SymbolTable. The fix is to make getPropertyAttributes - virtual and override in JSVariableObject. This does not produce any performance - regression. - - * JavaScriptCore.exp: - * kjs/JSVariableObject.cpp: - (KJS::JSVariableObject::getPropertyNames): - (KJS::JSVariableObject::getPropertyAttributes): - * kjs/JSVariableObject.h: - * kjs/object.h: - -2008-03-21 Arkadiusz Miskiewicz - - Webkit does not build on linux powerpc - - - - Reviewed by David Kilzer. - - * wtf/TCSpinLock.h: - (TCMalloc_SpinLock::Unlock): - -2008-03-21 Rodney Dawes - - Reviewed by Holger. - - http://bugs.webkit.org/show_bug.cgi?id=17981 - - Add javascriptcore_cppflags to Programs_minidom_CPPFLAGS. - - * GNUmakefile.am: - -2008-03-21 Alexey Proskuryakov - - Reviewed by Oliver Hunt. - - Consolidate static identifier initializers within CommonIdentifiers. - - No reliably measurable change on SunSpider; maybe a tiny improvement (within 0.2%). - - * kjs/CommonIdentifiers.h: Added static identifiers that were lazily initialized - throughout the code. - - * kjs/date_object.cpp: - (KJS::DateObjectImp::DateObjectImp): - * kjs/function_object.cpp: - (KJS::FunctionPrototype::FunctionPrototype): - * kjs/object_object.cpp: - (KJS::ObjectPrototype::ObjectPrototype): - * kjs/regexp_object.cpp: - (KJS::RegExpPrototype::RegExpPrototype): - Use the values from CommonIdentifiers. - - * kjs/lookup.h: Caching the identifier in a static wasn't a win on SunSpider, removed it. - - * kjs/value.h: - (KJS::jsNaN): We already have a shared NaN value, no need for a duplicate here. - - * wtf/MathExtras.h: - (wtf_atan2): Having local variables for numeric_limits constants is good for readability, - but there is no reason to keep them static. - - * JavaScriptCore.exp: Don't needlessly export JSGlobalObject::s_head. - -2008-03-20 Oliver Hunt - - Reviewed by Maciej. - - Fix for leak introduced by inline ScopeChainNode use - - To avoid any extra branches when managing an inline ScopeChainNode - in the ScopeChain the inline node gets inserted with a refcount of - 2. This meant than when the ScopeChain was destroyed the ScopeChainNodes - above the inline node would be leaked. - - We resolve this by manually popping the inline node in the - FunctionExecState destructor. - - * JavaScriptCore.xcodeproj/project.pbxproj: - * kjs/ExecStateInlines.h: - (KJS::FunctionExecState::~FunctionExecState): - * kjs/scope_chain.h: - (KJS::ScopeChain::popInlineScopeNode): - -2008-03-20 Mark Rowe - - Reviewed by Sam Weinig. - - Ensure that the defines in FEATURE_DEFINES are sorted so that they will match the default settings of build-webkit. - This will prevent the world from being rebuilt if you happen to switch between building in Xcode and with build-webkit on the - command-line. - - * Configurations/JavaScriptCore.xcconfig: - -2008-03-20 David Krause - - Reviewed by David Kilzer. - - Fix http://bugs.webkit.org/show_bug.cgi?id=17923 - Bug 17923: ARM platform endian defines inaccurate - - * wtf/Platform.h: - Replaced !defined(__ARMEL__) check with !defined(__VFP_FP__) - for PLATFORM(MIDDLE_ENDIAN) - -2008-03-20 Maciej Stachowiak - - - fix build - - * JavaScriptCore.xcodeproj/project.pbxproj: install Activation.h as private - -2008-03-20 Maciej Stachowiak - - Reviewed by Oliver. - - - reduce function call overhead for 1.014x speedup on SunSpider - - I moved some functions from ExecState.cpp to ExecStateInline.h and - from JSGlobalObject.cpp to JSGlobalObject.h, and declared them - inline; machine function call overhead for these was hurting JS - funcion call overhead. - - * kjs/ExecState.cpp: - * kjs/ExecStateInlines.h: Added. - (KJS::ExecState::ExecState): - (KJS::ExecState::~ExecState): - (KJS::FunctionExecState::FunctionExecState): - (KJS::FunctionExecState::~FunctionExecState): - * kjs/JSGlobalObject.cpp: - * kjs/JSGlobalObject.h: - (KJS::JSGlobalObject::pushActivation): - (KJS::JSGlobalObject::checkActivationCount): - (KJS::JSGlobalObject::popActivation): - * kjs/function.cpp: - -2008-03-19 Oliver Hunt - - Reviewed by Maciej. - - Avoid heap allocating the root scope chain node for eval and closure free functions - - Maciej suggested using an inline ScopeChainNode for functions that don't use eval - or closures as they are unable to ever capture the scope chain. This gives us a 2.4% - win in sunspider, a 15% win in controlflow-recursive, and big (>5%) wins in a number - of other tests. - - * kjs/ExecState.cpp: - (KJS::ExecState::ExecState): - * kjs/ExecState.h: - * kjs/scope_chain.h: - (KJS::ScopeChain::push): - -2008-03-19 Mark Rowe - - Reviewed by Sam Weinig. - - Fix release build. - - * kjs/JSGlobalObject.cpp: Add missing #include. - -2008-03-19 Sam Weinig - - Reviewed by Anders Carlsson. - - Fix for - Crash occurs at KJS::Collector::collect() when loading web clip widgets with a PAC file - - Make the activeExecStates stack per JSGlobalObject instead of static to ensure - thread safety. - - * JavaScriptCore.exp: - * kjs/ExecState.cpp: - (KJS::InterpreterExecState::InterpreterExecState): - (KJS::InterpreterExecState::~InterpreterExecState): - (KJS::EvalExecState::EvalExecState): - (KJS::EvalExecState::~EvalExecState): - (KJS::FunctionExecState::FunctionExecState): - (KJS::FunctionExecState::~FunctionExecState): - * kjs/ExecState.h: - * kjs/JSGlobalObject.cpp: - (KJS::JSGlobalObject::mark): - * kjs/JSGlobalObject.h: - (KJS::JSGlobalObject::activeExecStates): - * kjs/collector.cpp: - (KJS::Collector::collect): - (KJS::Collector::reportOutOfMemoryToAllExecStates): Iterate all JSGlobalObjects and report - the OutOfMemory condition to all the ExecStates in each. - -2008-03-19 Jasper Bryant-Greene - - Reviewed by Maciej Stachowiak. - - Fix http://bugs.webkit.org/show_bug.cgi?id=17941 - Bug 17941: C++-style comments in JavaScriptCore API - - * API/JSBase.h: - Remove C++-style comments from public JavaScriptCore API, replacing - with standard C90 block comments. - -2008-03-19 Mark Rowe - - Reviewed by Oliver Hunt. - - Fix http://bugs.webkit.org/show_bug.cgi?id=17939 - Bug 17939: Crash decompiling "const a = 1, b;" - - * kjs/nodes2string.cpp: - (KJS::ConstDeclNode::streamTo): Null-check the correct variable. - -2008-03-18 Oliver Hunt - - Reviewed by Mark Rowe. - - Bug 17929: Incorrect decompilation with |const|, comma - http://bugs.webkit.org/show_bug.cgi?id=17929 - - There were actually two bugs here. First we weren't correctly handling const - nodes with multiple declarations. The second issue was caused by us not - giving the correct precedence to the initialisers. - - * kjs/nodes2string.cpp: - (KJS::ConstDeclNode::streamTo): - -2008-03-18 Darin Adler - - Reviewed by Maciej. - - - Speed up JavaScript built-in properties by changing the - hash table to take advantage of the identifier objects - - 5% speedup for Acid3 test 26 - - * JavaScriptCore.exp: Updated. - * kjs/create_hash_table: Compute size of hash table large enough so that there - are no collisions, but don't generate the hash table. - * kjs/identifier.h: Made the add function that returns a PassRefPtr public. - * kjs/lexer.cpp: - (KJS::Lexer::lex): Updated for change to HashTable interface. - * kjs/lookup.cpp: - (KJS::HashTable::changeKeysToIdentifiers): Added. Finds the identifier for - each property so the equality comparision can be done with pointer comparision. - * kjs/lookup.h: Made the key be a union of char* with UString::Rep* so it can - hold identifiers. Added a keysAreIdentifiers flag to the HashTable. Changed - the Lookup functions to be member functions of HashTable instead. - * kjs/object.cpp: - (KJS::JSObject::deleteProperty): Update for change to HashTable. - (KJS::JSObject::findPropertyHashEntry): Ditto. - (KJS::JSObject::getPropertyAttributes): Ditto. - (KJS::JSObject::getPropertyNames): Ditto. - -2008-03-18 Mark Rowe - - Reviewed by Oliver Hunt. - - Fix http://bugs.webkit.org/show_bug.cgi?id=17925 and http://bugs.webkit.org/show_bug.cgi?id=17927. - - Bug 17925: Crash in KJS::JSObject::put after setting this.__proto__ - - Bug 17927: Hang after attempting to create circular __proto__ - - * kjs/object.cpp: - (KJS::JSObject::put): Silently ignore attempts to set __proto__ to a non-object, non-null value. - Return after setting the exception when an attempt to set a cyclic __proto__ is detected so that - the cyclic value is not set. - -2008-03-18 Maciej Stachowiak - - Reviewed by Oliver. - - - inline ActivationImp::init for 0.8% SunSpider speedup - - * kjs/Activation.h: - (KJS::ActivationImp::init): Moved here from function.cpp - * kjs/function.cpp: - -2008-03-18 Simon Hausmann - - Fix the Qt build. - - Including config.h like in the other .cpp files gets the #ifdeffery - correct for rand_s. - - * kjs/JSWrapperObject.cpp: - -2008-03-17 Darin Adler - - Reviewed by Maciej. - - JavaScriptCore changes to support a WebCore speedup. - - * JavaScriptCore.exp: Export the UString::Rep::computeHash function. - * wtf/HashSet.h: Added a find and contains function that take a translator, - like the add function. - -2008-03-18 Maciej Stachowiak - - Reviewed by Oliver. - - - a few micro-optimizations for 1.2% SunSpider speedup - - * kjs/function.cpp: - (KJS::FunctionImp::callAsFunction): check for Return completion before Throw, - it is more likely. - * kjs/object.cpp: - (KJS::JSObject::put): When walking prototype chain, instead of - checking isObject (a virtual call), compare to jsNull (compare to - a constant) since null is the only non-object that can be in a - prototype chain. - -2008-03-17 Oliver Hunt - - Reviewed by Geoff. - - Optimise multi-scope function call resolution - - Refactor multiscope variable resolution and use to add - optimised FunctionCallResolveNode subclasses. - - 2.6% gain in sunspider performance, *25%* gain in controlflow-recursive - - * kjs/nodes.cpp: - (KJS::getSymbolTableEntry): - (KJS::ResolveNode::optimizeVariableAccess): - (KJS::getNonLocalSymbol): - (KJS::ExpressionNode::resolveAndCall): - (KJS::FunctionCallResolveNode::optimizeVariableAccess): - (KJS::FunctionCallResolveNode::inlineEvaluate): - (KJS::ScopedVarFunctionCallNode::inlineEvaluate): - (KJS::ScopedVarFunctionCallNode::evaluate): - (KJS::ScopedVarFunctionCallNode::evaluateToNumber): - (KJS::ScopedVarFunctionCallNode::evaluateToBoolean): - (KJS::ScopedVarFunctionCallNode::evaluateToInt32): - (KJS::ScopedVarFunctionCallNode::evaluateToUInt32): - (KJS::NonLocalVarFunctionCallNode::inlineEvaluate): - (KJS::NonLocalVarFunctionCallNode::evaluate): - (KJS::NonLocalVarFunctionCallNode::evaluateToNumber): - (KJS::NonLocalVarFunctionCallNode::evaluateToBoolean): - (KJS::NonLocalVarFunctionCallNode::evaluateToInt32): - (KJS::NonLocalVarFunctionCallNode::evaluateToUInt32): - * kjs/nodes.h: - (KJS::ScopedVarFunctionCallNode::): - (KJS::NonLocalVarFunctionCallNode::): - -2008-03-17 David Kilzer - - Don't define PLATFORM(MIDDLE_ENDIAN) on little endian ARM. - - Reviewed by Darin. - - See . - - * wtf/Platform.h: Added check for !defined(__ARMEL__) when defining - PLATFORM(MIDDLE_ENDIAN). - -2008-03-17 Oliver Hunt - - Reviewed by Geoff, Darin and Weinig. - - Add fast multi-level scope lookup - - Add logic and AST nodes to provide rapid variable resolution across - static scope boundaries. This also adds logic that allows us to skip - any static scopes that do not contain the variable to be resolved. - - This results in a ~2.5% speedup in SunSpider, and gives a 25-30% speedup - in some simple and ad hoc closure and global variable access tests. - - * JavaScriptCore.exp: - * kjs/Activation.h: - * kjs/JSGlobalObject.cpp: - * kjs/JSGlobalObject.h: - * kjs/JSVariableObject.cpp: - * kjs/JSVariableObject.h: - * kjs/function.cpp: - (KJS::ActivationImp::isDynamicScope): - * kjs/nodes.cpp: - (KJS::ResolveNode::optimizeVariableAccess): - (KJS::ScopedVarAccessNode::inlineEvaluate): - (KJS::ScopedVarAccessNode::evaluate): - (KJS::ScopedVarAccessNode::evaluateToNumber): - (KJS::ScopedVarAccessNode::evaluateToBoolean): - (KJS::ScopedVarAccessNode::evaluateToInt32): - (KJS::ScopedVarAccessNode::evaluateToUInt32): - (KJS::NonLocalVarAccessNode::inlineEvaluate): - (KJS::NonLocalVarAccessNode::evaluate): - (KJS::NonLocalVarAccessNode::evaluateToNumber): - (KJS::NonLocalVarAccessNode::evaluateToBoolean): - (KJS::NonLocalVarAccessNode::evaluateToInt32): - (KJS::NonLocalVarAccessNode::evaluateToUInt32): - (KJS::IfElseNode::optimizeVariableAccess): - (KJS::ScopeNode::optimizeVariableAccess): - * kjs/nodes.h: - (KJS::ScopedVarAccessNode::): - (KJS::NonLocalVarAccessNode::): - * kjs/object.h: - - 2008-03-16 weihongzeng - - Reviewed by Darin Adler. - - http://bugs.webkit.org/show_bug.cgi?id=15416 - Add support for mixed-endian processors - - * kjs/dtoa.cpp: Add IEEE_ARM, triggered by PLATFORM(MIDDLE_ENDIAN). - -2008-03-16 Kevin Ollivier - - Rubber stamped by Darin. - - Add set-webkit-configuration support for wx port, and centralize - build dir location setting. - - http://bugs.webkit.org/show_bug.cgi?id=17790 - - * jscore.bkl: - -2008-03-14 Steve Falkenburg - - PGO build fixes. - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - -2008-03-14 Oliver Hunt - - Reviewed by Maciej. - - Add logic to track whether a function uses a locally scoped eval or requires a closure - - Now that we limit eval we can track those uses of eval that operate - in the local scope and functions that require a closure. We track - this information during initial parsing to avoid yet another tree - walk. - - * JavaScriptCore.exp: - * kjs/NodeInfo.h: - * kjs/Parser.cpp: - (KJS::Parser::didFinishParsing): - * kjs/Parser.h: - (KJS::Parser::parse): - * kjs/grammar.y: - * kjs/nodes.cpp: - (KJS::ScopeNode::ScopeNode): - (KJS::ProgramNode::ProgramNode): - (KJS::ProgramNode::create): - (KJS::EvalNode::EvalNode): - (KJS::EvalNode::create): - (KJS::FunctionBodyNode::FunctionBodyNode): - (KJS::FunctionBodyNode::create): - * kjs/nodes.h: - (KJS::ScopeNode::): - (KJS::ScopeNode::usesEval): - (KJS::ScopeNode::needsClosure): - -2008-03-14 Geoffrey Garen - - Reviewed by Beth Dakin. - - Fixed another problem with Vector::shrinkCapacity. - - moveOverlapping isn't good enough for the case where the buffer hasn't - changed, because it still destroys the contents of the buffer. - - * wtf/Vector.h: - (WTF::::shrinkCapacity): Changed to explicitly check whether the call - to allocateBuffer produced a new buffer. If it didn't, there's no need - to move. - -2008-03-14 Geoffrey Garen - - Reviewed by Beth Dakin. - - Fixed a few problems with Vector::shrinkCapacity that I noticed in testing. - - * wtf/Vector.h: - (WTF::VectorBufferBase::deallocateBuffer): Clear our m_buffer pointer - when we deallocate m_buffer, in case we're not asked to reallocate a new - buffer. (Otherwise, we would use a stale m_buffer if we were asked to - perform any operations after shrinkCapacity was called.) - - (WTF::VectorBuffer::allocateBuffer): Made VectorBuffer with inline - capacity aware that calls to allocateBuffer might be shrinks, rather - than grows, so we shouldn't allocate a new buffer on the heap unless - our inline buffer is too small. - - (WTF::::shrinkCapacity): Call resize() instead of just setting m_size, - so destructors run. Call resize before reallocating the buffer to make - sure that we still have access to the objects we need to destroy. Call - moveOverlapping instead of move, since a call to allocateBuffer on an - inline buffer may produce identical storage. - -2008-03-14 Alexey Proskuryakov - - Reviewed by Darin. - - Get rid of a localime() call on platforms that have better alternatives. - - * kjs/DateMath.h: Added getLocalTime(); - - * kjs/DateMath.cpp: - (KJS::getLocalTime): - (KJS::getDSTOffsetSimple): - Implementation moved from getDSTOffsetSimple(). - - * kjs/date_object.cpp: - (KJS::DateObjectImp::callAsFunction): Switched to getLocalTime(). - -2008-03-14 David D. Kilzer - - Unify concept of enabling the Mac Java bridge. - - Reviewed by Darin and Anders. - - * wtf/Platform.h: Define ENABLE_MAC_JAVA_BRIDGE here. - -2008-03-13 Mark Mentovai - - Reviewed by eseidel. Landed by eseidel. - - * wtf/FastMalloc.cpp: #include outside of any - namespaces. - -2008-03-13 Mark Mentovai - - Reviewed by eseidel. Landed by eseidel. - - * pcre/pcre_exec.cpp: Fix misnamed variable, allowing -DDEBUG build - to succeed. - * wtf/ThreadingPthreads.cpp: #include for gettimeofday - in non-pch build. - -2008-03-13 Steve Falkenburg - - PGO build fixes. - - Disable PGO for normal release builds. - Added work-in-progress Release_PGOInstrument/Release_PGOOptimize targets. - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - -2008-03-13 Beth Dakin - - Reviewed by Geoff. - - Adding new functionality to Vector. Currently all of the shrink and - resize functions on Vector only shrink the size of the Vector, not - the capacity. For the Vector to take up as little memory as - possible, though, it is necessary to be able to shrink the capacity - as well. So this patch adds that functionality. - - I need this for a speed up I am working on, and Geoff wants to use - it in a speed up he is working on also, so he asked me to commit it - now. - - * wtf/Vector.h: - (WTF::VectorBufferBase::allocateBuffer): - (WTF::::shrinkCapacity): - -2008-03-13 Simon Hausmann - - Reviewed by Adam Roben. - - Attempt at fixing the Qt/Windows build bot. Quote using double-quotes - instead of single quotes. - - * pcre/dftables: - -2008-03-12 Steve Falkenburg - - Build fix. - - * JavaScriptCore.vcproj/WTF/WTF.vcproj: - -2008-03-12 Alp Toker - - Another autotools testkjs build fix attempt. - - * GNUmakefile.am: - -2008-03-12 Alp Toker - - Attempt to fix the autotools testkjs build on systems with - non-standard include paths. - - * GNUmakefile.am: - -2008-03-11 Alexey Proskuryakov - - Reviewed by Darin. - - REGRESSION: Crash at WTF::Collator::CreateCollator() running fast/js/kde/StringObject.html on Windows - - * wtf/unicode/icu/CollatorICU.cpp: - (WTF::Collator::createCollator): Check for null (== user default) m_locale before calling strcmp. - -2008-03-11 Steve Falkenburg - - Disable LTCG/PGO for grammar.cpp and nodes.cpp. - PGO on these files causes us to hang. - - Copy newer vsprops files from relative WebKitLibraries path to environment variable based path. - - Reviewed by Oliver. - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreGenerated.make: - -2008-03-10 Darin Adler - - - Windows build fix - - * kjs/function.cpp: (KJS::decode): Initialize variable. - -2008-03-10 Brent Fulgham - - Windows build fix - - Reviewed by Adam. - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreGenerated.make: - Set the PATH to include Cygwin before running touch. - -2008-03-10 Eric Seidel - - Build fix for JSC on windows. - - * API/JSStringRefCF.cpp: - (JSStringCreateWithCFString): - * kjs/function.cpp: - (KJS::decode): - * kjs/nodes2string.cpp: - (KJS::escapeStringForPrettyPrinting): - -2008-03-10 Eric Seidel - - No review, build fix only. - - Attempt to fix the windows build? - - * kjs/ustring.h: change unsigned short to UChar - -2008-03-10 Eric Seidel - - Reviewed by Darin. - - Remove KJS::UChar, use ::UChar instead - http://bugs.webkit.org/show_bug.cgi?id=17017 - - * API/JSStringRef.cpp: - (JSStringCreateWithCharacters): - (JSStringCreateWithUTF8CString): - * API/JSStringRefCF.cpp: - (JSStringCreateWithCFString): - * JavaScriptCore.exp: - * kjs/Parser.h: - * kjs/function.cpp: - (KJS::decode): - (KJS::parseInt): - (KJS::parseFloat): - (KJS::globalFuncEscape): - (KJS::globalFuncUnescape): - * kjs/function_object.cpp: - (KJS::FunctionObjectImp::construct): - * kjs/identifier.cpp: - (KJS::Identifier::equal): - (KJS::CStringTranslator::translate): - * kjs/interpreter.h: - * kjs/lexer.cpp: - (KJS::Lexer::setCode): - (KJS::Lexer::shift): - (KJS::Lexer::lex): - (KJS::Lexer::convertUnicode): - (KJS::Lexer::makeIdentifier): - * kjs/lookup.cpp: - (KJS::keysMatch): - * kjs/nodes2string.cpp: - (KJS::escapeStringForPrettyPrinting): - (KJS::SourceStream::operator<<): - * kjs/regexp.cpp: - (KJS::RegExp::RegExp): - (KJS::RegExp::match): - * kjs/string_object.cpp: - (KJS::substituteBackreferences): - (KJS::stringProtoFuncCharCodeAt): - (KJS::stringProtoFuncToLowerCase): - (KJS::stringProtoFuncToUpperCase): - (KJS::stringProtoFuncToLocaleLowerCase): - (KJS::stringProtoFuncToLocaleUpperCase): - * kjs/ustring.cpp: - (KJS::UString::Rep::computeHash): - (KJS::UString::UString): - (KJS::UString::append): - (KJS::UString::ascii): - (KJS::UString::operator=): - (KJS::UString::is8Bit): - (KJS::UString::toStrictUInt32): - (KJS::UString::find): - (KJS::operator==): - (KJS::operator<): - (KJS::compare): - (KJS::UString::UTF8String): - * kjs/ustring.h: - * pcre/pcre.h: - -2008-03-09 Steve Falkenburg - - Stop Windows build if an error occurs in a prior project. - - Rubber stamped by Darin. - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreGenerated.make: - * JavaScriptCore.vcproj/WTF/WTF.vcproj: - * JavaScriptCore.vcproj/testkjs/testkjs.vcproj: - -2008-03-09 J¸rg Billeter - - Reviewed by Alp Toker. - - Conditionalise ICU for Unicode in the GTK+ port. - - * wtf/Platform.h: - -2008-03-07 David D. Kilzer - - Unify concept of enabling Netscape Plug-in API (NPAPI). - - Reviewed by Darin. - - * wtf/Platform.h: Define ENABLE_NETSCAPE_PLUGIN_API here. - -2008-03-07 Geoffrey Garen - - Reviewed by Darin Adler. - - Fixed Stricter (ES4) eval semantics - - The basic rule is: - - - "eval(s)" is treated as an operator that gives the ES3 eval behavior. - ... but only if there is no overriding declaration of "eval" in scope. - - All other invocations treat eval as a function that evaluates a - script in the context of its "this" object. - ... but if its "this" object is not the global object it was - originally associated with, eval throws an exception. - - Because only expressions of the form "eval(s)" have access to local - scope, the compiler can now statically determine whether a function - needs local scope to be dynamic. - - * kjs/nodes.h: Added FunctionCallEvalNode. It works just like - FuncationCallResolveNode, except it statically indicates that the node - may execute eval in the ES3 way. - * kjs/nodes.cpp: - * kjs/nodes2string.cpp: - - * tests/mozilla/expected.html: This patch happens to fix a Mozilla JS - test, but it's a bit of a pyrrhic victory. The test intends to test - Mozilla's generic API for calling eval on any object, but, in reality, - we only support calling eval on the global object. - -2008-03-06 Steve Falkenburg - - Build fix. - - * JavaScriptCore.vcproj/testkjs/testkjs.vcproj: - -2008-03-06 Steve Falkenburg - - Build fix. - - * JavaScriptCore.vcproj/WTF/WTF.vcproj: - -2008-03-06 Alp Toker - - Fix the build fix in r30845 to support out-of-tree builds. - - * GNUmakefile.am: - -2008-03-06 Steve Falkenburg - - Build fix. - - * wtf/ThreadingWin.cpp: - (WTF::ThreadCondition::timedWait): - -2008-03-06 Darin Adler - - - another small step towards fixing the Qt build - - * JavaScriptCore.pri: Remove more references to the now-obsolete bindings directory. - -2008-03-06 Darin Adler - - - a small step towards fixing the Qt build - - * JavaScriptCore.pri: Remove references to files no longer present in JavaScriptCore/bindings. - -2008-03-06 Brady Eidson - - Gtk Build fix - - * wtf/ThreadingGtk.cpp: - (WTF::ThreadCondition::timedWait): - -2008-03-06 Alexey Proskuryakov - - Wx build fix. - - * wtf/unicode/icu/CollatorICU.cpp: - (WTF::Collator::userDefault): Put ICU workaround under both PLATFORM(DARWIN) and - PLATFORM(CF) checks, so that each port can decide if it wants to use CF on Mac for it. - -2008-03-06 Brady Eidson - - Reviewed by Darin - - Add a timedWait() method to ThreadCondition - - * JavaScriptCore.exp: - - * wtf/Threading.h: - - * wtf/ThreadingGtk.cpp: - (WTF::ThreadCondition::timedWait): - - * wtf/ThreadingNone.cpp: - (WTF::ThreadCondition::timedWait): - - * wtf/ThreadingPthreads.cpp: - (WTF::ThreadCondition::timedWait): - - * wtf/ThreadingWin.cpp: - (WTF::ThreadCondition::timedWait): Needs implementation - -2008-03-06 Alexey Proskuryakov - - More build fixes. - - * jscore.bkl: Add the wtf/unicode directory. - * wtf/unicode/CollatorDefault.cpp: - (WTF::Collator::userDefault): Use a constructor that does exist. - * wtf/unicode/icu/CollatorICU.cpp: Mac build fix for case-sensitive file systems. - -2008-03-06 Darin Adler - - - try to fix the Qt build - - * JavaScriptCore.pri: Add the wtf/unicode directory. - -2008-03-06 Darin Adler - - - try to fix the GTK build - - * GNUmakefile.am: Add a -I for the wtf/unicode directory. - -2008-03-06 Darin Adler - - - try to fix the Mac build - - * icu/unicode/parseerr.h: Copied from ../WebCore/icu/unicode/parseerr.h. - * icu/unicode/ucol.h: Copied from ../WebCore/icu/unicode/ucol.h. - * icu/unicode/uloc.h: Copied from ../WebCore/icu/unicode/uloc.h. - * icu/unicode/unorm.h: Copied from ../WebCore/icu/unicode/unorm.h. - * icu/unicode/uset.h: Copied from ../WebCore/icu/unicode/uset.h. - -2008-03-06 Alexey Proskuryakov - - Reviewed by Darin. - - Need to create a Collator abstraction for WebCore and JavaScriptCore - - * wtf/Threading.h: - (WTF::initializeThreading): - * wtf/ThreadingGtk.cpp: - (WTF::initializeThreading): - * wtf/ThreadingNone.cpp: - * wtf/ThreadingPthreads.cpp: - * wtf/ThreadingWin.cpp: - Added AtomicallyInitializedStatic. - - * kjs/string_object.cpp: (KJS::localeCompare): Changed to use Collator. - - * GNUmakefile.am: - * JavaScriptCore.exp: - * JavaScriptCore.pri: - * JavaScriptCore.vcproj/WTF/WTF.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - * JavaScriptCoreSources.bkl: - Added new fiiles to projects. - - * wtf/unicode/Collator.h: Added. - (WTF::Collator::): - * wtf/unicode/CollatorDefault.cpp: Added. - (WTF::Collator::Collator): - (WTF::Collator::~Collator): - (WTF::Collator::setOrderLowerFirst): - (WTF::Collator::collate): - * wtf/unicode/icu/CollatorICU.cpp: Added. - (WTF::cachedCollatorMutex): - (WTF::Collator::Collator): - (WTF::Collator::~Collator): - (WTF::Collator::setOrderLowerFirst): - (WTF::Collator::collate): - (WTF::Collator::createCollator): - (WTF::Collator::releaseCollator): - -2008-03-05 Kevin Ollivier - - Fix the wx build after the bindings move. - - * JavaScriptCoreSources.bkl: - * jscore.bkl: - -2008-03-05 Alp Toker - - GTK+ build fix for breakage introduced in r30800. - - Track moved bridge sources from JavaScriptCore to WebCore. - - * GNUmakefile.am: - -2008-03-05 Brent Fulgham - - Reviewed by Adam Roben. - - Remove definition of WTF_USE_SAFARI_THEME from wtf/Platform.h - because the PLATFORM(CG) flag is not set until config.h has - already included this file. - - * wtf/Platform.h: Remove useless definition of WTF_USE_SAFARI_THEME - -2008-03-05 Brady Eidson - - Reviewed by Alexey and Mark Rowe - - Fix for - Reproducible crash on storage/execute-sql-args.html - - DatabaseThread::unscheduleDatabaseTasks() manually filters through a MessageQueue, - removing particular items for Databases that were shutting down. - - This filtering operation is not atomic, and therefore causes a race condition with the - MessageQueue waking up and reading from the message queue. - - The end result was an attempt to dereference a null DatabaseTask. Timing-wise, this never - seemed to happen in a debug build, otherwise an assertion would've caught it. Replacing that - assertion with a crash in a release build is what revealed this bug. - - * wtf/MessageQueue.h: - (WTF::::waitForMessage): Tweak the waiting logic to check the queue's empty state then go back - to sleep if the queue was empty - checking m_killed each time it wakes up. - -2008-03-05 David D. Kilzer - - Remove unused header includes from interpreter.cpp. - - Reviewed by Darin. - - * kjs/interpreter.cpp: Remove unused header includes. - -2008-03-05 Anders Carlsson - - Reviewed by Sam. - - Remove bindings/. - - * bindings: Removed. - -2008-03-05 Anders Carlsson - - Don't build bindings/ anymore. - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - -2008-03-05 Anders Carlsson - - Reviewed by Geoff. - - Don't build JavaScriptCore/bindings. - - * JavaScriptCore.exp: - Export a couple of new functions. - - * JavaScriptCore.xcodeproj/project.pbxproj: - Remove bindings/ - - * kjs/config.h: - No need to define HAVE_JNI anymore. - - * kjs/interpreter.cpp: - Remove unnecessary include. - -2008-03-05 David D. Kilzer - - Allow override of default script file name using command-line argument. - - Reviewed by Adele. - - * API/minidom.c: - (main): Allow first command-line argument to override the default script - file name of "minidom.js". - * API/testapi.c: - (main): Allow first command-line argument to override the default script - file name of "testapi.js". - -2008-03-04 Mark Rowe - - Mac build fix. - - * JavaScriptCore.exp: Add new symbol to exports file. - -2008-03-03 Oliver Hunt - - Reviewed by Anders. - - Make ForInNode check for the timeout interrupt - - * kjs/nodes.cpp: - (KJS::ForInNode::execute): - -2008-03-02 Brent Fulgham - - Reviewed by Alp Toker. - - http://bugs.webkit.org/show_bug.cgi?id=17415 - GTK Build (using autotools) on Mac OS (DarwinPorts) Fails - - Add -lstdc++ to link flags for minidom program. This corrects - a build error for the GTK+ on Mac OS. - - * GNUmakefile.am: - -2008-03-01 Mark Rowe - - Reviewed by Tim Hatcher. - - Update Xcode configuration to support building debug and release from the mysterious future. - - * Configurations/Base.xcconfig: - * Configurations/DebugRelease.xcconfig: - -2008-02-29 Brent Fulgham - - http://bugs.webkit.org/show_bug.cgi?id=17483 - Implement scrollbars on Windows (Cairo) - - Reviewed by Adam Roben. - - * wtf/Platform.h: - -2008-02-29 Adam Roben - - Remove unused DebuggerImp::abort and DebuggerImp::aborted - - Reviewed by Tim and Sam. - - * kjs/function_object.cpp: - (KJS::FunctionObjectImp::construct): - * kjs/internal.h: - (KJS::DebuggerImp::DebuggerImp): - * kjs/nodes.cpp: - (KJS::Node::handleException): - (KJS::FunctionBodyNodeWithDebuggerHooks::execute): - -2008-02-28 Eric Christopher - - Reviewed by Geoffrey Garen. - - ** TOTAL **: 1.005x as fast 2867.6ms +/- 0.4% 2853.2ms +/- 0.3% significant - - * kjs/nodes.cpp: Tell the compiler that exceptions are unexpected (for - the sake of branch prediction and code organization). - -2008-02-27 Alexey Proskuryakov - - Reviewed by Sam Weinig. - - http://bugs.webkit.org/show_bug.cgi?id=17030 - Small buffer overflow within initialization - - * kjs/date_object.cpp: - (KJS::DateObjectFuncImp::callAsFunction): - (KJS::parseDate): - Remove unnecessary and incorrect memset() calls - GregorianDateTime can initialize itself. - -2008-02-25 Sam Weinig - - Reviewed by Dan Bernstein. - - - Add a variant of remove that takes a position and a length. - - * wtf/Vector.h: - (WTF::Vector::remove): - -2008-02-25 Mark Mentovai - - Reviewed by Mark Rowe. - - Enable CollectorHeapIntrospector to build by itself, as well as in an AllInOneFile build. - http://bugs.webkit.org/show_bug.cgi?id=17538 - - * kjs/CollectorHeapIntrospector.cpp: Provide "using" declaration for - WTF::RemoteMemoryReader. - * kjs/collector.h: Move CollectorHeap declaration here... - * kjs/collector.cpp: ... from here. - -2008-02-25 Darin Adler - - Reviewed by Adam. - - * JavaScriptCore.exp: Sort the contents of this file. - -2008-02-25 Adam Roben - - MSVC build fix - - * kjs/testkjs.cpp: - (functionQuit): Don't add a return statement after exit(0) for MSVC. - -2008-02-24 Sam Weinig - - Reviewed by Mark Rowe. - - http://bugs.webkit.org/show_bug.cgi?id=17529 - Add support for reading from stdin from testkjs - - * kjs/testkjs.cpp: - (GlobalObject::GlobalObject): Add readline function to global object. - (functionReadline): Added. Reads characters from stdin until a '\n' or - EOF is encountered. The input is returned as a String to the caller. - -2008-02-24 Sam Weinig - - Reviewed by Mark Rowe. - - http://bugs.webkit.org/show_bug.cgi?id=17528 - Give testkjs a bath - - * JavaScriptCore.exp: - * JavaScriptCore.xcodeproj/project.pbxproj: Make the testkjs.cpp use 4 space indentation. - * kjs/testkjs.cpp: - (StopWatch::getElapsedMS): - (GlobalObject::className): - (GlobalObject::GlobalObject): - Rename GlobalImp to GlobalObject and setup the global functions - in the GlobalObject's constructor. Also, use static functions for - the implementation so we can use the standard PrototypeFunction - class and remove TestFunctionImp. - (functionPrint): Move print() functionality here. - (functionDebug): Move debug() functionality here. - (functionGC): Move gc() functionality here. - (functionVersion): Move version() functionality here. - (functionRun): Move run() functionality here. - (functionLoad): Move load() functionality here. - (functionQuit): Move quit() functionality here. - (prettyPrintScript): Fix indentation. - (runWithScripts): Since all the functionality of createGlobalObject is - now in the GlobalObject constructor, just call new here. - (parseArguments): Fix indentation. - (kjsmain): Ditto - (fillBufferWithContentsOfFile): Ditto. - -2008-02-24 Sam Weinig - - Reviewed by Oliver Hunt and Mark Rowe. - - http://bugs.webkit.org/show_bug.cgi?id=17505 - Add support for getting command line arguments in testkjs - - - This slightly changes the behavior of parsing arguments by requiring - a '-f' before all files. - - * kjs/testkjs.cpp: - (createGlobalObject): Add a global property called 'arguments' which - contains an array with the parsed arguments as strings. - (runWithScripts): Pass in the arguments vector so that it can be passed - to the global object. - (parseArguments): Change parsing rules to require a '-f' before any script - file. After all '-f' and '-p' arguments have been parsed, the remaining - are added to the arguments vector and exposed to the script. If there is a - chance of ambiguity (the user wants to pass the string '-f' to the script), - the string '--' can be used separate the options from the pass through - arguments. - (kjsmain): - -2008-02-24 Dan Bernstein - - Reviewed by Darin Adler. - - - fix http://bugs.webkit.org/show_bug.cgi?id=17511 - REGRESSION: Reproducible crash in SegmentedSubstring::SegmentedSubstring(SegmentedSubstring const&) - - * wtf/Deque.h: - (WTF::::expandCapacityIfNeeded): Fixed the case where m_start and m_end - are both zero but the buffer capacity is non-zero. - (WTF::::prepend): Added validity checks. - -2008-02-23 Jan Michael Alonzo - - Rubber stamped by Darin. - - Add separator '\' after libJavaScriptCore_la_LIBADD and cleanup - whitespaces introduced in the previous commit. - - * GNUmakefile.am: - -2008-02-23 Jan Michael Alonzo - - * GNUmakefile.am: Add GLOBALDEPS for testkjs and minidom. - -2008-02-23 Darin Adler - - Reviewed by Anders. - - - http://bugs.webkit.org/show_bug.cgi?id=17496 - make Deque use a circular array; add iterators - - * wtf/Deque.h: Wrote an all-new version of this class that uses a circular - buffer. Growth policy is identical to vector. Added iterators. - - * wtf/Vector.h: Made two small refinements while using this to implement - Deque: Made VectorBufferBase derive from Noncopyable, which would have - saved me some debugging time if it had been there. Renamed Impl and - m_impl to Buffer and m_buffer. - -2008-02-23 Darin Adler - - Reviewed by Anders. - - - http://bugs.webkit.org/show_bug.cgi?id=17067 - eliminate attributes parameter from JSObject::put for speed/clarity - - * API/JSCallbackObject.h: Removed attribute arguments. - * API/JSCallbackObjectFunctions.h: - (KJS::JSCallbackObject::put): Ditto. - * API/JSObjectRef.cpp: - (JSObjectSetProperty): Use initializeVariable or putDirect when necessary - to set attribute values. - * JavaScriptCore.exp: Updated. - * bindings/objc/objc_runtime.h: Removed attribute arguments. - * bindings/objc/objc_runtime.mm: - (ObjcFallbackObjectImp::put): Ditto. - * bindings/runtime_array.cpp: - (RuntimeArray::put): Ditto. - * bindings/runtime_array.h: Ditto. - * bindings/runtime_object.cpp: - (RuntimeObjectImp::put): Ditto. - * bindings/runtime_object.h: Ditto. Also removed canPut which was only - called from one place in WebCore that can use hasProperty instead. - - * kjs/Activation.h: Removed attribute argument from put and added the new - initializeVariable function that's used to put variables in variable objects. - Also made isActivationObject a const member. - - * kjs/JSGlobalObject.cpp: - (KJS::JSGlobalObject::put): Removed attribute argument. - (KJS::JSGlobalObject::initializeVariable): Added. Used to give variables - their initial values, which can include the read-only property. - (KJS::JSGlobalObject::reset): Removed obsolete comments about flags. - Removed Internal flag, which is no longer needed. - * kjs/JSGlobalObject.h: More of the same. - - * kjs/JSVariableObject.h: Added pure virtual initializeVariable function. - (KJS::JSVariableObject::symbolTablePut): Removed checkReadOnly flag; we always - check read-only. - (KJS::JSVariableObject::symbolTableInitializeVariable): Added. - - * kjs/array_instance.cpp: - (KJS::ArrayInstance::put): Removed attribute argument. - * kjs/array_instance.h: Ditto. - - * kjs/function.cpp: - (KJS::FunctionImp::put): Ditto. - (KJS::Arguments::put): Ditto. - (KJS::ActivationImp::put): Ditto. - (KJS::ActivationImp::initializeVariable): Added. - * kjs/function.h: Removed attribute arguments. - - * kjs/function_object.cpp: - (KJS::FunctionObjectImp::construct): Removed Internal flag. - - * kjs/lookup.h: - (KJS::lookupPut): Removed attributes argument. Also changed to use putDirect - instead of calling JSObject::put. - (KJS::cacheGlobalObject): Ditto. - - * kjs/nodes.cpp: - (KJS::ConstDeclNode::handleSlowCase): Call initializeVariable to initialize - the constant. - (KJS::ConstDeclNode::evaluateSingle): Ditto. - (KJS::TryNode::execute): Use putDirect to set up the new object. - (KJS::FunctionBodyNode::processDeclarations): Removed Internal. - (KJS::ProgramNode::processDeclarations): Ditto. - (KJS::EvalNode::processDeclarations): Call initializeVariable to initialize - the variables and functions. - (KJS::FuncDeclNode::makeFunction): Removed Internal. - (KJS::FuncExprNode::evaluate): Ditto. - - * kjs/object.cpp: Removed canPut, which was only being used in one code path, - not the normal high speed one. - (KJS::JSObject::put): Removed attribute argument. Moved the logic from - canPut here, in the one code ath that was still using it. - * kjs/object.h: Removed Internal attribute, ad canPut function. Removed the - attributes argument to the put function. Made isActivationObject const. - - * kjs/regexp_object.cpp: - (KJS::RegExpImp::put): Removed attributes argument. - (KJS::RegExpImp::putValueProperty): Ditto. - (KJS::RegExpObjectImp::put): Ditto. - (KJS::RegExpObjectImp::putValueProperty): Ditto. - * kjs/regexp_object.h: Ditto. - - * kjs/string_object.cpp: - (KJS::StringInstance::put): Removed attributes argument. - * kjs/string_object.h: Ditto. - -2008-02-23 Jan Michael Alonzo - - Not reviewed, Gtk build fix. - - * kjs/testkjs.pro: - -2008-02-23 Alexey Proskuryakov - - Windows build fix - move ThreadCondition implementation from WebCore to WTF. - - * wtf/ThreadingWin.cpp: - (WTF::ThreadCondition::ThreadCondition): - (WTF::ThreadCondition::~ThreadCondition): - (WTF::ThreadCondition::wait): - (WTF::ThreadCondition::signal): - (WTF::ThreadCondition::broadcast): - -2008-02-23 Alexey Proskuryakov - - Touch some files, hoping that Windows build bot will create JSC headers. - - * kjs/AllInOneFile.cpp: - * kjs/array_instance.cpp: - * wtf/HashTable.cpp: - -2008-02-23 Alexey Proskuryakov - - Qt/Wx build fix - this file was still in a wrong namespace, too. - - * wtf/ThreadingNone.cpp: - -2008-02-23 Alexey Proskuryakov - - More build fixing - fix mismatched braces. - - * JavaScriptCore.pri: - -2008-02-23 Alexey Proskuryakov - - Wx and Gtk build fixes. - - * JavaScriptCore.pri: Don't try to compile ThreadingPthreads. - * wtf/ThreadingGtk.cpp: Use a correct namespace. - -2008-02-23 Alexey Proskuryakov - - Reviewed by Darin. - - Move basic threading support from WebCore to WTF. - - Added mutex protection to MessageQueue::killed() for paranoia sake. - - * GNUmakefile.am: - * JavaScriptCore.exp: - * JavaScriptCore.pri: - * JavaScriptCore.vcproj/WTF/WTF.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - * JavaScriptCoreSources.bkl: - * wtf/Locker.h: Copied from WebCore/platform/Locker.h. - * wtf/MessageQueue.h: Copied from WebCore/platform/MessageQueue.h. - (WTF::::killed): - * wtf/Threading.h: Copied from WebCore/platform/Threading.h. - * wtf/ThreadingGtk.cpp: Copied from WebCore/platform/gtk/ThreadingGtk.cpp. - (WebCore::createThread): - * wtf/ThreadingNone.cpp: Copied from WebCore/platform/ThreadingNone.cpp. - * wtf/ThreadingPthreads.cpp: Copied from WebCore/platform/pthreads/ThreadingPthreads.cpp. - (WTF::createThread): - * wtf/ThreadingWin.cpp: Copied from WebCore/platform/win/ThreadingWin.cpp. - (WTF::createThread): - (WTF::Mutex::Mutex): - (WTF::Mutex::~Mutex): - (WTF::Mutex::lock): - (WTF::Mutex::tryLock): - (WTF::Mutex::unlock): - -2008-02-22 Geoffrey Garen - - Reviewed by Sam Weinig. - - Partial fix for Gmail out of memory (17455) - - I'm removing KJS_MEM_LIMIT for the following reasons: - - - We have a few reports of KJS_MEM_LIMIT breaking important web - applications, like GMail and Google Reader. (For example, if you - simply open 12 GMail tabs, tab #12 will hit the limit.) - - - Firefox has no discernable JS object count limit, so any limit, even - a large one, is a potential compatibility problem. - - - KJS_MEM_LIMIT does not protect against malicious memory allocation, - since there are many ways to maliciously allocate memory without - increasing the JS object count. - - - KJS_MEM_LIMIT is already mostly broken, since it only aborts the - script that breaches the limit, not any subsequent scripts. - - - We've never gotten bug reports about websites that would have - benefited from an unbroken KJS_MEM_LIMIT. The initial check-in of - KJS_MEM_LIMIT (KJS revision 80061) doesn't mention a website that - needed it. - - - Any website that brings you anywhere close to crashing due to the - number of live JS objects will almost certainly put up the "slow - script" dialog at least 20 times beforehand. - - * kjs/collector.cpp: - (KJS::Collector::collect): - * kjs/collector.h: - * kjs/nodes.cpp: - (KJS::TryNode::execute): - -2008-02-22 Oliver Hunt - - Reviewed by Alexey P. - - REGRESSION: while(NaN) acts like while(true) - - Fix yet another case where we incorrectly relied on implicit double - to bool coercion. - - * kjs/nodes.cpp: - (KJS::PostDecLocalVarNode::evaluateToBoolean): - -2008-02-20 Michael Knaup - - Reviewed by Darin. - - Fix for Bug 16753: date set methods with no args should result in NaN (Acid3 bug) - The set values result in NaN now when called with no args, NaN or +/- inf values. - The setYear, setFullYear and setUTCFullYear methods used on NaN dates work as - descripted in the standard. - - * kjs/date_object.cpp: - (KJS::fillStructuresUsingTimeArgs): - (KJS::fillStructuresUsingDateArgs): - (KJS::setNewValueFromTimeArgs): - (KJS::setNewValueFromDateArgs): - (KJS::dateProtoFuncSetYear): - -2008-02-19 Anders Carlsson - - Reviewed by Darin. - - Change OpaqueJSClass and RootObject to start with a ref count of 1. - - * API/JSClassRef.cpp: - (OpaqueJSClass::OpaqueJSClass): - (OpaqueJSClass::createNoAutomaticPrototype): - (OpaqueJSClass::create): - * API/JSClassRef.h: - * API/JSObjectRef.cpp: - (JSClassCreate): - * bindings/runtime_root.cpp: - (KJS::Bindings::RootObject::create): - (KJS::Bindings::RootObject::RootObject): - -2008-02-19 Darin Adler - - Rubber stamped by Anders. - - - removed explicit initialization to 1 for RefCounted; that's now the default - - * kjs/regexp.cpp: - (KJS::RegExp::RegExp): Removed RefCounted initializer. - -2008-02-19 Darin Adler - - Reviewed by Anders. - - - next step for http://bugs.webkit.org/show_bug.cgi?id=17257 - start ref counts at 1 instead of 0 for speed - - * wtf/RefCounted.h: - (WTF::RefCounted::RefCounted): Have refcounts default to 1. This allows us to start - removing the explicit initialization of RefCounted from classes and eventually we - can remove the ability to have the initial count of 0 entirely. - -2008-02-18 Samuel Weinig - - Reviewed by Geoff Garen. - - Fix for http://bugs.webkit.org/show_bug.cgi?id=17419 - Remove CompatMode from JavaScriptCore as it is never set to anything other than NativeMode - - * kjs/JSGlobalObject.cpp: - (KJS::JSGlobalObject::init): - * kjs/JSGlobalObject.h: - (KJS::JSGlobalObject::setDebugger): - * kjs/date_object.cpp: - (KJS::dateProtoFuncGetYear): - -2008-02-18 Darin Adler - - Reviewed by Sam. - - * wtf/ASCIICType.h: - (WTF::toASCIIHexValue): Added. - -2008-02-17 Darin Adler - - * wtf/ListHashSet.h: (WTF::swap): Removed stray return statement. - -2008-02-15 Adam Roben - - Make JavaScriptCore's FEATURE_DEFINES match WebCore's - - Reviewed by Mark. - - * Configurations/JavaScriptCore.xcconfig: - -2008-02-14 Stephanie Lewis - - Reviewed by Geoff. - - Update order files. - - * JavaScriptCore.order: - -2008-02-14 Geoffrey Garen - - Reviewed by Sam Weinig. - - Fixed nee http://bugs.webkit.org/show_bug.cgi?id=17329 - Crash in JSGlobalObject::popActivation when inserting hyperlink in Wordpress (17329) - - Don't reset the "activations" stack in JSGlobalObject::reset, since we - might be executing a script during the call to reset, and the script - needs to safely run to completion. - - Instead, initialize the "activations" stack when the global object is - created, and subsequently rely on pushing and popping during normal - execution to maintain the stack's state. - - * kjs/JSGlobalObject.cpp: - (KJS::JSGlobalObject::init): - (KJS::JSGlobalObject::reset): - -2008-02-13 Bernhard Rosenkraenzer - - Reviewed by Darin. - - - http://bugs.webkit.org/show_bug.cgi?id=17339 - JavaScriptCore does not build with gcc 4.3 - - * kjs/interpreter.cpp: Add include of , since that's where - getpid() comes from. - -2008-02-13 Oliver Hunt - - Reviewed by Alexey P. - - REGRESSION (r27747): can't browse pictures on fastcupid.com - - When converting numeric values to booleans we need to account for NaN - - * kjs/nodes.cpp: - (KJS::MultNode::evaluateToBoolean): - (KJS::ModNode::evaluateToBoolean): - -2008-02-08 Samuel Weinig - - Reviewed by Brady Eidson. - - REGRESSION: PLT 0.3% slower due to r28868 (caching ClassNodeList and NamedNodeList) - - - Tweak the statements in isASCIISpace to account for the statistical distribution of - usage in the PLT. - - .4% speedup on my machine. Stephanie's machine shows this as .3% speedup. - - * wtf/ASCIICType.h: - (WTF::isASCIISpace): - -2008-02-11 Sam Weinig - - Reviewed by Anders Carlsson. - - Fixes for: - Match Firefox's cross-domain model more accurately by return the built-in version of functions even if they have been overridden - Crash when setting the Window objects prototype to a custom Object and then calling a method on it - - - Expose the native Object.prototype.toString implementation so that it can be used for cross-domain - toString calling. - - * JavaScriptCore.exp: - * kjs/object_object.cpp: - * kjs/object_object.h: - -2008-02-10 Darin Adler - - Rubber stamped by Eric. - - * kjs/ExecState.h: - (KJS::ExecState::takeException): Added. - -2008-02-10 Darin Adler - - Reviewed by Eric. - - - http://bugs.webkit.org/show_bug.cgi?id=17256 - eliminate default ref. count of 0 in RefCounted class - - * wtf/RefCounted.h: - (WTF::RefCounted::RefCounted): Remove default of 0. - -2008-02-10 Darin Adler - - Reviewed by Eric. - - - http://bugs.webkit.org/show_bug.cgi?id=17256 - Make clients of RefCounted explicitly set the count to 0. - - * API/JSClassRef.cpp: - (OpaqueJSClass::OpaqueJSClass): - * bindings/runtime_root.cpp: - (KJS::Bindings::RootObject::RootObject): - -2008-02-09 Darin Adler - - Reviewed by Mitz. - - - http://bugs.webkit.org/show_bug.cgi?id=17256 - Change RegExp to start its ref count at 1, not 0 - - We'll want to do this to every RefCounted class, one at a time. - - * kjs/nodes.h: - (KJS::RegExpNode::RegExpNode): Use RegExp::create instead of new RegExp. - * kjs/regexp.cpp: - (KJS::RegExp::RegExp): Marked inline, set initial ref count to 1. - (KJS::RegExp::create): Added. Calls new RegExp then adopts the initial ref. - * kjs/regexp.h: Reformatted. Made the constructors private. Added static - create functions that return objects already wrapped in PassRefPtr. - * kjs/regexp_object.cpp: - (KJS::regExpProtoFuncCompile): Use RegExp::create instead of new RegExp. - (KJS::RegExpObjectImp::construct): Ditto. - * kjs/string_object.cpp: - (KJS::stringProtoFuncMatch): Ditto. - (KJS::stringProtoFuncSearch): Ditto. - -2008-02-08 Oliver Hunt - - Reviewed by Maciej. - - REGRESSION (r28973): Extraneous parentheses in function.toString() - https://bugs.webkit.org/show_bug.cgi?id=17214 - - Make a subclass of CommaNode to provide the correct precedence for each expression in - a variable declaration list. - - * kjs/grammar.y: - * kjs/nodes.h: - (KJS::VarDeclCommaNode::): - -2008-02-08 Darin Adler - - Reviewed by Oliver. - - - fix http://bugs.webkit.org/show_bug.cgi?id=17247 - Labelled continue/break can fail in some cases - - Test: fast/js/continue-break-multiple-labels.html - - * kjs/nodes.h: - (KJS::StatementNode::pushLabel): Made this virtual. - (KJS::LabelNode::pushLabel): Forward pushLabel calls to the statement inside. - -2008-02-08 Darin Adler - - Reviewed by Eric. - - - fix http://bugs.webkit.org/show_bug.cgi?id=15003 - Function.prototype.constructor should not be DontDelete/ReadOnly (Acid3 bug) - - Test: fast/js/constructor-attributes.html - - * kjs/JSGlobalObject.cpp: - (KJS::JSGlobalObject::reset): Remove unwanted attributes from "constructor". - * kjs/function_object.cpp: - (KJS::FunctionObjectImp::construct): Ditto. - * kjs/nodes.cpp: - (KJS::FuncDeclNode::makeFunction): Ditto. - (KJS::FuncExprNode::evaluate): Ditto. - -2008-02-06 Geoffrey Garen - - Reviewed by Oliver Hunt. - - Added an ASSERT to catch refCount underflow, since it caused a leak in - my last check-in. - - * wtf/RefCounted.h: - (WTF::RefCounted::deref): - -2008-02-06 Geoffrey Garen - - Reviewed by Darin Adler. - - PLT speedup related to REGRESSION: PLT .4% - slower due to r28884 (global variable symbol table optimization) - - Tweaked RefCounted::deref() to be a little more efficient. - - 1% - 1.5% speedup on my machine. .7% speedup on Stephanie's machine. - - * wtf/RefCounted.h: - (WTF::RefCounted::deref): Don't modify m_refCount if we're just going - to delete the object anyway. Also, use a simple == test, which might be - faster than <= on some hardware. - -2008-02-06 Darin Adler - - Reviewed by Sam. - - - fix http://bugs.webkit.org/show_bug.cgi?id=17094 - Array.prototype functions create length properties with DontEnum/DontDelete - - Test results match Gecko with very few obscure exceptions that seem to be - bugs in Gecko. - - Test: fast/js/array-functions-non-arrays.html - - * kjs/array_object.cpp: - (KJS::arrayProtoFuncConcat): Removed DontEnum and DontDelete from the call - to set length. - (KJS::arrayProtoFuncPop): Ditto. Also added missing call to deleteProperty, - which is not needed for real arrays, but is needed for non-arrays. - (KJS::arrayProtoFuncPush): Ditto. - (KJS::arrayProtoFuncShift): Ditto. - (KJS::arrayProtoFuncSlice): Ditto. - (KJS::arrayProtoFuncSort): Removed incorrect call to set length when - the array has no elements. - (KJS::arrayProtoFuncSplice): Removed DontEnum and DontDelete from the call - to set length. - (KJS::arrayProtoFuncUnShift): Ditto. Also added a check for 0 arguments to - make behavior match the specification in that case. - * kjs/nodes.cpp: - (KJS::ArrayNode::evaluate): Removed DontEnum and DontDelete from the call - to set length. - -2008-02-06 Darin Adler - - Reviewed by Sam. - - - replace calls to put to set up properties with calls to putDirect, to - prepare for a future change where put won't take attributes any more, - and for a slight performance boost - - * API/JSObjectRef.cpp: - (JSObjectMakeConstructor): Use putDirect instead of put. - * kjs/CommonIdentifiers.h: Removed lastIndex. - * kjs/JSGlobalObject.cpp: - (KJS::JSGlobalObject::reset): Use putDirect instead of put. - * kjs/array_object.cpp: - (KJS::arrayProtoFuncConcat): Took out extra call to get length (unused). - (KJS::ArrayObjectImp::ArrayObjectImp): Use putDirect instead of put. - * kjs/error_object.cpp: - (KJS::ErrorPrototype::ErrorPrototype): Use putDirect instead of put. - * kjs/function.cpp: - (KJS::Arguments::Arguments): Use putDirect instead of put. - (KJS::PrototypeFunction::PrototypeFunction): Use putDirect instead of put. - * kjs/function_object.cpp: - (KJS::FunctionObjectImp::construct): Use putDirect instead of put. - * kjs/nodes.cpp: - (KJS::FuncDeclNode::makeFunction): Use putDirect instead of put. - (KJS::FuncExprNode::evaluate): Use putDirect instead of put. - * kjs/regexp_object.cpp: - (KJS::regExpProtoFuncCompile): Use setLastIndex instead of put(lastIndex). - (KJS::RegExpImp::match): Get and set lastIndex by using m_lastIndex instead of - calling get and put. - * kjs/regexp_object.h: - (KJS::RegExpImp::setLastIndex): Added. - * kjs/string_object.cpp: - (KJS::stringProtoFuncMatch): Use setLastIndex instead of put(lastIndex). - -2008-02-05 Sam Weinig - - Reviewed by Anders Carlsson. - - Fix for http://bugs.webkit.org/show_bug.cgi?id=8080 - NodeList (and other DOM lists) items are not enumeratable using for..in - - * JavaScriptCore.exp: - -2008-02-05 Mark Rowe - - Reviewed by Oliver Hunt. - - Update versioning to support the mysterious future. - - * Configurations/Version.xcconfig: Add SYSTEM_VERSION_PREFIX_1060. - -2008-02-04 Cameron Zwarich - - Reviewed by Oliver Hunt. - - Fixes Bug 16889: REGRESSION (r29425): Canvas-based graphing calculator fails to run - Bug 17015: REGRESSION (r29414-29428): www.fox.com "shows" menu fails to render - Bug 17164: REGRESSION: JavaScript pop-up menu appears at wrong location when hovering image at http://news.chinatimes.com/ - - - - - - - - - - The ActivationImp tear-off (r29425) introduced a problem with ReadModify - nodes that first resolve a slot, call valueForReadModifyNode(), and then - store a value in the previously resolved slot. Since valueForReadModifyNode() - may cause a tear-off, the slot needs to be resolved again, but this was - not happening with the existing code. - - * kjs/nodes.cpp: - (KJS::ReadModifyLocalVarNode::evaluate): - (KJS::ReadModifyResolveNode::evaluate): - -2008-02-04 Cameron McCormack - - Reviewed by Geoff Garen. - - Remove some unneccesary UNUSED_PARAMs. Clarify ownership rule of return value of JSObjectCopyPropertyNames. - - * API/JSNode.c: - (JSNode_appendChild): - (JSNode_removeChild): - (JSNode_replaceChild): - (JSNode_getNodeType): - (JSNode_getFirstChild): - * API/JSNodeList.c: - (JSNodeList_length): - * API/JSObjectRef.h: - -2008-02-04 Rodney Dawes - - Reviewed by Alp Toker and Mark Rowe. - - Fix http://bugs.webkit.org/show_bug.cgi?id=17175. - Bug 17175: Use of C++ compiler flags in CFLAGS - - * GNUmakefile.am: Use global_cxxflags as well as global_cflags in CXXFLAGS. - -2008-02-04 Alp Toker - - Rubber-stamped by Mark Rowe. - - Remove all trailing whitespace in the GTK+ port and related - components. - - * GNUmakefile.am: - -2008-02-02 Darin Adler - - Reviewed by Geoff Garen. - - PLT speedup related to REGRESSION: PLT .4% - slower due to r28884 (global variable symbol table optimization) - - Geoff's theory is that the slowdown was due to copying hash tables when - putting things into the back/forward cache. If that's true, then this - should fix the problem. - - (According to Geoff's measurements, in a PLT that exaggerates the - importance of symbol table saving during cached page creation, this - patch is a ~3X speedup in cached page creation, and a 9% speedup overall.) - - * JavaScriptCore.exp: Updated. - - * kjs/JSVariableObject.cpp: - (KJS::JSVariableObject::saveLocalStorage): Updated for changes to SavedProperty, - which has been revised to avoid initializing each SavedProperty twice when building - the array. Store the property names too, so we don't have to store the symbol table - separately. Do this by iterating the symbol table instead of the local storage vector. - (KJS::JSVariableObject::restoreLocalStorage): Ditto. Restore the symbol table as - well as the local storage vector. - - * kjs/JSVariableObject.h: Removed save/restoreSymbolTable and do that work inside - save/restoreLocalStorage instead. Made restoreLocalStorage a non-const member function - that takes a const reference to a SavedProperties object. - - * kjs/LocalStorage.h: Changed attributes to be unsigned instead of int to match - other declarations of attributes elsewhere. - - * kjs/property_map.cpp: - (KJS::SavedProperties::SavedProperties): Updated for data member name change. - (KJS::PropertyMap::save): Updated for data member name change and to use the new - inline init function instead of setting the fields directly. This allows us to - skip initializing the SavedProperty objects when first allocating the array, and - just do it when we're actually setting up the individual elements. - (KJS::PropertyMap::restore): Updated for SavedProperty changes. - - * kjs/property_map.h: Changed SavedProperty from a struct to a class. Set it up so - it does not get initialized at construction time to avoid initializing twice when - creating an array of SavedProperty. Removed the m_ prefixes from the members of - the SavedProperties struct. Generally we use m_ for class members and not struct. - -2008-02-02 Tony Chang - - Reviewed by darin. Landed by eseidel. - - Add #define guards for WIN32_LEAN_AND_MEAN and _CRT_RAND_S. - - * kjs/config.h: - * wtf/FastMalloc.cpp: - * wtf/TCSpinLock.h: - -2008-01-28 Sam Weinig - - Rubber-stamped by Darin Adler. - - - Fix whitespace in nodes.h/cpp and nodes2string.cpp. - - (NOTE: Specific changed functions elided for space and clarity) - * kjs/nodes.cpp: - * kjs/nodes.h: - * kjs/nodes2string.cpp: - -2008-01-27 Sam Weinig - - Reviewed by Oliver Hunt. - - Patch for http://bugs.webkit.org/show_bug.cgi?id=17025 - nodes.h/cpp has been rolling around in the mud - lets hose it down - - - Rename member variables to use the m_ prefix. - - (NOTE: Specific changed functions elided for space and clarity) - * kjs/grammar.y: - * kjs/nodes.cpp: - * kjs/nodes.h: - * kjs/nodes2string.cpp: - -2008-01-27 Darin Adler - - Reviewed by Oliver. - - - fix REGRESSION: const is broken - - Test: fast/js/const.html - - SunSpider said this was 0.3% slower. And I saw some Shark samples in - JSGlobalObject::put -- not a lot but a few. We may be able to regain the - speed, but for now we will take that small hit for correctness sake. - - * kjs/JSGlobalObject.cpp: - (KJS::JSGlobalObject::put): Pass the checkReadOnly flag in to symbolTablePut - instead of passing attributes. - - * kjs/JSVariableObject.h: - (KJS::JSVariableObject::symbolTablePut): Removed the code to set attributes - here, since we only set attributes when creating a property. Added the code - to check read-only here, since we need that to implement const! - - * kjs/function.cpp: - (KJS::ActivationImp::put): Pass the checkReadOnly flag in to symbolTablePut - instead of passing attributes. - - * kjs/nodes.cpp: - (KJS::isConstant): Added. - (KJS::PostIncResolveNode::optimizeVariableAccess): Create a PostIncConstNode - if optimizing for a local variable and the variable is constant. - (KJS::PostDecResolveNode::optimizeVariableAccess): Ditto. But PostDecConstNode. - (KJS::PreIncResolveNode::optimizeVariableAccess): Ditto. But PreIncConstNode. - (KJS::PreDecResolveNode::optimizeVariableAccess): Ditto. But PreDecConstNode. - (KJS::PreIncConstNode::evaluate): Return the value + 1. - (KJS::PreDecConstNode::evaluate): Return the value - 1. - (KJS::PostIncConstNode::evaluate): Return the value converted to a number. - (KJS::PostDecConstNode::evaluate): Ditto. - (KJS::ReadModifyResolveNode::optimizeVariableAccess): Create a ReadModifyConstNode - if optimizing for a local variable and the variable is constant. - (KJS::AssignResolveNode::optimizeVariableAccess): Ditto. But AssignConstNode. - (KJS::ScopeNode::optimizeVariableAccess): Pass the local storage to the - node optimizeVariableAccess functions, since that's where we need to look to - figure out if a variable is constant. - (KJS::FunctionBodyNode::processDeclarations): Moved the call to - optimizeVariableAccess until after localStorage is set up. - (KJS::ProgramNode::processDeclarations): Ditto. - - * kjs/nodes.h: Fixed the IsConstant and HasInitializer values. They are used - as flag masks, so a value of 0 will not work for IsConstant. Changed the - first parameter to optimizeVariableAccess to be a const reference to a symbol - table and added a const reference to local storage. Added classes for const - versions of local variable access: PostIncConstNode, PostDecConstNode, - PreIncConstNode, PreDecConstNode, ReadModifyConstNode, and AssignConstNode. - - * kjs/object.cpp: - (KJS::JSObject::put): Tweaked comments a bit, and changed the checkReadOnly - expression to match the form used at the two other call sites. - -2008-01-27 Darin Adler - - Reviewed by Oliver. - - - fix http://bugs.webkit.org/show_bug.cgi?id=16498 - ''.constructor.toString() gives [function] - - Test: fast/js/function-names.html - - * kjs/array_object.cpp: - (KJS::ArrayObjectImp::ArrayObjectImp): Use the class name as the constructor's function name. - * kjs/bool_object.cpp: - (KJS::BooleanObjectImp::BooleanObjectImp): Ditto. - * kjs/date_object.cpp: - (KJS::DateObjectImp::DateObjectImp): Ditto. - * kjs/error_object.cpp: - (KJS::ErrorPrototype::ErrorPrototype): Make the error object be an Error. - (KJS::ErrorObjectImp::ErrorObjectImp): Use the class name as the constructor's function name. - (KJS::NativeErrorPrototype::NativeErrorPrototype): Take const UString&. - (KJS::NativeErrorImp::NativeErrorImp): Use the prototype's name as the constructor's function - name. - * kjs/error_object.h: Change ErrorPrototype to inherit from ErrorInstance. Change the - NativeErrorImp constructor to take a NativeErrorPrototype pointer for its prototype. - * kjs/function.h: Removed unneeded constructor for internal functions without names. - We want to avoid those! - * kjs/function_object.cpp: - (KJS::functionProtoFuncToString): Removed code that writes out just [function] for functions - that have no names. There's no reason to do that. - (KJS::FunctionObjectImp::FunctionObjectImp): Use the class name as the constructor's - function name. - * kjs/internal.cpp: Removed the unused constructor. - * kjs/number_object.cpp: - (KJS::fractionalPartToString): Marked static for internal linkage. - (KJS::exponentialPartToString): Ditto. - (KJS::numberProtoFuncToPrecision): Removed an unneeded else. - (KJS::NumberObjectImp::NumberObjectImp): Use the class name as the constructor's - function name. - (KJS::NumberObjectImp::getValueProperty): Tweaked formatting. - * kjs/object_object.cpp: - (KJS::ObjectObjectImp::ObjectObjectImp): Use "Object" for the function name. - * kjs/regexp_object.cpp: - (KJS::RegExpObjectImp::RegExpObjectImp): Use "RegExp" for the function name. - * kjs/string_object.cpp: - (KJS::StringObjectImp::StringObjectImp): Use the class name as the constructor's - function name. - -2008-01-26 Darin Adler - - Reviewed by Oliver. - - - fix http://bugs.webkit.org/show_bug.cgi?id=17027 - Incorrect Function.toString behaviour with read/modify/write operators performed on negative numbers - - Test: fast/js/function-toString-parentheses.html - - The problem here was that a NumberNode with a negative number in it had the wrong - precedence. It's not a primary expression, it's a unary operator with a primary - expression after it. - - Once the precedence of NumberNode was fixed, the cases from bug 17020 were also - fixed without trying to treat bracket nodes like dot nodes. That wasn't needed. - The reason we handle numbers before dot nodes specially is that the dot is a - legal character in a number. The same is not true of a bracket. Eventually we - could get smarter, and only add the parentheses when there is actual ambiguity. - There is none if the string form of the number already has a dot in it, or if - it's a number with a alphabetic name like infinity or NAN. - - * kjs/nodes.h: Renamed back from ObjectAccess to DotExpr. - (KJS::NumberNode::precedence): Return PrecUnary for negative numbers, since - they serialize as a unary operator, not a primary expression. - * kjs/nodes2string.cpp: - (KJS::SourceStream::operator<<): Clear m_numberNeedsParens if this adds - parens; one set is enough. - (KJS::bracketNodeStreamTo): Remove unneeded special flag here. Normal - operator precedence suffices. - (KJS::NewExprNode::streamTo): Ditto. - -2008-01-26 Oliver Hunt - - Reviewed by Maciej and Darin. - - Fix for http://bugs.webkit.org/show_bug.cgi?id=17020 - Function.toString does not parenthesise numbers for the bracket accessor - - It turns out that logic was there for all of the dot accessor nodes to make numbers be - parenthesised properly, so it was a trivial extension to extend that to the bracket nodes. - I renamed the enum type to reflect the fact that it is now used for both dot and bracket - accessors. - - * kjs/nodes2string.cpp: - (KJS::bracketNodeStreamTo): - (KJS::BracketAccessorNode::streamTo): - -2008-01-26 Oliver Hunt - - Reviewed by Darin. - - Fix Bug 17018: Incorrect code generated from Function.toString for get/setters in object literals - - Don't quote getter and setter names during output, as that is simply wrong. - - * kjs/nodes2string.cpp: - (KJS::PropertyNode::streamTo): - -2008-01-26 Darin Adler - - Reviewed by Eric Seidel. - - - http://bugs.webkit.org/show_bug.cgi?id=16860 - a bit of cleanup after the Activation optimization - - * JavaScriptCore.exp: Export the GlobalExecState constructor instead of - the global flavor of the ExecState constructor. It'd probably be cleaner - to not export either one, but JSGlobalObject inlines the code that - constructs the ExecState. If we changed that, we could remove this export. - - * JavaScriptCore.xcodeproj/project.pbxproj: Re-sorted a few things and - put the new source files into the kjs group rather than at the top level. - - * kjs/ExecState.cpp: - (KJS::ExecState::ExecState): Marked inline and updated for data member - name changes. This is now only for use for the derived classes. Also removed - code that sets the unused m_savedExec data member for the global case. That - data member is only used for the other two types. - (KJS::ExecState::~ExecState): Marked inline and removed all the code. - The derived class destructors now inclde the appropriate code. - (KJS::ExecState::lexicalGlobalObject): Removed unneeded special case for - an empty scope chain. The bottom function already returns 0 for that case, - so the general case code handles it fine. Also changed to use data members - directly rather than calling functions. - (KJS::GlobalExecState::GlobalExecState): Added. Calls through to the base - class constructor. - (KJS::GlobalExecState::~GlobalExecState): Added. - (KJS::InterpreterExecState::InterpreterExecState): Added. Moved code to - manipulate activeExecStates here since we don't want to have to check for the - special case of globalExec. - (KJS::InterpreterExecState::~InterpreterExecState): Added. - (KJS::EvalExecState::EvalExecState): Added. - (KJS::EvalExecState::~EvalExecState): Added. - (KJS::FunctionExecState::FunctionExecState): Added. - (KJS::FunctionExecState::~FunctionExecState): Added. - - * kjs/ExecState.h: Tweaked the header, includes, and declarations a bit. - Made ExecState inherit from Noncopyable. Reformatted some comments and - made them a bit more brief. Rearranged declarations a little bit and removed - unused savedExec function. Changed seenLabels function to return a reference - rather than a pointer. Made constructors and destructor protected, and also - did the same with all data members. Renamed m_thisVal to m_thisValue and - ls to m_labelStack. Added three new derived classes for each of the - types of ExecState. The primary goal here was to remove a branch from the - code in the destructor, but it's also clearer than overloading the arguments - to the ExecState constructor. - - * kjs/JSGlobalObject.cpp: - (KJS::getCurrentTime): Fixed formatting. - (KJS::JSGlobalObject::pushActivation): Removed parentheses that don't make - the expression clearer -- other similar sites didn't have these parentheses, - even the one a couple lines earlier that sets stackEntry. - (KJS::JSGlobalObject::tearOffActivation): Got rid of unneeded static_cast - (I think I mentioned this during patch review) and used an early exit so that - the entire contents of the function aren't nested inside an if statement. - Also removed the check of codeType, instead checking Activation for 0. - For now, I kept the codeType check, but inside an assertion. - - * kjs/JSGlobalObject.h: Changed type of globalExec to GlobalExecState. - * kjs/function.cpp: - (KJS::FunctionImp::callAsFunction): Changed type to FunctionExecState. - (KJS::GlobalFuncImp::callAsFunction): Changed type to EvalExecState. - * kjs/interpreter.cpp: - (KJS::Interpreter::evaluate): Changed type to GlobalExecState. - - * kjs/nodes.cpp: - (KJS::ContinueNode::execute): Changed code since seenLabels() returns a - reference now instead of a pointer. - (KJS::BreakNode::execute): Ditto. - (KJS::LabelNode::execute): Ditto. - -2008-01-26 Sam Weinig - - Reviewed by Mark Rowe. - - Cleanup node2string a little. - - Remove some unnecessary branching. - - Factor out bracket and dot streaming into static inline functions. - - * kjs/nodes.h: - * kjs/nodes2string.cpp: - (KJS::bracketNodeStreamTo): - (KJS::dotNodeStreamTo): - (KJS::FunctionCallBracketNode::streamTo): - (KJS::FunctionCallDotNode::streamTo): - (KJS::PostIncBracketNode::streamTo): - (KJS::PostDecBracketNode::streamTo): - (KJS::PostIncDotNode::streamTo): - (KJS::PostDecDotNode::streamTo): - (KJS::DeleteBracketNode::streamTo): - (KJS::DeleteDotNode::streamTo): - (KJS::PreIncBracketNode::streamTo): - (KJS::PreDecBracketNode::streamTo): - (KJS::PreIncDotNode::streamTo): - (KJS::PreDecDotNode::streamTo): - (KJS::ReadModifyBracketNode::streamTo): - (KJS::AssignBracketNode::streamTo): - (KJS::ReadModifyDotNode::streamTo): - (KJS::AssignDotNode::streamTo): - (KJS::WhileNode::streamTo): - -2008-01-26 Mark Rowe - - Reviewed by Darin Adler. - - Fix http://bugs.webkit.org/show_bug.cgi?id=17001 - Bug 17001: Build error with Gtk port on Mac OS X - - If both XP_MACOSX and XP_UNIX are defined then X11.h and Carbon.h will both be included. - These provide conflicting definitions for a type named 'Cursor'. As XP_UNIX is set by - the build system when targeting X11, it doesn't make sense for XP_MACOSX to also be set - in this instance. - - * bindings/npapi.h: Don't define XP_MACOSX if XP_UNIX is defined. - -2008-01-26 Darin Adler - - Reviewed by Oliver. - - - fix http://bugs.webkit.org/show_bug.cgi?id=17013 - JSC can't round trip certain for-loops - - Test: fast/js/toString-for-var-decl.html - - * kjs/nodes.h: Added PlaceholderTrueNode so we can put nodes into - for loops without injecting the word "true" into them (nice, but not - the bug fix). Fixed ForNode constructor so expr1WasVarDecl is set - only when there is an expression, since it's common for the actual - variable declaration to be moved by the parser. - - * kjs/nodes2string.cpp: - (KJS::PlaceholderTrueNode::streamTo): Added. Empty. - -2008-01-25 Oliver Hunt - - Reviewed by Maciej. - - Fix for bug 17012: REGRESSION: JSC can't round trip an object literal - - Add logic to ensure that object literals and function expressions get - parentheses when necessary. - - * kjs/nodes.h: - * kjs/nodes2string.cpp: - (KJS::SourceStream::operator<<): - -2008-01-24 Steve Falkenburg - - Build fix. - - * JavaScriptCore.vcproj/JavaScriptCore.sln: - -2008-01-24 Steve Falkenburg - - Build fix. - - * JavaScriptCore.vcproj/JavaScriptCoreSubmit.sln: - -2008-01-24 Michael Goddard - - Reviewed by Simon. - - Fix QDateTime to JS Date conversion. - Several conversion errors (some UTC related, some month - offset related) and the conversion distance for Date - to DateTime conversion weights were fixed (it should never - be better to convert a JS Number into a Date rather than - an int). - - * bindings/qt/qt_runtime.cpp: - (KJS::Bindings::convertValueToQVariant): - (KJS::Bindings::convertQVariantToValue): - -2008-01-24 Michael Goddard - - Reviewed by Simon. - - Add support for calling QObjects. - Add support for invokeDefaultMethod (via a call to - a specific slot), and also allow using it as a - constructor, like QtScript. - - - * bindings/qt/qt_class.cpp: - (KJS::Bindings::QtClass::fallbackObject): - * bindings/qt/qt_instance.cpp: - (KJS::Bindings::QtRuntimeObjectImp::construct): - (KJS::Bindings::QtInstance::QtInstance): - (KJS::Bindings::QtInstance::~QtInstance): - (KJS::Bindings::QtInstance::implementsCall): - (KJS::Bindings::QtInstance::invokeDefaultMethod): - * bindings/qt/qt_instance.h: - * bindings/qt/qt_runtime.cpp: - (KJS::Bindings::findMethodIndex): - (KJS::Bindings::QtRuntimeMetaMethod::QtRuntimeMetaMethod): - (KJS::Bindings::QtRuntimeMetaMethod::callAsFunction): - * bindings/qt/qt_runtime.h: - -2008-01-24 Michael Goddard - - Reviewed by Simon. - - Code style cleanups. - Add spaces before/after braces in inline function. - - * bindings/qt/qt_instance.h: - -2008-01-24 Michael Goddard - - Reviewed by Simon. - - Code style cleanups. - Remove spaces and unneeded declared parameter names. - - * bindings/qt/qt_instance.cpp: - (KJS::Bindings::QtRuntimeObjectImp::removeFromCache): - -2008-01-24 Michael Goddard - - Reviewed by Simon. - - Clear stale RuntimeObjectImps. - Since other objects can have refs to the QtInstance, - we can't rely on the QtInstance being deleted when the - RuntimeObjectImp is invalidate or deleted. This - could result in a stale JSObject being returned for - a valid Instance. - - * bindings/qt/qt_instance.cpp: - (KJS::Bindings::QtRuntimeObjectImp::QtRuntimeObjectImp): - (KJS::Bindings::QtRuntimeObjectImp::~QtRuntimeObjectImp): - (KJS::Bindings::QtRuntimeObjectImp::invalidate): - (KJS::Bindings::QtRuntimeObjectImp::removeFromCache): - (KJS::Bindings::QtInstance::getRuntimeObject): - * bindings/runtime.cpp: - (KJS::Bindings::Instance::createRuntimeObject): - * bindings/runtime.h: - -2008-01-23 Alp Toker - - Rubber-stamped by Mark Rowe. - - Remove whitespace after -I in automake include lists. - - * GNUmakefile.am: - -2008-01-23 Michael Goddard - - Reviewed by Lars Knoll . - - Reworked the JavaScriptCore Qt bindings: - - * Add initial support for string and variant arrays, as well - as sub QObjects in the JS bindings. - - * Don't expose fields marked as not scriptable by moc. - - * Add support for dynamic properties and accessing named - QObject children of an object (like QtScript and older - IE DOM style JS). - * Add support for custom toString methods. - - * Fine tune some bindings to be closer to QtScript. - Make void functions return undefined, and empty/ - null QStrings return a zero length string. - - * Create framework for allowing more direct method calls. - Since RuntimeMethod doesn't allow us to add additional - methods/properties to a function, add these classes. - Start prototyping object.signal.connect(...). - - * Add signal support to the Qt bindings. - Allow connecting to signals (object.signal.connect(slot)), - disconnecting, and emitting signals. Currently chooses - the first signal that matches the name, so this will need - improvement. - - * Add property names, and resolve signals closer to use. - Enumerating properties now returns some of the Qt properties - and signals. Slots and methods aren't quite present. Also, - resolve signal connections etc. closer to the time of use, so - we can do more dynamic resolution based on argument type etc. - Still picks the first one with the same name, at the moment. - - * Make signature comparison code consistent. - Use the same code for checking meta signatures in - the method and fallback getters, and avoid a - QByteArray construction when we can. - - * Fix minor memory leak, and handle pointers better. - Delete the private object in the dtors, and use RefPtrs - for holding Instances etc. - - * Handle method lookup better. - Allow invocation time method lookup based on the arguments, - which is closer to QtScript behaviour. Also, cache the - method lists and delete them in the QtClass dtor (stops - a memory leak). - - * Improve JS to Qt data type conversions. - Add some support for Date & RegExp JS objects, - and provide some metrics on the quality of the - conversion. - - * A couple of fixes for autotest failures. - Better support for converting lists, read/write only - QMetaProperty support, modified slot search order...) - - * bindings/qt/qt_class.cpp: - (KJS::Bindings::QtClass::QtClass): - (KJS::Bindings::QtClass::~QtClass): - (KJS::Bindings::QtClass::name): - (KJS::Bindings::QtClass::fallbackObject): - (KJS::Bindings::QtClass::methodsNamed): - (KJS::Bindings::QtClass::fieldNamed): - * bindings/qt/qt_class.h: - * bindings/qt/qt_instance.cpp: - (KJS::Bindings::QtInstance::QtInstance): - (KJS::Bindings::QtInstance::~QtInstance): - (KJS::Bindings::QtInstance::getRuntimeObject): - (KJS::Bindings::QtInstance::getClass): - (KJS::Bindings::QtInstance::implementsCall): - (KJS::Bindings::QtInstance::getPropertyNames): - (KJS::Bindings::QtInstance::invokeMethod): - (KJS::Bindings::QtInstance::invokeDefaultMethod): - (KJS::Bindings::QtInstance::stringValue): - (KJS::Bindings::QtInstance::booleanValue): - (KJS::Bindings::QtInstance::valueOf): - (KJS::Bindings::QtField::name): - (KJS::Bindings::QtField::valueFromInstance): - (KJS::Bindings::QtField::setValueToInstance): - * bindings/qt/qt_instance.h: - (KJS::Bindings::QtInstance::getBindingLanguage): - (KJS::Bindings::QtInstance::getObject): - * bindings/qt/qt_runtime.cpp: - (KJS::Bindings::QWKNoDebug::QWKNoDebug): - (KJS::Bindings::QWKNoDebug::~QWKNoDebug): - (KJS::Bindings::QWKNoDebug::operator<<): - (KJS::Bindings::): - (KJS::Bindings::valueRealType): - (KJS::Bindings::convertValueToQVariant): - (KJS::Bindings::convertQVariantToValue): - (KJS::Bindings::QtRuntimeMethod::QtRuntimeMethod): - (KJS::Bindings::QtRuntimeMethod::~QtRuntimeMethod): - (KJS::Bindings::QtRuntimeMethod::codeType): - (KJS::Bindings::QtRuntimeMethod::execute): - (KJS::Bindings::QtRuntimeMethodData::~QtRuntimeMethodData): - (KJS::Bindings::QtRuntimeMetaMethodData::~QtRuntimeMetaMethodData): - (KJS::Bindings::QtRuntimeConnectionMethodData::~QtRuntimeConnectionMethodData): - (KJS::Bindings::QtMethodMatchType::): - (KJS::Bindings::QtMethodMatchType::QtMethodMatchType): - (KJS::Bindings::QtMethodMatchType::kind): - (KJS::Bindings::QtMethodMatchType::isValid): - (KJS::Bindings::QtMethodMatchType::isVariant): - (KJS::Bindings::QtMethodMatchType::isMetaType): - (KJS::Bindings::QtMethodMatchType::isUnresolved): - (KJS::Bindings::QtMethodMatchType::isMetaEnum): - (KJS::Bindings::QtMethodMatchType::enumeratorIndex): - (KJS::Bindings::QtMethodMatchType::variant): - (KJS::Bindings::QtMethodMatchType::metaType): - (KJS::Bindings::QtMethodMatchType::metaEnum): - (KJS::Bindings::QtMethodMatchType::unresolved): - (KJS::Bindings::QtMethodMatchType::typeId): - (KJS::Bindings::QtMethodMatchType::name): - (KJS::Bindings::QtMethodMatchData::QtMethodMatchData): - (KJS::Bindings::QtMethodMatchData::isValid): - (KJS::Bindings::QtMethodMatchData::firstUnresolvedIndex): - (KJS::Bindings::indexOfMetaEnum): - (KJS::Bindings::findMethodIndex): - (KJS::Bindings::findSignalIndex): - (KJS::Bindings::QtRuntimeMetaMethod::QtRuntimeMetaMethod): - (KJS::Bindings::QtRuntimeMetaMethod::mark): - (KJS::Bindings::QtRuntimeMetaMethod::callAsFunction): - (KJS::Bindings::QtRuntimeMetaMethod::getOwnPropertySlot): - (KJS::Bindings::QtRuntimeMetaMethod::lengthGetter): - (KJS::Bindings::QtRuntimeMetaMethod::connectGetter): - (KJS::Bindings::QtRuntimeMetaMethod::disconnectGetter): - (KJS::Bindings::QtRuntimeConnectionMethod::QtRuntimeConnectionMethod): - (KJS::Bindings::QtRuntimeConnectionMethod::callAsFunction): - (KJS::Bindings::QtRuntimeConnectionMethod::getOwnPropertySlot): - (KJS::Bindings::QtRuntimeConnectionMethod::lengthGetter): - (KJS::Bindings::QtConnectionObject::QtConnectionObject): - (KJS::Bindings::QtConnectionObject::~QtConnectionObject): - (KJS::Bindings::QtConnectionObject::metaObject): - (KJS::Bindings::QtConnectionObject::qt_metacast): - (KJS::Bindings::QtConnectionObject::qt_metacall): - (KJS::Bindings::QtConnectionObject::execute): - (KJS::Bindings::QtConnectionObject::match): - (KJS::Bindings::::QtArray): - (KJS::Bindings::::~QtArray): - (KJS::Bindings::::rootObject): - (KJS::Bindings::::setValueAt): - (KJS::Bindings::::valueAt): - * bindings/qt/qt_runtime.h: - (KJS::Bindings::QtField::): - (KJS::Bindings::QtField::QtField): - (KJS::Bindings::QtField::fieldType): - (KJS::Bindings::QtMethod::QtMethod): - (KJS::Bindings::QtMethod::name): - (KJS::Bindings::QtMethod::numParameters): - (KJS::Bindings::QtArray::getLength): - (KJS::Bindings::QtRuntimeMethod::d_func): - (KJS::Bindings::QtRuntimeMetaMethod::d_func): - (KJS::Bindings::QtRuntimeConnectionMethod::d_func): - (KJS::Bindings::): - * bindings/runtime.cpp: - (KJS::Bindings::Instance::createBindingForLanguageInstance): - (KJS::Bindings::Instance::createRuntimeObject): - (KJS::Bindings::Instance::reallyCreateRuntimeObject): - * bindings/runtime.h: - -2008-01-22 Anders Carlsson - - Reviewed by Darin and Adam. - - - div element on microsoft site has wrong left offset. - - Return true even if NPN_GetProperty returns null or undefined. This matches Firefox - (and is what the Silverlight plug-in expects). - - * bindings/NP_jsobject.cpp: - (_NPN_GetProperty): - -2008-01-21 Geoffrey Garen - - Reviewed by Maciej Stachowiak. - - Fixed http://bugs.webkit.org/show_bug.cgi?id=16909 - REGRESSION: Amazon.com crash (ActivationImp) - - (and a bunch of other crashes) - - Plus, a .7% SunSpider speedup to boot. - - Replaced the buggy currentExec and savedExec mechanisms with an - explicit ExecState stack. - - * kjs/collector.cpp: - (KJS::Collector::collect): Explicitly mark the ExecState stack. - - (KJS::Collector::reportOutOfMemoryToAllExecStates): Slight change in - behavior: We no longer throw an exception in any global ExecStates, - since global ExecStates are more like pseudo-ExecStates, and aren't - used for script execution. (It's unclear what would happen if you left - an exception waiting around in a global ExecState, but it probably - wouldn't be good.) - -2008-01-21 Jan Michael Alonzo - - Reviewed by Alp Toker. - - http://bugs.webkit.org/show_bug.cgi?id=16955 - Get errors when cross-compile webkit-gtk - - * GNUmakefile.am: removed ICU_CFLAGS - -2008-01-18 Kevin McCullough - - - Build fix. - - * kjs/ustring.h: - -2008-01-18 Kevin McCullough - - - Build fix. - - * kjs/ustring.cpp: - * kjs/ustring.h: - (KJS::UString::cost): - -2008-01-18 Kevin McCullough - - Reviewed by Geoff. - - - Correctly report cost of appended strings to trigger GC. - - * kjs/ustring.cpp: - (KJS::UString::Rep::create): - (KJS::UString::UString): Don't create unnecssary objects. - (KJS::UString::cost): Report cost if necessary but also keep track of - reported cost. - * kjs/ustring.h: - -2008-01-18 Simon Hausmann - - Reviewed by Holger. - - Fix return type conversions from Qt slots to JS values. - - This also fixes fast/dom/open-and-close-by-DOM.html, which called - layoutTestController.windowCount(). - - When constructing the QVariant that holds the return type we cannot - use the QVarian(Type) constuctor as that will create a null variant. - We have to use the QVariant(Type, void *) constructor instead, just - like in QMetaObject::read() for example. - - - * bindings/qt/qt_instance.cpp: - (KJS::Bindings::QtInstance::getRuntimeObject): - -2008-01-18 Prasanth Ullattil - - Reviewed by Simon Hausmann . - - Fix compilation on Win64(2): Implemented currentThreadStackBase on X86-64 on Windows - - - * kjs/collector.cpp: - (KJS::Collector::heapAllocate): - -2008-01-18 Prasanth Ullattil - - Reviewed by Simon Hausmann . - - Fix compilation on Win64(1): Define WTF_PLATFORM_X86_64 correctly on Win64. - - - * wtf/Platform.h: - -2008-01-17 Antti Koivisto - - Fix Windows build. - - * kjs/regexp_object.cpp: - (KJS::regExpProtoFuncToString): - -2008-01-16 Sam Weinig - - Reviewed by Darin. - - Fix for http://bugs.webkit.org/show_bug.cgi?id=16901 - Convert remaining JS function objects to use the new PrototypeFunction class - - - Moves Boolean, Function, RegExp, Number, Object and Global functions to their - own static function implementations so that they can be used with the - PrototypeFunction class. SunSpider says this is 1.003x as fast. - - * kjs/JSGlobalObject.cpp: - (KJS::JSGlobalObject::reset): - * kjs/array_object.h: - * kjs/bool_object.cpp: - (KJS::BooleanInstance::BooleanInstance): - (KJS::BooleanPrototype::BooleanPrototype): - (KJS::booleanProtoFuncToString): - (KJS::booleanProtoFuncValueOf): - (KJS::BooleanObjectImp::BooleanObjectImp): - (KJS::BooleanObjectImp::implementsConstruct): - (KJS::BooleanObjectImp::construct): - (KJS::BooleanObjectImp::callAsFunction): - * kjs/bool_object.h: - (KJS::BooleanInstance::classInfo): - * kjs/error_object.cpp: - (KJS::ErrorPrototype::ErrorPrototype): - (KJS::errorProtoFuncToString): - * kjs/error_object.h: - * kjs/function.cpp: - (KJS::globalFuncEval): - (KJS::globalFuncParseInt): - (KJS::globalFuncParseFloat): - (KJS::globalFuncIsNaN): - (KJS::globalFuncIsFinite): - (KJS::globalFuncDecodeURI): - (KJS::globalFuncDecodeURIComponent): - (KJS::globalFuncEncodeURI): - (KJS::globalFuncEncodeURIComponent): - (KJS::globalFuncEscape): - (KJS::globalFuncUnEscape): - (KJS::globalFuncKJSPrint): - (KJS::PrototypeFunction::PrototypeFunction): - * kjs/function.h: - * kjs/function_object.cpp: - (KJS::FunctionPrototype::FunctionPrototype): - (KJS::functionProtoFuncToString): - (KJS::functionProtoFuncApply): - (KJS::functionProtoFuncCall): - * kjs/function_object.h: - * kjs/number_object.cpp: - (KJS::NumberPrototype::NumberPrototype): - (KJS::numberProtoFuncToString): - (KJS::numberProtoFuncToLocaleString): - (KJS::numberProtoFuncValueOf): - (KJS::numberProtoFuncToFixed): - (KJS::numberProtoFuncToExponential): - (KJS::numberProtoFuncToPrecision): - * kjs/number_object.h: - (KJS::NumberInstance::classInfo): - (KJS::NumberObjectImp::classInfo): - (KJS::NumberObjectImp::): - * kjs/object_object.cpp: - (KJS::ObjectPrototype::ObjectPrototype): - (KJS::objectProtoFuncValueOf): - (KJS::objectProtoFuncHasOwnProperty): - (KJS::objectProtoFuncIsPrototypeOf): - (KJS::objectProtoFuncDefineGetter): - (KJS::objectProtoFuncDefineSetter): - (KJS::objectProtoFuncLookupGetter): - (KJS::objectProtoFuncLookupSetter): - (KJS::objectProtoFuncPropertyIsEnumerable): - (KJS::objectProtoFuncToLocaleString): - (KJS::objectProtoFuncToString): - * kjs/object_object.h: - * kjs/regexp_object.cpp: - (KJS::RegExpPrototype::RegExpPrototype): - (KJS::regExpProtoFuncTest): - (KJS::regExpProtoFuncExec): - (KJS::regExpProtoFuncCompile): - (KJS::regExpProtoFuncToString): - * kjs/regexp_object.h: - -2008-01-16 Cameron Zwarich - - Reviewed by Maciej & Darin. - - Fixes Bug 16868: Gmail crash - and Bug 16871: Crash when loading apple.com/startpage - - - - - - - - Adds ActivationImp tear-off for cross-window eval() and fixes an - existing garbage collection issue exposed by the ActivationImp tear-off - patch (r29425) that can occur when an ExecState's m_callingExec is - different than its m_savedExec. - - * kjs/ExecState.cpp: - (KJS::ExecState::mark): - * kjs/function.cpp: - (KJS::GlobalFuncImp::callAsFunction): - -2008-01-16 Sam Weinig - - Reviewed by Oliver. - - Clean up MathObjectImp, it needed a little scrubbing. - - * kjs/math_object.cpp: - (KJS::MathObjectImp::MathObjectImp): - (KJS::MathObjectImp::getOwnPropertySlot): - (KJS::MathObjectImp::getValueProperty): - (KJS::mathProtoFuncACos): - (KJS::mathProtoFuncASin): - (KJS::mathProtoFuncATan): - (KJS::mathProtoFuncATan2): - (KJS::mathProtoFuncCos): - (KJS::mathProtoFuncExp): - (KJS::mathProtoFuncLog): - (KJS::mathProtoFuncSin): - (KJS::mathProtoFuncSqrt): - (KJS::mathProtoFuncTan): - * kjs/math_object.h: - (KJS::MathObjectImp::classInfo): - (KJS::MathObjectImp::): - -2008-01-16 Sam Weinig - - Reviewed by Geoffrey Garen. - - Rename Lexer variable bol to atLineStart. - - * kjs/lexer.cpp: - (KJS::Lexer::Lexer): - (KJS::Lexer::setCode): - (KJS::Lexer::nextLine): - (KJS::Lexer::lex): - * kjs/lexer.h: - -2008-01-16 Sam Weinig - - Reviewed by Geoffrey Garen and Anders Carlsson. - - Remove uses of KJS_PURE_ECMA as we don't ever build with it defined, - and we have many features that are not included in the ECMA spec. - - * kjs/lexer.cpp: - (KJS::Lexer::Lexer): - (KJS::Lexer::setCode): - (KJS::Lexer::nextLine): - (KJS::Lexer::lex): - * kjs/lexer.h: - * kjs/string_object.cpp: - * kjs/string_object.h: - -2008-01-15 Sam Weinig - - Reviewed by Geoffrey Garen. - - Fix r27608 introduced a 20% increase in JS binary size, 4% increase in WebCore binary size - - - This changes the way JS functions that use Lookup tables are handled. Instead of using - one class per function, which allowed specialization of the virtual callAsFunction - method, we now use one class, PrototypeFunction, which takes a pointer to a static - function to use as the implementation. This significantly decreases the binary size - of JavaScriptCore (about 145k on an Intel only build) while still keeping some of the - speedup r27608 garnered (SunSpider says this is 1.005x as slow, which should leave some - wiggle room from the original 1% speedup) and keeps the functions implementations in separate - functions to help with optimizations. - - * JavaScriptCore.exp: - * JavaScriptCore.xcodeproj/project.pbxproj: - * kjs/array_object.cpp: - (KJS::arrayProtoFuncToString): - (KJS::arrayProtoFuncToLocaleString): - (KJS::arrayProtoFuncJoin): - (KJS::arrayProtoFuncConcat): - (KJS::arrayProtoFuncPop): - (KJS::arrayProtoFuncPush): - (KJS::arrayProtoFuncReverse): - (KJS::arrayProtoFuncShift): - (KJS::arrayProtoFuncSlice): - (KJS::arrayProtoFuncSort): - (KJS::arrayProtoFuncSplice): - (KJS::arrayProtoFuncUnShift): - (KJS::arrayProtoFuncFilter): - (KJS::arrayProtoFuncMap): - (KJS::arrayProtoFuncEvery): - (KJS::arrayProtoFuncForEach): - (KJS::arrayProtoFuncSome): - (KJS::arrayProtoFuncIndexOf): - (KJS::arrayProtoFuncLastIndexOf): - * kjs/array_object.h: - * kjs/date_object.cpp: - (KJS::DatePrototype::getOwnPropertySlot): - (KJS::dateProtoFuncToString): - (KJS::dateProtoFuncToUTCString): - (KJS::dateProtoFuncToDateString): - (KJS::dateProtoFuncToTimeString): - (KJS::dateProtoFuncToLocaleString): - (KJS::dateProtoFuncToLocaleDateString): - (KJS::dateProtoFuncToLocaleTimeString): - (KJS::dateProtoFuncValueOf): - (KJS::dateProtoFuncGetTime): - (KJS::dateProtoFuncGetFullYear): - (KJS::dateProtoFuncGetUTCFullYear): - (KJS::dateProtoFuncToGMTString): - (KJS::dateProtoFuncGetMonth): - (KJS::dateProtoFuncGetUTCMonth): - (KJS::dateProtoFuncGetDate): - (KJS::dateProtoFuncGetUTCDate): - (KJS::dateProtoFuncGetDay): - (KJS::dateProtoFuncGetUTCDay): - (KJS::dateProtoFuncGetHours): - (KJS::dateProtoFuncGetUTCHours): - (KJS::dateProtoFuncGetMinutes): - (KJS::dateProtoFuncGetUTCMinutes): - (KJS::dateProtoFuncGetSeconds): - (KJS::dateProtoFuncGetUTCSeconds): - (KJS::dateProtoFuncGetMilliSeconds): - (KJS::dateProtoFuncGetUTCMilliseconds): - (KJS::dateProtoFuncGetTimezoneOffset): - (KJS::dateProtoFuncSetTime): - (KJS::dateProtoFuncSetMilliSeconds): - (KJS::dateProtoFuncSetUTCMilliseconds): - (KJS::dateProtoFuncSetSeconds): - (KJS::dateProtoFuncSetUTCSeconds): - (KJS::dateProtoFuncSetMinutes): - (KJS::dateProtoFuncSetUTCMinutes): - (KJS::dateProtoFuncSetHours): - (KJS::dateProtoFuncSetUTCHours): - (KJS::dateProtoFuncSetDate): - (KJS::dateProtoFuncSetUTCDate): - (KJS::dateProtoFuncSetMonth): - (KJS::dateProtoFuncSetUTCMonth): - (KJS::dateProtoFuncSetFullYear): - (KJS::dateProtoFuncSetUTCFullYear): - (KJS::dateProtoFuncSetYear): - (KJS::dateProtoFuncGetYear): - * kjs/date_object.h: - * kjs/function.cpp: - (KJS::PrototypeFunction::PrototypeFunction): - (KJS::PrototypeFunction::callAsFunction): - * kjs/function.h: - * kjs/lookup.h: - (KJS::HashEntry::): - (KJS::staticFunctionGetter): - * kjs/math_object.cpp: - (KJS::mathProtoFuncAbs): - (KJS::mathProtoFuncACos): - (KJS::mathProtoFuncASin): - (KJS::mathProtoFuncATan): - (KJS::mathProtoFuncATan2): - (KJS::mathProtoFuncCeil): - (KJS::mathProtoFuncCos): - (KJS::mathProtoFuncExp): - (KJS::mathProtoFuncFloor): - (KJS::mathProtoFuncLog): - (KJS::mathProtoFuncMax): - (KJS::mathProtoFuncMin): - (KJS::mathProtoFuncPow): - (KJS::mathProtoFuncRandom): - (KJS::mathProtoFuncRound): - (KJS::mathProtoFuncSin): - (KJS::mathProtoFuncSqrt): - (KJS::mathProtoFuncTan): - * kjs/math_object.h: - * kjs/string_object.cpp: - (KJS::stringProtoFuncToString): - (KJS::stringProtoFuncValueOf): - (KJS::stringProtoFuncCharAt): - (KJS::stringProtoFuncCharCodeAt): - (KJS::stringProtoFuncConcat): - (KJS::stringProtoFuncIndexOf): - (KJS::stringProtoFuncLastIndexOf): - (KJS::stringProtoFuncMatch): - (KJS::stringProtoFuncSearch): - (KJS::stringProtoFuncReplace): - (KJS::stringProtoFuncSlice): - (KJS::stringProtoFuncSplit): - (KJS::stringProtoFuncSubstr): - (KJS::stringProtoFuncSubstring): - (KJS::stringProtoFuncToLowerCase): - (KJS::stringProtoFuncToUpperCase): - (KJS::stringProtoFuncToLocaleLowerCase): - (KJS::stringProtoFuncToLocaleUpperCase): - (KJS::stringProtoFuncLocaleCompare): - (KJS::stringProtoFuncBig): - (KJS::stringProtoFuncSmall): - (KJS::stringProtoFuncBlink): - (KJS::stringProtoFuncBold): - (KJS::stringProtoFuncFixed): - (KJS::stringProtoFuncItalics): - (KJS::stringProtoFuncStrike): - (KJS::stringProtoFuncSub): - (KJS::stringProtoFuncSup): - (KJS::stringProtoFuncFontcolor): - (KJS::stringProtoFuncFontsize): - (KJS::stringProtoFuncAnchor): - (KJS::stringProtoFuncLink): - * kjs/string_object.h: - -2008-01-15 Geoffrey Garen - - Reviewed by Adam Roben. - - Some tweaks to our headerdoc, suggested by David Gatwood on the docs - team. - - * API/JSBase.h: - * API/JSObjectRef.h: - * API/JSStringRef.h: - * API/JSValueRef.h: - -2008-01-15 Alp Toker - - Rubber-stamped by Anders. - - Make the HTTP backend configurable in the GTK+ port. curl is currently - the only option. - - * wtf/Platform.h: Don't hard-code WTF_USE_CURL for GTK - -2008-01-15 Sam Weinig - - Reviewed by Beth Dakin. - - Remove unneeded variable. - - * kjs/string_object.cpp: - (KJS::StringProtoFuncSubstr::callAsFunction): - -2008-01-14 Steve Falkenburg - - Use shared vsprops for most vcproj properties. - - Reviewed by Darin. - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Add missing Debug_Internal config. - * JavaScriptCore.vcproj/WTF/WTF.vcproj: Add missing Debug_Internal config. - * JavaScriptCore.vcproj/testkjs/testkjs.vcproj: - -2008-01-14 Adam Roben - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Added - some headers that were missing from the vcproj so their contents will - be included in Find in Files. - -2008-01-14 Adam Roben - - Fix Bug 16871: Crash when loading apple.com/startpage - - - - - Patch written by Darin, reviewed by me. - - * kjs/ExecState.cpp: - (KJS::ExecState::mark): Call ActivationImp::markChildren if our - m_activation is on the stack. This is what ScopeChain::mark also does, - but apparently in some cases it's possible for an ExecState's - ActivationImp to not be in any ScopeChain. - -2008-01-14 Kevin McCullough - - Reviewed by Oliver. - - - REGRESSION (Leopard-ToT): Endless loading loop - trying to view techreport.com comments - - We need to set values in the map, because if they are already in the - map they will not be reset when we use add(). - - * kjs/array_instance.cpp: - (KJS::ArrayInstance::put): - -2008-01-14 Darin Adler - - Reviewed by Adam. - - - re-speed-up the page load test (my StringImpl change slowed it down) - - * wtf/RefCounted.h: - (WTF::RefCounted::RefCounted): Allow derived classes to start with a reference - count other than 0. Eventually everyone will want to start with a 1. This is a - staged change. For now, there's a default of 0, and you can specify 1. Later, - there will be no default and everyone will have to specify. And then later, there - will be a default of 1. Eventually, we can take away even the option of starting - with 0! - - * wtf/Vector.h: - (WTF::Vector::Vector): Sped up creation of non-empty vectors by removing the - overhead of first constructing something empty and then calling resize. - (WTF::Vector::clear): Sped up the common case of calling clear on an empty - vector by adding a check for that case. - (WTF::Vector::releaseBuffer): Marked this function inline and removed a branch - in the case of vectors with no inline capacity (normal vectors) by leaving out - the code to copy the inline buffer in that case. - -2008-01-14 Alexey Proskuryakov - - Reviewed by David Kilzer. - - http://bugs.webkit.org/show_bug.cgi?id=16787 - array.splice() with 1 element not working - - Test: fast/js/array-splice.html - - * kjs/array_object.cpp: - (KJS::ArrayProtoFuncSplice::callAsFunction): Implement this Mozilla extension, and fix - some other edge cases. - -2008-01-13 Steve Falkenburg - - Share common files across projects. - - Unify vsprops files - Debug: common.vsprops, debug.vsprops - Debug_Internal: common.vsprops, debug.vsprops, debug_internal.vsprops - Release: common.vsprops, release.vsprops - - Shared properties can go into common.vsprops, shared debug settings can go into debug.vsprops. - debug_internal.vsprops will be mostly empty except for file path prefix modifiers. - - Reviewed by Adam Roben. - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.vcproj/WTF/WTF.vcproj: - * JavaScriptCore.vcproj/debug.vsprops: Removed. - * JavaScriptCore.vcproj/debug_internal.vsprops: Removed. - * JavaScriptCore.vcproj/release.vsprops: Removed. - * JavaScriptCore.vcproj/testkjs/testkjs.vcproj: - -2008-01-13 Marius Bugge Monsen - - Contributions and review by Adriaan de Groot, - Simon Hausmann, Eric Seidel, and Darin Adler. - - - http://bugs.webkit.org/show_bug.cgi?id=16590 - Compilation fixes for Solaris. - - * kjs/DateMath.h: - (KJS::GregorianDateTime::GregorianDateTime): Use the WIN_OS code path - for SOLARIS too, presumably because Solaris also lacks the tm_gtoff and tm_zone - fields. - (KJS::GregorianDateTime::operator tm): Ditto. - - * kjs/collector.cpp: - (KJS::currentThreadStackBase): Use thr_stksegment on Solaris. - - * wtf/MathExtras.h: - (isfinite): Implement for Solaris. - (isinf): Ditto. - (signbit): Ditto. But this one is wrong, so I added a FIXME. - - * wtf/Platform.h: Define PLATFORM(SOLARIS) when "sun" or "__sun" is defined. - -2008-01-13 Michael Goddard - - Reviewed by Anders Carlsson. - - Add binding language type to Instance. - Allows runtime determination of the type of an - Instance, to allow safe casting. Doesn't actually - add any safe casting yet, though. - - Add a helper function to get an Instance from a JSObject*. - Given an object and the expected binding language, see if - the JSObject actually wraps an Instance of the given type - and return it. Otherwise return 0. - - Move RuntimeObjectImp creations into Instance. - Make the ctor protected, and Instance a friend class, so - that all creation of RuntimeObjectImps goes through - one place. - - Remove copy ctor/assignment operator for QtInstance. - Instance itself is Noncopyable, so QtInstance doesn't - need to have these. - - Add caching for QtInstance and associated RuntimeObjectImps. - Push any dealings with QtLanguage bindings into QtInstance, - and cache them there, rather than in the Instance layer. Add - a QtRuntimeObjectImp to help with caching. - - * JavaScriptCore.exp: - * bindings/c/c_instance.h: - * bindings/jni/jni_instance.h: - * bindings/objc/objc_instance.h: - * bindings/qt/qt_instance.cpp: - (KJS::Bindings::QtRuntimeObjectImp::QtRuntimeObjectImp): - (KJS::Bindings::QtRuntimeObjectImp::~QtRuntimeObjectImp): - (KJS::Bindings::QtRuntimeObjectImp::invalidate): - (KJS::Bindings::QtRuntimeObjectImp::removeFromCache): - (KJS::Bindings::QtInstance::QtInstance): - (KJS::Bindings::QtInstance::~QtInstance): - (KJS::Bindings::QtInstance::getQtInstance): - (KJS::Bindings::QtInstance::getRuntimeObject): - * bindings/qt/qt_instance.h: - (KJS::Bindings::QtInstance::getBindingLanguage): - * bindings/runtime.cpp: - (KJS::Bindings::Instance::createBindingForLanguageInstance): - (KJS::Bindings::Instance::createRuntimeObject): - (KJS::Bindings::Instance::getInstance): - * bindings/runtime.h: - * bindings/runtime_object.h: - (KJS::RuntimeObjectImp::getInternalInstance): - -2008-01-12 Alp Toker - - Reviewed by Mark Rowe. - - Hide non-public symbols in GTK+/autotools release builds. - - * GNUmakefile.am: - -2008-01-12 Cameron Zwarich - - Reviewed by Mark Rowe. - - Fix http://bugs.webkit.org/show_bug.cgi?id=16852 - Fixes leaking of ActivationStackNode objects. - - * kjs/JSGlobalObject.cpp: - (KJS::JSGlobalObject::deleteActivationStack): - (KJS::JSGlobalObject::~JSGlobalObject): - (KJS::JSGlobalObject::init): - (KJS::JSGlobalObject::reset): - * kjs/JSGlobalObject.h: - -2008-01-12 Darin Adler - - - try to fix Qt Windows build - - * pcre/dftables: Remove reliance on the list form of Perl pipes. - -2008-01-12 Darin Adler - - - try to fix Qt build - - * kjs/function.cpp: Added include of scope_chain_mark.h. - * kjs/scope_chain_mark.h: Added multiple-include guards. - -2008-01-12 Mark Rowe - - Another Windows build fix. - - * kjs/Activation.h: - -2008-01-12 Mark Rowe - - Attempted Windows build fix. Use struct consistently when forward-declaring - ActivationStackNode and StackActivation. - - * kjs/Activation.h: - * kjs/JSGlobalObject.h: - -2008-01-12 Cameron Zwarich - - Reviewed by Maciej. - - Fixes a problem with the ActivationImp tear-off patch (r29425) where - some of the calls to JSGlobalObject::tearOffActivation() were using - the wrong test to determine whether it should leave a relic behind. - - * kjs/function.cpp: - (KJS::FunctionImp::argumentsGetter): - (KJS::ActivationImp::getOwnPropertySlot): - -2008-01-11 Geoffrey Garen - - Reviewed by Oliver Hunt. - - Fixed REGRESSION (r28880-r28886): Global - variable access (16644) - - This bug was caused by var declarations shadowing built-in properties of - the global object. - - To match Firefox, we've decided that var declarations will never shadow - built-in properties of the global object or its prototypes. We used to - behave more like IE, which allows shadowing, but walking that line got - us into trouble with websites that sent us down the Firefox codepath. - - * kjs/JSVariableObject.h: - (KJS::JSVariableObject::symbolTableGet): New code to support calling - hasProperty before the variable object is fully initialized (so you - can call it during initialization). - - * kjs/nodes.cpp:. - (KJS::ProgramNode::initializeSymbolTable): Always do a full hasProperty - check when looking for duplicates, not getDirect, since it only checks - the property map, and not hasOwnProperty, since it doesn't check - prototypes. - (KJS::EvalNode::processDeclarations): ditto - - * kjs/property_slot.h: - (KJS::PropertySlot::ungettableGetter): Best function name evar. - -2008-01-11 Cameron Zwarich - - Reviewed by Maciej. - - Optimized ActivationImp allocation, so that activation records are now - first allocated on an explicitly managed stack and only heap allocated - when necessary. Roughly a 5% improvement on SunSpider, and a larger - improvement on benchmarks that use more function calls. - - * JavaScriptCore.xcodeproj/project.pbxproj: - * kjs/Activation.h: Added. - (KJS::ActivationImp::ActivationData::ActivationData): - (KJS::ActivationImp::ActivationImp): - (KJS::ActivationImp::classInfo): - (KJS::ActivationImp::isActivationObject): - (KJS::ActivationImp::isOnStack): - (KJS::ActivationImp::d): - (KJS::StackActivation::StackActivation): - * kjs/ExecState.cpp: - (KJS::ExecState::ExecState): - (KJS::ExecState::~ExecState): - * kjs/ExecState.h: - (KJS::ExecState::replaceScopeChainTop): - (KJS::ExecState::setActivationObject): - (KJS::ExecState::setLocalStorage): - * kjs/JSGlobalObject.cpp: - (KJS::JSGlobalObject::reset): - (KJS::JSGlobalObject::pushActivation): - (KJS::JSGlobalObject::checkActivationCount): - (KJS::JSGlobalObject::popActivationHelper): - (KJS::JSGlobalObject::popActivation): - (KJS::JSGlobalObject::tearOffActivation): - * kjs/JSGlobalObject.h: - * kjs/JSVariableObject.h: - (KJS::JSVariableObject::JSVariableObjectData::JSVariableObjectData): - (KJS::JSVariableObject::JSVariableObject): - * kjs/function.cpp: - (KJS::FunctionImp::argumentsGetter): - (KJS::ActivationImp::ActivationImp): - (KJS::ActivationImp::~ActivationImp): - (KJS::ActivationImp::init): - (KJS::ActivationImp::getOwnPropertySlot): - (KJS::ActivationImp::markHelper): - (KJS::ActivationImp::mark): - (KJS::ActivationImp::ActivationData::ActivationData): - (KJS::GlobalFuncImp::callAsFunction): - * kjs/function.h: - * kjs/nodes.cpp: - (KJS::PostIncResolveNode::evaluate): - (KJS::PostDecResolveNode::evaluate): - (KJS::PreIncResolveNode::evaluate): - (KJS::PreDecResolveNode::evaluate): - (KJS::ReadModifyResolveNode::evaluate): - (KJS::AssignResolveNode::evaluate): - (KJS::WithNode::execute): - (KJS::TryNode::execute): - (KJS::FunctionBodyNode::processDeclarations): - (KJS::FuncExprNode::evaluate): - * kjs/object.h: - * kjs/scope_chain.h: - (KJS::ScopeChain::replace): - * kjs/scope_chain_mark.h: Added. - (KJS::ScopeChain::mark): - -2008-01-11 Simon Hausmann - - Reviewed by Mark Rowe. - - Fix the (clean) qmake build. For generating chartables.c we don't - depend on a separate input source file anymore, the dftables perl - script is enough. So use that instead as value for the .input - variable, to ensure that qmake also generates a rule to call dftables. - - * pcre/pcre.pri: - -2008-01-10 Geoffrey Garen - - Reviewed by John Sullivan. - - Fixed some world leak reports: - * PLT complains about world leak of 1 JavaScript - Interpreter after running cvs-base suite - - * PLT complains about world leak if browser - window is open when PLT starts - - * kjs/collector.h: Added the ability to distinguish between global - objects and GC-protected global objects, since we only consider the - latter to be world leaks. - * kjs/collector.cpp: - -2008-01-11 Mark Rowe - - Silence qmake warning about ctgen lacking input. - - Rubber-stamped by Alp Toker. - - * pcre/pcre.pri: - -2008-01-10 David Kilzer - - dftables should be rewritten as a script - - - - - Reviewed by Darin. - - Rewrote the dftables utility in Perl. Attempted to switch all - build systems to call the script directly instead of building - a binary first. Only the Xcode build was able to be tested. - - * DerivedSources.make: Added pcre directory to VPATH and changed - to invoke dftables directly. - * GNUmakefile.am: Removed build information and changed to invoke - dftables directly. - * JavaScriptCore.vcproj/JavaScriptCore.sln: Removed reference to - dftables project. - * JavaScriptCore.vcproj/JavaScriptCoreSubmit.sln: Ditto. - * JavaScriptCore.vcproj/dftables: Removed. - * JavaScriptCore.vcproj/dftables/dftables.vcproj: Removed. - * JavaScriptCore.xcodeproj/project.pbxproj: Removed dftables target. - * jscore.bkl: Removed dftables executable definition. - * pcre/dftables: Copied from JavaScriptCore/pcre/dftables.cpp. - * pcre/dftables.cpp: Removed. - * pcre/dftables.pro: Removed. - * pcre/pcre.pri: Removed references to dftables.cpp and changed to - invoke dftables directly. - -2008-01-10 Dan Bernstein - - Reviewed by Darin Adler. - - - fix http://bugs.webkit.org/show_bug.cgi?id=16782 - REGRESSION(r29266): Reproducible crash in fast/replaced/image-map.html - - The crash resulted from a native object (DumpRenderTree's - EventSender) causing its wrapper to be invalidated (by clicking a - link that replaced the document in the window) and consequently - deallocated. The fix is to use RefPtrs to protect the native object - from deletion by self-invalidation. - - * bindings/runtime_method.cpp: - (RuntimeMethod::callAsFunction): - * bindings/runtime_object.cpp: - (RuntimeObjectImp::fallbackObjectGetter): - (RuntimeObjectImp::fieldGetter): - (RuntimeObjectImp::methodGetter): - (RuntimeObjectImp::put): - (RuntimeObjectImp::defaultValue): - (RuntimeObjectImp::callAsFunction): - -2008-01-07 Mark Rowe - - Reviewed by Maciej Stachowiak. - - Turn testIsInteger assertions into compile-time asserts and move them into HashTraits.h - where possible. - - * kjs/testkjs.cpp: - * wtf/HashTraits.h: - -2008-01-07 Nikolas Zimmermann - - Reviewed by Mark. - - Enable SVG_FONTS by default. - - * Configurations/JavaScriptCore.xcconfig: - -2008-01-07 Darin Adler - - Rubber stamped by David Kilzer. - - - get rid of empty fpconst.cpp - - * GNUmakefile.am: Remove fpconst.cpp. - * JavaScriptCore.pri: Ditto. - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Ditto. - * JavaScriptCore.xcodeproj/project.pbxproj: Ditto. - * JavaScriptCoreSources.bkl: Ditto. - - * kjs/fpconst.cpp: Removed. - -2008-01-07 Darin Adler - - Reviewed by David Kilzer. - - - fix alignment problem with NaN and Inf globals - - * kjs/fpconst.cpp: Move the contents of this file from here back to - value.cpp. The reason this was in a separate file is that the DARWIN - version of this used a declaration of the globals with a different - type to avoid creating "init routines". That's no longer necessary for - DARWIN and was never necessary for the non-DARWIN code path. - To make this patch easy to merge, I didn't actually delete this file - yet. We'll do that in a separate changeset. - - * kjs/value.cpp: If C99's NAN and INFINITY are present, then use them, - othrewise use the union trick from fpconst.cpp. I think it would be - better to eliminate KJS::NaN and KJS::Inf and just use NAN and INFINITY - directly or std::numeric_limits::quiet_nan() and - std::numeric_limits::infinity(). But when I tried that, it - slowed down SunSpider. Someone else could do that cleanup if they - could do it without slowing down the engine. - -2008-01-07 Adam Roben - - Windows build fix - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Added - JavaScript.h to the project. - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreGenerated.make: - Copy JavaScript.h to WEBKITOUTPUTDIR. - -2008-01-07 Timothy Hatcher - - Reviewed by Darin. - - Fix Mac build. - - * API/JSNode.c: - * API/JSNode.h: - * API/JSNodeList.c: - * API/JSNodeList.h: - * API/JavaScript.h: - * API/JavaScriptCore.h: - * API/minidom.c: - * JavaScriptCore.xcodeproj/project.pbxproj: - -2008-01-07 Alp Toker - - Reviewed by Darin. - - http://bugs.webkit.org/show_bug.cgi?id=16029 - JavaScriptCore.h is not suitable for platforms other than Mac OS X - - Introduce a new JavaScriptCore/JavaScript.h public API header. This - should be used by all new portable code using the JavaScriptCore API. - - JavaScriptCore/JavaScriptCore.h will remain for compatibility with - existing applications that depend on it including JSStringRefCF.h - which isn't portable. - - Also add minidom to the GTK+/autotools build since we can now support - it on all platforms. - - * API/JSNode.h: - * API/JSNodeList.h: - * API/JavaScript.h: Added. - * API/JavaScriptCore.h: - * ForwardingHeaders/JavaScriptCore/JavaScript.h: Added. - * GNUmakefile.am: - * JavaScriptCore.xcodeproj/project.pbxproj: - -2008-01-06 Eric Seidel - - Reviewed by Sam. - - Abstract all DateObject.set* functions in preparation for fixing: - http://bugs.webkit.org/show_bug.cgi?id=16753 - - SunSpider had random changes here and there but was overall a wash. - - * kjs/date_object.cpp: - (KJS::fillStructuresUsingTimeArgs): - (KJS::setNewValueFromTimeArgs): - (KJS::setNewValueFromDateArgs): - (KJS::DateProtoFuncSetMilliSeconds::callAsFunction): - (KJS::DateProtoFuncSetUTCMilliseconds::callAsFunction): - (KJS::DateProtoFuncSetSeconds::callAsFunction): - (KJS::DateProtoFuncSetUTCSeconds::callAsFunction): - (KJS::DateProtoFuncSetMinutes::callAsFunction): - (KJS::DateProtoFuncSetUTCMinutes::callAsFunction): - (KJS::DateProtoFuncSetHours::callAsFunction): - (KJS::DateProtoFuncSetUTCHours::callAsFunction): - (KJS::DateProtoFuncSetDate::callAsFunction): - (KJS::DateProtoFuncSetUTCDate::callAsFunction): - (KJS::DateProtoFuncSetMonth::callAsFunction): - (KJS::DateProtoFuncSetUTCMonth::callAsFunction): - (KJS::DateProtoFuncSetFullYear::callAsFunction): - (KJS::DateProtoFuncSetUTCFullYear::callAsFunction): - -2008-01-06 Nikolas Zimmermann - - Reviewed by Dan. - - Add new helper function isArabicChar - SVG Fonts support needs it. - - * wtf/unicode/icu/UnicodeIcu.h: - (WTF::Unicode::isArabicChar): - * wtf/unicode/qt4/UnicodeQt4.h: - (WTF::Unicode::isArabicChar): - -2008-01-06 Alp Toker - - Reviewed by Mark Rowe. - - Use $(EXEEXT) to account for the .exe extension in the GTK+ Windows - build. (This is already done correctly in DerivedSources.make.) Issue - noticed by Mikkel when building in Cygwin. - - Add a missing slash. This was a hack from the qmake build system that - isn't necessary with autotools. - - * GNUmakefile.am: - -2008-01-05 Darin Adler - - * API/JSRetainPtr.h: One more file that needed the change below. - -2008-01-05 Darin Adler - - * wtf/OwnPtr.h: OwnPtr needs the same fix as RefPtr below. - -2008-01-05 Adam Roben - - Build fix. - - Reviewed by Maciej. - - * wtf/RetainPtr.h: Use PtrType instead of T* because of the - RemovePointer magic. - -2008-01-05 Darin Adler - - Rubber stamped by Maciej Stachowiak. - - - cut down own PIC branches by using a pointer-to-member-data instead of a - pointer-to-member-function in WTF smart pointers - - * wtf/OwnArrayPtr.h: - * wtf/OwnPtr.h: - * wtf/PassRefPtr.h: - * wtf/RefPtr.h: - * wtf/RetainPtr.h: - Use a pointer to the m_ptr member instead of the get member. - The GCC compiler generates better code for this idiom. - -2008-01-05 Henry Mason - - Reviewed by Maciej Stachowiak. - - http://bugs.webkit.org/show_bug.cgi?id=16738 - Bug 16738: Collector block offset could be stored as an cell offset instead of a byte offset - - Gives a 0.4% SunSpider boost and prettier code. - - * kjs/collector.cpp: Switched to cell offsets from byte offsets - (KJS::Collector::heapAllocate): - (KJS::Collector::sweep): - -2008-01-04 Mark Rowe - - Reviewed by Maciej Stachowiak. - - Have the two malloc zones print useful diagnostics if their free method are unexpectedly invoked. - Due to this can happen if an application attempts to free a pointer that - was not allocated by any registered malloc zone on the system. - - * kjs/CollectorHeapIntrospector.h: - * wtf/FastMalloc.cpp: - -2008-01-04 Alp Toker - - GTK+ autotools build fix. Terminate empty rules. - - * GNUmakefile.am: - -2008-01-03 Simon Hausmann - - Reviewed by Mark Rowe. - - Fix compilation with gcc 4.3: limits.h is needed for INT_MAX. - - * pcre/pcre_exec.cpp: - -2008-01-03 Darin Adler - - * tests/mozilla/expected.html: The fix for bug 16696 also fixed a test - case, ecma_3/RegExp/perlstress-002.js, so updated results to expect - that test to succeed. - -2008-01-02 Darin Adler - - Reviewed by Geoff. - - - fix http://bugs.webkit.org/show_bug.cgi?id=16696 - JSCRE fails fails to match Acid3 regexp - - Test: fast/regex/early-acid3-86.html - - The problem was with the cutoff point between backreferences and octal - escape sequences. We need to determine the cutoff point by counting the - total number of capturing brackets, which requires an extra pass through - the expression when compiling it. - - * pcre/pcre_compile.cpp: - (CompileData::CompileData): Added numCapturingBrackets. Removed some - unused fields. - (compileBranch): Use numCapturingBrackets when calling checkEscape. - (calculateCompiledPatternLength): Use numCapturingBrackets when calling - checkEscape, and also store the bracket count at the end of the compile. - (jsRegExpCompile): Call calculateCompiledPatternLength twice -- once to - count the number of brackets and then a second time to calculate the length. - -2008-01-02 Darin Adler - - Reviewed by Geoff. - - - fix http://bugs.webkit.org/show_bug.cgi?id=16696 - JSCRE fails fails to match Acid3 regexp - - Test: fast/regex/early-acid3-86.html - - The problem was with the cutoff point between backreferences and octal - escape sequences. We need to determine the cutoff point by counting the - total number of capturing brackets, which requires an extra pass through - the expression when compiling it. - - * pcre/pcre_compile.cpp: - (CompileData::CompileData): Added numCapturingBrackets. Removed some - unused fields. - (compileBranch): Use numCapturingBrackets when calling checkEscape. - (calculateCompiledPatternLength): Use numCapturingBrackets when calling - checkEscape, and also store the bracket count at the end of the compile. - (jsRegExpCompile): Call calculateCompiledPatternLength twice -- once to - count the number of brackets and then a second time to calculate the length. - -2008-01-02 David Kilzer - - Reviewed and landed by Darin. - - * kjs/nodes.cpp: - (KJS::DoWhileNode::execute): Added a missing return. - -2008-01-02 Darin Adler - - - try to fix Qt build - - * wtf/unicode/qt4/UnicodeQt4.h: - (WTF::Unicode::foldCase): Add some missing const. - -2008-01-02 Alice Liu - - Reviewed by Sam Weinig. - - need to export ASCIICType.h for use in DRT - - * JavaScriptCore.vcproj/WTF/WTF.vcproj: - * wtf/ASCIICType.h: - (WTF::isASCIIUpper): - -2008-01-02 Sam Weinig - - Reviewed by Beth Dakin. - - Cleanup error_object.h/cpp. - - * kjs/JSGlobalObject.cpp: - (KJS::JSGlobalObject::reset): - * kjs/error_object.cpp: - (KJS::ErrorInstance::ErrorInstance): - (KJS::ErrorPrototype::ErrorPrototype): - (KJS::ErrorProtoFuncToString::ErrorProtoFuncToString): - (KJS::ErrorProtoFuncToString::callAsFunction): - (KJS::ErrorObjectImp::ErrorObjectImp): - (KJS::ErrorObjectImp::implementsConstruct): - (KJS::ErrorObjectImp::construct): - (KJS::ErrorObjectImp::callAsFunction): - (KJS::NativeErrorPrototype::NativeErrorPrototype): - (KJS::NativeErrorImp::NativeErrorImp): - (KJS::NativeErrorImp::implementsConstruct): - (KJS::NativeErrorImp::construct): - (KJS::NativeErrorImp::callAsFunction): - (KJS::NativeErrorImp::mark): - * kjs/error_object.h: - (KJS::ErrorInstance::classInfo): - (KJS::NativeErrorImp::classInfo): - -2008-01-02 Mark Rowe - - Rubber-stamped by Alp Toker. - - * GNUmakefile.am: Add missing dependency on grammar.y. - -2008-01-01 Darin Adler - - Reviewed by Eric. - - - fix for http://bugs.webkit.org/show_bug.cgi?id=16695 - JSC allows non-identifier codepoints in identifiers (affects Acid3) - - Test: fast/js/kde/parse.html - - * kjs/lexer.cpp: - (KJS::Lexer::lex): Added additional states to distinguish Unicode escapes at the - start of identifiers from ones inside identifiers. Rejected characters that don't pass - the isIdentStart and isIdentPart tests. - (KJS::Lexer::convertUnicode): Removed incorrect FIXME comment. - - * kjs/lexer.h: Added new states to distinguish \u escapes at the start of identifiers - from \u escapes inside identifiers. - -2008-01-01 Darin Adler - - - rolled scope chain optimization out; it was breaking the world - -2008-01-01 Darin Adler - - Reviewed by Geoff. - - - http://bugs.webkit.org/show_bug.cgi?id=16685 - eliminate List::empty() to cut down on PIC branches - - Also included one other speed-up -- remove the call to reserveCapacity from - FunctionBodyNode::processDeclarations in all but the most unusual cases. - - Together these make SunSpider 1.016x as fast. - - * JavaScriptCore.exp: Updated. - * kjs/ExecState.cpp: - (KJS::globalEmptyList): Added. Called only when creating global ExecState - instances. - (KJS::ExecState::ExecState): Broke constructor up into three separate functions, - for the three separate node types. Also went through each of the three and - streamlined as much as possible, removing dead code. This prevents us from having - to access the global in the function body version of the constructor. - - * kjs/ExecState.h: Added emptyList(). Replaced the constructor with a set of - three that are specific to the different node types that can create new execution - state objects. - - * kjs/array_object.cpp: - (KJS::ArrayProtoFuncToLocaleString::callAsFunction): Use exec->emptyList() instead - of List::empty(). - (KJS::ArrayProtoFuncConcat::callAsFunction): Ditto. - (KJS::ArrayProtoFuncSlice::callAsFunction): Ditto. - (KJS::ArrayProtoFuncSplice::callAsFunction): Ditto. - (KJS::ArrayProtoFuncFilter::callAsFunction): Ditto. - * kjs/function.cpp: - (KJS::FunctionImp::callAsFunction): Updated to call new ExecState constructor. - (KJS::GlobalFuncImp::callAsFunction): Ditto (for eval). - * kjs/function_object.cpp: - (FunctionObjectImp::construct): Use exec->emptyList() instead of List::empty(). - - * kjs/list.cpp: Removed List::empty. - * kjs/list.h: Ditto. - - * kjs/nodes.cpp: - (KJS::ElementNode::evaluate): Use exec->emptyList() instead of List::empty(). - (KJS::ArrayNode::evaluate): Ditto. - (KJS::ObjectLiteralNode::evaluate): Ditto. - (KJS::PropertyListNode::evaluate): Ditto. - (KJS::FunctionBodyNode::processDeclarations): Another speed-up. Check the capacity - before calling reserveCapacity, because it doesn't get inlined the local storage - vector is almost always big enough -- saving the function call overhead is a big - deal. - (KJS::FuncDeclNode::makeFunction): Use exec->emptyList() instead of List::empty(). - (KJS::FuncExprNode::evaluate): Ditto. - * kjs/object.cpp: - (KJS::tryGetAndCallProperty): Ditto. - * kjs/property_slot.cpp: - (KJS::PropertySlot::functionGetter): Ditto. - * kjs/string_object.cpp: - (KJS::StringProtoFuncSplit::callAsFunction): Ditto. - -2008-01-01 Darin Adler - - Reviewed by Geoff. - - - fix http://bugs.webkit.org/show_bug.cgi?id=16648 - REGRESSION (r28165): Yuku.com navigation prints "jsRegExpExecute failed with result -2" - REGRESSION (r28165): Layout test fast/regex/test1 fails intermittently - - Fixes 34 failing test cases in the fast/regex/test1.html test. - - Restored the stack which prevents infinite loops for brackets that match the empty - string; it had been removed as an optimization. - - Unfortunately, restoring this stack causes the regular expression test in SunSpider - to be 1.095x as slow and the overall test to be 1.004x as slow. Maybe we can find - a correct optimization to restore the speed! - - It's possible the original change was on the right track but just off by one. - - * pcre/pcre_exec.cpp: Add back eptrblock, but name it BracketChainNode. - (MatchStack::pushNewFrame): Add back the logic needed here. - (startNewGroup): Ditto. - (match): Ditto. - -2008-01-01 Darin Adler - - Reviewed by Geoff. - - - http://bugs.webkit.org/show_bug.cgi?id=16683 - speed up function calls by making ScopeChain::push cheaper - - This gives a 1.019x speedup on SunSpider. - - After doing this, I realized this probably will be obsolete when the optimization - to avoid creating an activation object is done. When we do that one we should check - if rolling this out will speed things up, since this does add overhead at the time - you copy the scope chain. - - * kjs/object.h: Removed the ScopeChain::release function. It was - marked inline, and called in exactly one place, so moved it there. - No idea why it was in this header file! - - * kjs/scope_chain.cpp: Removed the overload of the ScopeChain::push - function that takes another ScopeChain. It was unused. I think we used - it over in WebCore at one point, but not any more. - - * kjs/scope_chain.h: Changed ScopeChainNode into a struct rather than - a class, got rid of its constructor so we can have one that's uninitialized, - and moved the refCount into a derived struct, ScopeChainHeapNode. Made _node - mutable so it can be changed in the moveToHeap function. Changed the copy - constructor and assignment operator to call moveToHeap, since the top node - can't be shared when it's embedded in another ScopeChain object. Updated - functions as needed to handle the case where the first object isn't on the - heap or to add casts for cases where it's guaranteed to be. Changed the push - function to always put the new node into the ScopeChain object; it will get - put onto the heap when needed later. - -2008-01-01 Geoffrey Garen - - Reviewed by Darin Adler. - - Fixed slight logic error in reserveCapacity, where we would reallocate - the storage buffer unnecessarily. - - * wtf/Vector.h: - (WTF::::reserveCapacity): No need to grow the buffer if newCapacity is - equal to capacity(). - -2008-01-01 Darin Adler - - Reviewed by Oliver. - - - http://bugs.webkit.org/show_bug.cgi?id=16684 - eliminate debugger overhead from function body execution - - Speeds SunSpider up 1.003x. That's a small amount, but measurable. - - * JavaScriptCore.exp: Updated. - * kjs/Parser.h: - (KJS::Parser::parse): Create the node with a static member function named create() instead - of using new explicitly. - - * kjs/grammar.y: Changed calls to new FunctionBodyNode to use FunctionBodyNode::create(). - - * kjs/nodes.cpp: - (KJS::ProgramNode::create): Added. Calls new. - (KJS::EvalNode::create): Ditto. - (KJS::FunctionBodyNode::create): Ditto, but creates FunctionBodyNodeWithDebuggerHooks - when a debugger is present. - (KJS::FunctionBodyNode::execute): Removed debugger hooks. - (KJS::FunctionBodyNodeWithDebuggerHooks::FunctionBodyNodeWithDebuggerHooks): Added. - (KJS::FunctionBodyNodeWithDebuggerHooks::execute): Calls the debugger, then the code, - then the debugger again. - - * kjs/nodes.h: Added create functions, made the constructors private and protected. - -2007-12-30 Eric Seidel - - Reviewed by Sam. - - More small cleanup to array_object.cpp - - * kjs/array_object.cpp: - (KJS::ArrayProtoFuncToString::callAsFunction): - (KJS::ArrayProtoFuncToLocaleString::callAsFunction): - (KJS::ArrayProtoFuncJoin::callAsFunction): - (KJS::ArrayProtoFuncConcat::callAsFunction): - (KJS::ArrayProtoFuncReverse::callAsFunction): - (KJS::ArrayProtoFuncShift::callAsFunction): - (KJS::ArrayProtoFuncSlice::callAsFunction): - (KJS::ArrayProtoFuncSort::callAsFunction): - (KJS::ArrayProtoFuncSplice::callAsFunction): - (KJS::ArrayProtoFuncUnShift::callAsFunction): - (KJS::ArrayProtoFuncFilter::callAsFunction): - (KJS::ArrayProtoFuncMap::callAsFunction): - (KJS::ArrayProtoFuncEvery::callAsFunction): - -2007-12-30 Eric Seidel - - Reviewed by Sam. - - Apply wkstyle to array_object.cpp - - * kjs/array_object.cpp: - (KJS::ArrayPrototype::ArrayPrototype): - (KJS::ArrayPrototype::getOwnPropertySlot): - (KJS::ArrayProtoFuncConcat::callAsFunction): - (KJS::ArrayProtoFuncPop::callAsFunction): - (KJS::ArrayProtoFuncReverse::callAsFunction): - (KJS::ArrayProtoFuncShift::callAsFunction): - (KJS::ArrayProtoFuncSlice::callAsFunction): - (KJS::ArrayProtoFuncSort::callAsFunction): - (KJS::ArrayProtoFuncSplice::callAsFunction): - (KJS::ArrayProtoFuncUnShift::callAsFunction): - (KJS::ArrayProtoFuncFilter::callAsFunction): - (KJS::ArrayProtoFuncMap::callAsFunction): - (KJS::ArrayProtoFuncEvery::callAsFunction): - (KJS::ArrayProtoFuncLastIndexOf::callAsFunction): - (KJS::ArrayObjectImp::ArrayObjectImp): - (KJS::ArrayObjectImp::implementsConstruct): - (KJS::ArrayObjectImp::construct): - (KJS::ArrayObjectImp::callAsFunction): - -2007-12-30 Eric Seidel - - Reviewed by Sam. - - Remove maxInt/minInt, replacing with std:max/min() - - * kjs/array_object.cpp: - (KJS::ArrayProtoFuncSplice::callAsFunction): - * kjs/operations.cpp: - * kjs/operations.h: - -2007-12-30 Eric Seidel - - Reviewed by Sam. - - Update Number.toString to properly throw exceptions. - Cleanup code in Number.toString implementation. - - * kjs/number_object.cpp: - (KJS::numberToString): - * kjs/object.cpp: - (KJS::Error::create): Remove bogus debug lines. - -2007-12-28 Eric Seidel - - Reviewed by Oliver. - - ASSERT when debugging via Drosera due to missed var lookup optimization. - http://bugs.webkit.org/show_bug.cgi?id=16634 - - No test case possible. - - * kjs/nodes.cpp: - (KJS::BreakpointCheckStatement::optimizeVariableAccess): - * kjs/nodes.h: - -2007-12-28 Eric Seidel - - Reviewed by Oliver. - - Fix (-0).toFixed() and re-factor a little - Fix (-0).toExponential() and printing of trailing 0s in toExponential - Fix toPrecision(nan) handling - http://bugs.webkit.org/show_bug.cgi?id=16640 - - * kjs/number_object.cpp: - (KJS::numberToFixed): - (KJS::fractionalPartToString): - (KJS::numberToExponential): - (KJS::numberToPrecision): - -2007-12-28 Eric Seidel - - Reviewed by Sam. - - More changes to make number code readable - - * kjs/number_object.cpp: - (KJS::integer_part_noexp): - (KJS::numberToFixed): - (KJS::numberToExponential): - -2007-12-28 Eric Seidel - - Reviewed by Sam. - - More small cleanups to toPrecision - - * kjs/number_object.cpp: - (KJS::numberToPrecision): - -2007-12-28 Eric Seidel - - Reviewed by Sam. - - More small attempts to make number code readable - - * kjs/number_object.cpp: - (KJS::exponentialPartToString): - (KJS::numberToExponential): - (KJS::numberToPrecision): - -2007-12-28 Eric Seidel - - Reviewed by Sam. - - Break out callAsFunction implementations into static functions - - * kjs/number_object.cpp: - (KJS::numberToString): - (KJS::numberToFixed): - (KJS::numberToExponential): - (KJS::numberToPrecision): - (KJS::NumberProtoFunc::callAsFunction): - -2007-12-28 Eric Seidel - - Reviewed by Sam. - - Apply wkstyle/astyle and fix placement of * - - * kjs/number_object.cpp: - (KJS::NumberInstance::NumberInstance): - (KJS::NumberPrototype::NumberPrototype): - (KJS::NumberProtoFunc::NumberProtoFunc): - (KJS::integer_part_noexp): - (KJS::intPow10): - (KJS::NumberProtoFunc::callAsFunction): - (KJS::NumberObjectImp::NumberObjectImp): - (KJS::NumberObjectImp::getOwnPropertySlot): - (KJS::NumberObjectImp::getValueProperty): - (KJS::NumberObjectImp::implementsConstruct): - (KJS::NumberObjectImp::construct): - (KJS::NumberObjectImp::callAsFunction): - * kjs/object.cpp: - (KJS::JSObject::put): - -2007-12-27 Eric Seidel - - Reviewed by Sam. - - ASSERT in JavaScriptCore while viewing WICD test case - http://bugs.webkit.org/show_bug.cgi?id=16626 - - * kjs/nodes.cpp: - (KJS::ForInNode::execute): move KJS_CHECK_EXCEPTION to proper place - -2007-12-26 Jan Michael Alonzo - - Reviewed by Alp Toker. - - http://bugs.webkit.org/show_bug.cgi?id=16390 - Use autotools or GNU make as the build system for the GTK port - - * GNUmakefile.am: Added. - -2007-12-25 Maciej Stachowiak - - Reviewed by Oliver. - - - Remove unnecessary redundant check from property setting - http://bugs.webkit.org/show_bug.cgi?id=16602 - - 1.3% speedup on SunSpider. - - * kjs/object.cpp: - (KJS::JSObject::put): Don't do canPut check when not needed; let - the PropertyMap handle it. - (KJS::JSObject::canPut): Don't check the static property - table. lookupPut does that already. - -2007-12-24 Alp Toker - - Fix builds that don't use AllInOneFile.cpp following breakage - introduced in r28973. - - * kjs/grammar.y: - -2007-12-24 Maciej Stachowiak - - Reviewed by Eric. - - - Optimize variable declarations - http://bugs.webkit.org/show_bug.cgi?id=16585 - - 3.5% speedup on SunSpider. - - var statements now result in either assignments or empty statements. - - This allows a couple of optimization opportunities: - - No need to branch at runtime to check if there is an initializer - - EmptyStatementNodes can be removed entirely (also done in this patch) - - Assignment expressions get properly optimized for local variables - - This patch also includes some code cleanup: - - Most of the old VarStatement/VarDecl logic is now only used for const declarations, - thus it is renamed appropriately - - AssignExprNode is gone - - * JavaScriptCore.exp: - * kjs/NodeInfo.h: - * kjs/grammar.y: - * kjs/nodes.cpp: - (KJS::SourceElements::append): - (KJS::ConstDeclNode::ConstDeclNode): - (KJS::ConstDeclNode::optimizeVariableAccess): - (KJS::ConstDeclNode::handleSlowCase): - (KJS::ConstDeclNode::evaluateSingle): - (KJS::ConstDeclNode::evaluate): - (KJS::ConstStatementNode::optimizeVariableAccess): - (KJS::ConstStatementNode::execute): - (KJS::VarStatementNode::optimizeVariableAccess): - (KJS::VarStatementNode::execute): - (KJS::ForInNode::ForInNode): - (KJS::ForInNode::optimizeVariableAccess): - (KJS::ForInNode::execute): - (KJS::FunctionBodyNode::initializeSymbolTable): - (KJS::ProgramNode::initializeSymbolTable): - (KJS::FunctionBodyNode::processDeclarations): - (KJS::ProgramNode::processDeclarations): - (KJS::EvalNode::processDeclarations): - * kjs/nodes.h: - (KJS::DeclarationStacks::): - (KJS::StatementNode::): - (KJS::ConstDeclNode::): - (KJS::ConstStatementNode::): - (KJS::EmptyStatementNode::): - (KJS::VarStatementNode::): - (KJS::ForNode::): - * kjs/nodes2string.cpp: - (KJS::ConstDeclNode::streamTo): - (KJS::ConstStatementNode::streamTo): - (KJS::ScopeNode::streamTo): - (KJS::VarStatementNode::streamTo): - (KJS::ForNode::streamTo): - (KJS::ForInNode::streamTo): - -2007-12-21 Mark Rowe - - Reviewed by Oliver Hunt. - - * JavaScriptCore.exp: Remove unused symbol to prevent a weak external symbol - being generated in JavaScriptCore.framework. - -2007-12-21 Darin Adler - - Requested by Maciej. - - * kjs/nodes.h: Use the new NEVER_INLINE here and eliminate the old - KJS_NO_INLINE. We don't want to have two, and we figured it was better - to keep the one that's in WTF. - -2007-12-21 Darin Adler - - Reviewed by Eric. - - - http://bugs.webkit.org/show_bug.cgi?id=16561 - remove debugger overhead from non-debugged JavaScript execution - - 1.022x as fast on SunSpider. - - * JavaScriptCore.exp: Updated. - - * kjs/NodeInfo.h: Renamed SourceElementsStub to SourceElements, - since that more accurately describes the role of this object, which - is a reference-counted wrapper for a Vector. - - * kjs/Parser.cpp: - (KJS::Parser::didFinishParsing): Changed parameter type to SourceElements, - and use plain assignment instead of set. - * kjs/Parser.h: Changed parameter type of didFinishParsing to a - SourceElements. Also changed m_sourceElements; we now use a RefPtr instead - of an OwnPtr as well. - - * kjs/grammar.y: Got rid of all the calls to release() on SourceElements. - That's now handed inside the constructors for various node types, since we now - use vector swapping instead. - - * kjs/nodes.cpp: - (KJS::Node::rethrowException): Added NEVER_INLINE, because this was getting inlined - and we want exception handling out of the normal code flow. - (KJS::SourceElements::append): Moved here from the header. This now handles - creating a BreakpointCheckStatement for each statement in the debugger case. - That way we can get breakpoint handling without having it in every execute function. - (KJS::BreakpointCheckStatement::BreakpointCheckStatement): Added. - (KJS::BreakpointCheckStatement::execute): Added. Contains the code that was formerly - in the StatementNode::hitStatement function and the KJS_BREAKPOINT macro. - (KJS::BreakpointCheckStatement::streamTo): Added. - (KJS::ArgumentListNode::evaluateList): Use KJS_CHECKEXCEPTIONVOID since the return - type is void. - (KJS::VarStatementNode::execute): Removed KJS_BREAKPOINT. - (KJS::BlockNode::BlockNode): Changed parameter type to SourceElements. - Changed code to use release since the class now contains a vector rather than - a vector point. - (KJS::BlockNode::optimizeVariableAccess): Updated since member is now a vector - rather than a vector pointer. - (KJS::BlockNode::execute): Ditto. - (KJS::ExprStatementNode::execute): Removed KJS_BREAKPOINT. - (KJS::IfNode::execute): Ditto. - (KJS::IfElseNode::execute): Ditto. - (KJS::DoWhileNode::execute): Ditto. - (KJS::WhileNode::execute): Ditto. - (KJS::ContinueNode::execute): Ditto. - (KJS::BreakNode::execute): Ditto. - (KJS::ReturnNode::execute): Ditto. - (KJS::WithNode::execute): Ditto. - (KJS::CaseClauseNode::optimizeVariableAccess): Updated since member is now a vector - rather than a vector pointer. - (KJS::CaseClauseNode::executeStatements): Ditto. - (KJS::SwitchNode::execute): Removed KJS_BREAKPOINT. - (KJS::ThrowNode::execute): Ditto. - (KJS::TryNode::execute): Ditto. - (KJS::ScopeNode::ScopeNode): Changed parameter type to SourceElements. - (KJS::ProgramNode::ProgramNode): Ditto. - (KJS::EvalNode::EvalNode): Ditto. - (KJS::FunctionBodyNode::FunctionBodyNode): Ditto. - (KJS::ScopeNode::optimizeVariableAccess): Updated since member is now a vector - rather than a vector pointer. - - * kjs/nodes.h: Removed hitStatement. Renamed SourceElements to StatementVector. - Renamed SourceElementsStub to SourceElements and made it derive from - ParserRefCounted rather than from Node, hold a vector rather than a pointer to - a vector, and changed the release function to swap with another vector rather - than the pointer idiom. Updated BlockNode and CaseClauseNode to hold actual - vectors instead of pointers to vectors. Added BreakpointCheckStatement. - - * kjs/nodes2string.cpp: - (KJS::statementListStreamTo): Changed to work on a vector instead of a pointer - to a vector. - (KJS::BlockNode::streamTo): Ditto. - (KJS::CaseClauseNode::streamTo): Ditto. - - * wtf/AlwaysInline.h: Added NEVER_INLINE. - * wtf/PassRefPtr.h: Tweaked formatting. Added clear() function that matches the - ones in OwnPtr and auto_ptr. - * wtf/RefPtr.h: Ditto. - -2007-12-21 Darin Adler - - - fix broken regression tests - - The broken tests were fast/js/do-while-expression-value.html and - fast/js/while-expression-value.html. - - * kjs/nodes.cpp: Check in the correct version of this file. I had accidentally landed - an old version of my patch for bug 16471. - (KJS::statementListExecute): The logic here was backwards. Have to set the value - even for non-normal execution results. - -2007-12-20 Alexey Proskuryakov - - Windows build fix - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Copy npruntime_internal.h - to WebKitBuild. - -2007-12-20 Eric Seidel - - Reviewed by mjs. - - Split IfNode into IfNode and IfElseNode for speedup. - http://bugs.webkit.org/show_bug.cgi?id=16470 - - SunSpider claims this is 1.003x as fast as before. - (This required running with --runs 15 to get consistent enough results to tell!) - - * kjs/grammar.y: - * kjs/nodes.cpp: - (KJS::IfNode::optimizeVariableAccess): - (KJS::IfNode::execute): - (KJS::IfNode::getDeclarations): - (KJS::IfElseNode::optimizeVariableAccess): - (KJS::IfElseNode::execute): - (KJS::IfElseNode::getDeclarations): - * kjs/nodes.h: - (KJS::IfNode::): - (KJS::IfElseNode::): - * kjs/nodes2string.cpp: - (KJS::IfNode::streamTo): - (KJS::IfElseNode::streamTo): - -2007-12-20 Darin Adler - - Reviewed by Sam. - - * wtf/OwnPtr.h: - (WTF::operator==): Added. - (WTF::operator!=): Added. - -2007-12-20 Geoffrey Garen - - Reviewed by Oliver Hunt. - - AST optimization: Avoid NULL-checking ForNode's child nodes. - - 0.6% speedup on SunSpider. - - This is a proof of concept patch that demonstrates how to optimize - grammar productions with optional components, like - - for (optional; optional; optional) { - ... - } - - The parser emits NULL for an optional component that is not present. - - Instead of checking for a NULL child at execution time, a node that - expects an optional component to be present more often than not checks - for a NULL child at construction time, and substitutes a viable - alternative node in its place. - - (We'd like the parser to start emitting NULL a lot more once we teach - it to emit NULL for certain no-op productions like EmptyStatement and - VariableStatement, so, as a foundation, it's important for nodes with - NULL optional components to be fast.) - - * kjs/Parser.cpp: - (KJS::Parser::didFinishParsing): Check for NULL SourceElements. Also, - moved didFinishParsing into the .cpp file because adding a branch while - it was in the header file caused a substantial and inexplicable - performance regression. (Did I mention that GCC is crazy?) - - * kjs/grammar.y: - - * kjs/nodes.cpp: - (KJS::BlockNode::BlockNode): Check for NULL SourceElements. - (KJS::ForNode::optimizeVariableAccess): No need to check for NULL here. - (KJS::ForNode::execute): No need to check for NULL here. - * kjs/nodes.h: - (KJS::ForNode::): Check for NULL SourceElements. Substitute a TrueNode - because it's semantically harmless, and it evaluates to boolean in an - efficient manner. - -2007-12-20 Oliver Hunt - - Reviewed by Geoff. - - Slight logic reordering in JSImmediate::from(double) - - This gives a 0.6% improvement in SunSpider. - - * kjs/JSImmediate.h: - (KJS::JSImmediate::from): - -2007-12-20 Eric Seidel - - Reviewed by mjs. - - Fix major Array regression introduced by 28899. - - SunSpider claims this is at least 1.37x as fast as pre-regression. :) - - * kjs/array_instance.cpp: make Arrays fast again! - -2007-12-20 Eric Seidel - - Reviewed by Geoff, then re-rubber-stamped by Geoff after final search/replace and testing. - - Small reworking of Date code for 4% speedup on Date tests (0.2% overall) - http://bugs.webkit.org/show_bug.cgi?id=16537 - - Make msToYear human-readable - Make msToDayInMonth slightly more readable and avoid recalculating msToYear - Remove use of isInLeapYear to avoid calling msToYear - Remove dayInYear call by changing msToDayInMonth to dayInMonthFromDayInYear - Remove more duplicate calls to dayInYear and getUTCOffset for further speedup - - * kjs/DateMath.cpp: - (KJS::daysFrom1970ToYear): - (KJS::msToYear): - (KJS::monthFromDayInYear): - (KJS::checkMonth): - (KJS::dayInMonthFromDayInYear): - (KJS::dateToDayInYear): - (KJS::getDSTOffsetSimple): - (KJS::getDSTOffset): - (KJS::gregorianDateTimeToMS): - (KJS::msToGregorianDateTime): - -2007-12-20 Rodney Dawes - - Reviewed by Darin Adler. - - Proxy includes of npruntime.h or npapi.h through npruntime_internal.h - Include stdio.h in npapi.h for the use of FILE with XP_UNIX defined - This is for building with X11, as some type and enum names conflict - with #define names in X11 headers. - http://bugs.webkit.org/show_bug.cgi?id=15669 - - * JavaScriptCore.xcodeproj/project.pbxproj: - * bindings/NP_jsobject.h: - * bindings/npapi.h: - * bindings/npruntime.cpp: - * bindings/npruntime_impl.h: - * bindings/npruntime_priv.h: - * bindings/npruntime_internal.h: - * bindings/testbindings.cpp: - * bindings/c/c_class.h: - * bindings/c/c_runtime.h: - * bindings/c/c_utility.h: - -2007-12-20 Darin Adler - - - re-fix http://bugs.webkit.org/show_bug.cgi?id=16471 - Completions need to be smaller (or not exist at all) - - Same patch as last time with the test failures problem fixed. - - * kjs/function.cpp: - (KJS::GlobalFuncImp::callAsFunction): Make sure to check the completion - type from newExec to see if the execute raised an exception. - -2007-12-20 Darin Adler - - - roll out that last change -- it was causing test failures; - I'll check it back in after fixing them - -2007-12-20 Darin Adler - - Reviewed by Eric. - - - http://bugs.webkit.org/show_bug.cgi?id=16471 - Completions need to be smaller (or not exist at all) - - SuSpider shows 2.4% speedup. - - Stop using completions in the execution engine. - Instead, the completion type and label target are both - stored in the ExecState. - - * API/JSContextRef.cpp: Removed unneeded include of "completion.h". - * bindings/runtime_method.cpp: Removed unused execute function. - * bindings/runtime_method.h: Ditto. - - * kjs/ExecState.h: Added completionType, breakOrContinueTarget, - setCompletionType, setNormalCompletion, setBreakCompletion, - setContinueCompletion, setReturnValueCompletion, setThrowCompletion, - setInterruptedCompletion, m_completionType, and m_breakOrContinueTarget. - - * kjs/completion.h: Removed constructor and getter for target - for break and continue from Completion. This class is now only - used for the public API to Interpreter and such. - - * kjs/date_object.h: Removed unused execute function. - - * kjs/function.cpp: - (KJS::FunctionImp::callAsFunction): Removed some unneeded - exception processing. Updated to call the new execute function - and to get the completion type from the ExecState. Merged in - the execute function, which repeated some of the same logic and - was called only from here. - (KJS::GlobalFuncImp::callAsFunction): More of the same for eval. - * kjs/function.h: Removed execute. - - * kjs/interpreter.cpp: - (KJS::Interpreter::evaluate): Added code to convert the result of - execut into a Completion. - - * kjs/nodes.cpp: - (KJS::Node::setErrorCompletion): Renamed from createErrorCompletion. - Now sets the completion type in the ExecState. - (KJS::Node::rethrowException): Now sets the completion type in the - ExecState. - (KJS::StatementNode::hitStatement): Now sets the completion type in - the ExecState. - (KJS::VarStatementNode::execute): Updated to put completion type in - the ExecState instead of a Completion object. - (KJS::statementListExecute): Ditto. Also changed the for loop to use - indices instead of iterators. - (KJS::BlockNode::execute): Updated return type. - (KJS::EmptyStatementNode::execute): Updated to put completion type in - the ExecState instead of a Completion object. - (KJS::ExprStatementNode::execute): Ditto. - (KJS::IfNode::execute): Ditto. - (KJS::DoWhileNode::execute): Ditto. Also streamlined the logic a little - to make the normal case a little faster and moved the end outside the - loop so that "break" can do a break. - (KJS::WhileNode::execute): Ditto. - (KJS::ForNode::execute): Ditto. - (KJS::ForInNode::execute): Ditto. - (KJS::ContinueNode::execute): Updated to put completion type in - the ExecState instead of a Completion object. - (KJS::BreakNode::execute): Ditto. - (KJS::ReturnNode::execute): Ditto. - (KJS::WithNode::execute): Ditto. - (KJS::CaseClauseNode::executeStatements): Ditto. Also renamed to have - execute in its name to reflect the fact that it's a member of the same - family of functions. - (KJS::CaseBlockNode::executeBlock): Ditto. - (KJS::SwitchNode::execute): Ditto. - (KJS::LabelNode::execute): Ditto. - (KJS::ThrowNode::execute): Ditto. - (KJS::TryNode::execute): Ditto. - (KJS::ProgramNode::execute): Ditto. - (KJS::EvalNode::execute): Ditto. - (KJS::FunctionBodyNode::execute): Ditto. - (KJS::FuncDeclNode::execute): Ditto. - - * kjs/nodes.h: Renamed setErrorCompletion to createErrorCompletion, made - hitStatement protected, changed return value of execute to a JSValue, - renamed evalStatements to executeStatements, and evalBlock to executeBlock. - - * kjs/number_object.h: Removed unused execute function. - -2007-12-20 Geoffrey Garen - - Added Radar number. - - * kjs/nodes.cpp: - (KJS::ProgramNode::processDeclarations): - -2007-12-20 Geoffrey Garen - - Linux build fix: config.h has to come first. - - * kjs/error_object.cpp: - -2007-12-19 Geoffrey Garen - - Reviewed by Oliver Hunt. - - Optimized global access to global variables, using a symbol table. - - SunSpider reports a 1.5% overall speedup, a 6.2% speedup on 3d-morph, - and a whopping 33.1% speedup on bitops-bitwise-and. - - * API/JSCallbackObjectFunctions.h: Replaced calls to JSObject:: with - calls to Base::, since JSObject is not always our base class. This - was always a bug, but the bug is even more apparent after some of my - changes. - - (KJS::::staticFunctionGetter): Replaced use of getDirect with call to - getOwnPropertySlot. Global declarations are no longer stored in the - property map, so a call to getDirect is insufficient for finding - override properties. - - * API/testapi.c: - * API/testapi.js: Added test for the getDirect change mentioned above. - - * kjs/ExecState.cpp: - * kjs/ExecState.h: Dialed back the optimization to store a direct - pointer to the localStorage buffer. One ExecState can grow the global - object's localStorage without another ExecState's knowledge, so - ExecState can't store a direct pointer to the localStorage buffer - unless/until we invent a way to update all the relevant ExecStates. - - * kjs/JSGlobalObject.cpp: Inserted the symbol table into get and put - operations. - (KJS::JSGlobalObject::reset): Reset the symbol table and local storage, - too. Also, clear the property map here, removing the need for a - separate call. - - * kjs/JSVariableObject.cpp: - * kjs/JSVariableObject.h: Added support for saving localStorage and the - symbol table to the back/forward cache, and restoring them. - - * kjs/function.cpp: - (KJS::GlobalFuncImp::callAsFunction): Renamed progNode to evalNode - because it's an EvalNode, not a ProgramNode. - - * kjs/lookup.h: - (KJS::cacheGlobalObject): Replaced put with faster putDirect, since - that's how the rest of lookup.h works. putDirect is safe here because - cacheGlobalObject is only used for objects whose names are not valid - identifiers. - - * kjs/nodes.cpp: The good stuff! - - (KJS::EvalNode::processDeclarations): Replaced hasProperty with - the new hasOwnProperty, which is slightly faster. - - * kjs/object.h: Nixed clearProperties because clear() does this job now. - - * kjs/property_map.cpp: - * kjs/property_map.h: More back/forward cache support. - - * wtf/Vector.h: - (WTF::::grow): Added fast non-branching grow function. I used it in - an earlier version of this patch, even though it's not used anymore. - -2007-12-09 Mark Rowe - - Reviewed by Oliver Hunt. - - Build fix for non-Mac platforms. Move NodeInfo into its own header so that the YYTYPE - declaration in grammar.h is able to declare members of that type. - - * kjs/NodeInfo.h: Added. - (KJS::createNodeInfo): - (KJS::mergeDeclarationLists): - (KJS::appendToVarDeclarationList): - * kjs/grammar.y: - * kjs/lexer.cpp: - -2007-12-19 Oliver Hunt - - Make appendToVarDeclarationList static - - RS=Weinig. - - * kjs/grammar.y: - -2007-12-18 Oliver Hunt - - Remove dead code due to removal of post-parse declaration discovery. - - RS=Geoff. - - Due to the removal of the declaration discovery pass after parsing we - no longer need any of the logic used for that discovery. - - * kjs/nodes.cpp: - (KJS::Node::Node): - (KJS::VarDeclNode::VarDeclNode): - (KJS::BlockNode::BlockNode): - (KJS::ForInNode::ForInNode): - (KJS::CaseBlockNode::CaseBlockNode): - * kjs/nodes.h: - (KJS::VarStatementNode::): - (KJS::IfNode::): - (KJS::DoWhileNode::): - (KJS::WhileNode::): - (KJS::WithNode::): - (KJS::LabelNode::): - (KJS::TryNode::): - (KJS::FuncDeclNode::): - (KJS::CaseClauseNode::): - (KJS::ClauseListNode::): - (KJS::SwitchNode::): - -2007-12-18 Oliver Hunt - - Replace post-parse pass to find declarations with logic in the parser itself - - Reviewed by Geoff. - - Instead of finding declarations in a pass following the initial parsing of - a program, we incorporate the logic directly into the parser. This lays - the groundwork for further optimisations (such as improving performance in - declaration expressions -- var x = y; -- to match that of standard assignment) - in addition to providing a 0.4% performance improvement in SunSpider. - - * JavaScriptCore.exp: - * kjs/Parser.cpp: - (KJS::Parser::parse): - * kjs/Parser.h: - (KJS::Parser::didFinishParsing): - (KJS::Parser::parse): - * kjs/grammar.y: - * kjs/nodes.cpp: - (KJS::ParserTracked::ParserTracked): - (KJS::ParserTracked::~ParserTracked): - (KJS::ParserTracked::ref): - (KJS::ParserTracked::deref): - (KJS::ParserTracked::refcount): - (KJS::ParserTracked::clearNewTrackedObjects): - (KJS::Node::Node): - (KJS::ScopeNode::ScopeNode): - (KJS::ProgramNode::ProgramNode): - (KJS::EvalNode::EvalNode): - (KJS::FunctionBodyNode::FunctionBodyNode): - (KJS::FunctionBodyNode::initializeSymbolTable): - (KJS::FunctionBodyNode::processDeclarations): - * kjs/nodes.h: - (KJS::ParserTracked::): - (KJS::Node::): - (KJS::ScopeNode::): - -2007-12-18 Xan Lopez - - Reviewed by Geoff. - - Fix http://bugs.webkit.org/show_bug.cgi?id=14521 - Bug 14521: JavaScriptCore fails to build on Linux/PPC gcc 4.1.2 - - * wtf/TCSpinLock.h: - (TCMalloc_SpinLock::Unlock): - - Use less strict memory operand constraint on inline asm generation. - PLATFORM(DARWIN) left unpatched due to Apple's GCC bug. - - Patch by David Kilzer - -2007-12-18 Mark Rowe - - Rubber-stamped by Maciej Stachowiak. - - Remove outdated and non-functioning project files for the Apollo port. - - * JavaScriptCore.apolloproj: Removed. - -2007-12-18 Darin Adler - - - fix Windows build - - * pcre/pcre_exec.cpp: - (jsRegExpExecute): Change back from false/true to 0/1 -- I probably should not have - deleted MATCH_MATCH and MATCH_NOMATCH, but I'm going to leave them out. - -2007-12-18 Darin Adler - - Reviewed by Geoff. - - - fix http://bugs.webkit.org/show_bug.cgi?id=16458 - REGRESSION (r28164): regular expressions can now hang due to lack of a match limit - - - Test: fast/regex/slow.html - - Slows down SunSpider a bit (about 1.01x); filed a bug to follow up on that: - http://bugs.webkit.org/show_bug.cgi?id=16503 - - * pcre/pcre.h: Changed name of error code to not specifically mention "recursion". - * pcre/pcre_exec.cpp: - (match): Replaced the depth limit, MATCH_RECURSION_LIMIT, with a total match looping - limit, matchLimit. Also eliminated the constants for MATCH_MATCH and MATCH_NOMATCH, - since they are just true and false (1 and 0). - (jsRegExpExecute): More of the MATCH_MATCH change. - -2007-12-17 Darin Adler - - - speculative build fix for non-gcc platforms - - * pcre/pcre_exec.cpp: (match): Remove unused cases from return switch. - -2007-12-16 Mark Rowe - - Speculative build fix for non-Mac platforms. - - * pcre/pcre_compile.cpp: Include string.h for memset, memmove, etc. - -2007-12-16 Darin Adler - - Reviewed by Maciej. - - - http://bugs.webkit.org/show_bug.cgi?id=16438 - - removed some more unused code - - changed quite a few more names to WebKit-style - - moved more things out of pcre_internal.h - - changed some indentation to WebKit-style - - improved design of the functions for reading and writing - 2-byte values from the opcode stream (in pcre_internal.h) - - * pcre/dftables.cpp: - (main): Added the kjs prefix a normal way in lieu of using macros. - - * pcre/pcre_compile.cpp: Moved some definitions here from pcre_internal.h. - (errorText): Name changes, fewer typedefs. - (checkEscape): Ditto. Changed uppercase conversion to use toASCIIUpper. - (isCountedRepeat): Name change. - (readRepeatCounts): Name change. - (firstSignificantOpcode): Got rid of the use of OP_lengths, which is - very lightly used here. Hard-coded the length of OP_BRANUMBER. - (firstSignificantOpcodeSkippingAssertions): Ditto. Also changed to - use the advanceToEndOfBracket function. - (getOthercaseRange): Name changes. - (encodeUTF8): Ditto. - (compileBranch): Name changes. Removed unused after_manual_callout and - the code to handle it. Removed code to handle OP_ONCE since we never - emit this opcode. Changed to use advanceToEndOfBracket in more places. - (compileBracket): Name changes. - (branchIsAnchored): Removed code to handle OP_ONCE since we never emit - this opcode. - (bracketIsAnchored): Name changes. - (branchNeedsLineStart): More fo the same. - (bracketNeedsLineStart): Ditto. - (branchFindFirstAssertedCharacter): Removed OP_ONCE code. - (bracketFindFirstAssertedCharacter): More of the same. - (calculateCompiledPatternLengthAndFlags): Ditto. - (returnError): Name changes. - (jsRegExpCompile): Ditto. - - * pcre/pcre_exec.cpp: Moved some definitions here from pcre_internal.h. - (matchRef): Updated names. - Improved macros to use the do { } while(0) idiom so they expand to single - statements rather than to blocks or multiple statements. And refeactored - the recursive match macros. - (MatchStack::pushNewFrame): Name changes. - (getUTF8CharAndIncrementLength): Name changes. - (match): Name changes. Removed the ONCE opcode. - (jsRegExpExecute): Name changes. - - * pcre/pcre_internal.h: Removed quite a few unneeded includes. Rewrote - quite a few comments. Removed the macros that add kjs prefixes to the - functions with external linkage; instead renamed the functions. Removed - the unneeded typedefs pcre_uint16, pcre_uint32, and uschar. Removed the - dead and not-all-working code for LINK_SIZE values other than 2, although - we aim to keep the abstraction working. Removed the OP_LENGTHS macro. - (put2ByteValue): Replaces put2ByteOpcodeValueAtOffset. - (get2ByteValue): Replaces get2ByteOpcodeValueAtOffset. - (put2ByteValueAndAdvance): Replaces put2ByteOpcodeValueAtOffsetAndAdvance. - (putLinkValueAllowZero): Replaces putOpcodeValueAtOffset; doesn't do the - addition, since a comma is really no better than a plus sign. Added an - assertion to catch out of range values and changed the parameter type to - int rather than unsigned. - (getLinkValueAllowZero): Replaces getOpcodeValueAtOffset. - (putLinkValue): New function that most former callers of the - putOpcodeValueAtOffset function can use; asserts the value that is - being stored is non-zero and then calls putLinkValueAllowZero. - (getLinkValue): Ditto. - (putLinkValueAndAdvance): Replaces putOpcodeValueAtOffsetAndAdvance. No - caller was using an offset, which makes sense given the advancing behavior. - (putLinkValueAllowZeroAndAdvance): Ditto. - (isBracketOpcode): Added. For use in an assertion. - (advanceToEndOfBracket): Renamed from moveOpcodePtrPastAnyAlternateBranches, - and removed comments about how it's not well designed. This function takes - a pointer to the beginning of a bracket and advances to the end of the - bracket. - - * pcre/pcre_tables.cpp: Updated names. - * pcre/pcre_ucp_searchfuncs.cpp: - (kjs_pcre_ucp_othercase): Ditto. - * pcre/pcre_xclass.cpp: - (getUTF8CharAndAdvancePointer): Ditto. - (kjs_pcre_xclass): Ditto. - * pcre/ucpinternal.h: Ditto. - - * wtf/ASCIICType.h: - (WTF::isASCIIAlpha): Added an int overload, like the one we already have for - isASCIIDigit. - (WTF::isASCIIAlphanumeric): Ditto. - (WTF::isASCIIHexDigit): Ditto. - (WTF::isASCIILower): Ditto. - (WTF::isASCIISpace): Ditto. - (WTF::toASCIILower): Ditto. - (WTF::toASCIIUpper): Ditto. - -2007-12-16 Darin Adler - - Reviewed by Maciej. - - - fix http://bugs.webkit.org/show_bug.cgi?id=16459 - REGRESSION: assertion failure with regexp with \B in a case-ignoring character range - - - The problem was that \B was not handled properly in character classes. - - Test: fast/js/regexp-overflow.html - - * pcre/pcre_compile.cpp: - (check_escape): Added handling of ESC_b and ESC_B in character classes here. - Allows us to get rid of the handling of \b in character classes from all the - call sites that handle it separately and to handle \B properly as well. - (compileBranch): Remove the ESC_b handling, since it's not needed any more. - (calculateCompiledPatternLengthAndFlags): Ditto. - -2007-12-16 Mark Rowe - - Reviewed by Maciej Stachowiak. - - Fix http://bugs.webkit.org/show_bug.cgi?id=16448 - Bug 16448: [GTK] Celtic Kane JavaScript performance on Array test is slow relative to Mac - - * kjs/array_instance.cpp: - (KJS::compareByStringPairForQSort): - (KJS::ArrayInstance::sort): Convert JSValue's to strings once up front and then sort the - results. This avoids calling toString twice per comparison, but requires a temporary buffer - so we only use this approach in cases where the array being sorted is not too large. - -2007-12-16 Geoffrey Garen - - Reviewed by Darin Adler and Maciej Stachowiak. - - More refactoring to support global variable optimization. - - Changed SymbolTable to use RefPtr as its key instead of - UString::Rep*. With globals, the symbol table can outlast the - declaration node for any given symbol, so the symbol table needs to ref - its symbol names. - - In support, specialized HashMaps with RefPtr keys to allow lookup - via raw pointer, avoiding refcount churn. - - SunSpider reports a .6% speedup (prolly just noise). - - * JavaScriptCore.vcproj/WTF/WTF.vcproj: Added new file: wtf/RefPtrHashMap.h - * JavaScriptCore.xcodeproj/project.pbxproj: ditto - - * kjs/JSVariableObject.cpp: - (KJS::JSVariableObject::getPropertyNames): Symbol table keys are RefPtrs now. - - * kjs/SymbolTable.h: Modified key traits to match RefPtr. Added a - static Rep* for null, which helps compute the deletedValue() trait. - - * wtf/HashMap.h: #include the RefPtr specialization so everyone can use it. - - * wtf/RefPtrHashMap.h: Copied from wtf/HashMap.h. Added overloaded versions - of find(), contains(), get(), set(), add(), remove(), and take() that take - raw pointers as keys. - -2007-12-16 Alexey Proskuryakov - - Reviewed by Darin. - - http://bugs.webkit.org/show_bug.cgi?id=16162 - Problems with float parsing on Linux (locale-dependent parsing was used). - - * kjs/dtoa.cpp: Removed USE_LOCALE to reduce future confusion. - * kjs/lexer.cpp: (KJS::Lexer::lex): Parse with kjs_strtod, not the system one. - -2007-12-14 Alp Toker - - Reviewed by Mark Rowe. - - Enable the AllInOneFile.cpp optimization for the GTK+ port. - - * JavaScriptCore.pri: - -2007-12-14 Mark Rowe - - Unreviewed. Remove commented out fprintf's that were for debugging purposes only. - - * wtf/FastMalloc.cpp: - (WTF::TCMalloc_PageHeap::IncrementalScavenge): - -2007-12-14 Mark Rowe - - Reviewed by Maciej Stachowiak. - - Don't use the MADV_DONTNEED code path for now as it has no effect on Mac OS X and is - currently untested on other platforms. - - * wtf/TCSystemAlloc.cpp: - (TCMalloc_SystemRelease): Return after releasing memory rather than potentially falling - through into another mechanism if multiple are supported. - -2007-12-14 Alp Toker - - Build fix for GTK+/Qt and ports that don't use AllInOneFile.cpp. - - Include UnusedParam.h. - - * wtf/TCSystemAlloc.cpp: - -2007-12-14 Oliver Hunt - - Reviewed by Stephanie. - - Fix build on windows - - * wtf/FastMalloc.cpp: - (WTF::TCMalloc_PageHeap::IncrementalScavenge): - -2007-12-14 Dan Bernstein - - - try again to fix the Windows build - - * wtf/TCSystemAlloc.cpp: - (TCMalloc_SystemRelease): - -2007-12-14 Dan Bernstein - - - try to fix the Windows build - - * wtf/TCSystemAlloc.cpp: - (TCMalloc_SystemRelease): - -2007-12-14 Mark Rowe - - Reviewed by Maciej and Oliver. - - Add final changes to make TCMalloc release memory to the system. - This results in a 0.4% regression against ToT, but this is offset - against the gains made by the original TCMalloc r38 merge - in fact - we retain around 0.3-0.4% progression overall. - - * wtf/FastMalloc.cpp: - (WTF::InitSizeClasses): - (WTF::TCMalloc_PageHeap::IncrementalScavenge): - * wtf/TCSystemAlloc.cpp: - (TCMalloc_SystemRelease): - -2007-12-14 Darin Adler - - Reviewed by Sam. - - - removed unnecessary includes of "Vector.h" - - * wtf/HashMap.h: - (WTF::copyKeysToVector): Make the type of the vector be a template parameter. - This allows copying keys into a vector of a base class or one with an inline capacity. - (WTF::copyValuesToVector): Ditto. - * wtf/HashSet.h: - (WTF::copyToVector): Ditto. - -2007-12-14 Anders Carlsson - - Reviewed by Darin and Geoff. - - - REGRESSION: 303-304: Embedded YouTube video fails to render- JS errors (16150) (Flash 9) - - Get rid of unnecessary and incorrect security checks for plug-ins accessing JavaScript objects. - - The way this used to work was that each NPObject that wrapped a JSObject would have a root object - corresponding to the frame object (used for managing the lifecycle) and an origin root object (used for - doing security checks). - - This would prevent a plug-in from accessing a frame's window object if it's security origin was different - (some parts of the window, such as the location object, can be accessed from frames with different security - origins, and those checks are being done in WebCore). - - Also, if a plug-in were to access a window object of a frame that later went away, it could lead to that - Window JSObject being garbage collected and the NPObject pointing to freed memory. - - How this works now is that there is no origin root object anymore, and all NPObject wrappers that are created - for a plug-in will have the root object of the containing frame of that plug-in. - - * bindings/NP_jsobject.cpp: - (jsDeallocate): - Don't free the origin root object. - - (_NPN_CreateScriptObject): - Remove the origin root object parameter. - - (_NPN_InvokeDefault): - (_NPN_Invoke): - (_NPN_Evaluate): - (_NPN_GetProperty): - (_NPN_SetProperty): - (_NPN_RemoveProperty): - (_NPN_HasProperty): - (_NPN_HasMethod): - (_NPN_Enumerate): - Get rid of all security checks. - - * bindings/NP_jsobject.h: - Remove originRootObject from the JavaScriptObject struct. - - * bindings/c/c_utility.cpp: - (KJS::Bindings::convertValueToNPVariant): - Always use the root object from the ExecState. - -2007-12-13 Steve Falkenburg - - Move source file generation into its own vcproj to fix build dependencies. - - Reviewed by Adam. - - * JavaScriptCore.vcproj/JavaScriptCore.sln: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreGenerated.make: Added. - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreGenerated.vcproj: Added. - * JavaScriptCore.vcproj/JavaScriptCoreSubmit.sln: - -2007-12-13 Alp Toker - - http://bugs.webkit.org/show_bug.cgi?id=16406 - [Gtk] JavaScriptCore needs -lpthread - - Build fix for Debian and any other platforms that don't implicitly - link to pthread. - - Link to pthread on non-Windows platforms until this dependency is - removed from JSC. - -2007-12-11 Geoffrey Garen - - Reviewed by Sam Weinig. - - Build fix: Note some variables that are used only for ASSERTs. - - * API/testapi.c: - (Base_finalize): - (globalObject_initialize): - (testInitializeFinalize): - -2007-12-11 Geoffrey Garen - - Reviewed by Darin Adler. - - Fixed: All JS tests crash on Windows. - - NDEBUG wasn't defined when compiling testkjs in release builds, so the - HashTable definition in HashTable.h included an extra data member. - - The solution was to add NDEBUG to the release testkjs configuration on - Windows and Mac. - - For giggles, I also added other missing #defines to testkjs on Windows. - - * Configurations/Base.xcconfig: - * Configurations/JavaScriptCore.xcconfig: - * JavaScriptCore.vcproj/testkjs/testkjs.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - * kjs/testkjs.cpp: - (main): - -2007-12-11 Geoffrey Garen - - Reviewed by Darin Adler. - - Removed bogus ASSERT. - - ASSERT should only be used when we know that a code path will not be - taken. This code path is taken often during the jsFunFuzz test. - - * pcre/pcre_exec.cpp: - (jsRegExpExecute): - -2007-12-11 Darin Adler - - * wtf/unicode/qt4/UnicodeQt4.h: Try to fix Qt build by adding U16_IS_SINGLE. - -2007-12-10 Darin Adler - - Reviewed by Sam Weinig. - - - fix http://bugs.webkit.org/show_bug.cgi?id=16379 - REGRESSION(r28525): Failures in http/tests/xmlhttprequest/response-encoding.html and - fast/dom/xmlhttprequest-html-response-encoding.html - and REGRESSION (306A4-ToT): Access violation in PCRE function - find_firstassertedchar - - Test: fast/js/regexp-find-first-asserted.html - - * pcre/pcre_compile.cpp: - (compileBracket): Take out unnecessary initialization of out parameters. - (branchFindFirstAssertedCharacter): Added. Broke out the half of the function that handles - a branch. - (bracketFindFirstAssertedCharacter): Renamed from find_firstassertedchar. Also removed the - options parameter -- the caller can handle the options. - (jsRegExpCompile): Changed call site to call the appropriate bracket or branch version of - the find_firstassertedchar function. Also put the REQ_IGNORE_CASE code here instead of - passing in the options. - -2007-12-10 Geoffrey Garen - - Reviewed by Sam Weinig. - - Split this: - - FunctionBodyNode - ^ - | - ProgramNode - - into this: - - ScopeNode - ^ ^ ^ - | | | - FunctionBodyNode ProgramNode EvalNode - - in preparation for specializing each class more while optimizing global - variable access. - - Also removed some cruft from the FunctionBodyNode interface to simplify - things. - - SunSpider says this patch is a .8% speedup, which seems reasonable, - since it eliminates a few branches and adds KJS_FAST_CALL in a few - places. - - Layout tests and JS tests pass. Also, this baby builds on Windows! (Qt - mileage may vary...) - -2007-12-10 Geoffrey Garen - - RS by Mark Rowe. - - Mac build fix: added some exported symbols, now that Parser::parse is - defined in the header. - - * JavaScriptCore.exp: - -2007-12-10 Sam Weinig - - Build fix. - - Template methods need to be in the header. - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * kjs/Parser.cpp: - * kjs/Parser.h: - (KJS::Parser::parse): - -2007-12-10 Geoffrey Garen - - Reviewed by Sam Weinig. - - Merged different implementations of Parser::parse into a single, - templatized implementation, in preparation for adding yet another - implementation for "eval" code. - - JS and layout tests pass. - -2007-12-10 Timothy Hatcher - - Reviewed by Mark Rowe - - Bundle versions on Tiger should be 4523.x not 523.x - - * Configurations/Version.xcconfig: Some Tiger versions of Xcode don't set MAC_OS_X_VERSION_MAJOR, - so assume Tiger and use a 4 for the SYSTEM_VERSION_PREFIX. - -2007-12-10 Mark Rowe - - Tiger build fix. - - * kjs/grammar.y: Use @1 and @0 in place of @$ where Tiger's bison chokes. - -2007-12-10 Darin Adler - - Reviewed by Mark Rowe. - - - fix http://bugs.webkit.org/show_bug.cgi?id=16375 - REGRESSION: Safari crashes on quit - - Probably a debug-only issue. - - * kjs/Parser.cpp: - (KJS::parser): Create the parser and never destroy it by using a pointer instead - of a global object. - -2007-12-09 Darin Adler - - Reviewed by Sam Weinig. - - - fix http://bugs.webkit.org/show_bug.cgi?id=16369 - REGRESSION (r28525): regular expression tests failing due to bad firstByte optimization - - * pcre/pcre_compile.cpp: Changed some names to use interCaps intead of under_scores. - (branchIsAnchored): Broke is_anchored into two separate functions; this one works on a - branch and the other on an anchor. The old function would only work on a bracket. - Also removed unneeded parameters; the anchored check does not require the bracket - map or the options any more because we have a reduced set of features. - (bracketIsAnchored): Ditto. - (branchNeedsLineStart): Broke canApplyFirstCharOptimization into two functions and gave - both a better name. This is the function that was returning the wrong value. The failure - was beacuse the old function would only work on a bracket. - (bracketNeedsLineStart): Ditto. - (jsRegExpCompile): Changed to call the appropriate branch or bracket flavor of the - functions based on whether we compiled an outer bracket. Also removed inaccurate comments - and unneeded parameters. - - - other small changes - - * pcre/pcre.h: Renumbered error codes, in a logical order. First, normal failure, then - the recursion limit, then running out of memory, and finally an unexpected internal error. - - * pcre/pcre_exec.cpp: Fixed indentation. - (jsRegExpExecute): Corrected an inaccurate comment. - -2007-12-09 Darin Adler - - Reviewed by Maciej. - - - fix http://bugs.webkit.org/show_bug.cgi?id=16370 - REGRESSION (r28540): source URL and line number no longer set for outer function/programs - - Test: fast/js/exception-linenums-in-html-1.html - Test: fast/js/exception-linenums-in-html-2.html - Test: fast/js/exception-linenums.html - - By the time the ProgramNode was constructed, the source URL was empty. - - * kjs/Parser.cpp: - (KJS::Parser::parseProgram): Added code to set and clear m_sourceURL, which is now - handled here instead of in the lexer; it needs to still be set when we create the - program node. Call setLoc to set the first and last line number. - (KJS::Parser::parseFunctionBody): Ditto, but for the body. - (KJS::Parser::parse): Removed the sourceURL argument. - - * kjs/Parser.h: Added sourceURL(), m_sourceURL, and m_lastLine. Added a lastLine - parameter to didFinishParsing, since the bison grammar knows the last line number - and we otherwise do not know it. Removed the sourceURL parameter from parse, since - that's now handled at a higher level. - - * kjs/grammar.y: Pass the last line number to didFinishParsing. - - * kjs/lexer.cpp: - (KJS::Lexer::setCode): Removed the sourceURL argument and the code to set m_sourceURL. - (KJS::Lexer::clear): Ditto. - * kjs/lexer.h: More of the same. - - * kjs/nodes.cpp: - (KJS::FunctionBodyNode::FunctionBodyNode): Get the source URL from the parser rather - than from the lexer. Removed unneeded call to setLoc, since the line numbers already - both default to -1. - -2007-12-08 Oliver Hunt - - Reviewed by Sam W. - - Split the ENABLE_SVG_EXPERIMENTAL_FEATURES flag into separate flags. - - Fixes Must disable SVG animation - Disable SVG filters on Mac to match Windows behavior - - Minor config changes. - - * Configurations/JavaScriptCore.xcconfig: - * JavaScriptCore.xcodeproj/project.pbxproj: - -2007-12-07 Sam Weinig - - Reviewed by Darin. - - - Rename isSafeScript to allowsAccessFrom. - - * bindings/NP_jsobject.cpp: - (_isSafeScript): - * kjs/JSGlobalObject.h: - (KJS::JSGlobalObject::allowsAccessFrom): Reverse caller/argument of allowsAccessFrom to match - the new call. - -2007-12-07 Geoffrey Garen - - Reviewed by Sam Weinig. - - Refactored variable access optimization: Removed the assumption that - the FunctionBodyNode holds the symbol table. - -2007-12-07 Geoffrey Garen - - Build fix: added #include. - - * kjs/nodes.cpp: - -2007-12-07 Geoffrey Garen - - Build fix: added #include. - - * kjs/interpreter.cpp: - -2007-12-07 Geoffrey Garen - - Build fix: added #include. - - * kjs/grammar.y: - -2007-12-07 Geoffrey Garen - - Build fix: added #include. - - * kjs/function_object.cpp: - -2007-12-07 Geoffrey Garen - - Reviewed by Sam Weinig. - - Fixed crash seen running layout tests. - - Reverted a change I made earlier today. Added a comment to try to - discourage myself from making this mistake a third time. - - * kjs/function.cpp: - (KJS::ActivationImp::mark): - * kjs/function.h: - (KJS::ActivationImp::ActivationImpData::ActivationImpData): - -2007-12-07 Geoffrey Garen - - Reviewed by Sam Weinig. - - Refactored parsing of global code: Removed the assumption that - ProgramNode inherits from FunctionBodyNode from the parser. - - * kjs/Parser.cpp: - (KJS::Parser::parseProgram): - (KJS::Parser::parseFunctionBody): - (KJS::Parser::parse): - * kjs/Parser.h: - (KJS::Parser::didFinishParsing): - * kjs/function.cpp: - * kjs/grammar.y: - * kjs/nodes.h: - -2007-12-07 Geoffrey Garen - - Build fix: added JSVariableObject.cpp to the .pri file. - - * JavaScriptCore.pri: - -2007-12-07 Geoffrey Garen - - Build fix: added #include. - - * kjs/function.cpp: - -2007-12-07 Steve Falkenburg - - Re-named our B&I flag from BUILDBOT to PRODUCTION. - - Reviewed by Sam Weinig. - - * JavaScriptCore.vcproj/JavaScriptCore.make: - * JavaScriptCore.vcproj/testkjs/testkjs.vcproj: - -2007-12-07 Geoffrey Garen - - Build fix: removed stray name qualification. - - * kjs/function.h: - (KJS::ActivationImp::ActivationImp): - -2007-12-07 Geoffrey Garen - - Build fix: moved functions with qualified names outside of class - declaration. - - * kjs/JSVariableObject.h: - (KJS::JSVariableObject::symbolTableGet): - (KJS::JSVariableObject::symbolTablePut): - -2007-12-07 Geoffrey Garen - - Reviewed by Sam Weinig. - - Next step in refactoring JSGlobalObject: Added JSVariableObject class, - and factored symbol-table-related code into it. (JSGlobalObject doesn't - use the symbol table code yet, though.) - - Layout and JS tests, and testapi, pass. SunSpider reports no regression. - -2007-12-07 Darin Adler - - Reviewed by Geoff. - - - fix http://bugs.webkit.org/show_bug.cgi?id=16185 - jsRegExpCompile should not add implicit non-capturing bracket - - While this does not make SunSpider faster, it will make many regular - expressions a bit faster. - - * pcre/pcre_compile.cpp: Moved CompileData struct in here from the - header since it's private to this file. - (compile_branch): Updated for function name change. - (compile_bracket): Renamed from compile_regex, since, for one thing, - this does not compile an entire regular expression. - (calculateCompiledPatternLengthAndFlags): Removed unused item_count - local variable. Renamed CompileData to cd instead of compile_block - to be consistent with other functions. Added code to set the - needOuterBracket flag if there's at least one "|" at the outer level. - (jsRegExpCompile): Renamed CompileData to cd instead of compile_block - to be consistent with other functions. Removed unneeded "size" field - from the compiled regular expression. If no outer bracket is needed, - then use compile_branch to compile the regular expression. - - * pcre/pcre_internal.h: Removed the CompileData struct, which is now - private to pcre_compile.cpp. Removed the size member from JSRegExp. - -2007-12-06 Kevin Ollivier - - MSVC7 build fix due to a compiler bug with placement new and/or - templates and casting. - - Reviewed by Darin Adler. - - * wtf/Vector.h: - (WTF::::append): - -2007-12-06 Darin Adler - - Reviewed by Eric Seidel. - - - fix http://bugs.webkit.org/show_bug.cgi?id=16321 - new RegExp("[\u0097]{4,6}", "gmy") crashes in DEBUG builds - - - Test: fast/js/regexp-oveflow.html - - * pcre/pcre_compile.cpp: - (calculateCompiledPatternLengthAndFlags): In the case where a single character - character class is optimized to not use a character class at all, the preflight - code was not setting the lastitemlength variable. - -2007-12-05 Mark Rowe - - Qt Windows build fix. Include the time-related headers in the correct place. - - * kjs/JSGlobalObject.cpp: - * kjs/interpreter.cpp: - -2007-12-05 Darin Adler - - Not reviewed; just undoing a previous commit. - - - remove earlier incorrect fix for http://bugs.webkit.org/show_bug.cgi?id=16220 - Crash opening www.news.com (CNet) - - The real bug was the backwards ?: in the compile function, which Geoff just - fixed. Rolling out the incorrect earlier fix. - - * pcre/pcre_compile.cpp: (calculateCompiledPatternLengthAndFlags): Take out - the unneeded preflight change. The regression test proves this is still working - fine, so the bug remains fixed. - -2007-12-01 Mark Rowe - - Build fix. Include headers before trying to use the things that they declare. - - * kjs/JSImmediate.cpp: - * kjs/nodes.cpp: - * kjs/object.cpp: - * kjs/object_object.cpp: - * kjs/regexp_object.cpp: - * kjs/string_object.cpp: - -2007-12-05 Geoffrey Garen - - Build fix: added some #includes. - - * kjs/JSImmediate.cpp: - -2007-12-05 Geoffrey Garen - - Build fix: added some #includes. - - * kjs/JSGlobalObject.cpp: - * kjs/JSImmediate.cpp: - -2007-12-05 Geoffrey Garen - - Build fix: Fixed #include spelling. - - * kjs/debugger.cpp: - -2007-12-05 Geoffrey Garen - - Build fix: added #include. - - * kjs/debugger.cpp: - -2007-12-05 Geoffrey Garen - - Build fix: added a forward declaration. - - * kjs/debugger.h: - -2007-12-05 Geoffrey Garen - - Build fix: added an #include. - - * kjs/error_object.cpp: - -2007-12-05 Geoffrey Garen - - Build fix: added an #include. - - * kjs/bool_object.cpp: - -2007-12-05 Geoffrey Garen - - Reviewed by Darin Adler. - - Third step in refactoring JSGlobalObject: Moved data members and - functions accessing data members from Interpreter to JSGlobalObject. - Changed Interpreter member functions to static functions. - - This resolves a bug in global object bootstrapping, where the global - ExecState could be used when uninitialized. - - This is a big change, but it's mostly code motion and renaming. - - Layout and JS tests, and testjsglue and testapi, pass. SunSpider reports - a .7% regression, but Shark sees no difference related to this patch, - and SunSpider reported a .7% speedup from an earlier step in this - refactoring, so I think it's fair to call that a wash. - -2007-12-05 Geoffrey Garen - - Reviewed by Darin Adler. (Or vice versa.) - - Fixed ASSERT during run-javascriptcore-tests. (Darin just added the - ASSERT, but the bug wasn't new.) - - * pcre/pcre_compile.cpp: - (compile_branch): The ?: operator here was backwards, causing us to - execute the loop too many times, adding stray KET opcodes to the - compiled regular expression. - -2007-12-05 Kevin McCullough - - Reviewed by Geoff. - - - Wait until local variable data is fully constructed before notifying the debugger of entering - or leaving a call frame. - - * kjs/function.cpp: - (KJS::FunctionImp::callAsFunction): - * kjs/nodes.cpp: - (KJS::FunctionBodyNode::execute): - -2007-12-05 Mark Rowe - - Reviewed by Oliver. - - Build fix for GCC 4.2. Cast via a union to avoid strict-aliasing issues. - - * wtf/FastMalloc.cpp: - (WTF::): - (WTF::getPageHeap): - -2007-12-05 Mark Rowe - - Reviewed by Darin. - - Fix testkjs in 64-bit. - - When built for 64-bit the TCMalloc spin lock uses pthread mutexes rather than a custom spin lock - implemented in assembly. If we fail to initialize the pthread mutex, attempts to lock or unlock - it will fail and trigger a call to abort. - - * wtf/FastMalloc.cpp: Initialize the spin lock so that we can later lock and unlock it. - * wtf/TCSpinLock.h: Add an Init method to the optimised spin lock. - -2007-12-04 Oliver Hunt - - Fix gtk build. - - * wtf/TCSystemAlloc.cpp: - -2007-12-03 Oliver Hunt - - Reviewed by Mark Rowe and Geoff Garen. - - Merge TCMalloc r38 - - It also result in a performance progression between 0.5% and - 0.9% depending on the test, however most if not all of this - gain will be consumed by the overhead involved in the later - change to release memory to the system. - - * JavaScriptCore.vcproj/WTF/WTF.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - * wtf/FastMalloc.cpp: - (WTF::KernelSupportsTLS): - (WTF::CheckIfKernelSupportsTLS): - (WTF::): - (WTF::ClassIndex): - (WTF::SLL_Next): - (WTF::SLL_SetNext): - (WTF::SLL_Push): - (WTF::SLL_Pop): - (WTF::SLL_PopRange): - (WTF::SLL_PushRange): - (WTF::SLL_Size): - (WTF::SizeClass): - (WTF::ByteSizeForClass): - (WTF::NumMoveSize): - (WTF::InitSizeClasses): - (WTF::AllocationSize): - (WTF::TCMalloc_PageHeap::GetSizeClassIfCached): - (WTF::TCMalloc_PageHeap::CacheSizeClass): - (WTF::TCMalloc_PageHeap::init): - (WTF::TCMalloc_PageHeap::New): - (WTF::TCMalloc_PageHeap::AllocLarge): - (WTF::TCMalloc_PageHeap::Carve): - (WTF::TCMalloc_PageHeap::Delete): - (WTF::TCMalloc_PageHeap::IncrementalScavenge): - (WTF::PagesToMB): - (WTF::TCMalloc_PageHeap::Dump): - (WTF::TCMalloc_PageHeap::GrowHeap): - (WTF::TCMalloc_PageHeap::Check): - (WTF::ReleaseFreeList): - (WTF::TCMalloc_PageHeap::ReleaseFreePages): - (WTF::TCMalloc_ThreadCache_FreeList::Push): - (WTF::TCMalloc_ThreadCache_FreeList::PushRange): - (WTF::TCMalloc_ThreadCache_FreeList::PopRange): - (WTF::TCMalloc_ThreadCache_FreeList::Pop): - (WTF::TCMalloc_Central_FreeList::length): - (WTF::TCMalloc_Central_FreeList::tc_length): - (WTF::TCMalloc_Central_FreeList::Init): - (WTF::TCMalloc_Central_FreeList::ReleaseListToSpans): - (WTF::TCMalloc_Central_FreeList::EvictRandomSizeClass): - (WTF::TCMalloc_Central_FreeList::MakeCacheSpace): - (WTF::TCMalloc_Central_FreeList::ShrinkCache): - (WTF::TCMalloc_Central_FreeList::InsertRange): - (WTF::TCMalloc_Central_FreeList::RemoveRange): - (WTF::TCMalloc_Central_FreeList::FetchFromSpansSafe): - (WTF::TCMalloc_Central_FreeList::Populate): - (WTF::TCMalloc_ThreadCache::Init): - (WTF::TCMalloc_ThreadCache::Cleanup): - (WTF::TCMalloc_ThreadCache::Allocate): - (WTF::TCMalloc_ThreadCache::Deallocate): - (WTF::TCMalloc_ThreadCache::FetchFromCentralCache): - (WTF::TCMalloc_ThreadCache::ReleaseToCentralCache): - (WTF::TCMalloc_ThreadCache::Scavenge): - (WTF::TCMalloc_ThreadCache::PickNextSample): - (WTF::TCMalloc_ThreadCache::NewHeap): - (WTF::TCMalloc_ThreadCache::GetThreadHeap): - (WTF::TCMalloc_ThreadCache::GetCache): - (WTF::TCMalloc_ThreadCache::GetCacheIfPresent): - (WTF::TCMalloc_ThreadCache::InitTSD): - (WTF::TCMalloc_ThreadCache::CreateCacheIfNecessary): - (WTF::TCMallocStats::ExtractStats): - (WTF::TCMallocStats::DumpStats): - (WTF::TCMallocStats::DumpStackTraces): - (WTF::TCMallocStats::TCMallocImplementation::MarkThreadIdle): - (WTF::TCMallocStats::TCMallocImplementation::ReleaseFreeMemory): - (WTF::TCMallocStats::TCMallocGuard::TCMallocGuard): - (WTF::TCMallocStats::TCMallocGuard::~TCMallocGuard): - (WTF::TCMallocStats::DoSampledAllocation): - (WTF::TCMallocStats::CheckCachedSizeClass): - (WTF::TCMallocStats::CheckedMallocResult): - (WTF::TCMallocStats::SpanToMallocResult): - (WTF::TCMallocStats::do_malloc): - (WTF::TCMallocStats::do_free): - (WTF::TCMallocStats::do_memalign): - (WTF::TCMallocStats::do_malloc_stats): - (WTF::TCMallocStats::do_mallopt): - (WTF::TCMallocStats::do_mallinfo): - (WTF::TCMallocStats::realloc): - (WTF::TCMallocStats::cpp_alloc): - (WTF::TCMallocStats::operator new): - (WTF::TCMallocStats::): - (WTF::TCMallocStats::operator new[]): - (WTF::TCMallocStats::malloc_stats): - (WTF::TCMallocStats::mallopt): - (WTF::TCMallocStats::mallinfo): - * wtf/TCPackedCache.h: Added. - (PackedCache::PackedCache): - (PackedCache::Put): - (PackedCache::Has): - (PackedCache::GetOrDefault): - (PackedCache::Clear): - (PackedCache::EntryToValue): - (PackedCache::EntryToUpper): - (PackedCache::KeyToUpper): - (PackedCache::UpperToPartialKey): - (PackedCache::Hash): - (PackedCache::KeyMatch): - * wtf/TCPageMap.h: - (TCMalloc_PageMap2::PreallocateMoreMemory): - * wtf/TCSystemAlloc.cpp: - (TCMalloc_SystemRelease): - * wtf/TCSystemAlloc.h: - -2007-12-04 Anders Carlsson - - Reviewed by Sam. - - Make isSafeScript const. - - * kjs/JSGlobalObject.h: - (KJS::JSGlobalObject::isSafeScript): - -2007-12-04 Darin Adler - - Reviewed by Geoff. - - - fix first part of http://bugs.webkit.org/show_bug.cgi?id=16220 - Crash opening www.news.com (CNet) - - Test: fast/js/regexp-overflow.html - - * pcre/pcre_compile.cpp: - (calculateCompiledPatternLengthAndFlags): Add room for the additional BRA/KET that - was generated in the compile code but not taken into account here. - -2007-12-03 Darin Adler - - Reviewed by Geoff. - - - fix http://bugs.webkit.org/show_bug.cgi?id=15618 - REGRESSION: Stack overflow/crash in KJS::equal (15618) - - Test: fast/js/recursion-limit-equal.html - - * kjs/operations.cpp: (KJS::equal): Check the exception from toPrimitive. - -2007-12-03 Dan Bernstein - - - fix a copy-and-paste-o - - * bindings/npruntime.cpp: - (_NPN_GetIntIdentifier): - -2007-12-03 Dan Bernstein - - Reviewed by Darin Adler. - - - fix an ASSERT when getIntIdentifier is called with 0 or -1 - - * bindings/npruntime.cpp: - (_NPN_GetIntIdentifier): We cannot use the hashmap for 0 and -1 since - they are the empty value and the deleted value. Instead, keep the - identifiers for those two integers in a static array. - -2007-12-02 Darin Adler - - Reviewed by Mitz. - - - fix http://bugs.webkit.org/show_bug.cgi?id=15848 - REGRESSION: Assertion failure viewing comments page on digg.com - - Test: fast/js/sparse-array.html - - * kjs/array_instance.cpp: - (KJS::ArrayInstance::inlineGetOwnPropertySlot): Check sparse array cutoff before looking - in hash map. Can't avoid the branch because we can't look for 0 in the hash. - (KJS::ArrayInstance::deleteProperty): Ditto. - -2007-12-02 Geoffrey Garen - - Build fix: added an #include. - - * kjs/collector.cpp: - -2007-12-02 Geoffrey Garen - - Reviewed by Eric Seidel. - - Second step in refactoring JSGlobalObject: moved virtual functions from - Interpreter to JSGlobalObject. - - Layout and JS tests pass. SunSpider reports a .7% speedup -- don't - believe his lies. - -2007-12-01 Alp Toker - - Reviewed by Adam Roben. - - http://bugs.webkit.org/show_bug.cgi?id=16228 - kJSClassDefinitionEmpty is not exported with JS_EXPORT - - Add JS_EXPORT to kJSClassDefinitionEmpty. - - Make the gcc compiler check take precedence over the WIN32||_WIN32 - check to ensure that symbols are exported on Windows when using gcc. - - Add a TODO referencing the bug about JS_EXPORT in the Win build - (http://bugs.webkit.org/show_bug.cgi?id=16227) - - Don't define JS_EXPORT as 'extern' when the compiler is unknown since - it would result in the incorrect expansion: - - extern extern const JSClassDefinition kJSClassDefinitionEmpty; - - (This was something we inherited from CFBase.h that doesn't make sense - for JSBase.h) - - * API/JSBase.h: - * API/JSObjectRef.h: - -2007-11-30 Geoffrey Garen - - Reviewed by Beth Dakin. - - Reversed the ownership relationship between Interpreter and JSGlobalObject. - Now, the JSGlobalObject owns the Interpreter, and top-level objects - that need the two to persist just protect the JSGlobalObject from GC. - - Global object bootstrapping looks a little odd right now, but it will - make much more sense soon, after further rounds of refactoring. - - * bindings/runtime_root.h: Made this class inherit from RefCounted, - to avoid code duplication. - - * kjs/collector.cpp: - (KJS::Collector::collect): No need to give special GC treatment to - Interpreters, since we mark their global objects, which mark them. - - * kjs/interpreter.cpp: - (KJS::Interpreter::mark): No need to mark our global object, since it - marks us. - * kjs/interpreter.h: Don't inherit from RefCounted -- JSGlobalObject - owns us directly. - - * kjs/testkjs.cpp: Modified to follow the new rules. - (createGlobalObject): - (runWithScripts): - -2007-11-30 Brent Fulgham - - Reviewed by Eric. - - * ChangeLog: - * pcre/pcre_compile.cpp: - (compile_branch): - -2007-11-30 Eric Seidel - - No review, build fix only. - - Fix uninitialized var warnings in release build. - - * JavaScriptCore.xcodeproj/project.pbxproj: - * pcre/pcre_compile.cpp: - (compile_regex): - -2007-11-30 Darin Adler - - Reviewed by Adam Roben. - - - fix http://bugs.webkit.org/show_bug.cgi?id=16207 - JavaScript regular expressions should match UTF-16 code units rather than characters - - SunSpider says this is 5.5% faster on the regexp test, 0.4% faste overall. - - Test: fast/js/regexp-non-bmp.html - - Renamed ANY_CHAR to NOT_NEWLINE to more-accurately reflect its meaning. - - * pcre/pcre_compile.cpp: - (compile_branch): Removed calls to the UTF-16 character accessor functions, replacing - them with simple pointer dereferences in some cases, and no code at all in others. - (calculateCompiledPatternLengthAndFlags): Ditto. - - * pcre/pcre_exec.cpp: - (match): Fixed indentation of some case labels (including all the BEGIN_OPCODE). - Removed calls to the UTF-16 character accessor functions, replacing them with simple - pointer dereferences in some cases, and no code at all in others. Also removed some - explicit UTF-16 support code in a few cases. Removed the unneeded "UTF-8" code path - in the ANY_CHAR repeat code, and in another case, eliminated the code to check against - end_subject in because it is already done outside the loop. - (jsRegExpExecute): - - * pcre/pcre_internal.h: Removed all the UTF-16 helper functions. - -2007-11-30 Eric Seidel - - Reviewed by darin. - - PCRE crashes under GuardMalloc - http://bugs.webkit.org/show_bug.cgi?id=16127 - check against patternEnd to make sure we don't walk off the end of the string - - * pcre/pcre_compile.cpp: - (compile_branch): - (calculateCompiledPatternLengthAndFlags): - -2007-11-30 Eric Seidel - - Reviewed by Maciej. - - Fix layout test regressions caused by r28186 - http://bugs.webkit.org/show_bug.cgi?id=16195 - change first_byte and req_byte back to shorts instead of chars - (I think PCRE stuffs information in the high bits) - - * pcre/pcre_internal.h: - -2007-11-29 Oliver Hunt - - Reviewed by Maciej and Darin. - - Make the JS collector work with multiple threads - - Under heavy contention it was possible the GC to suspend other - threads inside the pthread spinlock, which could lead to the GC - thread blocking on the pthread spinlock itself. - - We now determine and store each thread's stack base when it is - registered, thus removing the need for any calls to pthread_get_stackaddr_np - that needed the pthread spinlock. - - * kjs/collector.cpp: - (KJS::Collector::Thread::Thread): - (KJS::Collector::registerThread): - (KJS::Collector::markOtherThreadConservatively): - -2007-11-29 Adam Roben - - Windows build fix - - Removed some unreachable code (ironically, the code was some - ASSERT_NOT_REACHED()s). - - * pcre/pcre_compile.cpp: - (compile_branch): - * pcre/pcre_exec.cpp: - (match): - -2007-11-29 Eric Seidel - - Reviewed by Mark Rowe. - - Fix for --guard crash of fast/js/regexp-charclass-crash introduced by r28151. - - * pcre/pcre_compile.cpp: - (is_anchored): - -2007-11-28 Mark Rowe - - Gtk build fix. Rubber-stamped by Eric. - - * pcre/pcre_exec.cpp: - (match): Add braces around the body of the case statement to prevent - wanings about jumps across the initialization of a variable. - -2007-11-29 Eric Seidel - - Reviewed by Mark Rowe. - - Attempt to fix non-mac builds after PCRE cleanup. - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCoreSources.bkl: - * pcre/pcre.pri: - -2007-11-28 Eric Seidel - - Reviewed by Maciej. - - Centralize code for subjectPtr adjustments using inlines, only ever check for a single - trailing surrogate (as UTF16 only allows one), possibly fix PCRE bugs involving char - classes and garbled UTF16 strings. - - * pcre/pcre_exec.cpp: - (match): - (jsRegExpExecute): - * pcre/pcre_internal.h: - (getPreviousChar): - (movePtrToPreviousChar): - (movePtrToNextChar): - (movePtrToStartOfCurrentChar): - -2007-11-28 Eric Seidel - - Reviewed by Maciej. - - change getChar* functions to return result and push 'c' into local scopes for clarity - - * pcre/pcre_compile.cpp: - (compile_branch): - (calculateCompiledPatternLengthAndFlags): - * pcre/pcre_exec.cpp: - (match): - * pcre/pcre_internal.h: - (getChar): - (getCharAndAdvance): - (getCharAndLength): - (getCharAndAdvanceIfSurrogate): - -2007-11-28 Eric Seidel - - Reviewed by Sam. - - Comment cleanup - - * pcre/pcre_exec.cpp: - (match): - -2007-11-26 Eric Seidel - - Reviewed by Sam. - - Further cleanups to calculateCompiledPatternLengthAndFlags - - * pcre/pcre_compile.cpp: - (calculateCompiledPatternLengthAndFlags): - * pcre/pcre_internal.h: - -2007-11-26 Eric Seidel - - Reviewed by Sam. - - Give consistent naming to the RegExp options/compile flags - - * pcre/pcre_compile.cpp: - (compile_branch): - (is_anchored): - (find_firstassertedchar): - (printCompiledRegExp): - (jsRegExpCompile): - * pcre/pcre_exec.cpp: - (jsRegExpExecute): - * pcre/pcre_internal.h: - -2007-11-26 Eric Seidel - - Reviewed by Sam. - - Pull first_byte and req_byte optimizations out into separate static funtions, SunSpider reported this as a win. - - * pcre/pcre_exec.cpp: - (tryFirstByteOptimization): - (tryRequiredByteOptimization): - (jsRegExpExecute): - * pcre/pcre_internal.h: - -2007-11-26 Eric Seidel - - Reviewed by Maciej. - - give PCRE_MULTILINE a better name: OptionMatchAcrossMultipleLines - - * pcre/pcre_compile.cpp: - (compile_branch): - (is_anchored): - (printCompiledRegExp): - (jsRegExpCompile): - * pcre/pcre_exec.cpp: - (jsRegExpExecute): - * pcre/pcre_internal.h: - -2007-11-26 Eric Seidel - - Reviewed by Oliver. - - Deprecate jsRegExpExecute's offset-vector fallback code - - * pcre/pcre_exec.cpp: - (jsRegExpExecute): - -2007-11-26 Eric Seidel - - Reviewed by Maciej. - - Make cur_is_word and prev_is_word locals, and change OP_ANY to OP_ANY_CHAR for clarity - - * pcre/pcre_compile.cpp: - (find_fixedlength): - (compile_branch): - (canApplyFirstCharOptimization): - * pcre/pcre_exec.cpp: - (match): - * pcre/pcre_internal.h: - -2007-11-26 Eric Seidel - - Reviewed by Mitz & Maciej. - - Change _NC operators to use _IGNORING_CASE for clarity - - * pcre/pcre_compile.cpp: - (find_fixedlength): - (compile_branch): - (find_firstassertedchar): - * pcre/pcre_exec.cpp: - (match): - * pcre/pcre_internal.h: - -2007-11-26 Eric Seidel - - Reviewed by Mitz. - - Remove branch from return - - * pcre/pcre_compile.cpp: - (compile_branch): - * pcre/pcre_exec.cpp: - (match): - -2007-11-26 Eric Seidel - - Reviewed by Maciej. - - Add repeatInformationFromInstructionOffset inline - - * pcre/pcre_exec.cpp: - (repeatInformationFromInstructionOffset): - (match): - -2007-11-26 Eric Seidel - - Reviewed by Maciej. - - Remove no longer used error code JSRegExpErrorMatchLimit - - * kjs/regexp.cpp: - (KJS::RegExp::match): - * pcre/pcre.h: - * pcre/pcre_internal.h: - -2007-11-26 Eric Seidel - - Reviewed by Sam. - - Make i locally scoped for better code clarity - - * pcre/pcre_exec.cpp: - (match): - -2007-11-26 Eric Seidel - - Reviewed by Maciej. - - Give subjectPtr and instructionPtr sane names, reduce size of MatchFrame for a 0.2% speedup. - - * pcre/pcre_compile.cpp: - (compile_branch): - (calculateCompiledPatternLengthAndFlags): - * pcre/pcre_exec.cpp: - (match_ref): - (MatchStack::pushNewFrame): - (getUTF8CharAndIncrementLength): - (match): - * pcre/pcre_internal.h: - (getChar): - (getCharAndAdvance): - (getCharAndLength): - (getCharAndAdvanceIfSurrogate): - * pcre/pcre_xclass.cpp: - (getUTF8CharAndAdvancePointer): - -2007-11-26 Eric Seidel - - Reviewed by Sam. - - Small speedup (0.7%) by simplifying canUseStackBufferForNextFrame() check - - * pcre/pcre_exec.cpp: - (MatchStack::MatchStack): - (MatchStack::popCurrentFrame): - -2007-11-25 Eric Seidel - - Reviewed by Sam. - - Lower MATCH_LIMIT_RECURSION to more sane levels to prevent hangs on run-javascriptcore-tests - - * pcre/pcre_internal.h: - -2007-11-25 Eric Seidel - - Reviewed by Maciej. - - Remove match_is_group variable for another 5% speedup - - * pcre/pcre_compile.cpp: - * pcre/pcre_exec.cpp: - (startNewGroup): - (match): - -2007-11-28 Eric Seidel - - Reviewed by Sam. - - Abstract frame variables into locals and args - - * pcre/pcre_compile.cpp: - (compile_branch): - * pcre/pcre_exec.cpp: - (match): - * pcre/pcre_internal.h: - -2007-11-28 Eric Seidel - - Reviewed by Sam. - - Section off MatchData arguments into args struct - - * pcre/pcre_exec.cpp: - (MatchStack::pushNewFrame): - (match): - -2007-11-24 Eric Seidel - - Reviewed by Sam. - - Remove redundant eptrblock struct - - * pcre/pcre_exec.cpp: - (MatchStack::pushNewFrame): - (match): - -2007-11-24 Eric Seidel - - Reviewed by Maciej. - - Remove redundant match_call_count and move recursion check out of super-hot code path - SunSpider says this is at least an 8% speedup for regexp. - - * pcre/pcre_exec.cpp: - (MatchStack::MatchStack): - (MatchStack::pushNewFrame): - (MatchStack::popCurrentFrame): - (MatchStack::popAllFrames): - (match): - (jsRegExpExecute): - * pcre/pcre_internal.h: - -2007-11-24 Eric Seidel - - Reviewed by Sam. - - Get rid of GETCHAR* macros, replacing them with better named inlines - - * pcre/pcre_compile.cpp: - (compile_branch): - (calculateCompiledPatternLengthAndFlags): - * pcre/pcre_exec.cpp: - (match): - * pcre/pcre_internal.h: - (getCharAndAdvance): - (getCharAndLength): - (getCharAndAdvanceIfSurrogate): - -2007-11-24 Eric Seidel - - Reviewed by Sam. - - Further cleanup GET/PUT inlines - - * pcre/pcre_internal.h: - (putOpcodeValueAtOffset): - (getOpcodeValueAtOffset): - (putOpcodeValueAtOffsetAndAdvance): - (put2ByteOpcodeValueAtOffset): - (get2ByteOpcodeValueAtOffset): - (put2ByteOpcodeValueAtOffsetAndAdvance): - -2007-11-24 Eric Seidel - - Reviewed by Sam. - - Give GET, PUT better names, and add (poor) moveOpcodePtrPastAnyAlternateBranches - - * pcre/pcre_compile.cpp: - (firstSignificantOpCodeSkippingAssertions): - (find_fixedlength): - (complete_callout): - (compile_branch): - (compile_regex): - (is_anchored): - (canApplyFirstCharOptimization): - (find_firstassertedchar): - * pcre/pcre_exec.cpp: - (match): - * pcre/pcre_internal.h: - (putOpcodeValueAtOffset): - (getOpcodeValueAtOffset): - (putOpcodeValueAtOffsetAndAdvance): - (put2ByteOpcodeValueAtOffset): - (get2ByteOpcodeValueAtOffset): - (moveOpcodePtrPastAnyAlternateBranches): - * pcre/pcre_ucp_searchfuncs.cpp: - (_pcre_ucp_othercase): - -2007-11-24 Eric Seidel - - Reviewed by Sam. - - Add inlines for toLowerCase, isWordChar, isSpaceChar for further regexp speedup - - * pcre/pcre_compile.cpp: - (compile_branch): - (jsRegExpCompile): - * pcre/pcre_exec.cpp: - (match): - (jsRegExpExecute): - * pcre/pcre_internal.h: - (toLowerCase): - (flipCase): - (classBitmapForChar): - (charTypeForChar): - (isWordChar): - (isSpaceChar): - (CompileData::CompileData): - * pcre/pcre_xclass.cpp: - (_pcre_xclass): - -2007-11-24 Eric Seidel - - Reviewed by Sam. - - cleanup _pcre_ucp_othercase - - * pcre/pcre_ucp_searchfuncs.cpp: - (_pcre_ucp_othercase): - -2007-11-24 Eric Seidel - - Reviewed by Maciej. - - Use better variable names for case ignoring options - - * pcre/pcre_compile.cpp: - (compile_branch): - (find_firstassertedchar): - (printCompiledRegExp): - (jsRegExpCompile): - * pcre/pcre_exec.cpp: - (match_ref): - (match): - (jsRegExpExecute): - * pcre/pcre_internal.h: - -2007-11-24 Eric Seidel - - Reviewed by Sam. - - split first_significant_code into two simpler functions - - * pcre/pcre_compile.cpp: - (firstSignificantOpCode): - (firstSignificantOpCodeSkippingAssertions): - (is_anchored): - (canApplyFirstCharOptimization): - (find_firstassertedchar): - -2007-11-24 Eric Seidel - - Reviewed by Sam. - - clean up is_counted_repeat - - * pcre/pcre_compile.cpp: - (is_counted_repeat): - -2007-11-24 Eric Seidel - - Reviewed by Sam. - - clean up check_escape - - * pcre/pcre_compile.cpp: - (check_escape): - -2007-11-24 Eric Seidel - - Reviewed by Sam. - - Reformat find_fixedlength - - * pcre/pcre_compile.cpp: - (find_fixedlength): - -2007-11-24 Eric Seidel - - Reviewed by Sam. - - reformat is_anchored - - * pcre/pcre_compile.cpp: - (is_anchored): - -2007-11-24 Eric Seidel - - Reviewed by Maciej. - - Remove unused function could_be_empty_branch - - * pcre/pcre_compile.cpp: - (first_significant_code): - (find_fixedlength): - (compile_branch): - (canApplyFirstCharOptimization): - -2007-11-24 Eric Seidel - - Reviewed by Sam. - - Pass around MatchData objects by reference - - * pcre/pcre_exec.cpp: - (pchars): - (match_ref): - (match): - (jsRegExpExecute): - -2007-11-24 Eric Seidel - - Reviewed by Sam. - - give PCRE_STARTLINE a better name and rename match_data to MatchData - - * pcre/pcre_compile.cpp: - (compile_branch): - (canApplyFirstCharOptimization): - (find_firstassertedchar): - (printCompiledRegExp): - (jsRegExpCompile): - * pcre/pcre_exec.cpp: - (pchars): - (jsRegExpExecute): - * pcre/pcre_internal.h: - -2007-11-24 Eric Seidel - - Reviewed by Sam. - - Clean up find_firstassertedchar - - * pcre/pcre_compile.cpp: - (get_othercase_range): - (find_firstassertedchar): - (calculateCompiledPatternLengthAndFlags): - -2007-11-24 Eric Seidel - - Reviewed by Tim Hatcher. - - Pass around CompileData& instead of CompileData* - - * pcre/pcre_compile.cpp: - (compile_branch): - (jsRegExpCompile): - -2007-11-24 Eric Seidel - - Reviewed by Sam. - - Clean up compile_branch, move _pcre_ord2utf8, and rename CompileData - - * JavaScriptCore.xcodeproj/project.pbxproj: - * pcre/pcre_compile.cpp: - (_pcre_ord2utf8): - (calculateCompiledPatternLengthAndFlags): - (jsRegExpCompile): - * pcre/pcre_internal.h: - * pcre/pcre_ord2utf8.cpp: Removed. - -2007-11-24 Eric Seidel - - Reviewed by Sam. - - removing more macros - - * pcre/pcre_compile.cpp: - (could_be_empty_branch): - (compile_branch): - (calculateCompiledPatternLengthAndFlags): - * pcre/pcre_exec.cpp: - (match): - (jsRegExpExecute): - * pcre/pcre_internal.h: - * pcre/pcre_xclass.cpp: - -2007-11-24 Eric Seidel - - Reviewed by Maciej. - - clean up formating in compile_branch - - * pcre/pcre_compile.cpp: - (compile_branch): - -2007-11-24 Eric Seidel - - Reviewed by Sam. - - Fix spacing for read_repeat_counts - - * pcre/pcre_compile.cpp: - (read_repeat_counts): - -2007-11-24 Eric Seidel - - Reviewed by Sam. - - Get rid of PCRE custom char types - - * pcre/pcre_compile.cpp: - (check_escape): - (complete_callout): - (compile_branch): - (compile_regex): - (calculateCompiledPatternLengthAndFlags): - (jsRegExpCompile): - * pcre/pcre_exec.cpp: - (match_ref): - (match): - (jsRegExpExecute): - * pcre/pcre_internal.h: - -2007-11-24 Eric Seidel - - Reviewed by Sam. - - reformat get_othercase_range - - * pcre/pcre_compile.cpp: - (get_othercase_range): - -2007-11-24 Eric Seidel - - Reviewed by Maciej. - - Remove register keyword and more cleanup - - * pcre/pcre_compile.cpp: - (find_fixedlength): - (compile_branch): - (is_anchored): - (is_startline): - (find_firstassertedchar): - (calculateCompiledPatternLengthAndFlags): - (jsRegExpCompile): - * pcre/pcre_exec.cpp: - (MatchStack::canUseStackBufferForNextFrame): - (MatchStack::allocateNextFrame): - (MatchStack::pushNewFrame): - (MatchStack::frameIsStackAllocated): - (MatchStack::popCurrentFrame): - (MatchStack::unrollAnyHeapAllocatedFrames): - (getUTF8CharAndIncrementLength): - (match): - (jsRegExpExecute): - * pcre/pcre_internal.h: - (PUT2INC): - (isLeadingSurrogate): - (isTrailingSurrogate): - (decodeSurrogatePair): - (getChar): - * pcre/pcre_ord2utf8.cpp: - (_pcre_ord2utf8): - * pcre/pcre_xclass.cpp: - (getUTF8CharAndAdvancePointer): - (_pcre_xclass): - -2007-11-24 Eric Seidel - - Reviewed by Maciej. - - Clean up jsRegExpExecute - - * pcre/pcre_compile.cpp: - (returnError): - (jsRegExpCompile): - * pcre/pcre_exec.cpp: - (jsRegExpExecute): - * pcre/pcre_internal.h: - -2007-11-29 Oliver Hunt - - Reviewed by Geoff. - - Merging updated system alloc and spinlock code from r38 of TCMalloc. - - This is needed as a precursor to the merge of TCMalloc proper. - - * wtf/FastMalloc.cpp: - (WTF::TCMalloc_PageHeap::GrowHeap): - * wtf/TCSpinLock.h: - (TCMalloc_SpinLock::TCMalloc_SpinLock): - (TCMalloc_SpinLock::): - (TCMalloc_SpinLock::Lock): - (TCMalloc_SpinLock::Unlock): - (TCMalloc_SpinLock::IsHeld): - * wtf/TCSystemAlloc.cpp: - (TrySbrk): - (TryMmap): - (TryVirtualAlloc): - (TryDevMem): - (TCMalloc_SystemAlloc): - * wtf/TCSystemAlloc.h: - -2007-11-28 Brady Eidson - - Reviewed by Geoff - - Add copyKeysToVector utility, mirroring copyValuesToVector - Also change the copyValuesToVector implementation to be a little more attractive - - * wtf/HashMap.h: - (WTF::copyKeysToVector): - (WTF::copyValuesToVector): - -2007-11-27 Alp Toker - - Reviewed by Mark Rowe. - - Add a list of public JavaScriptCore headers for installation. - - This follows the convention used for the Qt and GTK+ header lists. - - * headers.pri: Added. - -2007-11-27 Alp Toker - - Prospective MSVC build fix. - - Roll back dllexport/dllimport support for now. - - * API/JSBase.h: - -2007-11-27 Alp Toker - - Reviewed by Maciej. - - http://bugs.webkit.org/show_bug.cgi?id=15569 - [gtk] GTK JavaScriptCore needs to export symbols for JSC API and WTF - - Introduce JS_EXPORT to mark symbols to be exported as public API. - - Export all public symbols in the JavaScriptCore C API. - - This matches conventions for exporting symbols set by the CF and CG - frameworks. - - * API/JSBase.h: - * API/JSContextRef.h: - * API/JSObjectRef.h: - * API/JSStringRef.h: - * API/JSStringRefBSTR.h: - * API/JSStringRefCF.h: - * API/JSValueRef.h: - -2007-11-27 Anders Carlsson - - Reviewed by Adam. - - Make PropertyNameArray and ScopeChain COMEnumVariant friendly. - - * kjs/PropertyNameArray.cpp: - (KJS::PropertyNameArray::swap): - Implement PropertyNameArray::swap. - - * kjs/PropertyNameArray.h: - Add ValueType typedef. Replace PropertyNameArrayIterator with - PropertyNameArray::const_iterator. - - * kjs/nodes.cpp: - (KJS::ForInNode::execute): - * kjs/scope_chain.cpp: - (KJS::ScopeChain::print): - Update for changes to PropertyNameArray. - - * kjs/scope_chain.h: - Add const_iterator and ValueType typedef. - -2007-11-27 Anders Carlsson - - Reviewed by Darin. - - Add a ValueType typedef. - - * wtf/Vector.h: - -2007-11-26 Darin Adler - - Reviewed by Mitz. - - - fix http://bugs.webkit.org/show_bug.cgi?id=16096 - REGRESSION (r26653-r26699): Plaxo.com addressbook does not load in webkit nightlies - - Test: fast/js/regexp-overflow.html - - * pcre/pcre_compile.cpp: (calculateCompiledPatternLengthAndFlags): - Removed a stray "ptr++" that I added by accident when merging the - changes between PCRE 6.4 and 6.5. - -2007-11-26 Geoffrey Garen - - Reviewed by Kevin McCullough. - - Fixed REGRESSION (r27126): Drosera does not - show variables (can't enumerate ActivationImp properties) - - Implemented a custom ActivationImp::getPropertyNames, since - ActivationImp now uses a custom property storage mechanism for local - variables. - - * kjs/function.cpp: - (KJS::ActivationImp::getPropertyNames): - * kjs/function.h: - -2007-11-26 Alp Toker - - GTK+/Qt/Wx build fix for breakage introduced in r28039. - - * ForwardingHeaders/JavaScriptCore/JSRetainPtr.h: Added. - -2007-11-24 Laszlo Gombos - - Reviewed by Maciej Stachowiak. - - Fix minor compiler warning (GCC 4.1.3) - - * pcre/pcre_internal.h: - * pcre/pcre_ucp_searchfuncs.cpp: - (_pcre_ucp_othercase): - -2007-11-25 Mark Rowe - - Reviewed by Dan Bernstein. - - Fix http://bugs.webkit.org/show_bug.cgi?id=16129 - Bug 16129: REGRESSION (r27761-r27811): malloc error while visiting http://mysit.es (crashes release build) - - * pcre/pcre_compile.cpp: Change errorcode to be passed by reference so that any error code is propagated - to our caller like they expect. - -2007-11-23 Kevin Ollivier - - MSVC7 build fix. (rand_s doesn't exist there) - - Reviewed by Adam Roben. - - * kjs/config.h: - * wtf/MathExtras.h: - -2007-11-23 Kevin Ollivier - - wx build fix. Move WX_PYTHON logic into project build settings, - add WebKitLibraries dirs on Win, and explicitly include JSCore - headers in testkjs rather than getting them from a template. - (Include dir order of JSCore/WTF and ICU headers is important due - to wtf/unicode/utf8.h.) - - * jscore.bkl: - -2007-11-23 Simon Hausmann - - Reviewed by George Staikos . - - Fix make (dist)clean on Windows. - - OBJECTS_DIR_WTR does not exist anymore, use GENERATED_SOURCES_DIR. - - - * JavaScriptCore.pri: - * pcre/pcre.pri: - -2007-11-22 Simon Hausmann - - Reviewed by George. - - Make the directory of where to put the generated sources configurable through the GENERATED_SOURCE_DIR variable - - * JavaScriptCore.pri: - * pcre/pcre.pri: - -2007-11-22 Simon Hausmann - - Reviewed by George. - - Centralize the setup for all the extra compilers in a addExtraCompiler function. - - This allows adding a "generated_files" target that builds all generated files using "make generated_files". - For the build inside Qt we do not generate actual rules for the extra compilers but instead - do the variable substitution of compiler.output manually and add the generated sources to SOURCES. - - * JavaScriptCore.pri: - * pcre/pcre.pri: - -2007-11-20 Mark Rowe - - Reviewed by Tim Hatcher. - - Need to resolve new GCC 4.2 warnings - - Fix all warnings emitted by GCC 4.2 when building JavaScriptCore. This allows builds with - -Werror to succeed. At present they will crash when executed due to code that is not safe - under strict aliasing (). - - * Configurations/Base.xcconfig: Remove the -Wno-long-double flag. - * kjs/date_object.cpp: - (KJS::formatTime): Test whether the stack-allocated string is empty rather than at a non-null address. - * kjs/dtoa.cpp: - (Bigint::): Tweak formatting to silence warnings. - * pcre/pcre_exec.cpp: - (match): Tweak formatting to silence warnings - * wtf/Assertions.cpp: Add printf format attribute to functions that warrant it. - * wtf/Assertions.h: Ditto. - -2007-11-19 Kevin Ollivier - - wx port build fix (wx headers include ctype functions). - - * kjs/config.h: - -2007-11-19 Kevin Ollivier - - Remove outdated and unused Windows port files. - - Reviewed by Adam Roben. - - * Makefile.vc: Removed. - * README-Win32.txt: Removed. - -2007-11-18 Eric Seidel - - Reviewed by Oliver. - - * tests/mozilla/jsDriver.pl: exit non-0 when user aborts test run - -2007-11-17 Mark Rowe - - Reviewed by Darin Adler. - - Fix: REGRESSION: testapi exits with assertion failure in debug build - JSGlobalContextCreate throws away globalObjectClass's prototype - http://bugs.webkit.org/show_bug.cgi?id=16033 - - Split Interpreter's initialization into two distinct steps: the creation of the global prototypes - and constructors, and storing them on the global object. This allows JSClassRef's passed to - JSGlobalContextCreate to be instantiated with the correct prototype. - - * API/JSCallbackObject.cpp: Assert at compile-time that the custom global object will fit in a collector cell. - * API/JSCallbackObject.h: - * API/JSCallbackObjectFunctions.h: - (KJS::::JSCallbackObject): - (KJS::::init): - * API/JSContextRef.cpp: - (JSGlobalContextCreate): Construct and set the interpreter's global object separately. When globalObjectClass - is passed we need to set the interpreter's global object before doing the JSCallbackObject's initialization to - prevent any JSObjectInitializeCallback's being invoked before a global object is set. - * API/testapi.c: - (globalObject_initialize): Test the object passed in is correct and that it has the expected global properties. - (globalObject_get): - (globalObject_set): - (main): - * API/testapi.js: Test that any static properties exposed by the global object's custom class are found. - * JavaScriptCore.exp: - * bindings/testbindings.cpp: - (main): Update for changes in Interpreter method signatures. - * bindings/testbindings.mm: - (main): Ditto. - * kjs/ExecState.cpp: - (KJS::ExecState::ExecState): - (KJS::ExecState::mark): - (KJS::ExecState::setGlobalObject): - * kjs/ExecState.h: Rename scope to m_scopeChain. - * kjs/interpreter.cpp: - (KJS::Interpreter::Interpreter): - (KJS::Interpreter::init): - (KJS::Interpreter::globalObject): - (KJS::Interpreter::setGlobalObject): - (KJS::Interpreter::resetGlobalObjectProperties): - (KJS::Interpreter::createObjectsForGlobalObjectProperties): - (KJS::Interpreter::setGlobalObjectProperties): Switch to using putDirect to ensure that the global object's put method - cannot interfere with setting of the global properties. This prevents a user-written JSClassRef from attempting to - call back into JavaScript from the initialization of the global object's members. - * kjs/interpreter.h: - * kjs/testkjs.cpp: - (setupInterpreter): Update for changes in Interpreter method signatures. - -2007-11-17 Mark Rowe - - Reviewed by Sam Weinig. - - Prevent testapi from reporting false leaks. Clear out local variables pointing at - JSObjectRefs to allow their values to be collected. - - * API/testapi.c: - (main): - -2007-11-17 Mark Rowe - - Reviewed by Sam Weinig. - - Prevent testapi from crashing if testapi.js can not be found by nil-checking the result of createStringWithContentsOfFile. - - * API/testapi.c: - (main): - -2007-11-17 Alp Toker - - Reviewed by Eric. - - http://bugs.webkit.org/show_bug.cgi?id=16032 - JS minidom is not portable - - Use a plain UTF-8 string instead of a CFString. - - Print to stdout, not stderr like CFShow() would have done, since that - behaviour seems unintentional. - - * API/minidom.c: - (main): - -2007-11-17 Steve Falkenburg - - Windows build fix. - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - -2007-11-16 Mark Rowe - - Windows build fix. - - * kjs/lexer.cpp: - (KJS::Lexer::record8): - -2007-11-16 Mark Rowe - - Reviewed by Eric. - - Replace strings, identifier, buffer8 and buffer16 members of Lexer with vectors. - SunSpider claims this is a 0.7% speedup. - - * kjs/lexer.cpp: - (KJS::Lexer::Lexer): - (KJS::Lexer::lex): - (KJS::Lexer::record8): - (KJS::Lexer::record16): - (KJS::Lexer::scanRegExp): - (KJS::Lexer::clear): - (KJS::Lexer::makeIdentifier): - (KJS::Lexer::makeUString): - * kjs/lexer.h: - * kjs/ustring.cpp: - (KJS::UString::UString): Add a convenience constructor that takes a const Vector&. - * kjs/ustring.h: - -2007-11-16 Adam Roben - - Windows build fix - - * JavaScriptCore.vcproj/testkjs/testkjs.vcproj: Add a new include path - and ignore the int -> bool conversion warning. - -2007-11-16 Alexey Proskuryakov - - Fix Windows debug build. - Rubber-stamped by Eric - - * pcre/pcre_exec.cpp: (match): Removed ASSERT_NOT_REACHED assertions that were making MSVC - complain about unreachable code. - -2007-11-15 Mark Rowe - - Gtk build fix. - - * kjs/Parser.cpp: - -2007-11-15 Mark Rowe - - Mac build and header search path sanity fix. - - Reviewed by Sam Weinig and Tim Hatcher. - - Move base setting for HEADER_SEARCH_PATHS into Base.xcconfig, and extend - it in JavaScriptCore.xcconfig. This removes the need to override it on a - per-target basis inside the .xcodeproj file. - - * Configurations/Base.xcconfig: - * Configurations/JavaScriptCore.xcconfig: - * JavaScriptCore.xcodeproj/project.pbxproj: - -2007-11-15 Mark Rowe - - Qt build fix. - - * kjs/Parser.h: - -2007-11-15 Geoffrey Garen - - Reviewed by Eric Seidel. - - Another round of grammar / parsing cleanup. - - 1. Created distinct parser calls for parsing function bodies vs - programs. This will help later with optimizing global variable access. - - 2. Turned Parser into a singleton. Cleaned up Lexer's singleton - interface. - - 3. Modified Lexer to free a little more memory when done lexing. (Added - FIXMEs for similar issues that I didn't fix.) - - 4. Changed Lexer::makeIdentifier and Lexer::makeUString to start - respecting the arguments passed to them. (No behavior change, but this - problem could have caused serious problems for an unsuspecting user of - these functions.) - - 5. Removed KJS_DEBUG_MEM because it was bit-rotted. - - 6. Removed Parser::prettyPrint because the same work was simpler to do - at the call site. - - 7. Some renames: - - "Parser::accept" => "Parser::didFinishParsing" - "Parser::sid" => "Parser::m_sourceID" - "Lexer::doneParsing" => "Lexer::clear" - "sid" => "sourceId" - "lineno" => "lineNo" - - * JavaScriptCore.exp: - * kjs/Parser.cpp: - (KJS::Parser::Parser): - (KJS::Parser::parseProgram): - (KJS::Parser::parseFunctionBody): - (KJS::Parser::parse): - (KJS::Parser::didFinishParsing): - (KJS::parser): - * kjs/Parser.h: - (KJS::Parser::sourceId): - * kjs/function.cpp: - (KJS::GlobalFuncImp::callAsFunction): - * kjs/function_object.cpp: - (FunctionObjectImp::construct): - * kjs/grammar.y: - * kjs/interpreter.cpp: - (KJS::Interpreter::checkSyntax): - (KJS::Interpreter::evaluate): - * kjs/interpreter.h: - * kjs/lexer.cpp: - (kjsyylex): - (KJS::lexer): - (KJS::Lexer::Lexer): - (KJS::Lexer::~Lexer): - (KJS::Lexer::scanRegExp): - (KJS::Lexer::doneParsing): - (KJS::Lexer::makeIdentifier): - (KJS::Lexer::makeUString): - * kjs/lexer.h: - (KJS::Lexer::pattern): - (KJS::Lexer::flags): - (KJS::Lexer::sawError): - * kjs/nodes.cpp: - (KJS::Node::Node): - (KJS::FunctionBodyNode::FunctionBodyNode): - * kjs/nodes.h: - * kjs/testkjs.cpp: - (prettyPrintScript): - (kjsmain): - * kjs/ustring.cpp: - * kjs/ustring.h: - -2007-11-15 Oliver Hunt - - Reviewed by Darin. - - REGRESSION: All SourceElements and their children leak after a syntax error - - Add a stub node to maintain the Vector of SourceElements until assignment. - - * kjs/grammar.y: - * kjs/nodes.h: - (KJS::SourceElementsStub::SourceElementsStub): - (KJS::SourceElementsStub::append): - (KJS::SourceElementsStub::release): - (KJS::SourceElementsStub::): - (KJS::SourceElementsStub::precedence): - -2007-11-15 Eric Seidel - - Reviewed by Sam. - - Abstract most of RMATCH into MatchStack functions. - - SunSpider claims this, combined with the last 2 patches was a 1% speedup, 10% for dna-regexp. - - * pcre/pcre_exec.cpp: - (MatchStack::canUseStackBufferForNextFrame): - (MatchStack::allocateNextFrame): - (MatchStack::pushNewFrame): - (MatchStack::frameIsStackAllocated): - (MatchStack::popCurrentFrame): - (MatchStack::unrollAnyHeapAllocatedFrames): - (match): - -2007-11-15 Eric Seidel - - Reviewed by Sam. - - Remove RETURN_ERROR, add MatchStack - - * pcre/pcre_exec.cpp: - (MatchStack::MatchStack): - (MatchStack::unrollAnyHeapAllocatedFrames): - (matchError): - (match): - -2007-11-15 Eric Seidel - - Reviewed by Sam. - - Clean up match function to match WebKit style - - * JavaScriptCore.xcodeproj/project.pbxproj: - * pcre/pcre_exec.cpp: - (match): - -2007-11-15 Steve Falkenburg - - Windows build fix. - - * JavaScriptCore.vcproj/JavaScriptCore.make: - -2007-11-14 Alexey Proskuryakov - - Reviewed by Darin. - - http://bugs.webkit.org/show_bug.cgi?id=15982 - Improve JSString UTF-8 decoding - - * API/JSStringRef.cpp: - (JSStringCreateWithUTF8CString): Use strict decoding, return 0 on error. - - * wtf/unicode/UTF8.cpp: - (WTF::Unicode::convertUTF16ToUTF8): - (WTF::Unicode::convertUTF8ToUTF16): - * wtf/unicode/UTF8.h: - Made these function names start with a lower case letter. - - * kjs/ustring.cpp: (KJS::UString::UTF8String): Updated for the above renaming. - - * bindings/c/c_utility.cpp: - (KJS::Bindings::convertUTF8ToUTF16WithLatin1Fallback): Renamed to highlight the difference - from convertUTF8ToUTF16 in wtf/unicode. - (KJS::Bindings::convertNPStringToUTF16): Updated for the above renaming. - (KJS::Bindings::identifierFromNPIdentifier): Ditto. - * bindings/c/c_utility.h: Made convertUTF8ToUTF16WithLatin1Fallback() a file static. - -2007-11-14 Sam Weinig - - Rubber-stamped by Anders. - - Fix the Xcode project file after it was messed up in r27402. - - * JavaScriptCore.xcodeproj/project.pbxproj: - -2007-11-14 Eric Seidel - - Reviewed by Oliver. - - More PCRE style cleanup. - - * pcre/pcre_compile.cpp: - (compile_regex): - -2007-11-14 Adam Roben - - Clean up the bison conflict checking script - - Reviewed by Geoff. - - * DerivedSources.make: - -2007-11-14 Eric Seidel - - Reviewed by Geoff. - - Another round of PCRE cleanups: inlines - - SunSpider claims that this, combined with my previous PCRE cleanup were a 0.7% speedup, go figure. - - * pcre/pcre_compile.cpp: - (jsRegExpCompile): - * pcre/pcre_exec.cpp: - (match): - (jsRegExpExecute): - * pcre/pcre_internal.h: - (PUT): - (GET): - (PUT2): - (GET2): - (isNewline): - -2007-11-14 Eric Seidel - - Reviewed by Sam. - - Give PCRE a (small) bath. - Fix some formating and break things off into separate functions - http://bugs.webkit.org/show_bug.cgi?id=15993 - - * pcre/pcre_compile.cpp: - (calculateCompiledPatternLengthAndFlags): - (printCompiledRegExp): - (returnError): - (jsRegExpCompile): - * pcre/pcre_internal.h: - (compile_data::compile_data): - -2007-11-14 Geoffrey Garen - - Reviewed by Eric Seidel. - - Cleaned up the JavaScript grammar a bit. - - 1. Changed BlockNode to always hold a child vector (which may be empty), - eliminating a few NULL-check branches in the common execution case. - - 2. Changed the Block production to correctly report its starting and - ending line numbers to the debugger. (It used to report its ending line - as its starting line.) Also, removed duplicate line-reporting code - inside the BlockNode constructor. - - 3. Moved curly braces up from FunctionBody production into parent - productions. (I had to move the line number reporting code, too, since - it depends on the location of the curly braces.) This matches the ECMA - spec more closely, and makes some future changes I plan easier. - - 4. Fixed statementList* convenience functions to deal appropriately with - empty Vectors. - - SunSpider reports a small and statistically insignificant speedup. - - * kjs/grammar.y: - * kjs/nodes.cpp: - (KJS::statementListPushFIFO): - (KJS::statementListGetDeclarations): - (KJS::statementListInitializeDeclarationStack): - (KJS::statementListInitializeVariableAccessStack): - (KJS::BlockNode::BlockNode): - (KJS::BlockNode::optimizeVariableAccess): - (KJS::BlockNode::getDeclarations): - (KJS::BlockNode::execute): - (KJS::FunctionBodyNode::initializeDeclarationStacks): - (KJS::FunctionBodyNode::optimizeVariableAccess): - -2007-11-13 Anders Carlsson - - Add RefCounted.h (And remove Shared.h) - - * JavaScriptCore.vcproj/WTF/WTF.vcproj: - -2007-11-13 Geoffrey Garen - - Build fix. - - * kjs/regexp.h: - -2007-11-13 Geoffrey Garen - - Reviewed by Anders Carlsson. - - Renamed Shared to RefCounted. - - * API/JSClassRef.h: - * JavaScriptCore.xcodeproj/project.pbxproj: - * kjs/interpreter.h: - * kjs/regexp.h: - * wtf/RefCounted.h: Copied from JavaScriptCore/wtf/Shared.h. - (WTF::RefCounted::RefCounted): - * wtf/Shared.h: Removed. - -2007-11-13 Adam Roben - - Build fix - - Reviewed by Geoff. - - * kjs/regexp.h: Added a missing #include. - -2007-11-13 Geoffrey Garen - - Reviewed by Sam Weinig. - - Moved Shared.h into wtf so it could be used in more places. Deployed - Shared in places where JSCore previously had hand-rolled ref-counting - classes. - - * API/JSClassRef.cpp: - (OpaqueJSClass::OpaqueJSClass): - * API/JSClassRef.h: - * API/JSObjectRef.cpp: - (JSClassRetain): - (JSClassRelease): - * JavaScriptCore.vcproj/WTF/WTF.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - * kjs/interpreter.cpp: - (KJS::Interpreter::init): - * kjs/interpreter.h: - * kjs/regexp.cpp: - (KJS::RegExp::RegExp): - * kjs/regexp.h: - * wtf/Shared.h: Copied from WebCore/platform/Shared.h. - -2007-11-13 Eric Seidel - - Reviewed by Maciej. - - Add an ASSERT to getTruncatedInt32 to enforce proper usage. - Best part about this patch? It doesn't break the web! - - * kjs/JSImmediate.h: - (KJS::JSImmediate::getTruncatedInt32): - (KJS::JSImmediate::toDouble): - (KJS::JSImmediate::getUInt32): - -2007-11-13 Alexey Proskuryakov - - Windows build fix. - - * bindings/c/c_utility.cpp: - (KJS::Bindings::convertUTF8ToUTF16): - * kjs/ustring.cpp: - (KJS::UString::UTF8String): - * wtf/unicode/UTF8.cpp: - (WTF::Unicode::ConvertUTF8ToUTF16): - -2007-11-13 Darin Adler - - Reviewed by Geoff. - - - fix http://bugs.webkit.org/show_bug.cgi?id=11231 - RegExp bug when handling newline characters - and a number of other differences between PCRE behvior - and JavaScript regular expressions: - - + single-digit sequences like \4 should be treated as octal - character constants, unless there is a sufficient number - of brackets for them to be treated as backreferences - - + \8 turns into the character "8", not a binary zero character - followed by "8" (same for 9) - - + only the first 3 digits should be considered part of an - octal character constant (the old behavior was to decode - an arbitrarily long sequence and then mask with 0xFF) - - + if \x is followed by anything other than two valid hex digits, - then it should simply be treated a the letter "x"; that includes - not supporting the \x{41} syntax - - + if \u is followed by anything less than four valid hex digits, - then it should simply be treated a the letter "u" - - + an extra "+" should be a syntax error, rather than being treated - as the "possessive quantifier" - - + if a "]" character appears immediately after a "[" character that - starts a character class, then that's an empty character class, - rather than being the start of a character class that includes a - "]" character - - + a "$" should not match a terminating newline; we could have gotten - PCRE to handle this the way we wanted by passing an appropriate option - - Test: fast/js/regexp-no-extensions.html - - * pcre/pcre_compile.cpp: - (check_escape): Check backreferences against bracount to catch both - overflows and things that should be treated as octal. Rewrite octal - loop to not go on indefinitely. Rewrite both hex loops to match and - remove \x{} support. - (compile_branch): Restructure loops so that we don't special-case a "]" - at the beginning of a character class. Remove code that treated "+" as - the possessive quantifier. - (jsRegExpCompile): Change the "]" handling here too. - - * pcre/pcre_exec.cpp: (match): Changed CIRC to match the DOLL implementation. - Changed DOLL to remove handling of "terminating newline", a Perl concept - which we don't need. - - * tests/mozilla/expected.html: Two tests are fixed now: - ecma_3/RegExp/regress-100199.js and ecma_3/RegExp/regress-188206.js. - One test fails now: ecma_3/RegExp/perlstress-002.js -- our success before - was due to a bug (we treated all 1-character numeric escapes as backreferences). - The date tests also now both expect success -- whatever was making them fail - before was probably due to the time being close to a DST shift; maybe we need - to get rid of those tests. - -2007-11-13 Darin Adler - - * kjs/JSImmediate.h: (KJS::JSImmediate::getTruncatedInt32): - Remove too-strong assert that was firing constantly and preventing even basic - web browsing from working in a debug build. This function is used in many - cases where the immediate value is not a number; the assertion could perhaps - be added back later with a bit of reorganization. - -2007-11-13 Alp Toker - - Build fix for breakage to non-Mac builds introduced in r27746. - - * kjs/ustring.cpp: - -2007-11-13 Eric Seidel - - Reviewed by Maciej. - - Clean up evaluateToBoolean functions to use inlines instead of copy/paste code - - * kjs/JSImmediate.h: - * kjs/nodes.cpp: - (KJS::GreaterNode::inlineEvaluateToBoolean): - (KJS::GreaterNode::evaluate): - (KJS::LessEqNode::inlineEvaluateToBoolean): - (KJS::LessEqNode::evaluate): - (KJS::GreaterEqNode::inlineEvaluateToBoolean): - (KJS::GreaterEqNode::evaluate): - (KJS::InNode::evaluateToBoolean): - (KJS::EqualNode::inlineEvaluateToBoolean): - (KJS::EqualNode::evaluate): - (KJS::NotEqualNode::inlineEvaluateToBoolean): - (KJS::NotEqualNode::evaluate): - (KJS::StrictEqualNode::inlineEvaluateToBoolean): - (KJS::StrictEqualNode::evaluate): - (KJS::NotStrictEqualNode::inlineEvaluateToBoolean): - (KJS::NotStrictEqualNode::evaluate): - * kjs/nodes.h: - -2007-11-12 Geoffrey Garen - - Reviewed by Sam Weinig. - - Fixed http://bugs.webkit.org/show_bug.cgi?id=15958 - base64 spends 1.1% of total time checking for special Infinity case - - Use a fast character test instead of calling strncmp. - - 1.1% speedup on string-base64. SunSpider reports a .4% speedup overall; - Sharks reports only .1%. Who are you going to believe? Huh? - - * kjs/ustring.cpp: - (KJS::UString::toDouble): - -2007-11-12 Eric Seidel - - Reviewed by Oliver. - - Add evaluateToInt32 and evaluateUInt32 methods and deploy them. - Fix a few missing evaluateToBoolean methods - Deploy all evaluateTo* functions to more nodes to avoid slowdowns - http://bugs.webkit.org/show_bug.cgi?id=15950 - - SunSpider claims this is at least a 1.4% speedup. - - * kjs/JSImmediate.h: - (KJS::JSImmediate::getTruncatedInt32): - (KJS::JSImmediate::toDouble): - (KJS::JSImmediate::getUInt32): - * kjs/nodes.cpp: - (KJS::ExpressionNode::evaluateToNumber): - (KJS::ExpressionNode::evaluateToInt32): - (KJS::ExpressionNode::evaluateToUInt32): - (KJS::NumberNode::evaluateToInt32): - (KJS::NumberNode::evaluateToUInt32): - (KJS::ImmediateNumberNode::evaluateToInt32): - (KJS::ImmediateNumberNode::evaluateToUInt32): - (KJS::ResolveNode::evaluate): - (KJS::ResolveNode::evaluateToNumber): - (KJS::ResolveNode::evaluateToBoolean): - (KJS::ResolveNode::evaluateToInt32): - (KJS::ResolveNode::evaluateToUInt32): - (KJS::LocalVarAccessNode::evaluateToInt32): - (KJS::LocalVarAccessNode::evaluateToUInt32): - (KJS::BracketAccessorNode::evaluateToNumber): - (KJS::BracketAccessorNode::evaluateToBoolean): - (KJS::BracketAccessorNode::evaluateToInt32): - (KJS::BracketAccessorNode::evaluateToUInt32): - (KJS::DotAccessorNode::inlineEvaluate): - (KJS::DotAccessorNode::evaluate): - (KJS::DotAccessorNode::evaluateToNumber): - (KJS::DotAccessorNode::evaluateToBoolean): - (KJS::DotAccessorNode::evaluateToInt32): - (KJS::DotAccessorNode::evaluateToUInt32): - (KJS::NewExprNode::inlineEvaluate): - (KJS::NewExprNode::evaluate): - (KJS::NewExprNode::evaluateToNumber): - (KJS::NewExprNode::evaluateToBoolean): - (KJS::NewExprNode::evaluateToInt32): - (KJS::NewExprNode::evaluateToUInt32): - (KJS::FunctionCallResolveNode::inlineEvaluate): - (KJS::FunctionCallResolveNode::evaluate): - (KJS::FunctionCallResolveNode::evaluateToNumber): - (KJS::FunctionCallResolveNode::evaluateToBoolean): - (KJS::FunctionCallResolveNode::evaluateToInt32): - (KJS::FunctionCallResolveNode::evaluateToUInt32): - (KJS::LocalVarFunctionCallNode::evaluate): - (KJS::LocalVarFunctionCallNode::evaluateToNumber): - (KJS::LocalVarFunctionCallNode::evaluateToBoolean): - (KJS::LocalVarFunctionCallNode::evaluateToInt32): - (KJS::LocalVarFunctionCallNode::evaluateToUInt32): - (KJS::FunctionCallDotNode::evaluate): - (KJS::FunctionCallDotNode::evaluateToNumber): - (KJS::FunctionCallDotNode::evaluateToBoolean): - (KJS::FunctionCallDotNode::evaluateToInt32): - (KJS::FunctionCallDotNode::evaluateToUInt32): - (KJS::PostDecLocalVarNode::inlineEvaluateToNumber): - (KJS::PostDecLocalVarNode::evaluateToNumber): - (KJS::PostDecLocalVarNode::evaluateToBoolean): - (KJS::PostDecLocalVarNode::evaluateToInt32): - (KJS::PostDecLocalVarNode::evaluateToUInt32): - (KJS::typeStringForValue): - (KJS::UnaryPlusNode::evaluate): - (KJS::UnaryPlusNode::evaluateToBoolean): - (KJS::UnaryPlusNode::evaluateToNumber): - (KJS::UnaryPlusNode::evaluateToInt32): - (KJS::BitwiseNotNode::inlineEvaluateToInt32): - (KJS::BitwiseNotNode::evaluate): - (KJS::BitwiseNotNode::evaluateToNumber): - (KJS::BitwiseNotNode::evaluateToBoolean): - (KJS::BitwiseNotNode::evaluateToInt32): - (KJS::MultNode::evaluateToBoolean): - (KJS::MultNode::evaluateToInt32): - (KJS::MultNode::evaluateToUInt32): - (KJS::DivNode::evaluateToInt32): - (KJS::DivNode::evaluateToUInt32): - (KJS::ModNode::evaluateToBoolean): - (KJS::ModNode::evaluateToInt32): - (KJS::ModNode::evaluateToUInt32): - (KJS::AddNode::evaluateToNumber): - (KJS::AddNode::evaluateToInt32): - (KJS::AddNode::evaluateToUInt32): - (KJS::AddNumbersNode::evaluateToInt32): - (KJS::AddNumbersNode::evaluateToUInt32): - (KJS::SubNode::evaluateToInt32): - (KJS::SubNode::evaluateToUInt32): - (KJS::LeftShiftNode::inlineEvaluateToInt32): - (KJS::LeftShiftNode::evaluate): - (KJS::LeftShiftNode::evaluateToNumber): - (KJS::LeftShiftNode::evaluateToInt32): - (KJS::RightShiftNode::inlineEvaluateToInt32): - (KJS::RightShiftNode::evaluate): - (KJS::RightShiftNode::evaluateToNumber): - (KJS::RightShiftNode::evaluateToInt32): - (KJS::UnsignedRightShiftNode::inlineEvaluateToUInt32): - (KJS::UnsignedRightShiftNode::evaluate): - (KJS::UnsignedRightShiftNode::evaluateToNumber): - (KJS::UnsignedRightShiftNode::evaluateToInt32): - (KJS::LessNode::inlineEvaluateToBoolean): - (KJS::LessNode::evaluate): - (KJS::LessNode::evaluateToBoolean): - (KJS::LessNumbersNode::inlineEvaluateToBoolean): - (KJS::LessNumbersNode::evaluate): - (KJS::LessNumbersNode::evaluateToBoolean): - (KJS::LessStringsNode::inlineEvaluateToBoolean): - (KJS::LessStringsNode::evaluate): - (KJS::BitAndNode::evaluate): - (KJS::BitAndNode::inlineEvaluateToInt32): - (KJS::BitAndNode::evaluateToNumber): - (KJS::BitAndNode::evaluateToBoolean): - (KJS::BitAndNode::evaluateToInt32): - (KJS::BitXOrNode::inlineEvaluateToInt32): - (KJS::BitXOrNode::evaluate): - (KJS::BitXOrNode::evaluateToNumber): - (KJS::BitXOrNode::evaluateToBoolean): - (KJS::BitXOrNode::evaluateToInt32): - (KJS::BitOrNode::inlineEvaluateToInt32): - (KJS::BitOrNode::evaluate): - (KJS::BitOrNode::evaluateToNumber): - (KJS::BitOrNode::evaluateToBoolean): - (KJS::BitOrNode::evaluateToInt32): - (KJS::ConditionalNode::evaluateToNumber): - (KJS::ConditionalNode::evaluateToInt32): - (KJS::ConditionalNode::evaluateToUInt32): - (KJS::valueForReadModifyAssignment): - (KJS::AssignExprNode::evaluate): - (KJS::AssignExprNode::evaluateToBoolean): - (KJS::AssignExprNode::evaluateToNumber): - (KJS::AssignExprNode::evaluateToInt32): - (KJS::VarDeclNode::handleSlowCase): - * kjs/nodes.h: - (KJS::FunctionCallResolveNode::precedence): - (KJS::AddNode::precedence): - (KJS::AddNode::): - (KJS::LessNumbersNode::): - (KJS::LessStringsNode::): - * kjs/value.cpp: - (KJS::JSValue::toInt32SlowCase): - (KJS::JSValue::toUInt32SlowCase): - * kjs/value.h: - (KJS::JSValue::asCell): - (KJS::JSValue::toInt32): - (KJS::JSValue::toUInt32): - -2007-11-12 Alexey Proskuryakov - - Reviewed by Darin. - - http://bugs.webkit.org/show_bug.cgi?id=15953 - Add UTF-8 encoding/decoding to WTF - - * kjs/ustring.h: Moved UTF8SequenceLength() and decodeUTF8Sequence() to wtf/unicode. - * kjs/ustring.cpp: (KJS::UString::UTF8String): Changed this function to take a strict/lenient - parameter. Callers are not interested in getting decoding results in strict mode, so - this allows for bailing out as soon as an error is seen. - - * kjs/function.cpp: - (KJS::encode): Updated for new UString::UTF8String() signature. - - * API/JSStringRef.cpp: - (JSStringCreateWithCharacters): Disambiguate UChar. - (JSStringCreateWithUTF8CString): Actually use UTF-8 when creating the string! - * bindings/c/c_utility.cpp: (KJS::Bindings::convertUTF8ToUTF16): Use ConvertUTF8ToUTF16(). - - * wtf/unicode/UTF8.cpp: Added. - (WTF::Unicode::inlineUTF8SequenceLengthNonASCII): - (WTF::Unicode::inlineUTF8SequenceLength): - (WTF::Unicode::UTF8SequenceLength): - (WTF::Unicode::decodeUTF8Sequence): - (WTF::Unicode::): - (WTF::Unicode::ConvertUTF16ToUTF8): - (WTF::Unicode::isLegalUTF8): - (WTF::Unicode::ConvertUTF8ToUTF16): - * wtf/unicode/UTF8.h: Added. - (WTF::Unicode::): - Some code moved from ustring.h, some adapted from unicode.org sources. - - * JavaScriptCore.exp: - * JavaScriptCore.pri: - * JavaScriptCore.vcproj/WTF/WTF.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - * JavaScriptCoreSources.bkl: - Added UTF8.{h,cpp} - -2007-11-12 Josh Aas - - Reviewed by Darin. - - - http://bugs.webkit.org/show_bug.cgi?id=15946 - add NPPValue NPPVpluginDrawingModel (Mozilla bug 403418 compat) - - * bindings/npapi.h: - -2007-11-12 Darin Adler - - Reviewed by Sam. - - - http://bugs.webkit.org/show_bug.cgi?id=15951 - REGRESSION: assertion failure in regexp match() when running JS tests - - Test: fast/js/regexp-many-brackets.html - - * pcre/pcre_exec.cpp: (match): Added back accidentally-removed case for - the BRANUMBER opcode. - -2007-11-12 Darin Adler - - Reviewed by Geoff. - - - fix use of prefix and config.h, got rid of a few unneeded things in - the PCRE code; no behavior changes - - * API/JSBase.cpp: Added include of config.h. - * API/JSCallbackConstructor.cpp: Ditto. - * API/JSCallbackFunction.cpp: Ditto. - * API/JSCallbackObject.cpp: Ditto. - * API/JSClassRef.cpp: Ditto. - * API/JSContextRef.cpp: Ditto. - * API/JSObjectRef.cpp: Ditto. - * API/JSStringRef.cpp: Ditto. - * API/JSValueRef.cpp: Ditto. - - * JavaScriptCorePrefix.h: Removed obsolete workaround. - Moved new/delete macros after includes, as they are in WebCore's prefix. - Removed "config.h". - - * pcre/dftables.cpp: (main): Changed back to not use a separate maketables - function. This is needed for PCRE, but not helpful for our use. Also changed - the tables to all be 128 entries long instead of 256, since only the first - 128 are ever used. - - * pcre/pcre_compile.cpp: Added include of config.h. Eliminated digitab, - which was only being used to check hex digits. Changed all uses of TRUE and - FALSE to use the C++ true and false instead. - (check_escape): Just the TRUE/FALSE thing. - (is_counted_repeat): Ditto. - (could_be_empty_branch): Ditto. - (get_othercase_range): Ditto. - (compile_branch): Ditto. - (compile_regex): Ditto. - (is_anchored): Ditto. - (is_startline): Ditto. - (find_firstassertedchar): Ditto. - (jsRegExpCompile): Ditto. - - * pcre/pcre_exec.cpp: Added include of config.h. Changed all uses of TRUE and - FALSE to use the C++ true and false instead. - (match_ref): Just the TRUE/FALSE thing. - (match): Ditto. Removed some unneeded braces. - (jsRegExpExecute): Just the TRUE/FALSE thing. - - * pcre/pcre_internal.h: Moved the constants needed by dftables.cpp to the top - of the file instead of the bottom, so they can be used. Also changed the table - sizes to 128 instead of 256. Removed macro definitions of FALSE and TRUE. - Set array sizes for all the const arrays. Changed _pcre_utf8_table1_size to - be a macro instead of a extern int. - - * pcre/pcre_maketables.cpp: Removed. It's all in dftables.cpp now. - - * pcre/pcre_tables.cpp: Made table sizes explicit. - - * pcre/pcre_xclass.cpp: Just the TRUE/FALSE thing. - -2007-11-12 Adam Roben - - Build fix - - * wtf/FastMalloc.h: Add missing using statement. - -2007-11-11 Oliver Hunt - - Reviewed by Darin. - - Add special fastZeroedMalloc function to replace a - number of fastCalloc calls where one argument was 1. - - This results in a 0.4% progression in SunSpider, more - than making up for the earlier regression caused by - additional overflow checks. - - * JavaScriptCore.exp: - * kjs/array_instance.cpp: - * kjs/property_map.cpp: - * wtf/FastMalloc.cpp: - * wtf/FastMalloc.h: - * wtf/HashTable.h: - -2007-11-11 Adam Roben - - Fix ASSERT in HashTable::checkTableConsistencyExceptSize beneath WebNotificationCenter - - The bug was due to a mismatch between HashMap::remove and - HashTable::checkTableConsistency. HashMap::remove can delete the value - stored in the HashTable (by derefing it), which is not normally - allowed by HashTable. It's OK in this case because the value is about - to be removed from the table, but HashTable wasn't aware of this. - - HashMap::remove now performs the consistency check itself before - derefing the value. - - Darin noticed that the same bug would occur in HashSet, so I've fixed - it there as well. - - Reviewed by Darin. - - * wtf/HashMap.h: - (WTF::HashMap::remove): Perform the HashTable consistency check - manually before calling deref. - * wtf/HashSet.h: - (WTF::HashSet::remove): Ditto. - * wtf/HashTable.h: Made checkTableConsistency public so that HashMap - and HashSet can call it. - (WTF::HashTable::removeAndInvalidateWithoutEntryConsistencyCheck): - Added. - (WTF::HashTable::removeAndInvalidate): Added. - (WTF::HashTable::remove): - (WTF::HashTable::removeWithoutEntryConsistencyCheck): Added. - -2007-11-11 Mark Rowe - - Build fix. Use the correct filename case. - - * kjs/nodes.h: - -2007-11-11 Geoffrey Garen - - Reviewed by Sam Weinig. - - Fixed http://bugs.webkit.org/show_bug.cgi?id=15902 - 15% of string-validate-input.js is spent compiling the same regular expression - - Store a compiled representation of the regular expression in the AST. - - Only a .2% SunSpider speedup overall, but a 10.6% speedup on - string-validate-input.js. - - * kjs/nodes.cpp: - (KJS::RegExpNode::evaluate): - * kjs/nodes.h: - (KJS::RegExpNode::): - * kjs/nodes2string.cpp: - (KJS::RegExpNode::streamTo): - * kjs/regexp.cpp: - (KJS::RegExp::flags): - * kjs/regexp.h: - (KJS::RegExp::pattern): - * kjs/regexp_object.cpp: - (KJS::RegExpObjectImp::construct): - (KJS::RegExpObjectImp::createRegExpImp): - * kjs/regexp_object.h: - -2007-11-11 Oliver Hunt - - Reviewed by Eric. - - Partial fix for numfuzz: integer overflows opening malformed SVG file in WebCore::ImageBuffer::create - - Unfortunately this is a very slight regression, but is unavoidable. - - * wtf/FastMalloc.cpp: - -2007-11-10 Eric Seidel - - Reviewed by darin. - - Add simple type inferencing to the parser, and create custom - AddNode and LessNode subclasses based on inferred types. - http://bugs.webkit.org/show_bug.cgi?id=15884 - - SunSpider claims this is at least a 0.5% speedup. - - * JavaScriptCore.exp: - * kjs/grammar.y: - * kjs/internal.cpp: - (KJS::NumberImp::getPrimitiveNumber): - (KJS::GetterSetterImp::getPrimitiveNumber): - * kjs/internal.h: - * kjs/lexer.cpp: - (KJS::Lexer::lex): - * kjs/nodes.cpp: - (KJS::Node::Node): - (KJS::StringNode::evaluate): - (KJS::StringNode::evaluateToNumber): - (KJS::StringNode::evaluateToBoolean): - (KJS::RegExpNode::evaluate): - (KJS::UnaryPlusNode::optimizeVariableAccess): - (KJS::AddNode::evaluate): - (KJS::AddNode::evaluateToNumber): - (KJS::AddNumbersNode::inlineEvaluateToNumber): - (KJS::AddNumbersNode::evaluate): - (KJS::AddNumbersNode::evaluateToNumber): - (KJS::AddStringsNode::evaluate): - (KJS::AddStringLeftNode::evaluate): - (KJS::AddStringRightNode::evaluate): - (KJS::lessThan): - (KJS::lessThanEq): - (KJS::LessNumbersNode::evaluate): - (KJS::LessStringsNode::evaluate): - * kjs/nodes.h: - (KJS::ExpressionNode::): - (KJS::RegExpNode::): - (KJS::RegExpNode::precedence): - (KJS::TypeOfResolveNode::): - (KJS::LocalVarTypeOfNode::): - (KJS::UnaryPlusNode::): - (KJS::UnaryPlusNode::precedence): - (KJS::AddNode::): - (KJS::AddNode::precedence): - (KJS::AddNumbersNode::): - (KJS::AddStringLeftNode::): - (KJS::AddStringRightNode::): - (KJS::AddStringsNode::): - (KJS::LessNode::): - (KJS::LessNode::precedence): - (KJS::LessNumbersNode::): - (KJS::LessStringsNode::): - * kjs/nodes2string.cpp: - (KJS::StringNode::streamTo): - * kjs/object.cpp: - * kjs/object.h: - * kjs/value.h: - (KJS::JSValue::getPrimitiveNumber): - -2007-11-11 Darin Adler - - - try another way of fixing dftables builds -- refactor pcre_internal.h a bit - - * pcre/pcre_internal.h: Make most of this header do nothing when DFTABLES is set. - Later we can break it into two files. - - * JavaScriptCore.vcproj/dftables/dftables.vcproj: Take out now-unneeded include paths. - * pcre/dftables.cpp: Set DFTABLES. Use delete instead of free. - * pcre/dftables.pro: Take out now-unneeded include paths. - * pcre/pcre_maketables.cpp: Use new instead of malloc. - -2007-11-11 Darin Adler - - * pcre/dftables.pro: Try fixing Qt builds (I looked at qt-win) by adding - another include path. - -2007-11-11 Darin Adler - - * JavaScriptCore.xcodeproj/project.pbxproj: Try fixing Mac Tiger builds - by adding another include path. - -2007-11-11 Darin Adler - - Reviewed by Sam. - - - http://bugs.webkit.org/show_bug.cgi?id=15924 - next round of changes to JSRegExp (formerly PCRE) - - This is a combination of converting to C++, tweaking the API, and adding - some additional optimizations. - - Future steps will involve getting rid of the use of UTF-8 completely - (we'll use UTF-16 exclusively instead), eliminating more source files, - and some more speed-ups. - - SunSpider says the current round is an 0.9% speed-up overall, and a - 5.3% speed-up for regexp. - - * JavaScriptCore.exp: Updated for new entry points. - - * JavaScriptCore.pri: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.vcproj/dftables/dftables.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - * JavaScriptCoreSources.bkl: - * jscore.bkl: - Updated for new source file names and ForwardingHeaders. - - * kjs/regexp.cpp: - (KJS::RegExp::RegExp): Changed to use the error message without calling - strdup on it and to pass the new types and options. - (KJS::RegExp::~RegExp): Removed the now-unneeded free of the error message. - (KJS::RegExp::match): Pass the new types and options. - * kjs/regexp.h: Update type of m_constructionError. - - * pcre/AUTHORS: Update to reflect the status of the project -- we don't include - the Google parts, and this isn't the PCRE library, per se. - * pcre/COPYING: Ditto. - - * pcre/dftables.cpp: Copied from JavaScriptCore/pcre/dftables.c. - (main): Removed unneeded ctype_digit. - - * pcre/pcre.h: Convert to C++, tweak API a bit. Use UChar instead of JSRegExpChar. - - * pcre/pcre_compile.cpp: Copied from JavaScriptCore/pcre/pcre_compile.c. - Moved a lot of private stuff used only within this file here from pcre_internal.h. - Renumbered the error codes. - (error_text): Use a single string with embedded nulls for the error text (I got - this idea from newer versions of PCRE). - (check_escape): Changed return type to be enum instead of int. Replaced ctype_digit - uses with isASCIIDigit. - (is_counted_repeat): Ditto. - (read_repeat_counts): Ditto. - (first_significant_code): Ditto. - (find_fixedlength): Ditto. - (could_be_empty_branch): Ditto. - (compile_branch): Ditto. Also removed some code that handles changing options. - JavaScript doesn't have any of the features that allow options to change. - (compile_regex): Updated for change to options parameter. - (is_anchored): Ditto. - (find_firstassertedchar): Ditto. - (jsRegExpCompile): Changed to take separate flags instead of an options int. - Also changed to call new/delete instead of pcre_malloc/free. - (jsRegExpFree): Ditto. - - * pcre/pcre_exec.cpp: Copied from JavaScriptCore/pcre/pcre_exec.c. - Added a case that uses computed goto for the opcode loop, but did not turn it on. - Changed the RMATCH macro to handle returns more efficiently by putting the where - pointer in the new frame instead of the old one, allowing us to branch to the - return with a single statement. Switched to new/delete from pcre_malloc/free. - Changed many RRETURN callers to not set the return value since it's already - set correctly. Replaced the rrc variable with an is_match variable. Values other - than "match" and "no match" are now handled differently. This allows us to remove - the code to check for those cases in various rules. - (match): All the case statements use a macro BEGIN_OPCODE instead. And all the - continue statements, or break statements that break out of the outer case use - a macro NEXT_OPCODE instead. Replaced a few if statements with assertions. - (jsRegExpExecute): Use new/delete instead of pcre_malloc/free. Removed unused - start_match field from the match block. - - * pcre/pcre_internal.h: Moved the last few configuration macros from pcre-config.h - in here. Removed various unused types. Converted from JSRegExpChar to UChar. - Eliminated pcre_malloc/free. Replaced the opcode enum with a macro that can be - used in multiple places. Unfortunately we lose the comments for each opcode; we - should find a place to put those back. Removed ctype_digit. - - * pcre/pcre_maketables.cpp: Copied from JavaScriptCore/pcre/pcre_maketables.c. - (pcre_maketables): Got rid of the conditional code that allows this to be compiled - in -- it's only used for dftables now (and soon may be obsolete entirely). - Changed code for cbit_digit to not use isdigit, and took the "_" case out of the - loop. Removed ctype_digit. - - * pcre/pcre_ord2utf8.cpp: Copied from JavaScriptCore/pcre/pcre_ord2utf8.c. - - * pcre/pcre_tables.cpp: Copied from JavaScriptCore/pcre/pcre_tables.c. - Moved _pcre_OP_lengths out of here into pcre_exec.cpp. - - * pcre/pcre_ucp_searchfuncs.cpp: Copied from JavaScriptCore/pcre/pcre_ucp_searchfuncs.c. - Updated for other file name changes. - - * pcre/pcre_xclass.cpp: Copied from JavaScriptCore/pcre/pcre_xclass.c. - - * pcre/ucpinternal.h: Updated header. - - * pcre/ucptable.cpp: Copied from JavaScriptCore/pcre/ucptable.c. - - * wtf/ASCIICType.h: (WTF::isASCIIDigit): Removed a branch by changing from && to - & for this operation. Also added an overload that takes an int because that's - useful for PCRE. Later we could optimize for int and overload other functions in - this file; stuck to this simple one for now. - - * wtf/unicode/icu/UnicodeIcu.h: Removed unused isUpper. - * wtf/unicode/qt4/UnicodeQt4.h: Ditto. - - * pcre/LICENCE: Removed. - * pcre/pcre-config.h: Removed. - * wtf/FastMallocPCRE.cpp: Removed. - - * pcre/dftables.c: Renamed to cpp. - * pcre/pcre_compile.c: Ditto. - * pcre/pcre_exec.c: Ditto. - * pcre/pcre_maketables.c: Ditto. - * pcre/pcre_ord2utf8.c: Ditto. - * pcre/pcre_tables.c: Ditto. - * pcre/pcre_ucp_searchfuncs.c: Ditto. - * pcre/pcre_xclass.c: Ditto. - * pcre/ucptable.c: Ditto. - -2007-11-11 Eric Seidel - - Reviewed by Oliver. - - Add KJS_CHECKEXCEPTIONBOOLEAN to match rest of nodes.cpp - - * kjs/nodes.cpp: - (KJS::ExpressionNode::evaluateToBoolean): - (KJS::LessNode::evaluateToBoolean): - (KJS::GreaterNode::evaluateToBoolean): - (KJS::LessEqNode::evaluateToBoolean): - (KJS::GreaterEqNode::evaluateToBoolean): - (KJS::InstanceOfNode::evaluateToBoolean): - (KJS::InNode::evaluateToBoolean): - (KJS::EqualNode::evaluateToBoolean): - (KJS::NotEqualNode::evaluateToBoolean): - (KJS::StrictEqualNode::evaluateToBoolean): - (KJS::NotStrictEqualNode::evaluateToBoolean): - (KJS::LogicalAndNode::evaluateToBoolean): - (KJS::LogicalOrNode::evaluateToBoolean): - (KJS::ConditionalNode::evaluateToBoolean): - -2007-11-10 Darin Adler - - Reviewed by Sam. - - - fix http://bugs.webkit.org/show_bug.cgi?id=15927 - REGRESSION(r27487): delete a.c followed by __defineGetter__("c", ...) incorrectly deletes another property - and REGRESSION (r27487): Can't switch out of Edit HTML Source mode on Leopard Wiki - - Test: fast/js/delete-then-put.html - - * kjs/property_map.cpp: - (KJS::PropertyMap::put): Added a missing "- 1"; code to find an empty slot was not working. - (KJS::PropertyMap::checkConsistency): Added a missing range check that would have caught this - problem before. - - - roll out a last-minute change to my evaluateToBoolean patch that was incorrect. - - * kjs/nodes.h: (KJS::ExprStatementNode::ExprStatementNode): Take out call to - optimizeForUnnecessaryResult, since the result is used in some cases. - -2007-11-10 Adam Roben - - Windows build fix - - Roll out some changes that were (seemingly accidentally) checked in - with r27664. - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - -2007-11-10 Darin Adler - - Reviewed by Sam. - - - http://bugs.webkit.org/show_bug.cgi?id=15915 - add an evaluation path for booleans like the one we have for numbers - - Gives 1.1% on SunSpider. - - * kjs/grammar.y: Create TrueNode and FalseNode instead of BooleanNode. - - * kjs/nodes.h: Changed to use Noncopyable. Moved optimizeForUnnecessaryResult - down from Node to ExpressionNode. Changed some classes to not inherit from - ExpressionNode where not necessary, and removed unnneeded evaluate functions - as well as evaluate functions that need not be virtual. Call the - optimizeForUnnecessaryResult function on the start of a for loop too. - * kjs/nodes.cpp: - (KJS::ExpressionNode::evaluateToBoolean): Added. - (KJS::FalseNode::evaluate): Added. - (KJS::TrueNode::evaluate): Added. - (KJS::NumberNode::evaluateToBoolean): Added. - (KJS::StringNode::evaluateToBoolean): Added. - (KJS::LocalVarAccessNode::evaluateToBoolean): Added. - (KJS::BracketAccessorNode::evaluateToBoolean): Added. - (KJS::LogicalNotNode::evaluate): Changed to call evaluateToBoolean. - (KJS::LogicalNotNode::evaluateToBoolean): Added. - (KJS::lessThan): Changed to return bool. - (KJS::lessThanEq): Ditto. - (KJS::LessNode::evaluate): Changed since lessThan returns bool. - (KJS::LessNode::evaluateToBoolean): Added. - (KJS::GreaterNode::evaluate): Changed since lessThanEq returns bool. - (KJS::GreaterNode::evaluateToBoolean): Added. - (KJS::LessEqNode::evaluate): Changed since lessThanEq returns bool. - (KJS::LessEqNode::evaluateToBoolean): Added. - (KJS::GreaterEqNode::evaluate): Changed since lessThan returns bool. - (KJS::GreaterEqNode::evaluateToBoolean): Added. - (KJS::InstanceOfNode::evaluateToBoolean): Added. - (KJS::InNode::evaluateToBoolean): Added. - (KJS::EqualNode::evaluateToBoolean): Added. - (KJS::NotEqualNode::evaluateToBoolean): Added. - (KJS::StrictEqualNode::evaluateToBoolean): Added. - (KJS::NotStrictEqualNode::evaluateToBoolean): Added. - (KJS::ConditionalNode::evaluate): Changed to call evaluateToBoolean. - (KJS::IfNode::execute): Ditto. - (KJS::DoWhileNode::execute): Ditto. - (KJS::WhileNode::execute): Ditto. - (KJS::ForNode::execute): Ditto. - - * kjs/nodes2string.cpp: - (KJS::FalseNode::streamTo): Added. - (KJS::TrueNode::streamTo): Added. - -2007-11-09 Adam Roben - - Windows build fix - - Reviewed by Darin. - - * kjs/value.h: - (KJS::jsNumber): Add some explicit casts. - -2007-11-08 Darin Adler - - - fix build - - * kjs/grammar.y: - * kjs/nodes.h: - * kjs/property_map.cpp: - -2007-11-08 Darin Adler - - - roll out accidentally-checked in changes - - * kjs/nodes.cpp: Back to previous version. - * kjs/nodes.h: Ditto. - * kjs/grammar.y: Ditto. - -2007-11-08 Darin Adler - - Reviewed by Maciej. - - - http://bugs.webkit.org/show_bug.cgi?id=15912 - fasta spends a lot of time in qsort - - * kjs/property_map.cpp: - (KJS::PropertyMap::getEnumerablePropertyNames): - Use insertion sort instead of qsort for small sets of property names. - We can probably do some even-better speedups of for/in, but this nets - 0.6% overall and 6.7% on fasta. - -2007-11-08 Darin Adler - - Reviewed by Maciej. - - - http://bugs.webkit.org/show_bug.cgi?id=15906 - getting characters by indexing into a string is very slow - - This fixes one source of the slowness -- the conversion to an unused - Identifier as we call the get function from the slot -- but doesn't - fix others, such as the fact that we have to allocate a new UString::Rep - for every single character. - - Speeds up string-base64 30%, and at least 0.5% overall. - But does slow down access-fannkuch quite a bit. Might be worth - revisiting in the future to see what we can do about that (although - I did look at a profile for a while). - - * kjs/property_slot.h: Add a new marker for "numeric" property slots; - slots where we don't need to pass the identifier to the get function. - (KJS::PropertySlot::getValue): Added code to call the numeric get function. - (KJS::PropertySlot::setCustomNumeric): Added. - * kjs/string_object.cpp: - (KJS::StringInstance::indexGetter): Changed to use substr() instead - of constructing a wholly new UString each time. - (KJS::stringInstanceNumericPropertyGetter): Added. Like indexGetter, but - takes advantage of setCustomNumeric to avoid creating an Identifier. - (KJS::StringInstance::getOwnPropertySlot): Changed to use setCustomNumeric. - -2007-11-08 Darin Adler - - Reviewed by Oliver. - - - http://bugs.webkit.org/show_bug.cgi?id=15904 - more speed-ups possible by tightening up int version of JSImmediate - - 1% improvement of SunSpider - - * kjs/JSImmediate.h: Eliminate the now-unneeded FPBitValues struct template. - (KJS::JSImmediate::from): Overload for most numeric types; many types can - do fewer branches and checks. - (KJS::JSImmediate::getUInt32): Removed unneeded check for undefined. - (KJS::JSImmediate::getTruncatedInt32): Ditto. - (KJS::JSImmediate::getTruncatedUInt32): Ditto. There's no difference any more - between getUInt32 and getTruncatedUInt32, so that's worth a rename and merge later. - - * kjs/grammar.y: Update since fromDouble is now just from. - * kjs/nodes.h: Ditto. - - * kjs/value.h: (KJS::jsNumber): Overload for most numeric types. - -2007-11-08 Kevin Ollivier - - Bakefiles for building JavaScriptCore, needed by wx port. - - Reviewed by Mark Rowe. - - * JavaScriptCoreSources.bkl: Added. - * jscore.bkl: Added. - -2007-11-08 Oliver Hunt - - Reviewed by Maciej. - - Fix regression caused by earlier bitwise and optimisation. 1 & undefined != 1. - - The implementation of JSImmediate::areBothImmediateNumbers relies on - (JSImmediate::getTag(immediate1) & JSImmediate::getTag(immediate2)) having - a unique result when both immediate values are numbers. - - The regression was due to UndefinedType & NumberType returning NumberType (3 & 1). - By swapping the value of NumberType and UndefinedType this ceases to be a problem. - - * kjs/JSType.h: - -2007-11-08 Darin Adler - - - fix build - - * kjs/nodes.h: Add missing parameter name. - -2007-11-08 Eric Seidel - - Reviewed by darin. - - Add ExpressionNode subclass of Node, use it. - - * kjs/grammar.y: - * kjs/nodes.cpp: - (KJS::ForInNode::ForInNode): - * kjs/nodes.h: - (KJS::ExpressionNode::): - (KJS::NullNode::): - (KJS::NullNode::precedence): - (KJS::BooleanNode::): - (KJS::BooleanNode::precedence): - (KJS::RegExpNode::): - (KJS::RegExpNode::precedence): - (KJS::ThisNode::): - (KJS::ThisNode::precedence): - (KJS::ResolveNode::): - (KJS::ElementNode::): - (KJS::ArrayNode::): - (KJS::PropertyNode::): - (KJS::PropertyNode::precedence): - (KJS::PropertyNode::name): - (KJS::PropertyListNode::): - (KJS::ObjectLiteralNode::): - (KJS::ObjectLiteralNode::precedence): - (KJS::BracketAccessorNode::): - (KJS::DotAccessorNode::): - (KJS::DotAccessorNode::precedence): - (KJS::ArgumentListNode::): - (KJS::ArgumentsNode::): - (KJS::NewExprNode::): - (KJS::NewExprNode::precedence): - (KJS::FunctionCallValueNode::): - (KJS::FunctionCallValueNode::precedence): - (KJS::FunctionCallResolveNode::): - (KJS::FunctionCallBracketNode::): - (KJS::FunctionCallBracketNode::precedence): - (KJS::FunctionCallDotNode::): - (KJS::FunctionCallDotNode::precedence): - (KJS::PrePostResolveNode::): - (KJS::PostfixBracketNode::): - (KJS::PostfixBracketNode::precedence): - (KJS::PostIncBracketNode::): - (KJS::PostIncBracketNode::isIncrement): - (KJS::PostDecBracketNode::): - (KJS::PostDecBracketNode::isIncrement): - (KJS::PostfixDotNode::): - (KJS::PostfixDotNode::precedence): - (KJS::PostIncDotNode::): - (KJS::PostIncDotNode::isIncrement): - (KJS::PostDecDotNode::): - (KJS::PostDecDotNode::isIncrement): - (KJS::PostfixErrorNode::): - (KJS::PostfixErrorNode::precedence): - (KJS::DeleteResolveNode::): - (KJS::DeleteBracketNode::): - (KJS::DeleteBracketNode::precedence): - (KJS::DeleteDotNode::): - (KJS::DeleteDotNode::precedence): - (KJS::DeleteValueNode::): - (KJS::DeleteValueNode::precedence): - (KJS::VoidNode::): - (KJS::VoidNode::precedence): - (KJS::TypeOfResolveNode::): - (KJS::TypeOfValueNode::): - (KJS::PrefixBracketNode::): - (KJS::PrefixBracketNode::precedence): - (KJS::PreIncBracketNode::): - (KJS::PreIncBracketNode::isIncrement): - (KJS::PreDecBracketNode::): - (KJS::PreDecBracketNode::isIncrement): - (KJS::PrefixDotNode::): - (KJS::PrefixDotNode::precedence): - (KJS::PreIncDotNode::): - (KJS::PreIncDotNode::isIncrement): - (KJS::PreDecDotNode::): - (KJS::PreDecDotNode::isIncrement): - (KJS::PrefixErrorNode::): - (KJS::PrefixErrorNode::precedence): - (KJS::UnaryPlusNode::): - (KJS::UnaryPlusNode::precedence): - (KJS::NegateNode::): - (KJS::NegateNode::precedence): - (KJS::BitwiseNotNode::): - (KJS::BitwiseNotNode::precedence): - (KJS::LogicalNotNode::): - (KJS::LogicalNotNode::precedence): - (KJS::AddNode::): - (KJS::AddNode::precedence): - (KJS::LeftShiftNode::): - (KJS::LeftShiftNode::precedence): - (KJS::RightShiftNode::): - (KJS::RightShiftNode::precedence): - (KJS::UnsignedRightShiftNode::): - (KJS::UnsignedRightShiftNode::precedence): - (KJS::LessNode::): - (KJS::LessNode::precedence): - (KJS::GreaterNode::): - (KJS::GreaterNode::precedence): - (KJS::LessEqNode::): - (KJS::LessEqNode::precedence): - (KJS::GreaterEqNode::): - (KJS::GreaterEqNode::precedence): - (KJS::InstanceOfNode::): - (KJS::InstanceOfNode::precedence): - (KJS::InNode::): - (KJS::InNode::precedence): - (KJS::EqualNode::): - (KJS::EqualNode::precedence): - (KJS::NotEqualNode::): - (KJS::NotEqualNode::precedence): - (KJS::StrictEqualNode::): - (KJS::StrictEqualNode::precedence): - (KJS::NotStrictEqualNode::): - (KJS::NotStrictEqualNode::precedence): - (KJS::BitAndNode::): - (KJS::BitAndNode::precedence): - (KJS::BitOrNode::): - (KJS::BitOrNode::precedence): - (KJS::BitXOrNode::): - (KJS::BitXOrNode::precedence): - (KJS::LogicalAndNode::): - (KJS::LogicalAndNode::precedence): - (KJS::LogicalOrNode::): - (KJS::LogicalOrNode::precedence): - (KJS::ConditionalNode::): - (KJS::ConditionalNode::precedence): - (KJS::ReadModifyResolveNode::): - (KJS::ReadModifyResolveNode::precedence): - (KJS::AssignResolveNode::): - (KJS::AssignResolveNode::precedence): - (KJS::ReadModifyBracketNode::): - (KJS::ReadModifyBracketNode::precedence): - (KJS::AssignBracketNode::): - (KJS::AssignBracketNode::precedence): - (KJS::AssignDotNode::): - (KJS::AssignDotNode::precedence): - (KJS::ReadModifyDotNode::): - (KJS::ReadModifyDotNode::precedence): - (KJS::AssignErrorNode::): - (KJS::AssignErrorNode::precedence): - (KJS::CommaNode::): - (KJS::CommaNode::precedence): - (KJS::AssignExprNode::): - (KJS::AssignExprNode::precedence): - (KJS::ExprStatementNode::): - (KJS::IfNode::): - (KJS::DoWhileNode::): - (KJS::WhileNode::): - (KJS::ReturnNode::): - (KJS::WithNode::): - (KJS::ThrowNode::): - (KJS::ParameterNode::): - (KJS::CaseClauseNode::): - (KJS::CaseClauseNode::precedence): - (KJS::ClauseListNode::): - (KJS::SwitchNode::): - -2007-11-08 Oliver Hunt - - Reviewed by Sam. - - Add a fast path for bitwise-and of two immediate numbers for a 0.7% improvement in SunSpider (4% bitop improvement). - - This only improves bitwise-and performance, as the additional logic required - for similar code paths on or, xor, and shifting requires additional operations - and branches that negate (and in certain cases, regress) any advantage we might - otherwise receive. - - This improves performance on all bitop tests, the cryptography tests, as well as - the string-base64 and string-unpack-code tests. No significant degradation on - any other tests. - - * kjs/JSImmediate.h: - (KJS::JSImmediate::areBothImmediateNumbers): - (KJS::JSImmediate::andImmediateNumbers): - * kjs/nodes.cpp: - (KJS::BitAndNode::evaluate): - * kjs/value.h: - (KJS::jsNumberFromAnd): - -2007-11-08 Adam Roben - - Stop using KJS inside of MathExtras.h - - Reviewed by Darin. - - * wtf/MathExtras.h: Removed an unused header, and a now-unused - forward-declaration. - (wtf_atan2): Use std::numeric_limits intead of KJS. - -2007-11-08 Sam Weinig - - Windows build fix. - - * kjs/date_object.cpp: - (KJS::DateProtoFuncToLocaleString::callAsFunction): Fix unused arg warning. - (KJS::DateProtoFuncToLocaleDateString::callAsFunction): ditto - (KJS::DateProtoFuncToLocaleTimeString::callAsFunction): ditto - -2007-11-08 Mark Rowe - - Gtk build fix. - - * kjs/lookup.h: Add missing include. - -2007-11-08 Sam Weinig - - Reviewed by Darin. - - Convert JavaScript internal function objects to use one class per - function. This avoids a switch statement inside what used to be - the shared function classes and will allow Shark to better analyze - the code. - - To make this switch, the value property of the HashEntry was changed - to a union of an intptr_t (which is used to continue handle valueGetters) - and function pointer which points to a static constructor for the - individual new function objects. - - SunSpider claims this is a 1.0% speedup. - - * kjs/array_object.cpp: - (KJS::ArrayPrototype::getOwnPropertySlot): - (KJS::getProperty): - (KJS::ArrayProtoFuncToString::callAsFunction): - (KJS::ArrayProtoFuncToLocaleString::callAsFunction): - (KJS::ArrayProtoFuncJoin::callAsFunction): - (KJS::ArrayProtoFuncConcat::callAsFunction): - (KJS::ArrayProtoFuncPop::callAsFunction): - (KJS::ArrayProtoFuncPush::callAsFunction): - (KJS::ArrayProtoFuncReverse::callAsFunction): - (KJS::ArrayProtoFuncShift::callAsFunction): - (KJS::ArrayProtoFuncSlice::callAsFunction): - (KJS::ArrayProtoFuncSort::callAsFunction): - (KJS::ArrayProtoFuncSplice::callAsFunction): - (KJS::ArrayProtoFuncUnShift::callAsFunction): - (KJS::ArrayProtoFuncFilter::callAsFunction): - (KJS::ArrayProtoFuncMap::callAsFunction): - (KJS::ArrayProtoFuncEvery::callAsFunction): - (KJS::ArrayProtoFuncForEach::callAsFunction): - (KJS::ArrayProtoFuncSome::callAsFunction): - (KJS::ArrayProtoFuncIndexOf::callAsFunction): - (KJS::ArrayProtoFuncLastIndexOf::callAsFunction): - * kjs/array_object.h: - (KJS::ArrayPrototype::classInfo): - * kjs/create_hash_table: - * kjs/date_object.cpp: - (KJS::DatePrototype::getOwnPropertySlot): - (KJS::DateProtoFuncToString::callAsFunction): - (KJS::DateProtoFuncToUTCString::callAsFunction): - (KJS::DateProtoFuncToDateString::callAsFunction): - (KJS::DateProtoFuncToTimeString::callAsFunction): - (KJS::DateProtoFuncToLocaleString::callAsFunction): - (KJS::DateProtoFuncToLocaleDateString::callAsFunction): - (KJS::DateProtoFuncToLocaleTimeString::callAsFunction): - (KJS::DateProtoFuncValueOf::callAsFunction): - (KJS::DateProtoFuncGetTime::callAsFunction): - (KJS::DateProtoFuncGetFullYear::callAsFunction): - (KJS::DateProtoFuncGetUTCFullYear::callAsFunction): - (KJS::DateProtoFuncToGMTString::callAsFunction): - (KJS::DateProtoFuncGetMonth::callAsFunction): - (KJS::DateProtoFuncGetUTCMonth::callAsFunction): - (KJS::DateProtoFuncGetDate::callAsFunction): - (KJS::DateProtoFuncGetUTCDate::callAsFunction): - (KJS::DateProtoFuncGetDay::callAsFunction): - (KJS::DateProtoFuncGetUTCDay::callAsFunction): - (KJS::DateProtoFuncGetHours::callAsFunction): - (KJS::DateProtoFuncGetUTCHours::callAsFunction): - (KJS::DateProtoFuncGetMinutes::callAsFunction): - (KJS::DateProtoFuncGetUTCMinutes::callAsFunction): - (KJS::DateProtoFuncGetSeconds::callAsFunction): - (KJS::DateProtoFuncGetUTCSeconds::callAsFunction): - (KJS::DateProtoFuncGetMilliSeconds::callAsFunction): - (KJS::DateProtoFuncGetUTCMilliseconds::callAsFunction): - (KJS::DateProtoFuncGetTimezoneOffset::callAsFunction): - (KJS::DateProtoFuncSetTime::callAsFunction): - (KJS::DateProtoFuncSetMilliSeconds::callAsFunction): - (KJS::DateProtoFuncSetUTCMilliseconds::callAsFunction): - (KJS::DateProtoFuncSetSeconds::callAsFunction): - (KJS::DateProtoFuncSetUTCSeconds::callAsFunction): - (KJS::DateProtoFuncSetMinutes::callAsFunction): - (KJS::DateProtoFuncSetUTCMinutes::callAsFunction): - (KJS::DateProtoFuncSetHours::callAsFunction): - (KJS::DateProtoFuncSetUTCHours::callAsFunction): - (KJS::DateProtoFuncSetDate::callAsFunction): - (KJS::DateProtoFuncSetUTCDate::callAsFunction): - (KJS::DateProtoFuncSetMonth::callAsFunction): - (KJS::DateProtoFuncSetUTCMonth::callAsFunction): - (KJS::DateProtoFuncSetFullYear::callAsFunction): - (KJS::DateProtoFuncSetUTCFullYear::callAsFunction): - (KJS::DateProtoFuncSetYear::callAsFunction): - (KJS::DateProtoFuncGetYear::callAsFunction): - * kjs/date_object.h: - * kjs/lookup.cpp: - (KJS::Lookup::find): - * kjs/lookup.h: - (KJS::HashEntry::): - (KJS::staticFunctionGetter): - (KJS::staticValueGetter): - (KJS::getStaticPropertySlot): - (KJS::getStaticFunctionSlot): - (KJS::lookupPut): - * kjs/math_object.cpp: - (KJS::MathObjectImp::getOwnPropertySlot): - (KJS::MathProtoFuncAbs::callAsFunction): - (KJS::MathProtoFuncACos::callAsFunction): - (KJS::MathProtoFuncASin::callAsFunction): - (KJS::MathProtoFuncATan::callAsFunction): - (KJS::MathProtoFuncATan2::callAsFunction): - (KJS::MathProtoFuncCeil::callAsFunction): - (KJS::MathProtoFuncCos::callAsFunction): - (KJS::MathProtoFuncExp::callAsFunction): - (KJS::MathProtoFuncFloor::callAsFunction): - (KJS::MathProtoFuncLog::callAsFunction): - (KJS::MathProtoFuncMax::callAsFunction): - (KJS::MathProtoFuncMin::callAsFunction): - (KJS::MathProtoFuncPow::callAsFunction): - (KJS::MathProtoFuncRandom::callAsFunction): - (KJS::MathProtoFuncRound::callAsFunction): - (KJS::MathProtoFuncSin::callAsFunction): - (KJS::MathProtoFuncSqrt::callAsFunction): - (KJS::MathProtoFuncTan::callAsFunction): - * kjs/math_object.h: - (KJS::MathObjectImp::classInfo): - (KJS::MathObjectImp::): - * kjs/string_object.cpp: - (KJS::StringPrototype::getOwnPropertySlot): - (KJS::StringProtoFuncToString::callAsFunction): - (KJS::StringProtoFuncValueOf::callAsFunction): - (KJS::StringProtoFuncCharAt::callAsFunction): - (KJS::StringProtoFuncCharCodeAt::callAsFunction): - (KJS::StringProtoFuncConcat::callAsFunction): - (KJS::StringProtoFuncIndexOf::callAsFunction): - (KJS::StringProtoFuncLastIndexOf::callAsFunction): - (KJS::StringProtoFuncMatch::callAsFunction): - (KJS::StringProtoFuncSearch::callAsFunction): - (KJS::StringProtoFuncReplace::callAsFunction): - (KJS::StringProtoFuncSlice::callAsFunction): - (KJS::StringProtoFuncSplit::callAsFunction): - (KJS::StringProtoFuncSubstr::callAsFunction): - (KJS::StringProtoFuncSubstring::callAsFunction): - (KJS::StringProtoFuncToLowerCase::callAsFunction): - (KJS::StringProtoFuncToUpperCase::callAsFunction): - (KJS::StringProtoFuncToLocaleLowerCase::callAsFunction): - (KJS::StringProtoFuncToLocaleUpperCase::callAsFunction): - (KJS::StringProtoFuncLocaleCompare::callAsFunction): - (KJS::StringProtoFuncBig::callAsFunction): - (KJS::StringProtoFuncSmall::callAsFunction): - (KJS::StringProtoFuncBlink::callAsFunction): - (KJS::StringProtoFuncBold::callAsFunction): - (KJS::StringProtoFuncFixed::callAsFunction): - (KJS::StringProtoFuncItalics::callAsFunction): - (KJS::StringProtoFuncStrike::callAsFunction): - (KJS::StringProtoFuncSub::callAsFunction): - (KJS::StringProtoFuncSup::callAsFunction): - (KJS::StringProtoFuncFontcolor::callAsFunction): - (KJS::StringProtoFuncFontsize::callAsFunction): - (KJS::StringProtoFuncAnchor::callAsFunction): - (KJS::StringProtoFuncLink::callAsFunction): - * kjs/string_object.h: - -2007-11-08 Adam Roben - - Windows build fix - - Reviewed by Sam and Ada. - - * wtf/MathExtras.h: Get rid of a circular #include dependency to fix - the build. - -2007-11-08 Adam Roben - - Fix a precedence warning on Windows - - * kjs/JSImmediate.h: - (KJS::JSImmediate::toBoolean): - -2007-11-08 Mark Rowe - - Build fix for JavaScriptGlue. - - * wtf/MathExtras.h: Include stdlib.h for srand and RAND_MAX. - -2007-11-08 Darin Adler - - - Windows build fix - - * kjs/JSImmediate.h: Include MathExtras.h rather than math.h since this file uses "signbit". - -2007-11-08 Oliver Hunt - - Reviewed by Darin. - - Replace the use of floats for immediate values with the use of integers for a 4.5% improvement in SunSpider. - - Unfortunately this change results in NaN, +Inf, -Inf, and -0 being heap allocated now, but - we should now have faster array access, faster immediate to double conversion, and the - potential to further improve bitwise operators in future. - - This also removes the need for unions to avoid strict aliasing problems when extracting - a value from immediates. - - * kjs/JSImmediate.h: - (KJS::JSImmediate::trueImmediate): - (KJS::JSImmediate::falseImmediate): - (KJS::JSImmediate::undefinedImmediate): - (KJS::JSImmediate::nullImmediate): - (KJS::JSImmediate::toBoolean): - * kjs/value.h: - (KJS::jsNaN): - -2007-11-07 Eric Seidel - - Reviewed by Darin and Oliver. - - Add evaluateToNumber parallel evaluation tree to speed up number operations. - Make ImmediateNumberNode a subclass of NumberNode. - Share evaluate logic between evaluate and evaluateToNumber using inline functions - There is still a lot of improvement to be made here. - - SunSpider claims this is a 1.0% speedup overall (nbody 7.9%), base64 slowing 2.0% - Given the huge win that this prepares us for with simple type inferencing I see the small - regression in base64 being worth the substantial overall improvement. - - * kjs/grammar.y: - * kjs/nodes.cpp: - (KJS::Node::evaluateToNumber): - (KJS::NumberNode::evaluate): - (KJS::NumberNode::evaluateToNumber): - (KJS::StringNode::evaluateToNumber): - (KJS::LocalVarAccessNode::inlineEvaluate): - (KJS::LocalVarAccessNode::evaluate): - (KJS::LocalVarAccessNode::evaluateToNumber): - (KJS::BracketAccessorNode::inlineEvaluate): - (KJS::BracketAccessorNode::evaluate): - (KJS::BracketAccessorNode::evaluateToNumber): - (KJS::NegateNode::evaluate): - (KJS::NegateNode::evaluateToNumber): - (KJS::MultNode::inlineEvaluateToNumber): - (KJS::MultNode::evaluate): - (KJS::MultNode::evaluateToNumber): - (KJS::DivNode::inlineEvaluateToNumber): - (KJS::DivNode::evaluate): - (KJS::DivNode::evaluateToNumber): - (KJS::ModNode::inlineEvaluateToNumber): - (KJS::ModNode::evaluate): - (KJS::ModNode::evaluateToNumber): - (KJS::throwOutOfMemoryErrorToNumber): - (KJS::addSlowCaseToNumber): - (KJS::add): - (KJS::addToNumber): - (KJS::AddNode::evaluateToNumber): - (KJS::SubNode::inlineEvaluateToNumber): - (KJS::SubNode::evaluate): - (KJS::SubNode::evaluateToNumber): - (KJS::valueForReadModifyAssignment): - (KJS::ReadModifyLocalVarNode::evaluate): - (KJS::ReadModifyResolveNode::evaluate): - (KJS::ReadModifyDotNode::evaluate): - (KJS::ReadModifyBracketNode::evaluate): - * kjs/nodes.h: - (KJS::Node::): - (KJS::NumberNode::): - (KJS::ImmediateNumberNode::): - (KJS::AddNode::precedence): - * kjs/nodes2string.cpp: - (KJS::NumberNode::streamTo): - -2007-11-07 Mark Rowe - - Reviewed by Eric. - - Fix up initialization after being mangled in r27572, and remove the - ternary expression as extraCost will always be zero for the numeric - heap. - - * kjs/collector.cpp: - (KJS::Collector::heapAllocate): - -2007-11-07 Mark Rowe - - Gtk build fix. - - * kjs/regexp_object.cpp: - -2007-11-07 Geoffrey Garen - - Reviewed by Beth Dakin. - - Eliminated a bogus (though compiled-out) branch in the collector. - - * kjs/collector.cpp: - (KJS::Collector::heapAllocate): - -2007-11-06 Geoffrey Garen - - Reviewed by Darin Adler. - - Fixed part of http://bugs.webkit.org/show_bug.cgi?id=15861 - 5.8% of string-validate-input.js is spent creating RegExpImps - - Put RegExpImp properties into a static hashtable to avoid a slew of - PropertyMap churn when creating a RegExpImp. - - Factored important bits of regular expression implementation out of - RegExpImp (the JS object) and into RegExp (the PCRE wrapper class), - making RegExp a ref-counted class. (This will help later.) - - Removed PCRE_POSIX support because I didn't quite know how to test it - and keep it working with these changes. - - 1.1% SunSpider speedup. 5.8% speedup on string-validate-input.js. - - * kjs/regexp.h: A few interface changes: - 1. Renamed "subpatterns()" => "numSubpatterns()" - 2. Made flag enumeration private and replaced it with public getters for - specific flags. - 3. Made RegExp ref-counted so RegExps can be shared by RegExpImps. - 4. Made RegExp take a string of flags instead of an int, eliminating - duplicated flag parsing code elsewhere. - - * kjs/regexp_object.cpp: - (KJS::RegExpProtoFunc::callAsFunction): For RegExp.compile: - - Fixed a bug where compile(undefined) would throw an exception. - - Removed some now-redundant code. - - Used RegExp sharing to eliminate an allocation and a bunch of - PropertyMap thrash. (Not a big win since compile is a deprecated - function. I mainly did this to test the plubming.) - -2007-11-07 Simon Hausmann - - Reviewed by nobody, Qt/Windows build fix. - - JavaScriptCore.pri expects OBJECTS_DIR to be set, so set it in - testkjs.pro, too, where it's included from. - - * kjs/testkjs.pro: - -2007-11-07 Simon Hausmann - - Reviewed by Lars. - - Fix "nmake clean" for the Qt/Windows build by replacing tmp/ with a variable that ends with the correct type of slash/backslash depending on the choice of compiler/make tool. - - * JavaScriptCore.pri: - * pcre/pcre.pri: - -2007-11-07 Lars Knoll - - Reviewed by Simon. - - fix umemcasecmp - - Pretty embarrassing bug. Has the potential to fix quite a few test failures. - - * wtf/unicode/qt4/UnicodeQt4.h: - (WTF::Unicode::umemcasecmp): - -2007-11-06 Maciej Stachowiak - - Reviewed by Eric. - - - only collect when the heap is full, unless we have lots of extra cost garbage - - 1.1% SunSpider speedup. - - This shouldn't hit memory use much since the extra space in those - blocks hangs around either way. - - * kjs/collector.cpp: - (KJS::Collector::heapAllocate): - (KJS::Collector::collect): Fix logic error that reversed the sense of collect's - return value. - -2007-11-06 Oliver Hunt - - Reviewed by Maciej. - - Avoid unnecessarily boxing the result from post inc/decrement for 0.3% gain in sunspider - - We now convert the common 'for (...; ...; ++) ...' to the semantically identical - 'for (...; ...; ++) ...'. - - * kjs/nodes.cpp: - (KJS::PostIncResolveNode::optimizeForUnnecessaryResult): - (KJS::PostIncLocalVarNode::evaluate): - (KJS::PostIncLocalVarNode::optimizeForUnnecessaryResult): - (KJS::PostDecResolveNode::optimizeForUnnecessaryResult): - (KJS::PostDecLocalVarNode::evaluate): - (KJS::PostDecLocalVarNode::optimizeForUnnecessaryResult): - * kjs/nodes.h: - (KJS::PrePostResolveNode::): - (KJS::PostIncResolveNode::): - (KJS::PostIncLocalVarNode::): - (KJS::PostDecResolveNode::): - (KJS::PostDecLocalVarNode::): - (KJS::PreIncResolveNode::): - (KJS::PreDecResolveNode::): - (KJS::ForNode::ForNode): - -2007-11-06 Eric Seidel - - Reviewed by darin. - - This fixes a regressed layout test for string + object - - SunSpider claims this was an overall 0.3% speedup, although some individual tests were slower. - - * kjs/nodes.cpp: - (KJS::add): remove erroneous "fast path" for string + * - -2007-11-06 Geoffrey Garen - - Reviewed by Eric Seidel. - - Added toJSNumber, a fast path for converting a JSValue to a JS number, - and deployed it in postfix expressions. In the fast case this - eliminates a call to jsNumber. - - 0.4% speedup on SunSpider. - - * ChangeLog: - * kjs/nodes.cpp: - (KJS::PostIncResolveNode::evaluate): - (KJS::PostIncLocalVarNode::evaluate): - (KJS::PostDecResolveNode::evaluate): - (KJS::PostDecLocalVarNode::evaluate): - (KJS::PostIncBracketNode::evaluate): - (KJS::PostDecBracketNode::evaluate): - (KJS::PostIncDotNode::evaluate): - (KJS::PostDecDotNode::evaluate): - (KJS::UnaryPlusNode::evaluate): - * kjs/value.h: - (KJS::JSValue::toJSNumber): - -2007-11-06 Darin Adler - - Reviewed by Maciej. - - - http://bugs.webkit.org/show_bug.cgi?id=15846 - REGRESSION (r27387): Memory corruption when running fast/js/kde/delete.html - - There was a mistake in the algorithm used to find an empty slot in the property - map entries vector; when we were putting in a new property value and not overwriting - an existing deleted sentinel, we would enlarge the entries vector, but would not - overwrite the stale data that's in the new part. It was easy to pin this down by - turning on property map consistency checks -- I never would have landed with this - bug if I had run the regression tests once with consistency checks on! - - * kjs/property_map.cpp: (KJS::PropertyMap::put): Changed logic for the case where - foundDeletedElement is false to always use the item at the end of the entries vector. - Also allowed me to merge with the logic for the "no deleted sentinels at all" case. - -2007-11-06 Oliver Hunt - - RS=Darin. - - Fix previous patch to use a 3 bit shift, a 16 bit shift causes a regression in sunspider. - - * kjs/nodes.cpp: - (KJS::add): - -2007-11-06 Oliver Hunt - - Reviewed by Darin. - - Replace boolean comparisons in AddNode with mask - comparisons for a 0.2% improvement in sunspider. - - * JavaScriptCore.xcodeproj/project.pbxproj: - * kjs/nodes.cpp: - (KJS::add): - -2007-11-06 Eric Seidel - - Reviewed by darin. - - SunSpider claims this is a 1.1% speedup. - - * kjs/nodes.cpp: - (KJS::throwOutOfMemoryError): Added, non inline. - (KJS::addSlowCase): renamed from add(), non inline. - (KJS::add): add fast path for String + String, Number + Number and String + * - -2007-11-06 Eric Seidel - - Reviewed by mjs. - - Avoid more UString creation. - - SunSpider claims this is a 0.4% speedup. - - * kjs/regexp_object.cpp: - (KJS::RegExpObjectImp::construct): use UString::find(UChar) - -2007-11-05 Mark Rowe - - Mac build fix. - - * kjs/array_object.cpp: - (KJS::ArrayProtoFunc::callAsFunction): - -2007-11-05 Adam Roben - - Windows build fix - - * kjs/list.h: - -2007-11-05 Mark Rowe - - Build fix. Add missing #include. - - * kjs/operations.cpp: - -2007-11-05 Eric Seidel - - Reviewed by mjs. - - Remove another call to toString(exec) - - SunSpider claims this is a 0.5% speedup. - - * kjs/operations.cpp: - (KJS::equal): remove another toString - -2007-11-05 Eric Seidel - - * kjs/operations.cpp: - (KJS::equal): correct broken change. - -2007-11-05 Eric Seidel - - Reviewed by mjs. - - Remove one more call to toString(exec). - - SunSpider claims this is a 0.7% speedup. - - * kjs/operations.cpp: - (KJS::equal): remove a call to toString() - -2007-11-05 Mark Rowe - - Gtk build fix. - - * pcre/pcre.pri: - -2007-11-05 Mark Rowe - - Gtk build fix. - - * kjs/list.cpp: - -2007-11-05 Geoffrey Garen - - Touched a file to test my new HTTP access. - - * kjs/scope_chain.cpp: - -2007-11-05 Alp Toker - - Unreviewed build fix for qmake-based ports. - - Someone with a better understanding of qmake still needs to sort out - the INCLUDEPATH/DEPENDPATH mess. - - * JavaScriptCore.pri: - -2007-11-05 Geoffrey Garen - - Reviewed by Darin Adler. - - http://bugs.webkit.org/show_bug.cgi?id=15835 - - Switched List implementation from a custom heap allocator to an inline - Vector, for a disappointing .5% SunSpider speedup. - - Also renamed List::slice to List::getSlice because "get" is the - conventional prefix for functions returning a value through an out - parameter. - - * kjs/array_object.cpp: - (KJS::ArrayProtoFunc::callAsFunction): Removed some redundant function - calls and memory accesses. - - * kjs/bool_object.cpp: - (BooleanObjectImp::construct): Removed questionable use of iterator. - - * kjs/list.cpp: - * kjs/list.h: New List class, implemented in terms of Vector. Two - interesting differences: - 1. The inline capacity is 8, not 5. Many of the Lists constructed - during a SunSpider run are larger than 5; almost none are larger - than 8. - - 2. The growth factor is 4, not 2. Since we can guarantee that Lists - aren't long-lived, we can grow them more aggressively, to avoid - excessive copying. - - * kjs/regexp_object.cpp: - (RegExpObjectImp::construct): Removed redundant function calls. - - * kjs/string_object.cpp: - (KJS::StringObjectImp::construct): Removed questionable use of iterator. - - * wtf/Vector.h: - (WTF::::uncheckedAppend): Added a fast, unchecked version of append. - -2007-11-05 Mark Rowe - - Reviewed by Alp Toker. - - Add DEPENDPATH to JavaScriptCore and pcre to help qmake with dependencies. - - * JavaScriptCore.pri: - * pcre/pcre.pri: - -2007-11-04 Darin Adler - - Reviewed by Maciej. - - - http://bugs.webkit.org/show_bug.cgi?id=15826 - optimize opcode loop and case insensitive ASCII compares for a 30% speedup - - SunSpider says it's 2.6% faster overall, 32.5% in the regular expression tests. - - * pcre/pcre_internal.h: Added OP_ASCII_CHAR and OP_ASCII_LETTER_NC. - - * pcre/pcre_compile.c: - (find_fixedlength): Added cases for OP_ASCII_CHAR and OP_ASCII_LETTER_NC. Also - added OP_NOT since there was no reason it should not be in here. - (could_be_empty_branch): Ditto. - (compile_branch): Streamlined all the single-character cases; there was a bit of - duplicate code. Added cases for OP_ASCII_CHAR and OP_ASCII_LETTER_NC as needed. - But in particular, compile to those opcodes when the single character match is - ASCII. - (find_firstassertedchar): Added cases for OP_ASCII_CHAR and OP_ASCII_LETTER_NC. - - * pcre/pcre_exec.c: (match): Removed the "min", "minimize", and "op" fields from - the matchframe, after I discovered that none of them needed to be saved and restored - across recursive match calls. Also eliminated the ignored result field from the - matchframe, since I discovered that rrc ("recursive result code") was already the - exact same thing. Moved the handling of opcodes higher than OP_BRA into the default - statement of the switch instead of doing them before the switch. This removes a - branch from each iteration of the opcode interpreter, just as removal of "op" - removed at least one store from each iteration. Last, but not least, add the - OP_ASCII_CHAR and OP_ASCII_LETTER_NC functions. Neither can ever match a - surrogate pair and the letter case can be handled efficiently. - -2007-11-04 Darin Adler - - * pcre/pcre_exec.c: (match): Try to fix the Windows build by removing unreachable code. - -2007-11-03 Darin Adler - - - fix non-Mac builds; remove some more unused PCRE stuff - - * pcre/pcre_compile.c: - (compile_branch): Removed branch chain and some unused ESC values. - (compile_regex): Ditto. - (jsRegExpCompile): Ditto. - * pcre/pcre_exec.c: - (match): Removed unused branch targets. Don't use macros any more. - (jsRegExpExecute): More of the same. - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Update for removed files. - * JavaScriptCore.xcodeproj/project.pbxproj: Ditto. - * pcre/pcre.pri: Ditto. - - * pcre/MERGING: Removed. - * pcre/pcre_fullinfo.c: Removed. - * pcre/pcre_get.c: Removed. - * pcre/pcre_internal.h: - * pcre/ucp.h: Removed. - -2007-11-03 Darin Adler - - Reviewed by Maciej. - - - http://bugs.webkit.org/show_bug.cgi?id=15821 - remove unused PCRE features for speed - - A first step toward removing the PCRE features we don't use. - This gives a 0.8% speedup on SunSpider, and a 6.5% speedup on - the SunSpider regular expression test. - - Replaced the public interface with one that doesn't use the - name PCRE. Removed code we don't need for JavaScript and various - configurations we don't use. This is in preparation for still - more changes in the future. We'll probably switch to C++ and - make some even more significant changes to the regexp engine - to get some additional speed. - - There's probably additional unused stuff that I haven't - deleted yet. - - This does mean that our PCRE is now a fork, but I think that's - not really a big deal. - - * JavaScriptCore.exp: Remove the 5 old entry points and add - the 3 new entry points for WebCore's direct use of the regular - expression engine. - - * kjs/config.h: Remove the USE(PCRE16) define. I decided to flip - its sense and now there's a USE(POSIX_REGEX) instead, which should - probably not be set by anyone. Maybe later we'll just get rid of it - altogether. - - * kjs/regexp.h: - * kjs/regexp.cpp: - (KJS::RegExp::RegExp): Switch to new jsRegExp function names and - defines. Cut down on the number of functions used. - (KJS::RegExp::~RegExp): Ditto. - (KJS::RegExp::match): Ditto. - - * pcre/dftables.c: (main): Get rid of ctype_letter and ctype_meta, - which are unused. - - * pcre/pcre-config.h: Get rid of EBCIDIC, PCRE_DATA_SCOPE, const, - size_t, HAVE_STRERROR, HAVE_MEMMOVE, HAVE_BCOPY, NEWLINE, - POSIX_MALLOC_THRESHOLD, NO_RECURSE, SUPPORT_UCP, SUPPORT_UTF8, - and JAVASCRIPT. These are all no longer configurable in our copy - of the library. - - * pcre/pcre.h: Remove the macro-based kjs prefix hack, the PCRE - version macros, PCRE_UTF16, the code to set up PCRE_DATA_SCOPE, - the include of , and most of the constants and - functions defined in this header. Changed the naming scheme to - use a JSRegExp prefix rather than a pcre prefix. In the future, - we'll probably change this to be a C++ header. - - * pcre/pcre_compile.c: Removed all unused code branches, - including many whole functions and various byte codes. - Kept changes outside of removal to a minimum. - (check_escape): - (first_significant_code): - (find_fixedlength): - (find_recurse): - (could_be_empty_branch): - (compile_branch): - (compile_regex): - (is_anchored): - (is_startline): - (find_firstassertedchar): - (jsRegExpCompile): Renamed from pcre_compile2 and changed the - parameters around a bit. - (jsRegExpFree): Added. - - * pcre/pcre_exec.c: Removed many unused opcodes and variables. - Also started tearing down the NO_RECURSE mechanism since it's - now the default. In some cases there were things in the explicit - frame that could be turned into plain old local variables and - other small like optimizations. - (pchars): - (match_ref): - (match): Changed parameters quite a bit since it's now not used - recursively. - (jsRegExpExecute): Renamed from pcre_exec. - - * pcre/pcre_internal.h: Get rid of PCRE_DEFINITION, PCRE_SPTR, - PCRE_IMS, PCRE_ICHANGED, PCRE_NOPARTIAL, PCRE_STUDY_MAPPED, - PUBLIC_OPTIONS, PUBLIC_EXEC_OPTIONS, PUBLIC_DFA_EXEC_OPTIONS, - PUBLIC_STUDY_OPTIONS, MAGIC_NUMBER, 16 of the opcodes, - _pcre_utt, _pcre_utt_size, _pcre_try_flipped, _pcre_ucp_findprop, - and _pcre_valid_utf8. Also moved pcre_malloc and pcre_free here. - - * pcre/pcre_maketables.c: Changed to only compile in dftables. - Also got rid of many of the tables that we don't use. - - * pcre/pcre_tables.c: Removed the unused Unicode property tables. - - * pcre/pcre_ucp_searchfuncs.c: Removed everything except for - _pcre_ucp_othercase. - - * pcre/pcre_xclass.c: (_pcre_xclass): Removed uneeded support - for classes based on Unicode properties. - - * wtf/FastMallocPCRE.cpp: Removed unused bits. It would be good - to eliminate this completely, but we need the regular expression - code to be C++ first. - - * pcre/pcre_fullinfo.c: - * pcre/pcre_get.c: - * pcre/ucp.h: - Files that are no longer needed. I didn't remove them with this - check-in, because I didn't want to modify all the project files. - -2007-11-03 Maciej Stachowiak - - Reviewed by Sam. - - - remove NaN check from JSImmediate::fromDouble for 0.5% SunSpider speedup - - It turns out that doing this check costs more than it saves. - - * kjs/JSImmediate.h: - (KJS::JSImmediate::fromDouble): - -2007-11-03 Sam Weinig - - Reviewed by Oliver. - - Remove dummy variable from ClassInfo reducing the size of the struct by 1 word. - The variable had been kept around for binary compatibility, but since nothing - else is there is no point in continuing to keep it around. - - * API/JSCallbackConstructor.cpp: - * API/JSCallbackFunction.cpp: - * API/JSCallbackObject.cpp: - * bindings/objc/objc_runtime.mm: - * bindings/runtime_array.cpp: - * bindings/runtime_object.cpp: - * kjs/array_instance.cpp: - * kjs/array_object.cpp: - * kjs/bool_object.cpp: - * kjs/date_object.cpp: - * kjs/error_object.cpp: - * kjs/function.cpp: - * kjs/internal.cpp: - * kjs/lookup.h: - * kjs/math_object.cpp: - * kjs/number_object.cpp: - * kjs/object.h: - * kjs/regexp_object.cpp: - * kjs/string_object.cpp: - -2007-11-03 Kevin McCullough - - - Updated testkjs results to make the build bots green until we - can fix the tests that are failing. The new failures are in DST. - - * tests/mozilla/expected.html: - -2007-11-03 Maciej Stachowiak - - Reviewed by Adam. - - - don't print the var twice for ForInNodes with a var declaration - - * kjs/nodes2string.cpp: - (KJS::ForInNode::streamTo): - -2007-11-03 Darin Adler - - * pcre/pcre_compile.c: (check_escape): Windows build fix. Get rid of - C-incompatible declaration. - -2007-11-03 Mark Rowe - - Gtk build fix. - - * kjs/nodes.cpp: Add missing include. - -2007-11-03 Darin Adler - - Reviewed by Maciej. - - - fix http://bugs.webkit.org/show_bug.cgi?id=15814 - fast/js/kde/encode_decode_uri.html fails - - These changes cause us to match the JavaScript specification and pass the - fast/js/kde/encode_decode_uri.html test. - - * kjs/function.cpp: (KJS::encode): Call the UTF-8 string conversion in its - new strict mode, throwing an exception if there are malformed UTF-16 surrogate - pairs in the text. - - * kjs/ustring.h: Added a strict version of the UTF-8 string conversion. - * kjs/ustring.cpp: - (KJS::decodeUTF8Sequence): Removed code to disallow U+FFFE and U+FFFF; while - those might be illegal in some sense, they aren't supposed to get any special - handling in the place where this function is currently used. - (KJS::UString::UTF8String): Added the strictness. - -2007-11-03 Darin Adler - - Reviewed by Maciej. - - - http://bugs.webkit.org/show_bug.cgi?id=15812 - some JavaScript tests (from the Mozilla test suite) are failing - - Two or three fixes get 7 more of the Mozilla tests passing. - This gets us down from 61 failing tests to 54. - - * kjs/interpreter.h: (KJS::Interpreter::builtinRegExp): - Made this inline and gave it a more specific type. Some day we should - probably do that for all of these -- might even get a bit of a speed - boost from it. - * kjs/interpreter.cpp: Removed Interpreter::builtinRegExp now that it's - inline in the header. - - * kjs/regexp_object.h: - * kjs/regexp_object.cpp: - (KJS::RegExpProtoFunc::callAsFunction): Moved test and exec out of the - switch statement into the RegExpImp object, so they can be shared with - RegExpImp::callAsFunction. - (KJS::RegExpImp::match): Added. Common code used by both test and exec. - (KJS::RegExpImp::test): Added. - (KJS::RegExpImp::exec): Added. - (KJS::RegExpImp::implementsCall): Added. - (KJS::RegExpImp::callAsFunction): Added. - (KJS::RegExpObjectImpPrivate::RegExpObjectImpPrivate): Initialize - lastInput to null rather than empty string -- we take advantage of the - difference in RegExpImp::match. - (KJS::RegExpObjectImp::input): Added. No reason to go through hash tables - just to get at a field like this. - - * pcre/pcre_compile.c: (check_escape): Changed the \u handling to match - the JavaScript specification. If there are not 4 hex digits after the \u, - then it's processed as if it wasn't an escape sequence at all. - - * pcre/pcre_internal.h: Added IS_NEWLINE, with the appropriate definition - for JavaScript (4 specific Unicode values). - * pcre/pcre_exec.c: - (match): Changed all call sites to use IS_NEWLINE. - (pcre_exec): Ditto. - - * tests/mozilla/expected.html: Updated to expect 7 more successful tests. - -2007-11-03 David D. Kilzer - - Sort files(...); sections of Xcode project files. - - Rubber-stamped by Darin. - - * JavaScriptCore.xcodeproj/project.pbxproj: - -2007-11-03 Maciej Stachowiak - - Reviewed by Oliver. - - - remove VarDeclListNode and simplify VarDeclNode evaluation for 0.4% SunSpider speedup - - * kjs/grammar.y: - * kjs/nodes.cpp: - (KJS::VarDeclNode::optimizeVariableAccess): - (KJS::VarDeclNode::getDeclarations): - (KJS::VarDeclNode::handleSlowCase): - (KJS::VarDeclNode::evaluateSingle): - (KJS::VarDeclNode::evaluate): - (KJS::VarStatementNode::execute): - * kjs/nodes.h: - (KJS::VarDeclNode::): - (KJS::VarStatementNode::): - * kjs/nodes2string.cpp: - (KJS::VarDeclNode::streamTo): - -2007-11-03 Alexey Proskuryakov - - Reviewed by Darin. - - http://bugs.webkit.org/show_bug.cgi?id=15800 - REGRESSION (r27303): RegExp leaks - - * kjs/regexp_object.h: - (KJS::RegExpImp::setRegExp): - (KJS::RegExpImp::regExp): - (KJS::RegExpImp::classInfo): - * kjs/regexp_object.cpp: - (RegExpImp::RegExpImp): - (RegExpImp::~RegExpImp): - Renamed reg member variable to m_regExp, changed it to use OwnPtr. - -2007-11-02 Maciej Stachowiak - - Reviewed by Oliver. - - - add SourceElements as a typedef for Vector >. - - * kjs/grammar.y: - * kjs/nodes.cpp: - (KJS::statementListPushFIFO): - (KJS::statementListGetDeclarations): - (KJS::statementListInitializeDeclarationStacks): - (KJS::statementListInitializeVariableAccessStack): - (KJS::statementListExecute): - (KJS::BlockNode::BlockNode): - (KJS::FunctionBodyNode::FunctionBodyNode): - (KJS::ProgramNode::ProgramNode): - * kjs/nodes.h: - (KJS::CaseClauseNode::): - -2007-11-02 Darin Adler - - Reviewed by Maciej. - - - http://bugs.webkit.org/show_bug.cgi?id=15791 - change property map data structure for less memory use, better speed - - The property map now has an array of indices and a separate array of - property map entries. This slightly slows down lookup because of a second - memory acess, but makes property maps smaller and faster to iterate in - functions like mark(). - - SunSpider says this is 1.2% faster, although it makes the bitwise-end test - more than 10% slower. To fix that we'll need to optimize global variable lookup. - - * kjs/property_map.cpp: - (KJS::PropertyMapEntry::PropertyMapEntry): - (KJS::PropertyMapHashTable::entries): - (KJS::PropertyMapHashTable::allocationSize): - (KJS::SavedProperties::SavedProperties): - (KJS::SavedProperties::~SavedProperties): - (KJS::PropertyMap::checkConsistency): - (KJS::PropertyMap::~PropertyMap): - (KJS::PropertyMap::clear): - (KJS::PropertyMap::get): - (KJS::PropertyMap::getLocation): - (KJS::PropertyMap::put): - (KJS::PropertyMap::insert): - (KJS::PropertyMap::createTable): - (KJS::PropertyMap::rehash): - (KJS::PropertyMap::remove): - (KJS::PropertyMap::mark): - (KJS::comparePropertyMapEntryIndices): - (KJS::PropertyMap::containsGettersOrSetters): - (KJS::PropertyMap::getEnumerablePropertyNames): - (KJS::PropertyMap::save): - (KJS::PropertyMap::restore): - * kjs/property_map.h: - -2007-11-02 Darin Adler - - Reviewed by Maciej. - - - http://bugs.webkit.org/show_bug.cgi?id=15807 - HashMap needs a take() function that combines get and remove - - * wtf/HashMap.h: Added take function. Simplistic implementation for now, - but still does only one hash table lookup. - - * kjs/array_instance.cpp: (KJS::ArrayInstance::put): Use take rather than - a find followed by a remove. - -2007-11-02 David Carson - - Reviewed by Darin. - - Fix compiler warning "warning: suggest parentheses around && within ||" - http://bugs.webkit.org/show_bug.cgi?id=15764 - - * kjs/value.h: (KJS::JSValue::isNumber): Add parentheses. - -2007-11-01 Geoffrey Garen - - Reviewed by Maciej Stachowiak. - - In preparation for making List a simple stack-allocated Vector: - - Removed all instances of List copying and/or assignment, and made List - inherit from Noncopyable. - - Functions that used to return a List by copy now take List& out - parameters. - - Layout tests and JS tests pass. - - * kjs/list.cpp: - (KJS::List::slice): Replaced copyTail with a more generic slice - alternative. (JavaScriptCore only calls slice(1), but WebCore calls - slice(2)). - -2007-11-01 Geoffrey Garen - - Reviewed by Maciej Stachowiak. - - Fixed http://bugs.webkit.org/show_bug.cgi?id=15785 - REGRESSION(r27344): Crash on load at finance.yahoo.com - - Reverted a small portion of my last check-in. (The speedup and the List - removal are still there, though.) - - ActivationImp needs to hold a pointer to its function, and mark that - pointer (rather than accessing its function through its ExecState, and - counting on the active scope to mark its function) because a closure - can cause an ActivationImp to outlive its ExecState along with any - active scope. - - * kjs/ExecState.cpp: - (KJS::ExecState::ExecState): - * kjs/function.cpp: - (KJS::FunctionImp::~FunctionImp): - (KJS::ActivationImp::ActivationImp): - * kjs/function.h: - (KJS::ActivationImp::ActivationImpPrivate::ActivationImpPrivate): - - Also made HashTable a little more crash-happy in debug builds, so - problems like this will show up earlier: - - * wtf/HashTable.h: - (WTF::HashTable::~HashTable): - -2007-11-01 Geoffrey Garen - - Reviewed by Adam Roben. - - Addressed some of Darin's review comments. - - Used perl -p, which is the shorthand while(<>) {}. - - Made sure not to suppress bison's output. - - Added line to removed bison_out.txt, since this script removes other - intermediate files, too. - - * DerivedSources.make: - -2007-11-01 Geoffrey Garen - - Reviewed by Oliver Hunt. - - Removed List from ActivationImp, in preparation for making all lists - stack-allocated. - - Tests pass. - - 1.0% speedup on SunSpider, presumably due to reduced List refcount thrash. - - * kjs/ExecState.cpp: - (KJS::ExecState::ExecState): - (KJS::ExecState::~ExecState): - * kjs/function.cpp: - (KJS::ActivationImp::ActivationImp): - (KJS::ActivationImp::createArgumentsObject): - * kjs/function.h: - (KJS::ActivationImp::ActivationImpPrivate::ActivationImpPrivate): - -2007-11-01 Adam Roben - - Use jsNumberCell instead of jsNumber when converting double constants to JSValues - - This fixes fast/js/math.html, ecma/Date/15.9.5.10-1.js, and - ecma/Date/15.9.5.12-1.js, which were suffering from a bug in MSVC. - - It also gets rid of an MSVC warning that we previously had to silence. - - Reviewed by Geoff. - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Turn - back on the "overflow in constant arithmetic" warning. - * kjs/number_object.cpp: - (NumberObjectImp::getValueProperty): Use jsNumberCell instead of - jsNumber. - -2007-10-31 Adam Roben - - Windows build fix - - * kjs/ExecState.h: - -2007-10-31 Maciej Stachowiak - - Reviewed by Oliver. - - - shave some cycles off of local storage access for a 1% SunSpider speedup - - Keep the LocalStorage pointer in the ExecState, instead of getting - it from the ActivationImp all the time. - - * kjs/ExecState.cpp: - (KJS::ExecState::updateLocalStorage): - * kjs/ExecState.h: - (KJS::ExecState::localStorage): - * kjs/nodes.cpp: - (KJS::LocalVarAccessNode::evaluate): - (KJS::LocalVarFunctionCallNode::evaluate): - (KJS::PostIncLocalVarNode::evaluate): - (KJS::PostDecLocalVarNode::evaluate): - (KJS::LocalVarTypeOfNode::evaluate): - (KJS::PreIncLocalVarNode::evaluate): - (KJS::PreDecLocalVarNode::evaluate): - (KJS::ReadModifyLocalVarNode::evaluate): - (KJS::AssignLocalVarNode::evaluate): - (KJS::FunctionBodyNode::processDeclarationsForFunctionCode): - -2007-10-31 Adam Roben - - Fix a crash on launch due to a static initializer race - - We now use fast inline assembler spinlocks which can be statically - initialized at compile time. - - As a side benefit, this speeds up SunSpider by 0.4%. - - Reviewed by Oliver. - - * wtf/FastMalloc.cpp: - * wtf/TCSpinLock.h: - (TCMalloc_SpinLock::Lock): - (TCMalloc_SpinLock::Unlock): - (TCMalloc_SlowLock): - * wtf/TCSystemAlloc.cpp: - -2007-10-31 Kevin McCullough - - Reviewed by Sam. - - - Corrected spelling. - - * wtf/HashTraits.h: - -2007-10-31 Mark Rowe - - Further Gtk build fixage. - - * kjs/regexp_object.cpp: - -2007-10-31 Mark Rowe - - Gtk build fix. - - * kjs/regexp.h: - -2007-10-31 Darin Adler - - Reviewed by Maciej. - - - fix http://bugs.webkit.org/show_bug.cgi?id=15749 - RegExp/RegExpObjectImp cause needless UString creation - - Speeds things up 0.4% according to SunSpider. - - * kjs/config.h: Define USE(PCRE16) instead of HAVE(PCREPOSIX), - because this library doesn't use the real PCRE -- it uses its - own PCRE that works on UTF-16. - - * kjs/regexp.h: Removed a few unused functions. Changed the ifdef. - Use Noncopyable. Change the return value of match. - * kjs/regexp.cpp: - (KJS::RegExp::RegExp): Call pcre_compile2, for a slight speed boost. - (KJS::RegExp::~RegExp): PCRE16 rather than PCREPOSIX. - (KJS::RegExp::match): Change to return the position as an int and the - ovector as a OwnArrayPtr for efficiency and clearer storage management. - - * kjs/regexp_object.h: Change performMatch and arrayOfMatches to no longer - require a result string. - * kjs/regexp_object.cpp: - (RegExpProtoFunc::callAsFunction): Update for new signature of performMatch. - (RegExpObjectImp::performMatch): Change so it doesn't return a string. - (RegExpObjectImp::arrayOfMatches): Simplify by unifying the handling of - the main result with the backreferences; now it doesn't need to take - a result parameter. - (RegExpObjectImp::getBackref): Minor tweaks. - (RegExpObjectImp::getLastParen): Ditto. - (RegExpObjectImp::getLeftContext): Ditto. - (RegExpObjectImp::getRightContext): Ditto. - (RegExpObjectImp::getValueProperty): Change LastMatch case to call - getBackref(0) so we don't need a separate getLastMatch function. - - * kjs/string_object.cpp: - (KJS::replace): Update to use new performMatch, including merging the - matched string section with the other substrings. - (KJS::StringProtoFunc::callAsFunction): Update functions to use the - new performMatch and match. Also change to use OwnArrayPtr. - -2007-10-31 Oliver Hunt - - * kjs/nodes.h: include OwnPtr.h - -2007-10-31 Oliver Hunt - - Reviewed by Maciej. - - Remove SourceCodeElement class and replaced with a Vector for a 0.8% gain on sunspider - - * kjs/grammar.y: - * kjs/nodes.cpp: - (KJS::statementListPushFIFO): - (KJS::statementListGetDeclarations): - (KJS::statementListInitializeDeclarationStacks): - (KJS::statementListInitializeVariableAccessStack): - (KJS::statementListExecute): - (KJS::BlockNode::optimizeVariableAccess): - (KJS::BlockNode::BlockNode): - (KJS::BlockNode::getDeclarations): - (KJS::BlockNode::execute): - (KJS::CaseClauseNode::optimizeVariableAccess): - (KJS::CaseClauseNode::getDeclarations): - (KJS::CaseClauseNode::evalStatements): - (KJS::FunctionBodyNode::initializeDeclarationStacks): - (KJS::FunctionBodyNode::optimizeVariableAccess): - * kjs/nodes.h: - * kjs/nodes2string.cpp: - (KJS::statementListStreamTo): - (KJS::BlockNode::streamTo): - (KJS::CaseClauseNode::streamTo): - -2007-10-30 Mark Rowe - - * kjs/property_map.cpp: Added a missing using directive to fix the build - for non-Mac ports. Mac worked only because it does the AllInOneFile compile. - -2007-10-31 Maciej Stachowiak - - * kjs/property_map.cpp: Include HashTable.h the right way to fix the build - for non-Mac ports. - -2007-10-31 Alexey Proskuryakov - - Reviewed by Darin. - - http://bugs.webkit.org/show_bug.cgi?id=11001 - WebKit doesn't support RegExp.compile method - - Test: fast/js/regexp-compile.html - - * kjs/regexp_object.cpp: - (RegExpPrototype::RegExpPrototype): - (RegExpProtoFunc::callAsFunction): - * kjs/regexp_object.h: - (KJS::RegExpProtoFunc::): - Added RegExp.compile. - - * tests/mozilla/expected.html: js1_2/regexp/compile.js now passes. - -2007-10-31 Maciej Stachowiak - - Reviewed by Oliver. - - - get rid of integer divide in PropertyMap and HashTable for 1% SunSpider speedup - - Integer divide sucks. Fortunately, a bunch of shifts and XORs - biased towards the high bits is sufficient to provide a good - double hash. Besides the SunSpider win, I used the dump statistics - mode for both to verify that collisions did not increase and that - the longest collision chain is not any longer. - - * kjs/property_map.cpp: - (KJS::doubleHash): - (KJS::PropertyMap::get): - (KJS::PropertyMap::getLocation): - (KJS::PropertyMap::put): - (KJS::PropertyMap::insert): - (KJS::PropertyMap::remove): - (KJS::PropertyMap::checkConsistency): - * wtf/HashTable.h: - (WTF::doubleHash): - (WTF::::lookup): - (WTF::::lookupForWriting): - (WTF::::fullLookupForWriting): - (WTF::::add): - -2007-10-30 Adam Roben - - * kjs/collector.h: Make HeapType public so it can be used for non-member - things like the HeapConstants struct template. Fixes the build on Windows. - -2007-10-30 Adam Roben - - Change ALWAYS_INLINE and WTF_PRIVATE_INLINE to use __forceinline on Windows - - Speeds up SunSpider by 0.4%. - - Reviewed by Steve and Maciej. - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Disable - a warning during LTCG in release builds about double -> float - conversion. - * wtf/AlwaysInline.h: - * wtf/FastMalloc.h: - -2007-10-30 Adam Roben - - Use GetCurrentThreadId instead of pthread_self in FastMalloc - - Speeds up SunSpider by 0.3%. - - Reviewed by Steve. - - * wtf/FastMalloc.cpp: - (WTF::TCMalloc_ThreadCache::InitTSD): - (WTF::TCMalloc_ThreadCache::CreateCacheIfNecessary): - -2007-10-30 Adam Roben - - Switch to a Win32 critical section implementation of spinlocks - - Speeds up SunSpider by 0.4%. - - Reviewed by Steve. - - * wtf/FastMalloc.cpp: - * wtf/TCSpinLock.h: - (TCMalloc_SpinLock::TCMalloc_SpinLock): - (TCMalloc_SpinLock::Init): - (TCMalloc_SpinLock::Finalize): - (TCMalloc_SpinLock::Lock): - (TCMalloc_SpinLock::Unlock): - * wtf/TCSystemAlloc.cpp: - -2007-10-30 Adam Roben - - Fix Bug 15586: REGRESSION (r26759-r26785): Windows nightly builds crash with Safari 3 Public Beta - - http://bugs.webkit.org/show_bug.cgi?id=15586 - - Also fixes: Cannot use regsvr32.exe to register WebKit.dll - - Use Win32 TLS functions instead of __declspec(thread), which breaks - delay-loading. - - Reviewed by Steve. - - * wtf/FastMalloc.cpp: - (WTF::getThreadHeap): - (WTF::TCMalloc_ThreadCache::InitModule): - -2007-10-30 Maciej Stachowiak - - Reviewed by Oliver. - - - allocate numbers in half-size cells, for an 0.5% SunSpider speedup - http://bugs.webkit.org/show_bug.cgi?id=15772 - - We do this by using a single mark bit per two number cells, and - tweaking marking. - - Besides being an 0.5% win overall, this is a 7.1% win on morph. - - * kjs/collector.cpp: - (KJS::Collector::heapAllocate): - (KJS::Collector::markStackObjectsConservatively): - (KJS::Collector::sweep): - * kjs/collector.h: - (KJS::SmallCollectorCell::): - -2007-10-30 Geoffrey Garen - - Reviewed by Adam Roben, Sam Weinig. - - Made conflicts in grammar.y a persistent build failure. - - * DerivedSources.make: - -2007-10-30 Kevin McCullough - - Reviewed by Adam and Geoff. - - - Added a new cast so all the casts are in the same place. - - * API/APICast.h: - (toGlobalRef): - -2007-10-30 Geoffrey Garen - - Reviewed by Darin Adler. - - Fixed shift/reduce conflict introduced in r24457 - - JS tests, including - - ecma_2/Statements/dowhile-001.js - ecma_2/Statements/dowhile-002.js - ecma_2/Statements/dowhile-003.js - ecma_2/Statements/dowhile-004.js - ecma_2/Statements/dowhile-005.js - ecma_2/Statements/dowhile-006.js - ecma_2/Statements/dowhile-007.js - js1_2/statements/do_while.js - - and layout tests, including - - do-while-expression-value.html - do-while-semicolon.html - do-while-without-semicolon.html - - pass. - - * kjs/grammar.y: Use the explicit "error" production, as we do with other - automatic semicolon insertions, to disambiguate "do { } while();" from - "do { } while()" followed by ";" (the empty statement). - -2007-10-29 Oliver Hunt - - Reviewed by Maciej. - - Debranching remaining assignment nodes, and miscellaneous cleanup - - Split read-modify code paths out of AssignBracketNode and AssignDotNode - Removed now unnecessary check for write-only assignment in ReadModifyLocalVarNode - and ReadModifyResolveNode evaluate methods - - Leads to a 1% gain in SunSpider. - - * kjs/grammar.y: - * kjs/nodes.cpp: - (KJS::ReadModifyLocalVarNode::evaluate): - (KJS::ReadModifyResolveNode::evaluate): - (KJS::AssignDotNode::evaluate): - (KJS::ReadModifyDotNode::optimizeVariableAccess): - (KJS::ReadModifyDotNode::evaluate): - (KJS::AssignBracketNode::evaluate): - (KJS::ReadModifyBracketNode::optimizeVariableAccess): - (KJS::ReadModifyBracketNode::evaluate): - * kjs/nodes.h: - (KJS::AssignBracketNode::): - (KJS::AssignBracketNode::precedence): - (KJS::AssignDotNode::): - (KJS::AssignDotNode::precedence): - * kjs/nodes2string.cpp: - (KJS::ReadModifyBracketNode::streamTo): - (KJS::AssignBracketNode::streamTo): - (KJS::ReadModifyDotNode::streamTo): - (KJS::AssignDotNode::streamTo): - -2007-10-29 Oliver Hunt - - Debranching various Node::evaluate implementations - - Reviewed by Maciej. - - Split the read-modify-write assignment cases out of AssignResolveNode and into ReadModifyResolveNode - Split the increment and decrement cases for Prefix- and Postfix- ResolveNode, BracketNode, and DotNode - - Gains 1.6% on SunSpider - - * JavaScriptCore.xcodeproj/project.pbxproj: - * kjs/grammar.y: - * kjs/nodes.cpp: - (KJS::PostIncResolveNode::optimizeVariableAccess): - (KJS::PostIncResolveNode::evaluate): - (KJS::PostIncLocalVarNode::evaluate): - (KJS::PostDecResolveNode::optimizeVariableAccess): - (KJS::PostDecResolveNode::evaluate): - (KJS::PostDecLocalVarNode::evaluate): - (KJS::PostIncBracketNode::evaluate): - (KJS::PostDecBracketNode::evaluate): - (KJS::PostIncDotNode::evaluate): - (KJS::PostDecDotNode::evaluate): - (KJS::PreIncResolveNode::optimizeVariableAccess): - (KJS::PreIncLocalVarNode::evaluate): - (KJS::PreIncResolveNode::evaluate): - (KJS::PreDecResolveNode::optimizeVariableAccess): - (KJS::PreDecLocalVarNode::evaluate): - (KJS::PreDecResolveNode::evaluate): - (KJS::PreIncBracketNode::evaluate): - (KJS::PreDecBracketNode::evaluate): - (KJS::PreIncDotNode::evaluate): - (KJS::PreDecDotNode::evaluate): - (KJS::ReadModifyResolveNode::optimizeVariableAccess): - (KJS::AssignResolveNode::optimizeVariableAccess): - (KJS::AssignLocalVarNode::evaluate): - (KJS::AssignResolveNode::evaluate): - * kjs/nodes.h: - (KJS::PostDecResolveNode::): - (KJS::PostDecResolveNode::precedence): - (KJS::PostDecLocalVarNode::): - (KJS::PostfixBracketNode::): - (KJS::PostfixBracketNode::precedence): - (KJS::PostIncBracketNode::): - (KJS::PostIncBracketNode::isIncrement): - (KJS::PostDecBracketNode::): - (KJS::PostDecBracketNode::isIncrement): - (KJS::PostfixDotNode::): - (KJS::PostfixDotNode::precedence): - (KJS::PostIncDotNode::): - (KJS::PostIncDotNode::isIncrement): - (KJS::PostDecDotNode::): - (KJS::PreIncResolveNode::): - (KJS::PreDecResolveNode::): - (KJS::PreDecResolveNode::precedence): - (KJS::PreDecLocalVarNode::): - (KJS::PrefixBracketNode::): - (KJS::PrefixBracketNode::precedence): - (KJS::PreIncBracketNode::): - (KJS::PreIncBracketNode::isIncrement): - (KJS::PreDecBracketNode::): - (KJS::PreDecBracketNode::isIncrement): - (KJS::PrefixDotNode::): - (KJS::PrefixDotNode::precedence): - (KJS::PreIncDotNode::): - (KJS::PreIncDotNode::isIncrement): - (KJS::PreDecDotNode::): - (KJS::ReadModifyResolveNode::): - (KJS::ReadModifyLocalVarNode::): - (KJS::AssignResolveNode::): - (KJS::AssignResolveNode::precedence): - * kjs/nodes2string.cpp: - (KJS::PostIncResolveNode::streamTo): - (KJS::PostDecResolveNode::streamTo): - (KJS::PostfixBracketNode::streamTo): - (KJS::PostfixDotNode::streamTo): - (KJS::PreIncResolveNode::streamTo): - (KJS::PreDecResolveNode::streamTo): - (KJS::ReadModifyResolveNode::streamTo): - (KJS::AssignResolveNode::streamTo): - -2007-10-29 Maciej Stachowiak - - Not reviewed, build fix. - - - Include Vector.h in a way that actually works. - - * kjs/LocalStorage.h: - -2007-10-29 Maciej Stachowiak - - Not reviewed, build fix. - - - Install LocalStorage.h as a private header. - - * JavaScriptCore.xcodeproj/project.pbxproj: - -2007-10-29 Maciej Stachowiak - - Reviewed by Darin. - - - Define good VectorTraits for LocalStorage entry for 0.5% speed improvement on SunSpider. - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - * kjs/LocalStorage.h: Added. - (KJS::LocalStorageEntry::LocalStorageEntry): - (WTF::): - * kjs/function.h: - * kjs/nodes.cpp: - (KJS::FunctionBodyNode::processDeclarationsForFunctionCode): - -2007-10-29 Geoffrey Garen - - Reviewed by Oliver Hunt. - - Some small tweaks that I notice while reviewing Oliver's last patch. - - Includes removal of an unnecessary KJS_CHECKEXCEPTIONVALUE. - - No change in SunSpider because SunSpider doesn't take the code path that - would execute the unnecessary KJS_CHECKEXCEPTIONVALUE much. - - * kjs/nodes.cpp: - (KJS::LocalVarPostfixNode::evaluate): - (KJS::TypeOfResolveNode::optimizeVariableAccess): - (KJS::LocalVarTypeOfNode::evaluate): - (KJS::PrefixResolveNode::optimizeVariableAccess): - (KJS::LocalVarPrefixNode::evaluate): - (KJS::AssignResolveNode::optimizeVariableAccess): - (KJS::LocalVarAssignNode::evaluate): - * kjs/nodes.h: - (KJS::LocalVarTypeOfNode::): - (KJS::PrefixResolveNode::): - (KJS::LocalVarPrefixNode::): - (KJS::AssignResolveNode::): - (KJS::LocalVarAssignNode::): - -2007-10-29 Eric Seidel - - Reviewed by Maciej. - - SunSpider claims this was a 0.7% speedup. - - * kjs/string_object.cpp: - (KJS::StringProtoFunc::callAsFunction): avoid mallocing a jsString in the common case - -2007-10-29 Maciej Stachowiak - - Reviewed by Mark. - - - re-enable asserts for access to empty or deleted keys - - * wtf/HashTable.h: - (WTF::::lookup): - (WTF::::lookupForWriting): - (WTF::::fullLookupForWriting): - (WTF::::add): - -2007-10-29 Eric Seidel - - Build fix only, no review. - - * JavaScriptCore.exp: Export symbol for new StringInstance::getOwnPropertySlot - -2007-10-29 Mark Rowe - - Gtk build fix. Move struct declarations into nodes.h. - - * kjs/grammar.y: - * kjs/nodes.h: - -2007-10-29 Eric Seidel - - Reviewed by darin. - - Give StringInstance a getOwnPropertySlot(ExecState, unsigned, PropertySlot) fastpath, just like Arrays. - Make it a compile time error to use toString(ExecState) on a StringInstance - - SunSpider claims this was a 6.6% speedup overall (22% on string-base64) - - * kjs/internal.h: - (KJS::StringImp::getLength): - * kjs/string_object.cpp: - (KJS::StringInstance::lengthGetter): - (KJS::StringInstance::inlineGetOwnPropertySlot): - (KJS::StringInstance::getOwnPropertySlot): - * kjs/string_object.h: - -2007-10-28 Oliver Hunt - - Reviewed by Darin. - - Add nodes to allow Assignment, TypeOf, and prefix operators to - make use of the new optimised local variable look up. - - 5% gain on sunspider - - * kjs/nodes.cpp: - (KJS::TypeOfResolveNode::optimizeVariableAccess): - (KJS::LocalTypeOfAccessNode::evaluate): - (KJS::PrefixResolveNode::optimizeVariableAccess): - (KJS::PrefixLocalAccessNode::evaluate): - (KJS::AssignResolveNode::optimizeVariableAccess): - (KJS::AssignLocalAccessNode::evaluate): - * kjs/nodes.h: - (KJS::TypeOfResolveNode::): - (KJS::TypeOfResolveNode::precedence): - (KJS::LocalTypeOfAccessNode::): - (KJS::PrefixResolveNode::): - (KJS::PrefixResolveNode::precedence): - (KJS::PrefixLocalAccessNode::): - (KJS::AssignResolveNode::): - (KJS::AssignLocalAccessNode::): - -2007-10-28 Maciej Stachowiak - - Reviewed by Darin. - - - avoid creating and then breaking circular lists in the parser, instead track head and tail pointers at parse time - http://bugs.webkit.org/show_bug.cgi?id=15748 - - Not a significant speedup or slowdown on SunSpider. - - * kjs/Parser.cpp: - (KJS::clearNewNodes): - * kjs/Parser.h: - * kjs/grammar.y: - * kjs/nodes.cpp: - (KJS::BlockNode::BlockNode): - (KJS::CaseBlockNode::CaseBlockNode): - (KJS::FunctionBodyNode::FunctionBodyNode): - (KJS::SourceElementsNode::SourceElementsNode): - (KJS::ProgramNode::ProgramNode): - * kjs/nodes.h: - (KJS::ElementNode::): - (KJS::ArrayNode::): - (KJS::PropertyListNode::): - (KJS::ObjectLiteralNode::): - (KJS::ArgumentListNode::): - (KJS::ArgumentsNode::): - (KJS::VarDeclListNode::): - (KJS::VarStatementNode::): - (KJS::ForNode::): - (KJS::ParameterNode::): - (KJS::FuncExprNode::): - (KJS::FuncDeclNode::): - (KJS::SourceElementsNode::): - (KJS::CaseClauseNode::): - (KJS::ClauseListNode::): - -2007-10-28 Mark Rowe - - Disable assertions in a manner that doesn't break the Qt Windows build. - - * wtf/HashTable.h: - (WTF::::lookup): - (WTF::::lookupForWriting): - (WTF::::fullLookupForWriting): - -2007-10-28 Geoffrey Garen - - Temporarily disabling some ASSERTs I introduced in my last check-in - because of http://bugs.webkit.org/show_bug.cgi?id=15747 - Lots of layout tests fail the !HashTranslator::equal(KeyTraits::emptyValue() ASSERT - - * wtf/HashTable.h: - (WTF::::lookup): - (WTF::::lookupForWriting): - (WTF::::fullLookupForWriting): - (WTF::::add): - -2007-10-28 Geoffrey Garen - - Reviewed by Darin Adler. - - Fixed http://bugs.webkit.org/show_bug.cgi?id=15746 - #ifndef ASSERT_DISABLED is no good! - - Replaced with #if !ASSERT_DISABLED. - - * wtf/HashTable.h: - (WTF::::lookup): - (WTF::::lookupForWriting): - (WTF::::fullLookupForWriting): - (WTF::::add): - -2007-10-28 Geoffrey Garen - - Reviewed by Darin Adler. - - Added FunctionCallResolveNode, PostfixResolveNode, and DeleteResolveNode - to the AST transfom that replaces slow resolve nodes with fast local - variable alternatives. - - 2.5% speedup on SunSpider. - - Also added some missing copyright notices. - - * kjs/nodes.cpp: - (KJS::FunctionCallResolveNode::optimizeVariableAccess): - (KJS::FunctionCallResolveNode::evaluate): - (KJS::LocalVarFunctionCallNode::evaluate): - (KJS::PostfixResolveNode::optimizeVariableAccess): - (KJS::PostfixResolveNode::evaluate): - (KJS::LocalVarPostfixNode::evaluate): - (KJS::DeleteResolveNode::optimizeVariableAccess): - (KJS::DeleteResolveNode::evaluate): - (KJS::LocalVarDeleteNode::evaluate): - * kjs/nodes.h: - (KJS::FunctionCallResolveNode::): - (KJS::LocalVarFunctionCallNode::LocalVarFunctionCallNode): - (KJS::PostfixResolveNode::): - (KJS::LocalVarPostfixNode::LocalVarPostfixNode): - (KJS::DeleteResolveNode::): - (KJS::LocalVarDeleteNode::LocalVarDeleteNode): - -2007-10-28 Eric Seidel - - Reviewed by darin. - - Inline UString::Rep::deref() for a 0.8% improvement in SunSpider - Add virtual keyword to a few virtual functions previously unmarked. - - * kjs/internal.h: - (KJS::StringImp::type): - (KJS::NumberImp::type): - * kjs/ustring.h: - (KJS::UString::Rep::deref): - -2007-10-28 Darin Adler - - - fix "broken everything" from the storage leak fix - - * wtf/RefPtr.h: (WTF::RefPtr::RefPtr): Added a PlacementNewAdopt constructor. - * kjs/ustring.h: (KJS::UString::UString): Pass PlacementNewAdopt along to RefPtr. - -2007-10-28 Darin Adler - - Reviewed by Adam. - - - turn on unused parameter waring on Mac OS X because it's already on elsewhere - - * Configurations/Base.xcconfig: Took out -wno-unused-parameter. - - * API/JSNode.c: - * API/JSNodeList.c: - * API/minidom.c: - * API/testapi.c: - Fixed unused variables by using them or marked them with UNUSED_PARAM. - - * kjs/CollectorHeapIntrospector.h: (KJS::CollectorHeapIntrospector::zoneCalloc): - Removed parameter names to indicate they are unused. - -2007-10-28 Darin Adler - - Reviewed by Maciej. - - - fix a storage leak where we ref the UString every time we replace - a ResolveNode with a LocalVarAccessNode - - * kjs/identifier.h: (KJS::Identifier::Identifier): Added a constructor - that takes PlacementNewAdopt. - - * kjs/nodes.h: (KJS::ResolveNode::ResolveNode): Initialize the ident - with PlacementNewAdopt instead of the old value of ident. - - * kjs/ustring.h: (KJS::UString::UString): Added a constructor that - takes PlacementNewAdopt. - -2007-10-28 Darin Adler - - - Windows build fix; get rid of unused parameter - - * kjs/nodes.cpp: (KJS::ResolveNode::optimizeVariableAccess): Don't pass it. - * kjs/nodes.h: (KJS::LocalVarAccessNode::LocalVarAccessNode): Remove it. - The assertions weren't all that helpful. - -2007-10-28 Mark Rowe - - Gtk build fix. Add include of MathExtras.h. - - * kjs/string_object.cpp: - -2007-10-28 Mark Rowe - - Reviewed by Maciej and Tim. - - Replace uses of isNaN and isInf with isnan and isinf, and - remove isNaN and isInf. - - * kjs/config.h: Remove unused HAVE_'s. - * kjs/date_object.cpp: - (KJS::DateInstance::getTime): - (KJS::DateInstance::getUTCTime): - (KJS::DateProtoFunc::callAsFunction): - (KJS::DateObjectImp::construct): - (KJS::DateObjectFuncImp::callAsFunction): - * kjs/function.cpp: - (KJS::GlobalFuncImp::callAsFunction): - * kjs/math_object.cpp: - (MathFuncImp::callAsFunction): - * kjs/nodes2string.cpp: - (KJS::isParserRoundTripNumber): - * kjs/number_object.cpp: - (NumberProtoFunc::callAsFunction): - * kjs/operations.cpp: - * kjs/operations.h: - * kjs/string_object.cpp: - (KJS::StringProtoFunc::callAsFunction): - * kjs/ustring.cpp: - (KJS::UString::from): - * kjs/value.cpp: - (KJS::JSValue::toInteger): - (KJS::JSValue::toInt32SlowCase): - (KJS::JSValue::toUInt32SlowCase): - -2007-10-28 Geoffrey Garen - - Build fix: use the new-fangled missingSymbolMarker(). - - * kjs/nodes.cpp: - (KJS::ResolveNode::optimizeVariableAccess): - * kjs/nodes.h: - (KJS::LocalVarAccessNode::LocalVarAccessNode): - -2007-10-28 Geoffrey Garen - - Reviewed by Maciej Stachowiak, Darin Adler. - - Much supporting work done by Maciej Stachowiak, Maks Orlovich, and - Cameron Zwarich. - - AST transfom to replace slow resolve nodes with fast local variable - alternatives that do direct memory access. Currently, only ResolveNode - provides a fast local variable alternative. 6 others are soon to come. - - 16.7% speedup on SunSpider. - - Most of this patch is just scaffolding to support iterating all the - resolve nodes in the AST through optimizeResolveNodes(). In - optimizeResolveNodes(), most classes just push their child nodes onto - the processing stack, while ResolveNodes actually replace themselves in - the tree with more optimized alternatives, if possible. - - Here are the interesting bits: - - * kjs/nodes.h: Added PlacementNewAdoptTag, along with implementations - in Node and ResolveNode. This tag allows you to use placement new to - swap out a base class Node in favor of a subclass copy that holds the - same data. (Without this tag, default initialization would NULL out - RefPtrs, change line numbers, etc.) - - * kjs/nodes.cpp: - (KJS::ResolveNode::evaluate): Since we're taking the slow path, ASSERT - that the fast path is impossible, to make sure we didn't leave anything - on the table. - - (KJS::FunctionBodyNode::optimizeResolveNodes): Here's where the AST - transformation happens. - - (KJS::ResolveNode::optimizeResolveNodes): Here's where the ResolveNode - optimization happens. - - * kjs/function.h: Added symbolTable() accessor for, for the sake of - an ASSERT. - -2007-10-28 Mark Rowe - - Reviewed by Maciej. - - Fix "AllInOneFile.o has a global initializer in it". - - Some versions of gcc generate a global initializer for std::numeric_limits::max(). - We can avoid this by moving it inside an inline function. - - * kjs/SymbolTable.h: - (KJS::missingSymbolMarker): - * kjs/function.cpp: - (KJS::ActivationImp::getOwnPropertySlot): - (KJS::ActivationImp::put): - -2007-10-28 Maciej Stachowiak - - Reviewed by Mark. - - - Added assertions to protect against adding empty or deleted keys to a HashTable - - * wtf/HashTable.h: - (WTF::HashTable::lookup): - (WTF::HashTable::lookupForWriting): - (WTF::HashTable::fullLookupForWriting): - (WTF::HashTable::add): - -2007-10-28 Darin Adler - - - fix GTK build - - * kjs/nodes2string.cpp: (KJS::isParserRoundTripNumber): - Use isNaN and isInf instead of isnan and isinf. - -2007-10-28 Darin Adler - - Reviewed by Maciej. - - - http://bugs.webkit.org/show_bug.cgi?id=15735 - remove GroupNode to simplify AST and possibly get a modest speedup - - This patch removes 4 node types: GroupNode, PropertyNameNode, - FunctionCallParenBracketNode, and FunctionCallParenDotNode. - - To remove GroupNode, we add knowledge of precedence to the tree nodes, - and use that when serializing to determine where parentheses are needed. - This means we no longer have to represent parentheses in the tree. - - The precedence values are named after productions in the grammar from the - JavaScript standard. - - SunSpider says this is an 0.4% speedup. - - * kjs/function.h: - * kjs/function.cpp: Removed escapeStringForPrettyPrinting -- it's part of - serialization, so I moved it to the file that takes care of that. - - * kjs/grammar.y: Changed makeGetterOrSetterPropertyNode to use 0 to - indicate failure instead of a separate boolean. Got rid of PropertyNameNode - by merging the PropertyName rule into the Property rule (which was easier - than figuring out how to pass the Identifier from one node to another). - Got rid of GroupNode, nodeInsideAllParens(), FunctionCallParenBracketNode, - and FunctionCallParenDotNode. - - * kjs/nodes.h: Removed unused forward declarations and Operator values. - Added Precedence enum, and precedence function to all nodes. Removed - nodeInsideAllParens. Added streamBinaryOperator function for serialization. - Removed GroupNode and PropertyNameNode. Made PropertyNode store an Identifier. - Removed FunctionCallParenBracketNode and FunctionCallParenDotNode. - - * kjs/nodes.cpp: Removed Node::nodinsideAllParens, GroupNode, and PropertyNameNode. - (KJS::PropertyListNode::evaluate): Changed code to get name directly instead - of converting it from an Identifier to a jsString then back to a UString - then into an Identifier again! - - * kjs/nodes2string.cpp: Changed special-token implementation to use a separate - function for each of Endl, Indent, Unindent, and DotExpr instead of using a - single function with a switch. Added a precedence that you can stream in, to - cause the next node serialized to add parentheses based on that precedence value. - (KJS::operatorString): Moved to the top of the file. - (KJS::escapeStringForPrettyPrinting): Moved here from function.cpp. Removed old - workaround for snprintf, since StringExtras.h takes care of that. - (KJS::operator<<): Made the char and char* versions faster by using UString's - character append functions instead of constructing a UString. Added the logic - to the Node* version to add parentheses if needed. - (KJS::Node::streamLeftAssociativeBinaryOperator): Added helper function. - (KJS::ElementNode::streamTo): Use PrecAssignment for the elements. - (KJS::BracketAccessorNode::streamTo): Use PrecCall for the expression before - the bracket. - (KJS::DotAccessorNode::streamTo): Use PrecCall for the expression before the dot. - (KJS::ArgumentListNode::streamTo): Use PrecAssignment for the arguments. - (KJS::NewExprNode::streamTo): Use PrecMember for the expression. - (KJS::FunctionCallValueNode::streamTo): Use PrecCall. - (KJS::FunctionCallBracketNode::streamTo): Ditto. - (KJS::FunctionCallDotNode::streamTo): Ditto. - (KJS::PostfixBracketNode::streamTo): Ditto. - (KJS::PostfixDotNode::streamTo): Ditto. - (KJS::PostfixErrorNode::streamTo): Use PrecLeftHandSide. - (KJS::DeleteBracketNode::streamTo): Use PrecCall. - (KJS::DeleteDotNode::streamTo): Ditto. - (KJS::DeleteValueNode::streamTo): Use PrecUnary. - (KJS::VoidNode::streamTo): Ditto. - (KJS::TypeOfValueNode::streamTo): Ditto. - (KJS::PrefixBracketNode::streamTo): Use PrecCall. - (KJS::PrefixDotNode::streamTo): Ditto. - (KJS::PrefixErrorNode::streamTo): Use PrecUnary. - (KJS::UnaryPlusNode::streamTo): Ditto. - (KJS::NegateNode::streamTo): Ditto. - (KJS::BitwiseNotNode::streamTo): Ditto. - (KJS::LogicalNotNode::streamTo): Ditto. - (KJS::MultNode::streamTo): Use streamLeftAssociativeBinaryOperator. - (KJS::DivNode::streamTo): Ditto. - (KJS::ModNode::streamTo): Ditto. - (KJS::AddNode::streamTo): Ditto. - (KJS::SubNode::streamTo): Ditto. - (KJS::LeftShiftNode::streamTo): Ditto. - (KJS::RightShiftNode::streamTo): Ditto. - (KJS::UnsignedRightShiftNode::streamTo): Ditto. - (KJS::LessNode::streamTo): Ditto. - (KJS::GreaterNode::streamTo): Ditto. - (KJS::LessEqNode::streamTo): Ditto. - (KJS::GreaterEqNode::streamTo): Ditto. - (KJS::InstanceOfNode::streamTo): Ditto. - (KJS::InNode::streamTo): Ditto. - (KJS::EqualNode::streamTo): Ditto. - (KJS::NotEqualNode::streamTo): Ditto. - (KJS::StrictEqualNode::streamTo): Ditto. - (KJS::NotStrictEqualNode::streamTo): Ditto. - (KJS::BitAndNode::streamTo): Ditto. - (KJS::BitXOrNode::streamTo): Ditto. - (KJS::BitOrNode::streamTo): Ditto. - (KJS::LogicalAndNode::streamTo): Ditto. - (KJS::LogicalOrNode::streamTo): Ditto. - (KJS::ConditionalNode::streamTo): Ditto. - (KJS::AssignResolveNode::streamTo): Use PrecAssignment for the right side. - (KJS::AssignBracketNode::streamTo): Use PrecCall for the expression before - the bracket and PrecAssignment for the right side. - (KJS::AssignDotNode::streamTo): Ditto. - (KJS::AssignErrorNode::streamTo): Use PrecLeftHandSide for the left side - and PrecAssignment for the right side. - (KJS::CommaNode::streamTo): Use PrecAssignment for both expressions. - (KJS::AssignExprNode::streamTo): Use PrecAssignment. - -2007-10-28 Kevin Ollivier - - Define wx port and set wx port USE options. - - Reviewed by Adam Roben. - - * wtf/Platform.h: - -2007-10-28 Mark Rowe - - We don't include "config.h" in headers. - - * bindings/jni/jni_instance.h: - * kjs/regexp.h: - * wtf/TCPageMap.h: - * wtf/TCSpinLock.h: - -2007-10-28 Maciej Stachowiak - - Rubber stamped by Mark. - - - avoid using non-portable SIZE_T_MAX in favor of std::numeric_limits - - * kjs/SymbolTable.h: - (KJS::SymbolTableIndexHashTraits::emptyValue): - * kjs/function.cpp: - (KJS::ActivationImp::getOwnPropertySlot): - (KJS::ActivationImp::put): - -2007-10-28 Maciej Stachowiak - - Reviewed by Eric. - - - switch SymbolTable to be a HashMap instead of a PropertyMap for 3% SunSpider speedup - - * kjs/SymbolTable.h: - (KJS::IdentifierRepHash::hash): Special hash function for identifier reps. - (KJS::IdentifierRepHash::equal): ditto - (KJS::SymbolTableIndexHashTraits::emptyValue): Special HashTraits for the index value. - (KJS::SymbolTable): change to a typedef for a HashMap. - * kjs/function.cpp: - (KJS::ActivationImp::getOwnPropertySlot): Adjusted for new SymbolTable API. - (KJS::ActivationImp::deleteProperty): ditto - (KJS::ActivationImp::put): ditto - - * kjs/nodes.cpp: - (KJS::FunctionBodyNode::initializesymbolTable): Adjusted, since - you now have to store a UString::rep, not an identifier. - -2007-10-27 Maciej Stachowiak - - Reviewed by Oliver. - - - numerous HashTable performance improvements - - This does not quite add up to a measurable win on SunSpider, but it allows a - follow-on > 3% improvement and probably helps WebCore too. - - I made the following improvements, among others: - - - Made HashFunctions note whether it is ok to compare a real value with the equal() function - to the empty or deleted value, and used this to optimize the comparisons done in hash lookup. - - - Specialized lookup so it doesn't have to do so many extra branches and build so many extra - std::pairs for cases that don't need them. There are now four versions, one for read-only access, - two for writing, and one folded directly into add() (these all were improvments). - - - Made HashMap::get() use lookup() directly instead of find() to avoid having to build iterators. - - - Made a special constructor for iterators that knows it points to - a valid filled cell and so skips updating itself. - - - Reordered memory accesses in the various lookup functions for better code generation - - - Made simple translators avoid passing a hash code around - - - Other minor tweaks - - * wtf/HashTable.h: - (WTF::): - (WTF::HashTableConstIterator::HashTableConstIterator): - (WTF::HashTableIterator::HashTableIterator): - (WTF::IdentityHashTranslator::translate): - (WTF::HashTable::end): - (WTF::HashTable::lookup): - (WTF::HashTable::lookupForWriting): - (WTF::HashTable::makeKnownGoodIterator): - (WTF::HashTable::makeKnownGoodConstIterator): - (WTF::::lookup): - (WTF::::lookupForWriting): - (WTF::::fullLookupForWriting): - (WTF::::add): - (WTF::::addPassingHashCode): - (WTF::::reinsert): - (WTF::::find): - (WTF::::contains): - * kjs/identifier.cpp: - (WTF::): - * wtf/HashFunctions.h: - (WTF::): - * wtf/HashMap.h: - (WTF::): - (WTF::::get): - * wtf/HashSet.h: - (WTF::): - (WTF::::add): - * wtf/ListHashSet.h: - (WTF::ListHashSetTranslator::translate): - -2007-10-27 Darin Adler - - Reviewed by Eric. - - - fix ASCIICType.h for some Windows compiles - - * wtf/ASCIICType.h: Check the compiler, not the OS, since it's the - compiler/library that has the wchar_t that is just a typedef. - -2007-10-27 Kevin McCullough - - - BuildFix - - Forgot to change the build step when I changed the filename. - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - -2007-10-27 Geoffrey Garen - - Reviewed by Darin Adler. - - Fixed the rest of "ASSERTION FAILED: _hash in KJS::UString::Rep:: - computedHash()" - http://bugs.webkit.org/show_bug.cgi?id=15718 - - * kjs/identifier.cpp: Fixed more cases where an Identifier didn't get a - hash value. Also changed O(n) strlen to O(1) check for empty string. - (KJS::Identifier::add): - - * kjs/ustring.cpp: Changed O(n) strlens to O(1) checks for empty string. - (KJS::UString::UString): - (KJS::UString::operator=): - -2007-10-27 Darin Adler - - Reviewed by Eric. - - - fix pow on Windows - - * wtf/MathExtras.h: (wtf_pow): Add a special case for MSVC, which has - a "pow" function that does not properly handle the case where arg1 is - NaN and arg2 is 0. - - * kjs/math_object.cpp: (MathFuncImp::callAsFunction): Don't explicity - specify "::pow" -- just "pow" is fine. - -2007-10-27 Darin Adler - - Reviewed by Maciej. - - - http://bugs.webkit.org/show_bug.cgi?id=15711 - force JSImmediate to be inlined for roughly 1.2% SunSpider speedup - - * kjs/JSImmediate.h: Put ALWAYS_INLINE on everything. - - * kjs/object.h: Removed redundant includes. - * kjs/value.h: Ditto. - -2007-10-27 Maciej Stachowiak - - Reviewed by Mark. - - - fixed "ASSERTION FAILED: _hash in KJS::UString::Rep::computedHash()" - http://bugs.webkit.org/show_bug.cgi?id=15718 - - * kjs/identifier.cpp: - (KJS::Identifier::addSlowCase): Ensure that empty Identifiers have a hash computed, - now that we count on all Identifiers already having one. - -2007-10-27 Mark Rowe - - Silence a warning. - - * kjs/SymbolTable.h: - -2007-10-27 Mark Rowe - - Gtk build fix. - - * kjs/function.h: - -2007-10-26 Kevin McCullough - - Rubber stamp by Adam. - - - Renamed JSStringRefCOM to JSStringRefBSTR since it he only thing the - files contain are functions that operate on BSTRs. - - * API/JSStringRefBSTR.cpp: Copied from API/JSStringRefCOM.cpp. - * API/JSStringRefBSTR.h: Copied from API/JSStringRefCOM.h. - * API/JSStringRefCOM.cpp: Removed. - * API/JSStringRefCOM.h: Removed. - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - -2007-10-26 Kevin McCullough - - Reviewed by Adam. - - - Made JSStringCreateWithBSTR capable of handling null BSTRs. - - * API/JSStringRefCOM.cpp: - (JSStringCreateWithBSTR): - -2007-10-26 Sam Weinig - - Windows build fix. - - * kjs/SymbolTable.h: Add header gaurd. - * kjs/nodes.h: #include "SymbolTable.h" - -2007-10-26 Geoffrey Garen - - Suggested by Anders Carlsson. - - Fixed tyop. - - * kjs/function.cpp: - (KJS::ActivationImp::getOwnPropertySlot): - -2007-10-26 Geoffrey Garen - - Suggested by Darin Adler. - - Use computedHash(), which is safer than just directly accessing _hash. - - * kjs/lookup.cpp: - (KJS::Lookup::findEntry): - (KJS::Lookup::find): - -2007-10-26 Geoffrey Garen - - Build fix: svn add SymbolTable.h - - * kjs/SymbolTable.h: Added. - (KJS::SymbolTable::set): - (KJS::SymbolTable::get): - -2007-10-26 Geoffrey Garen - - Build fix: export SymbolTable.h to WebCore. - - * JavaScriptCore.xcodeproj/project.pbxproj: - -2007-10-26 Geoffrey Garen - - Comment tweak suggested by Maciej. - - * kjs/function.cpp: - (KJS::ActivationImp::getOwnPropertySlot): - -2007-10-26 Geoffrey Garen - - Reviewed by Maciej Stachowiak. - - Tweaked property maps to remove 2 branches. 2.5% speedup on SunSpider. - - * kjs/property_map.cpp: Use a special no branch accessor to the UString's - hash value. Also, return immediately instead of branching to the end - of the loop if the value is not found. - (KJS::PropertyMap::get): - (KJS::PropertyMap::getLocation): - (KJS::PropertyMap::put): - (KJS::PropertyMap::insert): - (KJS::PropertyMap::remove): - (KJS::PropertyMap::checkConsistency): - - * kjs/ustring.h: - (KJS::UString::Rep::computedHash): Special no branch accessor to the - UString's hash value. Used when the caller knows that the hash value - has already been computed. (For example, if the caller got the UString - from an Identifier.) - -2007-10-26 Geoffrey Garen - - Reviewed by Maciej Stachowiak. - - Switched ActivationImp to using a symbol table. For now, though, all - clients take the slow path. - - Net .6% speedup on SunSpider. - - Slowdowns: - - ActivationImp now mallocs in its constructor - - Local variable hits use an extra level of indirection to retrieve - data - - Local variable misses do two lookups - - Speedups: - - Fast initialization of local variables upon function entry - - * JavaScriptCore.xcodeproj/project.pbxproj: Added SymbolTable.h - - * kjs/function.cpp: - (KJS::ActivationImp::ActivationImp): Malloc a private structure to hold - data that won't fit in a JSCell. - (KJS::ActivationImp::argumentsGetter): Use slow symbol table path for - lookup. - (KJS::ActivationImp::getOwnPropertySlot): ditto - (KJS::ActivationImp::deleteProperty): ditto - (KJS::ActivationImp::put): ditto - (KJS::ActivationImp::createArgumentsObject): ditto - - (KJS::ActivationImp::mark): Call JSObject::mark first so that one of - our properties doesn't try to recursively mark us. (This caused a crash - in earlier testing. Not sure why we haven't run into it before.) - - * kjs/nodes.cpp: Functions now build a symbol table the first time - they're called. - (KJS::VarDeclNode::evaluate): - (KJS::FunctionBodyNode::FunctionBodyNode): - (KJS::FunctionBodyNode::initializeSymbolTable): - (KJS::FunctionBodyNode::processDeclarations): - (KJS::FunctionBodyNode::processDeclarationsForFunctionCode): - (KJS::FunctionBodyNode::processDeclarationsForProgramCode): - - * kjs/nodes.h: - (KJS::FunctionBodyNode::symbolTable): - - * wtf/Forward.h: Added Vector. - -2007-10-26 Kevin McCullough - - - Corrected function name mistake in this changelog. - -2007-10-26 Kevin McCullough - Reviewed by Sam and Steve. - - - Added convenience methods for converting between BSTR and JSStringRefs - - * API/JSStringRefCOM.cpp: Added. - (JSStringCreateWithBSTR): - (JSStringCopyBSTR): - * API/JSStringRefCOM.h: Added. - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - -2007-10-26 Mark Rowe - - Windows build fix. - - * kjs/collector.cpp: - (KJS::Collector::collect): - -2007-10-26 Oliver Hunt - - Reviewed by Maciej. - - Make the JSC GC use a separate heap for JSNumbers to get a 0.7-1.4% progression in SunSpider. - - * kjs/CollectorHeapIntrospector.cpp: - (KJS::CollectorHeapIntrospector::init): - (KJS::CollectorHeapIntrospector::enumerate): - * kjs/CollectorHeapIntrospector.h: - * kjs/collector.cpp: - (KJS::Collector::recordExtraCost): - (KJS::Collector::heapAllocate): - (KJS::Collector::allocate): - (KJS::Collector::allocateNumber): - (KJS::Collector::registerThread): - (KJS::Collector::markStackObjectsConservatively): - (KJS::Collector::markMainThreadOnlyObjects): - (KJS::Collector::sweep): - (KJS::Collector::collect): - * kjs/collector.h: - * kjs/internal.h: - (KJS::NumberImp::operator new): - Force numbers to be allocated in the secondary heap. - -2007-10-26 Maciej Stachowiak - - Reviewed by Oliver. - - - encourage GCC a little harder to inline a few hot functions for 1.5% improvement on SunSpider. - - * kjs/value.h: - (KJS::JSValue::getUInt32): - (KJS::JSValue::getTruncatedInt32): - (KJS::JSValue::toNumber): - * wtf/PassRefPtr.h: - (WTF::PassRefPtr::~PassRefPtr): - * wtf/RefPtr.h: - (WTF::RefPtr::operator->): - -2007-10-26 Mark Rowe - - Gtk build fix. - - * kjs/ExecState.h: - -2007-10-26 Maciej Stachowiak - - Reviewed by Mark. - - - Merge Context class fully into ExecState, since they are always created and used together. - - No measurable performance impact but this is a useful cleanup. - - * JavaScriptCore.pri: - * kjs/ExecState.cpp: - (KJS::ExecState::ExecState): - (KJS::ExecState::~ExecState): - (KJS::ExecState::mark): - (KJS::ExecState::lexicalInterpreter): - * kjs/ExecState.h: - (KJS::ExecState::dynamicInterpreter): - (KJS::ExecState::setException): - (KJS::ExecState::clearException): - (KJS::ExecState::exception): - (KJS::ExecState::exceptionSlot): - (KJS::ExecState::hadException): - (KJS::ExecState::scopeChain): - (KJS::ExecState::callingExecState): - (KJS::ExecState::propertyNames): - * kjs/collector.cpp: - (KJS::Collector::reportOutOfMemoryToAllInterpreters): - * kjs/function.cpp: - (KJS::FunctionImp::callAsFunction): - (KJS::FunctionImp::argumentsGetter): - (KJS::FunctionImp::callerGetter): - (KJS::GlobalFuncImp::callAsFunction): - * kjs/interpreter.cpp: - (KJS::Interpreter::Interpreter): - (KJS::Interpreter::init): - (KJS::Interpreter::evaluate): - (KJS::Interpreter::mark): - * kjs/interpreter.h: - (KJS::Interpreter::setCurrentExec): - (KJS::Interpreter::currentExec): - * kjs/nodes.cpp: - (KJS::currentSourceId): - (KJS::currentSourceURL): - (KJS::ThisNode::evaluate): - (KJS::ResolveNode::evaluate): - (KJS::FunctionCallResolveNode::evaluate): - (KJS::PostfixResolveNode::evaluate): - (KJS::DeleteResolveNode::evaluate): - (KJS::TypeOfResolveNode::evaluate): - (KJS::PrefixResolveNode::evaluate): - (KJS::AssignResolveNode::evaluate): - (KJS::VarDeclNode::evaluate): - (KJS::DoWhileNode::execute): - (KJS::WhileNode::execute): - (KJS::ForNode::execute): - (KJS::ForInNode::execute): - (KJS::ContinueNode::execute): - (KJS::BreakNode::execute): - (KJS::ReturnNode::execute): - (KJS::WithNode::execute): - (KJS::SwitchNode::execute): - (KJS::LabelNode::execute): - (KJS::TryNode::execute): - (KJS::FunctionBodyNode::processDeclarationsFunctionCode): - (KJS::FunctionBodyNode::processDeclarationsProgramCode): - (KJS::FunctionBodyNode::processDeclarations): - (KJS::FuncDeclNode::makeFunction): - (KJS::FuncExprNode::evaluate): - -2007-10-26 Mark Rowe - - Windows build fix. - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - -2007-10-26 Mark Rowe - - Gtk build fix. - - * JavaScriptCore.pri: - * kjs/ExecState.cpp: - -2007-10-26 Maciej Stachowiak - - Reviewed by Oliver. - - - moved Context class into ExecState.{h,cpp} in preparation for merging - ExecState and Context classes. - - * kjs/ExecState.h: Moved CodeType enum and Context class here in - preparation for merging ExecState and Context. - * kjs/ExecState.cpp: Moved Context class here from Context.cpp. - (KJS::Context::Context): - (KJS::Context::~Context): - (KJS::Context::mark): - * kjs/context.h: Removed. - * kjs/Context.cpp: Removed. - * kjs/function.h: Removed CodeType enum. - * kjs/LabelStack.h: Added. Pulled LabelStack class out of internal.h. - * kjs/internal.h: Removed LabelStack. - * JavaScriptCore.xcodeproj/project.pbxproj: Added new file, removed ones that are gone. - * kjs/collector.cpp: Fixed includes. - * kjs/function.cpp: ditto - * kjs/internal.cpp: ditto - * kjs/interpreter.cpp: ditto - * kjs/lookup.h: ditto - * kjs/nodes.cpp: ditto - -2007-10-26 Mark Rowe - - Windows build fix. - - * kjs/string_object.cpp: - (KJS::StringObjectFuncImp::callAsFunction): - -2007-10-25 Darin Adler - - Reviewed by Maciej. - - - http://bugs.webkit.org/show_bug.cgi?id=15703 - fix numeric functions -- improve correctness and speed - - Gives about 1% gain on SunSpider. - - * kjs/value.h: Added toIntegerPreserveNan, removed toUInt16. - (KJS::JSValue::toInt32): Changed to call getTruncatedInt32 in a way that works - with both immediate and number values. - (KJS::JSValue::toUInt32): Ditto. - * kjs/value.cpp: - (KJS::JSValue::toInteger): Moved the logic from roundValue here, with a couple - differences. One is that it now correctly returns 0 for NaN, and another is that - there's no special case for 0 or infinity, since the general case already handles - those correctly. - (KJS::JSValue::toIntegerPreserveNaN): Added. Like toInteger, but without the - check for NaN. - (KJS::JSValue::toInt32SlowCase): Call toNumber instead of roundValue. The - truncation done by the typecast already does the necessary truncation that - roundValue was doing. - (KJS::JSValue::toUInt32SlowCase): Ditto. - (KJS::JSValue::toUInt16): Removed. - - * kjs/internal.h: Removed roundValue. - * kjs/internal.cpp: Ditto. - - * kjs/array_object.cpp: (KJS::ArrayProtoFunc::callAsFunction): Remove unneeded - code to handle NaN in Array.slice; toInteger now never returns NaN as specified. - - * kjs/date_object.cpp: - (KJS::fillStructuresUsingTimeArgs): Replaced call to roundValue with a call to - toNumber as specified. - (KJS::DateProtoFunc::callAsFunction): In SetTime case, replaced call to roundValue - with a call to toNumber and timeClip as specified. - (KJS::DateObjectImp::construct): Removed unnecessary checks of numArgs in cases - where the default behavior of toInt32 (returning 0) was already correct. Replaced - call to roundValue with a call to toNumber as specified. - (KJS::DateObjectFuncImp::callAsFunction): Ditto. - - * kjs/math_object.cpp: (MathFuncImp::callAsFunction): Removed unnecessary special - cases for the pow function that the library already handles correctly. - - * kjs/number_object.cpp: (NumberProtoFunc::callAsFunction): Changed ToString to - call toIntegerPreserveNaN, so we can continue to handle the NaN case differently. - The real toInteger now returns 0 for NaN. Took out unneeded special case in - ToFixed for undefined; was only needed because our toInteger was wrong. Same - thing in ToExponential. Changed ToPrecision to call toIntegerPreserveNaN. - - * kjs/string_object.cpp: - (KJS::StringProtoFunc::callAsFunction): Took out CharAt and CharCodeAt special - cases for undefined that were only needed because toInteger was wrong. Same in - IndexOf, and was able to remove some special cases. In LastIndexOf, used - toIntegerPreserveNaN, but was able to remove some special cases there too. - Changed Substr implementation to preserve correct behavior with the change - to toInteger and match the specification. Also made sure we weren't converting - an out of range double to an int. - (KJS::StringObjectFuncImp::callAsFunction): Changed constructor to just use - toUInt32, because truncating toUInt32 to 16 bits is the same thing and there's - no reason to have toUInt16 as a second, less-optimized function that's only - called at this one call site. - - * wtf/MathExtras.h: Added trunc function for Windows. - -2007-10-25 Geoffrey Garen - - Reviewed by Maciej Stachowiak. - - Tweaked the inner hashtable lookup loop to remove a branch in the "not - found" case. .5% speedup on SunSpider. - - * JavaScriptCore.xcodeproj/project.pbxproj: - * wtf/HashTable.h: - (WTF::::lookup): - -2007-10-25 Maciej Stachowiak - - Reviewed by Oliver. - - - fold together toPrimitive() and toNumber() conversions for 0.5% gain on SunSpider - - * kjs/nodes.cpp: - (KJS::SubNode::evaluate): Subtract directly, since toPrimitive() is not - adding any value over toNumber() here. - (KJS::valueForReadModifyAssignment): Ditto. - (KJS::lessThan): Use new getPrimitiveNumber() method to avoid some virtual calls - and branches. - (KJS::lessThanEq): Ditto. - * JavaScriptCore.exp: Export new functions as needed. - * kjs/value.h: - (KJS::JSValue::toPrimitive): Fixed formatting. - (KJS::JSValue::getPrimitiveNumber): New method - this simultaneously converts - to number and tells you whether a toPrimitive() conversion with a Number hint - would have given a string. - * kjs/internal.cpp: - (KJS::StringImp::getPrimitiveNumber): Implemented. - (KJS::NumberImp::getPrimitiveNumber): ditto - (KJS::GetterSetterImp::getPrimitiveNumber): ditto - (KJS::StringImp::toPrimitive): Fixed formatting. - (KJS::NumberImp::toPrimitive): ditto - (KJS::GetterSetterImp::toPrimitive): ditto - * kjs/internal.h: - * kjs/object.cpp: - (KJS::JSObject::getPrimitiveNumber): Implemented. - * kjs/object.h: - -2007-10-25 Sam Weinig - - Reviewed by Adam Roben. - - Remove JSStringRefCFHack from windows as it is no longer needed. - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - -2007-10-25 Geoffrey Garen - - Reviewed by Oliver Hunt. - - Rolled out my last patch. It turns out that I needed 2 words, not 1, - so it didn't help. - -2007-10-25 Geoffrey Garen - - Reviewed by Oliver Hunt. - - Fixed http://bugs.webkit.org/show_bug.cgi?id=15694 - Shrink the size of an activation object by 1 word - - This is in preparation for adding a symbol table to the activation - object. - - The basic strategy here is to rely on the mutual exclusion between - the arguments object pointer and the function pointer (you only need - the latter in order to create the former), and store them in the same - place. The LazyArgumentsObject class encapsulates this strategy. - - Also inlined the ArgumentsImp constructor, for good measure. - - SunSpider reports no regression. Regression tests pass. - - * JavaScriptCore.xcodeproj/project.pbxproj: - * kjs/Context.cpp: - (KJS::Context::~Context): - * kjs/function.cpp: - (KJS::ActivationImp::LazyArgumentsObject::createArgumentsObject): - (KJS::ActivationImp::LazyArgumentsObject::mark): - (KJS::ActivationImp::argumentsGetter): - (KJS::ActivationImp::mark): - * kjs/function.h: - (KJS::ActivationImp::LazyArgumentsObject::LazyArgumentsObject): - (KJS::ActivationImp::LazyArgumentsObject::getOrCreate): - (KJS::ActivationImp::LazyArgumentsObject::resetArguments): - (KJS::ActivationImp::LazyArgumentsObject::setArgumentsObject): - (KJS::ActivationImp::LazyArgumentsObject::argumentsObject): - (KJS::ActivationImp::LazyArgumentsObject::setFunction): - (KJS::ActivationImp::LazyArgumentsObject::function): - (KJS::ActivationImp::LazyArgumentsObject::createdArgumentsObject): - (KJS::ActivationImp::LazyArgumentsObject::): - (KJS::ActivationImp::ActivationImp::ActivationImp): - (KJS::ActivationImp::resetArguments): - -2007-10-25 Adam Roben - - Change JavaScriptCore.vcproj to use DerivedSources.make - - We were trying to emulate the logic of make in - build-generated-files.sh, but we got it wrong. We now use a - build-generated-files very much like the one that WebCore uses to - invoke make. - - We also now only have a Debug configuration of dftables which we build - even when doing a Release build of JavaScriptCore. dftables also no - longer has the "_debug" name suffix. - - Changes mostly made by Darin, reviewed by me. - - * DerivedSources.make: Add a variable to set the extension used for - the dftables executable. - * JavaScriptCore.vcproj/JavaScriptCore.sln: Updated to use Debug - dftables in Release configurations. - * JavaScriptCore.vcproj/JavaScriptCoreSubmit.sln: Ditto. - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - - Updated include path to point to the new location of the derived - sources. - - Modified pre-build event to pass the right arguments to - build-generated-files.sh and not call dftables directly. - - Added the derived source files to the project. - - Removed grammarWrapper.cpp, which isn't needed now that we're - compiling grammar.cpp directly. - * JavaScriptCore.vcproj/JavaScriptCore/build-generated-files.sh: - Slightly modified from the WebCore version. - * JavaScriptCore.vcproj/JavaScriptCore/grammarWrapper.cpp: Removed. - * JavaScriptCore.vcproj/dftables/dftables.vcproj: - - Changed the output location to match Mac. - - Removed the Release configuration. - - Removed the _debug suffix. - -2007-10-25 Geoffrey Garen - - Reviewed by Eric Seidel. - - Slightly elaborated the differences between declaration procesing in - Function Code and Program Code. - - .3% speedup on SunSpider. - - * kjs/nodes.cpp: - (KJS::FunctionBodyNode::processDeclarationsFunctionCode): - (KJS::FunctionBodyNode::processDeclarationsProgramCode): Store a - minimum set of attributes instead of recomputing all the time. Also, - ignore m_parameters, since programs don't have arguments. - -2007-10-25 Eric Seidel - - Reviewed by Maciej. - - More preparation work before adding long-running mode to testkjs. - - * kjs/testkjs.cpp: - (TestFunctionImp::callAsFunction): - (prettyPrintScript): - (runWithScripts): - (parseArguments): - (kjsmain): - (fillBufferWithContentsOfFile): - -2007-10-25 Eric Seidel - - Reviewed by Maciej. - - Bring testkjs code out of the dark ages in preparation for more - radical improvements (like long-running testing support!) - - * kjs/testkjs.cpp: - (TestFunctionImp::callAsFunction): - (setupInterpreter): - (doIt): - (fillBufferWithContentsOfFile): - -2007-10-25 Geoffrey Garen - - Reviewed by Maciej Stachowiak. - - Make a fast path for declaration processing inside Function Code. - - Lifted declaration processing code up from individual declaration nodes - and into processDeclarations. - - Broke out processDeclarations into two cases, depending on the type of - code. This eliminates 2 branches, and facilitates more radical - divergeance in the future. - - 2.5% SunSpider speedup. - - * JavaScriptCore.xcodeproj/project.pbxproj: - * kjs/nodes.cpp: - (KJS::FunctionBodyNode::initializeDeclarationStacks): - (KJS::FunctionBodyNode::processDeclarationsFunctionCode): - (KJS::FunctionBodyNode::processDeclarationsProgramCode): - (KJS::FunctionBodyNode::execute): - (KJS::FuncDeclNode::makeFunction): - * kjs/nodes.h: - -2007-10-25 Maciej Stachowiak - - Reviewed by Adam. - - - add header includes needed on platforms that don't use AllInOneFile.cpp - - * API/JSCallbackObject.cpp: - * kjs/Context.cpp: - * kjs/ExecState.cpp: - * kjs/array_instance.cpp: - * kjs/function_object.cpp: - * kjs/interpreter.cpp: - * kjs/nodes.cpp: - -2007-10-25 Eric Seidel - - Reviewed by Geoff. - - * JavaScriptCore.xcodeproj/project.pbxproj: re-mark JSGlobalObject.h as private - -2007-10-25 Geoffrey Garen - - Reviewed by Maciej Stachowiak. - - Fixed http://bugs.webkit.org/show_bug.cgi?id=15683 - Re-order declaration initialization to avoid calling hasProperty inside - VarDeclNode::processDeclaration - - .7% speedup on SunSpider. - - * kjs/function.h: - * kjs/function.cpp: Merged parameter processing into FunctionBodyNode's - other processing of declared symbols, so the order of execution could - change. - - * kjs/nodes.cpp: - (KJS::VarDeclNode::getDeclarations): Added special case for the - "arguments" property name, explained in the comment. - - (KJS::VarDeclNode::processDeclaration): Removed call to hasProperty - in the case of function code, since we know the declared symbol - management will resolve conflicts between symbols. Yay! - - (KJS::VarDeclListNode::getDeclarations): Now that VarDeclNode's - implementation of getDeclarations is non-trivial, we can't take a - short-cut here any longer -- we need to put the VarDecl node on the - stack so it gets processed normally. - - (KJS::FunctionBodyNode::processDeclarations): Changed the order of - processing to enforce mutual exclusion rules. - - * kjs/nodes.h: - (KJS::DeclarationStacks::DeclarationStacks): Structure includes an - ExecState now, for fast access to the "arguments" property name. - -2007-10-24 Eric Seidel - - Reviewed by Maciej. - - Add a JSGlobalObject class and remove the InterpreterMap - http://bugs.webkit.org/show_bug.cgi?id=15681 - - This required making JSCallbackObject a template class to allow for - JSGlobalObjects with JSCallbackObject functionality. - - SunSpider claims this was a 0.5% speedup. - - * API/JSCallbackObject.cpp: - * API/JSCallbackObject.h: - * API/JSCallbackObjectFunctions.h: Copied from API/JSCallbackObject.cpp. - (KJS::::JSCallbackObject): - (KJS::::init): - (KJS::::~JSCallbackObject): - (KJS::::initializeIfNeeded): - (KJS::::className): - (KJS::::getOwnPropertySlot): - (KJS::::put): - (KJS::::deleteProperty): - (KJS::::implementsConstruct): - (KJS::::construct): - (KJS::::implementsHasInstance): - (KJS::::hasInstance): - (KJS::::implementsCall): - (KJS::::callAsFunction): - (KJS::::getPropertyNames): - (KJS::::toNumber): - (KJS::::toString): - (KJS::::setPrivate): - (KJS::::getPrivate): - (KJS::::inherits): - (KJS::::cachedValueGetter): - (KJS::::staticValueGetter): - (KJS::::staticFunctionGetter): - (KJS::::callbackGetter): - * API/JSClassRef.cpp: - (OpaqueJSClass::prototype): - * API/JSContextRef.cpp: - (JSGlobalContextCreate): - * API/JSObjectRef.cpp: - (JSObjectMake): - (JSObjectGetPrivate): - (JSObjectSetPrivate): - * API/JSValueRef.cpp: - (JSValueIsObjectOfClass): - * JavaScriptCore.exp: - * JavaScriptCore.xcodeproj/project.pbxproj: - * bindings/c/c_utility.cpp: - (KJS::Bindings::convertValueToNPVariant): - * bindings/jni/jni_jsobject.cpp: - * bindings/objc/objc_utility.mm: - (KJS::Bindings::convertValueToObjcValue): - * kjs/Context.cpp: - (KJS::Context::Context): - * kjs/ExecState.cpp: - (KJS::ExecState::lexicalInterpreter): - * kjs/JSGlobalObject.h: Added. - (KJS::JSGlobalObject::JSGlobalObject): - (KJS::JSGlobalObject::isGlobalObject): - (KJS::JSGlobalObject::interpreter): - (KJS::JSGlobalObject::setInterpreter): - * kjs/array_instance.cpp: - * kjs/context.h: - * kjs/function.cpp: - (KJS::FunctionImp::callAsFunction): - (KJS::GlobalFuncImp::callAsFunction): - * kjs/interpreter.cpp: - (KJS::Interpreter::Interpreter): - (KJS::Interpreter::init): - (KJS::Interpreter::~Interpreter): - (KJS::Interpreter::globalObject): - (KJS::Interpreter::initGlobalObject): - (KJS::Interpreter::evaluate): - * kjs/interpreter.h: - * kjs/lookup.h: - (KJS::cacheGlobalObject): - * kjs/object.h: - (KJS::JSObject::isGlobalObject): - * kjs/testkjs.cpp: - -2007-10-24 Eric Seidel - - Build fix for Gtk, no review. - - * kjs/collector.cpp: #include "context.h" - -2007-10-24 Eric Seidel - - Reviewed by Maciej. - - Stop checking isOutOfMemory after every allocation, instead let the collector - notify all ExecStates if we ever hit this rare condition. - - SunSpider claims this was a 2.2% speedup. - - * kjs/collector.cpp: - (KJS::Collector::collect): - (KJS::Collector::reportOutOfMemoryToAllInterpreters): - * kjs/collector.h: - * kjs/nodes.cpp: - (KJS::TryNode::execute): - -2007-10-24 Mark Rowe - - Gtk build fix. - - * kjs/identifier.h: Remove extra qualification. - -2007-10-24 Geoffrey Garen - - Reviewed by Sam Weinig. - - Disable ALWAYS_INLINE in debug builds, since it drives the debugger - crazy. - - * wtf/AlwaysInline.h: - -2007-10-24 Geoffrey Garen - - Reviewed by Sam Weinig. - - Inlined the fast path for creating an Identifier from an Identifier. - - This is a .4% speedup on SunSpider overall, but as big as a 2.5% - speedup on certain individual tests. 65% of the Identifiers creating - by SunSpider are already Identifiers. - - (The main reason I'm making this change is that it resolves a large - regression in a patch I haven't checked in yet.) - - * JavaScriptCore.exp: - * kjs/identifier.cpp: - (KJS::Identifier::addSlowCase): - * kjs/identifier.h: - (KJS::Identifier::Identifier::add): - -2007-10-24 Lars Knoll - - Reviewed by Simon. - - some changes to the way JS values are converted to Qt values in the script bindings. Added support for converting JS arrays into QStringList's. - - * bindings/qt/qt_instance.cpp: - (KJS::Bindings::QtInstance::invokeMethod): - * bindings/qt/qt_runtime.cpp: - (KJS::Bindings::convertValueToQVariant): - (KJS::Bindings::QtField::setValueToInstance): - -2007-10-24 Oliver Hunt - - Reviewed by Darin. - - Remove old relation method, replace with specialised LessThan and lessThenEq functions for a 0.5-0.6% improvement in SunSpider - - * kjs/nodes.cpp: - (KJS::lessThan): - (KJS::lessThanEq): - (KJS::LessNode::evaluate): - (KJS::GreaterNode::evaluate): - (KJS::LessEqNode::evaluate): - (KJS::GreaterEqNode::evaluate): - * kjs/operations.cpp: - * kjs/operations.h: - -2007-10-24 Eric Seidel - - Reviewed by darin. - - * kjs/nodes.h: - (KJS::ImmediateNumberNode::): Fix ASSERT correctness (and debug build!) - -2007-10-24 Darin Adler - - Reviewed by Eric. - - * kjs/object.cpp: (KJS::JSObject::defaultValue): Get rid of a little - Identifier ref/deref for what SunSpider claims is a 0.4% speedup. - -2007-10-24 Darin Adler - - Reviewed by Maciej. - - - separate out the code to create a hash table the first time from the code - to rehash - - SunSpider claims this was a 0.7% speedup. - - * kjs/property_map.cpp: - (KJS::PropertyMap::expand): Changed to call either createTable or rehash. - (KJS::PropertyMap::createTable): Added. For the case where we had no table. - (KJS::PropertyMap::rehash): Removed code needed only in the case where we - had no table. - * kjs/property_map.h: Added createTable. - -2007-10-24 Eric Seidel - - Reviewed by darin. - - Add ImmediateNumberNode to hold a JSValue* instead of a double for numbers - which can be represented by JSImmediate. - - SunSpider claims this was a 0.6% speedup. - - * kjs/grammar.y: - * kjs/nodes.cpp: - (KJS::NumberNode::evaluate): - (KJS::ImmediateNumberNode::evaluate): - * kjs/nodes.h: - (KJS::Node::): - (KJS::ImmediateNumberNode::): - * kjs/nodes2string.cpp: - (ImmediateNumberNode::streamTo): - -2007-10-24 Darin Adler - - Reviewed by Maciej. - - - http://bugs.webkit.org/show_bug.cgi?id=15657 - change static hash tables to use powers of two for speed - - Seems to give 0.7% SunSpider speedup. - - * kjs/create_hash_table: Updated to generate new format. - * kjs/lookup.cpp: - (KJS::keysMatch): Took out unneeded typecast. - (KJS::findEntry): Updated to expect table type 3 -- changed the printf to a plain old assert. - Replaced the modulus with a bit mask. - (KJS::Lookup::findEntry): Get the hash directly, since we know identifiers already have computed - their hash -- saves a branch. - (KJS::Lookup::find): Ditto. - * kjs/lookup.h: Changed attr from 2-byte value to one-byte value. Replaced hashSize with hashSizeMask. - -2007-10-24 Maciej Stachowiak - - Reviewed by Darin. - - - remove KJS_CHECKEXCEPTIONs in places where exceptions can't happen for 0.6% SunSpider speedup - - * kjs/nodes.cpp: - (KJS::DoWhileNode::execute): - (KJS::WhileNode::execute): - (KJS::ForNode::execute): - (KJS::ForInNode::execute): - (KJS::SourceElementsNode::execute): - -2007-10-23 Darin Adler - - Reviewed by Maciej. - - * kjs/JSImmediate.h: (KJS::JSImmediate::getUInt32): - Changed an && to an & for a 1% gain in SunSpider. - -2007-10-23 Oliver Hunt - - Reviewed by Maciej. - - Reduce branching in implementations of some operator implementations, yielding 1.3% boost to SunSpider. - - * kjs/nodes.cpp: - (KJS::MultNode::evaluate): - (KJS::DivNode::evaluate): - (KJS::ModNode::evaluate): - (KJS::add): - (KJS::sub): - (KJS::AddNode::evaluate): - (KJS::SubNode::evaluate): - (KJS::valueForReadModifyAssignment): - * kjs/operations.cpp: - * kjs/operations.h: - -2007-10-23 Oliver Hunt - - Reviewed by Maciej. - - Separating all of the simple (eg. non-read-modify-write) binary operators - into separate classes in preparation for further JS optimisations. - - Happily this produces a 0.8% to 1.0% performance increase in SunSpider with - no further work. - - * JavaScriptCore.xcodeproj/project.pbxproj: - * kjs/grammar.y: - * kjs/nodes.cpp: - (KJS::MultNode::evaluate): - (KJS::DivNode::evaluate): - (KJS::ModNode::evaluate): - (KJS::AddNode::evaluate): - (KJS::SubNode::evaluate): - (KJS::LeftShiftNode::evaluate): - (KJS::RightShiftNode::evaluate): - (KJS::UnsignedRightShiftNode::evaluate): - (KJS::LessNode::evaluate): - (KJS::GreaterNode::evaluate): - (KJS::LessEqNode::evaluate): - (KJS::GreaterEqNode::evaluate): - (KJS::InstanceOfNode::evaluate): - (KJS::InNode::evaluate): - (KJS::EqualNode::evaluate): - (KJS::NotEqualNode::evaluate): - (KJS::StrictEqualNode::evaluate): - (KJS::NotStrictEqualNode::evaluate): - (KJS::BitAndNode::evaluate): - (KJS::BitXOrNode::evaluate): - (KJS::BitOrNode::evaluate): - (KJS::LogicalAndNode::evaluate): - (KJS::LogicalOrNode::evaluate): - * kjs/nodes.h: - (KJS::MultNode::): - (KJS::DivNode::): - (KJS::ModNode::): - (KJS::AddNode::): - (KJS::SubNode::): - (KJS::LeftShiftNode::): - (KJS::RightShiftNode::): - (KJS::UnsignedRightShiftNode::): - (KJS::LessNode::): - (KJS::GreaterNode::): - (KJS::LessEqNode::): - (KJS::GreaterEqNode::): - (KJS::InstanceOfNode::): - (KJS::InNode::): - (KJS::EqualNode::): - (KJS::NotEqualNode::): - (KJS::StrictEqualNode::): - (KJS::NotStrictEqualNode::): - (KJS::BitAndNode::): - (KJS::BitOrNode::): - (KJS::BitXOrNode::): - (KJS::LogicalAndNode::): - (KJS::LogicalOrNode::): - * kjs/nodes2string.cpp: - (MultNode::streamTo): - (DivNode::streamTo): - (ModNode::streamTo): - (AddNode::streamTo): - (SubNode::streamTo): - (LeftShiftNode::streamTo): - (RightShiftNode::streamTo): - (UnsignedRightShiftNode::streamTo): - (LessNode::streamTo): - (GreaterNode::streamTo): - (LessEqNode::streamTo): - (GreaterEqNode::streamTo): - (InstanceOfNode::streamTo): - (InNode::streamTo): - (EqualNode::streamTo): - (NotEqualNode::streamTo): - (StrictEqualNode::streamTo): - (NotStrictEqualNode::streamTo): - (BitAndNode::streamTo): - (BitXOrNode::streamTo): - (BitOrNode::streamTo): - (LogicalAndNode::streamTo): - -2007-10-23 Darin Adler - - Reviewed by Maciej. - - - fix http://bugs.webkit.org/show_bug.cgi?id=15639 - fix Math.abs(0), Math.ceil(-0), and Math.floor(-0) - - Test: fast/js/math.html - - * kjs/math_object.cpp: (MathFuncImp::callAsFunction): - Fix abs to look at the sign bit. Add a special case for values in the range - between -0 and -1 and a special case for ceil and for -0 for floor. - -2007-10-23 Darin Adler - - Reviewed by Eric. - - - streamline exception handling code for a >1% speed-up of SunSpider - - * kjs/nodes.cpp: Changed macros to use functions for everything that's not - part of normal execution. We'll take function call overhead when propagating - an exception or out of memory. - (KJS::createOutOfMemoryCompletion): Added. - (KJS::substitute): Use append instead of the relatively inefficient + operator. - (KJS::Node::rethrowException): Added. - * kjs/nodes.h: Added rethrowException. - -2007-10-22 Darin Adler - - Reviewed by Maciej. - - - fix http://bugs.webkit.org/show_bug.cgi?id=15636 - some JavaScriptCore regression tests are failing due to numeric conversion - - This should restore correctness and make speed better too, restoring some - of the optimization we lost in my last check-in. - - * kjs/JSImmediate.h: - (KJS::JSImmediate::getTruncatedInt32): Added. Uses the range checking idiom - I used in my patch yesterday. - (KJS::JSImmediate::getTruncatedUInt32): Ditto. - - * kjs/internal.h: Removed getInt32 and added getTruncatedInt/UInt32. - * kjs/internal.cpp: - (KJS::NumberImp::getUInt32): Changed to always use double, since I can't find - a way to write this more efficiently for float. - (KJS::NumberImp::getTruncatedInt32): Added. - (KJS::NumberImp::getTruncatedUInt32): Added. - - * kjs/value.h: Removed getInt32 and added getTruncatedInt/UInt32. - (KJS::JSValue::getUInt32): - (KJS::JSValue::getTruncatedInt32): Added. - (KJS::JSValue::getTruncatedUInt32): Added. - (KJS::JSValue::toInt32): Changed getInt32 call to getTruncatedInt32. - (KJS::JSValue::toUInt32): Changed getUInt32 call to getTruncatedUInt32. - * kjs/value.cpp: - (KJS::JSCell::getTruncatedInt32): Added. - (KJS::JSCell::getTruncatedUInt32): Added. - (KJS::JSValue::toInteger): Changed getUInt32 call to getTruncatedInt32. - (KJS::JSValue::toInt32SlowCase): Removed extra getInt32 call I accidentally - had left in here. - (KJS::JSValue::toUInt32SlowCase): Ditto. - (KJS::JSValue::toUInt16): Changed getUInt32 call to getTruncatedUInt32. - - * JavaScriptCore.exp: Updated. - -2007-10-22 Darin Adler - - Reviewed by Geoff. - - - fix http://bugs.webkit.org/show_bug.cgi?id=15632 - js1_5/Array/array-001.js test failing - - One of the JavaScriptCore tests was failing; it failed because of - my change to NumberImp::getUInt32. The incorrect code I copied was - from JSImmediate::getUInt32, and was a pre-existing bug. - - This patch fixes correctness, but will surely slow down SunSpider. - We may be able to code this tighter and get the speed back. - - * kjs/JSImmediate.h: - (KJS::JSImmediate::getInt32): Renamed from toInt32 to more accurately - reflect the fact that this function only returns true if the value is - accurate (no fractional part, etc.). Changed code so that it returns - false when the value has a fraction. - (KJS::JSImmediate::getUInt32): Ditto. - - * kjs/internal.cpp: - (KJS::NumberImp::getInt32): Changed code so that it returns false when - the value has a fraction. Restores the old behavior. - (KJS::NumberImp::getUInt32): Ditto. - - * kjs/value.h: - (KJS::JSValue::getInt32): Updated for name change. - (KJS::JSValue::getUInt32): Ditto. - (KJS::JSValue::toInt32): Ditto. - (KJS::JSValue::toUInt32): Ditto. - -2007-10-22 Darin Adler - - Reviewed by Brady. - - - fix crash seen when running JavaScriptCore tests - - * kjs/array_instance.cpp: (KJS::ArrayInstance::mark): - Copy and paste error: I accidentally had code here that was - making a copy of the HashMap -- that's illegal inside a mark - function and was unnecessary. The other callsite was modifying - the map as it iterated it, but this function is not. - -2007-10-22 Maciej Stachowiak - - Reviewed by Oliver. - - - Avoid moving floats into integer registers in jsNumber() for 3% speedup on SunSpider - http://bugs.webkit.org/show_bug.cgi?id=15627 - - * kjs/JSImmediate.h: - (KJS::JSImmediate::fromDouble): Avoid moving floats to integer - registers since this is very slow. - -2007-10-22 Darin Adler - - Reviewed by Eric Seidel. - - - http://bugs.webkit.org/show_bug.cgi?id=15617 - improve speed of integer conversions - - Makes SunSpider 6% faster. - - * kjs/JSImmediate.h: Added toInt32 and toUInt32, with separate versions for - 32-bit and 64-bit. - * kjs/value.h: - (KJS::JSValue::getUInt32): Call JSImmediate::toUInt32. - - * kjs/internal.h: Added getInt32. - * kjs/internal.cpp: - (KJS::NumberImp::getInt32): Added. - (KJS::NumberImp::getUInt32): Replaced with more-optimal implementation - stolen from JSValue. - - * kjs/value.h: - (KJS::jsNumber): Marked ALWAYS_INLINE, because this wasn't getting - inlined. - (KJS::JSValue::getInt32): Added. - (KJS::JSValue::getUInt32): Changed to call the new JSImmediate::toUInt32 - to avoid converting from float to double. - (KJS::JSValue::toInt32): Made inline, separated out the slow case. - (KJS::JSValue::toUInt32): Ditto. - * kjs/value.cpp: - (KJS::JSCell::getInt32): Added. - (KJS::JSValue::toInt32SlowCase): Renamed from toInt32. Changed to use the - new getInt32. Added a faster case for in-range numbers. - (KJS::JSValue::toUInt32SlowCase): Ditto. - (KJS::JSValue::toUInt16): Added a faster case for in-range numbers. - - * JavaScriptCore.exp: Updated for changes. - -2007-10-22 Adam Roben - - Windows build fix - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Turn off - warning about implicit conversion to bool. - -2007-10-22 Mark Rowe - - Gtk build fix. - - * kjs/array_instance.cpp: - -2007-10-22 Darin Adler - - Reviewed by Maciej. - - - http://bugs.webkit.org/show_bug.cgi?id=15606 - make cut-off for sparse vs. dense arrays smarter for speed with large arrays - - Makes the morph test in SunSpider 26% faster, and the overall - benchmark 3% faster. - - This also fixes some small problems we had with the distinction - between nonexistent and undefined values in arrays. - - * kjs/array_instance.h: Tweaked formatting and naming. - * kjs/array_instance.cpp: Copied from kjs/array_object.cpp. - (KJS::storageSize): Added. Computes the size of the storage given a vector length. - (KJS::increasedVectorLength): Added. Implements the rule for resizing the vector. - (KJS::isDenseEnoughForVector): Added. - (KJS::ArrayInstance::ArrayInstance): Initialize the new fields. - (KJS::ArrayInstance::~ArrayInstance): Since m_storage is now never 0, delete it. - (KJS::ArrayInstance::getItem): Updated for name changes. - (KJS::ArrayInstance::lengthGetter): Ditto. - (KJS::ArrayInstance::inlineGetOwnPropertySlot): Added. Allows both versions of - getOwnPropertySlot to share more code. - (KJS::ArrayInstance::getOwnPropertySlot): Just refactored, no code change. - (KJS::ArrayInstance::put): Added logic for extending the vector as long as the - array is dense enough. Also keep m_numValuesInVector up to date. - (KJS::ArrayInstance::deleteProperty): Added code to keep m_numValuesInVector - up to date. - (KJS::ArrayInstance::getPropertyNames): Fixed bug where this would omit names - for array indices with undefined values. - (KJS::ArrayInstance::increaseVectorLength): Renamed from resizeStorage. Also - simplified to only handle getting larger. - (KJS::ArrayInstance::setLength): Added code to update m_numValuesInVector, to - zero out the unused part of the vector and to delete the map if it's no longer - needed. - (KJS::ArrayInstance::mark): Tweaked formatting. - (KJS::compareByStringForQSort): Ditto. - (KJS::ArrayInstance::sort): Ditto. - (KJS::CompareWithCompareFunctionArguments::CompareWithCompareFunctionArguments): - Ditto. - (KJS::compareWithCompareFunctionForQSort): Ditto. - (KJS::ArrayInstance::compactForSorting): Fixed bug where this would turn - undefined values into nonexistent values in some cases. - - * kjs/array_object.h: Removed MAX_ARRAY_INDEX. - * kjs/array_object.cpp: Removed ArrayInstance. Moved to a separate file. - - * JavaScriptCore.pri: Added array_instance.cpp. - * JavaScriptCore.xcodeproj/project.pbxproj: Ditto. - * kjs/AllInOneFile.cpp: Ditto. - -2007-10-22 Andrew Wellington - - Reviewed by Mark Rowe. - - Fix for local database support after r26879 - Ensure that ENABLE_DATABASE and ENABLE_ICONDATABASE are correctly set - - * Configurations/JavaScriptCore.xcconfig: - -2007-10-22 Simon Hausmann - - Reviewed by Alp. - - Build fix for the non-qmake builds. - - * wtf/Platform.h: Default to enabling the database features unless - otherwise specified. (similar to ENABLE_ICONDATABASE) - -2007-10-22 Holger Freyther - - Reviewed by Simon Hausmann . - - * Do not build testkjs as an application bundle. This is - needed for run-javascriptcore-tests on OSX. - * Also, based on r26633, allow to test the WebKit/Qt port on OSX. - * Set DYLD_LIBRARY_PATH if it was set in the environment. It must be set - as we do not have -rpath on OSX. - - * kjs/testkjs.pro: - -2007-10-21 Mark Rowe - - Reviewed by Alp. - - http://bugs.webkit.org/show_bug.cgi?id=15575 - Bug 15575: [GTK] Implement threading using GThread - - * wtf/Platform.h: Do not enable pthreads for Gtk. - -2007-10-21 Mark Rowe - - Reviewed by Mitz. - - Fix http://bugs.webkit.org/show_bug.cgi?id=15603 - Bug 15603: Regression(r26847): Crash when sorting an empty array from JavaScript - - * kjs/array_object.cpp: - (KJS::freeStorage): Reinstate null-check that was removed in r26847. - -2007-10-21 Darin Adler - - - fix Windows build - - * kjs/array_instance.h: Removed unused ExecState parameter. - * kjs/array_object.cpp: - (KJS::ArrayInstance::put): Ditto. - (KJS::ArrayInstance::setLength): Ditto. - -2007-10-21 Darin Adler - - * kjs/array_object.cpp: (KJS::ArrayInstance::put): - Add missing assignment that was causing regression test crash. - -2007-10-21 Darin Adler - - Reviewed by Maciej. - - - http://bugs.webkit.org/show_bug.cgi?id=15585 - speed up sparse arrays by using a custom map - - Speeds up SunSpider by 10%. - - * kjs/array_object.cpp: - (allocateStorage): Leave room for an additional pointer. - (reallocateStorage): Ditto. - (freeStorage): Ditto. - (ArrayInstance::~ArrayInstance): Delete the overflow map if present. - (ArrayInstance::getItem): Read values from the overflow map if present. - Removed the check of length, since it slows down the common case. - (ArrayInstance::getOwnPropertySlot): Ditto. Also removed the fallback - to the property map. - (ArrayInstance::put): Write values into the overflow map as needed. - Also create overflow map when needed. - (ArrayInstance::deleteProperty): Remove values from the overflow map - as appropriate. - (ArrayInstance::getPropertyNames): Add a name for each identifier in - the property map. This is extremely inefficient. - (ArrayInstance::setLength): Remove any values in the overflow map - that are past the new length, as we formerly did with the property map. - (ArrayInstance::mark): Mark any values in the overflow map. - (compareByStringForQSort): Removed unneeded undefined case, since - compactForSorting guarantees we will have no undefined values. - (compareWithCompareFunctionForQSort): Ditto. - (ArrayInstance::compactForSorting): Copy all the values out of the - overflow map and destroy it. - - * kjs/property_map.h: Removed now-unused getSparseArrayPropertyNames. - * kjs/property_map.cpp: Ditto. - -2007-10-20 Darin Adler - - Reviewed by Maciej. - - - http://bugs.webkit.org/show_bug.cgi?id=15579 - stop churning identifier reference counts copying Completion objects - - * kjs/completion.h: Replace the Identifier with an Identifier*. - * kjs/nodes.cpp: - (ForInNode::execute): Update for change to Completion constructor. - (ContinueNode::execute): Ditto. - (BreakNode::execute): Ditto. - -2007-10-20 Mark Rowe - - Reviewed by Alp. - - Gtk changes needed to enable HTML 5 client-side database storage. - - * wtf/Platform.h: Have Gtk use pthreads for now. - -2007-10-20 Geoffrey Garen - - Reviewed by Maciej Stachowiak. - - Fixed http://bugs.webkit.org/show_bug.cgi?id=15570 - Store gathered declaration nodes in the function body node. - - This means that you only have to gather the declaration nodes the first - time the function executes. Performance gain of 2.10% on SunSpider, - 0.90% on command-line JS iBench. - - * kjs/nodes.cpp: Split declaration stack initialization code off into - initializeDeclarationStacks(). - (FunctionBodyNode::FunctionBodyNode): - (FunctionBodyNode::initializeDeclarationStacks): - (FunctionBodyNode::processDeclarations): - - * kjs/nodes.h: Changed DeclarationStacks structure to hold references, - since the actual Vectors are now stored either on the stack or in the - function body node. - -2007-10-19 Geoffrey Garen - - Reviewed by Darin Adler. - - http://bugs.webkit.org/show_bug.cgi?id=15559 - Moved processDeclarations call into FunctionBodyNode::execute - - To improve encapsulation, moved processDeclarations call into - FunctionBodyNode::execute. Also marked processDeclarations - ALWAYS_INLINE, since it has only 1 caller now. This is a .71% speedup - on command-line JS iBench. - - * kjs/function.cpp: - (KJS::FunctionImp::callAsFunction): - (KJS::GlobalFuncImp::callAsFunction): - * kjs/function.h: - * kjs/interpreter.cpp: - (KJS::Interpreter::evaluate): - * kjs/nodes.cpp: - (FunctionBodyNode::execute): - * kjs/nodes.h: - -2007-10-19 Brady Eidson - - Reviewed by Sam - - Queue -> Deque! and small style tweaks - - * JavaScriptCore.vcproj/WTF/WTF.vcproj: - * JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj - * wtf/Deque.h: Added. - (WTF::DequeNode::DequeNode): - (WTF::Deque::Deque): - (WTF::Deque::~Deque): - (WTF::Deque::size): - (WTF::Deque::isEmpty): - (WTF::Deque::append): - (WTF::Deque::prepend): - (WTF::Deque::first): - (WTF::Deque::last): - (WTF::Deque::removeFirst): - (WTF::Deque::clear): - * wtf/Queue.h: Removed. - - -2007-10-19 Brady Eidson - - Reviewed by Oliver - - Added a simple LinkedList based Queue to wtf - We can make a better, more sophisticated an efficient one later, but have - needed one for some time, now! - - * JavaScriptCore.xcodeproj/project.pbxproj: - * wtf/Queue.h: Added. - (WTF::QueueNode::QueueNode): - (WTF::Queue::Queue): - (WTF::Queue::~Queue): - (WTF::Queue::size): - (WTF::Queue::isEmpty): - (WTF::Queue::append): - (WTF::Queue::prepend): - (WTF::Queue::first): - (WTF::Queue::last): - (WTF::Queue::removeFirst): - (WTF::Queue::clear): - -2007-10-19 Nikolas Zimmermann - - Reviewed by Anders. - - Try to fix Qt/Win build slave, by including windows.h also on Qt/Win. - - * kjs/testkjs.cpp: Change PLATFORM(WIN) to PLATFORM(WIN_OS) - -2007-10-19 Simon Hausmann - - Reviewed by Lars. - - Fix compilation on Windows when wchar_t is a typedef instead of a native type (triggered by -Zc:wchar_t-). - Don't provide the wchar_t overloads then as they conflict with the unsigned short ones. - - * wtf/ASCIICType.h: - (WTF::isASCIIAlpha): - (WTF::isASCIIAlphanumeric): - (WTF::isASCIIDigit): - (WTF::isASCIIHexDigit): - (WTF::isASCIILower): - (WTF::isASCIISpace): - (WTF::toASCIILower): - (WTF::toASCIIUpper): - -2007-10-19 Simon Hausmann - - Reviewed by Lars. - - Another build fix for the windows/qt build: Apply the same fix as in revision 26686 also to kjs/config.h to disable the disallowctype feature. - - * kjs/config.h: - -2007-10-18 Maciej Stachowiak - - Reviewed by Adam. - - - use __declspec(thread) for fast thread-local storage on Windows - - - 2.2% speedup on sunspider (on Windows) - - 7% speedup on the string section - - 6% speedup on JS iBench - - - fixed PLT on Windows got 2.5% slower between r25406 and r25422 - - fixed at least some of - - Reviewed by Mark Rowe. - - - fix http://bugs.webkit.org/show_bug.cgi?id=15543 - REGRESSION (r26697): - GoogleDocs: Can't create new documents or open existing ones - - Test: fast/js/regexp-non-character.html - - * pcre/pcre_compile.c: (check_escape): Take out the checks for valid characters - in the \u sequences -- not needed and actively harmful. - -2007-10-17 Anders Carlsson - - Reviewed by Oliver. - - * wtf/Platform.h: - #define USE_PTHREADS on Mac. - -2007-10-17 Geoffrey Garen - - Reviewed by Darin Adler. - - Merged DeclaredFunctionImp into FunctionImp (the base class) because - the distinction between the two was unused. - - Removed codeType() from FunctionImp because FunctionImp and its - subclasses all returned FunctionCode, so it was unused, practically - speaking. - - Removed a different codeType() from GlobalFuncImp because it was unused. - (Perhaps it was vestigial from a time when GlobalFuncImp used to - inherit from FunctionImp.) - - * bindings/runtime_method.cpp: - * bindings/runtime_method.h: - * kjs/function.cpp: - (KJS::FunctionImp::FunctionImp): - (KJS::FunctionImp::callAsFunction): - (KJS::FunctionImp::construct): - (KJS::FunctionImp::execute): - (KJS::FunctionImp::processVarDecls): - * kjs/function.h: - (KJS::FunctionImp::implementsConstruct): - (KJS::FunctionImp::scope): - * kjs/function_object.cpp: - (FunctionProtoFunc::callAsFunction): - (FunctionObjectImp::construct): - * kjs/nodes.cpp: - (FuncDeclNode::processFuncDecl): - (FuncExprNode::evaluate): - -2007-10-17 Adam Roben - - Windows build fix part 2. - - Fix was by Darin, reviewed by Anders and Adam. - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Add - FastMallocPCRE.cpp to the project, and let Visual Studio have its way - with the post-build step. - * pcre/pcre.h: Don't DLL export the entry points just because this - is Win32 -- this is an internal copy of PCRE and should be private. - * pcre/pcre_compile.c: Fix an uninitialized variable warning -- - there's no real problem but it's better to quiet the compiler by - tweaking the code slightly than turn off the warning entirely. - -2007-10-17 Adam Roben - - Windows build fix. - - Reviewed by Anders. - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Disable - some mismatched signed/unsigned comparison warnings. - * pcre/pcre_exec.c: - (match): #if-out some labels that don't seem to exist. - -2007-10-17 Mark Rowe - - Gtk build fix. - - * JavaScriptCore.pri: Add FastMallocPCRE.cpp. - * pcre/pcre_get. #if out two functions that depend on pcre_get_stringnumber, which - is currently unavailable for UTF-16. - -2007-10-16 Darin Adler - - Reviewed by Geoff. - - - merged PCRE changes between 6.4 and 6.5 - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - Removed pcre_config.c, pcre_globals.c, pcre_info.c, pcre_maketables.c, - pcre_printint.src, pcre_refcount.c, pcre_study.c, pcre_try_flipped.c, - pcre_ucp_findchar.c, pcre_version.c, and ucptable.c. Added pcre_ucp_searchfuncs.c. - - * pcre/AUTHORS: - * pcre/LICENCE: - * pcre/MERGING: - * pcre/dftables.c: - * pcre/pcre-config.h: - * pcre/pcre.h: - * pcre/pcre.pri: - * pcre/pcre_compile.c: - * pcre/pcre_exec.c: - * pcre/pcre_fullinfo.c: - * pcre/pcre_get.c: - * pcre/pcre_internal.h: - * pcre/pcre_maketables.c: - * pcre/pcre_ord2utf8.c: - * pcre/pcre_tables.c: - * pcre/pcre_ucp_searchfuncs.c: Copied from pcre/pcre_ucp_findchar.c. - * pcre/pcre_xclass.c: - * pcre/ucp.h: - * pcre/ucpinternal.h: - * pcre/ucptable.c: - Updated with new versions from the PCRE 6.5 release, merged with changes. - - * pcre/pcre_config.c: Removed. - * pcre/pcre_globals.c: Removed. - * pcre/pcre_info.c: Removed. - * pcre/pcre_printint.src: Removed. - * pcre/pcre_refcount.c: Removed. - * pcre/pcre_study.c: Removed. - * pcre/pcre_try_flipped.c: Removed. - * pcre/pcre_ucp_findchar.c: Removed. - * pcre/pcre_version.c: Removed. - -2007-10-16 Geoffrey Garen - - Reviewed by Darin Adler. - - Removed KJS_VERBOSE because it was getting in the way of readability, - and the messages didn't seem very helpful. - - * kjs/function.cpp: - (KJS::FunctionImp::callAsFunction): - (KJS::FunctionImp::passInParameters): - * kjs/lookup.h: - (KJS::lookupPut): - * kjs/object.cpp: - (KJS::JSObject::put): - * kjs/value.h: - -2007-10-16 Geoffrey Garen - - Reviewed by Darin Adler. - - Removed the Parameter class because it was a redundant wrapper around - Identifier. - - * kjs/function.cpp: - (KJS::FunctionImp::passInParameters): - (KJS::FunctionImp::getParameterName): - * kjs/nodes.cpp: - (FunctionBodyNode::addParam): - * kjs/nodes.h: - (KJS::FunctionBodyNode::): - -2007-10-16 Geoffrey Garen - - Reviewed by Darin Adler. - - Global replace of assert with ASSERT. - -2007-10-16 Adam Roben - - Make testkjs not delay-load WebKit - - Soon, delay-loading WebKit will be impossible (because we will be - using __declspec(thread) for thread-local storage). This change - prepares testkjs for the future. - - Reviewed by Sam. - - * JavaScriptCore.vcproj/JavaScriptCore.sln: Removed WebKitInitializer, - added FindSafari. - * JavaScriptCore.vcproj/testkjs/testkjs.vcproj: Don't link against - WebKitInitializer, don't delay-load WebKit. - * kjs/testkjs.cpp: Don't use WebKitInitializer. - -2007-10-16 Adam Roben - - Updated testkjs for the rename of WebKit_debug.dll to WebKit.dll for the Debug configuration - - Reviewed by Kevin McCullough. - - * JavaScriptCore.vcproj/debug.vsprops: Added WebKitDLLConfigSuffix. - * JavaScriptCore.vcproj/debug_internal.vsprops: Ditto. - * JavaScriptCore.vcproj/release.vsprops: Ditto. - * JavaScriptCore.vcproj/testkjs/testkjs.vcproj: Use - WebKitDLLConfigSuffix when referring to WebKit.dll, and fixed a typo - in the name of icuuc36[_debug].dll. - -2007-10-16 Geoffrey Garen - - Reviewed by Maciej Stachowiak. - - Re-structured variable and function declaration code. - - Command-line JS iBench shows no regression. - - Here are the changes: - - 1. Function declarations are now processed at the same time as var - declarations -- namely, immediately upon entry to an execution context. - This does not match Firefox, which waits to process a function - declaration until the declaration's containing block executes, but it - does match IE and the ECMA spec. (10.1.3 states that var and function - declarations should be processed at the same time -- namely, "On - entering an execution context." 12.2 states that "A Block does not - define a new execution scope.") - - 2. Declaration processing proceeds iteratively now, rather than - recursively, storing the nodes is finds in stacks. This will later - facilitate an optimization to hold on to the gathered declaration nodes, - rather than re-fetching them in every function call. - [ http://bugs.webkit.org/show_bug.cgi?id=14868 ] - - Modified these tests because they expected the incorrect Mozilla - behavior described above: - - * tests/mozilla/ecma_3/Function/scope-001.js: - * tests/mozilla/js1_5/Scope/regress-184107.js: - -2007-10-16 Darin Adler - - - try to fix the GTK build - - * kjs/ustring.cpp: Include ASCIICType.h, not ASCIICtype.h. - -2007-10-16 Darin Adler - - - try to fix the Windows build - - * kjs/date_object.cpp: (KJS::parseDate): A couple instances of isspace were - in here. Not sure why it wasn't failing elsewhere. Changed to isASCIISpace. - -2007-10-16 Darin Adler - - - try to fix the GTK build - - * kjs/ustring.cpp: Include ASCIICType.h. - -2007-10-16 Darin Adler - - Reviewed by Maciej and Geoff (and looked over by Eric). - - - http://bugs.webkit.org/show_bug.cgi?id=15519 - eliminate use of for processing ASCII - - * wtf/ASCIICType.h: Added. - * wtf/DisallowCType.h: Added. - - * kjs/config.h: Include DisallowCType.h. - - * kjs/date_object.cpp: - (KJS::skipSpacesAndComments): - (KJS::findMonth): - (KJS::parseDate): - * kjs/function.cpp: - (KJS::decode): - * kjs/ustring.cpp: - (KJS::UString::toDouble): - Use ASCIICType.h functions instead of ctype.h ones. - -2007-10-14 Maciej Stachowiak - - Reviewed by Darin. - - - fixes for "New JavaScript benchmark" - http://bugs.webkit.org/show_bug.cgi?id=15515 - - * kjs/testkjs.cpp: - (TestFunctionImp::callAsFunction): Implement "load" for compatibility - with SpiderMonkey. - (TestFunctionImp::): ditto - (doIt): ditto - (kjsmain): Drop useless --> from output. - -2007-10-15 Geoffrey Garen - - Removed unnecessary #include. - - * API/JSObjectRef.cpp: - -2007-10-15 Geoffrey Garen - - Double-reverse build fix. My tree was out of date. - - * kjs/nodes.cpp: - (NumberNode::evaluate): - -2007-10-15 Geoffrey Garen - - Build fix. - - * kjs/nodes.cpp: - (NumberNode::evaluate): - -2007-10-15 Geoffrey Garen - - Reviewed by Darin Adler. - - Removed surprising self-named "hack" that made nested functions - available as named properties of their containing functions, and placed - containing function objects in the scope chains of nested functions. - - There were a few reasons to remove this "hack:" - - 1. It contradicted FF, IE, and the ECMA spec. - - 2. It incurred a performance penalty, since merely parsing a function - required parsing its body for nested functions (and so on). - - 3. SVN history contains no explanation for why it was added. It was just - legacy code in a large merge a long, long time ago. - - [ Patch broken off from http://bugs.webkit.org/show_bug.cgi?id=14868 ] - - * kjs/nodes.cpp: - (FuncDeclNode::processFuncDecl): - -2007-10-15 Geoffrey Garen - - Reviewed by Darin Adler. - - Removed the concept of AnonymousCode. It was unused, and it doesn't - exist in the ECMA spec. - - [ Patch broken off from http://bugs.webkit.org/show_bug.cgi?id=14868 ] - - * kjs/Context.cpp: - (KJS::Context::Context): - * kjs/function.h: - * kjs/nodes.cpp: - (ReturnNode::execute): - -2007-10-15 Geoffrey Garen - - Reviewed by Darin Adler. - - Made function parameters DontDelete. This matches FF and the vague - description in ECMA 10.1.3. It's also required in order to make - symbol table based lookup of function parameters valid. (If the - parameters aren't DontDelete, you can't guarantee that you'll find - them later in the symbol table.) - - [ Patch broken off from http://bugs.webkit.org/show_bug.cgi?id=14868 ] - - * kjs/function.cpp: - (KJS::FunctionImp::passInParameters): - -2007-10-15 Geoffrey Garen - - Reviewed by Maciej Stachowiak. - - Some Vector optimizations. These are especially important when using - Vector as a stack for implementing recursive algorithms iteratively. - - [ Broken off from http://bugs.webkit.org/show_bug.cgi?id=14868 ] - - 1. Added shrink(), which is a version of resize() that you can call - to save a branch / improve code generation and inlining when you know - that the vector is not getting bigger. - - 2. Changed subclassing relationship in VectorBuffer to remove a call to - fastFree() in the destructor for the inlineCapacity != 0 template - specialization. This brings inline Vectors one step closer to true - stack-allocated arrays. - - Also changed abort() to CRASH(), since the latter works better. - - * wtf/Vector.h: - (WTF::VectorBufferBase::allocateBuffer): - (WTF::VectorBufferBase::deallocateBuffer): - (WTF::VectorBufferBase::VectorBufferBase): - (WTF::VectorBufferBase::~VectorBufferBase): - (WTF::): - (WTF::VectorBuffer::VectorBuffer): - (WTF::VectorBuffer::~VectorBuffer): - (WTF::VectorBuffer::deallocateBuffer): - (WTF::VectorBuffer::releaseBuffer): - (WTF::Vector::clear): - (WTF::Vector::removeLast): - (WTF::::operator): - (WTF::::fill): - (WTF::::shrink): - -2007-10-12 Geoffrey Garen - - Reviewed by Maciej Stachowiak. - - Fixed http://bugs.webkit.org/show_bug.cgi?id=15490 - Iteration statements sometimes incorrectly evaluate to the empty value - (KDE r670547). - - [ Broken off from http://bugs.webkit.org/show_bug.cgi?id=14868 ] - - This patch is a merge of KDE r670547, with substantial modification - for performance. - - It fixes do-while statements to evaluate to a value. (They used - to evaluate to the empty value in all cases.) - - It also fixes SourceElementsNode to maintain the value of abnormal - completions like "break" and "continue." - - It also re-works the main execution loop in SourceElementsNode so that - it (1) makes a little more sense and (2) avoids unnecessary work. This - is a .28% speedup on command-line JS iBench. - - * kjs/nodes.cpp: - (DoWhileNode::execute): - (SourceElementsNode::execute): - -2007-10-15 Simon Hausmann - - Reviewed by Lars. - - Fix compilation with gcc 4.3 by including 'limits' due to the use of std::numeric_limits. - - * wtf/HashTraits.h: - -2007-10-5 Kevin Ollivier - - Reviewed by Adam. - - Add support for MSVC7, and fix cases where PLATFORM(WIN) should - be PLATFORM(WIN_OS) for other ports building on Windows. - - * kjs/DateMath.cpp: - (KJS::getDSTOffsetSimple): - * kjs/JSImmediate.h: - * wtf/Assertions.cpp: - * wtf/Assertions.h: - * wtf/Platform.h: - * wtf/StringExtras.h: - (snprintf): - (vsnprintf): - -2007-10-14 Cameron Zwarich - - Reviewed by Darin. - - Adds NegateNode optimization from KJS. The relevant revision in KDE - is 666736. - - * kjs/grammar.y: - * kjs/nodes.cpp: - (NumberNode::evaluate): - * kjs/nodes.h: - (KJS::Node::): - (KJS::NumberNode::): - * kjs/nodes2string.cpp: - (NumberNode::streamTo): - -2007-10-14 Jason Foreman - - Reviewed by Maciej. - - Fix http://bugs.webkit.org/show_bug.cgi?id=15145 - - Ensure that if adjusting n to minimize the difference of n*intPow10(e-p+1) to x, - that the property n < intPow10(p) is maintained. - - * kjs/number_object.cpp: - (NumberProtoFunc::callAsFunction): - -== Rolled over to ChangeLog-2007-10-14 == diff --git a/DerivedSources.make b/DerivedSources.make index 4b33682..9eaccab 100644 --- a/DerivedSources.make +++ b/DerivedSources.make @@ -40,6 +40,7 @@ all : \ chartables.c \ DatePrototype.lut.h \ Grammar.cpp \ + JSONObject.lut.h \ Lexer.lut.h \ MathObject.lut.h \ NumberConstructor.lut.h \ diff --git a/GNUmakefile.am b/GNUmakefile.am index 3d90470..d376b78 100644 --- a/GNUmakefile.am +++ b/GNUmakefile.am @@ -1,4 +1,5 @@ javascriptcore_cppflags += \ + -I$(srcdir)/JavaScriptCore \ -I$(srcdir)/JavaScriptCore/API \ -I$(srcdir)/JavaScriptCore/ForwardingHeaders \ -I$(srcdir)/JavaScriptCore/interpreter \ @@ -13,6 +14,7 @@ javascriptcore_cppflags += \ -I$(srcdir)/JavaScriptCore/jit \ -I$(srcdir)/JavaScriptCore/assembler \ -I$(srcdir)/JavaScriptCore/wtf/unicode \ + -I$(srcdir)/JavaScriptCore/yarr \ -I$(top_builddir)/JavaScriptCore/pcre \ -I$(top_builddir)/JavaScriptCore/parser \ -I$(top_builddir)/JavaScriptCore/runtime @@ -33,6 +35,7 @@ javascriptcore_built_nosources += \ DerivedSources/Lexer.lut.h \ JavaScriptCore/runtime/ArrayPrototype.lut.h \ JavaScriptCore/runtime/DatePrototype.lut.h \ + JavaScriptCore/runtime/JSONObject.lut.h \ JavaScriptCore/runtime/MathObject.lut.h \ JavaScriptCore/runtime/NumberConstructor.lut.h \ JavaScriptCore/runtime/RegExpConstructor.lut.h \ @@ -75,13 +78,17 @@ javascriptcore_sources += \ JavaScriptCore/JavaScriptCorePrefix.h \ JavaScriptCore/jit/ExecutableAllocator.h \ JavaScriptCore/jit/JIT.cpp \ + JavaScriptCore/jit/JITOpcodes.cpp \ JavaScriptCore/jit/JITCall.cpp \ + JavaScriptCore/jit/JITCode.h \ JavaScriptCore/jit/JITPropertyAccess.cpp \ JavaScriptCore/jit/JITArithmetic.cpp \ JavaScriptCore/jit/ExecutableAllocator.cpp \ - JavaScriptCore/jit/ExecutableAllocatorPosix.cpp \ JavaScriptCore/jit/JIT.h \ JavaScriptCore/jit/JITInlineMethods.h \ + JavaScriptCore/jit/JITStubs.cpp \ + JavaScriptCore/jit/JITStubs.h \ + JavaScriptCore/jit/JITStubCall.h \ JavaScriptCore/bytecode/StructureStubInfo.cpp \ JavaScriptCore/bytecode/StructureStubInfo.h \ JavaScriptCore/bytecode/CodeBlock.cpp \ @@ -101,7 +108,6 @@ javascriptcore_sources += \ JavaScriptCore/bytecompiler/RegisterID.h \ JavaScriptCore/bytecode/SamplingTool.cpp \ JavaScriptCore/bytecode/SamplingTool.h \ - JavaScriptCore/bytecompiler/SegmentedVector.h \ JavaScriptCore/config.h \ JavaScriptCore/debugger/DebuggerActivation.cpp \ JavaScriptCore/debugger/DebuggerActivation.h \ @@ -130,8 +136,13 @@ javascriptcore_sources += \ JavaScriptCore/icu/unicode/utypes.h \ JavaScriptCore/icu/unicode/uversion.h \ JavaScriptCore/assembler/X86Assembler.h \ + JavaScriptCore/assembler/AbstractMacroAssembler.h \ JavaScriptCore/assembler/AssemblerBuffer.h \ JavaScriptCore/assembler/MacroAssembler.h \ + JavaScriptCore/assembler/MacroAssemblerCodeRef.h \ + JavaScriptCore/assembler/MacroAssemblerX86.h \ + JavaScriptCore/assembler/MacroAssemblerX86_64.h \ + JavaScriptCore/assembler/MacroAssemblerX86Common.h \ JavaScriptCore/os-win32/stdbool.h \ JavaScriptCore/os-win32/stdint.h \ JavaScriptCore/pcre/pcre.h \ @@ -155,8 +166,12 @@ javascriptcore_sources += \ JavaScriptCore/profiler/Profiler.h \ JavaScriptCore/profiler/TreeProfile.cpp \ JavaScriptCore/profiler/TreeProfile.h \ + JavaScriptCore/interpreter/CachedCall.h \ JavaScriptCore/interpreter/CallFrame.cpp \ JavaScriptCore/interpreter/CallFrame.h \ + JavaScriptCore/interpreter/CallFrameClosure.h \ + JavaScriptCore/runtime/TimeoutChecker.cpp \ + JavaScriptCore/runtime/TimeoutChecker.h \ JavaScriptCore/runtime/InitializeThreading.cpp \ JavaScriptCore/runtime/InitializeThreading.h \ JavaScriptCore/runtime/JSActivation.cpp \ @@ -167,8 +182,12 @@ javascriptcore_sources += \ JavaScriptCore/runtime/JSGlobalData.h \ JavaScriptCore/runtime/JSNotAnObject.cpp \ JavaScriptCore/runtime/JSNotAnObject.h \ + JavaScriptCore/runtime/JSONObject.cpp \ + JavaScriptCore/runtime/JSONObject.h \ JavaScriptCore/runtime/JSPropertyNameIterator.cpp \ JavaScriptCore/runtime/JSPropertyNameIterator.h \ + JavaScriptCore/runtime/LiteralParser.cpp \ + JavaScriptCore/runtime/LiteralParser.h \ JavaScriptCore/runtime/SmallStrings.cpp \ JavaScriptCore/runtime/SmallStrings.h \ JavaScriptCore/runtime/Structure.cpp \ @@ -177,19 +196,13 @@ javascriptcore_sources += \ JavaScriptCore/runtime/StructureChain.h \ JavaScriptCore/runtime/StructureTransitionTable.h \ JavaScriptCore/runtime/TypeInfo.h \ - JavaScriptCore/wrec/CharacterClass.cpp \ JavaScriptCore/wrec/CharacterClass.h \ - JavaScriptCore/wrec/CharacterClassConstructor.cpp \ JavaScriptCore/wrec/CharacterClassConstructor.h \ JavaScriptCore/wrec/Escapes.h \ JavaScriptCore/wrec/Quantifier.h \ - JavaScriptCore/wrec/WREC.cpp \ JavaScriptCore/wrec/WREC.h \ - JavaScriptCore/wrec/WRECFunctors.cpp \ JavaScriptCore/wrec/WRECFunctors.h \ - JavaScriptCore/wrec/WRECGenerator.cpp \ JavaScriptCore/wrec/WRECGenerator.h \ - JavaScriptCore/wrec/WRECParser.cpp \ JavaScriptCore/wrec/WRECParser.h \ JavaScriptCore/wtf/ASCIICType.h \ JavaScriptCore/wtf/AVLTree.h \ @@ -198,8 +211,12 @@ javascriptcore_sources += \ JavaScriptCore/wtf/Assertions.h \ JavaScriptCore/wtf/ByteArray.cpp \ JavaScriptCore/wtf/ByteArray.h \ + JavaScriptCore/wtf/CrossThreadRefCounted.h \ + JavaScriptCore/wtf/OwnFastMallocPtr.h \ JavaScriptCore/wtf/CurrentTime.cpp \ JavaScriptCore/wtf/CurrentTime.h \ + JavaScriptCore/wtf/DateMath.cpp \ + JavaScriptCore/wtf/DateMath.h \ JavaScriptCore/wtf/Deque.h \ JavaScriptCore/wtf/DisallowCType.h \ JavaScriptCore/wtf/Forward.h \ @@ -225,6 +242,8 @@ javascriptcore_sources += \ JavaScriptCore/wtf/NotFound.h \ JavaScriptCore/wtf/OwnArrayPtr.h \ JavaScriptCore/wtf/OwnPtr.h \ + JavaScriptCore/wtf/OwnPtrCommon.h \ + JavaScriptCore/wtf/PassOwnPtr.h \ JavaScriptCore/wtf/PassRefPtr.h \ JavaScriptCore/wtf/Platform.h \ JavaScriptCore/wtf/PtrAndFlags.h \ @@ -237,6 +256,7 @@ javascriptcore_sources += \ JavaScriptCore/wtf/RefPtr.h \ JavaScriptCore/wtf/RefPtrHashMap.h \ JavaScriptCore/wtf/RetainPtr.h \ + JavaScriptCore/wtf/SegmentedVector.h \ JavaScriptCore/wtf/StdLibExtras.h \ JavaScriptCore/wtf/StringExtras.h \ JavaScriptCore/wtf/TCPackedCache.h \ @@ -245,19 +265,58 @@ javascriptcore_sources += \ JavaScriptCore/wtf/ThreadSpecific.h \ JavaScriptCore/wtf/Threading.h \ JavaScriptCore/wtf/Threading.cpp \ - JavaScriptCore/wtf/ThreadingGtk.cpp \ JavaScriptCore/wtf/ThreadingPthreads.cpp \ + JavaScriptCore/wtf/TypeTraits.cpp \ + JavaScriptCore/wtf/TypeTraits.h \ JavaScriptCore/wtf/UnusedParam.h \ JavaScriptCore/wtf/Vector.h \ JavaScriptCore/wtf/VectorTraits.h \ JavaScriptCore/wtf/gtk/MainThreadGtk.cpp \ + JavaScriptCore/wtf/gtk/ThreadingGtk.cpp \ JavaScriptCore/wtf/unicode/Collator.h \ JavaScriptCore/wtf/unicode/CollatorDefault.cpp \ JavaScriptCore/wtf/unicode/UTF8.cpp \ JavaScriptCore/wtf/unicode/UTF8.h \ - JavaScriptCore/wtf/unicode/Unicode.h \ + JavaScriptCore/wtf/unicode/Unicode.h + +if TARGET_WIN32 +javascriptcore_sources += \ + JavaScriptCore/wtf/ThreadSpecificWin.cpp \ + JavaScriptCore/jit/ExecutableAllocatorWin.cpp +else +javascriptcore_sources += \ + JavaScriptCore/jit/ExecutableAllocatorPosix.cpp +endif + +# ---- +# icu unicode backend +# ---- +if USE_ICU_UNICODE +javascriptcore_sources += \ JavaScriptCore/wtf/unicode/icu/CollatorICU.cpp \ JavaScriptCore/wtf/unicode/icu/UnicodeIcu.h +endif # USE_ICU_UNICODE + +# ---- +# glib unicode backend +# ---- +if USE_GLIB_UNICODE +javascriptcore_sources += \ + JavaScriptCore/wtf/unicode/glib/UnicodeGLib.h \ + JavaScriptCore/wtf/unicode/glib/UnicodeGLib.cpp \ + JavaScriptCore/wtf/unicode/glib/UnicodeMacrosFromICU.h +endif + +javascriptcore_sources += \ + JavaScriptCore/wtf/VMTags.h \ + JavaScriptCore/yarr/RegexCompiler.cpp \ + JavaScriptCore/yarr/RegexCompiler.h \ + JavaScriptCore/yarr/RegexInterpreter.cpp \ + JavaScriptCore/yarr/RegexInterpreter.h \ + JavaScriptCore/yarr/RegexJIT.cpp \ + JavaScriptCore/yarr/RegexJIT.h \ + JavaScriptCore/yarr/RegexParser.h \ + JavaScriptCore/yarr/RegexPattern.h # Debug build if ENABLE_DEBUG @@ -275,11 +334,14 @@ javascriptcore_sources += \ JavaScriptCore/debugger/Debugger.h \ JavaScriptCore/parser/Lexer.cpp \ JavaScriptCore/parser/Lexer.h \ + JavaScriptCore/parser/NodeConstructors.h \ JavaScriptCore/parser/NodeInfo.h \ JavaScriptCore/parser/Nodes.cpp \ JavaScriptCore/parser/Nodes.h \ JavaScriptCore/parser/Parser.cpp \ JavaScriptCore/parser/Parser.h \ + JavaScriptCore/parser/ParserArena.cpp \ + JavaScriptCore/parser/ParserArena.h \ JavaScriptCore/parser/ResultType.h \ JavaScriptCore/parser/SourceCode.h \ JavaScriptCore/parser/SourceProvider.h \ @@ -311,10 +373,10 @@ javascriptcore_sources += \ JavaScriptCore/runtime/ConstructData.h \ JavaScriptCore/runtime/DateConstructor.cpp \ JavaScriptCore/runtime/DateConstructor.h \ + JavaScriptCore/runtime/DateConversion.cpp \ + JavaScriptCore/runtime/DateConversion.h \ JavaScriptCore/runtime/DateInstance.cpp \ JavaScriptCore/runtime/DateInstance.h \ - JavaScriptCore/runtime/DateMath.cpp \ - JavaScriptCore/runtime/DateMath.h \ JavaScriptCore/runtime/DatePrototype.cpp \ JavaScriptCore/runtime/DatePrototype.h \ JavaScriptCore/runtime/Error.cpp \ @@ -375,6 +437,7 @@ javascriptcore_sources += \ JavaScriptCore/runtime/NativeErrorConstructor.h \ JavaScriptCore/runtime/NativeErrorPrototype.cpp \ JavaScriptCore/runtime/NativeErrorPrototype.h \ + JavaScriptCore/runtime/NativeFunctionWrapper.h \ JavaScriptCore/runtime/NumberConstructor.cpp \ JavaScriptCore/runtime/NumberConstructor.h \ JavaScriptCore/runtime/NumberObject.cpp \ @@ -419,6 +482,7 @@ javascriptcore_sources += \ JavaScriptCore/runtime/Tracing.h \ JavaScriptCore/runtime/UString.cpp \ JavaScriptCore/runtime/UString.h \ + JavaScriptCore/wtf/FastAllocBase.h \ JavaScriptCore/wtf/FastMalloc.cpp \ JavaScriptCore/wtf/FastMalloc.h \ JavaScriptCore/wtf/MallocZoneSupport.h \ @@ -433,7 +497,9 @@ javascriptcore_built_nosources += \ DerivedSources/Grammar.h javascriptcore_sources += \ - JavaScriptCore/AllInOneFile.cpp + JavaScriptCore/AllInOneFile.cpp \ + JavaScriptCore/parser/ParserArena.cpp \ + JavaScriptCore/parser/ParserArena.h endif # END ENABLE_DEBUG DerivedSources/Grammar.h: DerivedSources/Grammar.cpp; @@ -478,7 +544,6 @@ Programs_minidom_CPPFLAGS = \ Programs_minidom_CFLAGS = \ -ansi \ -fno-strict-aliasing \ - -O2 \ $(global_cflags) \ $(GLOBALDEPS_CFLAGS) @@ -487,6 +552,10 @@ Programs_minidom_LDADD = \ -lm \ -lstdc++ +Programs_minidom_LDFLAGS = \ + -no-install \ + -no-fast-install + # jsc Programs_jsc_SOURCES = \ JavaScriptCore/jsc.cpp @@ -497,7 +566,6 @@ Programs_jsc_CPPFLAGS = \ Programs_jsc_CXXFLAGS = \ -fno-strict-aliasing \ - -O2 \ $(global_cxxflags) \ $(global_cflags) \ $(GLOBALDEPS_CFLAGS) \ @@ -525,6 +593,7 @@ javascriptcore_dist += \ CLEANFILES += \ JavaScriptCore/runtime/ArrayPrototype.lut.h \ JavaScriptCore/runtime/DatePrototype.lut.h \ + JavaScriptCore/runtime/JSONObject.lut.h \ JavaScriptCore/runtime/MathObject.lut.h \ JavaScriptCore/runtime/NumberConstructor.lut.h \ JavaScriptCore/runtime/RegExpConstructor.lut.h \ diff --git a/JavaScriptCore.exp b/JavaScriptCore.exp index 5e1bb78..6d9af9b 100644 --- a/JavaScriptCore.exp +++ b/JavaScriptCore.exp @@ -96,79 +96,77 @@ __ZN3JSC10Identifier24checkSameIdentifierTableEPNS_9ExecStateEPNS_7UString3RepE __ZN3JSC10Identifier3addEPNS_9ExecStateEPKc __ZN3JSC10Identifier5equalEPKNS_7UString3RepEPKc __ZN3JSC10JSFunction4infoE +__ZN3JSC10JSFunctionC1EPNS_9ExecStateEN3WTF10PassRefPtrINS_9StructureEEEiRKNS_10IdentifierEPFNS_7JSValueES2_PNS_8JSObjectESA_RKNS_7ArgListEE __ZN3JSC10throwErrorEPNS_9ExecStateENS_9ErrorTypeE __ZN3JSC10throwErrorEPNS_9ExecStateENS_9ErrorTypeEPKc __ZN3JSC10throwErrorEPNS_9ExecStateENS_9ErrorTypeERKNS_7UStringE -__ZN3JSC11JSByteArray15createStructureENS_10JSValuePtrE +__ZN3JSC11JSByteArray15createStructureENS_7JSValueE __ZN3JSC11JSByteArrayC1EPNS_9ExecStateEN3WTF10PassRefPtrINS_9StructureEEEPNS3_9ByteArrayEPKNS_9ClassInfoE -__ZN3JSC11JSImmediate12nonInlineNaNEv -__ZN3JSC11JSImmediate8toObjectENS_10JSValuePtrEPNS_9ExecStateE -__ZN3JSC11JSImmediate8toStringENS_10JSValuePtrE -__ZN3JSC11JSImmediate9prototypeENS_10JSValuePtrEPNS_9ExecStateE -__ZN3JSC11ProfileNode4sortEPFbRKN3WTF6RefPtrIS0_EES5_E +__ZN3JSC11ParserArena5resetEv __ZN3JSC11checkSyntaxEPNS_9ExecStateERKNS_10SourceCodeE __ZN3JSC12DateInstance4infoE __ZN3JSC12JSGlobalData10ClientDataD2Ev __ZN3JSC12JSGlobalData12createLeakedEv __ZN3JSC12JSGlobalData14sharedInstanceEv -__ZN3JSC12JSGlobalData6createEv +__ZN3JSC12JSGlobalData6createEb __ZN3JSC12JSGlobalDataD1Ev -__ZN3JSC12SamplingTool13notifyOfScopeEPNS_9ScopeNodeE __ZN3JSC12SamplingTool4dumpEPNS_9ExecStateE -__ZN3JSC12SamplingTool4stopEv -__ZN3JSC12SamplingTool5startEj +__ZN3JSC12SamplingTool5setupEv __ZN3JSC12SmallStrings17createEmptyStringEPNS_12JSGlobalDataE __ZN3JSC12StringObject14deletePropertyEPNS_9ExecStateERKNS_10IdentifierE __ZN3JSC12StringObject14toThisJSStringEPNS_9ExecStateE __ZN3JSC12StringObject16getPropertyNamesEPNS_9ExecStateERNS_17PropertyNameArrayE __ZN3JSC12StringObject18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE __ZN3JSC12StringObject18getOwnPropertySlotEPNS_9ExecStateEjRNS_12PropertySlotE -__ZN3JSC12StringObject3putEPNS_9ExecStateERKNS_10IdentifierENS_10JSValuePtrERNS_15PutPropertySlotE +__ZN3JSC12StringObject3putEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueERNS_15PutPropertySlotE __ZN3JSC12StringObject4infoE __ZN3JSC12StringObjectC2EPNS_9ExecStateEN3WTF10PassRefPtrINS_9StructureEEERKNS_7UStringE __ZN3JSC12jsNumberCellEPNS_9ExecStateEd +__ZN3JSC12nonInlineNaNEv +__ZN3JSC13SamplingFlags4stopEv +__ZN3JSC13SamplingFlags5startEv +__ZN3JSC13SamplingFlags7s_flagsE __ZN3JSC13StatementNode6setLocEii __ZN3JSC13jsOwnedStringEPNS_12JSGlobalDataERKNS_7UStringE __ZN3JSC14JSGlobalObject10globalExecEv __ZN3JSC14JSGlobalObject12defineGetterEPNS_9ExecStateERKNS_10IdentifierEPNS_8JSObjectE __ZN3JSC14JSGlobalObject12defineSetterEPNS_9ExecStateERKNS_10IdentifierEPNS_8JSObjectE -__ZN3JSC14JSGlobalObject14setTimeoutTimeEj -__ZN3JSC14JSGlobalObject16stopTimeoutCheckEv -__ZN3JSC14JSGlobalObject17putWithAttributesEPNS_9ExecStateERKNS_10IdentifierENS_10JSValuePtrEj -__ZN3JSC14JSGlobalObject17startTimeoutCheckEv -__ZN3JSC14JSGlobalObject3putEPNS_9ExecStateERKNS_10IdentifierENS_10JSValuePtrERNS_15PutPropertySlotE +__ZN3JSC14JSGlobalObject17putWithAttributesEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueEj +__ZN3JSC14JSGlobalObject3putEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueERNS_15PutPropertySlotE __ZN3JSC14JSGlobalObject4initEPNS_8JSObjectE __ZN3JSC14JSGlobalObject4markEv __ZN3JSC14JSGlobalObjectD2Ev __ZN3JSC14JSGlobalObjectnwEmPNS_12JSGlobalDataE +__ZN3JSC14SamplingThread4stopEv +__ZN3JSC14SamplingThread5startEj +__ZN3JSC14TimeoutChecker5resetEv __ZN3JSC14constructArrayEPNS_9ExecStateERKNS_7ArgListE __ZN3JSC15JSWrapperObject4markEv __ZN3JSC15toInt32SlowCaseEdRb __ZN3JSC16FunctionBodyNode13finishParsingEPNS_10IdentifierEm __ZN3JSC16FunctionBodyNode14copyParametersEv -__ZN3JSC16FunctionBodyNode6createEPNS_12JSGlobalDataEPNS_14SourceElementsEPN3WTF6VectorISt4pairINS_10IdentifierEjELm0EEEPNS6_INS5_6RefPtrINS_12FuncDeclNodeEEELm0EEERKNS_10SourceCodeEji +__ZN3JSC16FunctionBodyNode6createEPNS_12JSGlobalDataEPNS_14SourceElementsEPN3WTF6VectorISt4pairINS_10IdentifierEjELm0EEEPNS6_IPNS_12FuncDeclNodeELm0EEERKNS_10SourceCodeEji __ZN3JSC16InternalFunction4infoE __ZN3JSC16InternalFunction4nameEPNS_12JSGlobalDataE __ZN3JSC16InternalFunctionC2EPNS_12JSGlobalDataEN3WTF10PassRefPtrINS_9StructureEEERKNS_10IdentifierE __ZN3JSC16JSVariableObject14deletePropertyEPNS_9ExecStateERKNS_10IdentifierE __ZN3JSC16JSVariableObject16getPropertyNamesEPNS_9ExecStateERNS_17PropertyNameArrayE -__ZN3JSC16ParserRefCounted3refEv -__ZN3JSC16ParserRefCounted5derefEv __ZN3JSC16toUInt32SlowCaseEdRb __ZN3JSC17BytecodeGenerator21setDumpsGeneratedCodeEb __ZN3JSC17PropertyNameArray3addEPNS_7UString3RepE -__ZN3JSC17PrototypeFunctionC1EPNS_9ExecStateEN3WTF10PassRefPtrINS_9StructureEEEiRKNS_10IdentifierEPFNS_10JSValuePtrES2_PNS_8JSObjectESA_RKNS_7ArgListEE -__ZN3JSC17PrototypeFunctionC1EPNS_9ExecStateEiRKNS_10IdentifierEPFNS_10JSValuePtrES2_PNS_8JSObjectES6_RKNS_7ArgListEE +__ZN3JSC17PrototypeFunctionC1EPNS_9ExecStateEN3WTF10PassRefPtrINS_9StructureEEEiRKNS_10IdentifierEPFNS_7JSValueES2_PNS_8JSObjectESA_RKNS_7ArgListEE +__ZN3JSC17PrototypeFunctionC1EPNS_9ExecStateEiRKNS_10IdentifierEPFNS_7JSValueES2_PNS_8JSObjectES6_RKNS_7ArgListEE __ZN3JSC17constructFunctionEPNS_9ExecStateERKNS_7ArgListERKNS_10IdentifierERKNS_7UStringEi __ZN3JSC18DebuggerActivationC1EPNS_8JSObjectE __ZN3JSC19constructEmptyArrayEPNS_9ExecStateE __ZN3JSC19initializeThreadingEv +__ZN3JSC20MarkedArgumentBuffer10slowAppendENS_7JSValueE __ZN3JSC20constructEmptyObjectEPNS_9ExecStateE -__ZN3JSC23objectProtoFuncToStringEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE +__ZN3JSC23AbstractSamplingCounter4dumpEv +__ZN3JSC23objectProtoFuncToStringEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE __ZN3JSC23setUpStaticFunctionSlotEPNS_9ExecStateEPKNS_9HashEntryEPNS_8JSObjectERKNS_10IdentifierERNS_12PropertySlotE -__ZN3JSC25evaluateInGlobalCallFrameERKNS_7UStringERNS_10JSValuePtrEPNS_14JSGlobalObjectE +__ZN3JSC25evaluateInGlobalCallFrameERKNS_7UStringERNS_7JSValueEPNS_14JSGlobalObjectE __ZN3JSC4Heap11objectCountEv -__ZN3JSC4Heap14allocateNumberEm __ZN3JSC4Heap14primaryHeapEndEv __ZN3JSC4Heap15recordExtraCostEm __ZN3JSC4Heap16primaryHeapBeginEv @@ -177,14 +175,14 @@ __ZN3JSC4Heap20protectedObjectCountEv __ZN3JSC4Heap24setGCProtectNeedsLockingEv __ZN3JSC4Heap25protectedObjectTypeCountsEv __ZN3JSC4Heap26protectedGlobalObjectCountEv -__ZN3JSC4Heap4heapENS_10JSValuePtrE +__ZN3JSC4Heap4heapENS_7JSValueE __ZN3JSC4Heap6isBusyEv __ZN3JSC4Heap7collectEv __ZN3JSC4Heap7destroyEv -__ZN3JSC4Heap7protectENS_10JSValuePtrE +__ZN3JSC4Heap7protectENS_7JSValueE __ZN3JSC4Heap8allocateEm -__ZN3JSC4Heap9unprotectENS_10JSValuePtrE -__ZN3JSC4callEPNS_9ExecStateENS_10JSValuePtrENS_8CallTypeERKNS_8CallDataES2_RKNS_7ArgListE +__ZN3JSC4Heap9unprotectENS_7JSValueE +__ZN3JSC4callEPNS_9ExecStateENS_7JSValueENS_8CallTypeERKNS_8CallDataES2_RKNS_7ArgListE __ZN3JSC5equalEPKNS_7UString3RepES3_ __ZN3JSC6JSCell11getCallDataERNS_8CallDataE __ZN3JSC6JSCell11getJSNumberEv @@ -194,8 +192,8 @@ __ZN3JSC6JSCell14toThisJSStringEPNS_9ExecStateE __ZN3JSC6JSCell16getConstructDataERNS_13ConstructDataE __ZN3JSC6JSCell18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE __ZN3JSC6JSCell18getOwnPropertySlotEPNS_9ExecStateEjRNS_12PropertySlotE -__ZN3JSC6JSCell3putEPNS_9ExecStateERKNS_10IdentifierENS_10JSValuePtrERNS_15PutPropertySlotE -__ZN3JSC6JSCell3putEPNS_9ExecStateEjNS_10JSValuePtrE +__ZN3JSC6JSCell3putEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueERNS_15PutPropertySlotE +__ZN3JSC6JSCell3putEPNS_9ExecStateEjNS_7JSValueE __ZN3JSC6JSCell9getObjectEv __ZN3JSC6JSCellnwEmPNS_9ExecStateE __ZN3JSC6JSLock12DropAllLocksC1EPNS_9ExecStateE @@ -206,7 +204,6 @@ __ZN3JSC6JSLock6unlockEb __ZN3JSC6JSLock9lockCountEv __ZN3JSC6JSLockC1EPNS_9ExecStateE __ZN3JSC6Parser5parseEPNS_12JSGlobalDataEPiPNS_7UStringE -__ZN3JSC7ArgList10slowAppendENS_10JSValuePtrE __ZN3JSC7CStringD1Ev __ZN3JSC7CStringaSERKS0_ __ZN3JSC7JSArray4infoE @@ -214,11 +211,17 @@ __ZN3JSC7Profile10restoreAllEv __ZN3JSC7Profile5focusEPKNS_11ProfileNodeE __ZN3JSC7Profile7excludeEPKNS_11ProfileNodeE __ZN3JSC7Profile7forEachEMNS_11ProfileNodeEFvvE +__ZN3JSC7UString3Rep11computeHashEPKci __ZN3JSC7UString3Rep11computeHashEPKti +__ZN3JSC7UString3Rep12sharedBufferEv +__ZN3JSC7UString3Rep14createFromUTF8EPKc __ZN3JSC7UString3Rep14nullBaseStringE +__ZN3JSC7UString3Rep6createEPtiN3WTF10PassRefPtrINS3_21CrossThreadRefCountedINS3_16OwnFastMallocPtrItEEEEEE __ZN3JSC7UString3Rep7destroyEv +__ZN3JSC7UString4fromEd __ZN3JSC7UString4fromEi __ZN3JSC7UString4fromEj +__ZN3JSC7UString4fromEl __ZN3JSC7UString6appendEPKc __ZN3JSC7UString6appendERKS0_ __ZN3JSC7UStringC1EPKc @@ -228,7 +231,7 @@ __ZN3JSC8Debugger6attachEPNS_14JSGlobalObjectE __ZN3JSC8Debugger6detachEPNS_14JSGlobalObjectE __ZN3JSC8DebuggerC2Ev __ZN3JSC8DebuggerD2Ev -__ZN3JSC8JSObject11hasInstanceEPNS_9ExecStateENS_10JSValuePtrES3_ +__ZN3JSC8JSObject11hasInstanceEPNS_9ExecStateENS_7JSValueES3_ __ZN3JSC8JSObject12defineGetterEPNS_9ExecStateERKNS_10IdentifierEPS0_ __ZN3JSC8JSObject12defineSetterEPNS_9ExecStateERKNS_10IdentifierEPS0_ __ZN3JSC8JSObject12lookupGetterEPNS_9ExecStateERKNS_10IdentifierE @@ -239,35 +242,38 @@ __ZN3JSC8JSObject15unwrappedObjectEv __ZN3JSC8JSObject16getPropertyNamesEPNS_9ExecStateERNS_17PropertyNameArrayE __ZN3JSC8JSObject17createInheritorIDEv __ZN3JSC8JSObject17putDirectFunctionEPNS_9ExecStateEPNS_16InternalFunctionEj -__ZN3JSC8JSObject17putWithAttributesEPNS_9ExecStateERKNS_10IdentifierENS_10JSValuePtrEj -__ZN3JSC8JSObject17putWithAttributesEPNS_9ExecStateEjNS_10JSValuePtrEj +__ZN3JSC8JSObject17putWithAttributesEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueEj +__ZN3JSC8JSObject17putWithAttributesEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueEjbRNS_15PutPropertySlotE +__ZN3JSC8JSObject17putWithAttributesEPNS_9ExecStateEjNS_7JSValueEj __ZN3JSC8JSObject18getOwnPropertySlotEPNS_9ExecStateEjRNS_12PropertySlotE -__ZN3JSC8JSObject18getPrimitiveNumberEPNS_9ExecStateERdRNS_10JSValuePtrE -__ZN3JSC8JSObject22fillGetterPropertySlotERNS_12PropertySlotEPNS_10JSValuePtrE +__ZN3JSC8JSObject18getPrimitiveNumberEPNS_9ExecStateERdRNS_7JSValueE +__ZN3JSC8JSObject22fillGetterPropertySlotERNS_12PropertySlotEPNS_7JSValueE __ZN3JSC8JSObject23allocatePropertyStorageEmm -__ZN3JSC8JSObject3putEPNS_9ExecStateERKNS_10IdentifierENS_10JSValuePtrERNS_15PutPropertySlotE -__ZN3JSC8JSObject3putEPNS_9ExecStateEjNS_10JSValuePtrE +__ZN3JSC8JSObject3putEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueERNS_15PutPropertySlotE +__ZN3JSC8JSObject3putEPNS_9ExecStateEjNS_7JSValueE __ZN3JSC8JSObject4markEv __ZN3JSC8Profiler13stopProfilingEPNS_9ExecStateERKNS_7UStringE __ZN3JSC8Profiler14startProfilingEPNS_9ExecStateERKNS_7UStringE __ZN3JSC8Profiler8profilerEv -__ZN3JSC8evaluateEPNS_9ExecStateERNS_10ScopeChainERKNS_10SourceCodeENS_10JSValuePtrE +__ZN3JSC8evaluateEPNS_9ExecStateERNS_10ScopeChainERKNS_10SourceCodeENS_7JSValueE __ZN3JSC8jsStringEPNS_12JSGlobalDataERKNS_7UStringE __ZN3JSC9CodeBlockD1Ev __ZN3JSC9CodeBlockD2Ev +__ZN3JSC9Structure13hasTransitionEPNS_7UString3RepEj __ZN3JSC9Structure17stopIgnoringLeaksEv __ZN3JSC9Structure18startIgnoringLeaksEv -__ZN3JSC9Structure21addPropertyTransitionEPS0_RKNS_10IdentifierEjRm +__ZN3JSC9Structure21addPropertyTransitionEPS0_RKNS_10IdentifierEjPNS_6JSCellERm __ZN3JSC9Structure22materializePropertyMapEv -__ZN3JSC9Structure25changePrototypeTransitionEPS0_NS_10JSValuePtrE -__ZN3JSC9Structure28addPropertyWithoutTransitionERKNS_10IdentifierEj -__ZN3JSC9Structure3getERKNS_10IdentifierERj -__ZN3JSC9Structure40addPropertyTransitionToExistingStructureEPS0_RKNS_10IdentifierEjRm -__ZN3JSC9StructureC1ENS_10JSValuePtrERKNS_8TypeInfoE +__ZN3JSC9Structure25changePrototypeTransitionEPS0_NS_7JSValueE +__ZN3JSC9Structure27despecifyDictionaryFunctionERKNS_10IdentifierE +__ZN3JSC9Structure27despecifyFunctionTransitionEPS0_RKNS_10IdentifierE +__ZN3JSC9Structure28addPropertyWithoutTransitionERKNS_10IdentifierEjPNS_6JSCellE +__ZN3JSC9Structure3getEPKNS_7UString3RepERjRPNS_6JSCellE +__ZN3JSC9Structure40addPropertyTransitionToExistingStructureEPS0_RKNS_10IdentifierEjPNS_6JSCellERm +__ZN3JSC9StructureC1ENS_7JSValueERKNS_8TypeInfoE __ZN3JSC9StructureD1Ev -__ZN3JSC9constructEPNS_9ExecStateENS_10JSValuePtrENS_13ConstructTypeERKNS_13ConstructDataERKNS_7ArgListE +__ZN3JSC9constructEPNS_9ExecStateENS_7JSValueENS_13ConstructTypeERKNS_13ConstructDataERKNS_7ArgListE __ZN3JSCeqERKNS_7UStringEPKc -__ZN3JSCeqERKNS_7UStringES2_ __ZN3JSCgtERKNS_7UStringES2_ __ZN3JSCltERKNS_7UStringES2_ __ZN3WTF10fastCallocEmm @@ -284,6 +290,7 @@ __ZN3WTF13tryFastCallocEmm __ZN3WTF15ThreadCondition4waitERNS_5MutexE __ZN3WTF15ThreadCondition6signalEv __ZN3WTF15ThreadCondition9broadcastEv +__ZN3WTF15ThreadCondition9timedWaitERNS_5MutexEd __ZN3WTF15ThreadConditionC1Ev __ZN3WTF15ThreadConditionD1Ev __ZN3WTF16callOnMainThreadEPFvPvES0_ @@ -300,6 +307,7 @@ __ZN3WTF23waitForThreadCompletionEjPPv __ZN3WTF27releaseFastMallocFreeMemoryEv __ZN3WTF28setMainThreadCallbacksPausedEb __ZN3WTF36lockAtomicallyInitializedStaticMutexEv +__ZN3WTF37parseDateFromNullTerminatedCharactersEPKc __ZN3WTF38unlockAtomicallyInitializedStaticMutexEv __ZN3WTF5Mutex4lockEv __ZN3WTF5Mutex6unlockEv @@ -313,31 +321,34 @@ __ZN3WTF8CollatorC1EPKc __ZN3WTF8CollatorD1Ev __ZN3WTF8fastFreeEPv __ZN3WTF9ByteArray6createEm -__ZNK3JSC10JSValuePtr9toIntegerEPNS_9ExecStateE __ZNK3JSC11Interpreter14retrieveCallerEPNS_9ExecStateEPNS_16InternalFunctionE -__ZNK3JSC11Interpreter18retrieveLastCallerEPNS_9ExecStateERiRlRNS_7UStringERNS_10JSValuePtrE +__ZNK3JSC11Interpreter18retrieveLastCallerEPNS_9ExecStateERiRlRNS_7UStringERNS_7JSValueE __ZNK3JSC12DateInstance7getTimeERdRi __ZNK3JSC12StringObject12toThisStringEPNS_9ExecStateE __ZNK3JSC12StringObject8toStringEPNS_9ExecStateE __ZNK3JSC14JSGlobalObject14isDynamicScopeEv +__ZNK3JSC16FunctionBodyNode14isHostFunctionEv __ZNK3JSC16InternalFunction9classInfoEv __ZNK3JSC16JSVariableObject16isVariableObjectEv __ZNK3JSC16JSVariableObject21getPropertyAttributesEPNS_9ExecStateERKNS_10IdentifierERj __ZNK3JSC17DebuggerCallFrame10thisObjectEv __ZNK3JSC17DebuggerCallFrame12functionNameEv +__ZNK3JSC17DebuggerCallFrame22calculatedFunctionNameEv __ZNK3JSC17DebuggerCallFrame4typeEv -__ZNK3JSC17DebuggerCallFrame8evaluateERKNS_7UStringERNS_10JSValuePtrE +__ZNK3JSC17DebuggerCallFrame8evaluateERKNS_7UStringERNS_7JSValueE __ZNK3JSC4Heap10statisticsEv __ZNK3JSC6JSCell12toThisObjectEPNS_9ExecStateE __ZNK3JSC6JSCell12toThisStringEPNS_9ExecStateE __ZNK3JSC6JSCell14isGetterSetterEv -__ZNK3JSC6JSCell17getTruncatedInt32ERi -__ZNK3JSC6JSCell18getTruncatedUInt32ERj __ZNK3JSC6JSCell9classInfoEv __ZNK3JSC6JSCell9getStringERNS_7UStringE __ZNK3JSC6JSCell9getStringEv __ZNK3JSC6JSCell9getUInt32ERj __ZNK3JSC7ArgList8getSliceEiRS0_ +__ZNK3JSC7JSValue16toObjectSlowCaseEPNS_9ExecStateE +__ZNK3JSC7JSValue19synthesizePrototypeEPNS_9ExecStateE +__ZNK3JSC7JSValue20toThisObjectSlowCaseEPNS_9ExecStateE +__ZNK3JSC7JSValue9toIntegerEPNS_9ExecStateE __ZNK3JSC7UString10UTF8StringEb __ZNK3JSC7UString14toStrictUInt32EPb __ZNK3JSC7UString5asciiEv @@ -363,6 +374,7 @@ __ZTVN3JSC14JSGlobalObjectE __ZTVN3JSC15JSWrapperObjectE __ZTVN3JSC16InternalFunctionE __ZTVN3JSC16JSVariableObjectE +__ZTVN3JSC17JSAPIValueWrapperE __ZTVN3JSC8JSObjectE __ZTVN3JSC8JSStringE _jscore_fastmalloc_introspection diff --git a/JavaScriptCore.gypi b/JavaScriptCore.gypi new file mode 100644 index 0000000..2d69c7d --- /dev/null +++ b/JavaScriptCore.gypi @@ -0,0 +1,452 @@ +{ + 'variables': { + 'javascriptcore_files': [ + 'AllInOneFile.cpp', + 'API/APICast.h', + 'API/JavaScript.h', + 'API/JavaScriptCore.h', + 'API/JSBase.cpp', + 'API/JSBase.h', + 'API/JSBasePrivate.h', + 'API/JSCallbackConstructor.cpp', + 'API/JSCallbackConstructor.h', + 'API/JSCallbackFunction.cpp', + 'API/JSCallbackFunction.h', + 'API/JSCallbackObject.cpp', + 'API/JSCallbackObject.h', + 'API/JSCallbackObjectFunctions.h', + 'API/JSClassRef.cpp', + 'API/JSClassRef.h', + 'API/JSContextRef.cpp', + 'API/JSContextRef.h', + 'API/JSObjectRef.cpp', + 'API/JSObjectRef.h', + 'API/JSProfilerPrivate.cpp', + 'API/JSProfilerPrivate.h', + 'API/JSRetainPtr.h', + 'API/JSStringRef.cpp', + 'API/JSStringRef.h', + 'API/JSStringRefBSTR.cpp', + 'API/JSStringRefBSTR.h', + 'API/JSStringRefCF.cpp', + 'API/JSStringRefCF.h', + 'API/JSValueRef.cpp', + 'API/JSValueRef.h', + 'API/OpaqueJSString.cpp', + 'API/OpaqueJSString.h', + 'API/tests/JSNode.h', + 'API/tests/JSNodeList.h', + 'API/tests/Node.h', + 'API/tests/NodeList.h', + 'API/WebKitAvailability.h', + 'assembler/AbstractMacroAssembler.h', + 'assembler/ARMv7Assembler.h', + 'assembler/AssemblerBuffer.h', + 'assembler/CodeLocation.h', + 'assembler/MacroAssembler.h', + 'assembler/MacroAssemblerARMv7.h', + 'assembler/MacroAssemblerCodeRef.h', + 'assembler/MacroAssemblerX86.h', + 'assembler/MacroAssemblerX86_64.h', + 'assembler/MacroAssemblerX86Common.h', + 'assembler/X86Assembler.h', + 'bytecode/CodeBlock.cpp', + 'bytecode/CodeBlock.h', + 'bytecode/EvalCodeCache.h', + 'bytecode/Instruction.h', + 'bytecode/JumpTable.cpp', + 'bytecode/JumpTable.h', + 'bytecode/Opcode.cpp', + 'bytecode/Opcode.h', + 'bytecode/SamplingTool.cpp', + 'bytecode/SamplingTool.h', + 'bytecode/StructureStubInfo.cpp', + 'bytecode/StructureStubInfo.h', + 'bytecompiler/BytecodeGenerator.cpp', + 'bytecompiler/BytecodeGenerator.h', + 'bytecompiler/Label.h', + 'bytecompiler/LabelScope.h', + 'bytecompiler/RegisterID.h', + 'config.h', + 'debugger/Debugger.cpp', + 'debugger/Debugger.h', + 'debugger/DebuggerActivation.cpp', + 'debugger/DebuggerActivation.h', + 'debugger/DebuggerCallFrame.cpp', + 'debugger/DebuggerCallFrame.h', + 'icu/unicode/parseerr.h', + 'icu/unicode/platform.h', + 'icu/unicode/putil.h', + 'icu/unicode/uchar.h', + 'icu/unicode/ucnv.h', + 'icu/unicode/ucnv_err.h', + 'icu/unicode/ucol.h', + 'icu/unicode/uconfig.h', + 'icu/unicode/uenum.h', + 'icu/unicode/uiter.h', + 'icu/unicode/uloc.h', + 'icu/unicode/umachine.h', + 'icu/unicode/unorm.h', + 'icu/unicode/urename.h', + 'icu/unicode/uset.h', + 'icu/unicode/ustring.h', + 'icu/unicode/utf.h', + 'icu/unicode/utf16.h', + 'icu/unicode/utf8.h', + 'icu/unicode/utf_old.h', + 'icu/unicode/utypes.h', + 'icu/unicode/uversion.h', + 'interpreter/CachedCall.h', + 'interpreter/CallFrame.cpp', + 'interpreter/CallFrame.h', + 'interpreter/CallFrameClosure.h', + 'interpreter/Interpreter.cpp', + 'interpreter/Interpreter.h', + 'interpreter/Register.h', + 'interpreter/RegisterFile.cpp', + 'interpreter/RegisterFile.h', + 'JavaScriptCorePrefix.h', + 'jit/ExecutableAllocator.cpp', + 'jit/ExecutableAllocator.h', + 'jit/ExecutableAllocatorFixedVMPool.cpp', + 'jit/ExecutableAllocatorPosix.cpp', + 'jit/ExecutableAllocatorWin.cpp', + 'jit/JIT.cpp', + 'jit/JIT.h', + 'jit/JITArithmetic.cpp', + 'jit/JITCall.cpp', + 'jit/JITCode.h', + 'jit/JITInlineMethods.h', + 'jit/JITOpcodes.cpp', + 'jit/JITPropertyAccess.cpp', + 'jit/JITStubCall.h', + 'jit/JITStubs.cpp', + 'jit/JITStubs.h', + 'jsc.cpp', + 'os-win32/stdbool.h', + 'os-win32/stdint.h', + 'parser/Lexer.cpp', + 'parser/Lexer.h', + 'parser/NodeConstructors.h', + 'parser/NodeInfo.h', + 'parser/Nodes.cpp', + 'parser/Nodes.h', + 'parser/Parser.cpp', + 'parser/Parser.h', + 'parser/ParserArena.cpp', + 'parser/ParserArena.h', + 'parser/ResultType.h', + 'parser/SourceCode.h', + 'parser/SourceProvider.h', + 'pcre/pcre.h', + 'pcre/pcre_compile.cpp', + 'pcre/pcre_exec.cpp', + 'pcre/pcre_internal.h', + 'pcre/pcre_tables.cpp', + 'pcre/pcre_ucp_searchfuncs.cpp', + 'pcre/pcre_xclass.cpp', + 'pcre/ucpinternal.h', + 'pcre/ucptable.cpp', + 'profiler/CallIdentifier.h', + 'profiler/HeavyProfile.cpp', + 'profiler/HeavyProfile.h', + 'profiler/Profile.cpp', + 'profiler/Profile.h', + 'profiler/ProfileGenerator.cpp', + 'profiler/ProfileGenerator.h', + 'profiler/ProfileNode.cpp', + 'profiler/ProfileNode.h', + 'profiler/Profiler.cpp', + 'profiler/Profiler.h', + 'profiler/ProfilerServer.h', + 'profiler/TreeProfile.cpp', + 'profiler/TreeProfile.h', + 'runtime/ArgList.cpp', + 'runtime/ArgList.h', + 'runtime/Arguments.cpp', + 'runtime/Arguments.h', + 'runtime/ArrayConstructor.cpp', + 'runtime/ArrayConstructor.h', + 'runtime/ArrayPrototype.cpp', + 'runtime/ArrayPrototype.h', + 'runtime/BatchedTransitionOptimizer.h', + 'runtime/BooleanConstructor.cpp', + 'runtime/BooleanConstructor.h', + 'runtime/BooleanObject.cpp', + 'runtime/BooleanObject.h', + 'runtime/BooleanPrototype.cpp', + 'runtime/BooleanPrototype.h', + 'runtime/CallData.cpp', + 'runtime/CallData.h', + 'runtime/ClassInfo.h', + 'runtime/Collector.cpp', + 'runtime/Collector.h', + 'runtime/CollectorHeapIterator.h', + 'runtime/CommonIdentifiers.cpp', + 'runtime/CommonIdentifiers.h', + 'runtime/Completion.cpp', + 'runtime/Completion.h', + 'runtime/ConstructData.cpp', + 'runtime/ConstructData.h', + 'runtime/DateConstructor.cpp', + 'runtime/DateConstructor.h', + 'runtime/DateConversion.cpp', + 'runtime/DateConversion.h', + 'runtime/DateInstance.cpp', + 'runtime/DateInstance.h', + 'runtime/DatePrototype.cpp', + 'runtime/DatePrototype.h', + 'runtime/Error.cpp', + 'runtime/Error.h', + 'runtime/ErrorConstructor.cpp', + 'runtime/ErrorConstructor.h', + 'runtime/ErrorInstance.cpp', + 'runtime/ErrorInstance.h', + 'runtime/ErrorPrototype.cpp', + 'runtime/ErrorPrototype.h', + 'runtime/ExceptionHelpers.cpp', + 'runtime/ExceptionHelpers.h', + 'runtime/FunctionConstructor.cpp', + 'runtime/FunctionConstructor.h', + 'runtime/FunctionPrototype.cpp', + 'runtime/FunctionPrototype.h', + 'runtime/GetterSetter.cpp', + 'runtime/GetterSetter.h', + 'runtime/GlobalEvalFunction.cpp', + 'runtime/GlobalEvalFunction.h', + 'runtime/Identifier.cpp', + 'runtime/Identifier.h', + 'runtime/InitializeThreading.cpp', + 'runtime/InitializeThreading.h', + 'runtime/InternalFunction.cpp', + 'runtime/InternalFunction.h', + 'runtime/JSActivation.cpp', + 'runtime/JSActivation.h', + 'runtime/JSArray.cpp', + 'runtime/JSArray.h', + 'runtime/JSByteArray.cpp', + 'runtime/JSByteArray.h', + 'runtime/JSCell.cpp', + 'runtime/JSCell.h', + 'runtime/JSFunction.cpp', + 'runtime/JSFunction.h', + 'runtime/JSGlobalData.cpp', + 'runtime/JSGlobalData.h', + 'runtime/JSGlobalObject.cpp', + 'runtime/JSGlobalObject.h', + 'runtime/JSGlobalObjectFunctions.cpp', + 'runtime/JSGlobalObjectFunctions.h', + 'runtime/JSImmediate.cpp', + 'runtime/JSImmediate.h', + 'runtime/JSLock.cpp', + 'runtime/JSLock.h', + 'runtime/JSNotAnObject.cpp', + 'runtime/JSNotAnObject.h', + 'runtime/JSNumberCell.cpp', + 'runtime/JSNumberCell.h', + 'runtime/JSObject.cpp', + 'runtime/JSObject.h', + 'runtime/JSONObject.cpp', + 'runtime/JSONObject.h', + 'runtime/JSPropertyNameIterator.cpp', + 'runtime/JSPropertyNameIterator.h', + 'runtime/JSStaticScopeObject.cpp', + 'runtime/JSStaticScopeObject.h', + 'runtime/JSString.cpp', + 'runtime/JSString.h', + 'runtime/JSType.h', + 'runtime/JSValue.cpp', + 'runtime/JSValue.h', + 'runtime/JSVariableObject.cpp', + 'runtime/JSVariableObject.h', + 'runtime/JSWrapperObject.cpp', + 'runtime/JSWrapperObject.h', + 'runtime/LiteralParser.cpp', + 'runtime/LiteralParser.h', + 'runtime/Lookup.cpp', + 'runtime/Lookup.h', + 'runtime/MathObject.cpp', + 'runtime/MathObject.h', + 'runtime/NativeErrorConstructor.cpp', + 'runtime/NativeErrorConstructor.h', + 'runtime/NativeErrorPrototype.cpp', + 'runtime/NativeErrorPrototype.h', + 'runtime/NativeFunctionWrapper.h', + 'runtime/NumberConstructor.cpp', + 'runtime/NumberConstructor.h', + 'runtime/NumberObject.cpp', + 'runtime/NumberObject.h', + 'runtime/NumberPrototype.cpp', + 'runtime/NumberPrototype.h', + 'runtime/ObjectConstructor.cpp', + 'runtime/ObjectConstructor.h', + 'runtime/ObjectPrototype.cpp', + 'runtime/ObjectPrototype.h', + 'runtime/Operations.cpp', + 'runtime/Operations.h', + 'runtime/PropertyMapHashTable.h', + 'runtime/PropertyNameArray.cpp', + 'runtime/PropertyNameArray.h', + 'runtime/PropertySlot.cpp', + 'runtime/PropertySlot.h', + 'runtime/Protect.h', + 'runtime/PrototypeFunction.cpp', + 'runtime/PrototypeFunction.h', + 'runtime/PutPropertySlot.h', + 'runtime/RegExp.cpp', + 'runtime/RegExp.h', + 'runtime/RegExpConstructor.cpp', + 'runtime/RegExpConstructor.h', + 'runtime/RegExpMatchesArray.h', + 'runtime/RegExpObject.cpp', + 'runtime/RegExpObject.h', + 'runtime/RegExpPrototype.cpp', + 'runtime/RegExpPrototype.h', + 'runtime/ScopeChain.cpp', + 'runtime/ScopeChain.h', + 'runtime/ScopeChainMark.h', + 'runtime/SmallStrings.cpp', + 'runtime/SmallStrings.h', + 'runtime/StringConstructor.cpp', + 'runtime/StringConstructor.h', + 'runtime/StringObject.cpp', + 'runtime/StringObject.h', + 'runtime/StringObjectThatMasqueradesAsUndefined.h', + 'runtime/StringPrototype.cpp', + 'runtime/StringPrototype.h', + 'runtime/Structure.cpp', + 'runtime/Structure.h', + 'runtime/StructureChain.cpp', + 'runtime/StructureChain.h', + 'runtime/StructureTransitionTable.h', + 'runtime/SymbolTable.h', + 'runtime/TimeoutChecker.cpp', + 'runtime/TimeoutChecker.h', + 'runtime/Tracing.h', + 'runtime/TypeInfo.h', + 'runtime/UString.cpp', + 'runtime/UString.h', + 'wrec/CharacterClass.cpp', + 'wrec/CharacterClass.h', + 'wrec/CharacterClassConstructor.cpp', + 'wrec/CharacterClassConstructor.h', + 'wrec/Escapes.h', + 'wrec/Quantifier.h', + 'wrec/WREC.cpp', + 'wrec/WREC.h', + 'wrec/WRECFunctors.cpp', + 'wrec/WRECFunctors.h', + 'wrec/WRECGenerator.cpp', + 'wrec/WRECGenerator.h', + 'wrec/WRECParser.cpp', + 'wrec/WRECParser.h', + 'wtf/AlwaysInline.h', + 'wtf/ASCIICType.h', + 'wtf/Assertions.cpp', + 'wtf/Assertions.h', + 'wtf/AVLTree.h', + 'wtf/ByteArray.cpp', + 'wtf/ByteArray.h', + 'wtf/chromium/ChromiumThreading.h', + 'wtf/chromium/MainThreadChromium.cpp', + 'wtf/CrossThreadRefCounted.h', + 'wtf/CurrentTime.cpp', + 'wtf/CurrentTime.h', + 'wtf/DateMath.cpp', + 'wtf/DateMath.h', + 'wtf/Deque.h', + 'wtf/DisallowCType.h', + 'wtf/dtoa.cpp', + 'wtf/dtoa.h', + 'wtf/FastAllocBase.h', + 'wtf/FastMalloc.cpp', + 'wtf/FastMalloc.h', + 'wtf/Forward.h', + 'wtf/GetPtr.h', + 'wtf/GOwnPtr.cpp', + 'wtf/GOwnPtr.h', + 'wtf/gtk/MainThreadGtk.cpp', + 'wtf/gtk/ThreadingGtk.cpp', + 'wtf/HashCountedSet.h', + 'wtf/HashFunctions.h', + 'wtf/HashIterators.h', + 'wtf/HashMap.h', + 'wtf/HashSet.h', + 'wtf/HashTable.cpp', + 'wtf/HashTable.h', + 'wtf/HashTraits.h', + 'wtf/ListHashSet.h', + 'wtf/ListRefPtr.h', + 'wtf/Locker.h', + 'wtf/MainThread.cpp', + 'wtf/MainThread.h', + 'wtf/MallocZoneSupport.h', + 'wtf/MathExtras.h', + 'wtf/MessageQueue.h', + 'wtf/Noncopyable.h', + 'wtf/NotFound.h', + 'wtf/OwnArrayPtr.h', + 'wtf/OwnFastMallocPtr.h', + 'wtf/OwnPtr.h', + 'wtf/OwnPtrCommon.h', + 'wtf/OwnPtrWin.cpp', + 'wtf/PassOwnPtr.h', + 'wtf/PassRefPtr.h', + 'wtf/Platform.h', + 'wtf/PtrAndFlags.h', + 'wtf/qt/MainThreadQt.cpp', + 'wtf/qt/ThreadingQt.cpp', + 'wtf/RandomNumber.cpp', + 'wtf/RandomNumber.h', + 'wtf/RandomNumberSeed.h', + 'wtf/RefCounted.h', + 'wtf/RefCountedLeakCounter.cpp', + 'wtf/RefCountedLeakCounter.h', + 'wtf/RefPtr.h', + 'wtf/RefPtrHashMap.h', + 'wtf/RetainPtr.h', + 'wtf/SegmentedVector.h', + 'wtf/StdLibExtras.h', + 'wtf/StringExtras.h', + 'wtf/TCPackedCache.h', + 'wtf/TCPageMap.h', + 'wtf/TCSpinLock.h', + 'wtf/TCSystemAlloc.cpp', + 'wtf/TCSystemAlloc.h', + 'wtf/Threading.cpp', + 'wtf/Threading.h', + 'wtf/ThreadingNone.cpp', + 'wtf/ThreadingPthreads.cpp', + 'wtf/ThreadingWin.cpp', + 'wtf/ThreadSpecific.h', + 'wtf/ThreadSpecificWin.cpp', + 'wtf/TypeTraits.cpp', + 'wtf/TypeTraits.h', + 'wtf/unicode/Collator.h', + 'wtf/unicode/CollatorDefault.cpp', + 'wtf/unicode/glib/UnicodeGLib.cpp', + 'wtf/unicode/glib/UnicodeGLib.h', + 'wtf/unicode/glib/UnicodeMacrosFromICU.h', + 'wtf/unicode/icu/CollatorICU.cpp', + 'wtf/unicode/icu/UnicodeIcu.h', + 'wtf/unicode/qt4/UnicodeQt4.h', + 'wtf/unicode/Unicode.h', + 'wtf/unicode/UTF8.cpp', + 'wtf/unicode/UTF8.h', + 'wtf/UnusedParam.h', + 'wtf/Vector.h', + 'wtf/VectorTraits.h', + 'wtf/VMTags.h', + 'wtf/win/MainThreadWin.cpp', + 'wtf/wx/MainThreadWx.cpp', + 'yarr/RegexCompiler.cpp', + 'yarr/RegexCompiler.h', + 'yarr/RegexInterpreter.cpp', + 'yarr/RegexInterpreter.h', + 'yarr/RegexJIT.cpp', + 'yarr/RegexJIT.h', + 'yarr/RegexParser.h', + 'yarr/RegexPattern.h', + ] + } +} diff --git a/JavaScriptCore.iPhone.order b/JavaScriptCore.iPhone.order index 7be22ae..4cff982 100644 --- a/JavaScriptCore.iPhone.order +++ b/JavaScriptCore.iPhone.order @@ -1,10 +1,10 @@ -__ZN3JSC19initializeThreadingEv -dyld_stub_binding_helper -__ZN3JSCL23initializeThreadingOnceEv -__ZN3WTF19initializeThreadingEv +// JavaScriptCore order file generated on Fri Feb 19 17:16:12 -0800 2010 by Andrew Turley (aturley@apple.com) +// Scenario included SpringBoard launch/unlock with passcode, launching all apps, MobileSafari page loads, +// keyboard usage and general app interaction. __ZN3WTF10fastMallocEm __ZN3WTF10fastMallocILb1EEEPvm __ZN3WTF20TCMalloc_ThreadCache10InitModuleEv + stub helpers __ZN3WTFL15InitSizeClassesEv __Z20TCMalloc_SystemAllocmPmm __ZN3WTF20TCMalloc_ThreadCache22CreateCacheIfNecessaryEv @@ -13,23 +13,23 @@ __ZN3WTF25TCMalloc_Central_FreeList18FetchFromSpansSafeEv __ZN3WTF17TCMalloc_PageHeap10AllocLargeEm __ZN3WTF17TCMalloc_PageHeap8GrowHeapEm __ZN3WTFL13MetaDataAllocEm -__Z22TCMalloc_SystemReleasePvm +__ZN3WTF17TCMalloc_PageHeap6DeleteEPNS_4SpanE +__ZN3WTF16fastZeroedMallocEm +__ZN3WTF8fastFreeEPv +__ZN3WTF12isMainThreadEv __ZN3WTFL25identifierByPthreadHandleERKP17_opaque_pthread_t __ZN3WTFL35establishIdentifierForPthreadHandleERP17_opaque_pthread_t __ZN3WTF9HashTableIjSt4pairIjP17_opaque_pthread_tENS_18PairFirstExtractorIS4_EENS_7IntHashIjEENS_14PairHashTraitsINS_10HashTraitsIjEENSA_IS3_EEEESB_E6rehashEi -__ZN3WTF16fastZeroedMallocEm -__ZN3WTF8fastFreeEPv -__ZN3WTF22initializeMainNSThreadEv +__ZN3JSC19initializeThreadingEv +__ZN3JSCL23initializeThreadingOnceEv +__ZN3WTF19initializeThreadingEv __ZN3WTF20initializeMainThreadEv __ZN3WTF5MutexC1Ev +__ZN3WTF28initializeMainThreadPlatformEv __ZN3JSC17initializeUStringEv -__ZN3JSC12initDateMathEv +__ZN3WTF15initializeDatesEv __ZN3WTF11currentTimeEv __ZN3WTF14FastMallocZone4sizeEP14_malloc_zone_tPKv -__ZN3WTF20TCMalloc_ThreadCache18DestroyThreadCacheEPv -__ZN3WTF20TCMalloc_ThreadCache11DeleteCacheEPS0_ -__ZN3WTF25TCMalloc_Central_FreeList11InsertRangeEPvS1_i -__ZN3WTF25TCMalloc_Central_FreeList18ReleaseListToSpansEPv __ZN3WTF36lockAtomicallyInitializedStaticMutexEv __ZN3WTF38unlockAtomicallyInitializedStaticMutexEv __ZN3JSC8DebuggerC2Ev @@ -39,91 +39,101 @@ __ZN3WTF6strtodEPKcPPc __ZN3JSC6JSLock12DropAllLocksC1Eb __ZN3JSCL17createJSLockCountEv __ZN3JSC6JSLock12DropAllLocksD1Ev +__ZN3WTF20TCMalloc_ThreadCache18DestroyThreadCacheEPv +__ZN3WTF20TCMalloc_ThreadCache11DeleteCacheEPS0_ +__ZN3WTF25TCMalloc_Central_FreeList11InsertRangeEPvS1_i +__ZN3WTF25TCMalloc_Central_FreeList18ReleaseListToSpansEPv +__ZN3WTF5MutexD1Ev __ZN3WTF15ThreadConditionC1Ev __ZN3WTF12createThreadEPFPvS0_ES0_PKc __ZN3WTF20createThreadInternalEPFPvS0_ES0_PKc -__ZN3WTF15ThreadCondition4waitERNS_5MutexE __ZN3WTFL16threadEntryPointEPv -__ZN3WTF5MutexD1Ev +__ZN3WTF21setThreadNameInternalEPKc __ZN3WTF13currentThreadEv __ZN3WTF15ThreadCondition9broadcastEv __ZN3WTF15ThreadCondition6signalEv __ZN3WTF16callOnMainThreadEPFvPvES0_ -__ZN3WTF6VectorINS_19FunctionWithContextELm0EE14expandCapacityEm +__ZN3WTF5DequeINS_19FunctionWithContextEE14expandCapacityEv __ZN3WTF37scheduleDispatchFunctionsOnMainThreadEv -__ZN3WTF12mainNSThreadEv -[WTFMainThreadCaller call] __ZN3WTF31dispatchFunctionsFromMainThreadEv __ZN3WTF11fastReallocEPvm __ZN3WTF11fastReallocILb1EEEPvS1_m +__Z15jsRegExpCompilePKti24JSRegExpIgnoreCaseOption23JSRegExpMultilineOptionPjPPKc +__ZL30calculateCompiledPatternLengthPKti24JSRegExpIgnoreCaseOptionR11CompileDataR9ErrorCode +__ZL11checkEscapePPKtS0_P9ErrorCodeib +__ZL13compileBranchiPiPPhPPKtS3_P9ErrorCodeS_S_R11CompileData +__Z15jsRegExpExecutePK8JSRegExpPKtiiPii +__ZL5matchPKtPKhiR9MatchData __ZN3WTF25TCMalloc_Central_FreeList11ShrinkCacheEib __ZN3JSC7UStringC1EPKti __ZN3JSC7UStringC2EPKti __ZN3JSC12JSGlobalData12createLeakedEv -__ZN3JSC12JSGlobalDataC2Eb -__ZN3JSC11InterpreterC1Ev -__ZN3JSC11InterpreterC2Ev -__ZN3JSC11Interpreter14privateExecuteENS0_13ExecutionFlagEPNS_12RegisterFileEPNS_9ExecStateEPNS_10JSValuePtrE -__ZN3WTF7HashMapIPvN3JSC8OpcodeIDENS_7PtrHashIS1_EENS_10HashTraitsIS1_EENS6_IS3_EEE3addERKS1_RKS3_ -__ZN3WTF9HashTableIPvSt4pairIS1_N3JSC8OpcodeIDEENS_18PairFirstExtractorIS5_EENS_7PtrHashIS1_EENS_14PairHashTraitsINS_10HashTraitsIS1_EENSB_IS4_EEEESC_E6expandEv -__ZN3JSC9StructureC1ENS_10JSValuePtrERKNS_8TypeInfoE +__ZN3JSC9Structure18startIgnoringLeaksEv +__ZN3JSC7VPtrSetC2Ev +__ZN3JSC9StructureC1ENS_7JSValueERKNS_8TypeInfoE __ZN3JSC7JSArrayC1EN3WTF10PassRefPtrINS_9StructureEEE __ZN3JSC7JSArrayD1Ev __ZN3JSC7JSArrayD2Ev __ZN3WTF10RefCountedIN3JSC9StructureEE5derefEv __ZN3JSC9StructureD1Ev __ZN3JSC9StructureD2Ev -__ZN3JSC11JSByteArray15createStructureENS_10JSValuePtrE +__ZN3JSC11JSByteArray15createStructureENS_7JSValueE __ZN3JSC11JSByteArrayD1Ev __ZN3JSC8JSStringD1Ev -__ZN3WTF6RefPtrIN3JSC7UString3RepEED1Ev __ZN3JSC10JSFunctionD1Ev -__ZN3JSC8JSObjectD2Ev +__ZN3JSC12JSGlobalDataC2EbRKNS_7VPtrSetE __ZN3JSC21createIdentifierTableEv __ZN3JSC17CommonIdentifiersC1EPNS_12JSGlobalDataE __ZN3JSC17CommonIdentifiersC2EPNS_12JSGlobalDataE __ZN3JSC10Identifier3addEPNS_12JSGlobalDataEPKc __ZN3WTF7HashSetIPN3JSC7UString3RepENS_7StrHashIS4_EENS_10HashTraitsIS4_EEE3addIPKcNS1_17CStringTranslatorEEESt4pairINS_24HashTableIteratorAdapterINS_9HashTableIS4_S4_NS_17IdentityExtractorIS4_EES6_S8_S8_EES4_EEbERKT_ __ZN3WTF9HashTableIPN3JSC7UString3RepES4_NS_17IdentityExtractorIS4_EENS_7StrHashIS4_EENS_10HashTraitsIS4_EESA_E6rehashEi -__ZN3WTF7HashMapIPKcNS_6RefPtrIN3JSC7UString3RepEEENS_7PtrHashIS2_EENS_10HashTraitsIS2_EENSA_IS7_EEE3addERKS2_RKS7_ __ZN3WTF9HashTableIPKcSt4pairIS2_NS_6RefPtrIN3JSC7UString3RepEEEENS_18PairFirstExtractorIS9_EENS_7PtrHashIS2_EENS_14PairHashTraitsINS_10HashTraitsIS2_EENSF_IS8_EEEESG_E6rehashEi __ZN3JSC12SmallStringsC1Ev __ZN3JSC5LexerC1EPNS_12JSGlobalDataE __ZN3JSC5LexerC2EPNS_12JSGlobalDataE +__ZN3JSC11InterpreterC1Ev +__ZN3JSC11InterpreterC2Ev +__ZN3JSC11Interpreter14privateExecuteENS0_13ExecutionFlagEPNS_12RegisterFileEPNS_9ExecStateEPNS_7JSValueE +__ZN3WTF9HashTableIPKvSt4pairIS2_N3JSC8OpcodeIDEENS_18PairFirstExtractorIS6_EENS_7PtrHashIS2_EENS_14PairHashTraitsINS_10HashTraitsIS2_EENSC_IS5_EEEESD_E6expandEv +__ZN3JSC14TimeoutCheckerC1Ev __ZN3JSC4HeapC1EPNS_12JSGlobalDataE __ZN3JSC27startProfilerServerIfNeededEv +[ProfilerServer sharedProfileServer] -[ProfilerServer init] -__ZN3JSC11Interpreter10initializeEPNS_12JSGlobalDataE +__ZN3JSC9Structure17stopIgnoringLeaksEv __ZN3JSC4Heap8allocateEm __ZN3JSCL13allocateBlockILNS_8HeapTypeE0EEEPNS_14CollectorBlockEv +__ZN3JSC4Heap4heapENS_7JSValueE +__ZN3JSC4Heap7protectENS_7JSValueE +__ZN3WTF9HashTableIPN3JSC6JSCellESt4pairIS3_jENS_18PairFirstExtractorIS5_EENS_7PtrHashIS3_EENS_14PairHashTraitsINS_10HashTraitsIS3_EENSB_IjEEEESC_E6rehashEi __ZN3JSC14JSGlobalObjectnwEmPNS_12JSGlobalDataE __ZN3JSC14JSGlobalObject4initEPNS_8JSObjectE -__ZN3JSC14JSGlobalObject5resetENS_10JSValuePtrE +__ZN3JSC14JSGlobalObject5resetENS_7JSValueE __ZN3JSC4Heap12heapAllocateILNS_8HeapTypeE0EEEPvm -__ZN3JSC17FunctionPrototypeC2EPNS_9ExecStateEN3WTF10PassRefPtrINS_9StructureEEE __ZN3JSC8jsStringEPNS_12JSGlobalDataERKNS_7UStringE __ZN3JSC12SmallStrings17createEmptyStringEPNS_12JSGlobalDataE __ZN3JSC7UStringC1EPKc __ZN3JSCL9createRepEPKc -__ZN3JSC8JSObject9putDirectERKNS_10IdentifierENS_10JSValuePtrEjbRNS_15PutPropertySlotE -__ZN3JSC9Structure40addPropertyTransitionToExistingStructureEPS0_RKNS_10IdentifierEjRm -__ZN3JSC9Structure3getERKNS_10IdentifierERj -__ZN3JSC9Structure21addPropertyTransitionEPS0_RKNS_10IdentifierEjRm -__ZN3JSC9Structure3putERKNS_10IdentifierEj -__ZN3JSC9Structure28addPropertyWithoutTransitionERKNS_10IdentifierEj -__ZN3JSC17FunctionPrototype21addFunctionPropertiesEPNS_9ExecStateEPNS_9StructureE -__ZN3JSC17PrototypeFunctionC2EPNS_9ExecStateEN3WTF10PassRefPtrINS_9StructureEEEiRKNS_10IdentifierEPFNS_10JSValuePtrES2_PNS_8JSObjectESA_RKNS_7ArgListEE +__ZN3JSC8JSObject17putDirectInternalERKNS_10IdentifierENS_7JSValueEjbRNS_15PutPropertySlotEPNS_6JSCellE +__ZN3JSC9Structure40addPropertyTransitionToExistingStructureEPS0_RKNS_10IdentifierEjPNS_6JSCellERm +__ZN3JSC9Structure3getEPKNS_7UString3RepERjRPNS_6JSCellE +__ZN3JSC9Structure21addPropertyTransitionEPS0_RKNS_10IdentifierEjPNS_6JSCellERm +__ZN3JSC9Structure3putERKNS_10IdentifierEjPNS_6JSCellE +__ZN3JSC9Structure28addPropertyWithoutTransitionERKNS_10IdentifierEjPNS_6JSCellE +__ZN3JSC17FunctionPrototype21addFunctionPropertiesEPNS_9ExecStateEPNS_9StructureEPPNS_17PrototypeFunctionES7_ +__ZN3JSC17PrototypeFunctionC2EPNS_9ExecStateEN3WTF10PassRefPtrINS_9StructureEEEiRKNS_10IdentifierEPFNS_7JSValueES2_PNS_8JSObjectESA_RKNS_7ArgListEE __ZN3JSC8JSObject34putDirectFunctionWithoutTransitionEPNS_9ExecStateEPNS_16InternalFunctionEj __ZN3JSC15ObjectPrototypeC2EPNS_9ExecStateEN3WTF10PassRefPtrINS_9StructureEEEPS5_ __ZN3JSC9Structure26rehashPropertyMapHashTableEj __ZN3JSC15StringPrototypeC2EPNS_9ExecStateEN3WTF10PassRefPtrINS_9StructureEEE __ZN3JSC16BooleanPrototypeC2EPNS_9ExecStateEN3WTF10PassRefPtrINS_9StructureEEEPS5_ __ZN3JSC15NumberPrototypeC2EPNS_9ExecStateEN3WTF10PassRefPtrINS_9StructureEEEPS5_ -__ZN3JSC12jsNumberCellEPNS_9ExecStateEd __ZN3JSCL13allocateBlockILNS_8HeapTypeE1EEEPNS_14CollectorBlockEv __ZN3JSC15RegExpPrototypeC2EPNS_9ExecStateEN3WTF10PassRefPtrINS_9StructureEEEPS5_ __ZN3JSC14ErrorPrototypeC2EPNS_9ExecStateEN3WTF10PassRefPtrINS_9StructureEEEPS5_ +__ZN3WTF6RefPtrIN3JSC7UString3RepEED1Ev __ZN3JSC20NativeErrorPrototypeC2EPNS_9ExecStateEN3WTF10PassRefPtrINS_9StructureEEERKNS_7UStringES9_ __ZN3JSC17ObjectConstructorC2EPNS_9ExecStateEN3WTF10PassRefPtrINS_9StructureEEEPNS_15ObjectPrototypeE __ZN3JSC19FunctionConstructorC2EPNS_9ExecStateEN3WTF10PassRefPtrINS_9StructureEEEPNS_17FunctionPrototypeE @@ -142,118 +152,141 @@ __ZN3JSC16ErrorConstructorC2EPNS_9ExecStateEN3WTF10PassRefPtrINS_9StructureEEEPN __ZNK3JSC13ErrorInstance9classInfoEv __ZN3JSC22NativeErrorConstructorC2EPNS_9ExecStateEN3WTF10PassRefPtrINS_9StructureEEEPNS_20NativeErrorPrototypeE __ZN3JSC10Identifier11addSlowCaseEPNS_12JSGlobalDataEPNS_7UString3RepE +__ZN3WTF7HashSetIPN3JSC7UString3RepENS_7StrHashIS4_EENS_10HashTraitsIS4_EEE3addERKS4_ __ZN3JSC10MathObjectC2EPNS_9ExecStateEN3WTF10PassRefPtrINS_9StructureEEE __ZN3JSC12SmallStrings24singleCharacterStringRepEh +__ZN3JSC7JSValueC1EPNS_9ExecStateEd __ZN3WTF7HashMapINS_6RefPtrIN3JSC7UString3RepEEENS2_16SymbolTableEntryENS2_17IdentifierRepHashENS_10HashTraitsIS5_EENS2_26SymbolTableIndexHashTraitsEE3addEPS4_RKS6_ __ZN3WTF9HashTableINS_6RefPtrIN3JSC7UString3RepEEESt4pairIS5_NS2_16SymbolTableEntryEENS_18PairFirstExtractorIS8_EENS2_17IdentifierRepHashENS_14PairHashTraitsINS_10HashTraitsIS5_EENS2_26SymbolTableIndexHashTraitsEEESE_E6expandEv -__ZN3JSC9Structure25changePrototypeTransitionEPS0_NS_10JSValuePtrE +__ZN3JSC9Structure25changePrototypeTransitionEPS0_NS_7JSValueE __ZN3JSC9Structure17copyPropertyTableEv -__ZN3JSC14JSGlobalObject14setTimeoutTimeEj __ZN3JSC14JSGlobalObject10globalExecEv __ZN3JSC10Identifier3addEPNS_9ExecStateEPKc -__ZN3JSC4Heap4heapENS_10JSValuePtrE -__ZN3JSC4Heap7protectENS_10JSValuePtrE -__ZN3WTF7HashMapIPN3JSC6JSCellEjNS_7PtrHashIS3_EENS_10HashTraitsIS3_EENS6_IjEEE3addERKS3_RKj -__ZN3WTF9HashTableIPN3JSC6JSCellESt4pairIS3_jENS_18PairFirstExtractorIS5_EENS_7PtrHashIS3_EENS_14PairHashTraitsINS_10HashTraitsIS3_EENSB_IjEEEESC_E6rehashEi +__ZN3JSC4Heap9unprotectENS_7JSValueE __ZN3JSC6JSCellnwEmPNS_9ExecStateE __ZN3JSC10Identifier11addSlowCaseEPNS_9ExecStateEPNS_7UString3RepE __ZNK3JSC9HashTable11createTableEPNS_12JSGlobalDataE -__ZN3JSC14JSGlobalObject3putEPNS_9ExecStateERKNS_10IdentifierENS_10JSValuePtrERNS_15PutPropertySlotE -__ZN3JSC8JSObject3putEPNS_9ExecStateERKNS_10IdentifierENS_10JSValuePtrERNS_15PutPropertySlotE -__ZN3JSC14JSGlobalObject17startTimeoutCheckEv -__ZN3JSC11Interpreter17resetTimeoutCheckEv -__ZN3JSC8evaluateEPNS_9ExecStateERNS_10ScopeChainERKNS_10SourceCodeENS_10JSValuePtrE +__ZN3JSC14JSGlobalObject3putEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueERNS_15PutPropertySlotE +__ZN3JSC8JSObject3putEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueERNS_15PutPropertySlotE +__ZN3JSC7UString3Rep12sharedBufferEv +__ZN3JSC14TimeoutChecker5resetEv +__ZN3JSC8evaluateEPNS_9ExecStateERNS_10ScopeChainERKNS_10SourceCodeENS_7JSValueE __ZN3JSC6JSLock4lockEb __ZN3JSC6Parser5parseINS_11ProgramNodeEEEN3WTF10PassRefPtrIT_EEPNS_9ExecStateEPNS_8DebuggerERKNS_10SourceCodeEPiPNS_7UStringE __ZN3JSC6Parser5parseEPNS_12JSGlobalDataEPiPNS_7UStringE __ZN3JSC7UStringaSEPKc __Z10jscyyparsePv __ZN3JSC5Lexer3lexEPvS1_ -__ZN3WTF6VectorItLm0EE6appendItEEvRKT_ -__ZN3WTF6VectorItLm0EE15reserveCapacityEm __ZN3JSC10Identifier3addEPNS_12JSGlobalDataEPKti __ZN3WTF7HashSetIPN3JSC7UString3RepENS_7StrHashIS4_EENS_10HashTraitsIS4_EEE3addINS1_11UCharBufferENS1_21UCharBufferTranslatorEEESt4pairINS_24HashTableIteratorAdapterINS_9HashTableIS4_S4_NS_17IdentityExtractorIS4_EES6_S8_S8_EES4_EEbERKT_ -__ZN3WTF7HashSetIPN3JSC16ParserRefCountedENS_7PtrHashIS3_EENS_10HashTraitsIS3_EEE3addERKS3_ -__ZN3WTF9HashTableIPN3JSC16ParserRefCountedES3_NS_17IdentityExtractorIS3_EENS_7PtrHashIS3_EENS_10HashTraitsIS3_EES9_E6rehashEi -__ZN3JSC16ParserRefCountedC2EPNS_12JSGlobalDataE -__ZN3JSC16ParserRefCounted3refEv -__ZL14makeAssignNodePvPN3JSC14ExpressionNodeENS0_8OperatorES2_bbiii -__ZNK3JSC11ResolveNode10isLocationEv -__ZNK3JSC11ResolveNode13isResolveNodeEv -__ZN3JSC14SourceElements6appendEN3WTF10PassRefPtrINS_13StatementNodeEEE +__ZN3WTF15SegmentedVectorIN3JSC10IdentifierELm64EE6appendIS2_EEvRKT_ +__ZN3JSC5Lexer10sourceCodeEiii +__ZN3JSC16FunctionBodyNode13finishParsingERKNS_10SourceCodeEPNS_13ParameterNodeE +__ZN3JSC20ParserArenaDeletablenwEmPNS_12JSGlobalDataE +__ZN3WTF6VectorIPN3JSC20ParserArenaDeletableELm0EE14expandCapacityEm +__ZN3WTF6VectorIPN3JSC12FuncDeclNodeELm0EE14expandCapacityEm +__ZN3JSC14SourceElements6appendEPNS_13StatementNodeE __ZNK3JSC13StatementNode16isEmptyStatementEv -__Z21mergeDeclarationListsIPN3JSC20ParserRefCountedDataIN3WTF6VectorINS2_6RefPtrINS0_12FuncDeclNodeEEELm0EEEEEET_SA_SA_ +__ZN3WTF6VectorIPN3JSC13StatementNodeELm0EE14expandCapacityEm +__ZN3WTF6VectorIN3JSC10IdentifierELm0EE14expandCapacityEm +__ZN3JSC5Lexer10scanRegExpEv +__ZN3WTF6VectorItLm0EE14expandCapacityEmPKt +__ZN3JSC7UStringC2ERKN3WTF6VectorItLm0EEE __ZL20makeFunctionCallNodePvN3JSC8NodeInfoIPNS0_14ExpressionNodeEEENS1_IPNS0_13ArgumentsNodeEEEiii __ZNK3JSC15DotAccessorNode10isLocationEv __ZNK3JSC14ExpressionNode13isResolveNodeEv __ZNK3JSC14ExpressionNode21isBracketAccessorNodeEv -__ZN3WTF7HashMapIPN3JSC16ParserRefCountedEjNS_7PtrHashIS3_EENS_10HashTraitsIS3_EENS6_IjEEE3addERKS3_RKj -__ZN3WTF9HashTableIPN3JSC16ParserRefCountedESt4pairIS3_jENS_18PairFirstExtractorIS5_EENS_7PtrHashIS3_EENS_14PairHashTraitsINS_10HashTraitsIS3_EENSB_IjEEEESC_E6rehashEi -__ZN3JSC6Parser16didFinishParsingEPNS_14SourceElementsEPNS_20ParserRefCountedDataIN3WTF6VectorISt4pairINS_10IdentifierEjELm0EEEEEPNS3_INS5_INS4_6RefPtrINS_12FuncDeclNodeEEELm0EEEEEjii +__ZN3WTF6VectorIPN3JSC13StatementNodeELm0EE14shrinkCapacityEm +__ZN3JSC5Lexer7record8Ei +__ZL14makeAssignNodePvPN3JSC14ExpressionNodeENS0_8OperatorES2_bbiii +__ZN3JSC7UString3Rep7destroyEv +__ZNK3JSC11ResolveNode10isLocationEv +__ZNK3JSC11ResolveNode13isResolveNodeEv +__ZL26appendToVarDeclarationListPvRPN3JSC15ParserArenaDataIN3WTF6VectorISt4pairINS0_10IdentifierEjELm0EEEEERKS5_j +__ZN3WTF6VectorISt4pairIN3JSC10IdentifierEjELm0EE14expandCapacityEm +__ZNK3JSC14ExpressionNode10isLocationEv __ZN3JSC5Lexer5clearEv -__ZN3JSC16ParserRefCounted16deleteNewObjectsEPNS_12JSGlobalDataE -__ZN3JSC11ResolveNodeD0Ev -__ZN3JSC15DotAccessorNodeD0Ev -__ZN3JSC12NodeReleaser15releaseAllNodesEPNS_16ParserRefCountedE -__ZN3JSC15DotAccessorNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC12NodeReleaser7releaseINS_14ExpressionNodeEEEvRN3WTF6RefPtrIT_EE -__ZN3JSC12NodeReleaser5adoptEN3WTF10PassRefPtrINS_16ParserRefCountedEEE -__ZN3JSC16ParserRefCounted9hasOneRefEv -__ZN3JSC16ParserRefCounted5derefEv -__ZN3JSC9ScopeNodeC2EPNS_12JSGlobalDataERKNS_10SourceCodeEPNS_14SourceElementsEPN3WTF6VectorISt4pairINS_10IdentifierEjELm0EEEPNS9_INS8_6RefPtrINS_12FuncDeclNodeEEELm0EEEji -__ZN3WTF6VectorINS_6RefPtrIN3JSC13StatementNodeEEELm0EE14shrinkCapacityEm -__ZN3JSC14SourceElementsD0Ev +__ZN3JSC10Identifier6removeEPNS_7UString3RepE +__ZN3WTF6VectorIN3JSC10IdentifierELm64EE14shrinkCapacityEm +__ZN3JSC9ScopeNodeC2EPNS_12JSGlobalDataERKNS_10SourceCodeEPNS_14SourceElementsEPN3WTF6VectorISt4pairINS_10IdentifierEjELm0EEEPNS9_IPNS_12FuncDeclNodeELm0EEEji +__ZN3JSC11ParserArena10removeLastEv +__ZN3JSC11ParserArena5resetEv __ZNK3JSC8JSObject8toObjectEPNS_9ExecStateE -__ZN3JSC11Interpreter7executeEPNS_11ProgramNodeEPNS_9ExecStateEPNS_14ScopeChainNodeEPNS_8JSObjectEPNS_10JSValuePtrE +__ZN3JSC11Interpreter7executeEPNS_11ProgramNodeEPNS_9ExecStateEPNS_14ScopeChainNodeEPNS_8JSObjectEPNS_7JSValueE __ZN3JSC11ProgramNode16generateBytecodeEPNS_14ScopeChainNodeE __ZN3JSC9CodeBlockC2EPNS_9ScopeNodeENS_8CodeTypeEN3WTF10PassRefPtrINS_14SourceProviderEEEj -__ZN3WTF7HashSetIPN3JSC16ProgramCodeBlockENS_7PtrHashIS3_EENS_10HashTraitsIS3_EEE3addERKS3_ __ZN3WTF9HashTableIPN3JSC16ProgramCodeBlockES3_NS_17IdentityExtractorIS3_EENS_7PtrHashIS3_EENS_10HashTraitsIS3_EES9_E6rehashEi __ZN3JSC17BytecodeGeneratorC2EPNS_11ProgramNodeEPKNS_8DebuggerERKNS_10ScopeChainEPN3WTF7HashMapINS9_6RefPtrINS_7UString3RepEEENS_16SymbolTableEntryENS_17IdentifierRepHashENS9_10HashTraitsISE_EENS_26SymbolTableIndexHashTraitsEEEPNS_16ProgramCodeBlockE -__ZN3WTF6VectorIN3JSC11InstructionELm0EE15reserveCapacityEm -__ZN3JSC9Structure22toDictionaryTransitionEPS0_ -__ZN3JSC17BytecodeGenerator11newRegisterEv -__ZN3JSC9Structure24fromDictionaryTransitionEPS0_ +__ZN3WTF6VectorIN3JSC11InstructionELm0EE14expandCapacityEm +__ZN3JSC9Structure31toCacheableDictionaryTransitionEPS0_ +__ZN3JSC9Structure22toDictionaryTransitionEPS0_NS0_14DictionaryKindE +__ZN3JSC8JSObject12removeDirectERKNS_10IdentifierE +__ZN3JSC9Structure24removePropertyTransitionEPS0_RKNS_10IdentifierERm +__ZN3JSC9Structure6removeERKNS_10IdentifierE +__ZN3JSC17BytecodeGenerator12addGlobalVarERKNS_10IdentifierEbRPNS_10RegisterIDE +__ZN3JSC17BytecodeGenerator15emitNewFunctionEPNS_10RegisterIDEPNS_12FuncDeclNodeE +__ZN3JSC9CodeBlock25createRareDataIfNecessaryEv +__ZN3WTF6VectorINS_6RefPtrIN3JSC12FuncDeclNodeEEELm0EE14expandCapacityEm +__ZN3JSC9Structure31removePropertyWithoutTransitionERKNS_10IdentifierE +__ZNK3JSC7UString14toStrictUInt32EPb +__ZN3JSC9Structure26flattenDictionaryStructureEPNS_8JSObjectE +__ZN3JSCL30comparePropertyMapEntryIndicesEPKvS1_ __ZN3JSC17BytecodeGenerator8generateEv __ZN3JSC11ProgramNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE __ZN3JSC17BytecodeGenerator13emitDebugHookENS_11DebugHookIDEii -__ZN3JSC17BytecodeGenerator11addConstantENS_10JSValuePtrE -__ZN3WTF7HashMapIPN3JSC23JSValueEncodedAsPointerEjNS_7PtrHashIS3_EENS1_17BytecodeGenerator17JSValueHashTraitsENS_10HashTraitsIjEEE3addERKS3_RKj -__ZN3WTF9HashTableIPN3JSC23JSValueEncodedAsPointerESt4pairIS3_jENS_18PairFirstExtractorIS5_EENS_7PtrHashIS3_EENS_14PairHashTraitsINS1_17BytecodeGenerator17JSValueHashTraitsENS_10HashTraitsIjEEEESC_E6rehashEi +__ZN3JSC17BytecodeGenerator12newTemporaryEv +__ZN3JSC17BytecodeGenerator11newRegisterEv +__ZN3JSC17BytecodeGenerator16addConstantValueENS_7JSValueE +__ZN3WTF9HashTableIPvSt4pairIS1_jENS_18PairFirstExtractorIS3_EENS_7PtrHashIS1_EENS_14PairHashTraitsIN3JSC24EncodedJSValueHashTraitsENS_10HashTraitsIjEEEESA_E6expandEv __ZN3WTF6VectorIN3JSC8RegisterELm0EE14expandCapacityEm __ZN3JSC17BytecodeGenerator8emitMoveEPNS_10RegisterIDES2_ -__ZNK3JSC13StatementNode6isLoopEv __ZN3JSC17BytecodeGenerator8emitNodeEPNS_10RegisterIDEPNS_4NodeE __ZN3WTF6VectorIN3JSC8LineInfoELm0EE14expandCapacityEm -__ZN3JSC17ExprStatementNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC17AssignResolveNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC17BytecodeGenerator11registerForERKNS_10IdentifierE -__ZN3JSC17BytecodeGenerator18findScopedPropertyERKNS_10IdentifierERiRmbRPNS_8JSObjectE -__ZN3JSC17BytecodeGenerator15emitResolveBaseEPNS_10RegisterIDERKNS_10IdentifierE -__ZN3JSC17BytecodeGenerator11addConstantERKNS_10IdentifierE -__ZN3WTF7HashMapINS_6RefPtrIN3JSC7UString3RepEEEiNS2_17IdentifierRepHashENS_10HashTraitsIS5_EENS2_17BytecodeGenerator28IdentifierMapIndexHashTraitsEE3addEPS4_RKi -__ZN3WTF9HashTableINS_6RefPtrIN3JSC7UString3RepEEESt4pairIS5_iENS_18PairFirstExtractorIS7_EENS2_17IdentifierRepHashENS_14PairHashTraitsINS_10HashTraitsIS5_EENS2_17BytecodeGenerator28IdentifierMapIndexHashTraitsEEESD_E6rehashEi -__ZN3WTF6VectorIN3JSC10IdentifierELm0EE14expandCapacityEm +__ZN3JSC12FuncDeclNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC6IfNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC17BytecodeGenerator8newLabelEv +__ZN3JSC13LogicalOpNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC12BinaryOpNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZNK3JSC14ExpressionNode6isNullEv +__ZNK3JSC14ExpressionNode6isPureERNS_17BytecodeGeneratorE __ZN3JSC15DotAccessorNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE __ZN3JSC11ResolveNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC17BytecodeGenerator11registerForERKNS_10IdentifierE __ZN3WTF6VectorIN3JSC19ExpressionRangeInfoELm0EE14expandCapacityEm -__ZN3JSC17BytecodeGenerator12newTemporaryEv -__ZN3JSC17BytecodeGenerator11emitResolveEPNS_10RegisterIDERKNS_10IdentifierE -__ZN3WTF6VectorIjLm0EE14expandCapacityEm __ZN3JSC17BytecodeGenerator11emitGetByIdEPNS_10RegisterIDES2_RKNS_10IdentifierE -__ZN3JSC17BytecodeGenerator11emitPutByIdEPNS_10RegisterIDERKNS_10IdentifierES2_ -__ZN3JSC10StringNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3WTF7HashMapIPN3JSC7UString3RepEPNS1_8JSStringENS1_17IdentifierRepHashENS_10HashTraitsIS4_EENS8_IS6_EEE3addERKS4_RKS6_ -__ZN3WTF9HashTableIPN3JSC7UString3RepESt4pairIS4_PNS1_8JSStringEENS_18PairFirstExtractorIS8_EENS1_17IdentifierRepHashENS_14PairHashTraitsINS_10HashTraitsIS4_EENSD_IS7_EEEESE_E6rehashEi +__ZN3WTF6VectorIjLm0EE14expandCapacityEm +__ZN3JSC17BytecodeGenerator11addConstantERKNS_10IdentifierE +__ZN3WTF9HashTableINS_6RefPtrIN3JSC7UString3RepEEESt4pairIS5_iENS_18PairFirstExtractorIS7_EENS2_17IdentifierRepHashENS_14PairHashTraitsINS_10HashTraitsIS5_EENS2_17BytecodeGenerator28IdentifierMapIndexHashTraitsEEESD_E6rehashEi +__ZN3JSC17BytecodeGenerator12emitBinaryOpENS_8OpcodeIDEPNS_10RegisterIDES3_S3_NS_12OperandTypesE +__ZN3JSC17BytecodeGenerator15emitJumpIfFalseEPNS_10RegisterIDEPNS_5LabelE +__ZN3JSC11UnaryOpNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE __ZN3JSC19FunctionCallDotNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3WTF6VectorIN3JSC11InstructionELm0EE6appendIiEEvRKT_ __ZN3JSC17BytecodeGenerator8emitCallENS_8OpcodeIDEPNS_10RegisterIDES3_S3_PNS_13ArgumentsNodeEjjj __ZN3JSC16ArgumentListNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC17BytecodeGenerator10emitOpcodeENS_8OpcodeIDE +__ZN3JSC10RegExpNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC6RegExp6createEPNS_12JSGlobalDataERKNS_7UStringES5_ +__ZN3JSC17BytecodeGenerator13emitNewRegExpEPNS_10RegisterIDEPNS_6RegExpE +__ZN3JSC17BytecodeGenerator9emitLabelEPNS_5LabelE +__ZN3JSC9BlockNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC17ExprStatementNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC17BytecodeGenerator11emitResolveEPNS_10RegisterIDERKNS_10IdentifierE +__ZN3JSC17BytecodeGenerator18findScopedPropertyERKNS_10IdentifierERiRmbRPNS_8JSObjectE +__ZN3JSC13AssignDotNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC12FuncExprNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC17BytecodeGenerator25emitNewFunctionExpressionEPNS_10RegisterIDEPNS_12FuncExprNodeE +__ZN3JSC17BytecodeGenerator11emitPutByIdEPNS_10RegisterIDERKNS_10IdentifierES2_ +__ZN3JSC17AssignResolveNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC17BytecodeGenerator15emitResolveBaseEPNS_10RegisterIDERKNS_10IdentifierE +__ZN3JSC16VarStatementNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC17BytecodeGenerator14emitJumpIfTrueEPNS_10RegisterIDEPNS_5LabelE +__ZN3JSC17ObjectLiteralNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC21FunctionCallValueNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC10StringNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC17BytecodeGenerator8emitLoadEPNS_10RegisterIDERKNS_10IdentifierE +__ZN3WTF9HashTableIPN3JSC7UString3RepESt4pairIS4_PNS1_8JSStringEENS_18PairFirstExtractorIS8_EENS1_17IdentifierRepHashENS_14PairHashTraitsINS_10HashTraitsIS4_EENSD_IS7_EEEESE_E6expandEv __ZN3JSC12JSGlobalData22numericCompareFunctionEPNS_9ExecStateE __ZNK3JSC21UStringSourceProvider6lengthEv __ZNK3JSC21UStringSourceProvider4dataEv -__ZN3JSC16FunctionBodyNode13finishParsingERKNS_10SourceCodeEPNS_13ParameterNodeE __ZN3JSC19extractFunctionBodyEPNS_11ProgramNodeE __ZNK3JSC17ExprStatementNode15isExprStatementEv __ZNK3JSC12FuncExprNode14isFuncExprNodeEv @@ -266,541 +299,777 @@ __ZN3JSC9CodeBlockC1EPNS_9ScopeNodeENS_8CodeTypeEN3WTF10PassRefPtrINS_14SourcePr __ZN3JSC17BytecodeGeneratorC2EPNS_16FunctionBodyNodeEPKNS_8DebuggerERKNS_10ScopeChainEPN3WTF7HashMapINS9_6RefPtrINS_7UString3RepEEENS_16SymbolTableEntryENS_17IdentifierRepHashENS9_10HashTraitsISE_EENS_26SymbolTableIndexHashTraitsEEEPNS_9CodeBlockE __ZN3JSC17BytecodeGenerator12addParameterERKNS_10IdentifierE __ZN3JSC16FunctionBodyNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC9BlockNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE __ZN3JSC10ReturnNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC12BinaryOpNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZNK3JSC7SubNode8opcodeIDEv __ZNK3JSC11ResolveNode6isPureERNS_17BytecodeGeneratorE -__ZN3JSC17BytecodeGenerator12emitBinaryOpENS_8OpcodeIDEPNS_10RegisterIDES3_S3_NS_12OperandTypesE __ZN3JSC17BytecodeGenerator10emitReturnEPNS_10RegisterIDE __ZNK3JSC9BlockNode7isBlockEv __ZNK3JSC10ReturnNode12isReturnNodeEv __ZN3JSC9CodeBlock11shrinkToFitEv __ZN3WTF6VectorIN3JSC11InstructionELm0EE14shrinkCapacityEm -__ZN3WTF6VectorIjLm0EE14shrinkCapacityEm __ZN3WTF6VectorIN3JSC10IdentifierELm0EE14shrinkCapacityEm -__ZN3JSC9BlockNodeD0Ev -__ZN3JSC9BlockNode12releaseNodesERNS_12NodeReleaserE -__ZN3WTF6VectorINS_6RefPtrIN3JSC16ParserRefCountedEEELm0EE15reserveCapacityEm -__ZN3JSC10ReturnNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC12BinaryOpNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC16ParserRefCounted12releaseNodesERNS_12NodeReleaserE -__ZN3JSC10ReturnNodeD0Ev +__ZN3JSC11ParserArenaD1Ev +__ZN3JSC11ResolveNodeD0Ev __ZN3JSC7SubNodeD0Ev -__ZN3JSC12BinaryOpNodeD2Ev -__ZN3JSC17BytecodeGeneratorD2Ev +__ZN3JSC14ExpressionNodeD2Ev +__ZN3JSC10ReturnNodeD0Ev +__ZN3JSC14SourceElementsD0Ev +__ZN3JSC9BlockNodeD0Ev __ZN3WTF6VectorIN3JSC11InstructionELm0EEaSERKS3_ +__ZThn12_N3JSC11ProgramNodeD0Ev __ZN3JSC11ProgramNodeD0Ev -__ZN3JSC9ScopeNodeD2Ev -__ZN3JSC9ScopeNode12releaseNodesERNS_12NodeReleaserE +__ZN3JSC13ParameterNodeD0Ev __ZN3JSC17ExprStatementNodeD0Ev +__ZThn12_N3JSC12FuncExprNodeD0Ev __ZN3JSC12FuncExprNodeD0Ev -__ZN3JSC12FuncExprNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC12NodeReleaser21adoptFunctionBodyNodeERN3WTF6RefPtrINS_16FunctionBodyNodeEEE -__ZN3JSC13ParameterNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC13ParameterNodeD0Ev +__ZThn12_N3JSC16FunctionBodyNodeD0Ev __ZN3JSC16FunctionBodyNodeD0Ev -__ZN3JSC7UString3Rep7destroyEv -__ZN3JSC10Identifier6removeEPNS_7UString3RepE __ZN3JSC9CodeBlockD1Ev __ZN3JSC9CodeBlockD2Ev __ZN3JSC21UStringSourceProviderD0Ev -__ZN3JSC17AssignResolveNodeD0Ev -__ZN3JSC17AssignResolveNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC10StringNodeD0Ev -__ZN3JSC19FunctionCallDotNodeD0Ev -__ZN3JSC19FunctionCallDotNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC13ArgumentsNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC16ArgumentListNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC13ArgumentsNodeD0Ev -__ZN3JSC16ArgumentListNodeD0Ev -__ZN3JSC14JSGlobalObject13copyGlobalsToERNS_12RegisterFileE -__ZN3JSC11Interpreter11resolveBaseEPNS_9ExecStateEPNS_11InstructionE -__ZN3JSC11Interpreter13resolveGlobalEPNS_9ExecStateEPNS_11InstructionERNS_10JSValuePtrE -__ZN3JSC11Interpreter15tryCacheGetByIDEPNS_9ExecStateEPNS_9CodeBlockEPNS_11InstructionENS_10JSValuePtrERKNS_10IdentifierERKNS_12PropertySlotE -__ZN3JSC11Interpreter15tryCachePutByIDEPNS_9ExecStateEPNS_9CodeBlockEPNS_11InstructionENS_10JSValuePtrERKNS_15PutPropertySlotE -__ZN3JSC23setUpStaticFunctionSlotEPNS_9ExecStateEPKNS_9HashEntryEPNS_8JSObjectERKNS_10IdentifierERNS_12PropertySlotE -__ZN3JSC17PrototypeFunctionC2EPNS_9ExecStateEiRKNS_10IdentifierEPFNS_10JSValuePtrES2_PNS_8JSObjectES6_RKNS_7ArgListEE -__ZN3JSC17PrototypeFunction11getCallDataERNS_8CallDataE -__ZNK3JSC8JSString8toStringEPNS_9ExecStateE -__ZNK3JSC9CodeBlock15derefStructuresEPNS_11InstructionE -__ZN3JSC14JSGlobalObject16stopTimeoutCheckEv -__ZN3WTF6VectorINS_6RefPtrIN3JSC12FuncDeclNodeEEELm0EE15reserveCapacityEm -__ZN3JSC20ParserRefCountedDataIN3WTF6VectorINS1_6RefPtrINS_12FuncDeclNodeEEELm0EEEED0Ev -__ZN3WTF6VectorINS_6RefPtrIN3JSC12FuncDeclNodeEEELm0EEaSERKS5_ -__ZN3JSC8JSObject12removeDirectERKNS_10IdentifierE -__ZN3JSC9Structure31removePropertyWithoutTransitionERKNS_10IdentifierE -__ZN3JSC9Structure6removeERKNS_10IdentifierE -__ZN3JSC17BytecodeGenerator12addGlobalVarERKNS_10IdentifierEbRPNS_10RegisterIDE -__ZN3JSC17BytecodeGenerator15emitNewFunctionEPNS_10RegisterIDEPNS_12FuncDeclNodeE -__ZN3JSC9CodeBlock25createRareDataIfNecessaryEv -__ZN3JSC13AssignDotNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZNK3JSC10StringNode6isPureERNS_17BytecodeGeneratorE -__ZN3JSC12FuncDeclNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3WTF6VectorIN3JSC8LineInfoELm0EE14shrinkCapacityEm +__ZN3WTF6VectorIN3JSC20GetByIdExceptionInfoELm0EE14shrinkCapacityEm +__ZN3WTF6VectorIN3JSC11HandlerInfoELm0EE14shrinkCapacityEm +__ZN3WTF6VectorINS_6RefPtrIN3JSC12FuncDeclNodeEEELm0EE14shrinkCapacityEm +__ZN3WTF6VectorINS_6RefPtrIN3JSC6RegExpEEELm0EE14shrinkCapacityEm __ZN3WTF6VectorIN3JSC15SimpleJumpTableELm0EE14shrinkCapacityEm __ZN3WTF6VectorIN3JSC15StringJumpTableELm0EE14shrinkCapacityEm +__ZN3JSC15ParserArenaDataIN3WTF6VectorIPNS_12FuncDeclNodeELm0EEEED0Ev +__ZN3JSC15DotAccessorNodeD0Ev +__ZN3JSC12NotEqualNodeD0Ev +__ZN3JSC10RegExpNodeD0Ev +__ZN3JSC16ArgumentListNodeD0Ev +__ZN3JSC13ArgumentsNodeD0Ev +__ZN3JSC19FunctionCallDotNodeD0Ev +__ZN3JSC14LogicalNotNodeD0Ev +__ZN3JSC13LogicalOpNodeD0Ev +__ZN3JSC6IfNodeD0Ev __ZN3JSC13AssignDotNodeD0Ev -__ZN3JSC13AssignDotNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC12FuncDeclNode12makeFunctionEPNS_9ExecStateEPNS_14ScopeChainNodeE -__ZN3JSC12FuncDeclNodeD0Ev -__ZN3JSC12FuncDeclNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC4Heap9unprotectENS_10JSValuePtrE -__ZN3JSC5Lexer7record8Ei -__ZL26appendToVarDeclarationListPvRPN3JSC20ParserRefCountedDataIN3WTF6VectorISt4pairINS0_10IdentifierEjELm0EEEEERKS5_j -__ZN3WTF6VectorISt4pairIN3JSC10IdentifierEjELm0EE14expandCapacityEmPKS4_ -__ZN3WTF6VectorISt4pairIN3JSC10IdentifierEjELm0EE15reserveCapacityEm -__ZL20makeVarStatementNodePvPN3JSC14ExpressionNodeE -__ZN3JSC20ParserRefCountedDataIN3WTF6VectorISt4pairINS_10IdentifierEjELm0EEEED0Ev -__ZN3WTF6VectorISt4pairIN3JSC10IdentifierEjELm0EEaSERKS5_ -__ZNK3JSC7UString14toStrictUInt32EPb -__ZN3JSC16VarStatementNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC17AssignResolveNodeD0Ev +__ZN3JSC17ObjectLiteralNodeD0Ev +__ZN3JSC15ParserArenaDataIN3WTF6VectorISt4pairINS_10IdentifierEjELm0EEEED0Ev __ZN3JSC16VarStatementNodeD0Ev -__ZN3JSC16VarStatementNode12releaseNodesERNS_12NodeReleaserE -__ZL12makeMultNodePvPN3JSC14ExpressionNodeES2_b -__ZNK3JSC10NumberNode8isNumberEv -__ZL11makeAddNodePvPN3JSC14ExpressionNodeES2_b +__ZN3JSC21FunctionCallValueNodeD0Ev +__ZN3JSC10StringNodeD0Ev +__ZN3WTF14deleteOwnedPtrIN3JSC17BytecodeGeneratorEEEvPT_ +__ZN3JSC14JSGlobalObject13copyGlobalsToERNS_12RegisterFileE +__ZN3JSC12FuncDeclNode12makeFunctionEPNS_9ExecStateEPNS_14ScopeChainNodeE +__ZN3JSC11Interpreter15tryCacheGetByIDEPNS_9ExecStateEPNS_9CodeBlockEPNS_11InstructionENS_7JSValueERKNS_10IdentifierERKNS_12PropertySlotE +__ZN3JSC7JSValue13equalSlowCaseEPNS_9ExecStateES0_S0_ +__ZN3JSC10JSFunction18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE +__ZN3JSC12FuncExprNode12makeFunctionEPNS_9ExecStateEPNS_14ScopeChainNodeE +__ZN3JSC9Structure13hasTransitionEPNS_7UString3RepEj +__ZN3JSC11Interpreter15tryCachePutByIDEPNS_9ExecStateEPNS_9CodeBlockEPNS_11InstructionENS_7JSValueERKNS_15PutPropertySlotE +__ZN3JSC11Interpreter13resolveGlobalEPNS_9ExecStateEPNS_11InstructionERNS_7JSValueE +__ZNK3JSC8JSObject9toBooleanEPNS_9ExecStateE +__ZN3JSC10JSFunction11getCallDataERNS_8CallDataE +__ZL17combineCommaNodesPvPN3JSC14ExpressionNodeES2_ +__ZL15makePostfixNodePvPN3JSC14ExpressionNodeENS0_8OperatorEiii +__ZNK3JSC18EmptyStatementNode16isEmptyStatementEv +__ZNK3JSC16JSVariableObject16isVariableObjectEv +__ZN3JSC17BytecodeGenerator16emitGetScopedVarEPNS_10RegisterIDEmiNS_7JSValueE +__ZN3JSC7ForNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC17BytecodeGenerator13newLabelScopeENS_10LabelScope4TypeEPKNS_10IdentifierE __ZN3JSC10NumberNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE __ZN3JSC17BytecodeGenerator8emitLoadEPNS_10RegisterIDEd -__ZN3WTF7HashMapIdN3JSC10JSValuePtrENS_9FloatHashIdEENS_10HashTraitsIdEENS5_IS2_EEE3addERKdRKS2_ -__ZN3WTF9HashTableIdSt4pairIdN3JSC10JSValuePtrEENS_18PairFirstExtractorIS4_EENS_9FloatHashIdEENS_14PairHashTraitsINS_10HashTraitsIdEENSA_IS3_EEEESB_E6rehashEi -__ZN3JSC11NewExprNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC17BytecodeGenerator13emitConstructEPNS_10RegisterIDES2_PNS_13ArgumentsNodeEjjj -__ZN3WTF6VectorIN3JSC20GetByIdExceptionInfoELm0EE14expandCapacityEm -__ZNK3JSC7AddNode8opcodeIDEv -__ZNK3JSC14ExpressionNode6isPureERNS_17BytecodeGeneratorE -__ZNK3JSC8MultNode8opcodeIDEv -__ZNK3JSC10NumberNode6isPureERNS_17BytecodeGeneratorE +__ZN3WTF9HashTableIdSt4pairIdN3JSC7JSValueEENS_18PairFirstExtractorIS4_EENS_9FloatHashIdEENS_14PairHashTraitsINS_10HashTraitsIdEENSA_IS3_EEEESB_E6expandEv +__ZN3JSC17BytecodeGenerator8emitJumpEPNS_5LabelE +__ZN3JSC15ConditionalNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZL14compileBracketiPiPPhPPKtS3_P9ErrorCodeiS_S_R11CompileData +__ZNK3JSC14JSGlobalObject14isDynamicScopeEv +__ZN3JSC9BreakNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC17BytecodeGenerator11breakTargetERKNS_10IdentifierE +__ZN3JSC17BytecodeGenerator14emitJumpScopesEPNS_5LabelEi +__ZN3JSC18PostfixResolveNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC19BracketAccessorNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC17BytecodeGenerator12emitGetByValEPNS_10RegisterIDES2_S2_ +__ZN3JSC16PropertyListNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE __ZN3JSC10NumberNodeD0Ev -__ZN3JSC11NewExprNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC11NewExprNodeD0Ev -__ZN3JSC7AddNodeD0Ev -__ZN3JSC8MultNodeD0Ev -__ZN3JSC15DateConstructor16getConstructDataERNS_13ConstructDataE -__ZN3JSCL28constructWithDateConstructorEPNS_9ExecStateEPNS_8JSObjectERKNS_7ArgListE -__ZN3JSC13constructDateEPNS_9ExecStateERKNS_7ArgListE -__ZN3JSC13DatePrototype18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE -__ZN3JSCL20dateProtoFuncGetTimeEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE +__ZN3JSC19BracketAccessorNodeD0Ev +__ZN3JSC18PostfixResolveNodeD0Ev +__ZN3JSC15ConditionalNodeD0Ev +__ZN3JSC9BreakNodeD0Ev +__ZN3JSC18EmptyStatementNodeD0Ev +__ZN3JSC7ForNodeD0Ev +__ZN3JSC12PropertyNodeD0Ev +__ZN3JSC16PropertyListNodeD0Ev +__ZN3JSC23setUpStaticFunctionSlotEPNS_9ExecStateEPKNS_9HashEntryEPNS_8JSObjectERKNS_10IdentifierERNS_12PropertySlotE +__ZN3JSC17PrototypeFunction11getCallDataERNS_8CallDataE +__ZNK3JSC8JSString8toStringEPNS_9ExecStateE +__ZN3JSC7UString4fromEj +__ZN3JSC7UString3Rep6createEPtiN3WTF10PassRefPtrINS3_21CrossThreadRefCountedINS3_16OwnFastMallocPtrItEEEEEE +__ZNK3JSC8JSString9toBooleanEPNS_9ExecStateE +__ZN3JSC12RegExpObjectC1EN3WTF10PassRefPtrINS_9StructureEEENS2_INS_6RegExpEEE +__ZN3JSC12RegExpObject18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE +__ZN3JSCL19regExpProtoFuncTestEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE __ZNK3JSC6JSCell8isObjectEPKNS_9ClassInfoE -__ZNK3JSC12DateInstance9classInfoEv -__ZN3JSCL20dateProtoFuncSetTimeEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZNK3JSC12JSNumberCell8toNumberEPNS_9ExecStateE +__ZNK3JSC12RegExpObject9classInfoEv +__ZN3JSC12RegExpObject5matchEPNS_9ExecStateERKNS_7ArgListE +__ZNK3JSC7JSValue8toStringEPNS_9ExecStateE +__ZN3JSC17RegExpConstructor12performMatchEPNS_6RegExpERKNS_7UStringEiRiS6_PPi +__ZN3JSC6RegExp5matchERKNS_7UStringEiPN3WTF6VectorIiLm32EEE +__ZN3JSC17RegExpConstructor18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE +__ZN3JSCL24regExpConstructorDollar1EPNS_9ExecStateERKNS_10IdentifierERKNS_12PropertySlotE +__ZN3JSC11jsSubstringEPNS_12JSGlobalDataERKNS_7UStringEjj +__ZN3JSC20constructEmptyObjectEPNS_9ExecStateE +__ZN3WTF7HashMapISt4pairINS_6RefPtrIN3JSC7UString3RepEEEjES1_IPNS3_9StructureES9_ENS3_28StructureTransitionTableHashENS3_34StructureTransitionTableHashTraitsENS_10HashTraitsISA_EEE3addERKS7_RKSA_ +__ZN3WTF9HashTableISt4pairINS_6RefPtrIN3JSC7UString3RepEEEjES1_IS7_S1_IPNS3_9StructureES9_EENS_18PairFirstExtractorISB_EENS3_28StructureTransitionTableHashENS_14PairHashTraitsINS3_34StructureTransitionTableHashTraitsENS_10HashTraitsISA_EEEESG_E6rehashEi +__ZN3WTF7HashSetINS_6RefPtrIN3JSC7UString3RepEEENS2_17IdentifierRepHashENS_10HashTraitsIS5_EEE3addERKS5_ +__ZN3WTF9HashTableINS_6RefPtrIN3JSC7UString3RepEEES5_NS_17IdentityExtractorIS5_EENS2_17IdentifierRepHashENS_10HashTraitsIS5_EESA_E6rehashEi __ZN3JSC11BooleanNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC10IfElseNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZNK3JSC13StatementNode12isReturnNodeEv __ZN3JSC11BooleanNodeD0Ev -__ZN3JSC4Heap7collectEv -__ZN3JSC4Heap30markStackObjectsConservativelyEv -__ZN3JSC4Heap31markCurrentThreadConservativelyEv -__ZN3JSC4Heap39markCurrentThreadConservativelyInternalEv -__ZN3JSC4Heap18markConservativelyEPvS1_ -__ZN3JSC4Heap20markProtectedObjectsEv -__ZN3JSC8JSObject4markEv -__ZN3JSC6JSCell4markEv -__ZN3JSC14JSGlobalObject4markEv -__ZN3JSC7JSArray4markEv -__ZN3JSC15JSWrapperObject4markEv -__ZN3JSC18GlobalEvalFunction4markEv -__ZN3JSC12SmallStrings4markEv -__ZN3JSC4Heap5sweepILNS_8HeapTypeE0EEEmv -__ZN3JSC14JSGlobalObjectD2Ev -__ZN3JSC17FunctionPrototypeD1Ev -__ZN3JSC17PrototypeFunctionD1Ev -__ZN3JSC15ObjectPrototypeD1Ev -__ZN3JSC14ArrayPrototypeD1Ev -__ZN3JSC15StringPrototypeD1Ev -__ZN3JSC16BooleanPrototypeD1Ev -__ZN3JSC15NumberPrototypeD1Ev -__ZN3JSC13DatePrototypeD1Ev -__ZN3JSC12DateInstanceD2Ev -__ZN3JSC15RegExpPrototypeD1Ev -__ZN3JSC14ErrorPrototypeD1Ev -__ZN3JSC20NativeErrorPrototypeD1Ev -__ZN3JSC17ObjectConstructorD1Ev -__ZN3JSC19FunctionConstructorD1Ev -__ZN3JSC16ArrayConstructorD1Ev -__ZN3JSC17StringConstructorD1Ev -__ZN3JSC18BooleanConstructorD1Ev -__ZN3JSC17NumberConstructorD1Ev -__ZN3JSC15DateConstructorD1Ev -__ZN3JSC17RegExpConstructorD1Ev -__ZN3JSC16ErrorConstructorD1Ev -__ZN3JSC22NativeErrorConstructorD1Ev -__ZN3JSC10MathObjectD1Ev -__ZN3JSC18GlobalEvalFunctionD1Ev -__ZN3JSC12DateInstanceD1Ev -__ZN3JSC4Heap5sweepILNS_8HeapTypeE1EEEmv -__ZN3JSC6IfNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC17BytecodeGenerator8newLabelEv -__ZN3JSC17BytecodeGenerator15emitJumpIfFalseEPNS_10RegisterIDEPNS_5LabelE -__ZN3JSC17BytecodeGenerator9emitLabelEPNS_5LabelE -__ZN3JSC6IfNodeD0Ev -__ZN3JSC6IfNode12releaseNodesERNS_12NodeReleaserE -__ZNK3JSC8JSObject9toBooleanEPNS_9ExecStateE -__ZN3JSC10JSFunction4markEv -__ZN3JSC16FunctionBodyNode4markEv -__ZN3JSC23FunctionCallResolveNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC17BytecodeGenerator19emitResolveFunctionEPNS_10RegisterIDES2_RKNS_10IdentifierE -__ZNK3JSC12NotEqualNode8opcodeIDEv -__ZNK3JSC14ExpressionNode6isNullEv -__ZN3JSC13LogicalOpNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZNK3JSC8LessNode8opcodeIDEv -__ZN3JSC23FunctionCallResolveNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC23FunctionCallResolveNodeD0Ev -__ZN3JSC12NotEqualNodeD0Ev -__ZN3JSC13LogicalOpNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC13LogicalOpNodeD0Ev -__ZN3JSC8LessNodeD0Ev -__ZN3JSC11Interpreter18resolveBaseAndFuncEPNS_9ExecStateEPNS_11InstructionERNS_10JSValuePtrE -__ZN3JSC18globalFuncParseIntEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC11JSImmediate12nonInlineNaNEv +__ZN3JSC10IfElseNodeD0Ev +__ZN3JSC12JSActivationC1EPNS_9ExecStateEN3WTF10PassRefPtrINS_16FunctionBodyNodeEEE +__ZN3JSC12JSActivationC2EPNS_9ExecStateEN3WTF10PassRefPtrINS_16FunctionBodyNodeEEE +__ZNK3JSC8JSObject12toThisObjectEPNS_9ExecStateE __ZN3JSC8JSString18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE __ZN3JSC15StringPrototype18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE __ZN3JSC12StringObject18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE -__ZN3JSCL22stringProtoFuncIndexOfEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE +__ZN3JSCL20stringProtoFuncMatchEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE __ZNK3JSC8JSString12toThisStringEPNS_9ExecStateE -__ZNK3JSC7UString4findERKS0_i -__ZN3JSC10JSFunction11getCallDataERNS_8CallDataE -__ZNK3JSC16JSVariableObject16isVariableObjectEv -__ZN3JSC17BytecodeGenerator16emitGetScopedVarEPNS_10RegisterIDEmiNS_10JSValuePtrE -__ZNK3JSC13StatementNode12isReturnNodeEv -__ZN3JSC12SmallStrings27createSingleCharacterStringEPNS_12JSGlobalDataEh -__ZN3JSC9EqualNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC17BytecodeGenerator14emitEqualityOpENS_8OpcodeIDEPNS_10RegisterIDES3_S3_ -__ZNK3JSC13StatementNode7isBlockEv -__ZNK3JSC14JSGlobalObject14isDynamicScopeEv -__ZN3JSC9EqualNodeD0Ev -__ZN3JSC11concatenateEPNS_7UString3RepES2_ -__ZNK3JSC9CodeBlock13refStructuresEPNS_11InstructionE -__ZN3JSC9CodeBlock4markEv -__ZNK3JSC12JSNumberCell8toStringEPNS_9ExecStateE -__ZN3JSC7UString4fromEd -__ZN3WTF4dtoaEdiPiS0_PPc -__ZN3WTFL3d2bEdPiS0_ -__ZN3JSC19BracketAccessorNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC17BytecodeGenerator12emitGetByValEPNS_10RegisterIDES2_S2_ -__ZN3JSC19BracketAccessorNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC19BracketAccessorNodeD0Ev -__ZN3JSC10JSFunction18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE -__ZN3JSC10JSFunction16getConstructDataERNS_13ConstructDataE -__ZL15makePostfixNodePvPN3JSC14ExpressionNodeENS0_8OperatorEiii +__ZNK3JSC6JSCell9classInfoEv +__Z12jsRegExpFreeP8JSRegExp +__ZL11makeAddNodePvPN3JSC14ExpressionNodeES2_b __ZNK3JSC19BracketAccessorNode10isLocationEv __ZNK3JSC19BracketAccessorNode21isBracketAccessorNodeEv -__ZNK3JSC7ForNode6isLoopEv -__ZN3JSC7ForNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC17BytecodeGenerator13newLabelScopeENS_10LabelScope4TypeEPKNS_10IdentifierE -__ZN3JSC17BytecodeGenerator8emitJumpEPNS_5LabelE +__ZL14makePrefixNodePvPN3JSC14ExpressionNodeENS0_8OperatorEiii +__ZN3JSC9ThrowNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC9EqualNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZNK3JSC10NumberNode6isPureERNS_17BytecodeGeneratorE +__ZN3JSC12SmallStrings27createSingleCharacterStringEPNS_12JSGlobalDataEh +__ZN3JSC17BytecodeGenerator14emitEqualityOpENS_8OpcodeIDEPNS_10RegisterIDES3_S3_ +__ZNK3JSC14ExpressionNode5isAddEv +__ZNK3JSC12JSActivation14isDynamicScopeEv +__ZN3JSC15StrictEqualNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZNK3JSC11BooleanNode6isPureERNS_17BytecodeGeneratorE +__ZN3JSC23FunctionCallResolveNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZNK3JSC7AddNode5isAddEv +__ZN3JSC12BinaryOpNode10emitStrcatERNS_17BytecodeGeneratorEPNS_10RegisterIDES4_PNS_21ReadModifyResolveNodeE +__ZNK3JSC10StringNode8isStringEv +__ZNK3JSC14ExpressionNode8isStringEv +__ZN3JSC17BytecodeGenerator10emitStrcatEPNS_10RegisterIDES2_i __ZN3JSC17AssignBracketNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC8ThisNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE __ZN3JSC17BytecodeGenerator12emitPutByValEPNS_10RegisterIDES2_S2_ -__ZN3JSC18PostfixResolveNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC17BytecodeGenerator14emitJumpIfTrueEPNS_10RegisterIDEPNS_5LabelE -__ZN3JSC7ForNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC7ForNodeD0Ev -__ZN3JSC18PostfixResolveNodeD0Ev +__ZNK3JSC10StringNode6isPureERNS_17BytecodeGeneratorE +__ZN3JSC17TypeOfResolveNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC9ArrayNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC17BytecodeGenerator12emitNewArrayEPNS_10RegisterIDEPNS_11ElementNodeE +__ZN3JSC13PrefixDotNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC9ThrowNodeD0Ev +__ZN3JSC9EqualNodeD0Ev +__ZN3JSC7AddNodeD0Ev +__ZN3JSC15StrictEqualNodeD0Ev +__ZN3JSC23FunctionCallResolveNodeD0Ev __ZN3JSC17AssignBracketNodeD0Ev -__ZN3JSC17AssignBracketNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC8ThisNodeD0Ev -__ZN3JSC8JSObject17createInheritorIDEv -__ZN3JSC10JSFunction15argumentsGetterEPNS_9ExecStateERKNS_10IdentifierERKNS_12PropertySlotE -__ZNK3JSC11Interpreter17retrieveArgumentsEPNS_9ExecStateEPNS_10JSFunctionE +__ZN3JSC17TypeOfResolveNodeD0Ev +__ZN3JSC9ArrayNodeD0Ev +__ZN3JSC13PrefixDotNodeD0Ev +__ZN3JSCL22stringProtoFuncIndexOfEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZNK3JSC7UString4findERKS0_i +__ZN3JSC11concatenateEPNS_7UString3RepES2_ __ZN3JSC9Arguments18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE __ZN3JSC9Arguments18getOwnPropertySlotEPNS_9ExecStateEjRNS_12PropertySlotE -__ZN3JSC8JSObject3putEPNS_9ExecStateEjNS_10JSValuePtrE -__ZN3JSCL21dateProtoFuncGetMonthEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZNK3JSC12DateInstance21msToGregorianDateTimeEdbRNS_17GregorianDateTimeE -__ZN3JSC21msToGregorianDateTimeEdbRNS_17GregorianDateTimeE -__ZN3JSCL12getDSTOffsetEdd +__ZN3JSC17BytecodeGenerator16emitPutScopedVarEmiPNS_10RegisterIDENS_7JSValueE +__ZNK3JSC7UString8toUInt32EPbb +__ZNK3JSC7UString8toDoubleEbb __ZN3JSC8JSObject18getOwnPropertySlotEPNS_9ExecStateEjRNS_12PropertySlotE __ZN3JSC8JSObject18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE -__ZN3JSCL20dateProtoFuncGetDateEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC11concatenateEPNS_7UString3RepEi -__ZN3JSC21ReadModifyResolveNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC21ReadModifyResolveNodeD0Ev -__ZN3JSC21ReadModifyResolveNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSCL20dateProtoFuncGetYearEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC10IfElseNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZNK3JSC10LessEqNode8opcodeIDEv -__ZN3JSC10IfElseNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC10IfElseNodeD0Ev -__ZN3JSC10LessEqNodeD0Ev -__ZN3JSCL21dateProtoFuncGetHoursEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSCL23dateProtoFuncGetMinutesEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE +__ZNK3JSC8JSString11toPrimitiveEPNS_9ExecStateENS_22PreferredPrimitiveTypeE +__ZN3JSC7UString3Rep15reserveCapacityEi +__ZN3WTF11fastReallocILb0EEEPvS1_m +__ZN3JSC7UString6appendERKS0_ +__ZN3JSC16jsIsFunctionTypeENS_7JSValueE +__ZNK3JSC9CodeBlock13refStructuresEPNS_11InstructionE +__ZN3JSC14StructureChainC1EPNS_9StructureE +__ZN3JSC14StructureChainC2EPNS_9StructureE +__ZNK3JSC14StructureChain11isCacheableEv +__ZNK3JSC9CodeBlock15derefStructuresEPNS_11InstructionE +__ZN3JSC6RegExpD1Ev +__ZThn12_N3JSC12FuncDeclNodeD0Ev +__ZN3JSC12FuncDeclNodeD0Ev +__ZNK3JSC10NumberNode8isNumberEv +__ZN3WTF6VectorIPNS0_IN3JSC10IdentifierELm64EEELm32EE14expandCapacityEm __ZN3JSC19ReverseBinaryOpNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZNK3JSC13GreaterEqNode8opcodeIDEv -__ZN3JSC13GreaterEqNodeD0Ev -__ZN3JSC9ArgumentsD1Ev -__ZN3JSC9ArgumentsD2Ev __ZN3JSC8WithNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE __ZN3JSC17BytecodeGenerator13emitPushScopeEPNS_10RegisterIDE __ZN3WTF6VectorIN3JSC18ControlFlowContextELm0EE14expandCapacityEm -__ZNK3JSC11GreaterNode8opcodeIDEv -__ZN3JSC11UnaryOpNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZNK3JSC14LogicalNotNode8opcodeIDEv -__ZN3JSC8WithNodeD0Ev -__ZN3JSC8WithNode12releaseNodesERNS_12NodeReleaserE +__ZL17bracketIsAnchoredPKh +__ZL32branchFindFirstAssertedCharacterPKhb +__ZL20branchNeedsLineStartPKhjj +__ZN3JSC23CallFunctionCallDotNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC17BytecodeGenerator25emitJumpIfNotFunctionCallEPNS_10RegisterIDEPNS_5LabelE +__ZN3JSC21ThrowableBinaryOpNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC11NewExprNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC17BytecodeGenerator13emitConstructEPNS_10RegisterIDES2_PNS_13ArgumentsNodeEjjj +__ZN3WTF6VectorIN3JSC20GetByIdExceptionInfoELm0EE14expandCapacityEm __ZN3JSC11GreaterNodeD0Ev -__ZN3JSC11UnaryOpNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC14LogicalNotNodeD0Ev -__ZN3JSC14ExpressionNodeD2Ev -__ZN3JSC10JSValuePtr13equalSlowCaseEPNS_9ExecStateES0_S0_ -__ZN3JSC11Interpreter7resolveEPNS_9ExecStateEPNS_11InstructionERNS_10JSValuePtrE -__ZNK3JSC8NullNode6isNullEv -__ZN3JSC8NullNodeD0Ev -__ZN3JSC8NullNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC9ForInNodeC2EPNS_12JSGlobalDataERKNS_10IdentifierEPNS_14ExpressionNodeES7_PNS_13StatementNodeEiii -__ZNK3JSC9ForInNode6isLoopEv +__ZN3JSC18NotStrictEqualNodeD0Ev +__ZN3JSC8WithNodeD0Ev +__ZN3JSC11ElementNodeD0Ev +__ZN3JSC23CallFunctionCallDotNodeD0Ev +__ZN3JSC6InNodeD0Ev +__ZN3JSC11NewExprNodeD0Ev +__ZN3JSC18RegExpMatchesArrayC2EPNS_9ExecStateEPNS_24RegExpConstructorPrivateE +__ZN3JSC7JSArrayC2EN3WTF10PassRefPtrINS_9StructureEEEj +__ZNK3JSC7UString10getCStringERN3WTF6VectorIcLm32EEE __ZN3JSC9ForInNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE __ZN3JSC17BytecodeGenerator20emitNextPropertyNameEPNS_10RegisterIDES2_PNS_5LabelE -__ZN3JSC9ForInNode12releaseNodesERNS_12NodeReleaserE __ZN3JSC9ForInNodeD0Ev __ZN3JSC8JSObject16getPropertyNamesEPNS_9ExecStateERNS_17PropertyNameArrayE __ZN3JSC9Structure26getEnumerablePropertyNamesEPNS_9ExecStateERNS_17PropertyNameArrayEPNS_8JSObjectE __ZN3JSC9Structure35getEnumerableNamesFromPropertyTableERNS_17PropertyNameArrayE -__ZNK3JSC6JSCell9classInfoEv -__ZN3JSC14StructureChainC1EPNS_9StructureE -__ZN3JSC14StructureChainC2EPNS_9StructureE __ZN3JSC13jsOwnedStringEPNS_12JSGlobalDataERKNS_7UStringE -__ZN3JSC16globalFuncEscapeEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC11JSImmediate8toStringENS_10JSValuePtrE -__ZN3JSC7UString4fromEi -__ZN3JSC7UString6appendERKS0_ __ZN3JSC22JSPropertyNameIterator10invalidateEv -__ZNK3JSC18EmptyStatementNode16isEmptyStatementEv -__ZN3JSC18EmptyStatementNodeD0Ev -__ZN3JSCL20dateProtoFuncSetYearEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC21gregorianDateTimeToMSERKNS_17GregorianDateTimeEdb -__ZN3JSCL15dateToDayInYearEiii -__ZN3JSCL21dateProtoFuncSetMonthEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSCL23setNewValueFromDateArgsEPNS_9ExecStateENS_10JSValuePtrERKNS_7ArgListEib -__ZN3JSCL20dateProtoFuncSetDateEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSCL24dateProtoFuncToGMTStringEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSCplERKNS_7UStringES2_ -__ZN3JSC10formatTimeERKNS_17GregorianDateTimeEb -__ZN3JSC22JSPropertyNameIteratorD1Ev -__ZN3JSC8JSObjectD1Ev -__ZNK3JSC8JSString11toPrimitiveEPNS_9ExecStateENS_22PreferredPrimitiveTypeE -__ZN3JSC9parseDateERKNS_7UStringE -__ZNK3JSC7UString10UTF8StringEb -__ZN3WTF7Unicode18convertUTF16ToUTF8EPPKtS2_PPcS4_b +__ZN3JSC9Structure22materializePropertyMapEv +__ZNK3JSC14ExpressionNode11isCommaNodeEv +__ZN3JSC8ThisNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC9CommaNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC8ThisNodeD0Ev +__ZN3JSC9CommaNodeD0Ev +__ZN3JSC9WhileNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC9WhileNodeD0Ev __ZN3JSC16ArrayConstructor16getConstructDataERNS_13ConstructDataE __ZN3JSCL29constructWithArrayConstructorEPNS_9ExecStateEPNS_8JSObjectERKNS_7ArgListE __ZN3JSCL27constructArrayWithSizeQuirkEPNS_9ExecStateERKNS_7ArgListE -__ZN3JSC7JSArrayC2EPNS_9ExecStateEN3WTF10PassRefPtrINS_9StructureEEERKNS_7ArgListE -__ZL14makePrefixNodePvPN3JSC14ExpressionNodeENS0_8OperatorEiii -__ZN3JSC13PrefixDotNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZNK3JSC9WhileNode6isLoopEv -__ZN3JSC9WhileNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC20EvalFunctionCallNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC17BytecodeGenerator19emitResolveWithBaseEPNS_10RegisterIDES2_RKNS_10IdentifierE -__ZN3JSC9WhileNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC13PrefixDotNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC13PrefixDotNodeD0Ev -__ZN3JSC20EvalFunctionCallNodeD0Ev -__ZN3JSC20EvalFunctionCallNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC9WhileNodeD0Ev -__ZN3JSC12JSActivationC1EPNS_9ExecStateEN3WTF10PassRefPtrINS_16FunctionBodyNodeEEE -__ZN3JSC12JSActivationC2EPNS_9ExecStateEN3WTF10PassRefPtrINS_16FunctionBodyNodeEEE -__ZN3JSC12JSActivation18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE -__ZL11makeDivNodePvPN3JSC14ExpressionNodeES2_b -__ZN3JSC15ConditionalNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZNK3JSC7DivNode8opcodeIDEv -__ZN3JSC15ConditionalNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC15ConditionalNodeD0Ev -__ZN3JSC7DivNodeD0Ev -__ZN3JSC7JSArrayC2EN3WTF10PassRefPtrINS_9StructureEEEj -__ZN3JSC7JSArray3putEPNS_9ExecStateEjNS_10JSValuePtrE -__ZN3JSC7JSArray18getOwnPropertySlotEPNS_9ExecStateEjRNS_12PropertySlotE -__ZN3JSC7JSArray3putEPNS_9ExecStateERKNS_10IdentifierENS_10JSValuePtrERNS_15PutPropertySlotE -__ZN3WTF7HashMapISt4pairINS_6RefPtrIN3JSC7UString3RepEEEjEPNS3_9StructureENS3_28StructureTransitionTableHashENS3_34StructureTransitionTableHashTraitsENS_10HashTraitsIS9_EEE3addERKS7_RKS9_ -__ZN3WTF9HashTableISt4pairINS_6RefPtrIN3JSC7UString3RepEEEjES1_IS7_PNS3_9StructureEENS_18PairFirstExtractorISA_EENS3_28StructureTransitionTableHashENS_14PairHashTraitsINS3_34StructureTransitionTableHashTraitsENS_10HashTraitsIS9_EEEESF_E6rehashEi -__ZN3JSC17StringConstructor16getConstructDataERNS_13ConstructDataE -__ZN3JSCL30constructWithStringConstructorEPNS_9ExecStateEPNS_8JSObjectERKNS_7ArgListE -__ZN3JSC12StringObject3putEPNS_9ExecStateERKNS_10IdentifierENS_10JSValuePtrERNS_15PutPropertySlotE +__ZNK3JSC7JSValue8toUInt32EPNS_9ExecStateE +__ZN3JSC7JSArray3putEPNS_9ExecStateEjNS_7JSValueE +__ZN3JSC17RegExpConstructor3putEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueERNS_15PutPropertySlotE +__ZN3JSC8NullNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC8NullNodeD0Ev +__ZN3JSC8LessNodeD0Ev +__ZN3JSC6JSCell11getCallDataERNS_8CallDataE +__ZN3JSC10JSFunction3putEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueERNS_15PutPropertySlotE +__ZN3JSC14constructArrayEPNS_9ExecStateERKNS_7ArgListE +__ZN3JSC7JSArrayC2EN3WTF10PassRefPtrINS_9StructureEEERKNS_7ArgListE __ZN3JSC7JSArray18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE -__ZN3JSC11Interpreter22resolveBaseAndPropertyEPNS_9ExecStateEPNS_11InstructionERNS_10JSValuePtrE -__ZN3JSC9Structure22materializePropertyMapEv -__ZN3JSC8JSObject23allocatePropertyStorageEmm -__ZN3JSCL21stringProtoFuncCharAtEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZNK3JSC12StringObject12toThisStringEPNS_9ExecStateE -__ZN3JSC12JSActivationD1Ev -__ZN3JSC12JSActivationD2Ev -__ZN3JSC11Interpreter14uncachePutByIDEPNS_9CodeBlockEPNS_11InstructionE -__ZN3JSC12StringObjectD1Ev -__ZN3JSCL26stringProtoFuncToLowerCaseEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE +__ZN3JSC14ArrayPrototype18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE +__ZN3JSCL18arrayProtoFuncPushEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3WTF6VectorIN3JSC10IdentifierELm20EE14expandCapacityEm +__ZN3JSC12StringObject3putEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueERNS_15PutPropertySlotE +__ZN3JSC9Structure27despecifyFunctionTransitionEPS0_RKNS_10IdentifierE +__ZN3JSC11Interpreter7resolveEPNS_9ExecStateEPNS_11InstructionERNS_7JSValueE +__ZN3JSC11Interpreter14uncacheGetByIDEPNS_9CodeBlockEPNS_11InstructionE +__ZN3JSC7JSArray3putEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueERNS_15PutPropertySlotE +__ZN3JSC17NumberConstructor18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE +__ZNK3JSC8JSString12toThisObjectEPNS_9ExecStateE +__ZN3JSCL22stringProtoFuncReplaceEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC12StringObject14toThisJSStringEPNS_9ExecStateE __ZN3JSC8JSString14toThisJSStringEPNS_9ExecStateE -__ZN3JSC7JSArray11putSlowCaseEPNS_9ExecStateEjNS_10JSValuePtrE -__ZN3WTF11fastReallocILb0EEEPvS1_m -__ZN3JSCL24stringProtoFuncSubstringEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC11jsSubstringEPNS_12JSGlobalDataERKNS_7UStringEjj -__ZN3JSCL20stringProtoFuncSplitEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE +__ZN3JSCL20stringProtoFuncSplitEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE __ZN3JSC19constructEmptyArrayEPNS_9ExecStateE -__ZNK3JSC11BooleanNode6isPureERNS_17BytecodeGeneratorE -__ZNK3JSC7ModNode8opcodeIDEv -__ZN3JSC7ModNodeD0Ev -__ZN3JSCL23dateProtoFuncGetSecondsEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC17BytecodeGenerator16emitPutScopedVarEmiPNS_10RegisterIDENS_10JSValuePtrE -__ZN3JSC18globalFuncUnescapeEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC7UString6appendEt -__ZN3JSC11Interpreter8callEvalEPNS_9ExecStateEPNS_12RegisterFileEPNS_8RegisterEiiRNS_10JSValuePtrE -__ZN3JSC5Lexer10scanRegExpEv -__ZN3JSC7UStringC2ERKN3WTF6VectorItLm0EEE -__ZNK3JSC9BitOrNode8opcodeIDEv -__ZN3JSC9BitOrNodeD0Ev -__ZNK3JSC8JSString9toBooleanEPNS_9ExecStateE +__ZN3JSC7JSArray11putSlowCaseEPNS_9ExecStateEjNS_7JSValueE +__ZN3JSC7TryNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC17BytecodeGenerator9emitCatchEPNS_10RegisterIDEPNS_5LabelES4_ +__ZN3WTF6VectorIN3JSC11HandlerInfoELm0EE14expandCapacityEm +__ZN3JSC17BytecodeGenerator16emitPushNewScopeEPNS_10RegisterIDERNS_10IdentifierES2_ +__ZN3JSC7TryNodeD0Ev +__ZNK3JSC9CommaNode11isCommaNodeEv +__ZN3JSCL21arrayProtoFuncForEachEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC11Interpreter20prepareForRepeatCallEPNS_16FunctionBodyNodeEPNS_9ExecStateEPNS_10JSFunctionEiPNS_14ScopeChainNodeEPNS_7JSValueE +__ZN3JSC11Interpreter7executeERNS_16CallFrameClosureEPNS_7JSValueE __ZN3JSC10MathObject18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE -__ZN3JSCL19mathProtoFuncRandomEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3WTF16weakRandomNumberEv -__ZNK3JSC13UnaryPlusNode8opcodeIDEv -__ZN3JSC13UnaryPlusNodeD0Ev -__ZNK3JSC8JSString8toNumberEPNS_9ExecStateE -__ZNK3JSC7UString8toDoubleEbb -__ZNK3JSC7UString10getCStringERN3WTF6VectorIcLm32EEE -__ZN3JSCL30dateProtoFuncGetTimezoneOffsetEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSCL18mathProtoFuncFloorEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSCL18mathProtoFuncRoundEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSCL13jsAddSlowCaseEPNS_9ExecStateENS_10JSValuePtrES2_ -__ZN3JSC20globalFuncParseFloatEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC7UString4fromEj -__ZN3JSC9CommaNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC9CommaNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC16VarDeclCommaNodeD0Ev -__ZN3JSC7UStringC2EPtib -__ZN3JSC11concatenateEPNS_7UString3RepEd -__ZNK3JSC8JSObject8toStringEPNS_9ExecStateE -__ZNK3JSC8JSObject12defaultValueEPNS_9ExecStateENS_22PreferredPrimitiveTypeE -__ZN3WTF6VectorIPNS0_IN3JSC10IdentifierELm64EEELm32EE14expandCapacityEm -__ZN3JSC17ObjectLiteralNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC12FuncExprNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC17BytecodeGenerator25emitNewFunctionExpressionEPNS_10RegisterIDEPNS_12FuncExprNodeE -__ZN3JSC10RegExpNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC6RegExp6createEPNS_12JSGlobalDataERKNS_7UStringES5_ -__Z15jsRegExpCompilePKti24JSRegExpIgnoreCaseOption23JSRegExpMultilineOptionPjPPKc -__ZL30calculateCompiledPatternLengthPKti24JSRegExpIgnoreCaseOptionR11CompileDataR9ErrorCode -__ZL11checkEscapePPKtS0_P9ErrorCodeib -__ZL13compileBranchiPiPPhPPKtS3_P9ErrorCodeS_S_R11CompileData -__ZN3JSC17BytecodeGenerator13emitNewRegExpEPNS_10RegisterIDEPNS_6RegExpE -__ZN3WTF6VectorINS_6RefPtrIN3JSC6RegExpEEELm0EE14expandCapacityEm -__ZN3JSC9ArrayNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC17BytecodeGenerator12emitNewArrayEPNS_10RegisterIDEPNS_11ElementNodeE -__ZL14compileBracketiPiPPhPPKtS3_P9ErrorCodeiS_S_R11CompileData -__ZL17bracketIsAnchoredPKh -__ZL32branchFindFirstAssertedCharacterPKhb -__ZL20branchNeedsLineStartPKhjj -__ZN3JSC16PropertyListNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC17ObjectLiteralNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC17ObjectLiteralNodeD0Ev -__ZN3JSC10RegExpNodeD0Ev -__ZN3JSC9ArrayNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC9ArrayNodeD0Ev -__ZN3JSC16PropertyListNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC12PropertyNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC16PropertyListNodeD0Ev -__ZN3JSC12PropertyNodeD0Ev -__ZN3JSC20constructEmptyObjectEPNS_9ExecStateE -__ZN3JSC12FuncExprNode12makeFunctionEPNS_9ExecStateEPNS_14ScopeChainNodeE -__ZN3JSC12RegExpObjectC1EN3WTF10PassRefPtrINS_9StructureEEENS2_INS_6RegExpEEE -__ZN3JSCL7dateNowEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC14constructArrayEPNS_9ExecStateERKNS_7ArgListE -__ZN3JSC17RegExpConstructor11getCallDataERNS_8CallDataE -__ZN3JSCL21callRegExpConstructorEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC15constructRegExpEPNS_9ExecStateERKNS_7ArgListE -__ZNK3JSC14ExpressionNode10isLocationEv -__ZN3JSC21FunctionCallValueNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC21FunctionCallValueNodeD0Ev -__ZN3JSC21FunctionCallValueNode12releaseNodesERNS_12NodeReleaserE -__ZN3WTF7HashSetINS_6RefPtrIN3JSC7UString3RepEEENS2_17IdentifierRepHashENS_10HashTraitsIS5_EEE3addERKS5_ -__ZN3WTF9HashTableINS_6RefPtrIN3JSC7UString3RepEEES5_NS_17IdentityExtractorIS5_EENS2_17IdentifierRepHashENS_10HashTraitsIS5_EESA_E6rehashEi -__ZN3JSC11ElementNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC11ElementNodeD0Ev -__ZNK3JSC12JSActivation14isDynamicScopeEv -__ZN3JSC4Heap24setGCProtectNeedsLockingEv -__ZN3WTF15ThreadConditionD1Ev -__ZN3JSC17PrefixResolveNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC17PrefixResolveNodeD0Ev -__ZNK3JSC7UString8toUInt32EPbb -__ZN3JSC7UString17expandPreCapacityEi -__ZN3WTF17TCMalloc_PageHeap3NewEm -__ZN3JSC6JSCell9getObjectEv -__ZN3JSC4callEPNS_9ExecStateENS_10JSValuePtrENS_8CallTypeERKNS_8CallDataES2_RKNS_7ArgListE -__ZNK3JSC8JSObject12toThisObjectEPNS_9ExecStateE -__ZN3JSC11Interpreter7executeEPNS_16FunctionBodyNodeEPNS_9ExecStateEPNS_10JSFunctionEPNS_8JSObjectERKNS_7ArgListEPNS_14ScopeChainNodeEPNS_10JSValuePtrE -__ZN3JSCL22stringProtoFuncReplaceEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC6JSCell11getCallDataERNS_8CallDataE -__ZNK3JSC12RegExpObject9classInfoEv -__ZN3JSC17RegExpConstructor12performMatchEPNS_6RegExpERKNS_7UStringEiRiS6_PPi -__ZN3JSC6RegExp5matchERKNS_7UStringEiPN3WTF11OwnArrayPtrIiEE -__Z15jsRegExpExecutePK8JSRegExpPKtiiPii +__ZN3JSC11Interpreter13endRepeatCallERNS_16CallFrameClosureE +__ZN3JSC8JSObject23allocatePropertyStorageEmm +__ZN3JSCL19arrayProtoFuncShiftEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC7JSArray18getOwnPropertySlotEPNS_9ExecStateEjRNS_12PropertySlotE +__ZN3JSCL11getPropertyEPNS_9ExecStateEPNS_8JSObjectEj +__ZN3JSC7JSArray14deletePropertyEPNS_9ExecStateEj +__ZN3JSC7JSArray9setLengthEj +__ZN3JSC10JSFunction16getConstructDataERNS_13ConstructDataE +__ZN3JSC8JSObject17createInheritorIDEv +__ZN3JSCL25functionProtoFuncToStringEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZNK3JSC10JSFunction9classInfoEv +__ZN3JSCplERKNS_7UStringES2_ +__ZN3JSC7UString6appendEPKc +__ZN3JSC18RegExpMatchesArray18getOwnPropertySlotEPNS_9ExecStateEjRNS_12PropertySlotE +__ZN3JSC18RegExpMatchesArray17fillArrayInstanceEPNS_9ExecStateE +__ZN3JSCL19arrayProtoFuncSliceEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZNK3JSC7JSValue9toIntegerEPNS_9ExecStateE +__ZN3JSC24ApplyFunctionCallDotNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZNK3JSC14ExpressionNode13isSimpleArrayEv +__ZN3JSC17BytecodeGenerator26emitJumpIfNotFunctionApplyEPNS_10RegisterIDEPNS_5LabelE +__ZN3JSC17BytecodeGenerator15emitCallVarargsEPNS_10RegisterIDES2_S2_S2_jjj +__ZN3JSC24ApplyFunctionCallDotNodeD0Ev +__ZNK3JSC7JSArray9classInfoEv +__ZN3JSC7JSArray15copyToRegistersEPNS_9ExecStateEPNS_8RegisterEj __ZNK3JSC7UString30spliceSubstringsWithSeparatorsEPKNS0_5RangeEiPKS0_i -__ZL5matchPKtPKhiR9MatchData -__ZN3JSC9ThrowNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC9ThrowNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC9ThrowNodeD0Ev -__ZN3JSC17StringConstructor11getCallDataERNS_8CallDataE -__ZN3JSCL21callStringConstructorEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC17DeleteBracketNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC17DeleteBracketNodeD0Ev -__ZN3JSC17DeleteBracketNode12releaseNodesERNS_12NodeReleaserE -__ZNK3JSC6JSCell9getUInt32ERj +__ZN3JSC7UString17expandPreCapacityEi +__ZN3JSCL19isInvalidParamForInEPNS_9ExecStateEPNS_9CodeBlockEPKNS_11InstructionENS_7JSValueERS7_ +__ZNK3JSC8JSObject11hasPropertyEPNS_9ExecStateERKNS_10IdentifierE +__ZN3JSC7UString4fromEd +__ZN3WTF4dtoaEPcdiPiS1_PS0_ +__ZN3JSC12ContinueNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC17BytecodeGenerator14continueTargetERKNS_10IdentifierE +__ZN3JSC13DeleteDotNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC17BytecodeGenerator14emitDeleteByIdEPNS_10RegisterIDES2_RKNS_10IdentifierE +__ZN3JSC12ContinueNodeD0Ev +__ZN3JSC13DeleteDotNodeD0Ev +__ZN3JSC10JSFunction14deletePropertyEPNS_9ExecStateERKNS_10IdentifierE __ZN3JSC8JSObject14deletePropertyEPNS_9ExecStateERKNS_10IdentifierE -__ZN3JSC9Structure24removePropertyTransitionEPS0_RKNS_10IdentifierERm -__ZN3JSC14ArrayPrototype18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE -__ZN3JSCL18arrayProtoFuncPushEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSCL18arrayProtoFuncJoinEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE +__ZNK3JSC7ArgList8getSliceEiRS0_ +__ZNK3JSC12StringObject12toThisStringEPNS_9ExecStateE +__ZNK3JSC8JSObject8toStringEPNS_9ExecStateE +__ZNK3JSC8JSObject11toPrimitiveEPNS_9ExecStateENS_22PreferredPrimitiveTypeE +__ZNK3JSC8JSObject12defaultValueEPNS_9ExecStateENS_22PreferredPrimitiveTypeE +__ZN3JSCL22arrayProtoFuncToStringEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE __ZN3WTF7HashSetIPN3JSC8JSObjectENS_7PtrHashIS3_EENS_10HashTraitsIS3_EEE3addERKS3_ __ZN3WTF9HashTableIPN3JSC8JSObjectES3_NS_17IdentityExtractorIS3_EENS_7PtrHashIS3_EENS_10HashTraitsIS3_EES9_E6rehashEi -__ZNK3JSC8JSObject11hasPropertyEPNS_9ExecStateERKNS_10IdentifierE -__ZN3JSC11Interpreter14uncacheGetByIDEPNS_9CodeBlockEPNS_11InstructionE -__ZNK3JSC6JSCell17getTruncatedInt32ERi -__ZN3JSC15toInt32SlowCaseEdRb -__ZN3JSC10JSFunction3putEPNS_9ExecStateERKNS_10IdentifierENS_10JSValuePtrERNS_15PutPropertySlotE -__ZNK3JSC7ArgList8getSliceEiRS0_ -__ZN3JSC12RegExpObject18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE -__ZN3JSCL18regExpObjectSourceEPNS_9ExecStateERKNS_10IdentifierERKNS_12PropertySlotE -__ZN3JSCL19regExpProtoFuncExecEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC12RegExpObject5matchEPNS_9ExecStateERKNS_7ArgListE -__ZNK3JSC12JSNumberCell9toBooleanEPNS_9ExecStateE -__ZN3JSC28globalFuncDecodeURIComponentEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSCL6decodeEPNS_9ExecStateERKNS_7ArgListEPKcb -__ZN3JSC18RegExpMatchesArrayC2EPNS_9ExecStateEPNS_24RegExpConstructorPrivateE -__ZN3JSC18RegExpMatchesArray18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE -__ZN3JSC18RegExpMatchesArray17fillArrayInstanceEPNS_9ExecStateE -__ZN3JSC18RegExpMatchesArray18getOwnPropertySlotEPNS_9ExecStateEjRNS_12PropertySlotE -__ZN3JSC28globalFuncEncodeURIComponentEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE +__ZN3JSC7UString4fromEi +__ZN3WTF6VectorItLm256EE6appendItEEvPKT_m +__ZN3JSCL21arrayProtoFuncIndexOfEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC12nonInlineNaNEv +__ZN3JSC16ErrorConstructor16getConstructDataERNS_13ConstructDataE +__ZN3JSCL29constructWithErrorConstructorEPNS_9ExecStateEPNS_8JSObjectERKNS_7ArgListE +__ZN3JSC14constructErrorEPNS_9ExecStateERKNS_7ArgListE +__ZN3WTF21CrossThreadRefCountedINS_16OwnFastMallocPtrItEEE5derefEv +__ZN3WTF6VectorINS_6RefPtrIN3JSC10RegisterIDEEELm16EE14expandCapacityEm +__ZN3JSC4callEPNS_9ExecStateENS_7JSValueENS_8CallTypeERKNS_8CallDataES2_RKNS_7ArgListE +__ZN3JSC11Interpreter7executeEPNS_16FunctionBodyNodeEPNS_9ExecStateEPNS_10JSFunctionEPNS_8JSObjectERKNS_7ArgListEPNS_14ScopeChainNodeEPNS_7JSValueE +__ZN3JSC15TypeOfValueNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC15TypeOfValueNodeD0Ev +__ZN3JSC20jsTypeStringForValueEPNS_9ExecStateENS_7JSValueE +__ZN3JSC10Identifier5equalEPKNS_7UString3RepEPKc +__ZN3JSC13UnaryPlusNodeD0Ev +__ZNK3JSC8JSString8toNumberEPNS_9ExecStateE +__ZN3JSC17BytecodeGenerator19emitResolveWithBaseEPNS_10RegisterIDES2_RKNS_10IdentifierE +__ZN3JSC17RegExpConstructor16getConstructDataERNS_13ConstructDataE +__ZN3JSCL30constructWithRegExpConstructorEPNS_9ExecStateEPNS_8JSObjectERKNS_7ArgListE +__ZN3JSC15constructRegExpEPNS_9ExecStateERKNS_7ArgListE +__ZN3JSC18globalFuncUnescapeEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC7UString6appendEt +__ZN3WTF6VectorIPN3JSC14ExpressionNodeELm8EE14expandCapacityEm +__ZN3JSC8JSObject3putEPNS_9ExecStateEjNS_7JSValueE +__ZN3JSC4Heap7collectEv +__ZN3JSC4Heap30markStackObjectsConservativelyEv +__ZN3JSC4Heap31markCurrentThreadConservativelyEv +__ZN3JSC4Heap39markCurrentThreadConservativelyInternalEv +__ZN3JSC4Heap18markConservativelyEPvS1_ +__ZN3JSC14JSGlobalObject4markEv +__ZN3JSC8JSObject4markEv +__ZN3JSC6JSCell4markEv +__ZN3JSC10JSFunction4markEv +__ZN3JSC16FunctionBodyNode4markEv +__ZN3JSC9CodeBlock4markEv +__ZN3JSC12JSActivation4markEv +__ZN3JSC9Arguments4markEv +__ZN3JSC7JSArray4markEv +__ZN3JSC15JSWrapperObject4markEv +__ZN3JSC18GlobalEvalFunction4markEv +__ZN3JSC19JSStaticScopeObject4markEv +__ZN3JSC4Heap20markProtectedObjectsEv +__ZN3JSC12SmallStrings4markEv +__ZN3JSC4Heap5sweepILNS_8HeapTypeE0EEEmv +__ZN3JSC12RegExpObjectD1Ev +__ZN3JSC12JSActivationD1Ev +__ZN3JSC12JSActivationD2Ev +__ZN3JSC9ArgumentsD1Ev +__ZN3JSC9ArgumentsD2Ev +__ZN3JSC18RegExpMatchesArrayD1Ev +__ZN3JSC8JSObjectD1Ev +__ZN3JSC22JSPropertyNameIteratorD1Ev +__ZN3JSC12StringObjectD1Ev +__ZN3JSC8JSObjectD2Ev +__ZN3JSC4Heap5sweepILNS_8HeapTypeE1EEEmv +__ZNK3JSC19JSStaticScopeObject14isDynamicScopeEv +__ZN3JSC17ReadModifyDotNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC17ReadModifyDotNodeD0Ev +__ZN3JSC7UString10BaseString20slowIsBufferReadOnlyEv +__ZN3JSC18BooleanConstructor11getCallDataERNS_8CallDataE +__ZN3JSCL22callBooleanConstructorEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL18arrayProtoFuncJoinEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3WTF6VectorItLm256EE14expandCapacityEm +__ZN3JSC19FunctionConstructor16getConstructDataERNS_13ConstructDataE +__ZN3JSCL32constructWithFunctionConstructorEPNS_9ExecStateEPNS_8JSObjectERKNS_7ArgListE +__ZN3JSC17constructFunctionEPNS_9ExecStateERKNS_7ArgListERKNS_10IdentifierERKNS_7UStringEi +__ZN3JSC12JSActivation18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE +__ZN3JSC10SwitchNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC13CaseBlockNode20emitBytecodeForBlockERNS_17BytecodeGeneratorEPNS_10RegisterIDES4_ +__ZN3JSC13CaseBlockNode18tryOptimizedSwitchERN3WTF6VectorIPNS_14ExpressionNodeELm8EEERiS7_ +__ZN3JSCL17processClauseListEPNS_14ClauseListNodeERN3WTF6VectorIPNS_14ExpressionNodeELm8EEERNS_10SwitchKindERbRiSB_ +__ZN3WTF6VectorINS_6RefPtrIN3JSC5LabelEEELm8EE15reserveCapacityEm +__ZN3JSC17BytecodeGenerator11beginSwitchEPNS_10RegisterIDENS_10SwitchInfo10SwitchTypeE +__ZN3WTF6VectorIN3JSC10SwitchInfoELm0EE14expandCapacityEm +__ZN3WTF6VectorIiLm8EE14expandCapacityEm +__ZN3JSC17BytecodeGenerator9endSwitchEjPN3WTF6RefPtrINS_5LabelEEEPPNS_14ExpressionNodeEPS3_ii +__ZN3WTF6VectorIN3JSC15StringJumpTableELm0EE14expandCapacityEm +__ZN3JSC14CaseClauseNodeD0Ev +__ZN3JSC14ClauseListNodeD0Ev +__ZN3JSC13CaseBlockNodeD0Ev +__ZN3JSC10SwitchNodeD0Ev +__ZN3JSC5equalEPKNS_7UString3RepES3_ +__ZN3JSC28globalFuncEncodeURIComponentEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE __ZN3JSCL6encodeEPNS_9ExecStateERKNS_7ArgListEPKc -__ZN3JSC7UString6appendEPKc -__ZNK3JSC11Interpreter18retrieveLastCallerEPNS_9ExecStateERiRlRNS_7UStringERNS_10JSValuePtrE -__ZN3JSC9CodeBlock27lineNumberForBytecodeOffsetEPNS_9ExecStateEj +__ZNK3JSC7UString10UTF8StringEb +__ZN3WTF7Unicode18convertUTF16ToUTF8EPPKtS2_PPcS4_b +__ZN3JSCL26stringProtoFuncToLowerCaseEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC7UStringC2EPtib +__ZN3WTF6VectorIPN3JSC14ExpressionNodeELm16EE14expandCapacityEm +__ZN3JSC7UString13appendNumericEi +__ZN3JSC11concatenateEPNS_7UString3RepEi +__ZNK3JSC8NullNode6isNullEv +__ZN3JSC13GreaterEqNodeD0Ev +__ZL12makeMultNodePvPN3JSC14ExpressionNodeES2_b +__ZN3JSC8MultNodeD0Ev +__ZN3JSCL19mathProtoFuncRandomEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3WTF16weakRandomNumberEv +__ZN3JSC12jsNumberCellEPNS_9ExecStateEd +__ZN3JSCL17mathProtoFuncCeilEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC7UString3Rep11computeHashEPKti +__ZN3WTF37parseDateFromNullTerminatedCharactersEPKc +__ZN3JSC20EvalFunctionCallNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC20EvalFunctionCallNodeD0Ev +__ZN3JSC11Interpreter22resolveBaseAndPropertyEPNS_9ExecStateEPNS_11InstructionERNS_7JSValueE +__ZN3JSC15globalFuncIsNaNEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC11Interpreter8callEvalEPNS_9ExecStateEPNS_12RegisterFileEPNS_8RegisterEiiRNS_7JSValueE +__ZN3JSC13LiteralParser5Lexer3lexERNS1_18LiteralParserTokenE +__ZN3JSC13LiteralParser5parseENS0_11ParserStateE +__ZNK3WTF7HashMapINS_6RefPtrIN3JSC7UString3RepEEENS1_INS2_8EvalNodeEEENS_7StrHashIS5_EENS_10HashTraitsIS5_EENSA_IS7_EEE3getEPS4_ +__ZN3JSC6Parser5parseINS_8EvalNodeEEEN3WTF10PassRefPtrIT_EEPNS_9ExecStateEPNS_8DebuggerERKNS_10SourceCodeEPiPNS_7UStringE +__ZN3WTF9HashTableINS_6RefPtrIN3JSC7UString3RepEEESt4pairIS5_NS1_INS2_8EvalNodeEEEENS_18PairFirstExtractorIS9_EENS_7StrHashIS5_EENS_14PairHashTraitsINS_10HashTraitsIS5_EENSF_IS8_EEEESG_E6expandEv +__ZN3JSC9ExecState9thisValueEv +__ZN3JSC11Interpreter7executeEPNS_8EvalNodeEPNS_9ExecStateEPNS_8JSObjectEiPNS_14ScopeChainNodeEPNS_7JSValueE +__ZN3JSC8EvalNode16generateBytecodeEPNS_14ScopeChainNodeE +__ZN3JSC17BytecodeGeneratorC2EPNS_8EvalNodeEPKNS_8DebuggerERKNS_10ScopeChainEPN3WTF7HashMapINS9_6RefPtrINS_7UString3RepEEENS_16SymbolTableEntryENS_17IdentifierRepHashENS9_10HashTraitsISE_EENS_26SymbolTableIndexHashTraitsEEEPNS_13EvalCodeBlockE +__ZN3JSC8EvalNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC11Interpreter11resolveBaseEPNS_9ExecStateEPNS_11InstructionE +__ZN3JSC10LessEqNodeD0Ev +__ZN3JSC16globalFuncEscapeEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZThn12_N3JSC8EvalNodeD0Ev +__ZN3JSC8EvalNodeD0Ev +__ZN3JSC22JSPropertyNameIterator4markEv +__ZN3JSC21ReadModifyResolveNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC21ReadModifyResolveNodeD0Ev +__ZN3JSC28globalFuncDecodeURIComponentEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL6decodeEPNS_9ExecStateERKNS_7ArgListEPKcb +__ZNK3JSC12JSNumberCell11toPrimitiveEPNS_9ExecStateENS_22PreferredPrimitiveTypeE +__ZN3JSC7UString13appendNumericEd +__ZN3JSC11concatenateEPNS_7UString3RepEd +__ZN3JSC14jsIsObjectTypeENS_7JSValueE +__ZNK3JSC7JSValue20toThisObjectSlowCaseEPNS_9ExecStateE +__ZL11makeDivNodePvPN3JSC14ExpressionNodeES2_b +__ZN3JSC7DivNodeD0Ev +__ZN3JSC15DateConstructor16getConstructDataERNS_13ConstructDataE +__ZN3JSCL28constructWithDateConstructorEPNS_9ExecStateEPNS_8JSObjectERKNS_7ArgListE +__ZN3JSC13constructDateEPNS_9ExecStateERKNS_7ArgListE +__ZN3WTF17getCurrentUTCTimeEv +__ZN3WTF8timeClipEd +__ZN3JSC13DatePrototype18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE +__ZN3JSCL30dateProtoFuncGetTimezoneOffsetEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZNK3JSC12DateInstance9classInfoEv +__ZNK3JSC12DateInstance21msToGregorianDateTimeEdbRN3WTF17GregorianDateTimeE +__ZN3WTF21msToGregorianDateTimeEdbRNS_17GregorianDateTimeE +__ZN3WTF12getUTCOffsetEv +__ZN3WTFL12getDSTOffsetEdd +__ZN3JSCL21dateProtoFuncGetHoursEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3WTF13tryFastMallocEm +__ZN3JSC10BitAndNodeD0Ev +__ZN3JSC18globalFuncParseIntEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL8parseIntERKNS_7UStringEi +__ZN3JSCL20dateProtoFuncGetTimeEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZNK3JSC7JSValue19synthesizePrototypeEPNS_9ExecStateE +__ZN3JSC26createNotAnObjectErrorStubEPNS_9ExecStateEb +__ZN3JSC13JSNotAnObject18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE +__ZN3JSC11Interpreter14throwExceptionERPNS_9ExecStateERNS_7JSValueEjb +__ZNK3JSC22JSNotAnObjectErrorStub22isNotAnObjectErrorStubEv +__ZN3JSC22createNotAnObjectErrorEPNS_9ExecStateEPNS_22JSNotAnObjectErrorStubEjPNS_9CodeBlockE +__ZN3JSC9CodeBlock37getByIdExceptionInfoForBytecodeOffsetEPNS_9ExecStateEjRNS_8OpcodeIDE __ZN3JSC9CodeBlock34reparseForExceptionInfoIfNecessaryEPNS_9ExecStateE +__ZNK3JSC10ScopeChain10localDepthEv +__ZNK3JSC12JSActivation9classInfoEv __ZN3JSC6Parser7reparseINS_16FunctionBodyNodeEEEN3WTF10PassRefPtrIT_EEPNS_12JSGlobalDataEPS5_ -__ZN3JSC16FunctionBodyNode6createEPNS_12JSGlobalDataEPNS_14SourceElementsEPN3WTF6VectorISt4pairINS_10IdentifierEjELm0EEEPNS6_INS5_6RefPtrINS_12FuncDeclNodeEEELm0EEERKNS_10SourceCodeEji +__ZN3JSC16FunctionBodyNode6createEPNS_12JSGlobalDataEPNS_14SourceElementsEPN3WTF6VectorISt4pairINS_10IdentifierEjELm0EEEPNS6_IPNS_12FuncDeclNodeELm0EEERKNS_10SourceCodeEji __ZN3JSC13StatementNode6setLocEii __ZN3JSC16FunctionBodyNode14copyParametersEv __ZN3JSC16FunctionBodyNode13finishParsingEPNS_10IdentifierEm __ZN3JSC16FunctionBodyNode31bytecodeForExceptionInfoReparseEPNS_14ScopeChainNodeEPNS_9CodeBlockE __ZN3JSC9CodeBlock43hasGlobalResolveInstructionAtBytecodeOffsetEj -__ZN3JSCL22functionProtoFuncApplyEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE +__ZN3JSC9CodeBlock32expressionRangeForBytecodeOffsetEPNS_9ExecStateEjRiS3_S3_ +__ZN3JSCL18createErrorMessageEPNS_9ExecStateEPNS_9CodeBlockEiiiNS_7JSValueENS_7UStringE +__ZN3JSC5Error6createEPNS_9ExecStateENS_9ErrorTypeERKNS_7UStringEilS6_ +__ZN3JSC22NativeErrorConstructor16getConstructDataERNS_13ConstructDataE +__ZN3JSCL35constructWithNativeErrorConstructorEPNS_9ExecStateEPNS_8JSObjectERKNS_7ArgListE +__ZN3JSC22NativeErrorConstructor9constructEPNS_9ExecStateERKNS_7ArgListE +__ZN3JSC8JSObject17putWithAttributesEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueEj +__ZN3JSC9CodeBlock24handlerForBytecodeOffsetEj +__ZN3JSC11Interpreter20createExceptionScopeEPNS_9ExecStateEPKNS_11InstructionE +__ZN3JSC23FunctionCallBracketNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC23FunctionCallBracketNodeD0Ev +__ZN3JSCL20dateProtoFuncSetTimeEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL24stringProtoFuncSubstringEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL18mathProtoFuncFloorEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL19dateProtoFuncGetDayEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL21dateProtoFuncGetMonthEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL20dateProtoFuncGetYearEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3WTF6VectorIjLm16EE6resizeEm +__ZN3JSCL24dateProtoFuncToGMTStringEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC10formatTimeERKN3WTF17GregorianDateTimeEb +__ZN3JSC6JSCell18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE +__ZNK3JSC12JSNumberCell8toObjectEPNS_9ExecStateE +__ZN3JSC15constructNumberEPNS_9ExecStateENS_7JSValueE +__ZN3JSCL23numberProtoFuncToStringEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZNK3JSC12JSNumberCell8toStringEPNS_9ExecStateE +__ZN3JSC14PostfixDotNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC14PostfixDotNodeD0Ev +__ZN3JSCL19regExpProtoFuncExecEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL20stringProtoFuncSliceEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL22objectProtoFuncValueOfEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC14InstanceOfNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC17BytecodeGenerator14emitInstanceOfEPNS_10RegisterIDES2_S2_S2_ +__ZN3JSC14InstanceOfNodeD0Ev +__ZN3JSCL27isInvalidParamForInstanceOfEPNS_9ExecStateEPNS_9CodeBlockEPKNS_11InstructionENS_7JSValueERS7_ +__ZN3JSC8JSObject11hasInstanceEPNS_9ExecStateENS_7JSValueES3_ +__ZN3JSCL20arrayProtoFuncConcatEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC18RegExpMatchesArray18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE +__ZN3JSC17StringConstructor11getCallDataERNS_8CallDataE +__ZN3JSCL21callStringConstructorEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZNK3JSC12StringObject8toStringEPNS_9ExecStateE +__ZN3JSCL26stringProtoFuncToUpperCaseEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZNK3JSC7UString12replaceRangeEiiRKS0_ +__ZN3JSCL23stringProtoFuncToStringEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC13jsAddSlowCaseEPNS_9ExecStateENS_7JSValueES2_ +__ZNK3JSC12StringObject9classInfoEv +__ZN3WTFL15dateToDayInYearEiii +__ZN3JSCL23dateProtoFuncGetMinutesEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL7dateNowEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC20globalFuncParseFloatEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC19JSStaticScopeObjectD1Ev +__ZN3JSC19JSStaticScopeObjectD2Ev +__ZN3JSC13ErrorInstanceD1Ev +__ZN3JSC13JSNotAnObjectD1Ev +__ZN3JSC22JSNotAnObjectErrorStubD1Ev +__ZN3JSC12NumberObjectD1Ev +__ZN3JSC12DateInstanceD1Ev +__ZN3JSC17PrefixResolveNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC17PrefixResolveNodeD0Ev +__ZN3JSCL29objectProtoFuncHasOwnPropertyEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC17ObjectConstructor16getConstructDataERNS_13ConstructDataE +__ZN3JSCL30constructWithObjectConstructorEPNS_9ExecStateEPNS_8JSObjectERKNS_7ArgListE +__ZN3JSCL24regExpConstructorDollar2EPNS_9ExecStateERKNS_10IdentifierERKNS_12PropertySlotE +__ZN3JSCL24regExpConstructorDollar3EPNS_9ExecStateERKNS_10IdentifierERKNS_12PropertySlotE +__ZN3JSCL24regExpConstructorDollar4EPNS_9ExecStateERKNS_10IdentifierERKNS_12PropertySlotE +__ZNK3JSC11Interpreter18retrieveLastCallerEPNS_9ExecStateERiRlRNS_7UStringERNS_7JSValueE +__ZN3JSC9CodeBlock27lineNumberForBytecodeOffsetEPNS_9ExecStateEj +__ZN3JSC21ReadModifyBracketNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC7ModNodeD0Ev +__ZN3JSC21ReadModifyBracketNodeD0Ev +__ZN3JSC10BitXOrNodeD0Ev +__ZN3JSCL18mathProtoFuncRoundEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZL17makeLeftShiftNodePvPN3JSC14ExpressionNodeES2_b +__ZL18makeRightShiftNodePvPN3JSC14ExpressionNodeES2_b +__ZN3JSC13LeftShiftNodeD0Ev +__ZN3JSC14RightShiftNodeD0Ev +__ZN3JSCL25stringProtoFuncCharCodeAtEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC15toInt32SlowCaseEdRb +__ZN3JSC10NegateNodeD0Ev +__ZN3JSC11DoWhileNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC11DoWhileNodeD0Ev +__ZN3JSCL16mathProtoFuncMaxEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC17PrefixBracketNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC17PrefixBracketNodeD0Ev +__ZN3JSC10JSONObject18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE +__ZN3JSCL22JSONProtoFuncStringifyEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC11StringifierC2EPNS_9ExecStateENS_7JSValueES3_ +__ZN3JSC11Stringifier9stringifyENS_7JSValueE +__ZN3JSC11Stringifier22appendStringifiedValueERNS_7UStringENS_7JSValueEPNS_8JSObjectERKNS_27PropertyNameForFunctionCallE +__ZNK3JSC6JSCell9getStringERNS_7UStringE +__ZN3JSC11Stringifier6Holder18appendNextPropertyERS0_RNS_7UStringE +__ZNK3JSC7UString6substrEii +__ZNK3JSC7UStringixEi +__ZN3JSC11Stringifier18appendQuotedStringERNS_7UStringERKS1_ +__ZN3JSC7UString6appendEPKti +__ZN3JSC11StringifierD2Ev +__ZN3JSCL18JSONProtoFuncParseEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC13LiteralParser5Lexer9lexStringILNS0_10ParserModeE0EEENS0_9TokenTypeERNS1_18LiteralParserTokenE +__ZN3JSC13LiteralParser5Lexer9lexNumberERNS1_18LiteralParserTokenE +__ZN3JSC18RegExpMatchesArray3putEPNS_9ExecStateEjNS_7JSValueE +__ZNK3JSC8JSObject22isNotAnObjectErrorStubEv +__ZNK3JSC8JSObject19isWatchdogExceptionEv +__ZN3JSC11Interpreter15unwindCallFrameERPNS_9ExecStateENS_7JSValueERjRPNS_9CodeBlockE +__ZN3JSC19JSStaticScopeObject18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE +__ZN3JSC14TimeoutChecker10didTimeOutEPNS_9ExecStateE +__ZN3JSC17PropertyNameArray3addEPNS_7UString3RepE +__ZN3WTF7HashSetIPN3JSC7UString3RepENS_7PtrHashIS4_EENS_10HashTraitsIS4_EEE3addERKS4_ +__ZN3WTF9HashTableIPN3JSC7UString3RepES4_NS_17IdentityExtractorIS4_EENS_7PtrHashIS4_EENS_10HashTraitsIS4_EESA_E6rehashEi +__ZN3JSC17PrototypeFunctionD1Ev +__ZN3JSC15ObjectPrototypeD1Ev +__ZN3JSC17FunctionPrototypeD1Ev +__ZN3JSC14JSGlobalObjectD2Ev +__ZN3JSC18GlobalEvalFunctionD1Ev +__ZN3JSC10JSONObjectD1Ev +__ZN3JSC10MathObjectD1Ev +__ZN3JSC22NativeErrorConstructorD1Ev +__ZN3JSC16ErrorConstructorD1Ev +__ZN3JSC17RegExpConstructorD1Ev +__ZN3JSC15DateConstructorD1Ev +__ZN3JSC17NumberConstructorD1Ev +__ZN3JSC18BooleanConstructorD1Ev +__ZN3JSC17StringConstructorD1Ev +__ZN3JSC16ArrayConstructorD1Ev +__ZN3JSC19FunctionConstructorD1Ev +__ZN3JSC17ObjectConstructorD1Ev +__ZN3JSC20NativeErrorPrototypeD1Ev +__ZN3JSC14ErrorPrototypeD1Ev +__ZN3JSC15RegExpPrototypeD1Ev +__ZN3JSC13DatePrototypeD1Ev +__ZN3JSC12DateInstanceD2Ev +__ZN3JSC15NumberPrototypeD1Ev +__ZN3JSC16BooleanPrototypeD1Ev +__ZN3JSC15StringPrototypeD1Ev +__ZN3JSC14ArrayPrototypeD1Ev +__ZN3JSC17DeleteBracketNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC17BytecodeGenerator15emitDeleteByValEPNS_10RegisterIDES2_S2_ +__ZN3JSC17DeleteBracketNodeD0Ev +__ZN3JSC23objectProtoFuncToStringEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZNK3JSC8JSObject9classNameEv +__ZN3JSC17StringConstructor16getConstructDataERNS_13ConstructDataE +__ZN3JSCL30constructWithStringConstructorEPNS_9ExecStateEPNS_8JSObjectERKNS_7ArgListE +__ZN3JSC12RegExpObject11getCallDataERNS_8CallDataE +__ZN3JSC4Heap15recordExtraCostEm +__ZN3JSC7JSArray4pushEPNS_9ExecStateENS_7JSValueE +__ZN3JSCL21dateProtoFuncToStringEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZNK3JSC8JSObject8toNumberEPNS_9ExecStateE +__ZN3JSCL20dateProtoFuncGetDateEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL18stringFromCharCodeEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC11Interpreter11resolveSkipEPNS_9ExecStateEPNS_11InstructionERNS_7JSValueE +__ZN3JSC9Structure27despecifyDictionaryFunctionERKNS_10IdentifierE +__ZN3JSC17DeleteResolveNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC17DeleteResolveNodeD0Ev +__ZN3JSCL21arrayProtoFuncUnShiftEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC11Interpreter14uncachePutByIDEPNS_9CodeBlockEPNS_11InstructionE __ZNK3JSC9Arguments9classInfoEv -__ZN3JSC9Arguments11fillArgListEPNS_9ExecStateERNS_7ArgListE -__ZN3JSC7TryNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC17BytecodeGenerator9emitCatchEPNS_10RegisterIDEPNS_5LabelES4_ -__ZN3WTF6VectorIN3JSC11HandlerInfoELm0EE14expandCapacityEm -__ZN3JSC17BytecodeGenerator16emitPushNewScopeEPNS_10RegisterIDERNS_10IdentifierES2_ -__ZN3JSC7TryNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC7TryNodeD0Ev -__ZN3JSCL21stringProtoFuncSubstrEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZNK3JSC10JSValuePtr9toIntegerEPNS_9ExecStateE +__ZN3JSC9Arguments15copyToRegistersEPNS_9ExecStateEPNS_8RegisterEj +__ZN3JSC9Arguments3putEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueERNS_15PutPropertySlotE +__ZN3JSC8JSObject14deletePropertyEPNS_9ExecStateEj +__ZN3WTF6VectorIPN3JSC9StructureELm8EE14expandCapacityEm +__ZN3JSC12StringObject16getPropertyNamesEPNS_9ExecStateERNS_17PropertyNameArrayE +__ZN3JSC9ExecState11stringTableEPS0_ +__ZN3JSCL16mathProtoFuncMinEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3WTFL7multaddERNS_6BigIntEii +__ZN3WTF6VectorIjLm16EEaSERKS1_ +__ZN3WTFL4multERNS_6BigIntERKS0_ +__ZN3JSC18PostfixBracketNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC18PostfixBracketNodeD0Ev +__ZN3JSCL21arrayProtoFuncReverseEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__Z15jsc_pcre_xclassiPKh +__ZN3JSC8VoidNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC8VoidNodeD0Ev +__ZN3JSC12JSActivation3putEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueERNS_15PutPropertySlotE +__ZNK3JSC9ArrayNode13isSimpleArrayEv +__ZN3JSCL21stringProtoFuncCharAtEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL18regExpObjectSourceEPNS_9ExecStateERKNS_10IdentifierERKNS_12PropertySlotE +__ZN3JSC17RegExpConstructor11getCallDataERNS_8CallDataE +__ZN3JSCL21callRegExpConstructorEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL20arrayProtoFuncSpliceEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL18arrayProtoFuncSortEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC7JSArray4sortEPNS_9ExecStateE +__ZN3JSC7JSArray17compactForSortingEv +__ZN3JSC16JSVariableObject14deletePropertyEPNS_9ExecStateERKNS_10IdentifierE +__ZN3WTF6VectorIN3JSC7UString5RangeELm16EE14expandCapacityEm +__ZN3WTF6VectorIN3JSC7UStringELm16EE14expandCapacityEm +__ZN3JSCL17arrayProtoFuncPopEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC7JSArray3popEv +__ZN3JSCL21functionProtoFuncCallEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC12JSActivation14deletePropertyEPNS_9ExecStateERKNS_10IdentifierE +__ZN3JSCL9dateParseEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC12RegExpObject3putEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueERNS_15PutPropertySlotE +__ZN3JSCL24setRegExpObjectLastIndexEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueE +__ZN3JSCL28regExpConstructorLeftContextEPNS_9ExecStateERKNS_10IdentifierERKNS_12PropertySlotE +__ZN3JSCL21stringProtoFuncSubstrEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC28createUndefinedVariableErrorEPNS_9ExecStateERKNS_10IdentifierEjPNS_9CodeBlockE +__ZN3JSC36constructBooleanFromImmediateBooleanEPNS_9ExecStateENS_7JSValueE +__ZN3JSCL26stringProtoFuncLastIndexOfEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZNK3JSC7JSValue20toIntegerPreserveNaNEPNS_9ExecStateE +__ZNK3JSC7UString5rfindERKS0_i +__ZN3JSC19globalFuncEncodeURIEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC13UnaryPlusNode14stripUnaryPlusEv +__ZN3JSC8JSString18getPrimitiveNumberEPNS_9ExecStateERdRNS_7JSValueE +__ZN3JSC13BooleanObjectD1Ev +__ZN3WTF17TCMalloc_PageHeap3NewEm +__ZNK3JSC21UStringSourceProvider8getRangeEii +__ZN3JSCL23dateProtoFuncGetSecondsEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC8JSObject18getPrimitiveNumberEPNS_9ExecStateERdRNS_7JSValueE +__ZN3JSCL24dateProtoFuncGetFullYearEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL20dateProtoFuncSetYearEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3WTF21gregorianDateTimeToMSERKNS_17GregorianDateTimeEdb +__ZN3JSCL27compareByStringPairForQSortEPKvS1_ +__ZN3JSCL29regExpConstructorRightContextEPNS_9ExecStateERKNS_10IdentifierERKNS_12PropertySlotE +__ZNK3JSC12NumberObject9classInfoEv +__ZN3JSCL19isNonASCIIIdentPartEi +__ZN3JSC8EvalNode4markEv +__ZN3WTF7Unicode18UTF8SequenceLengthEc +__ZN3WTF7Unicode18decodeUTF8SequenceEPKc +__ZN3JSC18globalFuncIsFiniteEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL24booleanProtoFuncToStringEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL24dateProtoFuncToUTCStringEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC17PrototypeFunctionC1EPNS_9ExecStateEN3WTF10PassRefPtrINS_9StructureEEEiRKNS_10IdentifierEPFNS_7JSValueES2_PNS_8JSObjectESA_RKNS_7ArgListEE +__ZN3JSC16InternalFunction4nameEPNS_12JSGlobalDataE +__ZN3JSC16ArrayConstructor11getCallDataERNS_8CallDataE +__ZN3JSCL20callArrayConstructorEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL21stringProtoFuncConcatEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC6JSCell3putEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueERNS_15PutPropertySlotE +__ZNK3JSC8JSString8toObjectEPNS_9ExecStateE +__ZN3JSC17ObjectConstructor11getCallDataERNS_8CallDataE +__ZN3JSCL21callObjectConstructorEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC13LiteralParser5Lexer9lexStringILNS0_10ParserModeE1EEENS0_9TokenTypeERNS1_18LiteralParserTokenE +__ZN3WTF6VectorIPNS0_IN3JSC10RegisterIDELm32EEELm32EE14expandCapacityEmPKS4_ +__ZN3WTF6VectorIPNS0_IN3JSC10RegisterIDELm32EEELm32EE15reserveCapacityEm +__ZN3JSCL16mathProtoFuncAbsEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL22numberProtoFuncToFixedEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL16integerPartNoExpEd +__ZN3JSCL16mathProtoFuncLogEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL16mathProtoFuncPowEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3WTF13tryFastCallocEmm +__ZN3JSC7JSArray11sortNumericEPNS_9ExecStateENS_7JSValueENS_8CallTypeERKNS_8CallDataE +__ZN3JSCL22compareNumbersForQSortEPKvS1_ +__ZN3JSCL22functionProtoFuncApplyEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC9Arguments11fillArgListEPNS_9ExecStateERNS_20MarkedArgumentBufferE +__ZN3JSC7JSArray16getPropertyNamesEPNS_9ExecStateERNS_17PropertyNameArrayE +__ZN3JSC9ExecState10arrayTableEPS0_ +__ZN3JSCL23regExpProtoFuncToStringEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL18regExpObjectGlobalEPNS_9ExecStateERKNS_10IdentifierERKNS_12PropertySlotE +__ZN3JSCL22regExpObjectIgnoreCaseEPNS_9ExecStateERKNS_10IdentifierERKNS_12PropertySlotE +__ZN3JSCL21regExpObjectMultilineEPNS_9ExecStateERKNS_10IdentifierERKNS_12PropertySlotE +__ZNK3JSC12JSNumberCell12toThisObjectEPNS_9ExecStateE +__ZN3JSCL22numberProtoFuncValueOfEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC12NumberObject11getJSNumberEv +__ZNK3JSC7JSValue16synthesizeObjectEPNS_9ExecStateE +__ZN3JSC13JSNotAnObject3putEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueERNS_15PutPropertySlotE +__ZN3JSCL22errorProtoFuncToStringEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC10JSFunction15argumentsGetterEPNS_9ExecStateERKNS_10IdentifierERKNS_12PropertySlotE +__ZNK3JSC11Interpreter17retrieveArgumentsEPNS_9ExecStateEPNS_10JSFunctionE +__ZN3JSCL21dateProtoFuncSetMonthEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL23setNewValueFromDateArgsEPNS_9ExecStateENS_7JSValueERKNS_7ArgListEib +__ZN3JSCL20dateProtoFuncSetDateEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC9BitOrNodeD0Ev +__ZN3JSC12JSGlobalData6createEb +__ZN3JSC8JSObject17putDirectFunctionEPNS_9ExecStateEPNS_16InternalFunctionEj +__ZN3JSC7CStringD1Ev +__ZN3JSCL17mathProtoFuncSqrtEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL16mathProtoFuncCosEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL16mathProtoFuncSinEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC14BitwiseNotNodeD0Ev +__ZN3JSC22UnsignedRightShiftNodeD0Ev +__ZN3JSC16toUInt32SlowCaseEdRb +__ZN3WTF6VectorIN3JSC15SimpleJumpTableELm0EE14expandCapacityEm +__ZN3WTF6VectorIiLm0EE15reserveCapacityEm +__ZN3JSC15SimpleJumpTable14offsetForValueEii +__ZN3JSC20MarkedArgumentBuffer10slowAppendENS_7JSValueE +__ZN3WTF7HashSetIPN3JSC20MarkedArgumentBufferENS_7PtrHashIS3_EENS_10HashTraitsIS3_EEE3addERKS3_ +__ZN3WTF9HashTableIPN3JSC20MarkedArgumentBufferES3_NS_17IdentityExtractorIS3_EENS_7PtrHashIS3_EENS_10HashTraitsIS3_EES9_E6rehashEi +__ZN3JSC7JSArray4sortEPNS_9ExecStateENS_7JSValueENS_8CallTypeERKNS_8CallDataE +__ZN3WTF7AVLTreeIN3JSC32AVLTreeAbstractorForArrayCompareELj44ENS_18AVLTreeDefaultBSetILj44EEEE6insertEi __ZN3JSCltERKNS_7UStringES2_ -__ZN3JSC9BreakNodeD0Ev -__ZN3JSC17BytecodeGenerator14emitJumpScopesEPNS_5LabelEi -__ZN3JSC9BreakNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC17BytecodeGenerator11breakTargetERKNS_10IdentifierE -__ZNK3JSC10ScopeChain10localDepthEv -__ZNK3JSC12JSActivation9classInfoEv -__ZN3JSCL30comparePropertyMapEntryIndicesEPKvS1_ -__ZN3WTF6VectorIN3JSC10IdentifierELm20EE15reserveCapacityEm -__ZN3JSCL19regExpProtoFuncTestEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3WTF12detachThreadEj -__ZN3WTFL26pthreadHandleForIdentifierEj -__ZN3WTFL31clearPthreadHandleForIdentifierEj -__ZN3JSC18RegExpMatchesArrayD1Ev -__ZN3JSC12RegExpObjectD1Ev -__Z12jsRegExpFreeP8JSRegExp -__ZN3JSC6RegExpD1Ev +__ZN3WTF7AVLTreeIN3JSC32AVLTreeAbstractorForArrayCompareELj44ENS_18AVLTreeDefaultBSetILj44EEEE7balanceEi +__ZN3JSC4Heap7destroyEv +__ZN3JSC12JSGlobalDataD1Ev +__ZN3JSC12JSGlobalDataD2Ev +__ZN3JSC12RegisterFileD1Ev +__ZNK3JSC9HashTable11deleteTableEv +__ZN3JSC5LexerD1Ev +__ZN3JSC5LexerD2Ev +__ZN3WTF20deleteAllPairSecondsIP24OpaqueJSClassContextDataKNS_7HashMapIP13OpaqueJSClassS2_NS_7PtrHashIS5_EENS_10HashTraitsIS5_EENS8_IS2_EEEEEEvRT0_ +__ZN3JSC17CommonIdentifiersD2Ev +__ZN3JSC21deleteIdentifierTableEPNS_15IdentifierTableE +__ZN3JSC4HeapD1Ev +__ZN3JSC12SmallStringsD1Ev diff --git a/JavaScriptCore.order b/JavaScriptCore.order index 05c300c..3ae3ec6 100644 --- a/JavaScriptCore.order +++ b/JavaScriptCore.order @@ -1,18 +1,20 @@ -__ZN3WTF19initializeThreadingEv __ZN3WTF10fastMallocEm __ZN3WTF10fastMallocILb1EEEPvm __ZN3WTF20TCMalloc_ThreadCache10InitModuleEv __ZN3WTFL15InitSizeClassesEv __Z20TCMalloc_SystemAllocmPmm +__ZN3WTFL13MetaDataAllocEm __ZN3WTF20TCMalloc_ThreadCache22CreateCacheIfNecessaryEv __ZN3WTF25TCMalloc_Central_FreeList11RemoveRangeEPPvS2_Pi __ZN3WTF25TCMalloc_Central_FreeList18FetchFromSpansSafeEv __ZN3WTF17TCMalloc_PageHeap10AllocLargeEm __ZN3WTF17TCMalloc_PageHeap8GrowHeapEm -__ZN3WTFL13MetaDataAllocEm +__ZN3WTF19initializeThreadingEv __ZN3WTF20initializeMainThreadEv __ZN3WTF5MutexC1Ev +__ZN3WTF28initializeMainThreadPlatformEv __ZN3WTF36lockAtomicallyInitializedStaticMutexEv +__ZN3WTF8fastFreeEPv __ZN3WTF38unlockAtomicallyInitializedStaticMutexEv __ZN3JSC19initializeThreadingEv __ZN3JSCL23initializeThreadingOnceEv @@ -22,95 +24,128 @@ __ZN3WTF11currentTimeEv __ZN3WTF15ThreadConditionC1Ev __ZN3WTF5Mutex4lockEv __ZN3WTF5Mutex6unlockEv -__ZN3WTF8fastFreeEPv __ZN3WTF12createThreadEPFPvS0_ES0_PKc __ZN3WTF20createThreadInternalEPFPvS0_ES0_PKc __ZN3WTFL35establishIdentifierForPthreadHandleERP17_opaque_pthread_t +__ZN3WTF9HashTableIjSt4pairIjP17_opaque_pthread_tENS_18PairFirstExtractorIS4_EENS_7IntHashIjEENS_14PairHashTraitsINS_10HashTrai __ZN3WTFL16threadEntryPointEPv -__ZN3WTF7HashMapIjP17_opaque_pthread_tNS_7IntHashIjEENS_10HashTraitsIjEENS5_IS2_EEE3addERKjRKS2_ -__ZN3WTF9HashTableIjSt4pairIjP17_opaque_pthread_tENS_18PairFirstExtractorIS4_EENS_7IntHashIjEENS_14PairHashTraitsINS_10HashTraitsIjEENSA_IS3_EEEESB_E6rehashEi __ZN3WTF16fastZeroedMallocEm +__ZN3WTF21setThreadNameInternalEPKc __ZN3WTF5MutexD1Ev __ZN3WTF25TCMalloc_Central_FreeList11InsertRangeEPvS1_i __ZN3WTF25TCMalloc_Central_FreeList18ReleaseListToSpansEPv +__ZN3WTF12isMainThreadEv __ZN3WTF14FastMallocZone4sizeEP14_malloc_zone_tPKv __ZN3WTF13currentThreadEv __ZN3WTF16callOnMainThreadEPFvPvES0_ -__ZN3WTF6VectorINS_19FunctionWithContextELm0EE14expandCapacityEm +__ZN3WTF5DequeINS_19FunctionWithContextEE14expandCapacityEv __ZN3WTF37scheduleDispatchFunctionsOnMainThreadEv __ZN3WTF15ThreadCondition4waitERNS_5MutexE __ZN3JSC8DebuggerC2Ev __ZN3WTF6strtodEPKcPPc __ZN3WTF15ThreadCondition6signalEv +__ZN3WTF15ThreadCondition9timedWaitERNS_5MutexEd __ZN3WTF15ThreadCondition9broadcastEv +-[WTFMainThreadCaller call] +__ZN3WTF31dispatchFunctionsFromMainThreadEv +__ZN3WTF14FastMallocZone9forceLockEP14_malloc_zone_t +__ZN3WTF11fastReallocEPvm +__ZN3WTF11fastReallocILb1EEEPvS1_m +__ZN3JSC7UStringC1EPKti +__ZN3JSC7UStringC2EPKti __ZN3JSC12JSGlobalData12createLeakedEv -__ZN3JSC12JSGlobalDataC2Eb -__ZN3JSC11InterpreterC1Ev -__ZN3JSC11Interpreter14privateExecuteENS0_13ExecutionFlagEPNS_12RegisterFileEPNS_9ExecStateEPNS_10JSValuePtrE -__ZN3WTF7HashMapIPvN3JSC8OpcodeIDENS_7PtrHashIS1_EENS_10HashTraitsIS1_EENS6_IS3_EEE3addERKS1_RKS3_ -__ZN3WTF9HashTableIPvSt4pairIS1_N3JSC8OpcodeIDEENS_18PairFirstExtractorIS5_EENS_7PtrHashIS1_EENS_14PairHashTraitsINS_10HashTraitsIS1_EENSB_IS4_EEEESC_E6expandEv -__ZN3JSC9StructureC1ENS_10JSValuePtrERKNS_8TypeInfoE +__ZN3JSC9Structure18startIgnoringLeaksEv +__ZN3JSC7VPtrSetC2Ev +__ZN3JSC9StructureC1ENS_7JSValueERKNS_8TypeInfoE __ZN3JSC7JSArrayC1EN3WTF10PassRefPtrINS_9StructureEEE -__ZN3JSC7JSArrayD0Ev +__ZN3JSC7JSArrayD1Ev +__ZN3JSC7JSArrayD2Ev __ZN3WTF10RefCountedIN3JSC9StructureEE5derefEv __ZN3JSC9StructureD1Ev -__ZN3JSC11JSByteArray15createStructureENS_10JSValuePtrE +__ZN3JSC9StructureD2Ev +__ZN3JSC11JSByteArray15createStructureENS_7JSValueE +__ZN3JSC11JSByteArrayD1Ev +__ZN3JSC8JSStringD1Ev +__ZN3JSC10JSFunctionD1Ev +__ZN3JSC10JSFunctionD2Ev +__ZN3JSC8JSObjectD2Ev +__ZN3JSC12JSGlobalDataC2EbRKNS_7VPtrSetE __ZN3JSC21createIdentifierTableEv __ZN3JSC17CommonIdentifiersC1EPNS_12JSGlobalDataE +__ZN3JSC17CommonIdentifiersC2EPNS_12JSGlobalDataE __ZN3JSC10Identifier3addEPNS_12JSGlobalDataEPKc -__ZN3WTF9HashTableIPKcSt4pairIS2_NS_6RefPtrIN3JSC7UString3RepEEEENS_18PairFirstExtractorIS9_EENS_7PtrHashIS2_EENS_14PairHashTraitsINS_10HashTraitsIS2_EENSF_IS8_EEEESG_E4findIS2_NS_22IdentityHashTranslatorIS2_S9_SD_EEEENS_17HashTableIteratorIS2_S9_SB_SD_SI_SG_EERKT_ +__ZN3WTF7HashSetIPN3JSC7UString3RepENS_7StrHashIS4_EENS_10HashTraitsIS4_EEE3addIPKcNS1_17CStringTranslatorEEESt4pairINS_24HashT __ZN3WTF9HashTableIPN3JSC7UString3RepES4_NS_17IdentityExtractorIS4_EENS_7StrHashIS4_EENS_10HashTraitsIS4_EESA_E6rehashEi -__ZN3WTF9HashTableIPKcSt4pairIS2_NS_6RefPtrIN3JSC7UString3RepEEEENS_18PairFirstExtractorIS9_EENS_7PtrHashIS2_EENS_14PairHashTraitsINS_10HashTraitsIS2_EENSF_IS8_EEEESG_E6expandEv -__ZN3WTF9HashTableIPN3JSC7UString3RepES4_NS_17IdentityExtractorIS4_EENS_7StrHashIS4_EENS_10HashTraitsIS4_EESA_E4findIS4_NS_22IdentityHashTranslatorIS4_S4_S8_EEEENS_17HashTableIteratorIS4_S4_S6_S8_SA_SA_EERKT_ +__ZN3WTF9HashTableIPKcSt4pairIS2_NS_6RefPtrIN3JSC7UString3RepEEEENS_18PairFirstExtractorIS9_EENS_7PtrHashIS2_EENS_14PairHashTra +__ZN3WTF6RefPtrIN3JSC7UString3RepEED1Ev __ZN3JSC12SmallStringsC1Ev -__ZN3JSC5LexerC1EPNS_12JSGlobalDataE -__ZN3JSC4HeapC1EPNS_12JSGlobalDataE __ZN3JSC19ExecutableAllocator17intializePageSizeEv __ZN3JSC14ExecutablePool11systemAllocEm -__ZN3JSC27startProfilerServerIfNeededEv -+[ProfilerServer sharedProfileServer] --[ProfilerServer init] -__ZN3JSC11Interpreter10initializeEPNS_12JSGlobalDataE +__ZN3JSC5LexerC1EPNS_12JSGlobalDataE +__ZN3JSC5LexerC2EPNS_12JSGlobalDataE +__ZN3JSC11InterpreterC1Ev +__ZN3JSC11InterpreterC2Ev +__ZN3JSC11Interpreter14privateExecuteENS0_13ExecutionFlagEPNS_12RegisterFileEPNS_9ExecStateEPNS_7JSValueE +__ZN3WTF7HashMapIPvN3JSC8OpcodeIDENS_7PtrHashIS1_EENS_10HashTraitsIS1_EENS6_IS3_EEE3addERKS1_RKS3_ +__ZN3WTF9HashTableIPvSt4pairIS1_N3JSC8OpcodeIDEENS_18PairFirstExtractorIS5_EENS_7PtrHashIS1_EENS_14PairHashTraitsINS_10HashTrai +__ZN3JSC8JITStubsC1EPNS_12JSGlobalDataE __ZN3JSC3JITC1EPNS_12JSGlobalDataEPNS_9CodeBlockE -__ZN3JSC3JIT35privateCompileCTIMachineTrampolinesEv +__ZN3JSC3JITC2EPNS_12JSGlobalDataEPNS_9CodeBlockE +__ZN3JSC3JIT35privateCompileCTIMachineTrampolinesEPN3WTF6RefPtrINS_14ExecutablePoolEEEPNS_12JSGlobalDataEPPvS9_S9_S9_S9_S9_ +__ZN3JSC12X86Assembler23X86InstructionFormatter11oneByteOp64ENS0_15OneByteOpcodeIDEiNS_3X8610RegisterIDE +__ZN3JSC12X86Assembler3jCCENS0_9ConditionE +__ZN3JSC23MacroAssemblerX86Common4moveENS_22AbstractMacroAssemblerINS_12X86AssemblerEE6ImmPtrENS_3X8610RegisterIDE +__ZN3JSC12X86Assembler23X86InstructionFormatter11oneByteOp64ENS0_15OneByteOpcodeIDEiNS_3X8610RegisterIDEi +__ZN3JSC12X86Assembler23X86InstructionFormatter9oneByteOpENS0_15OneByteOpcodeIDEiNS_3X8610RegisterIDE __ZN3JSC15AssemblerBuffer11ensureSpaceEi +__ZN3JSC20MacroAssemblerX86_6413branchTestPtrENS_23MacroAssemblerX86Common9ConditionENS_3X8610RegisterIDENS_22AbstractMacroAsse +__ZN3JSC12X86Assembler23X86InstructionFormatter9oneByteOpENS0_15OneByteOpcodeIDENS_3X8610RegisterIDE +__ZN3JSC20MacroAssemblerX86_644callEv __ZN3JSC12X86Assembler23X86InstructionFormatter9oneByteOpENS0_15OneByteOpcodeIDEiNS_3X8610RegisterIDEi -__ZN3JSC12X86Assembler23X86InstructionFormatter9oneByteOpENS0_15OneByteOpcodeIDEiNS_3X8610RegisterIDE -__ZN3JSC14MacroAssembler4pokeENS_3X8610RegisterIDEi __ZN3JSC3JIT32compileOpCallInitializeCallFrameEv -__ZN3JSC14MacroAssembler5jnz32ENS_3X8610RegisterIDENS0_5Imm32E -__ZN3WTF11fastReallocEPvm -__ZN3WTF11fastReallocILb1EEEPvS1_m +__ZN3JSC12X86Assembler23X86InstructionFormatter11memoryModRMEiNS_3X8610RegisterIDEi +__ZN3JSC20MacroAssemblerX86_6421makeTailRecursiveCallENS_22AbstractMacroAssemblerINS_12X86AssemblerEE4JumpE +__ZN3JSC14TimeoutCheckerC1Ev +__ZN3JSC4HeapC1EPNS_12JSGlobalDataE +__ZN3JSC27startProfilerServerIfNeededEv ++[ProfilerServer sharedProfileServer] +-[ProfilerServer init] +__ZN3JSC9Structure17stopIgnoringLeaksEv __ZN3JSC4Heap8allocateEm __ZN3JSCL13allocateBlockILNS_8HeapTypeE0EEEPNS_14CollectorBlockEv +__ZN3JSC4Heap4heapENS_7JSValueE +__ZN3JSC4Heap7protectENS_7JSValueE +__ZN3WTF7HashMapIPN3JSC6JSCellEjNS_7PtrHashIS3_EENS_10HashTraitsIS3_EENS6_IjEEE3addERKS3_RKj +__ZN3WTF9HashTableIPN3JSC6JSCellESt4pairIS3_jENS_18PairFirstExtractorIS5_EENS_7PtrHashIS3_EENS_14PairHashTraitsINS_10HashTraits __ZN3JSC14JSGlobalObjectnwEmPNS_12JSGlobalDataE __ZN3JSC14JSGlobalObject4initEPNS_8JSObjectE -__ZN3JSC14JSGlobalObject5resetENS_10JSValuePtrE +__ZN3JSC14JSGlobalObject5resetENS_7JSValueE __ZN3JSC4Heap12heapAllocateILNS_8HeapTypeE0EEEPvm -__ZN3JSC17FunctionPrototypeC2EPNS_9ExecStateEN3WTF10PassRefPtrINS_9StructureEEE __ZN3JSC8jsStringEPNS_12JSGlobalDataERKNS_7UStringE __ZN3JSC12SmallStrings17createEmptyStringEPNS_12JSGlobalDataE __ZN3JSC7UStringC1EPKc __ZN3JSCL9createRepEPKc -__ZN3JSC8JSObject9putDirectERKNS_10IdentifierENS_10JSValuePtrEjbRNS_15PutPropertySlotE +__ZN3JSC8JSObject9putDirectERKNS_10IdentifierENS_7JSValueEjbRNS_15PutPropertySlotE __ZN3JSC9Structure40addPropertyTransitionToExistingStructureEPS0_RKNS_10IdentifierEjRm __ZN3JSC9Structure3getERKNS_10IdentifierERj __ZN3JSC9Structure21addPropertyTransitionEPS0_RKNS_10IdentifierEjRm __ZN3JSC9Structure3putERKNS_10IdentifierEj +__ZN3JSC8JSObject26putDirectWithoutTransitionERKNS_10IdentifierENS_7JSValueEj __ZN3JSC9Structure28addPropertyWithoutTransitionERKNS_10IdentifierEj -__ZN3JSC17FunctionPrototype21addFunctionPropertiesEPNS_9ExecStateEPNS_9StructureE -__ZN3JSC17PrototypeFunctionC1EPNS_9ExecStateEN3WTF10PassRefPtrINS_9StructureEEEiRKNS_10IdentifierEPFNS_10JSValuePtrES2_PNS_8JSObjectESA_RKNS_7ArgListEE +__ZN3JSC17FunctionPrototype21addFunctionPropertiesEPNS_9ExecStateEPNS_9StructureEPPNS_10JSFunctionES7_ +__ZN3JSC10JSFunctionC2EPNS_9ExecStateEN3WTF10PassRefPtrINS_9StructureEEEiRKNS_10IdentifierEPFNS_7JSValueES2_PNS_8JSObjectESA_RK +__ZN3JSC12JSGlobalData17createNativeThunkEv +__ZN3JSC16FunctionBodyNode17createNativeThunkEPNS_12JSGlobalDataE +__ZN3WTF6VectorINS_6RefPtrIN3JSC21ParserArenaRefCountedEEELm0EE15reserveCapacityEm +__ZN3JSC11ParserArena5resetEv __ZN3JSC8JSObject34putDirectFunctionWithoutTransitionEPNS_9ExecStateEPNS_16InternalFunctionEj __ZN3JSC15ObjectPrototypeC2EPNS_9ExecStateEN3WTF10PassRefPtrINS_9StructureEEEPS5_ __ZN3JSC9Structure26rehashPropertyMapHashTableEj __ZN3JSC15StringPrototypeC2EPNS_9ExecStateEN3WTF10PassRefPtrINS_9StructureEEE __ZN3JSC16BooleanPrototypeC2EPNS_9ExecStateEN3WTF10PassRefPtrINS_9StructureEEEPS5_ __ZN3JSC15NumberPrototypeC2EPNS_9ExecStateEN3WTF10PassRefPtrINS_9StructureEEEPS5_ -__ZN3JSC12jsNumberCellEPNS_9ExecStateEd -__ZN3JSCL13allocateBlockILNS_8HeapTypeE1EEEPNS_14CollectorBlockEv __ZN3JSC15RegExpPrototypeC2EPNS_9ExecStateEN3WTF10PassRefPtrINS_9StructureEEEPS5_ __ZN3JSC14ErrorPrototypeC2EPNS_9ExecStateEN3WTF10PassRefPtrINS_9StructureEEEPS5_ -__ZN3WTF6RefPtrIN3JSC7UString3RepEED1Ev __ZN3JSC20NativeErrorPrototypeC2EPNS_9ExecStateEN3WTF10PassRefPtrINS_9StructureEEERKNS_7UStringES9_ __ZN3JSC17ObjectConstructorC2EPNS_9ExecStateEN3WTF10PassRefPtrINS_9StructureEEEPNS_15ObjectPrototypeE __ZN3JSC19FunctionConstructorC2EPNS_9ExecStateEN3WTF10PassRefPtrINS_9StructureEEEPNS_17FunctionPrototypeE @@ -132,1507 +167,1799 @@ __ZN3JSC10Identifier11addSlowCaseEPNS_12JSGlobalDataEPNS_7UString3RepE __ZN3WTF7HashSetIPN3JSC7UString3RepENS_7StrHashIS4_EENS_10HashTraitsIS4_EEE3addERKS4_ __ZN3JSC10MathObjectC2EPNS_9ExecStateEN3WTF10PassRefPtrINS_9StructureEEE __ZN3JSC12SmallStrings24singleCharacterStringRepEh -__ZN3WTF7HashMapINS_6RefPtrIN3JSC7UString3RepEEENS2_16SymbolTableEntryENS2_17IdentifierRepHashENS_10HashTraitsIS5_EENS2_26SymbolTableIndexHashTraitsEE3addEPS4_RKS6_ -__ZN3WTF9HashTableINS_6RefPtrIN3JSC7UString3RepEEESt4pairIS5_NS2_16SymbolTableEntryEENS_18PairFirstExtractorIS8_EENS2_17IdentifierRepHashENS_14PairHashTraitsINS_10HashTraitsIS5_EENS2_26SymbolTableIndexHashTraitsEEESE_E6rehashEi -__ZN3JSC9Structure25changePrototypeTransitionEPS0_NS_10JSValuePtrE +__ZN3WTF7HashMapINS_6RefPtrIN3JSC7UString3RepEEENS2_16SymbolTableEntryENS2_17IdentifierRepHashENS_10HashTraitsIS5_EENS2_26Symbo +__ZN3WTF9HashTableINS_6RefPtrIN3JSC7UString3RepEEESt4pairIS5_NS2_16SymbolTableEntryEENS_18PairFirstExtractorIS8_EENS2_17Identif +__ZN3JSC17PrototypeFunctionC2EPNS_9ExecStateEN3WTF10PassRefPtrINS_9StructureEEEiRKNS_10IdentifierEPFNS_7JSValueES2_PNS_8JSObjec +__ZN3JSC9Structure25changePrototypeTransitionEPS0_NS_7JSValueE __ZN3JSC9Structure17copyPropertyTableEv -__ZN3JSC14JSGlobalObject14setTimeoutTimeEj __ZN3JSC14JSGlobalObject10globalExecEv __ZN3JSC10Identifier3addEPNS_9ExecStateEPKc -__ZN3JSC4Heap4heapENS_10JSValuePtrE -__ZN3JSC4Heap7protectENS_10JSValuePtrE -__ZN3WTF7HashMapIPN3JSC6JSCellEjNS_7PtrHashIS3_EENS_10HashTraitsIS3_EENS6_IjEEE3addERKS3_RKj -__ZN3WTF9HashTableIPN3JSC6JSCellESt4pairIS3_jENS_18PairFirstExtractorIS5_EENS_7PtrHashIS3_EENS_14PairHashTraitsINS_10HashTraitsIS3_EENSB_IjEEEESC_E6rehashEi +__ZN3JSC4Heap9unprotectENS_7JSValueE __ZN3JSC6JSCellnwEmPNS_9ExecStateE -__ZN3JSC14JSGlobalObject17startTimeoutCheckEv -__ZN3JSC11Interpreter17resetTimeoutCheckEv -__ZN3JSC8evaluateEPNS_9ExecStateERNS_10ScopeChainERKNS_10SourceCodeENS_10JSValuePtrE +__ZN3JSC14TimeoutChecker5resetEv +__ZN3JSC8evaluateEPNS_9ExecStateERNS_10ScopeChainERKNS_10SourceCodeENS_7JSValueE __ZN3JSC6JSLock4lockEb __ZN3JSC6Parser5parseINS_11ProgramNodeEEEN3WTF10PassRefPtrIT_EEPNS_9ExecStateEPNS_8DebuggerERKNS_10SourceCodeEPiPNS_7UStringE __ZN3JSC6Parser5parseEPNS_12JSGlobalDataEPiPNS_7UStringE __ZN3JSC7UStringaSEPKc __Z10jscyyparsePv __ZN3JSC5Lexer3lexEPvS1_ -__ZN3WTF6VectorItLm0EE15reserveCapacityEm -__ZN3WTF6VectorItLm0EE6appendItEEvRKT_ __ZN3JSC10Identifier3addEPNS_12JSGlobalDataEPKti -__ZN3WTF7HashSetIPN3JSC7UString3RepENS_7StrHashIS4_EENS_10HashTraitsIS4_EEE3addIPKcNS1_17CStringTranslatorEEESt4pairINS_24HashTableIteratorAdapterINS_9HashTableIS4_S4_NS_17IdentityExtractorIS4_EES6_S8_S8_EES4_EEbERKT_ +__ZN3WTF7HashSetIPN3JSC7UString3RepENS_7StrHashIS4_EENS_10HashTraitsIS4_EEE3addINS1_11UCharBufferENS1_21UCharBufferTranslatorEE +__ZN3WTF15SegmentedVectorINS_10IdentifierELm64EE6appendIS1_EEvRKT_ __ZNK3JSC9HashTable11createTableEPNS_12JSGlobalDataE -__ZN3WTF7HashSetIPN3JSC16ParserRefCountedENS_7PtrHashIS3_EENS_10HashTraitsIS3_EEE3addERKS3_ -__ZN3WTF9HashTableIPN3JSC16ParserRefCountedES3_NS_17IdentityExtractorIS3_EENS_7PtrHashIS3_EENS_10HashTraitsIS3_EES9_E6rehashEi -__ZN3JSC16ParserRefCountedC2EPNS_12JSGlobalDataE -__ZN3JSC16ParserRefCounted3refEv -__ZL20makeFunctionCallNodePvN3JSC8NodeInfoIPNS0_14ExpressionNodeEEENS1_IPNS0_13ArgumentsNodeEEEiii -__ZNK3JSC15DotAccessorNode10isLocationEv -__ZNK3JSC14ExpressionNode13isResolveNodeEv -__ZNK3JSC14ExpressionNode21isBracketAccessorNodeEv -__ZN3WTF7HashMapIPN3JSC16ParserRefCountedEjNS_7PtrHashIS3_EENS_10HashTraitsIS3_EENS6_IjEEE3addERKS3_RKj -__ZN3WTF9HashTableIPN3JSC16ParserRefCountedESt4pairIS3_jENS_18PairFirstExtractorIS5_EENS_7PtrHashIS3_EENS_14PairHashTraitsINS_10HashTraitsIS3_EENSB_IjEEEESC_E6rehashEi -__ZN3JSC14SourceElements6appendEN3WTF10PassRefPtrINS_13StatementNodeEEE +__ZN3JSC20ParserArenaDeletablenwEmPNS_12JSGlobalDataE +__ZN3WTF6VectorIPN3JSC20ParserArenaDeletableELm0EE15reserveCapacityEm +__ZN3JSC5Lexer10sourceCodeEiii +__ZN3JSC16FunctionBodyNode13finishParsingERKNS_10SourceCodeEPNS_13ParameterNodeE +__ZN3WTF6VectorIN3JSC10IdentifierELm0EE14expandCapacityEm +__ZN3WTF6VectorIPN3JSC12FuncDeclNodeELm0EE14expandCapacityEm +__ZN3JSC14SourceElements6appendEPNS_13StatementNodeE __ZNK3JSC13StatementNode16isEmptyStatementEv -__ZN3JSC6Parser16didFinishParsingEPNS_14SourceElementsEPNS_20ParserRefCountedDataIN3WTF6VectorISt4pairINS_10IdentifierEjELm0EEEEEPNS3_INS5_INS4_6RefPtrINS_12FuncDeclNodeEEELm0EEEEEjii +__ZN3WTF6VectorIPN3JSC13StatementNodeELm0EE14expandCapacityEm +__ZL20makeFunctionCallNodePvN3JSC8NodeInfoIPNS0_14ExpressionNodeEEENS1_IPNS0_13ArgumentsNodeEEEiii +__ZNK3JSC11ResolveNode10isLocationEv +__ZNK3JSC11ResolveNode13isResolveNodeEv +__ZN3JSC5Lexer7record8Ei +__ZN3JSC5Lexer10scanRegExpEv +__ZN3JSC7UStringC2ERKN3WTF6VectorItLm0EEE +__ZN3JSC7UString3Rep7destroyEv __ZN3JSC5Lexer5clearEv +__ZN3JSC10Identifier6removeEPNS_7UString3RepE __ZN3WTF6VectorIN3JSC10IdentifierELm64EE14shrinkCapacityEm -__ZN3WTF15deleteAllValuesIPN3JSC16ParserRefCountedEKNS_9HashTableIS3_S3_NS_17IdentityExtractorIS3_EENS_7PtrHashIS3_EENS_10HashTraitsIS3_EESA_EEEEvRT0_ -__ZN3JSC15DotAccessorNodeD1Ev -__ZN3JSC12NodeReleaser15releaseAllNodesEPNS_16ParserRefCountedE -__ZN3JSC15DotAccessorNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC12NodeReleaser5adoptEN3WTF10PassRefPtrINS_16ParserRefCountedEEE -__ZN3JSC16ParserRefCounted9hasOneRefEv -__ZN3JSC16ParserRefCounted5derefEv -__ZN3JSC9ScopeNodeC2EPNS_12JSGlobalDataERKNS_10SourceCodeEPNS_14SourceElementsEPN3WTF6VectorISt4pairINS_10IdentifierEjELm0EEEPNS9_INS8_6RefPtrINS_12FuncDeclNodeEEELm0EEEji -__ZN3WTF6VectorINS_6RefPtrIN3JSC13StatementNodeEEELm0EE14shrinkCapacityEm -__ZN3JSC14SourceElementsD1Ev +__ZN3JSC9ScopeNodeC2EPNS_12JSGlobalDataERKNS_10SourceCodeEPNS_14SourceElementsEPN3WTF6VectorISt4pairINS_10IdentifierEjELm0EEEPN +__ZN3WTF6VectorIPN3JSC13StatementNodeELm0EE14shrinkCapacityEm +__ZN3JSC11ParserArena10removeLastEv __ZNK3JSC8JSObject8toObjectEPNS_9ExecStateE -__ZN3JSC11Interpreter7executeEPNS_11ProgramNodeEPNS_9ExecStateEPNS_14ScopeChainNodeEPNS_8JSObjectEPNS_10JSValuePtrE +__ZN3JSC11Interpreter7executeEPNS_11ProgramNodeEPNS_9ExecStateEPNS_14ScopeChainNodeEPNS_8JSObjectEPNS_7JSValueE __ZN3JSC11ProgramNode16generateBytecodeEPNS_14ScopeChainNodeE -__ZN3JSC9CodeBlockC1EPNS_9ScopeNodeENS_8CodeTypeEN3WTF10PassRefPtrINS_14SourceProviderEEEj +__ZN3JSC9CodeBlockC2EPNS_9ScopeNodeENS_8CodeTypeEN3WTF10PassRefPtrINS_14SourceProviderEEEj __ZN3WTF7HashSetIPN3JSC16ProgramCodeBlockENS_7PtrHashIS3_EENS_10HashTraitsIS3_EEE3addERKS3_ __ZN3WTF9HashTableIPN3JSC16ProgramCodeBlockES3_NS_17IdentityExtractorIS3_EENS_7PtrHashIS3_EENS_10HashTraitsIS3_EES9_E6rehashEi -__ZN3JSC17BytecodeGeneratorC2EPNS_11ProgramNodeEPKNS_8DebuggerERKNS_10ScopeChainEPN3WTF7HashMapINS9_6RefPtrINS_7UString3RepEEENS_16SymbolTableEntryENS_17IdentifierRepHashENS9_10HashTraitsISE_EENS_26SymbolTableIndexHashTraitsEEEPNS_16ProgramCodeBlockE +__ZN3JSC17BytecodeGeneratorC2EPNS_11ProgramNodeEPKNS_8DebuggerERKNS_10ScopeChainEPN3WTF7HashMapINS9_6RefPtrINS_7UString3RepEEEN __ZN3WTF6VectorIN3JSC11InstructionELm0EE14expandCapacityEm __ZN3JSC9Structure22toDictionaryTransitionEPS0_ +__ZN3JSC8JSObject12removeDirectERKNS_10IdentifierE +__ZN3JSC9Structure31removePropertyWithoutTransitionERKNS_10IdentifierE +__ZN3JSC9Structure6removeERKNS_10IdentifierE +__ZN3JSC17BytecodeGenerator12addGlobalVarERKNS_10IdentifierEbRPNS_10RegisterIDE +__ZN3JSC17BytecodeGenerator15emitNewFunctionEPNS_10RegisterIDEPNS_12FuncDeclNodeE +__ZN3JSC9CodeBlock25createRareDataIfNecessaryEv __ZN3JSC17BytecodeGenerator11newRegisterEv __ZN3JSC9Structure24fromDictionaryTransitionEPS0_ __ZN3JSC17BytecodeGenerator8generateEv __ZN3JSC11ProgramNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE __ZN3JSC17BytecodeGenerator13emitDebugHookENS_11DebugHookIDEii -__ZN3JSC17BytecodeGenerator11addConstantENS_10JSValuePtrE -__ZN3WTF9HashTableIPN3JSC23JSValueEncodedAsPointerESt4pairIS3_jENS_18PairFirstExtractorIS5_EENS_7PtrHashIS3_EENS_14PairHashTraitsINS1_17BytecodeGenerator17JSValueHashTraitsENS_10HashTraitsIjEEEESC_E6expandEv +__ZN3JSC17BytecodeGenerator11addConstantENS_7JSValueE +__ZN3WTF9HashTableIPvSt4pairIS1_jENS_18PairFirstExtractorIS3_EENS_7PtrHashIS1_EENS_14PairHashTraitsIN3JSC17JSValueHashTraitsENS __ZN3WTF6VectorIN3JSC8RegisterELm0EE14expandCapacityEm -__ZNK3JSC13StatementNode6isLoopEv +__ZN3JSC17BytecodeGenerator8emitMoveEPNS_10RegisterIDES2_ __ZN3JSC17BytecodeGenerator8emitNodeEPNS_10RegisterIDEPNS_4NodeE __ZN3WTF6VectorIN3JSC8LineInfoELm0EE14expandCapacityEm +__ZN3JSC12FuncDeclNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE __ZN3JSC17ExprStatementNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC19FunctionCallDotNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC11ResolveNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC23FunctionCallResolveNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE __ZN3JSC17BytecodeGenerator11registerForERKNS_10IdentifierE -__ZN3WTF6VectorIN3JSC19ExpressionRangeInfoELm0EE14expandCapacityEm -__ZN3JSC17BytecodeGenerator11emitGetByIdEPNS_10RegisterIDES2_RKNS_10IdentifierE -__ZN3WTF6VectorIN3JSC17StructureStubInfoELm0EE14expandCapacityEm -__ZN3JSC17BytecodeGenerator11addConstantERKNS_10IdentifierE -__ZN3WTF9HashTableINS_6RefPtrIN3JSC7UString3RepEEESt4pairIS5_iENS_18PairFirstExtractorIS7_EENS2_17IdentifierRepHashENS_14PairHashTraitsINS_10HashTraitsIS5_EENS2_17BytecodeGenerator28IdentifierMapIndexHashTraitsEEESD_E6expandEv -__ZN3WTF6VectorIN3JSC10IdentifierELm0EE14expandCapacityEm __ZN3JSC17BytecodeGenerator8emitCallENS_8OpcodeIDEPNS_10RegisterIDES3_S3_PNS_13ArgumentsNodeEjjj +__ZN3JSC16ArgumentListNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC12FuncExprNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC17BytecodeGenerator25emitNewFunctionExpressionEPNS_10RegisterIDEPNS_12FuncExprNodeE +__ZN3WTF6VectorIN3JSC19ExpressionRangeInfoELm0EE14expandCapacityEm __ZN3WTF6VectorIN3JSC12CallLinkInfoELm0EE14expandCapacityEm +__ZN3JSC11ResolveNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC12JSGlobalData22numericCompareFunctionEPNS_9ExecStateE +__ZNK3JSC21UStringSourceProvider6lengthEv +__ZNK3JSC21UStringSourceProvider4dataEv +__ZN3JSC19extractFunctionBodyEPNS_11ProgramNodeE +__ZNK3JSC17ExprStatementNode15isExprStatementEv +__ZNK3JSC12FuncExprNode14isFuncExprNodeEv +__ZN3JSC16FunctionBodyNode16generateBytecodeEPNS_14ScopeChainNodeE +__ZN3JSC6Parser14reparseInPlaceEPNS_12JSGlobalDataEPNS_16FunctionBodyNodeE +__ZL11makeSubNodePvPN3JSC14ExpressionNodeES2_b +__ZN3JSC14ExpressionNode14stripUnaryPlusEv +__ZNK3JSC14ExpressionNode8isNumberEv +__ZN3JSC9CodeBlockC1EPNS_9ScopeNodeENS_8CodeTypeEN3WTF10PassRefPtrINS_14SourceProviderEEEj +__ZN3JSC17BytecodeGeneratorC2EPNS_16FunctionBodyNodeEPKNS_8DebuggerERKNS_10ScopeChainEPN3WTF7HashMapINS9_6RefPtrINS_7UString3Re +__ZN3JSC17BytecodeGenerator12addParameterERKNS_10IdentifierE +__ZN3JSC16FunctionBodyNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC9BlockNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC10ReturnNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC12BinaryOpNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZNK3JSC11ResolveNode6isPureERNS_17BytecodeGeneratorE +__ZN3JSC17BytecodeGenerator12newTemporaryEv +__ZN3JSC17BytecodeGenerator12emitBinaryOpENS_8OpcodeIDEPNS_10RegisterIDES3_S3_NS_12OperandTypesE +__ZN3JSC17BytecodeGenerator10emitReturnEPNS_10RegisterIDE +__ZNK3JSC9BlockNode7isBlockEv +__ZNK3JSC10ReturnNode12isReturnNodeEv __ZN3JSC9CodeBlock11shrinkToFitEv __ZN3WTF6VectorIN3JSC11InstructionELm0EE14shrinkCapacityEm __ZN3WTF6VectorIN3JSC17StructureStubInfoELm0EE14shrinkCapacityEm -__ZN3WTF6VectorIN3JSC17GlobalResolveInfoELm0EE14shrinkCapacityEm __ZN3WTF6VectorIPN3JSC12CallLinkInfoELm0EE14shrinkCapacityEm __ZN3WTF6VectorIN3JSC10IdentifierELm0EE14shrinkCapacityEm -__ZN3JSC17ExprStatementNodeD1Ev -__ZN3JSC19FunctionCallDotNodeD1Ev -__ZN3JSC19FunctionCallDotNode12releaseNodesERNS_12NodeReleaserE -__ZN3WTF6VectorINS_6RefPtrIN3JSC16ParserRefCountedEEELm0EE14expandCapacityEm -__ZN3JSC16ParserRefCounted12releaseNodesERNS_12NodeReleaserE -__ZN3JSC13ArgumentsNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC11ResolveNodeD1Ev -__ZN3JSC13ArgumentsNodeD1Ev +__ZN3JSC11ParserArenaD1Ev +__ZN3JSC11ResolveNodeD0Ev +__ZN3JSC7SubNodeD0Ev +__ZN3JSC10ReturnNodeD0Ev +__ZN3JSC14SourceElementsD0Ev +__ZN3JSC9BlockNodeD0Ev +__ZN3JSC17BytecodeGeneratorD2Ev +__ZN3WTF6VectorIN3JSC11InstructionELm0EEaSERKS3_ +__ZThn16_N3JSC11ProgramNodeD0Ev +__ZN3JSC11ProgramNodeD0Ev +__ZN3JSC13ParameterNodeD0Ev +__ZN3JSC17ExprStatementNodeD0Ev +__ZThn16_N3JSC12FuncExprNodeD0Ev +__ZN3JSC12FuncExprNodeD0Ev +__ZThn16_N3JSC16FunctionBodyNodeD0Ev +__ZN3JSC16FunctionBodyNodeD0Ev +__ZN3JSC9CodeBlockD1Ev +__ZN3JSC9CodeBlockD2Ev +__ZN3JSC21UStringSourceProviderD0Ev +__ZN3WTF6VectorIN3JSC19ExpressionRangeInfoELm0EE14shrinkCapacityEm +__ZN3WTF6VectorIN3JSC8LineInfoELm0EE14shrinkCapacityEm +__ZN3WTF6VectorINS_6RefPtrIN3JSC12FuncDeclNodeEEELm0EE14shrinkCapacityEm +__ZN3WTF6VectorIN3JSC15SimpleJumpTableELm0EE14shrinkCapacityEm +__ZN3WTF6VectorIN3JSC15StringJumpTableELm0EE14shrinkCapacityEm +__ZN3JSC15ParserArenaDataIN3WTF6VectorIPNS_12FuncDeclNodeELm0EEEED0Ev +__ZN3JSC16ArgumentListNodeD0Ev +__ZN3JSC13ArgumentsNodeD0Ev +__ZN3JSC23FunctionCallResolveNodeD0Ev __ZN3JSC14JSGlobalObject13copyGlobalsToERNS_12RegisterFileE __ZN3JSC3JIT14privateCompileEv __ZN3JSC3JIT22privateCompileMainPassEv -__ZN3JSC3JIT21compileGetByIdHotPathEiiPNS_10IdentifierEj -__ZN3WTF6VectorIN3JSC13SlowCaseEntryELm0EE14expandCapacityEm -__ZN3JSC3JIT13compileOpCallENS_8OpcodeIDEPNS_11InstructionEj +__ZN3JSC3JIT13emit_op_enterEPNS_11InstructionE +__ZN3JSC3JIT16emit_op_new_funcEPNS_11InstructionE +__ZN3JSC20MacroAssemblerX86_648storePtrENS_22AbstractMacroAssemblerINS_12X86AssemblerEE6ImmPtrENS3_15ImplicitAddressE +__ZN3JSC11JITStubCall4callEj __ZN3WTF6VectorIN3JSC10CallRecordELm0EE14expandCapacityEm -__ZN3JSC3JIT22privateCompileLinkPassEv +__ZN3JSC3JIT11emit_op_movEPNS_11InstructionE +__ZN3JSC3JIT20emit_op_new_func_expEPNS_11InstructionE +__ZN3JSC3JIT12emit_op_callEPNS_11InstructionE +__ZN3JSC3JIT13compileOpCallENS_8OpcodeIDEPNS_11InstructionEj +__ZN3WTF6VectorIN3JSC13SlowCaseEntryELm0EE14expandCapacityEm +__ZN3JSC3JIT11emit_op_endEPNS_11InstructionE +__ZN3JSC11JITStubCall4callEv +__ZN3WTF6VectorIN3JSC9JumpTableELm0EE14shrinkCapacityEm __ZN3JSC3JIT23privateCompileSlowCasesEv -__ZN3JSC3JIT22compileGetByIdSlowCaseEiiPNS_10IdentifierERPNS_13SlowCaseEntryEj +__ZN3JSC3JIT16emitSlow_op_callEPNS_11InstructionERPNS_13SlowCaseEntryE __ZN3JSC3JIT21compileOpCallSlowCaseEPNS_11InstructionERPNS_13SlowCaseEntryEjNS_8OpcodeIDE __ZN3JSC3JIT22compileOpCallSetupArgsEPNS_11InstructionE -__ZN3JSC12X86Assembler3jneEv -__ZN3WTF6VectorIN3JSC10CallRecordELm0EE6appendIS2_EEvRKT_ __ZN3JSC9CodeBlock10setJITCodeERNS_10JITCodeRefE __ZN3JSC17BytecodeGenerator18dumpsGeneratedCodeEv __ZN3WTF10RefCountedIN3JSC14ExecutablePoolEE5derefEv -ctiTrampoline -__ZN3JSC11Interpreter16cti_op_get_by_idEPvz -__ZNK3JSC10JSValuePtr3getEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE -__ZN3JSC10MathObject18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE -__ZN3JSC23setUpStaticFunctionSlotEPNS_9ExecStateEPKNS_9HashEntryEPNS_8JSObjectERKNS_10IdentifierERNS_12PropertySlotE -__ZN3JSC17PrototypeFunctionC1EPNS_9ExecStateEiRKNS_10IdentifierEPFNS_10JSValuePtrES2_PNS_8JSObjectES6_RKNS_7ArgListEE -__ZN3JSC27ctiPatchCallByReturnAddressEPvS0_ -__ZN3JSC11Interpreter25cti_op_call_NotJSFunctionEPvz -__ZN3JSC17PrototypeFunction11getCallDataERNS_8CallDataE -__ZN3JSCL19mathProtoFuncRandomEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3WTF12randomNumberEv -__ZN3JSC11ProgramNodeD1Ev -__ZN3WTF9HashTableIPN3JSC16ProgramCodeBlockES3_NS_17IdentityExtractorIS3_EENS_7PtrHashIS3_EENS_10HashTraitsIS3_EES9_E4findIS3_NS_22IdentityHashTranslatorIS3_S3_S7_EEEENS_17HashTableIteratorIS3_S3_S5_S7_S9_S9_EERKT_ -__ZN3JSC9CodeBlockD2Ev -__ZN3JSC17StructureStubInfo5derefEv -__ZN3JSC9ScopeNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC14JSGlobalObject16stopTimeoutCheckEv -__ZN3JSC4Heap9unprotectENS_10JSValuePtrE -__ZNK3JSC12JSNumberCell8toStringEPNS_9ExecStateE -__ZN3JSC7UString4fromEd -__ZN3WTF4dtoaEdiPiS0_PPc -__ZN3WTFL3d2bEdPiS0_ -__ZN3WTFL8pow5multEPNS_6BigintEi -__ZN3WTFL4multEPNS_6BigintES1_ -__ZN3WTFL6lshiftEPNS_6BigintEi -__ZN3WTFL6quoremEPNS_6BigintES1_ -__ZN3WTFL4diffEPNS_6BigintES1_ -__ZN3JSC7UString3Rep7destroyEv --[WTFMainThreadCaller call] -__ZN3WTF31dispatchFunctionsFromMainThreadEv -__ZN3JSC4Heap7collectEv -__ZN3JSC4Heap30markStackObjectsConservativelyEv -__ZN3JSC4Heap31markCurrentThreadConservativelyEv -__ZN3JSC4Heap39markCurrentThreadConservativelyInternalEv -__ZN3JSC4Heap18markConservativelyEPvS1_ -__ZN3JSC4Heap20markProtectedObjectsEv -__ZN3JSC12SmallStrings4markEv -__ZN3JSC6JSCell4markEv -__ZN3JSC4Heap5sweepILNS_8HeapTypeE0EEEmv -__ZN3JSC14JSGlobalObjectD2Ev -__ZN3JSC17FunctionPrototypeD0Ev -__ZN3JSC17PrototypeFunctionD0Ev -__ZN3JSC16BooleanPrototypeD0Ev -__ZN3JSC15NumberPrototypeD0Ev -__ZN3JSC14ErrorPrototypeD0Ev -__ZN3JSC17ObjectConstructorD0Ev -__ZN3JSC16ArrayConstructorD0Ev -__ZN3JSC17StringConstructorD0Ev -__ZN3JSC18BooleanConstructorD0Ev -__ZN3JSC17NumberConstructorD0Ev -__ZN3JSC17RegExpConstructorD0Ev -__ZN3JSC16ErrorConstructorD0Ev -__ZN3JSC22NativeErrorConstructorD0Ev -__ZN3JSC18GlobalEvalFunctionD0Ev -__ZN3JSC4Heap5sweepILNS_8HeapTypeE1EEEmv -__ZN3WTF25TCMalloc_Central_FreeList11ShrinkCacheEib -__ZN3WTF14FastMallocZone9forceLockEP14_malloc_zone_t -__ZN3WTF14FastMallocZone11forceUnlockEP14_malloc_zone_t -__ZN3JSC7UStringC1EPKti -__ZN3JSC5Lexer7record8Ei -__ZN3JSC16FunctionBodyNode13finishParsingERKNS_10SourceCodeEPNS_13ParameterNodeE -__ZN3WTF6VectorINS_6RefPtrIN3JSC12FuncDeclNodeEEELm0EE15reserveCapacityEm -__ZN3JSC10Identifier6removeEPNS_7UString3RepE -__ZN3WTF6VectorINS_6RefPtrIN3JSC12FuncDeclNodeEEELm0EEaSERKS5_ -__ZN3JSC8JSObject12removeDirectERKNS_10IdentifierE -__ZN3JSC9Structure31removePropertyWithoutTransitionERKNS_10IdentifierE -__ZN3JSC9Structure6removeERKNS_10IdentifierE -__ZN3JSC17BytecodeGenerator12addGlobalVarERKNS_10IdentifierEbRPNS_10RegisterIDE -__ZN3JSC17BytecodeGenerator15emitNewFunctionEPNS_10RegisterIDEPNS_12FuncDeclNodeE -__ZN3JSC9CodeBlock25createRareDataIfNecessaryEv -__ZN3JSC12FuncDeclNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3WTF6VectorIN3JSC15SimpleJumpTableELm0EE14shrinkCapacityEm -__ZN3WTF6VectorIN3JSC15StringJumpTableELm0EE14shrinkCapacityEm -__ZN3JSC3JIT11emitCTICallEPFvPvzE -__ZN3JSC11Interpreter15cti_op_new_funcEPvz +_ctiTrampoline +__ZN3JSC8JITStubs15cti_op_new_funcEPPv __ZN3JSC12FuncDeclNode12makeFunctionEPNS_9ExecStateEPNS_14ScopeChainNodeE -__ZN3JSC11Interpreter10cti_op_endEPvz -__ZN3JSC12FuncDeclNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC12NodeReleaser21adoptFunctionBodyNodeERN3WTF6RefPtrINS_16FunctionBodyNodeEEE -__ZN3JSC8JSObject4markEv -__ZN3JSC14JSGlobalObject4markEv -__ZN3JSC7JSArray4markEv -__ZN3JSC15JSWrapperObject4markEv -__ZN3JSC18GlobalEvalFunction4markEv -__ZNK3JSC10NumberNode8isNumberEv -__ZN3JSC5Lexer10scanRegExpEv -__ZN3JSC7UStringC2ERKN3WTF6VectorItLm0EEE -__ZL26appendToVarDeclarationListPvRPN3JSC20ParserRefCountedDataIN3WTF6VectorISt4pairINS0_10IdentifierEjELm0EEEEERKS5_j -__ZN3WTF6VectorISt4pairIN3JSC10IdentifierEjELm0EE14expandCapacityEmPKS4_ -__ZN3WTF6VectorISt4pairIN3JSC10IdentifierEjELm0EE15reserveCapacityEm -__ZL20makeVarStatementNodePvPN3JSC14ExpressionNodeE -__ZL14makeAssignNodePvPN3JSC14ExpressionNodeENS0_8OperatorES2_bbiii -__Z21mergeDeclarationListsIPN3JSC20ParserRefCountedDataIN3WTF6VectorINS2_6RefPtrINS0_12FuncDeclNodeEEELm0EEEEEET_SA_SA_ -__ZN3JSC20ParserRefCountedDataIN3WTF6VectorISt4pairINS_10IdentifierEjELm0EEEED1Ev -__ZN3WTF6VectorIPNS0_IN3JSC10IdentifierELm64EEELm32EE14expandCapacityEm -__ZNK3JSC18EmptyStatementNode16isEmptyStatementEv -__ZNK3JSC14ExpressionNode10isLocationEv -__ZL11makeAddNodePvPN3JSC14ExpressionNodeES2_b -__ZNK3JSC14ExpressionNode8isNumberEv -__ZN3JSC16PropertyListNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC17BytecodeGenerator11emitPutByIdEPNS_10RegisterIDERKNS_10IdentifierES2_ -__ZN3JSC11UnaryOpNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC13LogicalOpNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC8JITStubs19cti_op_new_func_expEPPv +__ZN3JSC12FuncExprNode12makeFunctionEPNS_9ExecStateEPNS_14ScopeChainNodeE +__ZN3JSC8JITStubs22cti_op_call_JSFunctionEPPv +__ZN3JSC16FunctionBodyNode15generateJITCodeEPNS_14ScopeChainNodeE +__ZN3JSC10IfElseNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE __ZN3JSC17BytecodeGenerator8newLabelEv +__ZN3JSC15DotAccessorNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC17BytecodeGenerator11emitResolveEPNS_10RegisterIDERKNS_10IdentifierE +__ZN3JSC17BytecodeGenerator18findScopedPropertyERKNS_10IdentifierERiRmbRPNS_8JSObjectE +__ZNK3JSC16JSVariableObject16isVariableObjectEv +__ZN3JSC17BytecodeGenerator16emitGetScopedVarEPNS_10RegisterIDEmiNS_7JSValueE +__ZN3JSC17BytecodeGenerator11emitGetByIdEPNS_10RegisterIDES2_RKNS_10IdentifierE +__ZN3WTF6VectorIN3JSC17StructureStubInfoELm0EE14expandCapacityEm +__ZN3JSC17BytecodeGenerator11addConstantERKNS_10IdentifierE +__ZN3WTF7HashMapINS_6RefPtrIN3JSC7UString3RepEEEiNS2_17IdentifierRepHashENS_10HashTraitsIS5_EENS2_17BytecodeGenerator28Identifi +__ZN3WTF9HashTableINS_6RefPtrIN3JSC7UString3RepEEESt4pairIS5_iENS_18PairFirstExtractorIS7_EENS2_17IdentifierRepHashENS_14PairHa __ZN3JSC17BytecodeGenerator15emitJumpIfFalseEPNS_10RegisterIDEPNS_5LabelE -__ZNK3JSC14LogicalNotNode8opcodeIDEv +__ZNK3JSC14JSGlobalObject14isDynamicScopeEv +__ZN3JSC17BytecodeGenerator19emitResolveFunctionEPNS_10RegisterIDES2_RKNS_10IdentifierE +__ZN3JSC10StringNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC17BytecodeGenerator8emitLoadEPNS_10RegisterIDERKNS_10IdentifierE +__ZN3WTF9HashTableIPN3JSC7UString3RepESt4pairIS4_PNS1_8JSStringEENS_18PairFirstExtractorIS8_EENS1_17IdentifierRepHashENS_14Pair +__ZN3JSC11BooleanNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC17BytecodeGenerator8emitJumpEPNS_5LabelE __ZN3JSC17BytecodeGenerator9emitLabelEPNS_5LabelE __ZN3WTF6VectorIjLm0EE15reserveCapacityEm -__ZN3JSC19ReverseBinaryOpNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZNK3JSC10NumberNode6isPureERNS_17BytecodeGeneratorE -__ZN3JSC17BytecodeGenerator11emitResolveEPNS_10RegisterIDERKNS_10IdentifierE -__ZN3WTF6VectorIN3JSC17GlobalResolveInfoELm0EE14expandCapacityEm -__ZNK3JSC11GreaterNode8opcodeIDEv -__ZN3JSC17BytecodeGenerator12emitBinaryOpENS_8OpcodeIDEPNS_10RegisterIDES3_S3_NS_12OperandTypesE -__ZN3JSC9EqualNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZNK3JSC14ExpressionNode6isNullEv -__ZN3JSC17BytecodeGenerator14emitEqualityOpENS_8OpcodeIDEPNS_10RegisterIDES3_S3_ +__ZN3JSC6IfNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZNK3JSC13StatementNode12isReturnNodeEv +__ZN3JSC15DotAccessorNodeD0Ev +__ZN3JSC10StringNodeD0Ev +__ZN3JSC11BooleanNodeD0Ev +__ZN3JSC6IfNodeD0Ev +__ZN3JSC10IfElseNodeD0Ev +__ZN3JSC3JIT22emit_op_get_global_varEPNS_11InstructionE +__ZN3JSC3JIT29emitGetVariableObjectRegisterENS_3X8610RegisterIDEiS2_ +__ZN3JSC3JIT17emit_op_get_by_idEPNS_11InstructionE +__ZN3JSC3JIT21compileGetByIdHotPathEiiPNS_10IdentifierEj +__ZN3WTF6VectorIN3JSC13SlowCaseEntryELm0EE14expandCapacityEmPKS2_ +__ZN3JSC3JIT14emit_op_jfalseEPNS_11InstructionE +__ZN3JSC20MacroAssemblerX86_649branchPtrENS_23MacroAssemblerX86Common9ConditionENS_3X8610RegisterIDENS_22AbstractMacroAssembler +__ZN3JSC20MacroAssemblerX86_649branchPtrENS_23MacroAssemblerX86Common9ConditionENS_3X8610RegisterIDES4_ +__ZN3WTF6VectorIN3JSC9JumpTableELm0EE14expandCapacityEmPKS2_ +__ZN3WTF6VectorIN3JSC9JumpTableELm0EE14expandCapacityEm +__ZN3JSC3JIT20emit_op_resolve_funcEPNS_11InstructionE +__ZN3JSC3JIT11emit_op_jmpEPNS_11InstructionE +__ZN3JSC3JIT11emit_op_retEPNS_11InstructionE +__ZN3JSC3JIT21emitSlow_op_get_by_idEPNS_11InstructionERPNS_13SlowCaseEntryE +__ZN3JSC3JIT22compileGetByIdSlowCaseEiiPNS_10IdentifierERPNS_13SlowCaseEntryEj +__ZN3JSC3JIT18emitSlow_op_jfalseEPNS_11InstructionERPNS_13SlowCaseEntryE +__ZN3JSC23MacroAssemblerX86Common12branchTest32ENS0_9ConditionENS_3X8610RegisterIDENS_22AbstractMacroAssemblerINS_12X86Assemble +__ZN3JSC8JITStubs23cti_vm_dontLazyLinkCallEPPv +__ZN3JSC31ctiPatchNearCallByReturnAddressENS_22AbstractMacroAssemblerINS_12X86AssemblerEE22ProcessorReturnAddressEPv +__ZN3JSC8JITStubs23cti_register_file_checkEPPv +__ZN3JSC8JITStubs16cti_op_get_by_idEPPv +__ZNK3JSC7JSValue3getEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE +__ZN3JSC23setUpStaticFunctionSlotEPNS_9ExecStateEPKNS_9HashEntryEPNS_8JSObjectERKNS_10IdentifierERNS_12PropertySlotE +__ZN3JSC27ctiPatchCallByReturnAddressENS_22AbstractMacroAssemblerINS_12X86AssemblerEE22ProcessorReturnAddressEPv +__ZN3JSC8JITStubs12cti_op_jtrueEPPv +__ZNK3JSC8JSObject9toBooleanEPNS_9ExecStateE +__ZN3JSC8JITStubs19cti_op_resolve_funcEPPv +__ZNK3JSC8JSObject12toThisObjectEPNS_9ExecStateE +__ZNK3JSC8JSString8toStringEPNS_9ExecStateE +__ZN3JSC8JITStubs23cti_op_get_by_id_secondEPPv +__ZN3JSC8JITStubs15tryCacheGetByIDEPNS_9ExecStateEPNS_9CodeBlockEPvNS_7JSValueERKNS_10IdentifierERKNS_12PropertySlotE +__ZN3JSC3JIT26privateCompileGetByIdProtoEPNS_17StructureStubInfoEPNS_9StructureES4_mNS_22AbstractMacroAssemblerINS_12X86Assembl +__ZN3JSC3JIT22compileGetDirectOffsetEPNS_8JSObjectENS_3X8610RegisterIDES4_m +__ZN3JSC8JITStubs19cti_vm_lazyLinkCallEPPv +__ZN3JSC3JIT8linkCallEPNS_10JSFunctionEPNS_9CodeBlockENS_7JITCodeEPNS_12CallLinkInfoEi +__ZN3JSC8JITStubs10cti_op_endEPPv +__ZThn16_N3JSC12FuncDeclNodeD0Ev +__ZN3JSC12FuncDeclNodeD0Ev +__ZN3WTF25TCMalloc_Central_FreeList11ShrinkCacheEib +__ZN3JSC10JSFunction18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE +__ZN3JSC10JSFunction11getCallDataERNS_8CallDataE +__ZN3JSC4callEPNS_9ExecStateENS_7JSValueENS_8CallTypeERKNS_8CallDataES2_RKNS_7ArgListE +__ZN3JSC11Interpreter7executeEPNS_16FunctionBodyNodeEPNS_9ExecStateEPNS_10JSFunctionEPNS_8JSObjectERKNS_7ArgListEPNS_14ScopeCha +__ZNK3JSC15DotAccessorNode10isLocationEv +__ZNK3JSC14ExpressionNode13isResolveNodeEv +__ZNK3JSC14ExpressionNode21isBracketAccessorNodeEv +__ZN3JSC19FunctionCallDotNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC19FunctionCallDotNodeD0Ev +__ZL26appendToVarDeclarationListPvRPN3JSC15ParserArenaDataIN3WTF6VectorISt4pairINS0_10IdentifierEjELm0EEEEERKS5_j +__ZN3WTF6VectorISt4pairIN3JSC10IdentifierEjELm0EE14expandCapacityEm +__ZL14makeAssignNodePvPN3JSC14ExpressionNodeENS0_8OperatorES2_bbiii +__ZL11makeAddNodePvPN3JSC14ExpressionNodeES2_b +__ZN3JSC16VarStatementNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC17AssignResolveNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC11UnaryOpNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE __ZN3JSC10RegExpNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE __ZN3JSC6RegExp6createEPNS_12JSGlobalDataERKNS_7UStringES5_ -__ZN3JSC4WREC9Generator13compileRegExpEPNS_12JSGlobalDataERKNS_7UStringEPjPPKcRN3WTF6RefPtrINS_14ExecutablePoolEEEbb -__ZN3JSC4WREC9Generator13generateEnterEv -__ZN3JSC4WREC9Generator17generateSaveIndexEv -__ZN3JSC4WREC6Parser16parseDisjunctionERNS_14MacroAssembler8JumpListE -__ZN3JSC4WREC6Parser16parseAlternativeERNS_14MacroAssembler8JumpListE -__ZN3JSC4WREC9Generator32generatePatternCharacterSequenceERNS_14MacroAssembler8JumpListEPim -__ZN3JSC4WREC9Generator28generatePatternCharacterPairERNS_14MacroAssembler8JumpListEii -__ZN3WTF6VectorIN3JSC14MacroAssembler4JumpELm16EE6appendIS3_EEvRKT_ -__ZN3JSC12X86Assembler7cmpl_irEiNS_3X8610RegisterIDE -__ZN3JSC4WREC9Generator24generatePatternCharacterERNS_14MacroAssembler8JumpListEi -__ZN3JSC4WREC9Generator21generateLoadCharacterERNS_14MacroAssembler8JumpListE -__ZN3JSC4WREC14CharacterClass7newlineEv -__ZN3JSC4WREC6Parser29parseCharacterClassQuantifierERNS_14MacroAssembler8JumpListERKNS0_14CharacterClassEb -__ZN3JSC4WREC6Parser17consumeQuantifierEv -__ZN3JSC4WREC9Generator24generateGreedyQuantifierERNS_14MacroAssembler8JumpListERNS0_19GenerateAtomFunctorEjj -__ZN3JSC4WREC29GenerateCharacterClassFunctor12generateAtomEPNS0_9GeneratorERNS_14MacroAssembler8JumpListE -__ZN3JSC4WREC9Generator22generateCharacterClassERNS_14MacroAssembler8JumpListERKNS0_14CharacterClassEb -__ZN3JSC4WREC9Generator30generateCharacterClassInvertedERNS_14MacroAssembler8JumpListERKNS0_14CharacterClassE -__ZN3JSC4WREC29GenerateCharacterClassFunctor9backtrackEPNS0_9GeneratorE -__ZN3JSC4WREC9Generator18generateBacktrack1Ev -__ZN3JSC15AssemblerBuffer4growEv +__ZN3JSC4Yarr15jitCompileRegexEPNS_12JSGlobalDataERNS0_14RegexCodeBlockERKNS_7UStringERjRPKcbb +__ZN3JSC4Yarr12compileRegexERKNS_7UStringERNS0_12RegexPatternE +__ZN3JSC4Yarr18PatternDisjunction17addNewAlternativeEv +__ZN3WTF6VectorIPN3JSC4Yarr18PatternAlternativeELm0EE14expandCapacityEm +__ZN3JSC4Yarr6ParserINS0_23RegexPatternConstructorEE11parseTokensEv +__ZN3WTF6VectorIN3JSC4Yarr11PatternTermELm0EE14expandCapacityEmPKS3_ +__ZN3WTF6VectorIN3JSC4Yarr11PatternTermELm0EE14expandCapacityEm +__ZN3JSC4Yarr6ParserINS0_23RegexPatternConstructorEE11parseEscapeILb0ES2_EEbRT0_ +__ZN3JSC4Yarr23RegexPatternConstructor25atomBuiltInCharacterClassENS0_23BuiltInCharacterClassIDEb +__ZN3JSC4Yarr14wordcharCreateEv +__ZN3WTF6VectorItLm0EE14expandCapacityEm +__ZN3WTF6VectorIN3JSC4Yarr14CharacterRangeELm0EE14expandCapacityEmPKS3_ +__ZN3WTF6VectorIN3JSC4Yarr14CharacterRangeELm0EE14expandCapacityEm +__ZN3WTF6VectorIPN3JSC4Yarr14CharacterClassELm0EE14expandCapacityEmPKS4_ +__ZN3WTF6VectorIPN3JSC4Yarr14CharacterClassELm0EE14expandCapacityEm +__ZN3JSC4Yarr14RegexGenerator19generateDisjunctionEPNS0_18PatternDisjunctionE __ZN3JSC12X86Assembler7addl_irEiNS_3X8610RegisterIDE -__ZN3JSC4WREC9Generator21generateReturnSuccessEv -__ZN3JSC4WREC9Generator22generateIncrementIndexEPNS_14MacroAssembler4JumpE -__ZN3JSC4WREC9Generator27generateJumpIfNotEndOfInputENS_14MacroAssembler5LabelE -__ZN3JSC4WREC9Generator21generateReturnFailureEv +__ZN3JSC23MacroAssemblerX86Common8branch32ENS0_9ConditionENS_3X8610RegisterIDES3_ +__ZN3JSC22AbstractMacroAssemblerINS_12X86AssemblerEE8JumpList6appendENS2_4JumpE +__ZN3JSC4Yarr14RegexGenerator12generateTermERNS1_19TermGenerationStateE +__ZN3JSC23MacroAssemblerX86Common8branch32ENS0_9ConditionENS_3X8610RegisterIDENS_22AbstractMacroAssemblerINS_12X86AssemblerEE5I +__ZN3JSC4Yarr14RegexGenerator19TermGenerationState15jumpToBacktrackENS_22AbstractMacroAssemblerINS_12X86AssemblerEE4JumpEPNS_14 +__ZN3JSC4Yarr14RegexGenerator13readCharacterEiNS_3X8610RegisterIDE +__ZN3JSC4Yarr14RegexGenerator19matchCharacterClassENS_3X8610RegisterIDERNS_22AbstractMacroAssemblerINS_12X86AssemblerEE8JumpLis +__ZN3JSC4Yarr14RegexGenerator24matchCharacterClassRangeENS_3X8610RegisterIDERNS_22AbstractMacroAssemblerINS_12X86AssemblerEE8Ju +__ZN3JSC22AbstractMacroAssemblerINS_12X86AssemblerEE8JumpList4linkEPS2_ +__ZN3JSC23MacroAssemblerX86Common4jumpEv +__ZN3WTF6VectorIN3JSC22AbstractMacroAssemblerINS1_12X86AssemblerEE4JumpELm16EED1Ev +__ZN3JSC4Yarr14RegexGenerator28generateCharacterClassGreedyERNS1_19TermGenerationStateE +__ZN3JSC12X86Assembler7subl_irEiNS_3X8610RegisterIDE +__ZN3JSC15AssemblerBuffer4growEv +__ZN3WTF15deleteAllValuesIPN3JSC4Yarr14CharacterClassELm0EEEvRKNS_6VectorIT_XT0_EEE __ZN3JSC17BytecodeGenerator13emitNewRegExpEPNS_10RegisterIDEPNS_6RegExpE -__ZN3JSC12BinaryOpNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZNK3JSC18NotStrictEqualNode8opcodeIDEv -__ZNK3JSC14ExpressionNode6isPureERNS_17BytecodeGeneratorE -__ZN3JSC4WREC9Generator20generateAssertionBOLERNS_14MacroAssembler8JumpListE -__ZN3JSC4WREC6Parser13consumeEscapeEb -__ZN3WTF6VectorIiLm8EE14expandCapacityEm -__ZN3JSC4WREC6Parser16parseParenthesesERNS_14MacroAssembler8JumpListE -__Z15jsRegExpCompilePKti24JSRegExpIgnoreCaseOption23JSRegExpMultilineOptionPjPPKc -__ZL30calculateCompiledPatternLengthPKti24JSRegExpIgnoreCaseOptionR11CompileDataR9ErrorCode -__ZL11checkEscapePPKtS0_P9ErrorCodeib -__ZL13compileBranchiPiPPhPPKtS3_P9ErrorCodeS_S_R11CompileData -__ZN3JSC4WREC14CharacterClass6spacesEv -__ZN3JSC4WREC6Parser23parseNonCharacterEscapeERNS_14MacroAssembler8JumpListERKNS0_6EscapeE -__ZN3JSC12X86Assembler23X86InstructionFormatter9twoByteOpENS0_15TwoByteOpcodeIDE -__ZN3JSC4WREC9Generator35generateCharacterClassInvertedRangeERNS_14MacroAssembler8JumpListES4_PKNS0_14CharacterRangeEjPjPKtj -__ZN3JSC4WREC9Generator20terminateAlternativeERNS_14MacroAssembler8JumpListES4_ -__ZN3JSC4WREC6Parser19parseCharacterClassERNS_14MacroAssembler8JumpListE -__ZN3JSC4WREC14CharacterClass8wordcharEv -__ZN3JSC4WREC25CharacterClassConstructor6appendERKNS0_14CharacterClassE -__ZN3JSC4WREC25CharacterClassConstructor5flushEv -__ZN3JSC4WREC25CharacterClassConstructor9addSortedERN3WTF6VectorItLm0EEEt -__ZN3WTF6VectorItLm0EE14expandCapacityEm -__ZN3JSC4WREC25CharacterClassConstructor14addSortedRangeERN3WTF6VectorINS0_14CharacterRangeELm0EEEtt -__ZN3WTF6VectorIN3JSC4WREC14CharacterRangeELm0EE14expandCapacityEm -__ZN3JSC4WREC25CharacterClassConstructor3putEt -__ZN3JSC4WREC9Generator20terminateDisjunctionERNS_14MacroAssembler8JumpListE -__ZN3JSC11NewExprNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC17BytecodeGenerator13emitConstructEPNS_10RegisterIDES2_PNS_13ArgumentsNodeEjjj -__ZN3WTF6VectorIN3JSC20GetByIdExceptionInfoELm0EE14expandCapacityEm -__ZN3JSC16VarStatementNodeD1Ev -__ZN3JSC16VarStatementNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC17AssignResolveNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC17ObjectLiteralNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC16PropertyListNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC12PropertyNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC11UnaryOpNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC13LogicalOpNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC12BinaryOpNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC17AssignResolveNodeD1Ev -__ZN3JSC17ObjectLiteralNodeD1Ev -__ZN3JSC16PropertyListNodeD1Ev -__ZN3JSC12PropertyNodeD1Ev -__ZN3JSC14LogicalNotNodeD1Ev -__ZN3JSC10RegExpNodeD1Ev -__ZN3JSC13LogicalOpNodeD1Ev -__ZN3JSC9EqualNodeD1Ev -__ZN3JSC18NotStrictEqualNodeD1Ev -__ZN3JSC6IfNodeD1Ev -__ZN3JSC6IfNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC13AssignDotNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC8WithNodeD1Ev -__ZN3JSC8WithNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC21FunctionCallValueNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC21FunctionCallValueNodeD1Ev -__ZN3JSC9ArrayNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC9ArrayNodeD1Ev -__ZN3JSC11ElementNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC10IfElseNodeD1Ev -__ZN3JSC10IfElseNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC7AddNodeD1Ev -__ZN3JSC11NewExprNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC11NewExprNodeD1Ev +__ZN3JSC15ConditionalNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC9EqualNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZNK3JSC14ExpressionNode6isNullEv +__ZNK3JSC10StringNode6isPureERNS_17BytecodeGeneratorE +__ZN3JSC19BracketAccessorNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZNK3JSC10NumberNode6isPureERNS_17BytecodeGeneratorE +__ZN3JSC10NumberNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC17BytecodeGenerator8emitLoadEPNS_10RegisterIDEd +__ZN3JSC17BytecodeGenerator12emitGetByValEPNS_10RegisterIDES2_S2_ +__ZN3JSC17BytecodeGenerator14emitEqualityOpENS_8OpcodeIDEPNS_10RegisterIDES3_S3_ +__ZN3JSC19ReverseBinaryOpNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZNK3JSC14ExpressionNode5isAddEv +__ZN3JSC12SmallStrings27createSingleCharacterStringEPNS_12JSGlobalDataEh +__ZN3JSC13AssignDotNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC17BytecodeGenerator11emitPutByIdEPNS_10RegisterIDERKNS_10IdentifierES2_ +__ZN3JSC17AssignResolveNodeD0Ev +__ZN3JSC15ParserArenaDataIN3WTF6VectorISt4pairINS_10IdentifierEjELm0EEEED0Ev +__ZN3JSC16VarStatementNodeD0Ev +__ZN3JSC14LogicalNotNodeD0Ev +__ZN3JSC10RegExpNodeD0Ev +__ZN3JSC10NumberNodeD0Ev +__ZN3JSC19BracketAccessorNodeD0Ev +__ZN3JSC9EqualNodeD0Ev +__ZN3JSC15ConditionalNodeD0Ev +__ZN3JSC7AddNodeD0Ev +__ZN3JSC13GreaterEqNodeD0Ev +__ZN3JSC13AssignDotNodeD0Ev +__ZN3JSC3JIT13emit_op_jtrueEPNS_11InstructionE +__ZN3JSC3JIT18emit_op_new_regexpEPNS_11InstructionE +__ZN3JSC3JIT18emit_op_get_by_valEPNS_11InstructionE +__ZN3JSC3JIT10emit_op_eqEPNS_11InstructionE +__ZN3JSC3JIT11emit_op_addEPNS_11InstructionE +__ZN3JSC11JITStubCall11addArgumentEjNS_3X8610RegisterIDE +__ZN3JSC3JIT16emit_op_jnlesseqEPNS_11InstructionE +__ZN3JSC3JIT17emit_op_put_by_idEPNS_11InstructionE __ZN3JSC3JIT21compilePutByIdHotPathEiPNS_10IdentifierEij -__ZN3WTF6VectorIN3JSC9JumpTableELm0EE14expandCapacityEm -__ZN3WTF6VectorIN3JSC13SlowCaseEntryELm0EE6appendIS2_EEvRKT_ -__ZN3JSC12X86Assembler23X86InstructionFormatter9oneByteOpENS0_15OneByteOpcodeIDEiNS_3X8610RegisterIDES4_ii -__ZN3JSC3JIT11emitCTICallEPFPNS_23JSValueEncodedAsPointerEPvzE -__ZN3JSC3JIT17compileOpStrictEqEPNS_11InstructionENS0_21CompileOpStrictEqTypeE -__ZN3JSC3JIT23compileFastArith_op_addEPNS_11InstructionE +__ZN3JSC3JIT17emitSlow_op_jtrueEPNS_11InstructionERPNS_13SlowCaseEntryE +__ZN3JSC3JIT22emitSlow_op_get_by_valEPNS_11InstructionERPNS_13SlowCaseEntryE +__ZN3JSC3JIT14emitSlow_op_eqEPNS_11InstructionERPNS_13SlowCaseEntryE +__ZN3JSC3JIT20emitSlow_op_jnlesseqEPNS_11InstructionERPNS_13SlowCaseEntryE +__ZN3JSC20MacroAssemblerX86_6413branchTestPtrENS_23MacroAssemblerX86Common9ConditionENS_3X8610RegisterIDES4_ +__ZN3JSC12X86Assembler23X86InstructionFormatter9twoByteOpENS0_15TwoByteOpcodeIDEiNS_3X8610RegisterIDE +__ZN3JSC23MacroAssemblerX86Common12branchDoubleENS0_15DoubleConditionENS_3X8613XMMRegisterIDES3_ +__ZN3JSC3JIT21emitSlow_op_put_by_idEPNS_11InstructionERPNS_13SlowCaseEntryE __ZN3JSC3JIT22compilePutByIdSlowCaseEiPNS_10IdentifierEiRPNS_13SlowCaseEntryEj -__ZN3JSC3JIT27compileOpConstructSetupArgsEPNS_11InstructionE -__ZN3JSC3JIT11emitCTICallEPFPNS_8JSObjectEPvzE -__ZN3JSC12SmallStrings27createSingleCharacterStringEPNS_12JSGlobalDataEh -__ZN3JSC11Interpreter17cti_op_new_objectEPvz -__ZN3JSC20constructEmptyObjectEPNS_9ExecStateE -__ZN3JSC11Interpreter16cti_op_put_by_idEPvz -__ZN3JSC8JSObject3putEPNS_9ExecStateERKNS_10IdentifierENS_10JSValuePtrERNS_15PutPropertySlotE -__ZN3JSC11Interpreter12cti_op_jtrueEPvz -__ZN3JSC11Interpreter10cti_op_notEPvz -__ZN3WTF7HashMapISt4pairINS_6RefPtrIN3JSC7UString3RepEEEjEPNS3_9StructureENS3_28StructureTransitionTableHashENS3_34StructureTransitionTableHashTraitsENS_10HashTraitsIS9_EEE3addERKS7_RKS9_ -__ZN3WTF9HashTableISt4pairINS_6RefPtrIN3JSC7UString3RepEEEjES1_IS7_PNS3_9StructureEENS_18PairFirstExtractorISA_EENS3_28StructureTransitionTableHashENS_14PairHashTraitsINS3_34StructureTransitionTableHashTraitsENS_10HashTraitsIS9_EEEESF_E6rehashEi -__ZN3JSC11Interpreter21cti_op_resolve_globalEPvz +__ZN3JSC13LogicalOpNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3WTF6VectorIN3JSC17GlobalResolveInfoELm0EE14expandCapacityEm +__ZN3JSC17BytecodeGenerator14emitJumpIfTrueEPNS_10RegisterIDEPNS_5LabelE +__ZN3JSC13LogicalOpNodeD0Ev +__ZN3JSC3JIT22emit_op_resolve_globalEPNS_11InstructionE +__ZN3JSC8JITStubs21cti_op_resolve_globalEPPv +__ZNK3JSC8JSString9toBooleanEPNS_9ExecStateE __ZN3JSC8JSString18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE __ZN3JSC15StringPrototype18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE __ZN3JSC12StringObject18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE -__ZN3JSCL22stringProtoFuncIndexOfEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE +__ZN3JSCL20stringProtoFuncMatchEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE __ZNK3JSC8JSString12toThisStringEPNS_9ExecStateE -__ZNK3JSC10JSValuePtr9toIntegerEPNS_9ExecStateE -__ZN3JSC11JSImmediate12nonInlineNaNEv -__ZNK3JSC7UString4findERKS0_i -__ZN3JSC11Interpreter11cti_op_lessEPvz -__ZN3JSC11Interpreter17cti_op_new_regexpEPvz -__ZN3JSC12RegExpObjectC1EN3WTF10PassRefPtrINS_9StructureEEENS2_INS_6RegExpEEE -__ZN3JSCL20stringProtoFuncMatchEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE __ZNK3JSC6JSCell8isObjectEPKNS_9ClassInfoE -__ZNK3JSC12RegExpObject9classInfoEv +__ZNK3JSC6JSCell9classInfoEv +__ZN3JSC4Yarr23RegexPatternConstructor20atomPatternCharacterEt +__ZN3JSC4Yarr25CharacterClassConstructor7putCharEt +__ZN3JSC4Yarr25CharacterClassConstructor9addSortedERN3WTF6VectorItLm0EEEt +__ZN3JSC4Yarr23RegexPatternConstructor21atomCharacterClassEndEv +__ZN3JSC4Yarr23RegexPatternConstructor23setupDisjunctionOffsetsEPNS0_18PatternDisjunctionEjj +__ZN3JSC4Yarr14RegexGenerator25generateParenthesesSingleERNS1_19TermGenerationStateE +__ZN3JSC4Yarr14RegexGenerator30generateParenthesesDisjunctionERNS0_11PatternTermERNS1_19TermGenerationStateEj +__ZN3WTF6VectorIN3JSC4Yarr14RegexGenerator26AlternativeBacktrackRecordELm0EE14expandCapacityEm +__ZN3JSC4Yarr14RegexGenerator19jumpIfCharNotEqualsEti +__ZN3JSC12X86Assembler23X86InstructionFormatter9oneByteOpENS0_15OneByteOpcodeIDEiNS_3X8610RegisterIDES4_ii +__ZN3JSC4Yarr14RegexGenerator19TermGenerationState15jumpToBacktrackERNS_22AbstractMacroAssemblerINS_12X86AssemblerEE8JumpListEP __ZN3JSC17RegExpConstructor12performMatchEPNS_6RegExpERKNS_7UStringEiRiS6_PPi __ZN3JSC6RegExp5matchERKNS_7UStringEiPN3WTF11OwnArrayPtrIiEE -__ZNK3JSC8JSObject9toBooleanEPNS_9ExecStateE -__ZNK3JSC7UString8toUInt32EPbb -__ZNK3JSC7UString8toDoubleEbb -__ZN3WTF6VectorIcLm32EE6resizeEm -__ZN3JSC11Interpreter16cti_op_nstricteqEPvz -__ZN3JSC10JSValuePtr19strictEqualSlowCaseES0_S0_ -__ZN3JSC11Interpreter19cti_op_new_func_expEPvz -__ZN3JSC12FuncExprNode12makeFunctionEPNS_9ExecStateEPNS_14ScopeChainNodeE -__ZNK3JSC19BracketAccessorNode10isLocationEv -__ZNK3JSC19BracketAccessorNode21isBracketAccessorNodeEv -__ZN3JSC9ForInNodeC2EPNS_12JSGlobalDataERKNS_10IdentifierEPNS_14ExpressionNodeES7_PNS_13StatementNodeEiii -__ZN3JSC19BracketAccessorNodeD1Ev -__ZN3JSC19BracketAccessorNode12releaseNodesERNS_12NodeReleaserE -__ZNK3JSC9ForInNode6isLoopEv -__ZN3JSC9ForInNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSCL20dateProtoFuncSetTimeEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC20EvalFunctionCallNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC17BytecodeGenerator19emitResolveWithBaseEPNS_10RegisterIDES2_RKNS_10IdentifierE -__ZN3JSC20EvalFunctionCallNodeD1Ev -__ZN3JSC20EvalFunctionCallNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC3JIT26compileOpCallEvalSetupArgsEPNS_11InstructionE -__ZN3JSC11Interpreter24cti_op_resolve_with_baseEPvz -__ZN3JSC11Interpreter16cti_op_call_evalEPvz -__ZN3JSC11Interpreter8callEvalEPNS_9ExecStateEPNS_12RegisterFileEPNS_8RegisterEiiRNS_10JSValuePtrE -__ZNK3WTF7HashMapINS_6RefPtrIN3JSC7UString3RepEEENS1_INS2_8EvalNodeEEENS_7StrHashIS5_EENS_10HashTraitsIS5_EENSA_IS7_EEE3getEPS4_ -__ZN3JSC7UString3Rep11computeHashEPKti -__ZN3JSC6Parser5parseINS_8EvalNodeEEEN3WTF10PassRefPtrIT_EEPNS_9ExecStateEPNS_8DebuggerERKNS_10SourceCodeEPiPNS_7UStringE -__ZN3WTF9HashTableINS_6RefPtrIN3JSC7UString3RepEEESt4pairIS5_NS1_INS2_8EvalNodeEEEENS_18PairFirstExtractorIS9_EENS_7StrHashIS5_EENS_14PairHashTraitsINS_10HashTraitsIS5_EENSF_IS8_EEEESG_E6rehashEi -__ZN3JSC9ExecState9thisValueEv -__ZN3JSC11Interpreter7executeEPNS_8EvalNodeEPNS_9ExecStateEPNS_8JSObjectEiPNS_14ScopeChainNodeEPNS_10JSValuePtrE -__ZN3JSC8EvalNode16generateBytecodeEPNS_14ScopeChainNodeE -__ZN3JSC17BytecodeGeneratorC2EPNS_8EvalNodeEPKNS_8DebuggerERKNS_10ScopeChainEPN3WTF7HashMapINS9_6RefPtrINS_7UString3RepEEENS_16SymbolTableEntryENS_17IdentifierRepHashENS9_10HashTraitsISE_EENS_26SymbolTableIndexHashTraitsEEEPNS_13EvalCodeBlockE -__ZN3JSC8EvalNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC18globalFuncParseIntEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSCL24dateProtoFuncToGMTStringEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC10formatTimeERKNS_17GregorianDateTimeEb -__ZN3JSC9BreakNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC17BytecodeGenerator11breakTargetERKNS_10IdentifierE -__ZN3JSC9BreakNodeD1Ev -__ZN3JSC8JSString18getPrimitiveNumberEPNS_9ExecStateERdRNS_10JSValuePtrE -__ZNK3JSC8JSString8toNumberEPNS_9ExecStateE -__ZL18makeRightShiftNodePvPN3JSC14ExpressionNodeES2_b -__ZN3JSC4WREC14CharacterClass6digitsEv -__ZNK3JSC14RightShiftNode8opcodeIDEv -__ZN3JSC14RightShiftNodeD1Ev -__ZN3JSC3JIT26compileFastArith_op_rshiftEjjj -__ZN3JSC3JIT30compileFastArithSlow_op_rshiftEjjjRPNS_13SlowCaseEntryE -__ZN3JSCL20dateProtoFuncSetYearEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC21gregorianDateTimeToMSERKNS_17GregorianDateTimeEdb -__ZN3JSCL15dateToDayInYearEiii -__ZN3JSC8EvalNode4markEv -__ZN3JSC19JSStaticScopeObjectD0Ev -__ZN3JSC18PostfixBracketNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC18PostfixBracketNodeD1Ev -__ZN3JSC18PostfixBracketNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC9ForInNodeC2EPNS_12JSGlobalDataEPNS_14ExpressionNodeES4_PNS_13StatementNodeE -__ZN3JSC21ReadModifyBracketNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC21ReadModifyBracketNodeD1Ev -__ZN3JSC21ReadModifyBracketNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSCL20arrayProtoFuncConcatEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC17RegExpConstructor16getConstructDataERNS_13ConstructDataE -__ZN3JSCL30constructWithRegExpConstructorEPNS_9ExecStateEPNS_8JSObjectERKNS_7ArgListE -__ZN3JSC15constructRegExpEPNS_9ExecStateERKNS_7ArgListE -__ZN3JSC23objectProtoFuncToStringEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZNK3JSC8JSObject9classNameEv -__ZN3JSC18RegExpMatchesArray18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE -__ZN3JSCL20stringProtoFuncSliceEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZNK3JSC8NullNode6isNullEv -__ZN3JSC17StringConstructor11getCallDataERNS_8CallDataE -__ZN3JSCL21callStringConstructorEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZNK3JSC12StringObject8toStringEPNS_9ExecStateE -__ZN3JSCL23stringProtoFuncToStringEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC11Interpreter28cti_op_get_by_id_string_failEPvz -__ZN3JSCL19regExpProtoFuncExecEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC11Interpreter16cti_op_is_numberEPvz -__ZNK3JSC12StringObject9classInfoEv -__ZN3JSC11Interpreter16cti_op_is_objectEPvz -__ZN3JSC3JIT30privateCompileGetByIdChainListEPNS_17StructureStubInfoEPNS_30PolymorphicAccessStructureListEiPNS_9StructureEPNS_14StructureChainEmmPNS_9ExecStateE -__ZN3JSCL23numberProtoFuncToStringEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC10Identifier5equalEPKNS_7UString3RepEPKc -__ZNK3JSC6JSCell17getTruncatedInt32ERi -__ZN3JSC15toInt32SlowCaseEdRb -__ZNK3JSC12JSNumberCell9toBooleanEPNS_9ExecStateE -__ZN3JSC9Structure24removePropertyTransitionEPS0_RKNS_10IdentifierERm -__ZN3JSC11Interpreter10cti_op_subEPvz -__ZN3JSC28globalFuncEncodeURIComponentEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSCL6encodeEPNS_9ExecStateERKNS_7ArgListEPKc -__ZNK3JSC7UString10UTF8StringEb -__ZN3WTF7Unicode18convertUTF16ToUTF8EPPKtS2_PPcS4_b +__ZN3JSC4Yarr12executeRegexERNS0_14RegexCodeBlockEPKtjjPii +__ZN3JSC8JITStubs17cti_op_new_regexpEPPv +__ZN3JSC12RegExpObjectC1EN3WTF10PassRefPtrINS_9StructureEEENS2_INS_6RegExpEEE +__ZNK3JSC12RegExpObject9classInfoEv +__ZN3JSC18RegExpMatchesArrayC2EPNS_9ExecStateEPNS_24RegExpConstructorPrivateE +__ZN3JSC8JITStubs17cti_op_get_by_valEPPv +__ZN3JSC18RegExpMatchesArray18getOwnPropertySlotEPNS_9ExecStateEjRNS_12PropertySlotE +__ZN3JSC18RegExpMatchesArray17fillArrayInstanceEPNS_9ExecStateE +__ZN3JSC11jsSubstringEPNS_12JSGlobalDataERKNS_7UStringEjj +__ZN3JSC7JSArray3putEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueERNS_15PutPropertySlotE +__ZN3JSC8JSObject3putEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueERNS_15PutPropertySlotE +__ZN3JSC7JSArray18getOwnPropertySlotEPNS_9ExecStateEjRNS_12PropertySlotE +__ZN3JSC8JITStubs9cti_op_eqEPPv +__ZN3JSCeqERKNS_7UStringES2_ +__ZN3JSC8JITStubs10cti_op_addEPPv +__ZN3JSC11concatenateEPNS_7UString3RepES2_ +__ZN3JSCL22stringProtoFuncIndexOfEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZNK3JSC7UString4findERKS0_i +__ZN3JSC8JITStubs16cti_op_put_by_idEPPv +__ZNK3JSC7UString8toUInt32EPbb +__ZNK3JSC7UString8toDoubleEbb +__ZNK3JSC7UString10getCStringERN3WTF6VectorIcLm32EEE +__ZN3WTF14FastMallocZone11forceUnlockEP14_malloc_zone_t +__Z15jsRegExpCompilePKti24JSRegExpIgnoreCaseOption23JSRegExpMultilineOptionPjPPKc +__ZL30calculateCompiledPatternLengthPKti24JSRegExpIgnoreCaseOptionR11CompileDataR9ErrorCode +__ZL11checkEscapePPKtS0_P9ErrorCodeib +__ZL13compileBranchiPiPPhPPKtS3_P9ErrorCodeS_S_R11CompileData +__Z15jsRegExpExecutePK8JSRegExpPKtiiPii +__ZL5matchPKtPKhiR9MatchData +__ZNK3JSC7UString14toStrictUInt32EPb +__ZN3JSC17ObjectLiteralNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC16PropertyListNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC7TryNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC17BytecodeGenerator9emitCatchEPNS_10RegisterIDEPNS_5LabelES4_ +__ZN3WTF6VectorIN3JSC11HandlerInfoELm0EE14expandCapacityEm +__ZN3JSC17BytecodeGenerator16emitPushNewScopeEPNS_10RegisterIDERNS_10IdentifierES2_ +__ZN3WTF6VectorIN3JSC18ControlFlowContextELm0EE14expandCapacityEm +__ZNK3JSC14ExpressionNode6isPureERNS_17BytecodeGeneratorE +__ZN3JSC12PropertyNodeD0Ev +__ZN3JSC16PropertyListNodeD0Ev +__ZN3JSC17ObjectLiteralNodeD0Ev +__ZN3JSC7TryNodeD0Ev +__ZN3JSC3JIT18emit_op_new_objectEPNS_11InstructionE +__ZN3JSC3JIT13emit_op_catchEPNS_11InstructionE +__ZN3JSC3JIT22emit_op_push_new_scopeEPNS_11InstructionE +__ZN3JSC3JIT15emit_op_resolveEPNS_11InstructionE +__ZN3JSC3JIT17emit_op_pop_scopeEPNS_11InstructionE +__ZN3JSC8JITStubs17cti_op_new_objectEPPv +__ZN3JSC20constructEmptyObjectEPNS_9ExecStateE +__ZN3JSC17StructureStubInfo5derefEv +__ZN3WTF9HashTableINS_6RefPtrIN3JSC7UString3RepEEES5_NS_17IdentityExtractorIS5_EENS2_17IdentifierRepHashENS_10HashTraitsIS5_EES +__ZN3JSC8ThisNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC21ThrowableBinaryOpNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC8ThisNodeD0Ev +__ZN3JSC6InNodeD0Ev +__ZN3JSC3JIT29emit_op_enter_with_activationEPNS_11InstructionE +__ZN3JSC3JIT20emit_op_convert_thisEPNS_11InstructionE +__ZN3JSC3JIT27emit_op_tear_off_activationEPNS_11InstructionE +__ZN3JSC3JIT24emitSlow_op_convert_thisEPNS_11InstructionERPNS_13SlowCaseEntryE +__ZN3JSC8JITStubs22cti_op_push_activationEPPv +__ZN3JSC12JSActivationC1EPNS_9ExecStateEN3WTF10PassRefPtrINS_16FunctionBodyNodeEEE +__ZN3JSC12JSActivationC2EPNS_9ExecStateEN3WTF10PassRefPtrINS_16FunctionBodyNodeEEE +__ZN3JSC4Yarr6ParserINS0_23RegexPatternConstructorEE11parseEscapeILb1ENS3_28CharacterClassParserDelegateEEEbRT0_ +__ZN3JSC4Yarr12digitsCreateEv +__ZN3JSC4Yarr25CharacterClassConstructor6appendEPKNS0_14CharacterClassE +__ZN3JSC4Yarr25CharacterClassConstructor14addSortedRangeERN3WTF6VectorINS0_14CharacterRangeELm0EEEtt +__ZN3JSC4Yarr6ParserINS0_23RegexPatternConstructorEE28CharacterClassParserDelegate20atomPatternCharacterEt +__ZN3JSC11GreaterNodeD0Ev +__ZN3JSCL26stringProtoFuncToLowerCaseEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC8JSString14toThisJSStringEPNS_9ExecStateE +__ZN3JSC7UStringC2EPtib +__ZN3JSC18globalFuncParseIntEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC11JSImmediate12nonInlineNaNEv +__ZN3JSC8JITStubs11cti_op_lessEPPv +__ZN3JSC8JITStubs9cti_op_inEPPv +__ZNK3JSC6JSCell9getUInt32ERj +__ZNK3JSC8JSObject11hasPropertyEPNS_9ExecStateERKNS_10IdentifierE +__ZL14makePrefixNodePvPN3JSC14ExpressionNodeENS0_8OperatorEiii +__ZN3JSC7ForNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC17BytecodeGenerator13newLabelScopeENS_10LabelScope4TypeEPKNS_10IdentifierE +__ZN3JSC12ContinueNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC17BytecodeGenerator14continueTargetERKNS_10IdentifierE +__ZN3JSC17BytecodeGenerator14emitJumpScopesEPNS_5LabelEi __ZN3JSC17PrefixResolveNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZNK3JSC10NegateNode8opcodeIDEv -__ZN3JSC10NegateNodeD1Ev -__ZN3JSC11Interpreter13cti_op_negateEPvz -__ZN3JSCL17mathProtoFuncSqrtEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC11JSImmediate12toThisObjectENS_10JSValuePtrEPNS_9ExecStateE -__ZN3JSCL16mathProtoFuncAbsEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSCL18mathProtoFuncRoundEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSCL16mathProtoFuncCosEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSCL16mathProtoFuncSinEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC11Interpreter12cti_op_jlessEPvz -__ZNK3JSC8JSObject8toNumberEPNS_9ExecStateE -__ZN3JSC16ArrayConstructor11getCallDataERNS_8CallDataE -__ZN3JSCL20callArrayConstructorEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC12JSNumberCell18getPrimitiveNumberEPNS_9ExecStateERdRNS_10JSValuePtrE -__ZN3JSC11Interpreter10cti_op_modEPvz -__ZL17makeLeftShiftNodePvPN3JSC14ExpressionNodeES2_b -__ZNK3JSC13LeftShiftNode8opcodeIDEv -__ZN3JSC13LeftShiftNodeD1Ev -__ZN3JSC3JIT26compileFastArith_op_lshiftEjjj -__ZN3JSC3JIT30compileFastArithSlow_op_lshiftEjjjRPNS_13SlowCaseEntryE -__ZN3JSCL16mathProtoFuncMaxEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZNK3JSC10BitAndNode8opcodeIDEv -__ZN3JSC10BitAndNodeD1Ev -__ZN3JSC3JIT26compileFastArith_op_bitandEjjj -__ZN3JSC3JIT30compileFastArithSlow_op_bitandEjjjRPNS_13SlowCaseEntryE -__ZN3JSC11Interpreter13cti_op_bitandEPvz -__ZNK3JSC14BitwiseNotNode8opcodeIDEv -__ZN3JSC14BitwiseNotNodeD1Ev -__ZN3JSC11Interpreter13cti_op_lshiftEPvz -__ZN3JSC11Interpreter13cti_op_bitnotEPvz -__ZNK3JSC22UnsignedRightShiftNode8opcodeIDEv -__ZNK3JSC10BitXOrNode8opcodeIDEv -__ZN3JSC22UnsignedRightShiftNodeD1Ev -__ZN3JSC10BitXOrNodeD1Ev -__ZN3JSCL25stringProtoFuncCharCodeAtEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC11Interpreter14cti_op_urshiftEPvz -__ZNK3JSC12JSNumberCell18getTruncatedUInt32ERj -__ZN3JSC16toUInt32SlowCaseEdRb -__ZN3JSCL17mathProtoFuncCeilEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZNK3JSC6JSCell18getTruncatedUInt32ERj -__ZN3JSC11Interpreter12cti_op_bitorEPvz -__ZNK3JSC12JSNumberCell17getTruncatedInt32ERi -__ZNK3JSC9BitOrNode8opcodeIDEv -__ZN3JSC9BitOrNodeD1Ev -__ZN3JSC11Interpreter13cti_op_rshiftEPvz -__ZN3JSC11Interpreter13cti_op_bitxorEPvz -__ZN3JSC9parseDateERKNS_7UStringE -__ZNK3JSC12JSActivation12toThisObjectEPNS_9ExecStateE -__ZN3JSC11Interpreter19cti_op_resolve_skipEPvz -__ZN3JSCL24dateProtoFuncGetFullYearEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC17StringConstructor16getConstructDataERNS_13ConstructDataE -__ZN3JSCL30constructWithStringConstructorEPNS_9ExecStateEPNS_8JSObjectERKNS_7ArgListE -__ZN3JSC5equalEPKNS_7UString3RepES3_ -__ZN3JSC10SwitchNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC13CaseBlockNode20emitBytecodeForBlockERNS_17BytecodeGeneratorEPNS_10RegisterIDES4_ -__ZN3JSC13CaseBlockNode18tryOptimizedSwitchERN3WTF6VectorIPNS_14ExpressionNodeELm8EEERiS7_ -__ZN3JSCL17processClauseListEPNS_14ClauseListNodeERN3WTF6VectorIPNS_14ExpressionNodeELm8EEERNS_10SwitchKindERbRiSB_ -__ZNK3JSC10StringNode8isStringEv -__ZN3WTF6VectorIPN3JSC14ExpressionNodeELm8EE14expandCapacityEm -__ZN3WTF6VectorINS_6RefPtrIN3JSC5LabelEEELm8EE14expandCapacityEm -__ZN3JSC17BytecodeGenerator11beginSwitchEPNS_10RegisterIDENS_10SwitchInfo10SwitchTypeE -__ZN3WTF6VectorIN3JSC10SwitchInfoELm0EE14expandCapacityEm -__ZN3JSC17BytecodeGenerator9endSwitchEjPN3WTF6RefPtrINS_5LabelEEEPPNS_14ExpressionNodeEPS3_ii -__ZN3WTF6VectorIN3JSC15SimpleJumpTableELm0EE14expandCapacityEm -__ZN3WTF6VectorIiLm0EE15reserveCapacityEm -__ZN3JSC10SwitchNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC13CaseBlockNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC14ClauseListNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC14CaseClauseNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC10SwitchNodeD1Ev -__ZN3JSC13CaseBlockNodeD1Ev -__ZN3JSC14ClauseListNodeD1Ev -__ZN3JSC14CaseClauseNodeD1Ev -__ZN3WTF6VectorIN3JSC12SwitchRecordELm0EE14expandCapacityEm -__ZN3WTF6VectorIPvLm0EE15reserveCapacityEm -__ZN3JSC11Interpreter18cti_op_switch_charEPvz -__ZN3JSC8EvalNodeD1Ev -__ZN3JSCL16mathProtoFuncPowEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3WTF6VectorIcLm0EE14expandCapacityEm -__ZN3WTF6VectorIN3JSC7UString5RangeELm16EE14expandCapacityEm -__ZN3WTF6VectorIN3JSC7UStringELm16EE14expandCapacityEm -__ZN3WTF17TCMalloc_PageHeap3NewEm -__ZN3JSC7JSArray16getPropertyNamesEPNS_9ExecStateERNS_17PropertyNameArrayE -__ZN3JSC9ExecState10arrayTableEPS0_ -__ZN3JSCL18regExpObjectSourceEPNS_9ExecStateERKNS_10IdentifierERKNS_12PropertySlotE -__ZN3JSC7ArgList10slowAppendENS_10JSValuePtrE -__ZN3WTF7HashSetIPN3JSC7ArgListENS_7PtrHashIS3_EENS_10HashTraitsIS3_EEE3addERKS3_ -__ZN3WTF9HashTableIPN3JSC7ArgListES3_NS_17IdentityExtractorIS3_EENS_7PtrHashIS3_EENS_10HashTraitsIS3_EES9_E6rehashEi -__ZN3WTF6VectorIN3JSC8RegisterELm8EE15reserveCapacityEm -__ZN3JSC22JSPropertyNameIterator4markEv -__ZN3JSCL16mathProtoFuncLogEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSCL29objectProtoFuncHasOwnPropertyEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSCL18arrayProtoFuncSortEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC7JSArray4sortEPNS_9ExecStateENS_10JSValuePtrENS_8CallTypeERKNS_8CallDataE -__ZN3WTF7AVLTreeIN3JSC32AVLTreeAbstractorForArrayCompareELj44ENS_18AVLTreeDefaultBSetILj44EEEE6insertEi -__ZN3JSCltERKNS_7UStringES2_ -__ZN3WTF7AVLTreeIN3JSC32AVLTreeAbstractorForArrayCompareELj44ENS_18AVLTreeDefaultBSetILj44EEEE7balanceEi -__ZN3JSC4WREC9Generator29generateAssertionWordBoundaryERNS_14MacroAssembler8JumpListEb -__ZN3JSC12X86Assembler23X86InstructionFormatter11memoryModRMEiNS_3X8610RegisterIDES3_ii -__ZN3JSCL21stringProtoFuncConcatEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC19globalFuncEncodeURIEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC19globalFuncDecodeURIEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSCL6decodeEPNS_9ExecStateERKNS_7ArgListEPKcb -__ZN3WTF7Unicode18UTF8SequenceLengthEc -__ZN3WTF7Unicode18decodeUTF8SequenceEPKc -__ZN3JSC6JSCell18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE -__ZNK3JSC12JSNumberCell8toObjectEPNS_9ExecStateE -__ZN3JSC15constructNumberEPNS_9ExecStateENS_10JSValuePtrE -__ZN3JSCL22numberProtoFuncToFixedEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC12JSNumberCell11getJSNumberEv -__ZN3JSCL16integerPartNoExpEd -__ZN3JSC11Interpreter27cti_op_get_by_id_proto_failEPvz -__ZN3WTF6VectorIPN3JSC10RegisterIDELm32EE14expandCapacityEm -__ZN3JSCL17arrayProtoFuncPopEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC7JSArray3popEv -__ZNK3JSC11DoWhileNode6isLoopEv -__ZN3JSC11DoWhileNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC11DoWhileNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC11DoWhileNodeD1Ev -__ZN3JSC11Interpreter17cti_op_switch_immEPvz -__ZN3JSCL16mathProtoFuncMinEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC13UnaryPlusNode14stripUnaryPlusEv -__ZN3JSC13UnaryPlusNodeD1Ev -__ZN3JSCL21stringProtoFuncSubstrEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC15globalFuncIsNaNEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC17NumberConstructor11getCallDataERNS_8CallDataE -__ZN3JSCL21callNumberConstructorEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC11Interpreter15cti_op_post_incEPvz -__ZN3JSCL23stringProtoFuncFontsizeEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSCL24dateProtoFuncSetFullYearEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSCL23setNewValueFromDateArgsEPNS_9ExecStateENS_10JSValuePtrERKNS_7ArgListEib -__ZN3JSCL24dateProtoFuncToUTCStringEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSCL19stringProtoFuncLinkEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSCL9dateParseEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC11Interpreter21cti_op_loop_if_lesseqEPvz -__ZN3JSCL16mathProtoFuncExpEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC6RegExp6createEPNS_12JSGlobalDataERKNS_7UStringE -__ZN3JSCL21dateProtoFuncToStringEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC4WREC9Generator36generateParenthesesInvertedAssertionERNS_14MacroAssembler8JumpListE -__ZNK3JSC11Interpreter18retrieveLastCallerEPNS_9ExecStateERiRlRNS_7UStringERNS_10JSValuePtrE -__ZN3JSC9CodeBlock27lineNumberForBytecodeOffsetEPNS_9ExecStateEj -__ZN3JSCL23regExpProtoFuncToStringEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSCL18regExpObjectGlobalEPNS_9ExecStateERKNS_10IdentifierERKNS_12PropertySlotE -__ZN3JSCL22regExpObjectIgnoreCaseEPNS_9ExecStateERKNS_10IdentifierERKNS_12PropertySlotE -__ZN3JSCL21regExpObjectMultilineEPNS_9ExecStateERKNS_10IdentifierERKNS_12PropertySlotE -__ZN3JSC11Interpreter17cti_op_is_booleanEPvz -__ZNK3JSC12JSNumberCell11toPrimitiveEPNS_9ExecStateENS_22PreferredPrimitiveTypeE -__ZN3JSC4WREC14CharacterClass9nonspacesEv -__ZN3JSC4Heap15recordExtraCostEm -__ZN3WTF6VectorIN3JSC15StringJumpTableELm0EE15reserveCapacityEm -__ZN3WTF9HashTableINS_6RefPtrIN3JSC7UString3RepEEESt4pairIS5_NS2_14OffsetLocationEENS_18PairFirstExtractorIS8_EENS_7StrHashIS5_EENS_14PairHashTraitsINS_10HashTraitsIS5_EENSE_IS7_EEEESF_EC2ERKSI_ -__ZN3JSC11Interpreter20cti_op_switch_stringEPvz -__ZNK3JSC12JSNumberCell12toThisObjectEPNS_9ExecStateE -__ZN3JSCL22numberProtoFuncValueOfEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC12NumberObject11getJSNumberEv -__ZNK3JSC13UnaryPlusNode8opcodeIDEv +__ZN3JSC21ReadModifyResolveNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC11NewExprNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC17BytecodeGenerator13emitConstructEPNS_10RegisterIDES2_PNS_13ArgumentsNodeEjjj +__ZN3WTF6VectorIN3JSC20GetByIdExceptionInfoELm0EE14expandCapacityEm +__ZN3JSC8LessNodeD0Ev +__ZN3JSC17PrefixResolveNodeD0Ev +__ZN3JSC12ContinueNodeD0Ev +__ZN3JSC7ForNodeD0Ev +__ZN3JSC21ReadModifyResolveNodeD0Ev +__ZN3JSC11NewExprNodeD0Ev +__ZN3JSC3JIT11emit_op_notEPNS_11InstructionE +__ZN3JSC3JIT15emit_op_pre_incEPNS_11InstructionE +__ZN3JSC3JIT20emit_op_loop_if_lessEPNS_11InstructionE +__ZN3JSC3JIT16emitTimeoutCheckEv +__ZN3JSC3JIT20compileBinaryArithOpENS_8OpcodeIDEjjjNS_12OperandTypesE +__ZN3JSC3JIT11emit_op_subEPNS_11InstructionE +__ZN3JSC3JIT17emit_op_constructEPNS_11InstructionE +__ZN3JSC3JIT24emit_op_construct_verifyEPNS_11InstructionE +__ZN3JSC3JIT15emitSlow_op_notEPNS_11InstructionERPNS_13SlowCaseEntryE +__ZN3JSC3JIT19emitSlow_op_pre_incEPNS_11InstructionERPNS_13SlowCaseEntryE +__ZN3JSC3JIT24emitSlow_op_loop_if_lessEPNS_11InstructionERPNS_13SlowCaseEntryE +__ZN3JSC3JIT15emitSlow_op_addEPNS_11InstructionERPNS_13SlowCaseEntryE +__ZN3JSC3JIT28compileBinaryArithOpSlowCaseENS_8OpcodeIDERPNS_13SlowCaseEntryEjjjNS_12OperandTypesE +__ZN3JSC15AssemblerBuffer7putByteEi +__ZN3JSC12X86Assembler23X86InstructionFormatter11twoByteOp64ENS0_15TwoByteOpcodeIDEiNS_3X8610RegisterIDE +__ZN3JSC3JIT15emitSlow_op_subEPNS_11InstructionERPNS_13SlowCaseEntryE +__ZN3JSC3JIT21emitSlow_op_constructEPNS_11InstructionERPNS_13SlowCaseEntryE +__ZN3JSC3JIT27compileOpConstructSetupArgsEPNS_11InstructionE +__ZN3JSC3JIT28emitSlow_op_construct_verifyEPNS_11InstructionERPNS_13SlowCaseEntryE +__ZN3JSC7UString4fromEj +__ZN3JSC10Identifier11addSlowCaseEPNS_9ExecStateEPNS_7UString3RepE +__ZN3JSC8JITStubs10cti_op_notEPPv +__ZN3JSC8JITStubs24cti_op_get_by_id_genericEPPv +__ZN3JSC7JSArrayC2EN3WTF10PassRefPtrINS_9StructureEEERKNS_7ArgListE +__ZN3JSC7JSArray18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE +__ZN3JSCL24stringProtoFuncSubstringEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC8JITStubs31cti_op_construct_NotJSConstructEPPv +__ZN3JSC3JIT33privateCompilePatchGetArrayLengthENS_22AbstractMacroAssemblerINS_12X86AssemblerEE22ProcessorReturnAddressE +__ZN3JSC8JITStubs27cti_op_get_by_id_proto_listEPPv +__ZN3JSC3JIT30privateCompileGetByIdProtoListEPNS_17StructureStubInfoEPNS_30PolymorphicAccessStructureListEiPNS_9StructureES6_mP +__ZN3JSC3JIT16patchGetByIdSelfEPNS_17StructureStubInfoEPNS_9StructureEmNS_22AbstractMacroAssemblerINS_12X86AssemblerEE22Process +__ZN3JSC14StructureChainC1EPNS_9StructureE +__ZN3JSC14StructureChainC2EPNS_9StructureE +__ZN3JSC3JIT26privateCompileGetByIdChainEPNS_17StructureStubInfoEPNS_9StructureEPNS_14StructureChainEmmNS_22AbstractMacroAssemb +__ZN3JSC8JITStubs23cti_op_put_by_id_secondEPPv +__ZN3JSC8JITStubs15tryCachePutByIDEPNS_9ExecStateEPNS_9CodeBlockEPvNS_7JSValueERKNS_15PutPropertySlotE +__ZN3JSC8JITStubs24cti_op_put_by_id_genericEPPv +__ZN3JSC8JITStubs26cti_op_tear_off_activationEPPv +__ZN3JSC8JITStubs21cti_op_ret_scopeChainEPPv +__ZN3JSC17BytecodeGenerator16emitPutScopedVarEmiPNS_10RegisterIDENS_7JSValueE +__ZN3JSC3JIT22emit_op_get_scoped_varEPNS_11InstructionE +__ZN3JSC3JIT22emit_op_put_scoped_varEPNS_11InstructionE +__ZN3JSC3JIT29emitPutVariableObjectRegisterENS_3X8610RegisterIDES2_i +__ZN3JSC12X86Assembler7movq_rrENS_3X8610RegisterIDENS1_13XMMRegisterIDE +__ZN3WTF20TCMalloc_ThreadCache18DestroyThreadCacheEPv +__ZN3WTF20TCMalloc_ThreadCache11DeleteCacheEPS0_ +__ZN3JSC15StrictEqualNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC15StrictEqualNodeD0Ev +__ZN3JSC3JIT16emit_op_stricteqEPNS_11InstructionE +__ZN3JSC3JIT17compileOpStrictEqEPNS_11InstructionENS0_21CompileOpStrictEqTypeE +__ZN3JSC3JIT20emitSlow_op_stricteqEPNS_11InstructionERPNS_13SlowCaseEntryE +__ZN3JSC8JITStubs15cti_op_stricteqEPPv __ZN3WTF12detachThreadEj __ZN3WTFL26pthreadHandleForIdentifierEj __ZN3WTFL31clearPthreadHandleForIdentifierEj -__ZN3WTF15ThreadConditionD1Ev -__ZN3WTF23waitForThreadCompletionEjPPv -__ZN3WTF20TCMalloc_ThreadCache18DestroyThreadCacheEPv -__ZN3WTF20TCMalloc_ThreadCache11DeleteCacheEPS0_ -__ZN3WTF14FastMallocZone10statisticsEP14_malloc_zone_tP19malloc_statistics_t -__ZN3JSC4Heap26protectedGlobalObjectCountEv -__ZNK3JSC11ResolveNode10isLocationEv -__ZNK3JSC11ResolveNode13isResolveNodeEv -__ZN3JSC17AssignResolveNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC17BytecodeGenerator18findScopedPropertyERKNS_10IdentifierERiRmbRPNS_8JSObjectE +__ZN3WTF6VectorIPNS0_IN3JSC10IdentifierELm64EEELm32EE14expandCapacityEmPKS4_ +__ZN3WTF6VectorIPNS0_IN3JSC10IdentifierELm64EEELm32EE15reserveCapacityEm +__ZN3JSC8NullNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC8NullNodeD0Ev +__ZN3WTF7HashMapISt4pairINS_6RefPtrIN3JSC7UString3RepEEEjEPNS3_9StructureENS3_28StructureTransitionTableHashENS3_34StructureTra +__ZN3WTF9HashTableISt4pairINS_6RefPtrIN3JSC7UString3RepEEEjES1_IS7_PNS3_9StructureEENS_18PairFirstExtractorISA_EENS3_28Structur +__ZN3JSC9Structure22materializePropertyMapEv +__ZN3JSC15TypeOfValueNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC15TypeOfValueNodeD0Ev +__ZN3JSC12NotEqualNodeD0Ev +__ZN3JSC3JIT11emit_op_neqEPNS_11InstructionE +__ZN3JSC3JIT15emitSlow_op_neqEPNS_11InstructionERPNS_13SlowCaseEntryE +__ZN3JSC8JITStubs13cti_op_typeofEPPv +__ZN3JSC20jsTypeStringForValueEPNS_9ExecStateENS_7JSValueE +__ZN3JSC8JITStubs10cti_op_neqEPPv +__ZN3JSC14ExecutablePool13systemReleaseERKNS0_10AllocationE +__ZN3WTF6VectorItLm0EE14expandCapacityEmPKt +__ZNK3JSC10NumberNode8isNumberEv +__ZNK3JSC14ExpressionNode10isLocationEv +__ZN3WTF6VectorIPN3JSC10RegisterIDELm32EE14expandCapacityEm +__ZNK3JSC11BooleanNode6isPureERNS_17BytecodeGeneratorE +__ZN3JSC4Yarr13newlineCreateEv +__ZN3JSC12X86Assembler23X86InstructionFormatter15emitRexIfNeededEiii +__ZN3JSC12X86Assembler23X86InstructionFormatter11memoryModRMEiNS_3X8610RegisterIDES3_ii +__ZN3JSC17TypeOfResolveNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE __ZN3JSC17BytecodeGenerator15emitResolveBaseEPNS_10RegisterIDERKNS_10IdentifierE -__ZN3JSC15DotAccessorNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC17BytecodeGenerator12newTemporaryEv -__ZN3JSC10StringNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC17BytecodeGenerator8emitLoadEPNS_10RegisterIDERKNS_10IdentifierE -__ZN3WTF9HashTableIPN3JSC7UString3RepESt4pairIS4_PNS1_8JSStringEENS_18PairFirstExtractorIS8_EENS1_17IdentifierRepHashENS_14PairHashTraitsINS_10HashTraitsIS4_EENSD_IS7_EEEESE_E6expandEv -__ZN3JSC16ArgumentListNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC10StringNodeD1Ev -__ZN3JSC16ArgumentListNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC16ArgumentListNodeD1Ev -__ZN3JSC11Interpreter19cti_op_resolve_baseEPvz -__ZN3JSC14JSGlobalObject3putEPNS_9ExecStateERKNS_10IdentifierENS_10JSValuePtrERNS_15PutPropertySlotE -__ZNK3JSC8JSString8toStringEPNS_9ExecStateE -__ZN3JSC13AssignDotNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZNK3JSC10StringNode6isPureERNS_17BytecodeGeneratorE -__ZN3JSC13ParameterNode12releaseNodesERNS_12NodeReleaserE -__ZN3WTF6VectorISt4pairIN3JSC10IdentifierEjELm0EEaSERKS5_ -__ZNK3JSC7UString14toStrictUInt32EPb -__ZN3JSC17BytecodeGenerator8emitMoveEPNS_10RegisterIDES2_ -__ZN3JSC16VarStatementNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC17BytecodeGenerator20emitLoadGlobalObjectEPNS_10RegisterIDEPNS_8JSObjectE +__ZN3WTF6VectorIN3JSC7JSValueELm0EE14expandCapacityEm +__ZNK3JSC7AddNode5isAddEv +__ZN3JSC12BinaryOpNode10emitStrcatERNS_17BytecodeGeneratorEPNS_10RegisterIDES4_PNS_21ReadModifyResolveNodeE +__ZNK3JSC10StringNode8isStringEv +__ZNK3JSC14ExpressionNode8isStringEv +__ZN3JSC17BytecodeGenerator10emitStrcatEPNS_10RegisterIDES2_i +__ZN3JSC4Yarr12spacesCreateEv +__ZN3JSC4Yarr15nonspacesCreateEv +__ZN3JSC8WithNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC17BytecodeGenerator13emitPushScopeEPNS_10RegisterIDE +__ZN3JSC23MacroAssemblerX86Common4moveENS_22AbstractMacroAssemblerINS_12X86AssemblerEE5Imm32ENS_3X8610RegisterIDE +__ZN3JSC14MacroAssembler4peekENS_3X8610RegisterIDEi +__ZN3JSC4Yarr14RegexGenerator12atEndOfInputEv +__ZN3JSC22AbstractMacroAssemblerINS_12X86AssemblerEE8JumpList6linkToENS2_5LabelEPS2_ +__ZN3JSC14MacroAssembler4pokeENS_3X8610RegisterIDEi +__ZN3JSC21FunctionCallValueNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC9ArrayNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC17BytecodeGenerator12emitNewArrayEPNS_10RegisterIDEPNS_11ElementNodeE +__ZN3JSC23CallFunctionCallDotNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC17BytecodeGenerator25emitJumpIfNotFunctionCallEPNS_10RegisterIDEPNS_5LabelE +__ZN3JSC4Yarr14RegexGenerator29generateAssertionWordBoundaryERNS1_19TermGenerationStateE +__ZN3JSC4Yarr14RegexGenerator22matchAssertionWordcharERNS1_19TermGenerationStateERNS_22AbstractMacroAssemblerINS_12X86Assembler +__ZN3WTF6VectorIPN3JSC4Yarr18PatternDisjunctionELm4EE14expandCapacityEm +__ZL14compileBracketiPiPPhPPKtS3_P9ErrorCodeiS_S_R11CompileData +__ZN3JSC9ThrowNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC9CommaNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3WTF9HashTableIdSt4pairIdN3JSC7JSValueEENS_18PairFirstExtractorIS4_EENS_9FloatHashIdEENS_14PairHashTraitsINS_10HashTraitsId +__ZN3JSC17TypeOfResolveNodeD0Ev +__ZN3JSC18NotStrictEqualNodeD0Ev +__ZN3JSC8WithNodeD0Ev +__ZN3JSC21FunctionCallValueNodeD0Ev +__ZN3JSC9ArrayNodeD0Ev +__ZN3JSC11ElementNodeD0Ev +__ZN3JSC23CallFunctionCallDotNodeD0Ev +__ZN3JSC9ThrowNodeD0Ev +__ZN3JSC9CommaNodeD0Ev +__ZN3JSC3JIT23emit_op_unexpected_loadEPNS_11InstructionE +__ZN3JSC3JIT20emit_op_to_primitiveEPNS_11InstructionE +__ZN3JSC3JIT14emit_op_strcatEPNS_11InstructionE +__ZN3JSC3JIT17emit_op_nstricteqEPNS_11InstructionE +__ZN3JSC3JIT18emit_op_push_scopeEPNS_11InstructionE +__ZN3JSC3JIT17emit_op_new_arrayEPNS_11InstructionE +__ZN3JSC3JIT16emit_op_jneq_ptrEPNS_11InstructionE +__ZN3JSC3JIT13emit_op_throwEPNS_11InstructionE +__ZN3JSC3JIT14emit_op_jnlessEPNS_11InstructionE +__ZN3JSC3JIT24emitSlow_op_to_primitiveEPNS_11InstructionERPNS_13SlowCaseEntryE +__ZN3JSC3JIT21emitSlow_op_nstricteqEPNS_11InstructionERPNS_13SlowCaseEntryE +__ZN3JSC3JIT18emitSlow_op_jnlessEPNS_11InstructionERPNS_13SlowCaseEntryE +__ZL15makePostfixNodePvPN3JSC14ExpressionNodeENS0_8OperatorEiii +__ZN3JSC18PostfixResolveNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC18PostfixResolveNodeD0Ev +__ZN3JSC8JITStubs22cti_op_call_arityCheckEPPv +__ZN3JSC19FunctionConstructor16getConstructDataERNS_13ConstructDataE +__ZN3JSCL32constructWithFunctionConstructorEPNS_9ExecStateEPNS_8JSObjectERKNS_7ArgListE +__ZN3JSC17constructFunctionEPNS_9ExecStateERKNS_7ArgListERKNS_10IdentifierERKNS_7UStringEi +__ZN3JSCplERKNS_7UStringES2_ +__ZN3JSC7UString6appendERKS0_ +__ZN3JSC7UString17expandPreCapacityEi +__ZN3WTF11fastReallocILb0EEEPvS1_m +__ZN3JSC14JSGlobalObject3putEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueERNS_15PutPropertySlotE +__ZL11makeDivNodePvPN3JSC14ExpressionNodeES2_b __ZL12makeMultNodePvPN3JSC14ExpressionNodeES2_b -__ZN3JSC14ExpressionNode14stripUnaryPlusEv -__ZN3JSC10NumberNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC17BytecodeGenerator8emitLoadEPNS_10RegisterIDEd -__ZN3WTF9HashTableIdSt4pairIdN3JSC10JSValuePtrEENS_18PairFirstExtractorIS4_EENS_9FloatHashIdEENS_14PairHashTraitsINS_10HashTraitsIdEENSA_IS3_EEEESB_E6expandEv -__ZNK3JSC7AddNode8opcodeIDEv -__ZNK3JSC8MultNode8opcodeIDEv -__ZN3JSC10NumberNodeD1Ev -__ZN3JSC8MultNodeD1Ev -__ZN3JSC3JIT23compileFastArith_op_mulEPNS_11InstructionE -__ZN3JSC14MacroAssembler4jz32ENS_3X8610RegisterIDENS0_5Imm32E -__ZN3JSC12X86Assembler7subl_irEiNS_3X8610RegisterIDE -__ZN3JSC3JIT20compileBinaryArithOpENS_8OpcodeIDEjjjNS_12OperandTypesE -__ZN3JSC9CodeBlock19isKnownNotImmediateEi -__ZN3JSC12X86Assembler23X86InstructionFormatter11memoryModRMEiNS_3X8610RegisterIDEi -__ZN3JSC12X86Assembler23X86InstructionFormatter9twoByteOpENS0_15TwoByteOpcodeIDEiNS_3X8610RegisterIDEi -__ZN3JSC12X86Assembler8sarl_i8rEiNS_3X8610RegisterIDE -__ZN3JSC15AssemblerBuffer7putByteEi -__ZN3JSC12X86Assembler23X86InstructionFormatter9twoByteOpENS0_15TwoByteOpcodeIDEiNS_3X8610RegisterIDE -__ZN3JSC3JIT42putDoubleResultToJSNumberCellOrJSImmediateENS_3X8613XMMRegisterIDENS1_10RegisterIDEjPNS_12X86Assembler6JmpSrcES2_S3_S3_ -__ZN3JSC3JIT27compileFastArithSlow_op_mulEPNS_11InstructionERPNS_13SlowCaseEntryE -__ZN3JSC3JIT27compileFastArithSlow_op_addEPNS_11InstructionERPNS_13SlowCaseEntryE -__ZN3JSC3JIT28compileBinaryArithOpSlowCaseENS_8OpcodeIDERPNS_13SlowCaseEntryEjjjNS_12OperandTypesE -__ZN3JSC11Interpreter31cti_op_construct_NotJSConstructEPvz -__ZN3JSC15DateConstructor16getConstructDataERNS_13ConstructDataE -__ZN3JSCL28constructWithDateConstructorEPNS_9ExecStateEPNS_8JSObjectERKNS_7ArgListE -__ZN3JSC13constructDateEPNS_9ExecStateERKNS_7ArgListE -__ZN3JSC13DatePrototype18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE -__ZN3JSCL20dateProtoFuncGetTimeEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZNK3JSC12DateInstance9classInfoEv -__ZN3JSC11Interpreter10cti_op_addEPvz -__ZN3JSC12jsNumberCellEPNS_12JSGlobalDataEd -__ZNK3JSC12JSNumberCell8toNumberEPNS_9ExecStateE -__ZN3JSC11BooleanNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC6IfNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZNK3JSC9BlockNode7isBlockEv -__ZN3JSC9BlockNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC9BlockNode12releaseNodesERNS_12NodeReleaserE +__ZN3JSC9WhileNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC7ModNodeD0Ev +__ZN3JSC7DivNodeD0Ev +__ZN3JSC8MultNodeD0Ev +__ZN3JSC9WhileNodeD0Ev +__ZN3JSC3JIT11emit_op_modEPNS_11InstructionE +__ZN3JSC3JIT11emit_op_mulEPNS_11InstructionE +__ZN3JSC3JIT20emit_op_loop_if_trueEPNS_11InstructionE +__ZN3JSC3JIT15emitSlow_op_modEPNS_11InstructionERPNS_13SlowCaseEntryE +__ZN3JSC3JIT15emitSlow_op_mulEPNS_11InstructionERPNS_13SlowCaseEntryE +__ZN3JSC3JIT24emitSlow_op_loop_if_trueEPNS_11InstructionERPNS_13SlowCaseEntryE +__ZN3JSCL26stringProtoFuncLastIndexOfEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZNK3JSC7JSValue20toIntegerPreserveNaNEPNS_9ExecStateE +__ZN3JSC8JITStubs10cti_op_divEPPv +__ZN3JSC3JIT22emit_op_loop_if_lesseqEPNS_11InstructionE +__ZN3JSC3JIT26emitSlow_op_loop_if_lesseqEPNS_11InstructionERPNS_13SlowCaseEntryE +__ZN3JSC8JITStubs13cti_op_lesseqEPPv +__ZN3JSCL20stringProtoFuncSplitEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC19constructEmptyArrayEPNS_9ExecStateE +__ZN3JSC7JSArray3putEPNS_9ExecStateEjNS_7JSValueE +__ZN3JSC7JSArray11putSlowCaseEPNS_9ExecStateEjNS_7JSValueE +__ZN3JSC14ArrayPrototype18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE +__ZN3JSCL18arrayProtoFuncJoinEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3WTF7HashSetIPN3JSC8JSObjectENS_7PtrHashIS3_EENS_10HashTraitsIS3_EEE3addERKS3_ +__ZN3WTF9HashTableIPN3JSC8JSObjectES3_NS_17IdentityExtractorIS3_EENS_7PtrHashIS3_EENS_10HashTraitsIS3_EES9_E6rehashEi +__ZN3WTF6VectorItLm256EE6appendItEEvPKT_m +__ZN3WTF6VectorItLm256EE14expandCapacityEm +__ZN3WTF6VectorIPN3JSC12CallLinkInfoELm0EE15reserveCapacityEm +__ZN3JSC4Heap7collectEv +__ZN3JSC4Heap30markStackObjectsConservativelyEv +__ZN3JSC4Heap31markCurrentThreadConservativelyEv +__ZN3JSC4Heap39markCurrentThreadConservativelyInternalEv +__ZN3JSC4Heap18markConservativelyEPvS1_ +__ZN3JSC7JSArray4markEv +__ZN3JSC8JSObject4markEv __ZN3JSC10JSFunction4markEv +__ZN3JSC6JSCell4markEv +__ZN3JSC14JSGlobalObject4markEv +__ZN3JSC15JSWrapperObject4markEv +__ZN3JSC18GlobalEvalFunction4markEv __ZN3JSC16FunctionBodyNode4markEv -__ZN3JSC23FunctionCallResolveNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC17BytecodeGenerator19emitResolveFunctionEPNS_10RegisterIDES2_RKNS_10IdentifierE -__ZNK3JSC12NotEqualNode8opcodeIDEv -__ZNK3JSC8LessNode8opcodeIDEv -__ZN3JSC23FunctionCallResolveNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC23FunctionCallResolveNodeD1Ev -__ZN3JSC12NotEqualNodeD1Ev -__ZN3JSC8LessNodeD1Ev -__ZN3JSC11Interpreter19cti_op_resolve_funcEPvz -__ZN3JSC11Interpreter22cti_op_call_JSFunctionEPvz -__ZN3JSC16FunctionBodyNode16generateBytecodeEPNS_14ScopeChainNodeE -__ZN3JSC6Parser14reparseInPlaceEPNS_12JSGlobalDataEPNS_16FunctionBodyNodeE -__ZN3JSC17BytecodeGeneratorC2EPNS_16FunctionBodyNodeEPKNS_8DebuggerERKNS_10ScopeChainEPN3WTF7HashMapINS9_6RefPtrINS_7UString3RepEEENS_16SymbolTableEntryENS_17IdentifierRepHashENS9_10HashTraitsISE_EENS_26SymbolTableIndexHashTraitsEEEPNS_9CodeBlockE -__ZN3JSC16FunctionBodyNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZNK3JSC16JSVariableObject16isVariableObjectEv -__ZN3JSC17BytecodeGenerator16emitGetScopedVarEPNS_10RegisterIDEmiNS_10JSValuePtrE -__ZNK3JSC13StatementNode12isReturnNodeEv -__ZN3JSC17BytecodeGenerator10emitReturnEPNS_10RegisterIDE -__ZN3JSC11Interpreter23cti_vm_dontLazyLinkCallEPvz -__ZN3JSC11Interpreter23cti_register_file_checkEPvz -__ZN3JSC17BytecodeGenerator12addParameterERKNS_10IdentifierE -__ZNK3JSC13StatementNode7isBlockEv -__ZN3JSC10ReturnNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZNK3JSC14JSGlobalObject14isDynamicScopeEv -__ZN3JSC10ReturnNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC10ReturnNodeD1Ev -__ZN3JSC11concatenateEPNS_7UString3RepES2_ -__ZN3JSC11Interpreter23cti_op_get_by_id_secondEPvz -__ZN3JSC11Interpreter18tryCTICacheGetByIDEPNS_9ExecStateEPNS_9CodeBlockEPvNS_10JSValuePtrERKNS_10IdentifierERKNS_12PropertySlotE -__ZN3JSC3JIT26privateCompileGetByIdProtoEPNS_17StructureStubInfoEPNS_9StructureES4_mPvPNS_9ExecStateE -__ZN3JSC12X86Assembler23X86InstructionFormatter9oneByteOpENS0_15OneByteOpcodeIDEiPv -__ZNK3JSC11ResolveNode6isPureERNS_17BytecodeGeneratorE __ZN3JSC9CodeBlock4markEv -__ZN3JSC19BracketAccessorNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC17BytecodeGenerator12emitGetByValEPNS_10RegisterIDES2_S2_ -__ZN3JSC10JSFunction18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE -__ZN3JSC11Interpreter28cti_op_construct_JSConstructEPvz +__ZN3JSC4Heap20markProtectedObjectsEv +__ZN3JSC12SmallStrings4markEv +__ZN3JSC4Heap5sweepILNS_8HeapTypeE0EEEmv +__ZN3JSC14JSGlobalObjectD2Ev +__ZN3JSC17FunctionPrototypeD1Ev +__ZN3JSC15ObjectPrototypeD1Ev +__ZN3JSC14ArrayPrototypeD1Ev +__ZN3JSC15StringPrototypeD1Ev +__ZN3JSC16BooleanPrototypeD1Ev +__ZN3JSC15NumberPrototypeD1Ev +__ZN3JSC13DatePrototypeD1Ev +__ZN3JSC12DateInstanceD2Ev +__ZN3JSC15RegExpPrototypeD1Ev +__ZN3JSC14ErrorPrototypeD1Ev +__ZN3JSC20NativeErrorPrototypeD1Ev +__ZN3JSC17ObjectConstructorD1Ev +__ZN3JSC19FunctionConstructorD1Ev +__ZN3JSC16ArrayConstructorD1Ev +__ZN3JSC17StringConstructorD1Ev +__ZN3JSC18BooleanConstructorD1Ev +__ZN3JSC17NumberConstructorD1Ev +__ZN3JSC15DateConstructorD1Ev +__ZN3JSC17RegExpConstructorD1Ev +__ZN3JSC16ErrorConstructorD1Ev +__ZN3JSC22NativeErrorConstructorD1Ev +__ZN3JSC10MathObjectD1Ev +__ZN3JSC18GlobalEvalFunctionD1Ev +__ZN3JSC8JSObjectD1Ev +__ZN3JSC9CodeBlock13unlinkCallersEv +__ZN3WTF6VectorINS_6RefPtrIN3JSC6RegExpEEELm0EE6shrinkEm +__ZN3JSC12JSActivationD1Ev +__ZN3JSC12JSActivationD2Ev +__ZN3JSC12RegExpObjectD1Ev +__ZN3JSC18RegExpMatchesArrayD1Ev +__ZN3JSC4Heap5sweepILNS_8HeapTypeE1EEEmv +__ZN3JSC20globalFuncParseFloatEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3WTF17TCMalloc_PageHeap3NewEm +__ZN3JSC8JITStubs28cti_op_construct_JSConstructEPPv __ZN3JSC8JSObject17createInheritorIDEv -__ZL15makePostfixNodePvPN3JSC14ExpressionNodeENS0_8OperatorEiii -__ZNK3JSC7ForNode6isLoopEv -__ZN3JSC7ForNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC17BytecodeGenerator13newLabelScopeENS_10LabelScope4TypeEPKNS_10IdentifierE -__ZN3JSC17BytecodeGenerator8emitJumpEPNS_5LabelE +__ZNK3JSC19BracketAccessorNode10isLocationEv +__ZNK3JSC19BracketAccessorNode21isBracketAccessorNodeEv __ZN3JSC17AssignBracketNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC8ThisNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE __ZN3JSC17BytecodeGenerator12emitPutByValEPNS_10RegisterIDES2_S2_ -__ZN3JSC18PostfixResolveNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC17BytecodeGenerator14emitJumpIfTrueEPNS_10RegisterIDEPNS_5LabelE -__ZN3JSC7ForNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC7ForNodeD1Ev -__ZN3JSC18PostfixResolveNodeD1Ev -__ZN3JSC17AssignBracketNodeD1Ev -__ZN3JSC17AssignBracketNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC8ThisNodeD1Ev -__ZN3JSC3JIT27compileFastArith_op_pre_incEj -__ZN3JSC12X86Assembler2joEv -__ZN3JSC3JIT19emitSlowScriptCheckEv -__ZN3JSC3JIT31compileFastArithSlow_op_pre_incEjRPNS_13SlowCaseEntryE -__ZN3JSC11Interpreter22cti_op_call_arityCheckEPvz -__ZN3JSC10JSFunction15argumentsGetterEPNS_9ExecStateERKNS_10IdentifierERKNS_12PropertySlotE -__ZNK3JSC11Interpreter17retrieveArgumentsEPNS_9ExecStateEPNS_10JSFunctionE -__ZN3JSC9Arguments18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE -__ZN3JSC11Interpreter17cti_op_get_by_valEPvz -__ZN3JSC9Arguments18getOwnPropertySlotEPNS_9ExecStateEjRNS_12PropertySlotE -__ZN3JSC11Interpreter17cti_op_put_by_valEPvz -__ZN3JSC8JSObject3putEPNS_9ExecStateEjNS_10JSValuePtrE -__ZN3JSC11Interpreter24cti_op_get_by_id_genericEPvz -__ZN3JSCL21dateProtoFuncGetMonthEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZNK3JSC12DateInstance21msToGregorianDateTimeEdbRNS_17GregorianDateTimeE -__ZN3JSC21msToGregorianDateTimeEdbRNS_17GregorianDateTimeE -__ZN3JSCL12getDSTOffsetEdd -__ZN3JSC8JSObject18getOwnPropertySlotEPNS_9ExecStateEjRNS_12PropertySlotE -__ZN3JSC8JSObject18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE -__ZN3JSCL20dateProtoFuncGetDateEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC11concatenateEPNS_7UString3RepEi -__ZN3JSC21ReadModifyResolveNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC21ReadModifyResolveNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSCL20dateProtoFuncGetYearEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZL11makeSubNodePvPN3JSC14ExpressionNodeES2_b -__ZN3JSC10IfElseNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZNK3JSC10LessEqNode8opcodeIDEv -__ZNK3JSC7SubNode8opcodeIDEv -__ZN3JSC10LessEqNodeD1Ev -__ZN3JSC7SubNodeD1Ev -__ZN3JSC3JIT23compileFastArith_op_subEPNS_11InstructionE -__ZN3JSC3JIT27compileFastArithSlow_op_subEPNS_11InstructionERPNS_13SlowCaseEntryE -__ZN3JSCL21dateProtoFuncGetHoursEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC11Interpreter13cti_op_lesseqEPvz -__ZN3JSCL23dateProtoFuncGetMinutesEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZNK3JSC13GreaterEqNode8opcodeIDEv -__ZN3JSC13GreaterEqNodeD1Ev -__ZN3WTF9HashTableINS_6RefPtrIN3JSC7UString3RepEEESt4pairIS5_NS2_16SymbolTableEntryEENS_18PairFirstExtractorIS8_EENS2_17IdentifierRepHashENS_14PairHashTraitsINS_10HashTraitsIS5_EENS2_26SymbolTableIndexHashTraitsEEESE_E4findIS5_NS_22IdentityHashTranslatorIS5_S8_SB_EEEENS_17HashTableIteratorIS5_S8_SA_SB_SG_SE_EERKT_ -__ZN3JSC8WithNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC17BytecodeGenerator13emitPushScopeEPNS_10RegisterIDE -__ZN3WTF6VectorIN3JSC18ControlFlowContextELm0EE14expandCapacityEm -__ZN3JSC11Interpreter9cti_op_eqEPvz -__ZN3JSCeqERKNS_7UStringES2_ -__ZN3JSC11Interpreter17cti_op_push_scopeEPvz -__ZN3JSC11Interpreter14cti_op_resolveEPvz -__ZN3JSC11Interpreter16cti_op_pop_scopeEPvz -__ZN3JSC8NullNodeD1Ev -__ZN3JSC8NullNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC17BytecodeGenerator20emitNextPropertyNameEPNS_10RegisterIDES2_PNS_5LabelE -__ZN3JSC9ForInNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC11Interpreter17cti_op_get_pnamesEPvz -__ZN3JSC22JSPropertyNameIterator6createEPNS_9ExecStateENS_10JSValuePtrE -__ZN3JSC8JSObject16getPropertyNamesEPNS_9ExecStateERNS_17PropertyNameArrayE -__ZN3JSC9Structure26getEnumerablePropertyNamesEPNS_9ExecStateERNS_17PropertyNameArrayEPNS_8JSObjectE -__ZN3JSC9Structure34getEnumerablePropertyNamesInternalERNS_17PropertyNameArrayE -__ZNK3JSC6JSCell9classInfoEv -__ZN3JSC9Structure26createCachedPrototypeChainEv -__ZN3JSC14StructureChainC1EPNS_9StructureE -__ZN3JSC11Interpreter17cti_op_next_pnameEPvz -__ZN3JSC23structureChainsAreEqualEPNS_14StructureChainES1_ -__ZN3JSC13jsOwnedStringEPNS_12JSGlobalDataERKNS_7UStringE -__ZN3JSC11Interpreter10cti_op_neqEPvz -__ZN3JSC16globalFuncEscapeEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC11JSImmediate8toStringENS_10JSValuePtrE -__ZN3JSC7UString4fromEi -__ZN3JSC7UString6appendERKS0_ -__ZN3JSC22JSPropertyNameIterator10invalidateEv -__ZN3JSCL21dateProtoFuncSetMonthEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSCL20dateProtoFuncSetDateEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSCplERKNS_7UStringES2_ -__ZN3JSC14ExecutablePool13systemReleaseERKNS0_10AllocationE -__ZNK3JSC8JSString11toPrimitiveEPNS_9ExecStateENS_22PreferredPrimitiveTypeE +__ZN3JSC14PostfixDotNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC17ReadModifyDotNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC17AssignBracketNodeD0Ev +__ZN3JSC14PostfixDotNodeD0Ev +__ZN3JSC17ReadModifyDotNodeD0Ev +__ZN3JSC3JIT18emit_op_put_by_valEPNS_11InstructionE +__ZN3JSC3JIT22emitSlow_op_put_by_valEPNS_11InstructionERPNS_13SlowCaseEntryE __ZN3JSC16ArrayConstructor16getConstructDataERNS_13ConstructDataE __ZN3JSCL29constructWithArrayConstructorEPNS_9ExecStateEPNS_8JSObjectERKNS_7ArgListE __ZN3JSCL27constructArrayWithSizeQuirkEPNS_9ExecStateERKNS_7ArgListE -__ZL14makePrefixNodePvPN3JSC14ExpressionNodeENS0_8OperatorEiii -__ZN3JSC13PrefixDotNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZNK3JSC9WhileNode6isLoopEv -__ZN3JSC9WhileNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC9WhileNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC13PrefixDotNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC13PrefixDotNodeD1Ev -__ZN3JSC9WhileNodeD1Ev -__ZN3JSC3JIT28compileFastArith_op_post_incEjj -__ZN3JSC3JIT32compileFastArithSlow_op_post_incEjjRPNS_13SlowCaseEntryE -__ZN3JSC11Interpreter22cti_op_push_activationEPvz -__ZN3JSC12JSActivationC1EPNS_9ExecStateEN3WTF10PassRefPtrINS_16FunctionBodyNodeEEE +__ZN3JSC8JITStubs23cti_op_put_by_val_arrayEPPv +__ZN3JSC8JITStubs13cti_op_strcatEPPv +__ZN3JSC7UString3Rep15reserveCapacityEi +__ZN3JSC7UString13appendNumericEi +__ZN3JSC11concatenateEPNS_7UString3RepEi __ZN3JSC12JSActivation18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE -__ZL11makeDivNodePvPN3JSC14ExpressionNodeES2_b -__ZN3JSC15ConditionalNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZNK3JSC7DivNode8opcodeIDEv -__ZN3JSC15ConditionalNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC15ConditionalNodeD1Ev -__ZN3JSC7DivNodeD1Ev -__ZN3JSC7JSArrayC2EN3WTF10PassRefPtrINS_9StructureEEEj -__ZN3JSC11Interpreter23cti_op_put_by_val_arrayEPvz -__ZN3JSC7JSArray3putEPNS_9ExecStateEjNS_10JSValuePtrE -__ZN3JSC7JSArray3putEPNS_9ExecStateERKNS_10IdentifierENS_10JSValuePtrERNS_15PutPropertySlotE -__ZN3JSC12StringObject3putEPNS_9ExecStateERKNS_10IdentifierENS_10JSValuePtrERNS_15PutPropertySlotE -__ZN3JSC7JSArray18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE -__ZN3JSC11Interpreter10cti_op_divEPvz -__ZN3JSC3JIT16patchGetByIdSelfEPNS_17StructureStubInfoEPNS_9StructureEmPv -__ZN3JSC3JIT33privateCompilePatchGetArrayLengthEPv -__ZN3JSC11Interpreter23cti_op_put_by_id_secondEPvz -__ZN3JSC11Interpreter18tryCTICachePutByIDEPNS_9ExecStateEPNS_9CodeBlockEPvNS_10JSValuePtrERKNS_15PutPropertySlotE -__ZN3JSCL19cachePrototypeChainEPNS_9ExecStateEPNS_9StructureE -__ZN3JSC3JIT31privateCompilePutByIdTransitionEPNS_17StructureStubInfoEPNS_9StructureES4_mPNS_14StructureChainEPv -__ZN3JSC9Structure22materializePropertyMapEv -__ZN3JSC3JIT19patchPutByIdReplaceEPNS_17StructureStubInfoEPNS_9StructureEmPv -__ZN3JSCL21resizePropertyStorageEPNS_8JSObjectEii -__ZN3JSC8JSObject23allocatePropertyStorageEmm -__ZN3JSC11Interpreter14cti_op_pre_incEPvz -__ZN3JSCL21stringProtoFuncCharAtEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZNK3JSC12StringObject12toThisStringEPNS_9ExecStateE -__ZN3JSC11Interpreter26cti_op_tear_off_activationEPvz -__ZN3JSC11Interpreter21cti_op_ret_scopeChainEPvz -__ZN3JSC11Interpreter27cti_op_get_by_id_proto_listEPvz -__ZN3JSC3JIT30privateCompileGetByIdProtoListEPNS_17StructureStubInfoEPNS_30PolymorphicAccessStructureListEiPNS_9StructureES6_mPNS_9ExecStateE -__ZN3JSC12JSActivationD0Ev -__ZN3JSCL26stringProtoFuncToLowerCaseEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC8JSString14toThisJSStringEPNS_9ExecStateE -__ZN3JSC7JSArray11putSlowCaseEPNS_9ExecStateEjNS_10JSValuePtrE -__ZN3WTF11fastReallocILb0EEEPvS1_m -__ZN3JSCL24stringProtoFuncSubstringEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC11jsSubstringEPNS_12JSGlobalDataERKNS_7UStringEjj -__ZN3JSCL20stringProtoFuncSplitEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC19constructEmptyArrayEPNS_9ExecStateE -__ZNK3JSC11BooleanNode6isPureERNS_17BytecodeGeneratorE -__ZNK3JSC7ModNode8opcodeIDEv -__ZN3JSC7ModNodeD1Ev -__ZN3JSC3JIT23compileFastArith_op_modEjjj -__ZN3JSC3JIT27compileFastArithSlow_op_modEjjjRPNS_13SlowCaseEntryE -__ZN3JSCL23dateProtoFuncGetSecondsEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC17BytecodeGenerator16emitPutScopedVarEmiPNS_10RegisterIDENS_10JSValuePtrE -__ZN3JSC18globalFuncUnescapeEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC7UString6appendEt -__ZN3JSC11Interpreter19cti_vm_lazyLinkCallEPvz -__ZN3JSC3JIT8linkCallEPNS_10JSFunctionEPNS_9CodeBlockEPvPNS_12CallLinkInfoEi -__ZN3WTF6VectorIPN3JSC12CallLinkInfoELm0EE14expandCapacityEm -__ZN3JSC12X86Assembler7cmpl_imEiiNS_3X8610RegisterIDE -__ZN3JSC9CodeBlock13unlinkCallersEv -__ZNK3JSC8JSString9toBooleanEPNS_9ExecStateE -__ZN3JSC11Interpreter10cti_op_mulEPvz -__ZN3JSC11Interpreter18cti_op_to_jsnumberEPvz -__ZN3JSCL30dateProtoFuncGetTimezoneOffsetEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSCL18mathProtoFuncFloorEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSCL13jsAddSlowCaseEPNS_9ExecStateENS_10JSValuePtrES2_ -__ZN3JSC20globalFuncParseFloatEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC7UString4fromEj -__ZN3JSC10Identifier11addSlowCaseEPNS_9ExecStateEPNS_7UString3RepE -__ZN3JSC7UString17expandPreCapacityEi -__ZN3JSC9CommaNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC9CommaNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC16VarDeclCommaNodeD1Ev -__ZN3JSC7UStringC1EPtib -__ZN3JSC5Error6createEPNS_9ExecStateENS_9ErrorTypeERKNS_7UStringEilS6_ -__ZN3JSC22NativeErrorConstructor16getConstructDataERNS_13ConstructDataE -__ZN3JSCL35constructWithNativeErrorConstructorEPNS_9ExecStateEPNS_8JSObjectERKNS_7ArgListE -__ZN3JSC22NativeErrorConstructor9constructEPNS_9ExecStateERKNS_7ArgListE -__ZN3JSC8JSObject17putWithAttributesEPNS_9ExecStateERKNS_10IdentifierENS_10JSValuePtrEj -__ZNK3JSC8JSObject8toStringEPNS_9ExecStateE +__ZN3JSCL18stringFromCharCodeEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC16globalFuncEscapeEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL26stringProtoFuncToUpperCaseEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZNK3JSC12JSActivation14isDynamicScopeEv +__ZN3WTF6VectorINS_6RefPtrIN3JSC10RegisterIDEEELm16EE14expandCapacityEm +__ZN3JSC17ObjectConstructor16getConstructDataERNS_13ConstructDataE +__ZN3JSCL30constructWithObjectConstructorEPNS_9ExecStateEPNS_8JSObjectERKNS_7ArgListE +__ZN3JSC8JITStubs17cti_op_put_by_valEPPv +__ZN3JSC15DateConstructor16getConstructDataERNS_13ConstructDataE +__ZN3JSCL28constructWithDateConstructorEPNS_9ExecStateEPNS_8JSObjectERKNS_7ArgListE +__ZN3JSC13constructDateEPNS_9ExecStateERKNS_7ArgListE +__ZN3JSC8JITStubs18cti_op_is_functionEPPv +__ZN3JSC16jsIsFunctionTypeENS_7JSValueE +__ZN3JSC10Identifier5equalEPKNS_7UString3RepEPKc +__ZN3JSC11JSImmediate8toStringENS_7JSValueE +__ZN3JSC7UString4fromEi +__ZN3JSC7UString3Rep11computeHashEPKti +__ZNK3JSC8NullNode6isNullEv +__ZN3JSC9BreakNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC17BytecodeGenerator11breakTargetERKNS_10IdentifierE +__ZN3JSC9BreakNodeD0Ev +__ZN3JSC3JIT15emit_op_eq_nullEPNS_11InstructionE +__ZN3JSC8JITStubs19cti_op_is_undefinedEPPv +__ZN3JSC12JSActivation4markEv +__ZN3JSC12DateInstanceD1Ev +__ZNK3JSC18EmptyStatementNode16isEmptyStatementEv +__ZN3JSC18EmptyStatementNodeD0Ev +__ZN3JSC3JIT15emit_op_pre_decEPNS_11InstructionE +__ZN3JSC3JIT19emitSlow_op_pre_decEPNS_11InstructionERPNS_13SlowCaseEntryE +__ZN3WTF13tryFastMallocEm +__ZN3JSC8JITStubs17cti_timeout_checkEPPv +__ZN3JSC14TimeoutChecker10didTimeOutEPNS_9ExecStateE +__ZN3JSC8JITStubs14cti_op_pre_decEPPv +__ZN3JSC13jsAddSlowCaseEPNS_9ExecStateENS_7JSValueES2_ +__ZNK3JSC8JSString11toPrimitiveEPNS_9ExecStateENS_22PreferredPrimitiveTypeE __ZNK3JSC8JSObject11toPrimitiveEPNS_9ExecStateENS_22PreferredPrimitiveTypeE __ZNK3JSC8JSObject12defaultValueEPNS_9ExecStateENS_22PreferredPrimitiveTypeE -__ZN3JSCL22errorProtoFuncToStringEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZNK3JSC8JSObject12toThisObjectEPNS_9ExecStateE -__ZN3JSC7UString6appendEPKc -__ZN3JSC3JIT10unlinkCallEPNS_12CallLinkInfoE -__ZN3JSC11Interpreter24cti_op_put_by_id_genericEPvz -__ZN3JSC21FunctionCallValueNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC12FuncExprNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC17BytecodeGenerator25emitNewFunctionExpressionEPNS_10RegisterIDEPNS_12FuncExprNodeE -__ZN3WTF6VectorINS_6RefPtrIN3JSC12FuncExprNodeEEELm0EE15reserveCapacityEm -__ZN3WTF7HashSetINS_6RefPtrIN3JSC7UString3RepEEENS2_17IdentifierRepHashENS_10HashTraitsIS5_EEE3addERKS5_ -__ZN3WTF9HashTableINS_6RefPtrIN3JSC7UString3RepEEES5_NS_17IdentityExtractorIS5_EENS2_17IdentifierRepHashENS_10HashTraitsIS5_EESA_E6expandEv -__ZL14compileBracketiPiPPhPPKtS3_P9ErrorCodeiS_S_R11CompileData -__ZN3JSC4WREC9Generator20generateAssertionEOLERNS_14MacroAssembler8JumpListE -__ZN3JSC17ObjectLiteralNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC4WREC31GeneratePatternCharacterFunctor12generateAtomEPNS0_9GeneratorERNS_14MacroAssembler8JumpListE -__ZN3JSC4WREC31GeneratePatternCharacterFunctor9backtrackEPNS0_9GeneratorE -__ZL20branchNeedsLineStartPKhjj -__ZN3JSC9ArrayNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC17BytecodeGenerator12emitNewArrayEPNS_10RegisterIDEPNS_11ElementNodeE -__ZL17bracketIsAnchoredPKh -__ZL32branchFindFirstAssertedCharacterPKhb -__ZN3JSC10JSFunction3putEPNS_9ExecStateERKNS_10IdentifierENS_10JSValuePtrERNS_15PutPropertySlotE -__ZN3JSC11concatenateEPNS_7UString3RepEd -__ZNK3JSC12JSActivation14isDynamicScopeEv -__ZN3JSC17TypeOfResolveNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC15StrictEqualNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC12ContinueNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC17BytecodeGenerator14continueTargetERKNS_10IdentifierE -__ZN3JSC17BytecodeGenerator14emitJumpScopesEPNS_5LabelEi -__ZN3JSC15TypeOfValueNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC15TypeOfValueNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC17TypeOfResolveNodeD1Ev -__ZN3JSC15StrictEqualNodeD1Ev -__ZN3JSC12ContinueNodeD1Ev -__ZN3JSC15TypeOfValueNodeD1Ev -__ZN3JSC11Interpreter33cti_op_create_arguments_no_paramsEPvz -__ZN3JSC11Interpreter13cti_op_typeofEPvz -__ZN3JSCL20jsTypeStringForValueEPNS_9ExecStateENS_10JSValuePtrE +__ZN3JSCL22objectProtoFuncValueOfEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL25functionProtoFuncToStringEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZNK3JSC10JSFunction9classInfoEv +__ZNK3JSC21UStringSourceProvider8getRangeEii +__ZNK3JSC7UString6substrEii +__ZN3JSC8JITStubs26cti_op_get_by_id_self_failEPPv +__ZN3JSC3JIT29privateCompileGetByIdSelfListEPNS_17StructureStubInfoEPNS_30PolymorphicAccessStructureListEiPNS_9StructureEm +__ZN3JSC8JITStubs16cti_op_nstricteqEPPv +__ZN3JSC9ForInNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC17BytecodeGenerator20emitNextPropertyNameEPNS_10RegisterIDES2_PNS_5LabelE +__ZN3JSC9ForInNodeD0Ev +__ZN3JSC3JIT18emit_op_next_pnameEPNS_11InstructionE +__ZN3JSC8JITStubs17cti_op_get_pnamesEPPv +__ZN3JSC8JSObject16getPropertyNamesEPNS_9ExecStateERNS_17PropertyNameArrayE +__ZN3JSC9Structure26getEnumerablePropertyNamesEPNS_9ExecStateERNS_17PropertyNameArrayEPNS_8JSObjectE +__ZN3JSC9Structure35getEnumerableNamesFromPropertyTableERNS_17PropertyNameArrayE +__ZN3JSC8JITStubs17cti_op_next_pnameEPPv +__ZN3JSC13jsOwnedStringEPNS_12JSGlobalDataERKNS_7UStringE +__ZN3JSC22JSPropertyNameIterator10invalidateEv +__ZN3JSC3JIT22emit_op_init_argumentsEPNS_11InstructionE +__ZN3JSC3JIT24emit_op_create_argumentsEPNS_11InstructionE +__ZN3JSC8JITStubs33cti_op_create_arguments_no_paramsEPPv +__ZN3JSC9Arguments18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE +__ZN3JSC3JIT16emit_op_post_decEPNS_11InstructionE +__ZN3JSC3JIT20emitSlow_op_post_decEPNS_11InstructionERPNS_13SlowCaseEntryE +__ZN3JSC8JITStubs15cti_op_post_decEPPv +__ZN3JSC9Arguments18getOwnPropertySlotEPNS_9ExecStateEjRNS_12PropertySlotE +__ZN3JSC17RegExpConstructor18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE +__ZN3JSC17RegExpConstructor3putEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueERNS_15PutPropertySlotE __ZN3JSC6JSCell11getCallDataERNS_8CallDataE +__ZN3JSC10JSFunction3putEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueERNS_15PutPropertySlotE +__ZN3JSC8JITStubs16cti_op_new_arrayEPPv +__ZN3JSC14constructArrayEPNS_9ExecStateERKNS_7ArgListE +__ZN3JSCL18arrayProtoFuncPushEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE __ZN3JSCL30comparePropertyMapEntryIndicesEPKvS1_ __ZN3WTF6VectorIN3JSC10IdentifierELm20EE15reserveCapacityEm -__ZN3JSCL22objectProtoFuncValueOfEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC14ArrayPrototype18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE -__ZN3JSCL22functionProtoFuncApplyEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZNK3JSC7JSArray9classInfoEv -__ZN3JSCL18arrayProtoFuncPushEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC11Interpreter27cti_op_get_by_id_array_failEPvz -__ZN3JSC14PostfixDotNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC14PostfixDotNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC11Interpreter32cti_op_get_by_id_proto_list_fullEPvz -__ZN3JSC12FuncExprNodeD1Ev -__ZN3JSC12FuncExprNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC11Interpreter26cti_op_get_by_id_self_failEPvz -__ZN3JSC3JIT29privateCompileGetByIdSelfListEPNS_17StructureStubInfoEPNS_30PolymorphicAccessStructureListEiPNS_9StructureEm -__ZN3JSCL19arrayProtoFuncSliceEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC11Interpreter25cti_op_tear_off_argumentsEPvz -__ZN3WTF6VectorIPN3JSC9StructureELm8EE14expandCapacityEm -__ZN3JSCL44countPrototypeChainEntriesAndCheckForProxiesEPNS_9ExecStateENS_10JSValuePtrERKNS_12PropertySlotE -__ZN3JSC17DeleteBracketNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC17DeleteBracketNodeD1Ev -__ZN3JSC17DeleteBracketNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC11Interpreter17cti_op_del_by_valEPvz -__ZN3JSC8JSObject14deletePropertyEPNS_9ExecStateEj -__ZN3JSC8JSObject14deletePropertyEPNS_9ExecStateERKNS_10IdentifierE -__ZNK3JSC6JSCell9getUInt32ERj -__ZNK3JSC8JSObject11hasPropertyEPNS_9ExecStateERKNS_10IdentifierE -__ZN3JSCL11getPropertyEPNS_9ExecStateEPNS_8JSObjectEj -__ZN3JSC17ReadModifyDotNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC17ReadModifyDotNodeD1Ev -__ZN3JSC17ReadModifyDotNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC11JSImmediate9prototypeENS_10JSValuePtrEPNS_9ExecStateE -__ZN3JSC9CodeBlock34reparseForExceptionInfoIfNecessaryEPNS_9ExecStateE -__ZNK3JSC10ScopeChain10localDepthEv -__ZNK3JSC12JSActivation9classInfoEv -__ZN3JSC6Parser7reparseINS_16FunctionBodyNodeEEEN3WTF10PassRefPtrIT_EEPNS_12JSGlobalDataEPS5_ -__ZN3JSC16FunctionBodyNode6createEPNS_12JSGlobalDataEPNS_14SourceElementsEPN3WTF6VectorISt4pairINS_10IdentifierEjELm0EEEPNS6_INS5_6RefPtrINS_12FuncDeclNodeEEELm0EEERKNS_10SourceCodeEji -__ZN3JSC13StatementNode6setLocEii -__ZN3JSC16FunctionBodyNode14copyParametersEv -__ZN3JSC16FunctionBodyNode13finishParsingEPNS_10IdentifierEm -__ZN3JSC16FunctionBodyNode31bytecodeForExceptionInfoReparseEPNS_14ScopeChainNodeEPNS_9CodeBlockE -__ZN3JSC9CodeBlock36hasGlobalResolveInfoAtBytecodeOffsetEj -__ZN3JSC6RegExpD1Ev -__Z12jsRegExpFreeP8JSRegExp -__ZN3JSC12JSActivation4markEv -__ZN3JSC9ThrowNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC9ThrowNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC9ThrowNodeD1Ev -__ZNK3JSC21UStringSourceProvider6lengthEv -__ZNK3JSC21UStringSourceProvider4dataEv -__ZN3JSC21UStringSourceProviderD1Ev -__ZN3JSC3JIT26privateCompileGetByIdChainEPNS_17StructureStubInfoEPNS_9StructureEPNS_14StructureChainEmmPvPNS_9ExecStateE -__ZN3JSCL18arrayProtoFuncJoinEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3WTF7HashSetIPN3JSC8JSObjectENS_7PtrHashIS3_EENS_10HashTraitsIS3_EEE3addERKS3_ -__ZN3WTF9HashTableIPN3JSC8JSObjectES3_NS_17IdentityExtractorIS3_EENS_7PtrHashIS3_EENS_10HashTraitsIS3_EES9_E6rehashEi -__ZN3WTF6VectorItLm256EE14expandCapacityEm -__ZN3WTF9HashTableIPN3JSC8JSObjectES3_NS_17IdentityExtractorIS3_EENS_7PtrHashIS3_EENS_10HashTraitsIS3_EES9_E4findIS3_NS_22IdentityHashTranslatorIS3_S3_S7_EEEENS_17HashTableIteratorIS3_S3_S5_S7_S9_S9_EERKT_ -__ZN3JSC3JIT28compileFastArith_op_post_decEjj -__ZN3JSC3JIT27compileFastArith_op_pre_decEj -__ZN3JSC3JIT32compileFastArithSlow_op_post_decEjjRPNS_13SlowCaseEntryE -__ZN3JSC3JIT31compileFastArithSlow_op_pre_decEjRPNS_13SlowCaseEntryE -__ZN3JSCL26stringProtoFuncToUpperCaseEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC9Arguments4markEv -__ZN3JSC11Interpreter17cti_timeout_checkEPvz -__ZN3JSCL18stringFromCharCodeEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC17ObjectConstructor16getConstructDataERNS_13ConstructDataE -__ZN3JSCL30constructWithObjectConstructorEPNS_9ExecStateEPNS_8JSObjectERKNS_7ArgListE -__ZN3JSC19JSStaticScopeObject4markEv +__ZN3JSC12StringObject3putEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueERNS_15PutPropertySlotE +__ZN3JSC8JITStubs17cti_op_push_scopeEPPv +__ZN3JSC8JITStubs14cti_op_resolveEPPv +__ZN3JSC8JITStubs16cti_op_pop_scopeEPPv +__ZN3JSC3JIT31privateCompilePutByIdTransitionEPNS_17StructureStubInfoEPNS_9StructureES4_mPNS_14StructureChainENS_22AbstractMacr +__ZN3JSC20MacroAssemblerX86_649branchPtrENS_23MacroAssemblerX86Common9ConditionENS_22AbstractMacroAssemblerINS_12X86AssemblerEE +__ZN3JSC3JIT19patchPutByIdReplaceEPNS_17StructureStubInfoEPNS_9StructureEmNS_22AbstractMacroAssemblerINS_12X86AssemblerEE22Proc __ZN3JSC17NumberConstructor18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE -__ZN3JSC21ThrowableBinaryOpNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZNK3JSC6InNode8opcodeIDEv -__ZN3JSC11Interpreter9cti_op_inEPvz -__ZN3JSC11Interpreter21cti_op_put_by_id_failEPvz -__ZN3JSC17RegExpConstructor3putEPNS_9ExecStateERKNS_10IdentifierENS_10JSValuePtrERNS_15PutPropertySlotE -__ZN3JSC11Interpreter18cti_op_is_functionEPvz -__ZN3JSC18globalFuncIsFiniteEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSCL21arrayProtoFuncForEachEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSCL17arrayProtoFuncMapEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC12StringObject14toThisJSStringEPNS_9ExecStateE +__ZN3JSC8JITStubs16cti_op_is_stringEPPv +__ZN3JSC8JITStubs19cti_op_convert_thisEPPv __ZNK3JSC8JSString12toThisObjectEPNS_9ExecStateE -__ZN3JSCL21arrayProtoFuncIndexOfEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE +__ZN3JSCL22stringProtoFuncReplaceEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC12StringObject14toThisJSStringEPNS_9ExecStateE +__ZN3JSCL21arrayProtoFuncForEachEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC11Interpreter20prepareForRepeatCallEPNS_16FunctionBodyNodeEPNS_9ExecStateEPNS_10JSFunctionEiPNS_14ScopeChainNodeEPNS_7J +__ZN3JSC3JIT16emit_op_post_incEPNS_11InstructionE +__ZN3JSC3JIT20emitSlow_op_post_incEPNS_11InstructionERPNS_13SlowCaseEntryE +__ZN3JSC11Interpreter7executeERNS_16CallFrameClosureEPNS_7JSValueE +__ZN3JSC10MathObject18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE +__ZN3JSC11Interpreter13endRepeatCallERNS_16CallFrameClosureE +__ZN3JSCL21resizePropertyStorageEPNS_8JSObjectEii +__ZN3JSC8JSObject23allocatePropertyStorageEmm +__ZN3JSC14ExecutablePool12poolAllocateEm +__ZN3JSC9Arguments4markEv +__ZN3JSC22JSPropertyNameIterator4markEv +__ZN3JSC3JIT10unlinkCallEPNS_12CallLinkInfoE +__ZN3JSC22JSPropertyNameIteratorD1Ev +__ZN3JSC9ArgumentsD1Ev +__ZN3JSC9ArgumentsD2Ev +__ZN3JSC12StringObjectD1Ev +__ZN3WTF6VectorIPN3JSC9StructureELm8EE14expandCapacityEmPKS3_ +__ZN3WTF6VectorIPN3JSC9StructureELm8EE15reserveCapacityEm +__ZN3JSCL19arrayProtoFuncShiftEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL11getPropertyEPNS_9ExecStateEPNS_8JSObjectEj +__ZN3JSC7JSArray14deletePropertyEPNS_9ExecStateEj +__ZN3JSC7JSArray9setLengthEj +__ZN3JSC7UString6appendEPKc +__ZN3JSC8JITStubs23cti_op_create_argumentsEPPv +__ZN3JSCL19arrayProtoFuncSliceEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZNK3JSC7JSValue9toIntegerEPNS_9ExecStateE +__ZN3JSC24ApplyFunctionCallDotNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZNK3JSC14ExpressionNode13isSimpleArrayEv +__ZN3JSC17BytecodeGenerator26emitJumpIfNotFunctionApplyEPNS_10RegisterIDEPNS_5LabelE +__ZN3JSC17BytecodeGenerator15emitCallVarargsEPNS_10RegisterIDES2_S2_S2_jjj +__ZN3JSC24ApplyFunctionCallDotNodeD0Ev +__ZN3JSC3JIT20emit_op_load_varargsEPNS_11InstructionE +__ZN3JSC3JIT20emit_op_call_varargsEPNS_11InstructionE +__ZN3JSC3JIT20compileOpCallVarargsEPNS_11InstructionE +__ZN3JSC3JIT29compileOpCallVarargsSetupArgsEPNS_11InstructionE +__ZN3JSC3JIT24emitSlow_op_call_varargsEPNS_11InstructionERPNS_13SlowCaseEntryE +__ZN3JSC3JIT28compileOpCallVarargsSlowCaseEPNS_11InstructionERPNS_13SlowCaseEntryE +__ZN3JSC8JITStubs19cti_op_load_varargsEPPv +__ZNK3JSC7JSArray9classInfoEv +__ZN3JSC7JSArray15copyToRegistersEPNS_9ExecStateEPNS_8RegisterEj +__ZNK3JSC7UString30spliceSubstringsWithSeparatorsEPKNS0_5RangeEiPKS0_i +__ZN3JSC8JSObject18getOwnPropertySlotEPNS_9ExecStateEjRNS_12PropertySlotE +__ZN3JSC8JSObject18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE +__ZN3JSC7UString4fromEd +__ZN3WTF4dtoaEPcdiPiS1_PS0_ +__ZN3JSC8JITStubs21cti_op_put_by_id_failEPPv __ZN3JSC13DeleteDotNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE __ZN3JSC17BytecodeGenerator14emitDeleteByIdEPNS_10RegisterIDES2_RKNS_10IdentifierE -__ZN3JSC13DeleteDotNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC11Interpreter16cti_op_del_by_idEPvz +__ZN3JSC13DeleteDotNodeD0Ev +__ZN3JSC3JIT17emit_op_del_by_idEPNS_11InstructionE +__ZN3JSC8JITStubs16cti_op_del_by_idEPPv __ZN3JSC10JSFunction14deletePropertyEPNS_9ExecStateERKNS_10IdentifierE -__ZN3JSC10JSFunction12callerGetterEPNS_9ExecStateERKNS_10IdentifierERKNS_12PropertySlotE -__ZNK3JSC11Interpreter14retrieveCallerEPNS_9ExecStateEPNS_16InternalFunctionE -__ZN3JSCL22arrayProtoFuncToStringEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE +__ZN3JSC8JSObject14deletePropertyEPNS_9ExecStateERKNS_10IdentifierE +__ZNK3JSC7ArgList8getSliceEiRS0_ +__ZN3JSC3JIT26emit_op_tear_off_argumentsEPNS_11InstructionE +__ZN3JSC8JITStubs25cti_op_tear_off_argumentsEPPv +__ZNK3JSC12StringObject12toThisStringEPNS_9ExecStateE +__ZN3JSC13PrefixDotNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC13PrefixDotNodeD0Ev +__ZNK3JSC8JSObject8toStringEPNS_9ExecStateE +__ZN3JSCL22arrayProtoFuncToStringEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL21arrayProtoFuncIndexOfEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE __ZN3JSC16ErrorConstructor16getConstructDataERNS_13ConstructDataE __ZN3JSCL29constructWithErrorConstructorEPNS_9ExecStateEPNS_8JSObjectERKNS_7ArgListE __ZN3JSC14constructErrorEPNS_9ExecStateERKNS_7ArgListE -__ZN3JSC12JSActivation3putEPNS_9ExecStateERKNS_10IdentifierENS_10JSValuePtrERNS_15PutPropertySlotE -__ZN3WTF6VectorIN3JSC14MacroAssembler4JumpELm16EE14expandCapacityEm +__ZN3JSCL21stringProtoFuncCharAtEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC8JITStubs32cti_op_get_by_id_proto_list_fullEPPv __ZN3JSC14InstanceOfNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE __ZN3JSC17BytecodeGenerator14emitInstanceOfEPNS_10RegisterIDES2_S2_S2_ -__ZN3JSC14InstanceOfNodeD1Ev -__ZN3JSC11JSImmediate8toObjectENS_10JSValuePtrEPNS_9ExecStateE -__ZNK3JSC12NumberObject9classInfoEv -__ZN3JSC11Interpreter17cti_op_instanceofEPvz -__ZNK3JSC7UString6substrEii -__ZN3JSCL20arrayProtoFuncSpliceEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC19FunctionConstructor16getConstructDataERNS_13ConstructDataE -__ZN3JSCL32constructWithFunctionConstructorEPNS_9ExecStateEPNS_8JSObjectERKNS_7ArgListE -__ZN3JSC17constructFunctionEPNS_9ExecStateERKNS_7ArgListERKNS_10IdentifierERKNS_7UStringEi -__ZNK3JSC17ExprStatementNode15isExprStatementEv -__ZNK3JSC12FuncExprNode14isFuncExprNodeEv -__ZN3JSC7ArgList9markListsERN3WTF7HashSetIPS0_NS1_7PtrHashIS3_EENS1_10HashTraitsIS3_EEEE -__ZN3JSC9CommaNodeD1Ev -__ZN3JSC11Interpreter12cti_op_throwEPvz -__ZN3JSC11Interpreter14throwExceptionERPNS_9ExecStateERNS_10JSValuePtrEjb -__ZNK3JSC8JSObject22isNotAnObjectErrorStubEv -__ZN3JSC9CodeBlock32expressionRangeForBytecodeOffsetEPNS_9ExecStateEjRiS3_S3_ -__ZNK3JSC8JSObject19isWatchdogExceptionEv -__ZN3JSC9CodeBlock24handlerForBytecodeOffsetEj -__ZN3JSC11Interpreter15unwindCallFrameERPNS_9ExecStateENS_10JSValuePtrERjRPNS_9CodeBlockE -__ZN3JSCL23returnToThrowTrampolineEPNS_12JSGlobalDataEPvRS2_ -__ZN3JSC19ctiSetReturnAddressEPPvS0_ -ctiVMThrowTrampoline -__ZN3JSC11Interpreter12cti_vm_throwEPvz -__ZN3JSC11Interpreter21cti_op_push_new_scopeEPvz -__ZN3JSC19JSStaticScopeObject18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE -__ZN3JSC9Arguments3putEPNS_9ExecStateERKNS_10IdentifierENS_10JSValuePtrERNS_15PutPropertySlotE -__ZN3JSC4WREC9Generator27generateNonGreedyQuantifierERNS_14MacroAssembler8JumpListERNS0_19GenerateAtomFunctorEjj -__ZN3JSCL21arrayProtoFuncReverseEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC7UString6appendEPKti -__ZN3JSCL26stringProtoFuncLastIndexOfEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZNK3JSC10JSValuePtr20toIntegerPreserveNaNEPNS_9ExecStateE -__Z22jsc_pcre_ucp_othercasej -__ZN3JSCL24regExpConstructorDollar1EPNS_9ExecStateERKNS_10IdentifierERKNS_12PropertySlotE -__ZN3JSCL24regExpConstructorDollar2EPNS_9ExecStateERKNS_10IdentifierERKNS_12PropertySlotE -__ZN3JSCL24regExpConstructorDollar3EPNS_9ExecStateERKNS_10IdentifierERKNS_12PropertySlotE -__ZN3JSCL24regExpConstructorDollar4EPNS_9ExecStateERKNS_10IdentifierERKNS_12PropertySlotE -__ZN3JSCL19dateProtoFuncGetDayEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZNK3JSC19JSStaticScopeObject14isDynamicScopeEv -__ZN3JSCL35objectProtoFuncPropertyIsEnumerableEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZNK3JSC8JSObject21getPropertyAttributesEPNS_9ExecStateERKNS_10IdentifierERj -__ZN3WTF9HashTableIjSt4pairIjN3JSC10JSValuePtrEENS_18PairFirstExtractorIS4_EENS_7IntHashIjEENS_14PairHashTraitsINS_10HashTraitsIjEENSA_IS3_EEEESB_EC2ERKSE_ -__ZN3JSC11Interpreter14cti_op_pre_decEPvz -__ZN3JSC11Interpreter16cti_op_new_arrayEPvz -__ZN3JSC14constructArrayEPNS_9ExecStateERKNS_7ArgListE -__ZN3JSC10JSFunction11getCallDataERNS_8CallDataE -__ZN3JSC4callEPNS_9ExecStateENS_10JSValuePtrENS_8CallTypeERKNS_8CallDataES2_RKNS_7ArgListE -__ZN3JSC11Interpreter7executeEPNS_16FunctionBodyNodeEPNS_9ExecStateEPNS_10JSFunctionEPNS_8JSObjectERKNS_7ArgListEPNS_14ScopeChainNodeEPNS_10JSValuePtrE -__ZN3JSC9LabelNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC9LabelNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC11Interpreter15cti_op_stricteqEPvz -__Z15jsRegExpExecutePK8JSRegExpPKtiiPii -__ZL5matchPKtPKhiR9MatchData -__ZN3JSC18RegExpMatchesArrayC2EPNS_9ExecStateEPNS_24RegExpConstructorPrivateE -__ZN3JSC18RegExpMatchesArray18getOwnPropertySlotEPNS_9ExecStateEjRNS_12PropertySlotE -__ZN3JSC18RegExpMatchesArray17fillArrayInstanceEPNS_9ExecStateE -__ZN3JSC7JSArray18getOwnPropertySlotEPNS_9ExecStateEjRNS_12PropertySlotE +__ZN3JSC14InstanceOfNodeD0Ev +__ZN3JSC3JIT18emit_op_instanceofEPNS_11InstructionE +__ZN3JSC3JIT22emitSlow_op_instanceofEPNS_11InstructionERPNS_13SlowCaseEntryE +__ZN3JSC12X86Assembler6orl_irEiNS_3X8610RegisterIDE +__ZN3JSC17RegExpConstructor16getConstructDataERNS_13ConstructDataE +__ZN3JSCL30constructWithRegExpConstructorEPNS_9ExecStateEPNS_8JSObjectERKNS_7ArgListE +__ZN3JSC15constructRegExpEPNS_9ExecStateERKNS_7ArgListE +__ZN3JSC13DatePrototype18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE +__ZN3JSCL20dateProtoFuncGetTimeEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZNK3JSC12DateInstance9classInfoEv __ZN3JSC12RegExpObject18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE -__ZN3JSCL19regExpProtoFuncTestEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE +__ZN3JSCL19regExpProtoFuncTestEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE __ZN3JSC12RegExpObject5matchEPNS_9ExecStateERKNS_7ArgListE -__ZN3JSCL21functionProtoFuncCallEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZNK3JSC8JSString8toObjectEPNS_9ExecStateE -__ZNK3JSC7ArgList8getSliceEiRS0_ -__ZN3JSC17RegExpConstructor18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE -__ZN3JSC23FunctionCallBracketNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC23FunctionCallBracketNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC23FunctionCallBracketNodeD1Ev -__ZN3JSC11Interpreter16cti_op_is_stringEPvz -__ZN3JSC7TryNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC17BytecodeGenerator9emitCatchEPNS_10RegisterIDEPNS_5LabelES4_ -__ZN3WTF6VectorIN3JSC11HandlerInfoELm0EE14expandCapacityEm -__ZN3JSC17BytecodeGenerator16emitPushNewScopeEPNS_10RegisterIDERNS_10IdentifierES2_ -__ZN3JSC7TryNode12releaseNodesERNS_12NodeReleaserE -__ZN3WTF6VectorIN3JSC14ExecutablePool10AllocationELm2EE14expandCapacityEm -__ZN3JSC11Interpreter19cti_op_loop_if_lessEPvz -__ZN3JSCL22stringProtoFuncReplaceEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZNK3JSC7UString30spliceSubstringsWithSeparatorsEPKNS0_5RangeEiPKS0_i -__Z15jsc_pcre_xclassiPKh -__ZN3JSC18RegExpMatchesArray3putEPNS_9ExecStateEjNS_10JSValuePtrE -__ZN3JSC7JSArray9setLengthEj -__ZN3JSCL21arrayProtoFuncUnShiftEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSCL19arrayProtoFuncShiftEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC7JSArray14deletePropertyEPNS_9ExecStateEj -__ZN3JSC11Interpreter19cti_op_is_undefinedEPvz -__ZNK3JSC9Arguments9classInfoEv -__ZN3JSC9Arguments11fillArgListEPNS_9ExecStateERNS_7ArgListE -__ZN3JSC11Interpreter23cti_op_create_argumentsEPvz +__ZN3JSC3JIT18emit_op_jmp_scopesEPNS_11InstructionE +__ZN3JSC3JIT30privateCompileGetByIdChainListEPNS_17StructureStubInfoEPNS_30PolymorphicAccessStructureListEiPNS_9StructureEPNS_1 +__ZN3JSC18globalFuncUnescapeEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC7UString6appendEt +__ZN3JSC8JSObject3putEPNS_9ExecStateEjNS_7JSValueE __ZN3JSC17PropertyNameArray3addEPNS_7UString3RepE __ZN3WTF7HashSetIPN3JSC7UString3RepENS_7PtrHashIS4_EENS_10HashTraitsIS4_EEE3addERKS4_ -__ZN3WTF9HashTableIPN3JSC7UString3RepES4_NS_17IdentityExtractorIS4_EENS_7PtrHashIS4_EENS_10HashTraitsIS4_EESA_E6expandEv +__ZN3WTF9HashTableIPN3JSC7UString3RepES4_NS_17IdentityExtractorIS4_EENS_7PtrHashIS4_EENS_10HashTraitsIS4_EESA_E6rehashEi __ZN3WTF6VectorIN3JSC10IdentifierELm20EE14expandCapacityEm -__ZN3JSC11Interpreter19cti_op_convert_thisEPvz -__ZN3JSC17PrefixBracketNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC17PrefixBracketNodeD1Ev -__ZN3JSC17PrefixBracketNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSCL25functionProtoFuncToStringEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZNK3JSC10JSFunction9classInfoEv -__ZN3JSC7CStringD1Ev -__ZN3JSC6JSLock12DropAllLocksC1Eb -__ZN3JSCL17createJSLockCountEv -__ZN3JSC6JSLock12DropAllLocksD1Ev +__ZN3JSCL20arrayProtoFuncConcatEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZNK3JSC9ArrayNode13isSimpleArrayEv +__ZN3JSC8JITStubs10cti_op_mulEPPv +__ZN3JSC8JITStubs16cti_op_is_objectEPPv +__ZN3JSC14jsIsObjectTypeENS_7JSValueE +__ZNK3JSC11Interpreter18retrieveLastCallerEPNS_9ExecStateERiRlRNS_7UStringERNS_7JSValueE +__ZN3JSC9CodeBlock34reparseForExceptionInfoIfNecessaryEPNS_9ExecStateE +__ZNK3JSC10ScopeChain10localDepthEv +__ZNK3JSC12JSActivation9classInfoEv +__ZN3JSC6Parser7reparseINS_16FunctionBodyNodeEEEN3WTF10PassRefPtrIT_EEPNS_12JSGlobalDataEPS5_ +__ZN3JSC16FunctionBodyNode6createEPNS_12JSGlobalDataEPNS_14SourceElementsEPN3WTF6VectorISt4pairINS_10IdentifierEjELm0EEEPNS6_IP +__ZN3JSC13StatementNode6setLocEii +__ZN3JSC16FunctionBodyNode14copyParametersEv +__ZN3JSC16FunctionBodyNode13finishParsingEPNS_10IdentifierEm +__ZN3JSC16FunctionBodyNode31bytecodeForExceptionInfoReparseEPNS_14ScopeChainNodeEPNS_9CodeBlockE +__ZN3JSC9CodeBlock36hasGlobalResolveInfoAtBytecodeOffsetEj +__ZN3JSC9CodeBlock27lineNumberForBytecodeOffsetEPNS_9ExecStateEj +__ZN3WTF6VectorIPvLm0EE14expandCapacityEmPKS1_ +__ZN3WTF6VectorIPvLm0EE15reserveCapacityEm +__ZN3JSC3JIT16emit_op_jeq_nullEPNS_11InstructionE +__ZN3JSC8JITStubs16cti_op_is_numberEPPv +__ZN3JSCL23stringProtoFuncToStringEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZNK3JSC12StringObject9classInfoEv +__ZN3JSC8JITStubs28cti_op_get_by_id_string_failEPPv +__ZN3JSC11JSImmediate9prototypeENS_7JSValueEPNS_9ExecStateE +__ZN3JSCL23numberProtoFuncToStringEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC3JIT16emit_op_neq_nullEPNS_11InstructionE +__ZN3JSC4Yarr23RegexPatternConstructor8copyTermERNS0_11PatternTermE +__ZL17bracketIsAnchoredPKh +__ZL32branchFindFirstAssertedCharacterPKhb +__ZL20branchNeedsLineStartPKhjj +__ZN3JSC18RegExpMatchesArray18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE +__ZN3JSCL20stringProtoFuncSliceEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC3JIT17emit_op_jneq_nullEPNS_11InstructionE +__ZN3JSC8JITStubs25cti_op_call_NotJSFunctionEPPv +__ZN3JSC17StringConstructor11getCallDataERNS_8CallDataE +__ZN3JSCL21callStringConstructorEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZNK3JSC12StringObject8toStringEPNS_9ExecStateE +__ZN3JSC23FunctionCallBracketNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC20EvalFunctionCallNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC17BytecodeGenerator19emitResolveWithBaseEPNS_10RegisterIDES2_RKNS_10IdentifierE +__ZN3JSC23FunctionCallBracketNodeD0Ev +__ZN3JSC20EvalFunctionCallNodeD0Ev +__ZN3JSC3JIT25emit_op_resolve_with_baseEPNS_11InstructionE +__ZN3JSC3JIT17emit_op_call_evalEPNS_11InstructionE +__ZN3JSC3JIT21emitSlow_op_call_evalEPNS_11InstructionERPNS_13SlowCaseEntryE +__ZN3JSC14MacroAssembler4jumpENS_22AbstractMacroAssemblerINS_12X86AssemblerEE5LabelE +__ZN3JSCL19regExpProtoFuncExecEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZNK3JSC7UString12replaceRangeEiiRKS0_ +__ZN3JSC8JITStubs17cti_op_is_booleanEPPv +__ZN3JSC3JIT22emit_op_put_global_varEPNS_11InstructionE +__ZN3JSCL23regExpProtoFuncToStringEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL18regExpObjectSourceEPNS_9ExecStateERKNS_10IdentifierERKNS_12PropertySlotE +__ZN3JSCL18regExpObjectGlobalEPNS_9ExecStateERKNS_10IdentifierERKNS_12PropertySlotE +__ZN3JSCL22regExpObjectIgnoreCaseEPNS_9ExecStateERKNS_10IdentifierERKNS_12PropertySlotE +__ZN3JSCL21regExpObjectMultilineEPNS_9ExecStateERKNS_10IdentifierERKNS_12PropertySlotE +__ZN3JSC4Yarr14RegexGenerator30generatePatternCharacterGreedyERNS1_19TermGenerationStateE +__ZN3JSC8JITStubs27cti_op_get_by_id_proto_failEPPv +__ZN3JSC17DeleteResolveNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC17DeleteResolveNodeD0Ev +__ZN3JSC3JIT20emit_op_resolve_baseEPNS_11InstructionE +__ZN3JSC8JITStubs19cti_op_resolve_baseEPPv +__ZN3JSC12JSActivation14deletePropertyEPNS_9ExecStateERKNS_10IdentifierE +__ZN3JSC16JSVariableObject14deletePropertyEPNS_9ExecStateERKNS_10IdentifierE +__ZNK3JSC8JSString8toNumberEPNS_9ExecStateE +__ZN3JSC8JITStubs24cti_op_resolve_with_baseEPPv +__ZN3JSC8JITStubs16cti_op_call_evalEPPv +__ZN3JSC11Interpreter8callEvalEPNS_9ExecStateEPNS_12RegisterFileEPNS_8RegisterEiiRNS_7JSValueE +__ZN3JSC13LiteralParser5Lexer3lexERNS1_18LiteralParserTokenE +__ZN3JSC13LiteralParser14parseStatementEv +__ZN3JSC13LiteralParser15parseExpressionEv +__ZN3JSC13LiteralParser10parseArrayEv +__ZN3JSC13LiteralParser11parseObjectEv +__ZN3JSC10Identifier3addEPNS_9ExecStateEPKti +__ZN3JSC7JSArray4pushEPNS_9ExecStateENS_7JSValueE +__ZN3JSCL19mathProtoFuncRandomEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3WTF16weakRandomNumberEv +__ZN3JSCL18mathProtoFuncFloorEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC4Heap15recordExtraCostEm +__ZN3JSC6Parser5parseINS_8EvalNodeEEEN3WTF10PassRefPtrIT_EEPNS_9ExecStateEPNS_8DebuggerERKNS_10SourceCodeEPiPNS_7UStringE +__ZN3JSC9ExecState9thisValueEv +__ZN3JSC11Interpreter7executeEPNS_8EvalNodeEPNS_9ExecStateEPNS_8JSObjectEiPNS_14ScopeChainNodeEPNS_7JSValueE +__ZN3JSC8EvalNode16generateBytecodeEPNS_14ScopeChainNodeE +__ZN3JSC17BytecodeGeneratorC2EPNS_8EvalNodeEPKNS_8DebuggerERKNS_10ScopeChainEPN3WTF7HashMapINS9_6RefPtrINS_7UString3RepEEENS_16 +__ZN3JSC8EvalNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZThn16_N3JSC8EvalNodeD0Ev +__ZN3JSC8EvalNodeD0Ev +__ZN3JSC23objectProtoFuncToStringEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZNK3JSC8JSObject9classNameEv +__ZN3JSC11JSImmediate12toThisObjectENS_7JSValueEPNS_9ExecStateE +__ZNK3JSC6JSCell17getTruncatedInt32ERi +__ZN3JSC15toInt32SlowCaseEdRb +__ZN3JSCL20dateProtoFuncSetYearEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZNK3JSC12DateInstance21msToGregorianDateTimeEdbRNS_17GregorianDateTimeE +__ZN3JSC21msToGregorianDateTimeEdbRNS_17GregorianDateTimeE +__ZN3JSCL12getDSTOffsetEdd +__ZN3JSC21gregorianDateTimeToMSERKNS_17GregorianDateTimeEdb +__ZN3JSCL15dateToDayInYearEiii +__ZN3JSC8JITStubs19cti_op_to_primitiveEPPv +__ZN3JSCL21dateProtoFuncToStringEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC10formatTimeERKNS_17GregorianDateTimeEb +__ZN3JSCL24dateProtoFuncToGMTStringEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC7UString13appendNumericEd +__ZN3JSC11concatenateEPNS_7UString3RepEd +__ZN3JSCL20dateProtoFuncGetYearEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL20dateProtoFuncGetDateEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL21dateProtoFuncGetMonthEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL21dateProtoFuncGetHoursEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL23dateProtoFuncGetMinutesEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL23dateProtoFuncGetSecondsEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL19dateProtoFuncGetDayEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL30dateProtoFuncGetTimezoneOffsetEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC28createUndefinedVariableErrorEPNS_9ExecStateERKNS_10IdentifierEjPNS_9CodeBlockE +__ZN3JSC9CodeBlock32expressionRangeForBytecodeOffsetEPNS_9ExecStateEjRiS3_S3_ +__ZN3JSC5Error6createEPNS_9ExecStateENS_9ErrorTypeERKNS_7UStringEilS6_ +__ZN3JSC22NativeErrorConstructor16getConstructDataERNS_13ConstructDataE +__ZN3JSCL35constructWithNativeErrorConstructorEPNS_9ExecStateEPNS_8JSObjectERKNS_7ArgListE +__ZN3JSC22NativeErrorConstructor9constructEPNS_9ExecStateERKNS_7ArgListE +__ZN3JSC8JSObject17putWithAttributesEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueEj +__ZN3JSCL23returnToThrowTrampolineEPNS_12JSGlobalDataEPvRS2_ +_ctiVMThrowTrampoline +__ZN3JSC8JITStubs12cti_vm_throwEPPv +__ZN3JSC11Interpreter14throwExceptionERPNS_9ExecStateERNS_7JSValueEjb +__ZNK3JSC8JSObject22isNotAnObjectErrorStubEv +__ZNK3JSC8JSObject19isWatchdogExceptionEv +__ZN3JSC9CodeBlock24handlerForBytecodeOffsetEj +__ZN3JSC8JITStubs21cti_op_push_new_scopeEPPv +__ZN3WTF6VectorIN3JSC22AbstractMacroAssemblerINS1_12X86AssemblerEE4JumpELm16EE14expandCapacityEm +__ZN3JSCL20dateProtoFuncSetTimeEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZNK3WTF7HashMapINS_6RefPtrIN3JSC7UString3RepEEENS1_INS2_8EvalNodeEEENS_7StrHashIS5_EENS_10HashTraitsIS5_EENSA_IS7_EEE3getEPS4 +__ZN3WTF7HashMapINS_6RefPtrIN3JSC7UString3RepEEENS1_INS2_8EvalNodeEEENS_7StrHashIS5_EENS_10HashTraitsIS5_EENSA_IS7_EEE3setEPS4_ +__ZN3WTF9HashTableINS_6RefPtrIN3JSC7UString3RepEEESt4pairIS5_NS1_INS2_8EvalNodeEEEENS_18PairFirstExtractorIS9_EENS_7StrHashIS5_ +__ZN3JSC10LessEqNodeD0Ev +__ZN3JSC8JITStubs14cti_op_jlesseqEPPv +__ZN3JSC8JSString18getPrimitiveNumberEPNS_9ExecStateERdRNS_7JSValueE +__ZL18makeRightShiftNodePvPN3JSC14ExpressionNodeES2_b +__ZN3JSC14RightShiftNodeD0Ev +__ZN3JSC3JIT14emit_op_rshiftEPNS_11InstructionE +__ZN3JSC3JIT18emitSlow_op_rshiftEPNS_11InstructionERPNS_13SlowCaseEntryE +__ZN3JSC18PostfixBracketNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC18PostfixBracketNodeD0Ev +__ZN3JSC21ReadModifyBracketNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC21ReadModifyBracketNodeD0Ev +__ZN3JSC11Interpreter15unwindCallFrameERPNS_9ExecStateENS_7JSValueERjRPNS_9CodeBlockE +__ZN3JSCL22errorProtoFuncToStringEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3WTF23waitForThreadCompletionEjPPv +__ZN3WTF15ThreadConditionD1Ev +__ZN3JSC9Structure24removePropertyTransitionEPS0_RKNS_10IdentifierERm +__ZN3JSC12JSActivation3putEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueERNS_15PutPropertySlotE __ZN3JSC26createNotAnObjectErrorStubEPNS_9ExecStateEb -__ZN3JSC13JSNotAnObject3putEPNS_9ExecStateERKNS_10IdentifierENS_10JSValuePtrERNS_15PutPropertySlotE +__ZN3JSC13JSNotAnObject18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE __ZNK3JSC22JSNotAnObjectErrorStub22isNotAnObjectErrorStubEv __ZN3JSC22createNotAnObjectErrorEPNS_9ExecStateEPNS_22JSNotAnObjectErrorStubEjPNS_9CodeBlockE __ZN3JSC9CodeBlock37getByIdExceptionInfoForBytecodeOffsetEPNS_9ExecStateEjRNS_8OpcodeIDE -__ZN3JSCL18createErrorMessageEPNS_9ExecStateEPNS_9CodeBlockEiiiNS_10JSValuePtrENS_7UStringE +__ZN3JSCL18createErrorMessageEPNS_9ExecStateEPNS_9CodeBlockEiiiNS_7JSValueENS_7UStringE +__ZN3JSC13ErrorInstanceD1Ev +__ZN3JSC22JSNotAnObjectErrorStubD1Ev +__ZN3JSC13JSNotAnObjectD1Ev +__ZN3JSC19JSStaticScopeObjectD1Ev +__ZN3JSC19JSStaticScopeObjectD2Ev +__ZN3JSC17DeleteBracketNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC17BytecodeGenerator15emitDeleteByValEPNS_10RegisterIDES2_S2_ +__ZN3JSC17DeleteBracketNodeD0Ev +__ZN3JSC8JITStubs17cti_op_del_by_valEPPv +__ZN3JSC8JSObject14deletePropertyEPNS_9ExecStateEj +__ZN3JSC28globalFuncEncodeURIComponentEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL6encodeEPNS_9ExecStateERKNS_7ArgListEPKc +__ZNK3JSC7UString10UTF8StringEb +__ZN3WTF7Unicode18convertUTF16ToUTF8EPPKtS2_PPcS4_b +__ZN3JSC10NegateNodeD0Ev +__ZN3JSC8JITStubs13cti_op_negateEPPv +__ZN3JSCL17mathProtoFuncSqrtEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL16mathProtoFuncAbsEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL18mathProtoFuncRoundEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL16mathProtoFuncCosEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL16mathProtoFuncSinEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC8JITStubs10cti_op_subEPPv +__ZNK3JSC8JSObject8toNumberEPNS_9ExecStateE +__ZN3JSC16ArrayConstructor11getCallDataERNS_8CallDataE +__ZN3JSCL20callArrayConstructorEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC8JITStubs10cti_op_modEPPv +__ZN3JSC8JITStubs12cti_op_jlessEPPv +__ZL17makeLeftShiftNodePvPN3JSC14ExpressionNodeES2_b +__ZN3JSC13LeftShiftNodeD0Ev +__ZN3JSC3JIT14emit_op_lshiftEPNS_11InstructionE +__ZN3JSC3JIT18emitSlow_op_lshiftEPNS_11InstructionERPNS_13SlowCaseEntryE +__ZN3JSC11JITStubCall11addArgumentENS_3X8610RegisterIDE +__ZN3JSCL16mathProtoFuncMaxEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC10BitAndNodeD0Ev +__ZN3JSC3JIT14emit_op_bitandEPNS_11InstructionE +__ZN3JSC3JIT18emitSlow_op_bitandEPNS_11InstructionERPNS_13SlowCaseEntryE +__ZN3JSC8JITStubs13cti_op_bitandEPPv +__ZN3JSC14BitwiseNotNodeD0Ev +__ZN3JSC3JIT14emit_op_bitnotEPNS_11InstructionE +__ZN3JSC3JIT18emitSlow_op_bitnotEPNS_11InstructionERPNS_13SlowCaseEntryE +__ZN3JSC22UnsignedRightShiftNodeD0Ev +__ZN3JSC10BitXOrNodeD0Ev +__ZN3JSC3JIT14emit_op_bitxorEPNS_11InstructionE +__ZN3JSC3JIT18emitSlow_op_bitxorEPNS_11InstructionERPNS_13SlowCaseEntryE +__ZN3JSCL25stringProtoFuncCharCodeAtEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC8JITStubs14cti_op_urshiftEPPv +__ZN3JSC16toUInt32SlowCaseEdRb +__ZN3JSCL17mathProtoFuncCeilEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZNK3JSC6JSCell18getTruncatedUInt32ERj +__ZN3JSC3JIT13emit_op_bitorEPNS_11InstructionE +__ZN3JSC3JIT17emitSlow_op_bitorEPNS_11InstructionERPNS_13SlowCaseEntryE +__ZN3JSC8JITStubs12cti_op_bitorEPPv +__ZN3JSC9BitOrNodeD0Ev +__ZN3JSC8JITStubs13cti_op_rshiftEPPv +__ZN3JSC8JITStubs13cti_op_bitxorEPPv +__ZN3JSC9parseDateERKNS_7UStringE +__ZN3WTF6VectorIN3JSC10CallRecordELm0EE14expandCapacityEmPKS2_ +__ZNK3JSC12JSActivation12toThisObjectEPNS_9ExecStateE +__ZN3JSC3JIT20emit_op_resolve_skipEPNS_11InstructionE +__ZN3JSC8JITStubs19cti_op_resolve_skipEPPv +__ZN3JSCL24dateProtoFuncGetFullYearEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC17StringConstructor16getConstructDataERNS_13ConstructDataE +__ZN3JSCL30constructWithStringConstructorEPNS_9ExecStateEPNS_8JSObjectERKNS_7ArgListE +__ZN3JSC5equalEPKNS_7UString3RepES3_ +__ZN3JSC8EvalNode4markEv +__ZN3JSC10SwitchNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC13CaseBlockNode20emitBytecodeForBlockERNS_17BytecodeGeneratorEPNS_10RegisterIDES4_ +__ZN3JSC13CaseBlockNode18tryOptimizedSwitchERN3WTF6VectorIPNS_14ExpressionNodeELm8EEERiS7_ +__ZN3JSCL17processClauseListEPNS_14ClauseListNodeERN3WTF6VectorIPNS_14ExpressionNodeELm8EEERNS_10SwitchKindERbRiSB_ +__ZN3WTF6VectorIPN3JSC14ExpressionNodeELm8EE14expandCapacityEm +__ZN3WTF6VectorINS_6RefPtrIN3JSC5LabelEEELm8EE14expandCapacityEm +__ZN3JSC17BytecodeGenerator11beginSwitchEPNS_10RegisterIDENS_10SwitchInfo10SwitchTypeE +__ZN3WTF6VectorIN3JSC10SwitchInfoELm0EE14expandCapacityEm +__ZN3JSC17BytecodeGenerator9endSwitchEjPN3WTF6RefPtrINS_5LabelEEEPPNS_14ExpressionNodeEPS3_ii +__ZN3WTF6VectorIN3JSC15SimpleJumpTableELm0EE14expandCapacityEm +__ZN3WTF6VectorIiLm0EE15reserveCapacityEm +__ZN3JSC14CaseClauseNodeD0Ev +__ZN3JSC14ClauseListNodeD0Ev +__ZN3JSC13CaseBlockNodeD0Ev +__ZN3JSC10SwitchNodeD0Ev +__ZN3JSC3JIT19emit_op_switch_charEPNS_11InstructionE +__ZN3WTF6VectorIN3JSC12SwitchRecordELm0EE14expandCapacityEm +__ZN3WTF6VectorIN3JSC22AbstractMacroAssemblerINS1_12X86AssemblerEE17CodeLocationLabelELm0EE4growEm +__ZN3JSC8JITStubs18cti_op_switch_charEPPv +__ZN3JSCL16mathProtoFuncPowEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3WTF6VectorIcLm0EE14expandCapacityEm +__ZN3WTF6VectorIN3JSC7UString5RangeELm16EE14expandCapacityEm +__ZN3WTF6VectorIN3JSC7UStringELm16EE14expandCapacityEmPKS2_ +__ZN3WTF6VectorIN3JSC7UStringELm16EE15reserveCapacityEm +__ZN3JSC7JSArray16getPropertyNamesEPNS_9ExecStateERNS_17PropertyNameArrayE +__ZN3JSC9ExecState10arrayTableEPS0_ +__ZN3JSC20MarkedArgumentBuffer10slowAppendENS_7JSValueE +__ZN3WTF9HashTableIPN3JSC20MarkedArgumentBufferES3_NS_17IdentityExtractorIS3_EENS_7PtrHashIS3_EENS_10HashTraitsIS3_EES9_E6rehas +__ZN3JSC8JITStubs24cti_op_get_by_val_stringEPPv +__ZN3JSCL16mathProtoFuncLogEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZNK3JSC7UString8toDoubleEv +__ZN3WTF9HashTableIPN3JSC7UString3RepES4_NS_17IdentityExtractorIS4_EENS_7PtrHashIS4_EENS_10HashTraitsIS4_EESA_E4findIS4_NS_22Id +__ZN3JSCL29objectProtoFuncHasOwnPropertyEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL18arrayProtoFuncSortEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC7JSArray4sortEPNS_9ExecStateENS_7JSValueENS_8CallTypeERKNS_8CallDataE +__ZN3WTF7AVLTreeIN3JSC32AVLTreeAbstractorForArrayCompareELj44ENS_18AVLTreeDefaultBSetILj44EEEE6insertEi +__ZN3JSCltERKNS_7UStringES2_ +__ZN3WTF7AVLTreeIN3JSC32AVLTreeAbstractorForArrayCompareELj44ENS_18AVLTreeDefaultBSetILj44EEEE7balanceEi +__Z12jsRegExpFreeP8JSRegExp +__ZN3JSCL21stringProtoFuncConcatEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC19globalFuncEncodeURIEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC19globalFuncDecodeURIEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL6decodeEPNS_9ExecStateERKNS_7ArgListEPKcb +__ZN3WTF7Unicode18UTF8SequenceLengthEc +__ZN3WTF7Unicode18decodeUTF8SequenceEPKc +__ZN3JSCL22numberProtoFuncToFixedEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL16integerPartNoExpEd +__ZN3WTF14FastMallocZone10statisticsEP14_malloc_zone_tP19malloc_statistics_t +__ZN3JSC4Heap26protectedGlobalObjectCountEv +__ZN3JSC10JSFunction15argumentsGetterEPNS_9ExecStateERKNS_10IdentifierERKNS_12PropertySlotE +__ZNK3JSC11Interpreter17retrieveArgumentsEPNS_9ExecStateEPNS_10JSFunctionE +__ZN3JSCL21dateProtoFuncSetMonthEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL23setNewValueFromDateArgsEPNS_9ExecStateENS_7JSValueERKNS_7ArgListEib +__ZN3JSCL20dateProtoFuncSetDateEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3WTF6VectorIPNS0_IN3JSC10RegisterIDELm32EEELm32EE14expandCapacityEm +__ZN3JSC8JITStubs14cti_op_pre_incEPPv +__ZN3WTF6VectorIPN3JSC14ExpressionNodeELm16EE14expandCapacityEm +__ZN3JSC13UnaryPlusNodeD0Ev +__ZN3JSC3JIT19emit_op_to_jsnumberEPNS_11InstructionE +__ZN3JSC3JIT23emitSlow_op_to_jsnumberEPNS_11InstructionERPNS_13SlowCaseEntryE +__ZN3JSC8JITStubs18cti_op_to_jsnumberEPPv +__ZN3JSC6JSLock12DropAllLocksC1Eb +__ZN3JSCL17createJSLockCountEv +__ZN3JSC6JSLock12DropAllLocksD1Ev +__ZN3JSCL24dateProtoFuncSetFullYearEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3WTF6VectorIN3JSC15StringJumpTableELm0EE15reserveCapacityEm +__ZN3WTF7HashMapINS_6RefPtrIN3JSC7UString3RepEEENS2_14OffsetLocationENS_7StrHashIS5_EENS_10HashTraitsIS5_EENS9_IS6_EEE3addEPS4_ +__ZN3WTF9HashTableINS_6RefPtrIN3JSC7UString3RepEEESt4pairIS5_NS2_14OffsetLocationEENS_18PairFirstExtractorIS8_EENS_7StrHashIS5_ +__ZN3JSC3JIT21emit_op_switch_stringEPNS_11InstructionE +__ZN3JSC8JITStubs20cti_op_switch_stringEPPv +__ZN3WTF6VectorIN3JSC14ExecutablePool10AllocationELm2EE14expandCapacityEm +__ZN3JSC12JSGlobalData6createEb +__ZN3JSCL13allocateBlockILNS_8HeapTypeE1EEEPNS_14CollectorBlockEv +__ZN3JSC7JSValueC1EPNS_9ExecStateEd +__ZN3JSC10JSFunctionC1EPNS_9ExecStateEN3WTF10PassRefPtrINS_9StructureEEEiRKNS_10IdentifierEPFNS_7JSValueES2_PNS_8JSObjectESA_RK +__ZN3JSC8JSObject17putDirectFunctionEPNS_9ExecStateEPNS_16InternalFunctionEj +__ZN3JSC7CStringD1Ev +__ZN3WTF7HashMapIPvjNS_7PtrHashIS1_EEN3JSC17JSValueHashTraitsENS_10HashTraitsIjEEE3addERKS1_RKj +__ZN3WTF6VectorINS_6RefPtrIN3JSC12FuncExprNodeEEELm0EE14shrinkCapacityEm +__ZN3JSC14ExpressionNodeD2Ev +__ZThn12_N3JSC11ProgramNodeD0Ev +__ZThn12_N3JSC12FuncExprNodeD0Ev +__ZThn12_N3JSC16FunctionBodyNodeD0Ev +__ZN3JSC8JITStubs16cti_op_new_arrayEPvz +__ZN3WTF6VectorIN3JSC17StructureStubInfoELm0EE15reserveCapacityEm +__ZN3JSC17BytecodeGenerator10emitOpcodeENS_8OpcodeIDE +__ZN3JSC23MacroAssemblerX86Common4moveENS_3X8610RegisterIDES2_ +__ZN3JSC8JITStubs15cti_op_new_funcEPvz +__ZN3JSC8JITStubs21cti_op_resolve_globalEPvz +__ZN3JSC8JITStubs16cti_op_get_by_idEPvz +__ZN3JSC8JITStubs31cti_op_construct_NotJSConstructEPvz +__ZN3JSC8JITStubs16cti_op_put_by_idEPvz +__ZN3JSC8JITStubs13cti_op_strcatEPvz +__ZN3JSC8JITStubs19cti_op_resolve_funcEPvz +__ZN3JSC8JITStubs23cti_vm_dontLazyLinkCallEPvz +__ZN3JSC8JITStubs22cti_op_call_JSFunctionEPvz +__ZN3JSC8JITStubs23cti_register_file_checkEPvz +__ZN3JSC8JITStubs13cti_op_negateEPvz +__ZN3JSC8JITStubs28cti_op_construct_JSConstructEPvz +__ZN3JSC23MacroAssemblerX86Common12branchTest32ENS0_9ConditionENS_22AbstractMacroAssemblerINS_12X86AssemblerEE7AddressENS4_5Imm +__ZN3JSC8JITStubs23cti_op_put_by_val_arrayEPvz +__ZN3JSC8JITStubs23cti_op_put_by_id_secondEPvz +__ZN3JSC15AssemblerBuffer14executableCopyEPNS_14ExecutablePoolE +__ZN3JSC12X86Assembler8sarl_i8rEiNS_3X8610RegisterIDE +__ZN3JSC12X86Assembler23X86InstructionFormatter9twoByteOpENS0_15TwoByteOpcodeIDEiNS_3X8610RegisterIDEi +__ZN3JSC8JITStubs10cti_op_mulEPvz +__ZN3JSC12jsNumberCellEPNS_12JSGlobalDataEd +__ZN3JSC8JITStubs10cti_op_subEPvz +__ZN3JSC8JITStubs10cti_op_divEPvz +__ZN3JSC8JITStubs23cti_op_get_by_id_secondEPvz +__ZN3JSC8JITStubs19cti_vm_lazyLinkCallEPvz +__ZN3WTF6VectorIPN3JSC12CallLinkInfoELm0EE14expandCapacityEm +__ZN3JSC8JITStubs19cti_op_convert_thisEPvz +__ZN3JSC8JITStubs21cti_op_put_by_id_failEPvz +__ZN3JSC8JITStubs10cti_op_addEPvz +__ZN3JSC8JITStubs17cti_timeout_checkEPvz +__ZN3JSC9jsBooleanEb +__ZN3JSC9CodeBlock19isKnownNotImmediateEi +__ZN3JSC12X86Assembler8movsd_mrEiNS_3X8610RegisterIDENS1_13XMMRegisterIDE +__ZN3JSC8JITStubs25cti_op_call_NotJSFunctionEPvz +__ZNK3JSC12JSNumberCell8toNumberEPNS_9ExecStateE +__ZN3JSC8JITStubs26cti_op_get_by_id_self_failEPvz +__ZN3JSC8JITStubs10cti_op_endEPvz +__ZThn12_N3JSC12FuncDeclNodeD0Ev +__ZN3JSC8JITStubs24cti_op_resolve_with_baseEPvz +__ZN3JSC8JITStubs19cti_op_new_func_expEPvz +__ZN3JSC8JITStubs22cti_op_push_activationEPvz +__ZN3JSC8JITStubs17cti_op_get_by_valEPvz +__ZN3JSC8JITStubs22cti_op_call_arityCheckEPvz +__ZN3JSC8JITStubs11cti_op_lessEPvz +__ZN3JSC12JSNumberCell18getPrimitiveNumberEPNS_9ExecStateERdRNS_7JSValueE +__ZN3JSC12X86Assembler23X86InstructionFormatter9oneByteOpENS0_15OneByteOpcodeIDE +__ZN3JSC8JITStubs27cti_op_get_by_id_proto_listEPvz +__ZN3JSC8JITStubs12cti_op_jtrueEPvz +__ZN3JSC8JITStubs10cti_op_modEPvz +__ZN3JSC8JITStubs10cti_op_neqEPvz +__ZN3JSC8JITStubs12cti_op_jlessEPvz +__ZN3JSC8JITStubs24cti_op_get_by_id_genericEPvz +__ZN3JSC8JITStubs14cti_op_jlesseqEPvz +__ZN3JSC8JITStubs26cti_op_tear_off_activationEPvz +__ZN3JSC8JITStubs21cti_op_ret_scopeChainEPvz +__ZN3JSC8JITStubs19cti_op_to_primitiveEPvz +__ZNK3JSC12JSNumberCell8toStringEPNS_9ExecStateE +__ZN3JSC8JITStubs13cti_op_bitandEPvz +__ZN3JSC8JITStubs13cti_op_lshiftEPvz +__ZN3JSC8JITStubs13cti_op_bitnotEPvz +__ZNK3JSC12JSNumberCell9toBooleanEPNS_9ExecStateE +__ZN3JSC8JITStubs14cti_op_urshiftEPvz +__ZNK3JSC12JSNumberCell18getTruncatedUInt32ERj +__ZN3JSC4Yarr14RegexGenerator28generateCharacterClassSingleERNS1_19TermGenerationStateE +__ZN3WTF15deleteAllValuesIPN3JSC4Yarr18PatternDisjunctionELm4EEEvRKNS_6VectorIT_XT0_EEE +__ZN3JSC8JITStubs17cti_op_new_regexpEPvz +__ZN3JSC8JITStubs12cti_op_bitorEPvz +__ZNK3JSC12JSNumberCell17getTruncatedInt32ERi +__ZN3JSC8JITStubs13cti_op_rshiftEPvz +__ZN3JSC8JITStubs13cti_op_bitxorEPvz +__ZN3WTF7HashSetINS_6RefPtrIN3JSC7UString3RepEEENS2_17IdentifierRepHashENS_10HashTraitsIS5_EEE3addERKS5_ +__ZN3JSC8JITStubs9cti_op_eqEPvz +__ZN3JSC8JITStubs16cti_op_call_evalEPvz +__ZN3JSC8JITStubs19cti_op_resolve_skipEPvz +__ZN3JSC8JITStubs17cti_op_new_objectEPvz +__ZN3JSC8JITStubs14cti_op_resolveEPvz +__ZN3JSC8JITStubs17cti_op_put_by_valEPvz +__ZN3JSC8JITStubs18cti_op_switch_charEPvz +__ZN3JSC8JITStubs28cti_op_get_by_id_string_failEPvz +__ZThn12_N3JSC8EvalNodeD0Ev +__ZN3WTF6VectorIN3JSC7UStringELm16EE14expandCapacityEm +__ZN3JSC8JITStubs17cti_op_get_pnamesEPvz +__ZN3JSC8JITStubs17cti_op_next_pnameEPvz +__ZN3WTF7HashSetIPN3JSC20MarkedArgumentBufferENS_7PtrHashIS3_EENS_10HashTraitsIS3_EEE3addERKS3_ +__ZN3WTF9HashTableIPN3JSC20MarkedArgumentBufferES3_NS_17IdentityExtractorIS3_EENS_7PtrHashIS3_EENS_10HashTraitsIS3_EES9_E4findI +__ZN3JSC8JITStubs24cti_op_get_by_val_stringEPvz +__ZN3JSC4Yarr6ParserINS0_23RegexPatternConstructorEE28CharacterClassParserDelegate25atomBuiltInCharacterClassENS0_23BuiltInChar +__ZN3JSC12jsNumberCellEPNS_9ExecStateEd +__ZN3JSC8JITStubs18cti_op_is_functionEPvz +__ZN3JSC8JITStubs16cti_op_is_objectEPvz +__ZN3JSC8JITStubs16cti_op_nstricteqEPvz +__ZN3JSC8JITStubs13cti_op_lesseqEPvz +__ZNK3JSC12JSNumberCell11toPrimitiveEPNS_9ExecStateENS_22PreferredPrimitiveTypeE +__ZN3JSC4Yarr14RegexGenerator27generateCharacterClassFixedERNS1_19TermGenerationStateE +__ZN3JSC4Heap7destroyEv +__ZN3JSC12JSGlobalDataD1Ev +__ZN3JSC12JSGlobalDataD2Ev +__ZN3JSC12RegisterFileD1Ev +__ZNK3JSC9HashTable11deleteTableEv +__ZN3JSC5LexerD1Ev +__ZN3JSC5LexerD2Ev +__ZN3WTF20deleteAllPairSecondsIP24OpaqueJSClassContextDataKNS_7HashMapIP13OpaqueJSClassS2_NS_7PtrHashIS5_EENS_10HashTraitsIS5_E +__ZN3JSC17CommonIdentifiersD2Ev +__ZN3JSC21deleteIdentifierTableEPNS_15IdentifierTableE +__ZN3JSC4HeapD1Ev +__ZN3JSC12SmallStringsD1Ev +__ZN3JSCL16mathProtoFuncMinEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL17arrayProtoFuncPopEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC7JSArray3popEv +__ZN3JSC11DoWhileNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC11DoWhileNodeD0Ev +__ZN3JSC3JIT18emit_op_switch_immEPNS_11InstructionE +__ZN3JSC8JITStubs17cti_op_switch_immEPPv +__ZN3JSC13UnaryPlusNode14stripUnaryPlusEv +__ZN3JSC15globalFuncIsNaNEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC17NumberConstructor11getCallDataERNS_8CallDataE +__ZN3JSCL21callNumberConstructorEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3WTF6VectorIPNS0_IN3JSC10IdentifierELm64EEELm32EE14expandCapacityEm +__ZN3JSC8JITStubs19cti_op_is_undefinedEPvz +__ZN3JSC8JITStubs13cti_op_typeofEPvz +__ZN3JSC8JITStubs33cti_op_create_arguments_no_paramsEPvz +__ZN3JSC8JITStubs19cti_op_load_varargsEPvz +__ZN3JSC8JITStubs10cti_op_notEPvz +__ZN3JSC8JITStubs16cti_op_is_stringEPvz +__ZN3JSCL24regExpConstructorDollar1EPNS_9ExecStateERKNS_10IdentifierERKNS_12PropertySlotE +__ZN3WTF6VectorIN3JSC15StringJumpTableELm0EE14expandCapacityEm +__ZN3JSC8JITStubs20cti_op_switch_stringEPvz +__ZN3JSC9Arguments3putEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueERNS_15PutPropertySlotE +__ZN3JSC8JITStubs18cti_op_to_jsnumberEPvz +__ZN3JSC8JITStubs19cti_op_loop_if_lessEPvz +__ZN3JSC9LabelNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC9LabelNodeD0Ev __ZNK3JSC7UString5asciiEv -__ZN3JSC16InternalFunctionC2EPNS_12JSGlobalDataEN3WTF10PassRefPtrINS_9StructureEEERKNS_10IdentifierE -__ZN3WTF13tryFastCallocEmm -__ZN3JSC13JSNotAnObjectD0Ev -__ZN3JSCL31dateProtoFuncToLocaleTimeStringEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSCL16formatLocaleDateEPNS_9ExecStateEPNS_12DateInstanceEdNS_20LocaleDateTimeFormatERKNS_7ArgListE +__ZN3JSC8JITStubs27cti_op_get_by_id_array_failEPvz +__ZN3JSC12X86Assembler23X86InstructionFormatter9oneByteOpENS0_15OneByteOpcodeIDEiPv +__ZN3JSC8JITStubs23cti_op_create_argumentsEPvz +__ZN3JSCL21arrayProtoFuncUnShiftEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC8JITStubs25cti_op_tear_off_argumentsEPvz +__ZN3JSC7JSArray11sortNumericEPNS_9ExecStateENS_7JSValueENS_8CallTypeERKNS_8CallDataE +__ZN3JSC7JSArray17compactForSortingEv +__ZN3JSCL22compareNumbersForQSortEPKvS1_ +__ZN3JSC8JITStubs15cti_op_post_incEPPv +__ZN3JSC8JITStubs24cti_op_put_by_id_genericEPvz +__ZN3JSCL24regExpConstructorDollar2EPNS_9ExecStateERKNS_10IdentifierERKNS_12PropertySlotE +__ZN3JSCL24regExpConstructorDollar3EPNS_9ExecStateERKNS_10IdentifierERKNS_12PropertySlotE +__ZN3JSCL24regExpConstructorDollar4EPNS_9ExecStateERKNS_10IdentifierERKNS_12PropertySlotE +__ZN3JSCL24regExpConstructorDollar5EPNS_9ExecStateERKNS_10IdentifierERKNS_12PropertySlotE +__ZN3JSCL24regExpConstructorDollar6EPNS_9ExecStateERKNS_10IdentifierERKNS_12PropertySlotE +__ZN3JSCL21stringProtoFuncSubstrEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL23stringProtoFuncFontsizeEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL24dateProtoFuncToUTCStringEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL19stringProtoFuncLinkEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL9dateParseEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC8JITStubs21cti_op_loop_if_lesseqEPPv +__ZN3JSCL16mathProtoFuncExpEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC4Yarr17nonwordcharCreateEv +__ZN3WTF6VectorIPN3JSC4Yarr18PatternDisjunctionELm4EE14expandCapacityEmPKS4_ +__Z15jsc_pcre_xclassiPKh +__ZN3JSC18RegExpMatchesArray3putEPNS_9ExecStateEjNS_7JSValueE +__ZN3JSC28globalFuncDecodeURIComponentEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC8JITStubs27cti_op_get_by_id_array_failEPPv +__ZNK3JSC9Arguments9classInfoEv +__ZN3JSC9Arguments15copyToRegistersEPNS_9ExecStateEPNS_8RegisterEj +__ZN3JSC19JSStaticScopeObject4markEv +__ZN3JSC8JITStubs19cti_op_loop_if_lessEPPv +__ZN3JSC8JITStubs16cti_op_del_by_idEPvz +__ZN3JSC7JSArray14deletePropertyEPNS_9ExecStateERKNS_10IdentifierE +__ZN3JSC7UString6appendEPKti +__ZN3JSC8JITStubs17cti_op_push_scopeEPvz +__ZN3JSC8JITStubs19cti_op_resolve_baseEPvz +__ZN3JSC8JITStubs16cti_op_pop_scopeEPvz +__ZN3JSC8JITStubs17cti_op_is_booleanEPvz +__ZN3JSCL20arrayProtoFuncSpliceEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC8JITStubs17cti_op_jmp_scopesEPvz +__ZN3JSC8JITStubs9cti_op_inEPvz +__ZN3JSC8JITStubs15cti_op_stricteqEPvz +__ZN3JSC8JITStubs32cti_op_get_by_id_proto_list_fullEPvz +__ZN3WTF6VectorIiLm8EE14expandCapacityEm +__ZN3JSCL21stringProtoFuncSearchEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC8JITStubs12cti_vm_throwEPvz +__ZN3JSC8JITStubs21cti_op_push_new_scopeEPvz +__ZN3JSC8JITStubs16cti_op_is_numberEPvz +__ZN3JSC16JSVariableObject16getPropertyNamesEPNS_9ExecStateERNS_17PropertyNameArrayE +__ZNK3JSC8JSString8toObjectEPNS_9ExecStateE +__ZN3JSC12StringObject16getPropertyNamesEPNS_9ExecStateERNS_17PropertyNameArrayE +__ZN3JSC9ExecState11stringTableEPS0_ +__ZN3JSC11JSImmediate8toObjectENS_7JSValueEPNS_9ExecStateE +__ZN3JSC36constructBooleanFromImmediateBooleanEPNS_9ExecStateENS_7JSValueE +__ZN3JSC13BooleanObjectD1Ev +__ZN3JSCL17arrayProtoFuncMapEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC7JSArrayC2EN3WTF10PassRefPtrINS_9StructureEEEj +__ZN3JSC8JITStubs17cti_op_del_by_valEPvz +__ZN3JSC8JITStubs27cti_op_get_by_id_proto_failEPvz +__ZN3JSC10JSFunction12callerGetterEPNS_9ExecStateERKNS_10IdentifierERKNS_12PropertySlotE +__ZNK3JSC11Interpreter14retrieveCallerEPNS_9ExecStateEPNS_16InternalFunctionE +__ZN3JSC18globalFuncIsFiniteEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC6JSCell18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE +__ZNK3JSC12JSNumberCell8toObjectEPNS_9ExecStateE +__ZN3JSC15constructNumberEPNS_9ExecStateENS_7JSValueE +__ZN3JSC12NumberObject11getJSNumberEv +__ZN3JSCL7dateNowEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC12NumberObjectD1Ev +__ZN3JSC8JSObject18getPrimitiveNumberEPNS_9ExecStateERdRNS_7JSValueE +__ZN3JSCL22numberProtoFuncValueOfEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC13JSNotAnObject18getOwnPropertySlotEPNS_9ExecStateEjRNS_12PropertySlotE +__ZN3JSC19JSStaticScopeObject18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE __ZN3JSC16InternalFunction4nameEPNS_12JSGlobalDataE -__ZNK3JSC6JSCell9getStringERNS_7UStringE -__ZN3JSC28globalFuncDecodeURIComponentEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZNK3JSC14ExpressionNode8isStringEv +__ZN3JSCL18arrayProtoFuncSomeEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC8JSString18getOwnPropertySlotEPNS_9ExecStateEjRNS_12PropertySlotE +__ZN3JSC12JSNumberCell11getJSNumberEv +__ZN3JSC23createNotAFunctionErrorEPNS_9ExecStateENS_7JSValueEjPNS_9CodeBlockE +__ZN3JSC17PrefixBracketNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC17PrefixBracketNodeD0Ev __ZN3JSC17RegExpConstructor11getCallDataERNS_8CallDataE -__ZN3JSCL21callRegExpConstructorEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC23createNotAFunctionErrorEPNS_9ExecStateENS_10JSValuePtrEjPNS_9CodeBlockE -__ZN3JSC11Interpreter17cti_op_jmp_scopesEPvz +__ZN3JSCL21callRegExpConstructorEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC7JSArray4sortEPNS_9ExecStateE +__ZN3JSCL27dateProtoFuncSetUTCFullYearEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL24dateProtoFuncSetUTCHoursEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL23setNewValueFromTimeArgsEPNS_9ExecStateENS_7JSValueERKNS_7ArgListEib +__ZN3JSC8JITStubs17cti_op_switch_immEPvz +__ZN3JSC12RegExpObject3putEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueERNS_15PutPropertySlotE +__ZN3JSCL24setRegExpObjectLastIndexEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueE +__ZN3JSCL28regExpConstructorLeftContextEPNS_9ExecStateERKNS_10IdentifierERKNS_12PropertySlotE +__ZN3JSC18RegExpMatchesArray14deletePropertyEPNS_9ExecStateEj +__ZN3JSC18RegExpMatchesArray3putEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueERNS_15PutPropertySlotE +__ZN3JSC10JSFunction12lengthGetterEPNS_9ExecStateERKNS_10IdentifierERKNS_12PropertySlotE +__ZNK3JSC12NumberObject9classInfoEv +__ZN3JSC8JITStubs12cti_op_throwEPvz +__ZN3JSCL19isNonASCIIIdentPartEi +__ZN3JSCL27dateProtoFuncToLocaleStringEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL16formatLocaleDateEPNS_9ExecStateEPNS_12DateInstanceEdNS_20LocaleDateTimeFormatERKNS_7ArgListE +__ZN3JSCL21dateProtoFuncSetHoursEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL23dateProtoFuncSetMinutesEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL23dateProtoFuncSetSecondsEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL28dateProtoFuncSetMilliSecondsEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZNK3JSC12JSNumberCell12toThisObjectEPNS_9ExecStateE +__ZN3JSC16ErrorConstructor11getCallDataERNS_8CallDataE +__ZN3JSCL20callErrorConstructorEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC17PrototypeFunctionC1EPNS_9ExecStateEiRKNS_10IdentifierEPFNS_7JSValueES2_PNS_8JSObjectES6_RKNS_7ArgListEE +__ZN3JSC17PrototypeFunctionC2EPNS_9ExecStateEiRKNS_10IdentifierEPFNS_7JSValueES2_PNS_8JSObjectES6_RKNS_7ArgListEE +__ZN3JSC17PrototypeFunction11getCallDataERNS_8CallDataE +__ZN3JSC17PrototypeFunctionD1Ev +__ZN3JSCL24booleanProtoFuncToStringEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE __ZN3JSC17BytecodeGenerator18emitJumpSubroutineEPNS_10RegisterIDEPNS_5LabelE +__ZN3JSC3JIT11emit_op_jsrEPNS_11InstructionE __ZN3WTF6VectorIN3JSC3JIT7JSRInfoELm0EE14expandCapacityEm -__ZN3JSC18RegExpMatchesArray16getPropertyNamesEPNS_9ExecStateERNS_17PropertyNameArrayE -__ZN3JSC28createUndefinedVariableErrorEPNS_9ExecStateERKNS_10IdentifierEjPNS_9CodeBlockE -__ZN3JSC17DeleteResolveNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSCL21stringProtoFuncSearchEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSCL27objectProtoFuncDefineGetterEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC8JSObject12defineGetterEPNS_9ExecStateERKNS_10IdentifierEPS0_ -__ZN3JSC9Structure22getterSetterTransitionEPS0_ -__ZN3JSCL27objectProtoFuncLookupGetterEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC8JSObject12lookupGetterEPNS_9ExecStateERKNS_10IdentifierE -__ZNK3JSC6JSCell14isGetterSetterEv -__ZN3JSCL27objectProtoFuncLookupSetterEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC8JSObject12lookupSetterEPNS_9ExecStateERKNS_10IdentifierE -__ZN3JSC10JSFunction12lengthGetterEPNS_9ExecStateERKNS_10IdentifierERKNS_12PropertySlotE -__ZN3JSCL27objectProtoFuncDefineSetterEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC8JSObject12defineSetterEPNS_9ExecStateERKNS_10IdentifierEPS0_ -__ZNK3JSC12GetterSetter14isGetterSetterEv -__ZN3JSC12GetterSetter4markEv -__ZN3JSC16JSVariableObject14deletePropertyEPNS_9ExecStateERKNS_10IdentifierE -__ZNK3JSC8JSObject11hasPropertyEPNS_9ExecStateEj -__ZN3JSC17BytecodeGenerator21emitComplexJumpScopesEPNS_5LabelEPNS_18ControlFlowContextES4_ -__ZN3JSC8JSObject22fillGetterPropertySlotERNS_12PropertySlotEPNS_10JSValuePtrE -__ZN3JSC12PropertySlot14functionGetterEPNS_9ExecStateERKNS_10IdentifierERKS0_ -__ZN3JSC7JSArray4sortEPNS_9ExecStateE -__ZN3JSC7JSArray17compactForSortingEv -__ZN3JSCL24booleanProtoFuncToStringEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC8VoidNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC8VoidNodeD1Ev -__ZN3JSC8VoidNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC13JSNotAnObject18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE -__ZN3JSC12StringObject18getOwnPropertySlotEPNS_9ExecStateEjRNS_12PropertySlotE -__ZN3JSCL27compareByStringPairForQSortEPKvS1_ +__ZN3JSC3JIT12emit_op_sretEPNS_11InstructionE __ZN3JSC6Parser7reparseINS_8EvalNodeEEEN3WTF10PassRefPtrIT_EEPNS_12JSGlobalDataEPS5_ -__ZN3JSC8EvalNode6createEPNS_12JSGlobalDataEPNS_14SourceElementsEPN3WTF6VectorISt4pairINS_10IdentifierEjELm0EEEPNS6_INS5_6RefPtrINS_12FuncDeclNodeEEELm0EEERKNS_10SourceCodeEji +__ZN3JSC8EvalNode6createEPNS_12JSGlobalDataEPNS_14SourceElementsEPN3WTF6VectorISt4pairINS_10IdentifierEjELm0EEEPNS6_IPNS_12Func __ZN3JSC8EvalNode31bytecodeForExceptionInfoReparseEPNS_14ScopeChainNodeEPNS_9CodeBlockE +__ZN3JSC20FixedVMPoolAllocator17coalesceFreeSpaceEv +__ZN3WTF6VectorIPN3JSC13FreeListEntryELm0EE15reserveCapacityEm +__ZN3JSCL35reverseSortFreeListEntriesByPointerEPKvS1_ +__ZN3JSC14globalFuncEvalEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL21functionProtoFuncCallEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL22functionProtoFuncApplyEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC9Arguments11fillArgListEPNS_9ExecStateERNS_20MarkedArgumentBufferE +__ZNK3JSC7JSValue12toThisObjectEPNS_9ExecStateE +__ZN3JSC8VoidNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC8VoidNodeD0Ev +__ZN3JSC16InternalFunctionC2EPNS_12JSGlobalDataEN3WTF10PassRefPtrINS_9StructureEEERKNS_10IdentifierE +__ZN3JSC20MarkedArgumentBuffer9markListsERN3WTF7HashSetIPS0_NS1_7PtrHashIS3_EENS1_10HashTraitsIS3_EEEE +__ZN3JSC7CStringaSERKS0_ +__ZNK3JSC19JSStaticScopeObject14isDynamicScopeEv +__ZN3JSCL33reverseSortCommonSizedAllocationsEPKvS1_ +__ZN3JSCL20arrayProtoFuncFilterEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE __ZN3JSC17NumberConstructor16getConstructDataERNS_13ConstructDataE __ZN3JSCL30constructWithNumberConstructorEPNS_9ExecStateEPNS_8JSObjectERKNS_7ArgListE +__ZN3JSC17BytecodeGenerator18emitUnexpectedLoadEPNS_10RegisterIDEb +__ZN3JSC8JITStubs12cti_op_throwEPPv +__ZN3JSC6JSCell9getObjectEv +__ZN3JSCL21arrayProtoFuncReverseEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE __ZNK3JSC8JSObject16isVariableObjectEv -__ZN3JSC36constructBooleanFromImmediateBooleanEPNS_9ExecStateENS_10JSValuePtrE -__ZN3JSC13BooleanObjectD0Ev -__ZN3WTF9HashTableINS_6RefPtrIN3JSC7UString3RepEEESt4pairIS5_NS2_14OffsetLocationEENS_18PairFirstExtractorIS8_EENS_7StrHashIS5_EENS_14PairHashTraitsINS_10HashTraitsIS5_EENSE_IS7_EEEESF_E4findIPS4_NS_29RefPtrHashMapRawKeyTranslatorISK_S8_SH_SC_EEEENS_17HashTableIteratorIS5_S8_SA_SC_SH_SF_EERKT_ -__ZN3JSC10throwErrorEPNS_9ExecStateENS_9ErrorTypeE -__ZN3JSC14globalFuncEvalEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC11Interpreter7executeEPNS_8EvalNodeEPNS_9ExecStateEPNS_8JSObjectEPNS_14ScopeChainNodeEPNS_10JSValuePtrE -__ZN3JSC11Interpreter19cti_op_put_by_indexEPvz +__ZN3JSC18EmptyStatementNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSCL27compareByStringPairForQSortEPKvS1_ +__Z22jsc_pcre_ucp_othercasej +__ZN3JSCL35objectProtoFuncPropertyIsEnumerableEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZNK3JSC8JSObject21getPropertyAttributesEPNS_9ExecStateERKNS_10IdentifierERj +__ZN3WTF7HashMapIjN3JSC7JSValueENS_7IntHashIjEENS_10HashTraitsIjEENS5_IS2_EEE3setERKjRKS2_ +__ZN3WTF9HashTableIjSt4pairIjN3JSC7JSValueEENS_18PairFirstExtractorIS4_EENS_7IntHashIjEENS_14PairHashTraitsINS_10HashTraitsIjEE +__ZN3JSC12RegisterFile21releaseExcessCapacityEv +__ZN3JSCL20isNonASCIIIdentStartEi +__ZN3JSC17BytecodeGenerator14emitPutByIndexEPNS_10RegisterIDEjS2_ +__ZN3JSC3JIT20emit_op_put_by_indexEPNS_11InstructionE +__ZN3JSC8JITStubs19cti_op_put_by_indexEPPv __ZN3JSCL25numberConstructorMaxValueEPNS_9ExecStateERKNS_10IdentifierERKNS_12PropertySlotE __ZN3JSCL28numberConstructorPosInfinityEPNS_9ExecStateERKNS_10IdentifierERKNS_12PropertySlotE __ZN3JSCL28numberConstructorNegInfinityEPNS_9ExecStateERKNS_10IdentifierERKNS_12PropertySlotE -__ZN3JSCL17mathProtoFuncATanEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC18RegExpMatchesArray14deletePropertyEPNS_9ExecStateEj -__ZN3JSC18RegExpMatchesArray3putEPNS_9ExecStateERKNS_10IdentifierENS_10JSValuePtrERNS_15PutPropertySlotE -__ZN3JSC7JSArray14deletePropertyEPNS_9ExecStateERKNS_10IdentifierE -__ZN3JSC18EmptyStatementNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSCL17mathProtoFuncASinEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSCL18mathProtoFuncATan2EPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC16ErrorConstructor11getCallDataERNS_8CallDataE -__ZN3JSCL20callErrorConstructorEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSCL7dateNowEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE __ZN3JSC18BooleanConstructor11getCallDataERNS_8CallDataE -__ZN3JSCL22callBooleanConstructorEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSCL20arrayProtoFuncFilterEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC4WREC9Generator28generateParenthesesAssertionERNS_14MacroAssembler8JumpListE -__ZN3JSCL21regExpObjectLastIndexEPNS_9ExecStateERKNS_10IdentifierERKNS_12PropertySlotE -__ZN3JSCL18arrayProtoFuncSomeEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC12RegExpObject3putEPNS_9ExecStateERKNS_10IdentifierENS_10JSValuePtrERNS_15PutPropertySlotE -__ZN3JSCL24setRegExpObjectLastIndexEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrE -__ZN3JSC26createNotAConstructorErrorEPNS_9ExecStateENS_10JSValuePtrEjPNS_9CodeBlockE -__ZN3JSC15isStrWhiteSpaceEt -__ZN3JSCL27dateProtoFuncGetUTCFullYearEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSCL24dateProtoFuncGetUTCMonthEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSCL23dateProtoFuncGetUTCDateEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSCL24dateProtoFuncGetUTCHoursEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSCL26dateProtoFuncGetUTCMinutesEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSCL7dateUTCEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSCL21dateProtoFuncSetHoursEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSCL23setNewValueFromTimeArgsEPNS_9ExecStateENS_10JSValuePtrERKNS_7ArgListEib -__ZN3JSCL23dateProtoFuncSetMinutesEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSCL23dateProtoFuncSetSecondsEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSCL28dateProtoFuncSetMilliSecondsEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC7CStringaSERKS0_ -__ZN3JSCL22dateProtoFuncGetUTCDayEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZNK3JSC7UString8toUInt32EPb -__ZN3JSC12RegExpObject11getCallDataERNS_8CallDataE -__ZNK3JSC8JSObject14isGlobalObjectEv -__ZN3JSC8JSString18getOwnPropertySlotEPNS_9ExecStateEjRNS_12PropertySlotE -__ZN3JSC8JSObject18getPrimitiveNumberEPNS_9ExecStateERdRNS_10JSValuePtrE -__ZN3JSC10throwErrorEPNS_9ExecStateENS_9ErrorTypeEPKc -__ZN3JSC16JSVariableObject16getPropertyNamesEPNS_9ExecStateERNS_17PropertyNameArrayE -__ZN3JSC17BytecodeGenerator18emitUnexpectedLoadEPNS_10RegisterIDEb -__ZN3WTF6VectorIN3JSC10JSValuePtrELm0EE14expandCapacityEm -__ZN3JSC18BooleanConstructor16getConstructDataERNS_13ConstructDataE -__ZN3JSCL31constructWithBooleanConstructorEPNS_9ExecStateEPNS_8JSObjectERKNS_7ArgListE -__ZN3JSC16constructBooleanEPNS_9ExecStateERKNS_7ArgListE -__ZN3JSCL26stringFromCharCodeSlowCaseEPNS_9ExecStateERKNS_7ArgListE -__ZN3JSCL27dateProtoFuncSetUTCFullYearEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSCL26dateProtoFuncGetUTCSecondsEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSCL31dateProtoFuncGetUTCMillisecondsEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSCL28dateProtoFuncGetMilliSecondsEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZNK3JSC12JSNumberCell9getUInt32ERj -__ZN3JSC13JSNotAnObject18getOwnPropertySlotEPNS_9ExecStateEjRNS_12PropertySlotE -__ZN3JSCL23booleanProtoFuncValueOfEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSCL27dateProtoFuncToLocaleStringEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC9Arguments14deletePropertyEPNS_9ExecStateEj -__ZNK3JSC21UStringSourceProvider8getRangeEii -__ZN3JSC22NativeErrorConstructor11getCallDataERNS_8CallDataE -__ZN3JSCL23dateProtoFuncSetUTCDateEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -JSClassCreate +__ZN3JSCL22callBooleanConstructorEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL17mathProtoFuncATanEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC8JITStubs17cti_op_jmp_scopesEPPv +__ZNK3JSC8JSObject11hasPropertyEPNS_9ExecStateEj +__ZN3JSCL17mathProtoFuncASinEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC11Interpreter7executeEPNS_8EvalNodeEPNS_9ExecStateEPNS_8JSObjectEPNS_14ScopeChainNodeEPNS_7JSValueE +_JSContextGetGlobalObject +__ZN3JSC4Heap14registerThreadEv +__ZN3JSC6JSLockC1EPNS_9ExecStateE +_JSStringCreateWithUTF8CString +__ZN3WTF7Unicode18convertUTF8ToUTF16EPPKcS2_PPtS4_b +_JSClassCreate __ZN13OpaqueJSClass6createEPK17JSClassDefinition __ZN13OpaqueJSClassC2EPK17JSClassDefinitionPS_ __ZN3JSC7UString3Rep14createFromUTF8EPKc -__ZN3WTF7Unicode18convertUTF8ToUTF16EPPKcS2_PPtS4_b -__ZN3WTF7HashMapINS_6RefPtrIN3JSC7UString3RepEEEP19StaticFunctionEntryNS_7StrHashIS5_EENS_10HashTraitsIS5_EENSA_IS7_EEE3addERKS5_RKS7_ -__ZN3WTF9HashTableINS_6RefPtrIN3JSC7UString3RepEEESt4pairIS5_P19StaticFunctionEntryENS_18PairFirstExtractorIS9_EENS_7StrHashIS5_EENS_14PairHashTraitsINS_10HashTraitsIS5_EENSF_IS8_EEEESG_E6expandEv -JSClassRetain -JSObjectMake -__ZN3JSC4Heap14registerThreadEv -__ZN3JSC6JSLockC1EPNS_9ExecStateE +__ZN3WTF7HashMapINS_6RefPtrIN3JSC7UString3RepEEEP19StaticFunctionEntryNS_7StrHashIS5_EENS_10HashTraitsIS5_EENSA_IS7_EEE3addERKS +__ZN3WTF9HashTableINS_6RefPtrIN3JSC7UString3RepEEESt4pairIS5_P19StaticFunctionEntryENS_18PairFirstExtractorIS9_EENS_7StrHashIS5 +__ZN3WTF7HashMapINS_6RefPtrIN3JSC7UString3RepEEEP16StaticValueEntryNS_7StrHashIS5_EENS_10HashTraitsIS5_EENSA_IS7_EEE3addERKS5_R +_JSClassRetain +_JSObjectMake __ZN3JSC16JSCallbackObjectINS_8JSObjectEE4initEPNS_9ExecStateE __ZN13OpaqueJSClass9prototypeEPN3JSC9ExecStateE __ZN13OpaqueJSClass11contextDataEPN3JSC9ExecStateE -__ZN3WTF9HashTableIP13OpaqueJSClassSt4pairIS2_P24OpaqueJSClassContextDataENS_18PairFirstExtractorIS6_EENS_7PtrHashIS2_EENS_14PairHashTraitsINS_10HashTraitsIS2_EENSC_IS5_EEEESD_E6expandEv +__ZN3WTF9HashTableIP13OpaqueJSClassSt4pairIS2_P24OpaqueJSClassContextDataENS_18PairFirstExtractorIS6_EENS_7PtrHashIS2_EENS_14Pa __ZN24OpaqueJSClassContextDataC2EP13OpaqueJSClass -JSStringCreateWithCFString -JSObjectSetProperty +__ZN3JSC7UString3Rep13createCopyingEPKti +_JSObjectSetProperty __ZNK14OpaqueJSString10identifierEPN3JSC12JSGlobalDataE -JSStringRelease -__ZL30makeGetterOrSetterPropertyNodePvRKN3JSC10IdentifierES3_PNS0_13ParameterNodeEPNS0_16FunctionBodyNodeERKNS0_10SourceCodeE -__ZN3JSC18ConstStatementNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC13ConstDeclNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC13ConstDeclNode14emitCodeSingleERNS_17BytecodeGeneratorE -__ZN3JSC17BytecodeGenerator13emitPutGetterEPNS_10RegisterIDERKNS_10IdentifierES2_ -__ZN3JSC17BytecodeGenerator13emitPutSetterEPNS_10RegisterIDERKNS_10IdentifierES2_ -__ZN3JSC18ConstStatementNodeD1Ev -__ZN3JSC18ConstStatementNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC13ConstDeclNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC11Interpreter17cti_op_put_getterEPvz -__ZN3JSC11Interpreter17cti_op_put_setterEPvz +__ZN3JSC14JSGlobalObject17putWithAttributesEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueEj +_JSStringRelease __ZN3JSC16JSCallbackObjectINS_8JSObjectEE18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE -__ZN3JSC7UString3Rep13createCopyingEPKti __ZN3JSC16JSCallbackObjectINS_8JSObjectEE20staticFunctionGetterEPNS_9ExecStateERKNS_10IdentifierERKNS_12PropertySlotE __ZN3JSC18JSCallbackFunctionC1EPNS_9ExecStateEPFPK13OpaqueJSValuePK15OpaqueJSContextPS3_S9_mPKS5_PS5_ERKNS_10IdentifierE __ZN3JSC18JSCallbackFunction11getCallDataERNS_8CallDataE -__ZN3JSC18JSCallbackFunction4callEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE +__ZN3JSC18JSCallbackFunction4callEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE __ZN3JSC6JSLock12DropAllLocksC1EPNS_9ExecStateE -JSValueIsObjectOfClass -__ZN3JSC6JSCell9getObjectEv +_JSObjectGetPrivate __ZNK3JSC16JSCallbackObjectINS_8JSObjectEE9classInfoEv -JSObjectGetPrivate -JSValueMakeString +_JSValueMakeUndefined +__ZN3JSC16JSCallbackObjectINS_8JSObjectEE17staticValueGetterEPNS_9ExecStateERKNS_10IdentifierERKNS_12PropertySlotE +__ZN14OpaqueJSString6createERKN3JSC7UStringE +_JSStringCreateWithCharacters +_JSValueMakeString __ZNK14OpaqueJSString7ustringEv -JSValueMakeBoolean -JSContextGetGlobalObject -JSStringCreateWithUTF8CString -JSObjectGetProperty -JSValueToObject -JSObjectIsFunction -JSObjectCallAsFunction -JSValueMakeUndefined -__ZN3JSC18JSCallbackFunctionD0Ev -__ZN3JSC16JSCallbackObjectINS_8JSObjectEED0Ev +__ZN3JSC7UStringC1EPtib +__ZN3JSC16JSCallbackObjectINS_8JSObjectEED1Ev +_JSClassRelease __ZL25clearReferenceToPrototypeP13OpaqueJSValue -JSClassRelease -__ZN3JSC15AssignErrorNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +_JSObjectGetProperty +_JSValueToObject +__ZN3JSCL22dateProtoFuncGetUTCDayEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL24dateProtoFuncGetUTCMonthEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL23dateProtoFuncGetUTCDateEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL27dateProtoFuncGetUTCFullYearEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZNK3JSC7UString8toUInt32EPb +__ZN3JSCL24dateProtoFuncGetUTCHoursEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL26dateProtoFuncGetUTCMinutesEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL26dateProtoFuncGetUTCSecondsEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL7dateUTCEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC12RegExpObject11getCallDataERNS_8CallDataE +__ZN3JSC9Arguments14deletePropertyEPNS_9ExecStateEj +_JSValueMakeBoolean +_JSValueToNumber +_JSStringCreateWithCFString +__ZN3WTF13tryFastCallocEmm +_JSValueMakeNumber +__ZN3JSC18JSCallbackFunctionD1Ev +_JSValueToStringCopy +_JSStringCopyCFString +__ZN3JSC18ConstStatementNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC13ConstDeclNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC13ConstDeclNode14emitCodeSingleERNS_17BytecodeGeneratorE +__ZN3JSC13ConstDeclNodeD0Ev +__ZN3JSC18ConstStatementNodeD0Ev +__ZN3JSC18BooleanConstructor16getConstructDataERNS_13ConstructDataE +__ZN3JSCL31constructWithBooleanConstructorEPNS_9ExecStateEPNS_8JSObjectERKNS_7ArgListE +__ZN3JSC16constructBooleanEPNS_9ExecStateERKNS_7ArgListE +__ZN3JSCL31dateProtoFuncGetUTCMillisecondsEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL28dateProtoFuncGetMilliSecondsEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL31dateProtoFuncToLocaleTimeStringEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL21regExpObjectLastIndexEPNS_9ExecStateERKNS_10IdentifierERKNS_12PropertySlotE +__ZN3JSC21DebuggerStatementNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC21DebuggerStatementNodeD0Ev +__ZN3JSC4Yarr12RegexPattern21newlineCharacterClassEv +__ZN3JSC17ObjectConstructor11getCallDataERNS_8CallDataE +__ZN3JSCL23dateProtoFuncSetUTCDateEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL26stringFromCharCodeSlowCaseEPNS_9ExecStateERKNS_7ArgListE +__ZN3JSCL21callObjectConstructorEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL27objectProtoFuncDefineGetterEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC8JSObject12defineGetterEPNS_9ExecStateERKNS_10IdentifierEPS0_ +__ZN3JSC12GetterSetter4markEv +__ZN3JSC12GetterSetterD1Ev +__ZN3JSCL22regExpProtoFuncCompileEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZNK3JSC17NumberConstructor9classInfoEv +__ZNK3JSC17RegExpConstructor9classInfoEv +__ZN3JSCL31dateProtoFuncToLocaleDateStringEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZNK3JSC8JSObject14isGlobalObjectEv +_JSValueToBoolean +__ZN3JSC8JITStubs13cti_op_lshiftEPPv +__ZN3JSC8JITStubs13cti_op_bitnotEPPv +__ZN3JSC6JSCell3putEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueERNS_15PutPropertySlotE +__ZN3JSC19FunctionConstructor11getCallDataERNS_8CallDataE +__ZN3WTF9ByteArray6createEm +__ZNK3JSC6JSCell9getStringERNS_7UStringE +__ZN3JSC3JIT12emit_op_loopEPNS_11InstructionE +__ZN3JSC10throwErrorEPNS_9ExecStateENS_9ErrorTypeE +__ZN3JSC11JSByteArrayC1EPNS_9ExecStateEN3WTF10PassRefPtrINS_9StructureEEEPNS3_9ByteArrayEPKNS_9ClassInfoE +__ZN3JSC11JSByteArrayC2EPNS_9ExecStateEN3WTF10PassRefPtrINS_9StructureEEEPNS3_9ByteArrayEPKNS_9ClassInfoE +__ZN3JSC11JSByteArray18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE +__ZN3JSC11JSByteArray3putEPNS_9ExecStateEjNS_7JSValueE +__ZN3JSC11JSByteArray3putEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueERNS_15PutPropertySlotE +__ZN3JSC11JSByteArray18getOwnPropertySlotEPNS_9ExecStateEjRNS_12PropertySlotE +__ZN3JSC8JITStubs28cti_op_get_by_val_byte_arrayEPPv +__ZN3JSC8JITStubs28cti_op_put_by_val_byte_arrayEPPv +__ZL30makeGetterOrSetterPropertyNodePvRKN3JSC10IdentifierES3_PNS0_13ParameterNodeEPNS0_16FunctionBodyNodeERKNS0_10SourceCodeE +__ZN3JSC17BytecodeGenerator13emitPutGetterEPNS_10RegisterIDERKNS_10IdentifierES2_ +__ZN3JSC17BytecodeGenerator13emitPutSetterEPNS_10RegisterIDERKNS_10IdentifierES2_ +__ZN3JSC3JIT18emit_op_put_getterEPNS_11InstructionE +__ZN3JSC3JIT18emit_op_put_setterEPNS_11InstructionE +__ZN3JSC8JITStubs17cti_op_put_getterEPPv +__ZN3JSC8JITStubs17cti_op_put_setterEPPv +__ZN3JSC8JSObject12defineSetterEPNS_9ExecStateERKNS_10IdentifierEPS0_ +__ZNK3JSC12GetterSetter14isGetterSetterEv +__ZNK3JSC6JSCell14isGetterSetterEv +__ZN3JSCL29regExpConstructorRightContextEPNS_9ExecStateERKNS_10IdentifierERKNS_12PropertySlotE +__ZN3JSC5Lexer19copyCodeWithoutBOMsEv +__ZN3JSC13JSNotAnObject3putEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueERNS_15PutPropertySlotE +__ZN3JSC6JSCell16getConstructDataERNS_13ConstructDataE +__ZN3JSC26createNotAConstructorErrorEPNS_9ExecStateENS_7JSValueEjPNS_9CodeBlockE +__ZN3JSC15isStrWhiteSpaceEt +__ZN3JSC10throwErrorEPNS_9ExecStateENS_9ErrorTypeEPKc +__ZNK3JSC22NativeErrorConstructor9classInfoEv +__ZNK3JSC16JSCallbackObjectINS_8JSObjectEE9classNameEv +__ZN3JSC4Heap11objectCountEv +__ZNK3JSC12SmallStrings5countEv +__ZN3JSC14JSGlobalObject12defineGetterEPNS_9ExecStateERKNS_10IdentifierEPNS_8JSObjectE +__ZN3JSCL27objectProtoFuncLookupGetterEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC8JSObject12lookupGetterEPNS_9ExecStateERKNS_10IdentifierE +__ZN3JSCL27objectProtoFuncDefineSetterEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC14JSGlobalObject12defineSetterEPNS_9ExecStateERKNS_10IdentifierEPNS_8JSObjectE +__ZN3JSC9Structure22getterSetterTransitionEPS0_ +__ZN3JSC8JSObject22fillGetterPropertySlotERNS_12PropertySlotEPNS_7JSValueE +__ZN3JSC12PropertySlot14functionGetterEPNS_9ExecStateERKNS_10IdentifierERKS0_ +__ZN3JSCL28objectProtoFuncIsPrototypeOfEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC12StringObjectC2EPNS_9ExecStateEN3WTF10PassRefPtrINS_9StructureEEERKNS_7UStringE +__ZNK3JSC7UString6is8BitEv +__ZN3JSC8JSObject15unwrappedObjectEv +__ZN3JSC22NativeErrorConstructor11getCallDataERNS_8CallDataE +__ZN3JSC16JSCallbackObjectINS_8JSObjectEE11getCallDataERNS_8CallDataE +__ZN3JSC17BytecodeGenerator21emitComplexJumpScopesEPNS_5LabelEPNS_18ControlFlowContextES4_ __ZN3JSC23ThrowableExpressionData14emitThrowErrorERNS_17BytecodeGeneratorENS_9ErrorTypeEPKc -__ZN3JSC17BytecodeGenerator12emitNewErrorEPNS_10RegisterIDENS_9ErrorTypeENS_10JSValuePtrE -__ZN3JSC15AssignErrorNodeD1Ev -__ZN3JSC15AssignErrorNode12releaseNodesERNS_12NodeReleaserE +__ZN3JSC17BytecodeGenerator12emitNewErrorEPNS_10RegisterIDENS_9ErrorTypeENS_7JSValueE +__ZN3JSC3JIT17emit_op_new_errorEPNS_11InstructionE +__ZN3JSC23MacroAssemblerX86Common8branch16ENS0_9ConditionENS_22AbstractMacroAssemblerINS_12X86AssemblerEE9BaseIndexENS4_5Imm32E +_JSStringRetain +__ZN3JSCL19arrayProtoFuncEveryEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL20arrayProtoFuncReduceEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL25arrayProtoFuncReduceRightEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL28arrayProtoFuncToLocaleStringEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL25arrayProtoFuncLastIndexOfEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC15AssignErrorNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC8JITStubs16cti_op_new_errorEPPv +__ZN3JSC15AssignErrorNodeD0Ev +__ZN3JSC17BytecodeGenerator18emitUnexpectedLoadEPNS_10RegisterIDEd +__ZN3JSC19JSStaticScopeObject3putEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueERNS_15PutPropertySlotE +__ZN3JSC9ExecState9dateTableEPS0_ +__ZNK3JSC15RegExpPrototype9classInfoEv __ZN3JSC12StringObject14deletePropertyEPNS_9ExecStateERKNS_10IdentifierE -__ZN3JSC12StringObject16getPropertyNamesEPNS_9ExecStateERNS_17PropertyNameArrayE -__ZN3JSC9ExecState11stringTableEPS0_ -__ZN3JSCL24dateProtoFuncSetUTCHoursEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN14OpaqueJSString6createERKN3JSC7UStringE -JSStringIsEqualToUTF8CString -__ZN3JSC16JSCallbackObjectINS_8JSObjectEE14callbackGetterEPNS_9ExecStateERKNS_10IdentifierERKNS_12PropertySlotE -JSValueToStringCopy -JSStringCopyCFString -JSValueMakeNumber -__ZN3JSC16JSCallbackObjectINS_8JSObjectEE3putEPNS_9ExecStateERKNS_10IdentifierENS_10JSValuePtrERNS_15PutPropertySlotE -JSValueToNumber -JSObjectSetPrivate -__ZN3JSC8Profiler8profilerEv -__ZN3JSC8Profiler13stopProfilingEPNS_9ExecStateERKNS_7UStringE -__ZN3JSC8JSObject15unwrappedObjectEv -JSStringCreateWithCharacters -__ZN3JSC9Structure18startIgnoringLeaksEv -__ZN3JSC9Structure17stopIgnoringLeaksEv -JSValueProtect -JSObjectCallAsConstructor -__ZN3JSC10JSFunction16getConstructDataERNS_13ConstructDataE -__ZN3JSC9constructEPNS_9ExecStateENS_10JSValuePtrENS_13ConstructTypeERKNS_13ConstructDataERKNS_7ArgListE -__ZN3JSC10JSFunction9constructEPNS_9ExecStateERKNS_7ArgListE -__ZN3JSCL28stringProtoFuncLocaleCompareEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE +__ZN3JSCL25dateProtoFuncToDateStringEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL25dateProtoFuncToTimeStringEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL25numberConstructorNaNValueEPNS_9ExecStateERKNS_10IdentifierERKNS_12PropertySlotE +__ZN3JSCL31dateProtoFuncSetUTCMillisecondsEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL26dateProtoFuncSetUTCSecondsEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL26dateProtoFuncSetUTCMinutesEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL24dateProtoFuncSetUTCMonthEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL23throwStackOverflowErrorEPNS_9ExecStateEPNS_12JSGlobalDataEPvRS4_ +__ZN3JSC24createStackOverflowErrorEPNS_9ExecStateE +__ZN3JSC15DeleteValueNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC15DeleteValueNodeD0Ev +__ZN3JSC16PostfixErrorNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC15PrefixErrorNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC16PostfixErrorNodeD0Ev +__ZN3JSC15PrefixErrorNodeD0Ev +__ZN3JSC23createInvalidParamErrorEPNS_9ExecStateEPKcNS_7JSValueEjPNS_9CodeBlockE +__ZNK3JSC15DotAccessorNode17isDotAccessorNodeEv +__ZNK3JSC14ExpressionNode17isDotAccessorNodeEv +__ZN3JSC13JSNotAnObject3putEPNS_9ExecStateEjNS_7JSValueE +__ZN3JSC4Heap24setGCProtectNeedsLockingEv +__ZN3JSCL23callFunctionConstructorEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZNK3JSC16JSCallbackObjectINS_8JSObjectEE8toStringEPNS_9ExecStateE +__ZN3JSC8JITStubs17cti_op_instanceofEPPv +__ZN3JSC17BytecodeGenerator35emitThrowExpressionTooDeepExceptionEv +__ZN3JSCL25numberConstructorMinValueEPNS_9ExecStateERKNS_10IdentifierERKNS_12PropertySlotE +__ZN3JSCL17mathProtoFuncACosEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL18mathProtoFuncATan2EPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL16mathProtoFuncTanEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL28numberProtoFuncToExponentialEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL26numberProtoFuncToPrecisionEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL12charSequenceEci +__ZN3JSCL29objectProtoFuncToLocaleStringEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC6JSCell14toThisJSStringEPNS_9ExecStateE +__ZNK3JSC6JSCell12toThisStringEPNS_9ExecStateE +__ZN3JSCL27objectProtoFuncLookupSetterEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC8JSObject12lookupSetterEPNS_9ExecStateERKNS_10IdentifierE +__ZNK3JSC16JSVariableObject21getPropertyAttributesEPNS_9ExecStateERKNS_10IdentifierERj +__ZN3JSC9ExecState22regExpConstructorTableEPS0_ +__ZN3JSCL24regExpConstructorDollar7EPNS_9ExecStateERKNS_10IdentifierERKNS_12PropertySlotE +__ZN3JSCL24regExpConstructorDollar8EPNS_9ExecStateERKNS_10IdentifierERKNS_12PropertySlotE +__ZN3JSCL24regExpConstructorDollar9EPNS_9ExecStateERKNS_10IdentifierERKNS_12PropertySlotE +__ZN3JSCL22regExpConstructorInputEPNS_9ExecStateERKNS_10IdentifierERKNS_12PropertySlotE +__ZN3JSCL25setRegExpConstructorInputEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueE +__ZN3JSCL26regExpConstructorLastMatchEPNS_9ExecStateERKNS_10IdentifierERKNS_12PropertySlotE +__ZN3JSCL26regExpConstructorLastParenEPNS_9ExecStateERKNS_10IdentifierERKNS_12PropertySlotE +__ZN3JSCL26regExpConstructorMultilineEPNS_9ExecStateERKNS_10IdentifierERKNS_12PropertySlotE +__ZN3JSCL29setRegExpConstructorMultilineEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueE +__ZN3JSC4Yarr15nondigitsCreateEv +__ZNK3JSC19JSStaticScopeObject12toThisObjectEPNS_9ExecStateE +__ZN3JSC12JSActivation18getArgumentsGetterEv +__ZN3JSC12JSActivation15argumentsGetterEPNS_9ExecStateERKNS_10IdentifierERKNS_12PropertySlotE +__ZN3JSCL23booleanProtoFuncValueOfEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL28stringProtoFuncLocaleCompareEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE __ZN3WTF8Collator11userDefaultEv __ZNK3WTF8Collator7collateEPKtmS2_m __ZNK3WTF8Collator14createCollatorEv __ZN3WTF8CollatorD1Ev __ZN3WTF8Collator15releaseCollatorEv -__ZNK3JSC22NativeErrorConstructor9classInfoEv -JSValueUnprotect -JSValueIsNumber -__ZN3JSC8Debugger6attachEPNS_14JSGlobalObjectE -__ZN3WTF7HashSetIPN3JSC14JSGlobalObjectENS_7PtrHashIS3_EENS_10HashTraitsIS3_EEE3addERKS3_ -__ZN3WTF9HashTableIPN3JSC14JSGlobalObjectES3_NS_17IdentityExtractorIS3_EENS_7PtrHashIS3_EENS_10HashTraitsIS3_EES9_E6rehashEi -__ZN3JSC4Heap14primaryHeapEndEv -__ZN3JSC4Heap16primaryHeapBeginEv -__ZNK3JSC15RegExpPrototype9classInfoEv -__ZNK3JSC17NumberConstructor9classInfoEv -__ZNK3JSC17RegExpConstructor9classInfoEv __ZNK3JSC10MathObject9classInfoEv -__ZNK3JSC18JSCallbackFunction9classInfoEv -JSValueIsString -JSStringGetLength -JSStringGetCharactersPtr -__ZN3JSC11Interpreter12cti_op_debugEPvz -__ZN3JSC11Interpreter5debugEPNS_9ExecStateENS_11DebugHookIDEii -__ZNK3JSC17DebuggerCallFrame4typeEv -__ZNK3JSC17DebuggerCallFrame12functionNameEv -__ZNK3JSC17DebuggerCallFrame10thisObjectEv -__ZN3WTF28setMainThreadCallbacksPausedEb -__ZN3JSC8Debugger6detachEPNS_14JSGlobalObjectE -__ZN3WTF9HashTableIPN3JSC14JSGlobalObjectES3_NS_17IdentityExtractorIS3_EENS_7PtrHashIS3_EENS_10HashTraitsIS3_EES9_E4findIS3_NS_22IdentityHashTranslatorIS3_S3_S7_EEEENS_17HashTableIteratorIS3_S3_S5_S7_S9_S9_EERKT_ +__ZN3JSC9ExecState9mathTableEPS0_ __ZN3WTF6VectorIN3JSC20FunctionRegisterInfoELm0EE14expandCapacityEm +__ZN3JSC3JIT25emit_op_profile_will_callEPNS_11InstructionE +__ZN3JSC3JIT24emit_op_profile_did_callEPNS_11InstructionE +__ZN3JSC8Profiler8profilerEv __ZN3JSC8Profiler14startProfilingEPNS_9ExecStateERKNS_7UStringE __ZN3JSC16ProfileGenerator6createERKNS_7UStringEPNS_9ExecStateEj __ZN3JSC16ProfileGeneratorC2ERKNS_7UStringEPNS_9ExecStateEj __ZN3JSC7Profile6createERKNS_7UStringEj -__ZN3JSC11TreeProfile6createERKNS_7UStringEj __ZN3JSC7ProfileC2ERKNS_7UStringEj __ZN3JSC11ProfileNodeC1ERKNS_14CallIdentifierEPS0_S4_ __ZN3JSC33getCurrentUTCTimeWithMicrosecondsEv __ZN3JSC16ProfileGenerator24addParentForConsoleStartEPNS_9ExecStateE -__ZN3JSC8Profiler20createCallIdentifierEPNS_12JSGlobalDataENS_10JSValuePtrERKNS_7UStringEi +__ZN3JSC8Profiler20createCallIdentifierEPNS_12JSGlobalDataENS_7JSValueERKNS_7UStringEi +__ZN3JSC16InternalFunction21calculatedDisplayNameEPNS_12JSGlobalDataE __ZN3JSC11ProfileNode10insertNodeEN3WTF10PassRefPtrIS0_EE +__ZN3WTF6VectorINS_6RefPtrIN3JSC11ProfileNodeEEELm0EE14expandCapacityEm __ZN3WTF6VectorINS_6RefPtrIN3JSC16ProfileGeneratorEEELm0EE14expandCapacityEm -__ZN3WTF10RefCountedIN3JSC16ProfileGeneratorEE5derefEv -__ZN3JSC8Profiler11willExecuteEPNS_9ExecStateENS_10JSValuePtrE -__ZN3JSC8Profiler10didExecuteEPNS_9ExecStateENS_10JSValuePtrE -__ZN3JSC16ProfileGenerator11willExecuteERKNS_14CallIdentifierE -__ZN3JSC11ProfileNode11willExecuteERKNS_14CallIdentifierE -__ZN3JSC11Interpreter24cti_op_profile_will_callEPvz -__ZN3JSC11Interpreter23cti_op_profile_did_callEPvz +__ZN3JSC8JITStubs23cti_op_profile_did_callEPPv +__ZN3JSC8Profiler10didExecuteEPNS_9ExecStateENS_7JSValueE __ZN3JSC16ProfileGenerator10didExecuteERKNS_14CallIdentifierE __ZN3JSC11ProfileNode10didExecuteEv -__ZN3JSCL28numberProtoFuncToExponentialEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSCL26numberProtoFuncToPrecisionEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC11Interpreter16cti_op_new_errorEPvz -__ZN3JSC19JSStaticScopeObject3putEPNS_9ExecStateERKNS_10IdentifierENS_10JSValuePtrERNS_15PutPropertySlotE -__ZN3JSC4WREC14CharacterClass11nonwordcharEv -__ZN3JSC19FunctionConstructor11getCallDataERNS_8CallDataE -__ZN3JSCL23callFunctionConstructorEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC17ObjectConstructor11getCallDataERNS_8CallDataE -__ZN3JSCL21callObjectConstructorEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC12JSActivation14deletePropertyEPNS_9ExecStateERKNS_10IdentifierE -__ZN3JSCL26dateProtoFuncSetUTCMinutesEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSCL26dateProtoFuncSetUTCSecondsEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC15PrefixErrorNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC15PrefixErrorNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC15PrefixErrorNodeD1Ev -__ZN3JSCL19stringProtoFuncBoldEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3WTF6VectorIPNS0_IN3JSC10RegisterIDELm512EEELm32EE15reserveCapacityEm -__ZN3JSC12StringObjectC2EPNS_9ExecStateEN3WTF10PassRefPtrINS_9StructureEEERKNS_7UStringE -__ZN3JSCL24regExpConstructorDollar5EPNS_9ExecStateERKNS_10IdentifierERKNS_12PropertySlotE -__ZN3JSC24createStackOverflowErrorEPNS_9ExecStateE -__ZN3JSC6JSCell3putEPNS_9ExecStateERKNS_10IdentifierENS_10JSValuePtrERNS_15PutPropertySlotE -JSValueIsEqual -__ZN3JSC10JSValuePtr13equalSlowCaseEPNS_9ExecStateES0_S0_ -__ZN3JSCL16mathProtoFuncTanEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC11Interpreter15cti_op_post_decEPvz -__ZN3JSCL28regExpConstructorLeftContextEPNS_9ExecStateERKNS_10IdentifierERKNS_12PropertySlotE -__ZN3JSCL31dateProtoFuncToLocaleDateStringEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC21DebuggerStatementNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC21DebuggerStatementNodeD1Ev -__ZN3JSCL12charSequenceEci -__ZN3JSCL17mathProtoFuncACosEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC4Heap24setGCProtectNeedsLockingEv -__ZNK3JSC7UString6is8BitEv -__ZN3WTF9ByteArray6createEm -__ZN3JSC11JSByteArrayC1EPNS_9ExecStateEN3WTF10PassRefPtrINS_9StructureEEEPNS3_9ByteArrayEPKNS_9ClassInfoE -__ZN3JSC11JSByteArray18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE -__ZN3JSC11Interpreter28cti_op_get_by_val_byte_arrayEPvz -__ZN3JSC11JSByteArray3putEPNS_9ExecStateEjNS_10JSValuePtrE -__ZN3JSC11JSByteArray3putEPNS_9ExecStateERKNS_10IdentifierENS_10JSValuePtrERNS_15PutPropertySlotE -__ZN3JSC11JSByteArray18getOwnPropertySlotEPNS_9ExecStateEjRNS_12PropertySlotE -__ZN3JSC11Interpreter28cti_op_put_by_val_byte_arrayEPvz -__ZN3JSCL28objectProtoFuncIsPrototypeOfEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC14JSGlobalObject12defineGetterEPNS_9ExecStateERKNS_10IdentifierEPNS_8JSObjectE -__ZN3JSC14JSGlobalObject12defineSetterEPNS_9ExecStateERKNS_10IdentifierEPNS_8JSObjectE -__ZN3JSC6JSCell16getConstructDataERNS_13ConstructDataE -__ZN3JSCL25numberConstructorNaNValueEPNS_9ExecStateERKNS_10IdentifierERKNS_12PropertySlotE -__ZN3JSCL23throwStackOverflowErrorEPNS_9ExecStateEPNS_12JSGlobalDataEPvRS4_ -__ZN3JSCL24regExpConstructorDollar6EPNS_9ExecStateERKNS_10IdentifierERKNS_12PropertySlotE -__ZN3JSCL24regExpConstructorDollar7EPNS_9ExecStateERKNS_10IdentifierERKNS_12PropertySlotE -__ZN3JSC9ExecState9mathTableEPS0_ -__ZN3JSC9ExecState22regExpConstructorTableEPS0_ -__ZN3JSCL24regExpConstructorDollar8EPNS_9ExecStateERKNS_10IdentifierERKNS_12PropertySlotE -__ZN3JSCL24regExpConstructorDollar9EPNS_9ExecStateERKNS_10IdentifierERKNS_12PropertySlotE -__ZN3JSCL22regExpConstructorInputEPNS_9ExecStateERKNS_10IdentifierERKNS_12PropertySlotE -__ZN3JSCL25setRegExpConstructorInputEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrE -__ZN3JSCL26regExpConstructorLastMatchEPNS_9ExecStateERKNS_10IdentifierERKNS_12PropertySlotE -__ZN3JSCL26regExpConstructorLastParenEPNS_9ExecStateERKNS_10IdentifierERKNS_12PropertySlotE -__ZN3JSCL26regExpConstructorMultilineEPNS_9ExecStateERKNS_10IdentifierERKNS_12PropertySlotE -__ZN3JSCL29setRegExpConstructorMultilineEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrE -__ZN3JSCL29regExpConstructorRightContextEPNS_9ExecStateERKNS_10IdentifierERKNS_12PropertySlotE -__ZN3JSC16PostfixErrorNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC16PostfixErrorNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC16PostfixErrorNodeD1Ev -__ZN3JSC6JSCell11getJSNumberEv -__ZN3JSC14JSGlobalObject17putWithAttributesEPNS_9ExecStateERKNS_10IdentifierENS_10JSValuePtrEj -__ZN3JSCL25arrayProtoFuncLastIndexOfEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSCL25numberConstructorMinValueEPNS_9ExecStateERKNS_10IdentifierERKNS_12PropertySlotE -__ZN3JSCL22regExpProtoFuncCompileEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSCL19arrayProtoFuncEveryEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSCL29objectProtoFuncToLocaleStringEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC6JSCell14toThisJSStringEPNS_9ExecStateE -__ZNK3JSC6JSCell12toThisStringEPNS_9ExecStateE -__ZN3JSCL31dateProtoFuncSetUTCMillisecondsEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSCL24dateProtoFuncSetUTCMonthEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSCL28arrayProtoFuncToLocaleStringEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC12JSActivation18getArgumentsGetterEv -__ZN3JSC12JSActivation15argumentsGetterEPNS_9ExecStateERKNS_10IdentifierERKNS_12PropertySlotE -__ZN3JSC9ExecState9dateTableEPS0_ -__ZN3JSC23createInvalidParamErrorEPNS_9ExecStateEPKcNS_10JSValuePtrEjPNS_9CodeBlockE -__ZNK3JSC15DotAccessorNode17isDotAccessorNodeEv -__ZNK3JSC14ExpressionNode17isDotAccessorNodeEv -__ZN3JSC13JSNotAnObject3putEPNS_9ExecStateEjNS_10JSValuePtrE -__ZN3JSC15DeleteValueNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC15DeleteValueNodeD1Ev -__ZN3JSC15DeleteValueNode12releaseNodesERNS_12NodeReleaserE -__ZN3JSC17BytecodeGenerator18emitUnexpectedLoadEPNS_10RegisterIDEd -__ZN3JSC4WREC14CharacterClass9nondigitsEv -__ZNK3JSC19JSStaticScopeObject12toThisObjectEPNS_9ExecStateE -__ZNK3JSC16JSVariableObject21getPropertyAttributesEPNS_9ExecStateERKNS_10IdentifierERj -__ZN3JSCL25dateProtoFuncToDateStringEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSCL25dateProtoFuncToTimeStringEPNS_9ExecStateEPNS_8JSObjectENS_10JSValuePtrERKNS_7ArgListE -__ZN3JSC17BytecodeGenerator35emitThrowExpressionTooDeepExceptionEv -__ZN3JSC12JSGlobalData6createEv -__ZN3WTF12isMainThreadEv -__ZN3JSC4Heap7destroyEv -__ZN3JSC12JSGlobalDataD1Ev -__ZN3JSC11InterpreterD1Ev -__ZN3JSC12RegisterFileD1Ev -__ZNK3JSC9HashTable11deleteTableEv -__ZN3JSC5LexerD1Ev -__ZN3WTF20deleteAllPairSecondsIP24OpaqueJSClassContextDataKNS_7HashMapIP13OpaqueJSClassS2_NS_7PtrHashIS5_EENS_10HashTraitsIS5_EENS8_IS2_EEEEEEvRT0_ -__ZN3JSC17CommonIdentifiersD2Ev -__ZN3JSC21deleteIdentifierTableEPNS_15IdentifierTableE -__ZN3JSC4HeapD1Ev -__ZN3JSC12SmallStringsD1Ev +__ZN3JSC8JITStubs24cti_op_profile_will_callEPPv +__ZN3JSC8Profiler11willExecuteEPNS_9ExecStateENS_7JSValueE +__ZN3JSC16ProfileGenerator11willExecuteERKNS_14CallIdentifierE +__ZN3JSC11ProfileNode11willExecuteERKNS_14CallIdentifierE +__ZN3JSC8Profiler13stopProfilingEPNS_9ExecStateERKNS_7UStringE +__ZN3JSC16ProfileGenerator13stopProfilingEv +__ZN3JSC7Profile7forEachEMNS_11ProfileNodeEFvvE +__ZNK3JSC11ProfileNode25traverseNextNodePostOrderEv +__ZN3JSC11ProfileNode13stopProfilingEv +__ZN3JSCeqERKNS_7UStringEPKc +__ZN3JSC11ProfileNode11removeChildEPS0_ +__ZN3JSC11ProfileNode8addChildEN3WTF10PassRefPtrIS0_EE +_JSValueIsObjectOfClass +_JSObjectCallAsConstructor +__ZN3JSC9constructEPNS_9ExecStateENS_7JSValueENS_13ConstructTypeERKNS_13ConstructDataERKNS_7ArgListE +_JSObjectCallAsFunction +__ZN3JSC4Heap14primaryHeapEndEv +__ZN3JSC4Heap16primaryHeapBeginEv +__ZNK3JSC18JSCallbackFunction9classInfoEv +__ZN3JSC8Profiler11willExecuteEPNS_9ExecStateERKNS_7UStringEi +__ZN3JSC8Profiler10didExecuteEPNS_9ExecStateERKNS_7UStringEi +__ZNK3JSC16ProfileGenerator5titleEv +__ZN3JSC7ProfileD0Ev +__ZN3WTF10RefCountedIN3JSC11ProfileNodeEE5derefEv +__ZN3JSC4Yarr14RegexGenerator33generatePatternCharacterNonGreedyERNS1_19TermGenerationStateE +__ZN3JSC35createInterruptedExecutionExceptionEPNS_12JSGlobalDataE +__ZNK3JSC25InterruptedExecutionError19isWatchdogExceptionEv +__ZN3JSC25InterruptedExecutionErrorD1Ev __ZN3JSC12JSGlobalData10ClientDataD2Ev +__ZN3JSC18RegExpMatchesArray16getPropertyNamesEPNS_9ExecStateERNS_17PropertyNameArrayE __ZN3WTF8CollatorC1EPKc __ZN3WTF8Collator18setOrderLowerFirstEb -__ZN3JSC35createInterruptedExecutionExceptionEPNS_12JSGlobalDataE -__ZNK3JSC25InterruptedExecutionError19isWatchdogExceptionEv +__ZN3WTF12randomNumberEv +__ZN3JSC16JSCallbackObjectINS_8JSObjectEE3putEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueERNS_15PutPropertySlotE +__ZNK3JSC6JSCell9getStringEv +__ZNK3JSC12DateInstance7getTimeERdRi +__ZN3JSC10throwErrorEPNS_9ExecStateENS_9ErrorTypeERKNS_7UStringE +_JSGlobalContextCreate +_JSGlobalContextCreateInGroup +__ZN3JSC4Heap29makeUsableFromMultipleThreadsEv +_JSGlobalContextRetain +__ZN3JSC6JSLock6unlockEb +_JSEvaluateScript +__ZNK3JSC14JSGlobalObject17supportsProfilingEv +_JSGlobalContextRelease +__ZN3JSC14JSGlobalObjectD1Ev +__ZN3JSC14JSGlobalObject18JSGlobalObjectDataD0Ev +__ZN3JSC17FunctionPrototype11getCallDataERNS_8CallDataE +__ZN3JSC15DateConstructor11getCallDataERNS_8CallDataE +__ZN3JSCL8callDateEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC13JSNotAnObject4markEv +_JSObjectIsFunction +__ZN3JSC4Heap17globalObjectCountEv +__ZN3JSC4Heap20protectedObjectCountEv +__ZN3JSC4Heap25protectedObjectTypeCountsEv +__ZN3WTF9HashTableIPKcSt4pairIS2_jENS_18PairFirstExtractorIS4_EENS_7PtrHashIS2_EENS_14PairHashTraitsINS_10HashTraitsIS2_EENSA_I +__ZN3WTF20fastMallocStatisticsEv +__ZNK3JSC4Heap10statisticsEv +__ZN3WTF27releaseFastMallocFreeMemoryEv +__ZN3JSC10JSFunction16getConstructDataERNS_13ConstructDataE +__ZN3JSC10JSFunction9constructEPNS_9ExecStateERKNS_7ArgListE +__ZN3JSC8Debugger6attachEPNS_14JSGlobalObjectE +__ZN3WTF7HashSetIPN3JSC14JSGlobalObjectENS_7PtrHashIS3_EENS_10HashTraitsIS3_EEE3addERKS3_ +__ZN3WTF9HashTableIPN3JSC14JSGlobalObjectES3_NS_17IdentityExtractorIS3_EENS_7PtrHashIS3_EENS_10HashTraitsIS3_EES9_E6rehashEi +__ZN3JSC3JIT13emit_op_debugEPNS_11InstructionE +__ZN3JSC8JITStubs12cti_op_debugEPPv +__ZN3JSC11Interpreter5debugEPNS_9ExecStateENS_11DebugHookIDEii +__ZN3JSC8Debugger6detachEPNS_14JSGlobalObjectE +__ZN3JSC9CodeBlock33functionRegisterForBytecodeOffsetEjRi +_JSStringIsEqualToUTF8CString +__ZN3JSC16JSCallbackObjectINS_8JSObjectEE14callbackGetterEPNS_9ExecStateERKNS_10IdentifierERKNS_12PropertySlotE +_JSObjectSetPrivate +__ZN3JSC7UString3Rep11computeHashEPKci +__ZN3JSC16JSCallbackObjectINS_8JSObjectEE14deletePropertyEPNS_9ExecStateERKNS_10IdentifierE +_JSGarbageCollect +__ZN3JSC4Heap6isBusyEv +__ZN3JSCL18styleFromArgStringERKNS_7UStringEl diff --git a/JavaScriptCore.pri b/JavaScriptCore.pri index 6aee0aa..91a8ce0 100644 --- a/JavaScriptCore.pri +++ b/JavaScriptCore.pri @@ -1,36 +1,75 @@ # JavaScriptCore - Qt4 build info VPATH += $$PWD -INCLUDEPATH += tmp -INCLUDEPATH += $$PWD $$PWD/parser $$PWD/bytecompiler $$PWD/debugger $$PWD/runtime $$PWD/wtf $$PWD/wtf/unicode $$PWD/interpreter $$PWD/jit $$PWD/profiler $$PWD/wrec $$PWD/API $$PWD/.. \ - $$PWD/ForwardingHeaders $$PWD/bytecode $$PWD/assembler -DEFINES += BUILDING_QT__ +CONFIG(debug, debug|release) { + isEmpty(GENERATED_SOURCES_DIR):GENERATED_SOURCES_DIR = generated$${QMAKE_DIR_SEP}debug + OBJECTS_DIR = obj/debug +} else { # Release + isEmpty(GENERATED_SOURCES_DIR):GENERATED_SOURCES_DIR = generated$${QMAKE_DIR_SEP}release + OBJECTS_DIR = obj/release +} + +INCLUDEPATH += $$GENERATED_SOURCES_DIR \ + $$PWD \ + $$PWD/parser \ + $$PWD/bytecompiler \ + $$PWD/debugger \ + $$PWD/runtime \ + $$PWD/wtf \ + $$PWD/wtf/unicode \ + $$PWD/interpreter \ + $$PWD/jit \ + $$PWD/profiler \ + $$PWD/wrec \ + $$PWD/yarr \ + $$PWD/API \ + $$PWD/.. \ + $$PWD/ForwardingHeaders \ + $$PWD/bytecode \ + $$PWD/assembler \ -isEmpty(GENERATED_SOURCES_DIR):GENERATED_SOURCES_DIR = tmp -GENERATED_SOURCES_DIR_SLASH = $$GENERATED_SOURCES_DIR/ +DEFINES += BUILDING_QT__ BUILDING_JavaScriptCore BUILDING_WTF + +GENERATED_SOURCES_DIR_SLASH = $${GENERATED_SOURCES_DIR}$${QMAKE_DIR_SEP} win32-* { - GENERATED_SOURCES_DIR_SLASH ~= s|/|\| LIBS += -lwinmm } -# Disable the JIT due to numerous observed miscompilations :( -#CONFIG(release):isEqual(QT_ARCH,i386) { -# JIT_DEFINES = ENABLE_JIT ENABLE_WREC ENABLE_JIT_OPTIMIZE_CALL ENABLE_JIT_OPTIMIZE_PROPERTY_ACCESS ENABLE_JIT_OPTIMIZE_ARITHMETIC -# # gcc <= 4.1 is known to miscompile, so require >= 4.2, written as major > 3 and minor > 1 -# linux-g++*:greaterThan(QT_GCC_MAJOR_VERSION,3):greaterThan(QT_GCC_MINOR_VERSION,1) { -# DEFINES += $$JIT_DEFINES -# SOURCES += wtf/TCSystemAlloc.cpp -# DEFINES -= USE_SYSTEM_MALLOC -# } -# win32-msvc* { -# DEFINES += $$JIT_DEFINES -# } -#} +# Default rules to turn JIT on/off +!contains(DEFINES, ENABLE_JIT=.) { + isEqual(QT_ARCH,i386)|isEqual(QT_ARCH,windows) { + # Require gcc >= 4.1 + CONFIG(release):linux-g++*:greaterThan(QT_GCC_MAJOR_VERSION,3):greaterThan(QT_GCC_MINOR_VERSION,0) { + DEFINES += ENABLE_JIT=1 + } + win32-msvc* { + DEFINES += ENABLE_JIT=1 + } + } +} + +# Rules when JIT enabled +contains(DEFINES, ENABLE_JIT=1) { + !contains(DEFINES, ENABLE_YARR=.): DEFINES += ENABLE_YARR=1 + !contains(DEFINES, ENABLE_YARR_JIT=.): DEFINES += ENABLE_YARR_JIT=1 + !contains(DEFINES, ENABLE_JIT_OPTIMIZE_CALL=.): DEFINES += ENABLE_JIT_OPTIMIZE_CALL=1 + !contains(DEFINES, ENABLE_JIT_OPTIMIZE_PROPERTY_ACCESS=.): DEFINES += ENABLE_JIT_OPTIMIZE_PROPERTY_ACCESS=1 + !contains(DEFINES, ENABLE_JIT_OPTIMIZE_ARITHMETIC=.): DEFINES += ENABLE_JIT_OPTIMIZE_ARITHMETIC=1 + linux-g++* { + !contains(DEFINES, WTF_USE_JIT_STUB_ARGUMENT_VA_LIST=.): DEFINES += WTF_USE_JIT_STUB_ARGUMENT_VA_LIST=1 + QMAKE_CXXFLAGS += -fno-stack-protector + QMAKE_CFLAGS += -fno-stack-protector + } + win32-msvc* { + !contains(DEFINES, WTF_USE_JIT_STUB_ARGUMENT_REGISTER=.): DEFINES += WTF_USE_JIT_STUB_ARGUMENT_REGISTER=1 + } +} include(pcre/pcre.pri) LUT_FILES += \ runtime/DatePrototype.cpp \ + runtime/JSONObject.cpp \ runtime/NumberConstructor.cpp \ runtime/StringPrototype.cpp \ runtime/ArrayPrototype.cpp \ @@ -51,6 +90,7 @@ SOURCES += \ wtf/MainThread.cpp \ wtf/RandomNumber.cpp \ wtf/RefCountedLeakCounter.cpp \ + wtf/TypeTraits.cpp \ wtf/unicode/CollatorDefault.cpp \ wtf/unicode/icu/CollatorICU.cpp \ wtf/unicode/UTF8.cpp \ @@ -71,26 +111,28 @@ SOURCES += \ runtime/JSVariableObject.cpp \ runtime/JSActivation.cpp \ runtime/JSNotAnObject.cpp \ + runtime/JSONObject.cpp \ + runtime/LiteralParser.cpp \ + runtime/TimeoutChecker.cpp \ bytecode/CodeBlock.cpp \ bytecode/StructureStubInfo.cpp \ bytecode/JumpTable.cpp \ jit/JIT.cpp \ jit/JITCall.cpp \ jit/JITArithmetic.cpp \ + jit/JITOpcodes.cpp \ jit/JITPropertyAccess.cpp \ jit/ExecutableAllocator.cpp \ + jit/JITStubs.cpp \ bytecompiler/BytecodeGenerator.cpp \ runtime/ExceptionHelpers.cpp \ runtime/JSPropertyNameIterator.cpp \ interpreter/Interpreter.cpp \ bytecode/Opcode.cpp \ bytecode/SamplingTool.cpp \ - wrec/CharacterClass.cpp \ - wrec/CharacterClassConstructor.cpp \ - wrec/WREC.cpp \ - wrec/WRECFunctors.cpp \ - wrec/WRECGenerator.cpp \ - wrec/WRECParser.cpp \ + yarr/RegexCompiler.cpp \ + yarr/RegexInterpreter.cpp \ + yarr/RegexJIT.cpp \ interpreter/RegisterFile.cpp win32-*: SOURCES += jit/ExecutableAllocatorWin.cpp @@ -112,8 +154,8 @@ SOURCES += \ runtime/ConstructData.cpp \ wtf/CurrentTime.cpp \ runtime/DateConstructor.cpp \ + runtime/DateConversion.cpp \ runtime/DateInstance.cpp \ - runtime/DateMath.cpp \ runtime/DatePrototype.cpp \ debugger/Debugger.cpp \ debugger/DebuggerCallFrame.cpp \ @@ -132,6 +174,7 @@ SOURCES += \ runtime/InternalFunction.cpp \ runtime/Completion.cpp \ runtime/JSArray.cpp \ + runtime/JSAPIValueWrapper.cpp \ runtime/JSByteArray.cpp \ runtime/JSCell.cpp \ runtime/JSFunction.cpp \ @@ -156,6 +199,7 @@ SOURCES += \ runtime/ObjectPrototype.cpp \ runtime/Operations.cpp \ parser/Parser.cpp \ + parser/ParserArena.cpp \ runtime/PropertyNameArray.cpp \ runtime/PropertySlot.cpp \ runtime/PrototypeFunction.cpp \ @@ -177,13 +221,20 @@ SOURCES += \ profiler/ProfileNode.cpp \ profiler/Profiler.cpp \ profiler/TreeProfile.cpp \ + wtf/DateMath.cpp \ wtf/FastMalloc.cpp \ wtf/Threading.cpp \ - wtf/ThreadingQt.cpp \ wtf/qt/MainThreadQt.cpp +!contains(DEFINES, ENABLE_SINGLE_THREADED=1) { + SOURCES += wtf/qt/ThreadingQt.cpp +} else { + DEFINES += ENABLE_JSC_MULTIPLE_THREADS=0 + SOURCES += wtf/ThreadingNone.cpp +} + # GENERATOR 1-A: LUT creator -lut.output = $$GENERATED_SOURCES_DIR/${QMAKE_FILE_BASE}.lut.h +lut.output = $${GENERATED_SOURCES_DIR}$${QMAKE_DIR_SEP}${QMAKE_FILE_BASE}.lut.h lut.commands = perl $$PWD/create_hash_table ${QMAKE_FILE_NAME} -i > ${QMAKE_FILE_OUT} lut.depend = ${QMAKE_FILE_NAME} lut.input = LUT_FILES @@ -191,7 +242,7 @@ lut.CONFIG += no_link addExtraCompiler(lut) # GENERATOR 1-B: particular LUT creator (for 1 file only) -keywordlut.output = $$GENERATED_SOURCES_DIR/Lexer.lut.h +keywordlut.output = $${GENERATED_SOURCES_DIR}$${QMAKE_DIR_SEP}Lexer.lut.h keywordlut.commands = perl $$PWD/create_hash_table ${QMAKE_FILE_NAME} -i > ${QMAKE_FILE_OUT} keywordlut.depend = ${QMAKE_FILE_NAME} keywordlut.input = KEYWORDLUT_FILES @@ -199,8 +250,8 @@ keywordlut.CONFIG += no_link addExtraCompiler(keywordlut) # GENERATOR 2: bison grammar -jscbison.output = $$GENERATED_SOURCES_DIR/${QMAKE_FILE_BASE}.cpp -jscbison.commands = bison -d -p jscyy ${QMAKE_FILE_NAME} -o ${QMAKE_FILE_BASE}.tab.c && $(MOVE) ${QMAKE_FILE_BASE}.tab.c ${QMAKE_FILE_OUT} && $(MOVE) ${QMAKE_FILE_BASE}.tab.h $$GENERATED_SOURCES_DIR/${QMAKE_FILE_BASE}.h +jscbison.output = $${GENERATED_SOURCES_DIR}$${QMAKE_DIR_SEP}${QMAKE_FILE_BASE}.cpp +jscbison.commands = bison -d -p jscyy ${QMAKE_FILE_NAME} -o $${GENERATED_SOURCES_DIR}$${QMAKE_DIR_SEP}${QMAKE_FILE_BASE}.tab.c && $(MOVE) $${GENERATED_SOURCES_DIR}$${QMAKE_DIR_SEP}${QMAKE_FILE_BASE}.tab.c ${QMAKE_FILE_OUT} && $(MOVE) $${GENERATED_SOURCES_DIR}$${QMAKE_DIR_SEP}${QMAKE_FILE_BASE}.tab.h $${GENERATED_SOURCES_DIR}$${QMAKE_DIR_SEP}${QMAKE_FILE_BASE}.h jscbison.depend = ${QMAKE_FILE_NAME} jscbison.input = JSCBISON jscbison.variable_out = GENERATED_SOURCES diff --git a/JavaScriptCore.pro b/JavaScriptCore.pro index 56dae05..28f0e6b 100644 --- a/JavaScriptCore.pro +++ b/JavaScriptCore.pro @@ -21,13 +21,16 @@ CONFIG(QTDIR_build) { } isEmpty(GENERATED_SOURCES_DIR):GENERATED_SOURCES_DIR = tmp -GENERATED_SOURCES_DIR_SLASH = $$GENERATED_SOURCES_DIR/ -win32-*: GENERATED_SOURCES_DIR_SLASH ~= s|/|\| +GENERATED_SOURCES_DIR_SLASH = $${GENERATED_SOURCES_DIR}$${QMAKE_DIR_SEP} INCLUDEPATH += $$GENERATED_SOURCES_DIR !CONFIG(QTDIR_build) { - OBJECTS_DIR = tmp + CONFIG(debug, debug|release) { + OBJECTS_DIR = obj/debug + } else { # Release + OBJECTS_DIR = obj/release + } } include($$OUTPUT_DIR/config.pri) @@ -64,7 +67,7 @@ include(JavaScriptCore.pri) QMAKE_EXTRA_TARGETS += generated_files -qt-port: lessThan(QT_MINOR_VERSION, 4) { +lessThan(QT_MINOR_VERSION, 4) { DEFINES += QT_BEGIN_NAMESPACE="" QT_END_NAMESPACE="" } diff --git a/JavaScriptCore.scons b/JavaScriptCore.scons deleted file mode 100644 index 24e5003..0000000 --- a/JavaScriptCore.scons +++ /dev/null @@ -1,307 +0,0 @@ -# The keys in sources are the paths to the directories -# the values are an array of source files in those directories to compile -sources = {} -sources['API'] = [ - 'API/JSBase.cpp', - 'API/JSCallbackConstructor.cpp', - 'API/JSCallbackFunction.cpp', - 'API/JSCallbackObject.cpp', - 'API/JSClassRef.cpp', - 'API/JSContextRef.cpp', - 'API/JSObjectRef.cpp', - 'API/JSProfilerPrivate.cpp', - 'API/JSStringRef.cpp', - 'API/JSValueRef.cpp', - 'API/OpaqueJSString.cpp', -] -sources['bytecompiler'] = [ - 'bytecompiler/BytecodeGenerator.cpp', -] -sources['debugger'] = [ - 'debugger/Debugger.cpp', - 'debugger/DebuggerActivation.cpp', - 'debugger/DebuggerCallFrame.cpp', -] -sources['parser'] = [ - 'parser/Lexer.cpp', - 'parser/Nodes.cpp', - 'parser/Parser.cpp', -] -sources['pcre'] = [ - 'pcre/pcre_compile.cpp', - 'pcre/pcre_exec.cpp', - 'pcre/pcre_tables.cpp', - 'pcre/pcre_ucp_searchfuncs.cpp', - 'pcre/pcre_xclass.cpp', -] -sources['profiler'] = [ - 'profiler/HeavyProfile.cpp', - 'profiler/Profile.cpp', - 'profiler/ProfileGenerator.cpp', - 'profiler/ProfileNode.cpp', - 'profiler/Profiler.cpp', - 'profiler/TreeProfile.cpp', -] -sources['runtime'] = [ - 'runtime/ArgList.cpp', - 'runtime/Arguments.cpp', - 'runtime/ArrayConstructor.cpp', - 'runtime/ArrayPrototype.cpp', - 'runtime/BooleanConstructor.cpp', - 'runtime/BooleanObject.cpp', - 'runtime/BooleanPrototype.cpp', - 'runtime/CallData.cpp', - 'runtime/Collector.cpp', - 'runtime/Completion.cpp', - 'runtime/CommonIdentifiers.cpp', - 'runtime/ConstructData.cpp', - 'runtime/DateConstructor.cpp', - 'runtime/DateInstance.cpp', - 'runtime/DateMath.cpp', - 'runtime/DatePrototype.cpp', - 'runtime/Error.cpp', - 'runtime/ErrorConstructor.cpp', - 'runtime/ErrorInstance.cpp', - 'runtime/ErrorPrototype.cpp', - 'runtime/ExceptionHelpers.cpp', - 'runtime/FunctionConstructor.cpp', - 'runtime/FunctionPrototype.cpp', - 'runtime/GetterSetter.cpp', - 'runtime/GlobalEvalFunction.cpp', - 'runtime/Identifier.cpp', - 'runtime/InitializeThreading.cpp', - 'runtime/InternalFunction.cpp', - 'runtime/JSActivation.cpp', - 'runtime/JSArray.cpp', - 'runtime/JSByteArray.cpp', - 'runtime/JSCell.cpp', - 'runtime/JSFunction.cpp', - 'runtime/JSGlobalData.cpp', - 'runtime/JSGlobalObject.cpp', - 'runtime/JSGlobalObjectFunctions.cpp', - 'runtime/JSImmediate.cpp', - 'runtime/JSLock.cpp', - 'runtime/JSNotAnObject.cpp', - 'runtime/JSNumberCell.cpp', - 'runtime/JSObject.cpp', - 'runtime/JSPropertyNameIterator.cpp', - 'runtime/JSStaticScopeObject.cpp', - 'runtime/JSString.cpp', - 'runtime/JSValue.cpp', - 'runtime/JSVariableObject.cpp', - 'runtime/JSWrapperObject.cpp', - 'runtime/Lookup.cpp', - 'runtime/MathObject.cpp', - 'runtime/NativeErrorConstructor.cpp', - 'runtime/NativeErrorPrototype.cpp', - 'runtime/NumberConstructor.cpp', - 'runtime/NumberObject.cpp', - 'runtime/NumberPrototype.cpp', - 'runtime/ObjectConstructor.cpp', - 'runtime/ObjectPrototype.cpp', - 'runtime/Operations.cpp', - 'runtime/PropertyNameArray.cpp', - 'runtime/PropertySlot.cpp', - 'runtime/PrototypeFunction.cpp', - 'runtime/RegExp.cpp', - 'runtime/RegExpConstructor.cpp', - 'runtime/RegExpObject.cpp', - 'runtime/RegExpPrototype.cpp', - 'runtime/ScopeChain.cpp', - 'runtime/SmallStrings.cpp', - 'runtime/StringConstructor.cpp', - 'runtime/StringObject.cpp', - 'runtime/StringPrototype.cpp', - 'runtime/Structure.cpp', - 'runtime/StructureChain.cpp', - 'runtime/UString.cpp', -] -sources['bytecode'] = [ - 'bytecode/CodeBlock.cpp', - 'bytecode/StructureStubInfo.cpp', - 'bytecode/JumpTable.cpp', - 'bytecode/Opcode.cpp', - 'bytecode/SamplingTool.cpp', -] -sources['interpreter'] = [ - 'interpreter/CallFrame.cpp', - 'interpreter/Interpreter.cpp', - 'interpreter/RegisterFile.cpp', -] -sources['jit'] = [ - 'jit/ExecutableAllocator.cpp', - 'jit/JIT.cpp', -] -sources['wrec'] = [ - 'wrec/CharacterClass.cpp', - 'wrec/CharacterClassConstructor.cpp', - 'wrec/WREC.cpp', - 'wrec/WRECFunctors.cpp', - 'wrec/WRECGenerator.cpp', - 'wrec/WRECParser.cpp', -] -sources['wtf'] = [ - 'wtf/Assertions.cpp', - 'wtf/ByteArray.cpp', - 'wtf/CurrentTime.cpp', - 'wtf/FastMalloc.cpp', - 'wtf/HashTable.cpp', - 'wtf/RandomNumber.cpp', - 'wtf/RefCountedLeakCounter.cpp', - 'wtf/Threading.cpp', - 'wtf/dtoa.cpp', -] -sources['wtf/unicode'] = [ - 'wtf/unicode/CollatorDefault.cpp', - 'wtf/unicode/UTF8.cpp', -] -sources['wtf/unicode/icu'] = [ - 'wtf/unicode/icu/CollatorICU.cpp', -] - -env = Environment() - -building_on_win32 = env['PLATFORM'] == 'win32' or env['PLATFORM'] == 'cygwin' - -# Scons uses gcc when building under cygwin by default -# We also have to manually force 8.0 or Scons will try and -# look up what version to use using the registry and fail -# due to lack of cygwin-python registry support -if env['PLATFORM'] == 'cygwin': - env['MSVS_VERSION'] = '8.0' - # Some systems have PROGRAMFILES, some have ProgramFiles - # Scons msvc tool only expects 'ProgramFiles' - import os - if os.getenv('PROGRAMFILES') and not os.getenv('ProgramFiles'): - os.environ['ProgramFiles'] = os.getenv('PROGRAMFILES') - - env.Tool('msvc') - env.Tool('mslink') - env.Tool('mslib') - -# Scons is failing to carry the %PATH% value through correctly -# Hack IncrediBuild into our path so cl.exe doesn't crash -if env['PLATFORM'] == 'win32': - env.AppendENVPath('PATH', 'c:/Program Files/Xoreax/IncrediBuild') - -if env['PLATFORM'] == 'darwin': - sources['API'].append('API/JSStringRefCF.cpp') - sources['profiler'].append('profiler/ProfilerServer.mm') - sources['wtf'].append('wtf/ThreadingPthreads.cpp') - sources['wtf'].append('wtf/MainThread.cpp') - sources['wtf/mac'] = ['wtf/mac/MainThreadMac.mm'] - sources['wtf'].append('wtf/TCSystemAlloc.cpp') - sources['jit'].append('jit/ExecutableAllocatorPosix.cpp') -elif building_on_win32: - sources['wtf'].append('wtf/ThreadingNone.cpp') - sources['jit'].append('jit/ExecutableAllocatorWin.cpp') - env.Append(CPPDEFINES = ['ENABLE_JSC_MULTIPLE_THREADS=0']) - -derived_sources_path = 'DerivedSources/JavaScriptCore/' -def DerivedSources(path): - return derived_sources_path + path - -derived_sources_results = map(DerivedSources, [ - 'ArrayPrototype.lut.h', - 'DatePrototype.lut.h', - 'MathObject.lut.h', - 'NumberConstructor.lut.h', - 'RegExpConstructor.lut.h', - 'RegExpObject.lut.h', - 'StringPrototype.lut.h' - 'chartables.c', - 'grammar.cpp', - 'grammar.h', - 'lexer.lut.h', -]) - -derived_sources_sources = [ - 'runtime/ArrayPrototype.cpp', - 'runtime/DatePrototype.cpp', - 'runtime/MathObject.cpp', - 'runtime/NumberConstructor.cpp', - 'runtime/RegExpConstructor.cpp', - 'runtime/RegExpObject.cpp', - 'runtime/StringPrototype.cpp', - 'parser/Grammar.y', - 'parser/Lexer.cpp', -] - -# Generate DerivedSources -# Make sure Windows knows where bash (and all the other cygwin commands) live -if env['PLATFORM'] == 'win32': - env.AppendENVPath('PATH', 'C:/cygwin/bin') -env.Command(derived_sources_results, derived_sources_sources, 'bash make-generated-sources.sh') -sources[derived_sources_path] = [DerivedSources('Grammar.cpp')] - -# Handle os-version specific build settings -if env['PLATFORM'] == 'darwin': - from subprocess import Popen, PIPE - version_pieces = Popen(["sw_vers", "-productVersion"], stdout = PIPE).communicate()[0].split('.') - if map(int, version_pieces)[:2] > (10, 5): - # Dtrace doesn't exist in Tiger, and was broken in Leopard - env.Command(DerivedSources('TracingDtrace.h'), 'runtime/Tracing.d', '/usr/sbin/dtrace -h -o $TARGET -s $SOURCE') - -# This build file builds the Chromium port for now, support for -# others could be added later. -env.Append(CPPDEFINES = ['BUILDING_CHROMIUM__']) - -# I'm not certain how many of these windows defines are actually required. -if building_on_win32: - env.Append(CPPDEFINES = ['_WIN32_WINNT=0x0600', 'WINVER=0x0600', 'WIN32', '_WINDOWS', 'NOMINMAX', 'UNICODE', '_UNICODE', '__STD_C', '_HAS_EXCEPTIONS=0']) - -# Scons out-of-the-box only supports precompiled headers for MSVC -# remove this when we fix Scons to understand GCC precompiled headers -if env['CC'] == 'gcc': - env['CCFLAGS'] = '-include JavaScriptCorePrefix.h' -# Turns out the MSVC PCH support is badly broken -# env['PCH'] = 'JavaScriptCorePrefix.h' -# env['PCHSTOP'] = 'JavaScriptCorePrefix.h' - -if env['PLATFORM'] == 'darwin': - env['FRAMEWORKS'] = ['CoreFoundation', 'Foundation'] - env['LIBS'] = ['icucore'] - # Apple does not ship the ICU headers with Mac OS X, so WebKit includes a copy of 3.2 headers - env.Append(CPPPATH = 'icu') - -webkit_libraries_path = "../WebKitLibraries/win/" -def WebKitLibraries(path): - return webkit_libraries_path + path - -include_paths = ['.', '..', 'ForwardingHeaders'] + sources.keys() -env.Append(CPPPATH = include_paths) -if building_on_win32: - env.Append(CPPPATH = ['os-win32', WebKitLibraries('include')]) - env.Prepend(LIBPATH = [WebKitLibraries('lib')]) - env.Append(LIBS = ['icuin', 'icuuc', 'user32', 'winmm']) - -# Save off a copy of the environment for use with jsc -jsc_env = env.Clone() - -if building_on_win32: - env.StaticLibrary("JavaScriptCore", sources.values()) -else: - env.SharedLibrary("JavaScriptCore", sources.values()) - - -env = jsc_env - -# Build the jsc testing shell -shell_sources = ['jsc.cpp'] -build_directory = '.' # This should be changed to point to wherever JavaScriptCore gets built to - -# It's hacky to re-use the same environment from JavaScriptCore -# but it makes building on windows easier for now -env['CPPPATH'] = include_paths -env['LIBS'] = ['JavaScriptCore'] -env['LIBPATH'] = [build_directory] - -if env['PLATFORM'] == 'darwin': - env.Append(LIBS = ['edit']) - env.Append(CPPPATH = 'icu') -elif building_on_win32: - env.Append(CPPPATH = ['os-win32', WebKitLibraries('include')]) - env.Prepend(LIBPATH = [WebKitLibraries('lib')]) - env.Append(LIBS = ['icuin', 'icuuc', 'user32', 'winmm']) - -env.Program('jsc', shell_sources) diff --git a/JavaScriptCorePrefix.h b/JavaScriptCorePrefix.h index e71c8a8..13b21bb 100644 --- a/JavaScriptCorePrefix.h +++ b/JavaScriptCorePrefix.h @@ -25,15 +25,6 @@ #endif -#if defined(__APPLE__) -#import -#if MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_4 -#define BUILDING_ON_TIGER 1 -#elif MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_5 -#define BUILDING_ON_LEOPARD 1 -#endif -#endif - #ifdef __cplusplus #define new ("if you use new/delete make sure to include config.h at the top of the file"()) #define delete ("if you use new/delete make sure to include config.h at the top of the file"()) diff --git a/JavaScriptCoreSources.bkl b/JavaScriptCoreSources.bkl index 7ba3e09..1bdf251 100644 --- a/JavaScriptCoreSources.bkl +++ b/JavaScriptCoreSources.bkl @@ -64,6 +64,7 @@ Source files for JSCore. parser/Lexer.cpp parser/Nodes.cpp parser/Parser.cpp + parser/ParserArena.cpp profiler/HeavyProfile.cpp @@ -86,8 +87,8 @@ Source files for JSCore. runtime/CommonIdentifiers.cpp runtime/ConstructData.cpp runtime/DateConstructor.cpp + runtime/DateConversion.cpp runtime/DateInstance.cpp - runtime/DateMath.cpp runtime/DatePrototype.cpp runtime/Error.cpp runtime/ErrorConstructor.cpp @@ -115,12 +116,14 @@ Source files for JSCore. runtime/JSNotAnObject.cpp runtime/JSNumberCell.cpp runtime/JSObject.cpp + runtime/JSONObject.cpp runtime/JSPropertyNameIterator.cpp runtime/JSStaticScopeObject.cpp runtime/JSString.cpp runtime/JSValue.cpp runtime/JSVariableObject.cpp runtime/JSWrapperObject.cpp + runtime/LiteralParser.cpp runtime/Lookup.cpp runtime/MathObject.cpp runtime/NativeErrorConstructor.cpp @@ -152,15 +155,24 @@ Source files for JSCore. bytecode/StructureStubInfo.cpp bytecode/JumpTable.cpp runtime/ExceptionHelpers.cpp + runtime/TimeoutChecker.cpp interpreter/Interpreter.cpp bytecode/Opcode.cpp bytecode/SamplingTool.cpp interpreter/RegisterFile.cpp + jit/ExecutableAllocator.cpp + + + jit/ExecutableAllocatorWin.cpp + + + jit/ExecutableAllocatorPosix.cpp wtf/Assertions.cpp wtf/ByteArray.cpp wtf/CurrentTime.cpp + wtf/DateMath.cpp wtf/FastMalloc.cpp wtf/HashTable.cpp wtf/MainThread.cpp @@ -169,6 +181,7 @@ Source files for JSCore. wtf/TCSystemAlloc.cpp wtf/Threading.cpp wtf/ThreadingNone.cpp + wtf/TypeTraits.cpp wtf/wx/MainThreadWx.cpp wtf/unicode/CollatorDefault.cpp wtf/unicode/icu/CollatorICU.cpp diff --git a/SConstruct b/SConstruct deleted file mode 100644 index b77d202..0000000 --- a/SConstruct +++ /dev/null @@ -1 +0,0 @@ -SConscript(['JavaScriptCore.scons']) diff --git a/assembler/ARMv7Assembler.h b/assembler/ARMv7Assembler.h new file mode 100644 index 0000000..7cf8873 --- /dev/null +++ b/assembler/ARMv7Assembler.h @@ -0,0 +1,1758 @@ +/* + * Copyright (C) 2009 Apple Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef ARMAssembler_h +#define ARMAssembler_h + +#include + +#if ENABLE(ASSEMBLER) && PLATFORM_ARM_ARCH(7) + +#include "AssemblerBuffer.h" +#include +#include +#include + +namespace JSC { + +namespace ARM { + typedef enum { + r0, + r1, + r2, + r3, + r4, + r5, + r6, + r7, wr = r7, // thumb work register + r8, + r9, sb = r9, // static base + r10, sl = r10, // stack limit + r11, fp = r11, // frame pointer + r12, ip = r12, + r13, sp = r13, + r14, lr = r14, + r15, pc = r15, + } RegisterID; + + // s0 == d0 == q0 + // s4 == d2 == q1 + // etc + typedef enum { + s0 = 0, + s1 = 1, + s2 = 2, + s3 = 3, + s4 = 4, + s5 = 5, + s6 = 6, + s7 = 7, + s8 = 8, + s9 = 9, + s10 = 10, + s11 = 11, + s12 = 12, + s13 = 13, + s14 = 14, + s15 = 15, + s16 = 16, + s17 = 17, + s18 = 18, + s19 = 19, + s20 = 20, + s21 = 21, + s22 = 22, + s23 = 23, + s24 = 24, + s25 = 25, + s26 = 26, + s27 = 27, + s28 = 28, + s29 = 29, + s30 = 30, + s31 = 31, + d0 = 0 << 1, + d1 = 1 << 1, + d2 = 2 << 1, + d3 = 3 << 1, + d4 = 4 << 1, + d5 = 5 << 1, + d6 = 6 << 1, + d7 = 7 << 1, + d8 = 8 << 1, + d9 = 9 << 1, + d10 = 10 << 1, + d11 = 11 << 1, + d12 = 12 << 1, + d13 = 13 << 1, + d14 = 14 << 1, + d15 = 15 << 1, + d16 = 16 << 1, + d17 = 17 << 1, + d18 = 18 << 1, + d19 = 19 << 1, + d20 = 20 << 1, + d21 = 21 << 1, + d22 = 22 << 1, + d23 = 23 << 1, + d24 = 24 << 1, + d25 = 25 << 1, + d26 = 26 << 1, + d27 = 27 << 1, + d28 = 28 << 1, + d29 = 29 << 1, + d30 = 30 << 1, + d31 = 31 << 1, + q0 = 0 << 2, + q1 = 1 << 2, + q2 = 2 << 2, + q3 = 3 << 2, + q4 = 4 << 2, + q5 = 5 << 2, + q6 = 6 << 2, + q7 = 7 << 2, + q8 = 8 << 2, + q9 = 9 << 2, + q10 = 10 << 2, + q11 = 11 << 2, + q12 = 12 << 2, + q13 = 13 << 2, + q14 = 14 << 2, + q15 = 15 << 2, + q16 = 16 << 2, + q17 = 17 << 2, + q18 = 18 << 2, + q19 = 19 << 2, + q20 = 20 << 2, + q21 = 21 << 2, + q22 = 22 << 2, + q23 = 23 << 2, + q24 = 24 << 2, + q25 = 25 << 2, + q26 = 26 << 2, + q27 = 27 << 2, + q28 = 28 << 2, + q29 = 29 << 2, + q30 = 30 << 2, + q31 = 31 << 2, + } FPRegisterID; +} + +class ARMv7Assembler; +class ARMThumbImmediate { + friend class ARMv7Assembler; + + typedef uint8_t ThumbImmediateType; + static const ThumbImmediateType TypeInvalid = 0; + static const ThumbImmediateType TypeEncoded = 1; + static const ThumbImmediateType TypeUInt16 = 2; + + typedef union { + int16_t asInt; + struct { + unsigned imm8 : 8; + unsigned imm3 : 3; + unsigned i : 1; + unsigned imm4 : 4; + }; + // If this is an encoded immediate, then it may describe a shift, or a pattern. + struct { + unsigned shiftValue7 : 7; + unsigned shiftAmount : 5; + }; + struct { + unsigned immediate : 8; + unsigned pattern : 4; + }; + } ThumbImmediateValue; + + // byte0 contains least significant bit; not using an array to make client code endian agnostic. + typedef union { + int32_t asInt; + struct { + uint8_t byte0; + uint8_t byte1; + uint8_t byte2; + uint8_t byte3; + }; + } PatternBytes; + + ALWAYS_INLINE static int32_t countLeadingZerosPartial(uint32_t& value, int32_t& zeros, const int N) + { + if (value & ~((1<>= N; /* if any were set, lose the bottom N */ \ + else /* if none of the top N bits are set, */ \ + zeros += N; /* then we have identified N leading zeros */ + } + + static int32_t countLeadingZeros(uint32_t value) + { + if (!value) + return 32; + + int32_t zeros = 0; + countLeadingZerosPartial(value, zeros, 16); + countLeadingZerosPartial(value, zeros, 8); + countLeadingZerosPartial(value, zeros, 4); + countLeadingZerosPartial(value, zeros, 2); + countLeadingZerosPartial(value, zeros, 1); + return zeros; + } + + ARMThumbImmediate() + : m_type(TypeInvalid) + { + m_value.asInt = 0; + } + + ARMThumbImmediate(ThumbImmediateType type, ThumbImmediateValue value) + : m_type(type) + , m_value(value) + { + } + + ARMThumbImmediate(ThumbImmediateType type, uint16_t value) + : m_type(TypeUInt16) + { + m_value.asInt = value; + } + +public: + static ARMThumbImmediate makeEncodedImm(uint32_t value) + { + ThumbImmediateValue encoding; + encoding.asInt = 0; + + // okay, these are easy. + if (value < 256) { + encoding.immediate = value; + encoding.pattern = 0; + return ARMThumbImmediate(TypeEncoded, encoding); + } + + int32_t leadingZeros = countLeadingZeros(value); + // if there were 24 or more leading zeros, then we'd have hit the (value < 256) case. + ASSERT(leadingZeros < 24); + + // Given a number with bit fields Z:B:C, where count(Z)+count(B)+count(C) == 32, + // Z are the bits known zero, B is the 8-bit immediate, C are the bits to check for + // zero. count(B) == 8, so the count of bits to be checked is 24 - count(Z). + int32_t rightShiftAmount = 24 - leadingZeros; + if (value == ((value >> rightShiftAmount) << rightShiftAmount)) { + // Shift the value down to the low byte position. The assign to + // shiftValue7 drops the implicit top bit. + encoding.shiftValue7 = value >> rightShiftAmount; + // The endoded shift amount is the magnitude of a right rotate. + encoding.shiftAmount = 8 + leadingZeros; + return ARMThumbImmediate(TypeEncoded, encoding); + } + + PatternBytes bytes; + bytes.asInt = value; + + if ((bytes.byte0 == bytes.byte1) && (bytes.byte0 == bytes.byte2) && (bytes.byte0 == bytes.byte3)) { + encoding.immediate = bytes.byte0; + encoding.pattern = 3; + return ARMThumbImmediate(TypeEncoded, encoding); + } + + if ((bytes.byte0 == bytes.byte2) && !(bytes.byte1 | bytes.byte3)) { + encoding.immediate = bytes.byte0; + encoding.pattern = 1; + return ARMThumbImmediate(TypeEncoded, encoding); + } + + if ((bytes.byte1 == bytes.byte3) && !(bytes.byte0 | bytes.byte2)) { + encoding.immediate = bytes.byte0; + encoding.pattern = 2; + return ARMThumbImmediate(TypeEncoded, encoding); + } + + return ARMThumbImmediate(); + } + + static ARMThumbImmediate makeUInt12(int32_t value) + { + return (!(value & 0xfffff000)) + ? ARMThumbImmediate(TypeUInt16, (uint16_t)value) + : ARMThumbImmediate(); + } + + static ARMThumbImmediate makeUInt12OrEncodedImm(int32_t value) + { + // If this is not a 12-bit unsigned it, try making an encoded immediate. + return (!(value & 0xfffff000)) + ? ARMThumbImmediate(TypeUInt16, (uint16_t)value) + : makeEncodedImm(value); + } + + // The 'make' methods, above, return a !isValid() value if the argument + // cannot be represented as the requested type. This methods is called + // 'get' since the argument can always be represented. + static ARMThumbImmediate makeUInt16(uint16_t value) + { + return ARMThumbImmediate(TypeUInt16, value); + } + + bool isValid() + { + return m_type != TypeInvalid; + } + + // These methods rely on the format of encoded byte values. + bool isUInt3() { return !(m_value.asInt & 0xfff8); } + bool isUInt4() { return !(m_value.asInt & 0xfff0); } + bool isUInt5() { return !(m_value.asInt & 0xffe0); } + bool isUInt6() { return !(m_value.asInt & 0xffc0); } + bool isUInt7() { return !(m_value.asInt & 0xff80); } + bool isUInt8() { return !(m_value.asInt & 0xff00); } + bool isUInt9() { return (m_type == TypeUInt16) && !(m_value.asInt & 0xfe00); } + bool isUInt10() { return (m_type == TypeUInt16) && !(m_value.asInt & 0xfc00); } + bool isUInt12() { return (m_type == TypeUInt16) && !(m_value.asInt & 0xf000); } + bool isUInt16() { return m_type == TypeUInt16; } + uint8_t getUInt3() { ASSERT(isUInt3()); return m_value.asInt; } + uint8_t getUInt4() { ASSERT(isUInt4()); return m_value.asInt; } + uint8_t getUInt5() { ASSERT(isUInt5()); return m_value.asInt; } + uint8_t getUInt6() { ASSERT(isUInt6()); return m_value.asInt; } + uint8_t getUInt7() { ASSERT(isUInt7()); return m_value.asInt; } + uint8_t getUInt8() { ASSERT(isUInt8()); return m_value.asInt; } + uint8_t getUInt9() { ASSERT(isUInt9()); return m_value.asInt; } + uint8_t getUInt10() { ASSERT(isUInt10()); return m_value.asInt; } + uint16_t getUInt12() { ASSERT(isUInt12()); return m_value.asInt; } + uint16_t getUInt16() { ASSERT(isUInt16()); return m_value.asInt; } + + bool isEncodedImm() { return m_type == TypeEncoded; } + +private: + ThumbImmediateType m_type; + ThumbImmediateValue m_value; +}; + + +typedef enum { + SRType_LSL, + SRType_LSR, + SRType_ASR, + SRType_ROR, + + SRType_RRX = SRType_ROR +} ARMShiftType; + +class ARMv7Assembler; +class ShiftTypeAndAmount { + friend class ARMv7Assembler; + +public: + ShiftTypeAndAmount() + { + m_u.type = (ARMShiftType)0; + m_u.amount = 0; + } + + ShiftTypeAndAmount(ARMShiftType type, unsigned amount) + { + m_u.type = type; + m_u.amount = amount & 31; + } + + unsigned lo4() { return m_u.lo4; } + unsigned hi4() { return m_u.hi4; } + +private: + union { + struct { + unsigned lo4 : 4; + unsigned hi4 : 4; + }; + struct { + unsigned type : 2; + unsigned amount : 5; + }; + } m_u; +}; + + +/* +Some features of the Thumb instruction set are deprecated in ARMv7. Deprecated features affecting +instructions supported by ARMv7-M are as follows: +• use of the PC as or in a 16-bit ADD (SP plus register) instruction +• use of the SP as in a 16-bit ADD (SP plus register) instruction +• use of the SP as in a 16-bit CMP (register) instruction +• use of MOV (register) instructions in which is the SP or PC and is also the SP or PC. +• use of as the lowest-numbered register in the register list of a 16-bit STM instruction with base +register writeback +*/ + +class ARMv7Assembler { +public: + typedef ARM::RegisterID RegisterID; + typedef ARM::FPRegisterID FPRegisterID; + + // (HS, LO, HI, LS) -> (AE, B, A, BE) + // (VS, VC) -> (O, NO) + typedef enum { + ConditionEQ, + ConditionNE, + ConditionHS, + ConditionLO, + ConditionMI, + ConditionPL, + ConditionVS, + ConditionVC, + ConditionHI, + ConditionLS, + ConditionGE, + ConditionLT, + ConditionGT, + ConditionLE, + ConditionAL, + + ConditionCS = ConditionHS, + ConditionCC = ConditionLO, + } Condition; + + class JmpSrc { + friend class ARMv7Assembler; + friend class ARMInstructionFormatter; + public: + JmpSrc() + : m_offset(-1) + { + } + + private: + JmpSrc(int offset) + : m_offset(offset) + { + } + + int m_offset; + }; + + class JmpDst { + friend class ARMv7Assembler; + friend class ARMInstructionFormatter; + public: + JmpDst() + : m_offset(-1) + , m_used(false) + { + } + + bool isUsed() const { return m_used; } + void used() { m_used = true; } + private: + JmpDst(int offset) + : m_offset(offset) + , m_used(false) + { + ASSERT(m_offset == offset); + } + + int m_offset : 31; + int m_used : 1; + }; + +private: + + // ARMv7, Appx-A.6.3 + bool BadReg(RegisterID reg) + { + return (reg == ARM::sp) || (reg == ARM::pc); + } + + bool isSingleRegister(FPRegisterID reg) + { + // Check that the high bit isn't set (q16+), and that the low bit isn't (s1, s3, etc). + return !(reg & ~31); + } + + bool isDoubleRegister(FPRegisterID reg) + { + // Check that the high bit isn't set (q16+), and that the low bit isn't (s1, s3, etc). + return !(reg & ~(31 << 1)); + } + + bool isQuadRegister(FPRegisterID reg) + { + return !(reg & ~(31 << 2)); + } + + uint32_t singleRegisterNum(FPRegisterID reg) + { + ASSERT(isSingleRegister(reg)); + return reg; + } + + uint32_t doubleRegisterNum(FPRegisterID reg) + { + ASSERT(isDoubleRegister(reg)); + return reg >> 1; + } + + uint32_t quadRegisterNum(FPRegisterID reg) + { + ASSERT(isQuadRegister(reg)); + return reg >> 2; + } + + uint32_t singleRegisterMask(FPRegisterID rd, int highBitsShift, int lowBitShift) + { + uint32_t rdNum = singleRegisterNum(rd); + uint32_t rdMask = (rdNum >> 1) << highBitsShift; + if (rdNum & 1) + rdMask |= 1 << lowBitShift; + return rdMask; + } + + uint32_t doubleRegisterMask(FPRegisterID rd, int highBitShift, int lowBitsShift) + { + uint32_t rdNum = doubleRegisterNum(rd); + uint32_t rdMask = (rdNum & 0xf) << lowBitsShift; + if (rdNum & 16) + rdMask |= 1 << highBitShift; + return rdMask; + } + + typedef enum { + OP_ADD_reg_T1 = 0x1800, + OP_ADD_S_reg_T1 = 0x1800, + OP_SUB_reg_T1 = 0x1A00, + OP_SUB_S_reg_T1 = 0x1A00, + OP_ADD_imm_T1 = 0x1C00, + OP_ADD_S_imm_T1 = 0x1C00, + OP_SUB_imm_T1 = 0x1E00, + OP_SUB_S_imm_T1 = 0x1E00, + OP_MOV_imm_T1 = 0x2000, + OP_CMP_imm_T1 = 0x2800, + OP_ADD_imm_T2 = 0x3000, + OP_ADD_S_imm_T2 = 0x3000, + OP_SUB_imm_T2 = 0x3800, + OP_SUB_S_imm_T2 = 0x3800, + OP_AND_reg_T1 = 0x4000, + OP_EOR_reg_T1 = 0x4040, + OP_TST_reg_T1 = 0x4200, + OP_CMP_reg_T1 = 0x4280, + OP_ORR_reg_T1 = 0x4300, + OP_MVN_reg_T1 = 0x43C0, + OP_ADD_reg_T2 = 0x4400, + OP_MOV_reg_T1 = 0x4600, + OP_BLX = 0x4700, + OP_BX = 0x4700, + OP_LDRH_reg_T1 = 0x5A00, + OP_STR_reg_T1 = 0x5000, + OP_LDR_reg_T1 = 0x5800, + OP_STR_imm_T1 = 0x6000, + OP_LDR_imm_T1 = 0x6800, + OP_LDRH_imm_T1 = 0x8800, + OP_STR_imm_T2 = 0x9000, + OP_LDR_imm_T2 = 0x9800, + OP_ADD_SP_imm_T1 = 0xA800, + OP_ADD_SP_imm_T2 = 0xB000, + OP_SUB_SP_imm_T1 = 0xB080, + OP_BKPT = 0xBE00, + OP_IT = 0xBF00, + } OpcodeID; + + typedef enum { + OP_AND_reg_T2 = 0xEA00, + OP_TST_reg_T2 = 0xEA10, + OP_ORR_reg_T2 = 0xEA40, + OP_ASR_imm_T1 = 0xEA4F, + OP_LSL_imm_T1 = 0xEA4F, + OP_LSR_imm_T1 = 0xEA4F, + OP_ROR_imm_T1 = 0xEA4F, + OP_MVN_reg_T2 = 0xEA6F, + OP_EOR_reg_T2 = 0xEA80, + OP_ADD_reg_T3 = 0xEB00, + OP_ADD_S_reg_T3 = 0xEB10, + OP_SUB_reg_T2 = 0xEBA0, + OP_SUB_S_reg_T2 = 0xEBB0, + OP_CMP_reg_T2 = 0xEBB0, + OP_B_T4a = 0xF000, + OP_AND_imm_T1 = 0xF000, + OP_TST_imm = 0xF010, + OP_ORR_imm_T1 = 0xF040, + OP_MOV_imm_T2 = 0xF040, + OP_MVN_imm = 0xF060, + OP_EOR_imm_T1 = 0xF080, + OP_ADD_imm_T3 = 0xF100, + OP_ADD_S_imm_T3 = 0xF110, + OP_CMN_imm = 0xF110, + OP_SUB_imm_T3 = 0xF1A0, + OP_SUB_S_imm_T3 = 0xF1B0, + OP_CMP_imm_T2 = 0xF1B0, + OP_ADD_imm_T4 = 0xF200, + OP_MOV_imm_T3 = 0xF240, + OP_SUB_imm_T4 = 0xF2A0, + OP_MOVT = 0xF2C0, + OP_LDRH_reg_T2 = 0xF830, + OP_LDRH_imm_T3 = 0xF830, + OP_STR_imm_T4 = 0xF840, + OP_STR_reg_T2 = 0xF840, + OP_LDR_imm_T4 = 0xF850, + OP_LDR_reg_T2 = 0xF850, + OP_LDRH_imm_T2 = 0xF8B0, + OP_STR_imm_T3 = 0xF8C0, + OP_LDR_imm_T3 = 0xF8D0, + OP_LSL_reg_T2 = 0xFA00, + OP_LSR_reg_T2 = 0xFA20, + OP_ASR_reg_T2 = 0xFA40, + OP_ROR_reg_T2 = 0xFA60, + OP_SMULL_T1 = 0xFB80, + } OpcodeID1; + + typedef enum { + OP_B_T4b = 0x9000, + } OpcodeID2; + + struct FourFours { + FourFours(unsigned f3, unsigned f2, unsigned f1, unsigned f0) + { + m_u.f0 = f0; + m_u.f1 = f1; + m_u.f2 = f2; + m_u.f3 = f3; + } + + union { + unsigned value; + struct { + unsigned f0 : 4; + unsigned f1 : 4; + unsigned f2 : 4; + unsigned f3 : 4; + }; + } m_u; + }; + + class ARMInstructionFormatter; + + // false means else! + bool ifThenElseConditionBit(Condition condition, bool isIf) + { + return isIf ? (condition & 1) : !(condition & 1); + } + uint8_t ifThenElse(Condition condition, bool inst2if, bool inst3if, bool inst4if) + { + int mask = (ifThenElseConditionBit(condition, inst2if) << 3) + | (ifThenElseConditionBit(condition, inst3if) << 2) + | (ifThenElseConditionBit(condition, inst4if) << 1) + | 1; + ASSERT((condition != ConditionAL) || (mask & (mask - 1))); + return (condition << 4) | mask; + } + uint8_t ifThenElse(Condition condition, bool inst2if, bool inst3if) + { + int mask = (ifThenElseConditionBit(condition, inst2if) << 3) + | (ifThenElseConditionBit(condition, inst3if) << 2) + | 2; + ASSERT((condition != ConditionAL) || (mask & (mask - 1))); + return (condition << 4) | mask; + } + uint8_t ifThenElse(Condition condition, bool inst2if) + { + int mask = (ifThenElseConditionBit(condition, inst2if) << 3) + | 4; + ASSERT((condition != ConditionAL) || (mask & (mask - 1))); + return (condition << 4) | mask; + } + + uint8_t ifThenElse(Condition condition) + { + int mask = 8; + ASSERT((condition != ConditionAL) || (mask & (mask - 1))); + return (condition << 4) | mask; + } + +public: + + void add(RegisterID rd, RegisterID rn, ARMThumbImmediate imm) + { + // Rd can only be SP if Rn is also SP. + ASSERT((rd != ARM::sp) || (rn == ARM::sp)); + ASSERT(rd != ARM::pc); + ASSERT(rn != ARM::pc); + ASSERT(imm.isValid()); + + if (rn == ARM::sp) { + if (!(rd & 8) && imm.isUInt10()) { + m_formatter.oneWordOp5Reg3Imm8(OP_ADD_SP_imm_T1, rd, imm.getUInt10() >> 2); + return; + } else if ((rd == ARM::sp) && imm.isUInt9()) { + m_formatter.oneWordOp9Imm7(OP_ADD_SP_imm_T2, imm.getUInt9() >> 2); + return; + } + } else if (!((rd | rn) & 8)) { + if (imm.isUInt3()) { + m_formatter.oneWordOp7Reg3Reg3Reg3(OP_ADD_imm_T1, (RegisterID)imm.getUInt3(), rn, rd); + return; + } else if ((rd == rn) && imm.isUInt8()) { + m_formatter.oneWordOp5Reg3Imm8(OP_ADD_imm_T2, rd, imm.getUInt8()); + return; + } + } + + if (imm.isEncodedImm()) + m_formatter.twoWordOp5i6Imm4Reg4EncodedImm(OP_ADD_imm_T3, rn, rd, imm); + else { + ASSERT(imm.isUInt12()); + m_formatter.twoWordOp5i6Imm4Reg4EncodedImm(OP_ADD_imm_T4, rn, rd, imm); + } + } + + void add(RegisterID rd, RegisterID rn, RegisterID rm, ShiftTypeAndAmount shift) + { + ASSERT((rd != ARM::sp) || (rn == ARM::sp)); + ASSERT(rd != ARM::pc); + ASSERT(rn != ARM::pc); + ASSERT(!BadReg(rm)); + m_formatter.twoWordOp12Reg4FourFours(OP_ADD_reg_T3, rn, FourFours(shift.hi4(), rd, shift.lo4(), rm)); + } + + // NOTE: In an IT block, add doesn't modify the flags register. + void add(RegisterID rd, RegisterID rn, RegisterID rm) + { + if (rd == rn) + m_formatter.oneWordOp8RegReg143(OP_ADD_reg_T2, rm, rd); + else if (rd == rm) + m_formatter.oneWordOp8RegReg143(OP_ADD_reg_T2, rn, rd); + else if (!((rd | rn | rm) & 8)) + m_formatter.oneWordOp7Reg3Reg3Reg3(OP_ADD_reg_T1, rm, rn, rd); + else + add(rd, rn, rm, ShiftTypeAndAmount()); + } + + // Not allowed in an IT (if then) block. + void add_S(RegisterID rd, RegisterID rn, ARMThumbImmediate imm) + { + // Rd can only be SP if Rn is also SP. + ASSERT((rd != ARM::sp) || (rn == ARM::sp)); + ASSERT(rd != ARM::pc); + ASSERT(rn != ARM::pc); + ASSERT(imm.isEncodedImm()); + + if (!((rd | rn) & 8)) { + if (imm.isUInt3()) { + m_formatter.oneWordOp7Reg3Reg3Reg3(OP_ADD_S_imm_T1, (RegisterID)imm.getUInt3(), rn, rd); + return; + } else if ((rd == rn) && imm.isUInt8()) { + m_formatter.oneWordOp5Reg3Imm8(OP_ADD_S_imm_T2, rd, imm.getUInt8()); + return; + } + } + + m_formatter.twoWordOp5i6Imm4Reg4EncodedImm(OP_ADD_S_imm_T3, rn, rd, imm); + } + + // Not allowed in an IT (if then) block? + void add_S(RegisterID rd, RegisterID rn, RegisterID rm, ShiftTypeAndAmount shift) + { + ASSERT((rd != ARM::sp) || (rn == ARM::sp)); + ASSERT(rd != ARM::pc); + ASSERT(rn != ARM::pc); + ASSERT(!BadReg(rm)); + m_formatter.twoWordOp12Reg4FourFours(OP_ADD_S_reg_T3, rn, FourFours(shift.hi4(), rd, shift.lo4(), rm)); + } + + // Not allowed in an IT (if then) block. + void add_S(RegisterID rd, RegisterID rn, RegisterID rm) + { + if (!((rd | rn | rm) & 8)) + m_formatter.oneWordOp7Reg3Reg3Reg3(OP_ADD_S_reg_T1, rm, rn, rd); + else + add_S(rd, rn, rm, ShiftTypeAndAmount()); + } + + void ARM_and(RegisterID rd, RegisterID rn, ARMThumbImmediate imm) + { + ASSERT(!BadReg(rd)); + ASSERT(!BadReg(rn)); + ASSERT(imm.isEncodedImm()); + m_formatter.twoWordOp5i6Imm4Reg4EncodedImm(OP_AND_imm_T1, rn, rd, imm); + } + + void ARM_and(RegisterID rd, RegisterID rn, RegisterID rm, ShiftTypeAndAmount shift) + { + ASSERT(!BadReg(rd)); + ASSERT(!BadReg(rn)); + ASSERT(!BadReg(rm)); + m_formatter.twoWordOp12Reg4FourFours(OP_AND_reg_T2, rn, FourFours(shift.hi4(), rd, shift.lo4(), rm)); + } + + void ARM_and(RegisterID rd, RegisterID rn, RegisterID rm) + { + if ((rd == rn) && !((rd | rm) & 8)) + m_formatter.oneWordOp10Reg3Reg3(OP_AND_reg_T1, rm, rd); + else if ((rd == rm) && !((rd | rn) & 8)) + m_formatter.oneWordOp10Reg3Reg3(OP_AND_reg_T1, rn, rd); + else + ARM_and(rd, rn, rm, ShiftTypeAndAmount()); + } + + void asr(RegisterID rd, RegisterID rm, int32_t shiftAmount) + { + ASSERT(!BadReg(rd)); + ASSERT(!BadReg(rm)); + ShiftTypeAndAmount shift(SRType_ASR, shiftAmount); + m_formatter.twoWordOp16FourFours(OP_ASR_imm_T1, FourFours(shift.hi4(), rd, shift.lo4(), rm)); + } + + void asr(RegisterID rd, RegisterID rn, RegisterID rm) + { + ASSERT(!BadReg(rd)); + ASSERT(!BadReg(rn)); + ASSERT(!BadReg(rm)); + m_formatter.twoWordOp12Reg4FourFours(OP_ASR_reg_T2, rn, FourFours(0xf, rd, 0, rm)); + } + + // Only allowed in IT (if then) block if last instruction. + JmpSrc b() + { + m_formatter.twoWordOp16Op16(OP_B_T4a, OP_B_T4b); + return JmpSrc(m_formatter.size()); + } + + // Only allowed in IT (if then) block if last instruction. + JmpSrc blx(RegisterID rm) + { + ASSERT(rm != ARM::pc); + m_formatter.oneWordOp8RegReg143(OP_BLX, rm, (RegisterID)8); + return JmpSrc(m_formatter.size()); + } + + // Only allowed in IT (if then) block if last instruction. + JmpSrc bx(RegisterID rm) + { + m_formatter.oneWordOp8RegReg143(OP_BX, rm, (RegisterID)0); + return JmpSrc(m_formatter.size()); + } + + void bkpt(uint8_t imm=0) + { + m_formatter.oneWordOp8Imm8(OP_BKPT, imm); + } + + void cmn(RegisterID rn, ARMThumbImmediate imm) + { + ASSERT(rn != ARM::pc); + ASSERT(imm.isEncodedImm()); + + m_formatter.twoWordOp5i6Imm4Reg4EncodedImm(OP_CMN_imm, rn, (RegisterID)0xf, imm); + } + + void cmp(RegisterID rn, ARMThumbImmediate imm) + { + ASSERT(rn != ARM::pc); + ASSERT(imm.isEncodedImm()); + + if (!(rn & 8) && imm.isUInt8()) + m_formatter.oneWordOp5Reg3Imm8(OP_CMP_imm_T1, rn, imm.getUInt8()); + else + m_formatter.twoWordOp5i6Imm4Reg4EncodedImm(OP_CMP_imm_T2, rn, (RegisterID)0xf, imm); + } + + void cmp(RegisterID rn, RegisterID rm, ShiftTypeAndAmount shift) + { + ASSERT(rn != ARM::pc); + ASSERT(!BadReg(rm)); + m_formatter.twoWordOp12Reg4FourFours(OP_CMP_reg_T2, rn, FourFours(shift.hi4(), 0xf, shift.lo4(), rm)); + } + + void cmp(RegisterID rn, RegisterID rm) + { + if ((rn | rm) & 8) + cmp(rn, rm, ShiftTypeAndAmount()); + else + m_formatter.oneWordOp10Reg3Reg3(OP_CMP_reg_T1, rm, rn); + } + + // xor is not spelled with an 'e'. :-( + void eor(RegisterID rd, RegisterID rn, ARMThumbImmediate imm) + { + ASSERT(!BadReg(rd)); + ASSERT(!BadReg(rn)); + ASSERT(imm.isEncodedImm()); + m_formatter.twoWordOp5i6Imm4Reg4EncodedImm(OP_EOR_imm_T1, rn, rd, imm); + } + + // xor is not spelled with an 'e'. :-( + void eor(RegisterID rd, RegisterID rn, RegisterID rm, ShiftTypeAndAmount shift) + { + ASSERT(!BadReg(rd)); + ASSERT(!BadReg(rn)); + ASSERT(!BadReg(rm)); + m_formatter.twoWordOp12Reg4FourFours(OP_EOR_reg_T2, rn, FourFours(shift.hi4(), rd, shift.lo4(), rm)); + } + + // xor is not spelled with an 'e'. :-( + void eor(RegisterID rd, RegisterID rn, RegisterID rm) + { + if ((rd == rn) && !((rd | rm) & 8)) + m_formatter.oneWordOp10Reg3Reg3(OP_EOR_reg_T1, rm, rd); + else if ((rd == rm) && !((rd | rn) & 8)) + m_formatter.oneWordOp10Reg3Reg3(OP_EOR_reg_T1, rn, rd); + else + eor(rd, rn, rm, ShiftTypeAndAmount()); + } + + void it(Condition cond) + { + m_formatter.oneWordOp8Imm8(OP_IT, ifThenElse(cond)); + } + + void it(Condition cond, bool inst2if) + { + m_formatter.oneWordOp8Imm8(OP_IT, ifThenElse(cond, inst2if)); + } + + void it(Condition cond, bool inst2if, bool inst3if) + { + m_formatter.oneWordOp8Imm8(OP_IT, ifThenElse(cond, inst2if, inst3if)); + } + + void it(Condition cond, bool inst2if, bool inst3if, bool inst4if) + { + m_formatter.oneWordOp8Imm8(OP_IT, ifThenElse(cond, inst2if, inst3if, inst4if)); + } + + // rt == ARM::pc only allowed if last instruction in IT (if then) block. + void ldr(RegisterID rt, RegisterID rn, ARMThumbImmediate imm) + { + ASSERT(rn != ARM::pc); // LDR (literal) + ASSERT(imm.isUInt12()); + + if (!((rt | rn) & 8) && imm.isUInt7()) + m_formatter.oneWordOp5Imm5Reg3Reg3(OP_LDR_imm_T1, imm.getUInt7() >> 2, rn, rt); + else if ((rn == ARM::sp) && !(rt & 8) && imm.isUInt10()) + m_formatter.oneWordOp5Reg3Imm8(OP_LDR_imm_T2, rt, imm.getUInt10() >> 2); + else + m_formatter.twoWordOp12Reg4Reg4Imm12(OP_LDR_imm_T3, rn, rt, imm.getUInt12()); + } + + // If index is set, this is a regular offset or a pre-indexed load; + // if index is not set then is is a post-index load. + // + // If wback is set rn is updated - this is a pre or post index load, + // if wback is not set this is a regular offset memory access. + // + // (-255 <= offset <= 255) + // _reg = REG[rn] + // _tmp = _reg + offset + // MEM[index ? _tmp : _reg] = REG[rt] + // if (wback) REG[rn] = _tmp + void ldr(RegisterID rt, RegisterID rn, int offset, bool index, bool wback) + { + ASSERT(rt != ARM::pc); + ASSERT(rn != ARM::pc); + ASSERT(index || wback); + ASSERT(!wback | (rt != rn)); + + bool add = true; + if (offset < 0) { + add = false; + offset = -offset; + } + ASSERT((offset & ~0xff) == 0); + + offset |= (wback << 8); + offset |= (add << 9); + offset |= (index << 10); + offset |= (1 << 11); + + m_formatter.twoWordOp12Reg4Reg4Imm12(OP_LDR_imm_T4, rn, rt, offset); + } + + // rt == ARM::pc only allowed if last instruction in IT (if then) block. + void ldr(RegisterID rt, RegisterID rn, RegisterID rm, unsigned shift=0) + { + ASSERT(rn != ARM::pc); // LDR (literal) + ASSERT(!BadReg(rm)); + ASSERT(shift <= 3); + + if (!shift && !((rt | rn | rm) & 8)) + m_formatter.oneWordOp7Reg3Reg3Reg3(OP_LDR_reg_T1, rm, rn, rt); + else + m_formatter.twoWordOp12Reg4FourFours(OP_LDR_reg_T2, rn, FourFours(rt, 0, shift, rm)); + } + + // rt == ARM::pc only allowed if last instruction in IT (if then) block. + void ldrh(RegisterID rt, RegisterID rn, ARMThumbImmediate imm) + { + ASSERT(rn != ARM::pc); // LDR (literal) + ASSERT(imm.isUInt12()); + + if (!((rt | rn) & 8) && imm.isUInt6()) + m_formatter.oneWordOp5Imm5Reg3Reg3(OP_LDRH_imm_T1, imm.getUInt6() >> 2, rn, rt); + else + m_formatter.twoWordOp12Reg4Reg4Imm12(OP_LDRH_imm_T2, rn, rt, imm.getUInt12()); + } + + // If index is set, this is a regular offset or a pre-indexed load; + // if index is not set then is is a post-index load. + // + // If wback is set rn is updated - this is a pre or post index load, + // if wback is not set this is a regular offset memory access. + // + // (-255 <= offset <= 255) + // _reg = REG[rn] + // _tmp = _reg + offset + // MEM[index ? _tmp : _reg] = REG[rt] + // if (wback) REG[rn] = _tmp + void ldrh(RegisterID rt, RegisterID rn, int offset, bool index, bool wback) + { + ASSERT(rt != ARM::pc); + ASSERT(rn != ARM::pc); + ASSERT(index || wback); + ASSERT(!wback | (rt != rn)); + + bool add = true; + if (offset < 0) { + add = false; + offset = -offset; + } + ASSERT((offset & ~0xff) == 0); + + offset |= (wback << 8); + offset |= (add << 9); + offset |= (index << 10); + offset |= (1 << 11); + + m_formatter.twoWordOp12Reg4Reg4Imm12(OP_LDRH_imm_T3, rn, rt, offset); + } + + void ldrh(RegisterID rt, RegisterID rn, RegisterID rm, unsigned shift=0) + { + ASSERT(!BadReg(rt)); // Memory hint + ASSERT(rn != ARM::pc); // LDRH (literal) + ASSERT(!BadReg(rm)); + ASSERT(shift <= 3); + + if (!shift && !((rt | rn | rm) & 8)) + m_formatter.oneWordOp7Reg3Reg3Reg3(OP_LDRH_reg_T1, rm, rn, rt); + else + m_formatter.twoWordOp12Reg4FourFours(OP_LDRH_reg_T2, rn, FourFours(rt, 0, shift, rm)); + } + + void lsl(RegisterID rd, RegisterID rm, int32_t shiftAmount) + { + ASSERT(!BadReg(rd)); + ASSERT(!BadReg(rm)); + ShiftTypeAndAmount shift(SRType_LSL, shiftAmount); + m_formatter.twoWordOp16FourFours(OP_LSL_imm_T1, FourFours(shift.hi4(), rd, shift.lo4(), rm)); + } + + void lsl(RegisterID rd, RegisterID rn, RegisterID rm) + { + ASSERT(!BadReg(rd)); + ASSERT(!BadReg(rn)); + ASSERT(!BadReg(rm)); + m_formatter.twoWordOp12Reg4FourFours(OP_LSL_reg_T2, rn, FourFours(0xf, rd, 0, rm)); + } + + void lsr(RegisterID rd, RegisterID rm, int32_t shiftAmount) + { + ASSERT(!BadReg(rd)); + ASSERT(!BadReg(rm)); + ShiftTypeAndAmount shift(SRType_LSR, shiftAmount); + m_formatter.twoWordOp16FourFours(OP_LSR_imm_T1, FourFours(shift.hi4(), rd, shift.lo4(), rm)); + } + + void lsr(RegisterID rd, RegisterID rn, RegisterID rm) + { + ASSERT(!BadReg(rd)); + ASSERT(!BadReg(rn)); + ASSERT(!BadReg(rm)); + m_formatter.twoWordOp12Reg4FourFours(OP_LSR_reg_T2, rn, FourFours(0xf, rd, 0, rm)); + } + + void movT3(RegisterID rd, ARMThumbImmediate imm) + { + ASSERT(imm.isValid()); + ASSERT(!imm.isEncodedImm()); + ASSERT(!BadReg(rd)); + + m_formatter.twoWordOp5i6Imm4Reg4EncodedImm(OP_MOV_imm_T3, imm.m_value.imm4, rd, imm); + } + + void mov(RegisterID rd, ARMThumbImmediate imm) + { + ASSERT(imm.isValid()); + ASSERT(!BadReg(rd)); + + if ((rd < 8) && imm.isUInt8()) + m_formatter.oneWordOp5Reg3Imm8(OP_MOV_imm_T1, rd, imm.getUInt8()); + else if (imm.isEncodedImm()) + m_formatter.twoWordOp5i6Imm4Reg4EncodedImm(OP_MOV_imm_T2, 0xf, rd, imm); + else + movT3(rd, imm); + } + + void mov(RegisterID rd, RegisterID rm) + { + m_formatter.oneWordOp8RegReg143(OP_MOV_reg_T1, rm, rd); + } + + void movt(RegisterID rd, ARMThumbImmediate imm) + { + ASSERT(imm.isUInt16()); + ASSERT(!BadReg(rd)); + m_formatter.twoWordOp5i6Imm4Reg4EncodedImm(OP_MOVT, imm.m_value.imm4, rd, imm); + } + + void mvn(RegisterID rd, ARMThumbImmediate imm) + { + ASSERT(imm.isEncodedImm()); + ASSERT(!BadReg(rd)); + + m_formatter.twoWordOp5i6Imm4Reg4EncodedImm(OP_MVN_imm, 0xf, rd, imm); + } + + void mvn(RegisterID rd, RegisterID rm, ShiftTypeAndAmount shift) + { + ASSERT(!BadReg(rd)); + ASSERT(!BadReg(rm)); + m_formatter.twoWordOp16FourFours(OP_MVN_reg_T2, FourFours(shift.hi4(), rd, shift.lo4(), rm)); + } + + void mvn(RegisterID rd, RegisterID rm) + { + if (!((rd | rm) & 8)) + m_formatter.oneWordOp10Reg3Reg3(OP_MVN_reg_T1, rm, rd); + else + mvn(rd, rm, ShiftTypeAndAmount()); + } + + void orr(RegisterID rd, RegisterID rn, ARMThumbImmediate imm) + { + ASSERT(!BadReg(rd)); + ASSERT(!BadReg(rn)); + ASSERT(imm.isEncodedImm()); + m_formatter.twoWordOp5i6Imm4Reg4EncodedImm(OP_ORR_imm_T1, rn, rd, imm); + } + + void orr(RegisterID rd, RegisterID rn, RegisterID rm, ShiftTypeAndAmount shift) + { + ASSERT(!BadReg(rd)); + ASSERT(!BadReg(rn)); + ASSERT(!BadReg(rm)); + m_formatter.twoWordOp12Reg4FourFours(OP_ORR_reg_T2, rn, FourFours(shift.hi4(), rd, shift.lo4(), rm)); + } + + void orr(RegisterID rd, RegisterID rn, RegisterID rm) + { + if ((rd == rn) && !((rd | rm) & 8)) + m_formatter.oneWordOp10Reg3Reg3(OP_ORR_reg_T1, rm, rd); + else if ((rd == rm) && !((rd | rn) & 8)) + m_formatter.oneWordOp10Reg3Reg3(OP_ORR_reg_T1, rn, rd); + else + orr(rd, rn, rm, ShiftTypeAndAmount()); + } + + void ror(RegisterID rd, RegisterID rm, int32_t shiftAmount) + { + ASSERT(!BadReg(rd)); + ASSERT(!BadReg(rm)); + ShiftTypeAndAmount shift(SRType_ROR, shiftAmount); + m_formatter.twoWordOp16FourFours(OP_ROR_imm_T1, FourFours(shift.hi4(), rd, shift.lo4(), rm)); + } + + void ror(RegisterID rd, RegisterID rn, RegisterID rm) + { + ASSERT(!BadReg(rd)); + ASSERT(!BadReg(rn)); + ASSERT(!BadReg(rm)); + m_formatter.twoWordOp12Reg4FourFours(OP_ROR_reg_T2, rn, FourFours(0xf, rd, 0, rm)); + } + + void smull(RegisterID rdLo, RegisterID rdHi, RegisterID rn, RegisterID rm) + { + ASSERT(!BadReg(rdLo)); + ASSERT(!BadReg(rdHi)); + ASSERT(!BadReg(rn)); + ASSERT(!BadReg(rm)); + ASSERT(rdLo != rdHi); + m_formatter.twoWordOp12Reg4FourFours(OP_SMULL_T1, rn, FourFours(rdLo, rdHi, 0, rm)); + } + + // rt == ARM::pc only allowed if last instruction in IT (if then) block. + void str(RegisterID rt, RegisterID rn, ARMThumbImmediate imm) + { + ASSERT(rt != ARM::pc); + ASSERT(rn != ARM::pc); + ASSERT(imm.isUInt12()); + + if (!((rt | rn) & 8) && imm.isUInt7()) + m_formatter.oneWordOp5Imm5Reg3Reg3(OP_STR_imm_T1, imm.getUInt7() >> 2, rn, rt); + else if ((rn == ARM::sp) && !(rt & 8) && imm.isUInt10()) + m_formatter.oneWordOp5Reg3Imm8(OP_STR_imm_T2, rt, imm.getUInt10() >> 2); + else + m_formatter.twoWordOp12Reg4Reg4Imm12(OP_STR_imm_T3, rn, rt, imm.getUInt12()); + } + + // If index is set, this is a regular offset or a pre-indexed store; + // if index is not set then is is a post-index store. + // + // If wback is set rn is updated - this is a pre or post index store, + // if wback is not set this is a regular offset memory access. + // + // (-255 <= offset <= 255) + // _reg = REG[rn] + // _tmp = _reg + offset + // MEM[index ? _tmp : _reg] = REG[rt] + // if (wback) REG[rn] = _tmp + void str(RegisterID rt, RegisterID rn, int offset, bool index, bool wback) + { + ASSERT(rt != ARM::pc); + ASSERT(rn != ARM::pc); + ASSERT(index || wback); + ASSERT(!wback | (rt != rn)); + + bool add = true; + if (offset < 0) { + add = false; + offset = -offset; + } + ASSERT((offset & ~0xff) == 0); + + offset |= (wback << 8); + offset |= (add << 9); + offset |= (index << 10); + offset |= (1 << 11); + + m_formatter.twoWordOp12Reg4Reg4Imm12(OP_STR_imm_T4, rn, rt, offset); + } + + // rt == ARM::pc only allowed if last instruction in IT (if then) block. + void str(RegisterID rt, RegisterID rn, RegisterID rm, unsigned shift=0) + { + ASSERT(rn != ARM::pc); + ASSERT(!BadReg(rm)); + ASSERT(shift <= 3); + + if (!shift && !((rt | rn | rm) & 8)) + m_formatter.oneWordOp7Reg3Reg3Reg3(OP_STR_reg_T1, rm, rn, rt); + else + m_formatter.twoWordOp12Reg4FourFours(OP_STR_reg_T2, rn, FourFours(rt, 0, shift, rm)); + } + + void sub(RegisterID rd, RegisterID rn, ARMThumbImmediate imm) + { + // Rd can only be SP if Rn is also SP. + ASSERT((rd != ARM::sp) || (rn == ARM::sp)); + ASSERT(rd != ARM::pc); + ASSERT(rn != ARM::pc); + ASSERT(imm.isValid()); + + if ((rn == ARM::sp) && (rd == ARM::sp) && imm.isUInt9()) { + m_formatter.oneWordOp9Imm7(OP_SUB_SP_imm_T1, imm.getUInt9() >> 2); + return; + } else if (!((rd | rn) & 8)) { + if (imm.isUInt3()) { + m_formatter.oneWordOp7Reg3Reg3Reg3(OP_SUB_imm_T1, (RegisterID)imm.getUInt3(), rn, rd); + return; + } else if ((rd == rn) && imm.isUInt8()) { + m_formatter.oneWordOp5Reg3Imm8(OP_SUB_imm_T2, rd, imm.getUInt8()); + return; + } + } + + if (imm.isEncodedImm()) + m_formatter.twoWordOp5i6Imm4Reg4EncodedImm(OP_SUB_imm_T3, rn, rd, imm); + else { + ASSERT(imm.isUInt12()); + m_formatter.twoWordOp5i6Imm4Reg4EncodedImm(OP_SUB_imm_T4, rn, rd, imm); + } + } + + void sub(RegisterID rd, RegisterID rn, RegisterID rm, ShiftTypeAndAmount shift) + { + ASSERT((rd != ARM::sp) || (rn == ARM::sp)); + ASSERT(rd != ARM::pc); + ASSERT(rn != ARM::pc); + ASSERT(!BadReg(rm)); + m_formatter.twoWordOp12Reg4FourFours(OP_SUB_reg_T2, rn, FourFours(shift.hi4(), rd, shift.lo4(), rm)); + } + + // NOTE: In an IT block, add doesn't modify the flags register. + void sub(RegisterID rd, RegisterID rn, RegisterID rm) + { + if (!((rd | rn | rm) & 8)) + m_formatter.oneWordOp7Reg3Reg3Reg3(OP_SUB_reg_T1, rm, rn, rd); + else + sub(rd, rn, rm, ShiftTypeAndAmount()); + } + + // Not allowed in an IT (if then) block. + void sub_S(RegisterID rd, RegisterID rn, ARMThumbImmediate imm) + { + // Rd can only be SP if Rn is also SP. + ASSERT((rd != ARM::sp) || (rn == ARM::sp)); + ASSERT(rd != ARM::pc); + ASSERT(rn != ARM::pc); + ASSERT(imm.isValid()); + + if ((rn == ARM::sp) && (rd == ARM::sp) && imm.isUInt9()) { + m_formatter.oneWordOp9Imm7(OP_SUB_SP_imm_T1, imm.getUInt9() >> 2); + return; + } else if (!((rd | rn) & 8)) { + if (imm.isUInt3()) { + m_formatter.oneWordOp7Reg3Reg3Reg3(OP_SUB_S_imm_T1, (RegisterID)imm.getUInt3(), rn, rd); + return; + } else if ((rd == rn) && imm.isUInt8()) { + m_formatter.oneWordOp5Reg3Imm8(OP_SUB_S_imm_T2, rd, imm.getUInt8()); + return; + } + } + + m_formatter.twoWordOp5i6Imm4Reg4EncodedImm(OP_SUB_S_imm_T3, rn, rd, imm); + } + + // Not allowed in an IT (if then) block? + void sub_S(RegisterID rd, RegisterID rn, RegisterID rm, ShiftTypeAndAmount shift) + { + ASSERT((rd != ARM::sp) || (rn == ARM::sp)); + ASSERT(rd != ARM::pc); + ASSERT(rn != ARM::pc); + ASSERT(!BadReg(rm)); + m_formatter.twoWordOp12Reg4FourFours(OP_SUB_S_reg_T2, rn, FourFours(shift.hi4(), rd, shift.lo4(), rm)); + } + + // Not allowed in an IT (if then) block. + void sub_S(RegisterID rd, RegisterID rn, RegisterID rm) + { + if (!((rd | rn | rm) & 8)) + m_formatter.oneWordOp7Reg3Reg3Reg3(OP_SUB_S_reg_T1, rm, rn, rd); + else + sub_S(rd, rn, rm, ShiftTypeAndAmount()); + } + + void tst(RegisterID rn, ARMThumbImmediate imm) + { + ASSERT(!BadReg(rn)); + ASSERT(imm.isEncodedImm()); + + m_formatter.twoWordOp5i6Imm4Reg4EncodedImm(OP_TST_imm, rn, (RegisterID)0xf, imm); + } + + void tst(RegisterID rn, RegisterID rm, ShiftTypeAndAmount shift) + { + ASSERT(!BadReg(rn)); + ASSERT(!BadReg(rm)); + m_formatter.twoWordOp12Reg4FourFours(OP_TST_reg_T2, rn, FourFours(shift.hi4(), 0xf, shift.lo4(), rm)); + } + + void tst(RegisterID rn, RegisterID rm) + { + if ((rn | rm) & 8) + tst(rn, rm, ShiftTypeAndAmount()); + else + m_formatter.oneWordOp10Reg3Reg3(OP_TST_reg_T1, rm, rn); + } + + void vadd_F64(FPRegisterID rd, FPRegisterID rn, FPRegisterID rm) + { + m_formatter.vfpOp(0x0b00ee30 | doubleRegisterMask(rd, 6, 28) | doubleRegisterMask(rn, 23, 0) | doubleRegisterMask(rm, 21, 16)); + } + + void vcmp_F64(FPRegisterID rd, FPRegisterID rm) + { + m_formatter.vfpOp(0x0bc0eeb4 | doubleRegisterMask(rd, 6, 28) | doubleRegisterMask(rm, 21, 16)); + } + + void vcvt_F64_S32(FPRegisterID fd, FPRegisterID sm) + { + m_formatter.vfpOp(0x0bc0eeb8 | doubleRegisterMask(fd, 6, 28) | singleRegisterMask(sm, 16, 21)); + } + + void vcvt_S32_F64(FPRegisterID sd, FPRegisterID fm) + { + m_formatter.vfpOp(0x0bc0eebd | singleRegisterMask(sd, 28, 6) | doubleRegisterMask(fm, 21, 16)); + } + + void vldr(FPRegisterID rd, RegisterID rn, int32_t imm) + { + vmem(rd, rn, imm, true); + } + + void vmov(RegisterID rd, FPRegisterID sn) + { + m_formatter.vfpOp(0x0a10ee10 | (rd << 28) | singleRegisterMask(sn, 0, 23)); + } + + void vmov(FPRegisterID sn, RegisterID rd) + { + m_formatter.vfpOp(0x0a10ee00 | (rd << 28) | singleRegisterMask(sn, 0, 23)); + } + + // move FPSCR flags to APSR. + void vmrs_APSR_nzcv_FPSCR() + { + m_formatter.vfpOp(0xfa10eef1); + } + + void vmul_F64(FPRegisterID rd, FPRegisterID rn, FPRegisterID rm) + { + m_formatter.vfpOp(0x0b00ee20 | doubleRegisterMask(rd, 6, 28) | doubleRegisterMask(rn, 23, 0) | doubleRegisterMask(rm, 21, 16)); + } + + void vstr(FPRegisterID rd, RegisterID rn, int32_t imm) + { + vmem(rd, rn, imm, false); + } + + void vsub_F64(FPRegisterID rd, FPRegisterID rn, FPRegisterID rm) + { + m_formatter.vfpOp(0x0b40ee30 | doubleRegisterMask(rd, 6, 28) | doubleRegisterMask(rn, 23, 0) | doubleRegisterMask(rm, 21, 16)); + } + + + JmpDst label() + { + return JmpDst(m_formatter.size()); + } + + JmpDst align(int alignment) + { + while (!m_formatter.isAligned(alignment)) + bkpt(); + + return label(); + } + + static void* getRelocatedAddress(void* code, JmpSrc jump) + { + ASSERT(jump.m_offset != -1); + + return reinterpret_cast(reinterpret_cast(code) + jump.m_offset); + } + + static void* getRelocatedAddress(void* code, JmpDst destination) + { + ASSERT(destination.m_offset != -1); + + return reinterpret_cast(reinterpret_cast(code) + destination.m_offset); + } + + static int getDifferenceBetweenLabels(JmpDst src, JmpDst dst) + { + return dst.m_offset - src.m_offset; + } + + static int getDifferenceBetweenLabels(JmpDst src, JmpSrc dst) + { + return dst.m_offset - src.m_offset; + } + + static int getDifferenceBetweenLabels(JmpSrc src, JmpDst dst) + { + return dst.m_offset - src.m_offset; + } + + // Assembler admin methods: + + size_t size() const + { + return m_formatter.size(); + } + + void* executableCopy(ExecutablePool* allocator) + { + void* copy = m_formatter.executableCopy(allocator); + ASSERT(copy); + return copy; + } + + static unsigned getCallReturnOffset(JmpSrc call) + { + ASSERT(call.m_offset >= 0); + return call.m_offset; + } + + // Linking & patching: + // + // 'link' and 'patch' methods are for use on unprotected code - such as the code + // within the AssemblerBuffer, and code being patched by the patch buffer. Once + // code has been finalized it is (platform support permitting) within a non- + // writable region of memory; to modify the code in an execute-only execuable + // pool the 'repatch' and 'relink' methods should be used. + + void linkJump(JmpSrc from, JmpDst to) + { + ASSERT(to.m_offset != -1); + ASSERT(from.m_offset != -1); + + uint16_t* location = reinterpret_cast(reinterpret_cast(m_formatter.data()) + from.m_offset); + intptr_t relative = to.m_offset - from.m_offset; + + linkWithOffset(location, relative); + } + + static void linkJump(void* code, JmpSrc from, void* to) + { + ASSERT(from.m_offset != -1); + + uint16_t* location = reinterpret_cast(reinterpret_cast(code) + from.m_offset); + intptr_t relative = reinterpret_cast(to) - reinterpret_cast(location); + + linkWithOffset(location, relative); + } + + // bah, this mathod should really be static, since it is used by the LinkBuffer. + // return a bool saying whether the link was successful? + static void linkCall(void* code, JmpSrc from, void* to) + { + ASSERT(!(reinterpret_cast(code) & 1)); + ASSERT(from.m_offset != -1); + ASSERT(reinterpret_cast(to) & 1); + + setPointer(reinterpret_cast(reinterpret_cast(code) + from.m_offset) - 1, to); + } + + static void linkPointer(void* code, JmpDst where, void* value) + { + setPointer(reinterpret_cast(code) + where.m_offset, value); + } + + static void relinkJump(void* from, void* to) + { + ASSERT(!(reinterpret_cast(from) & 1)); + ASSERT(!(reinterpret_cast(to) & 1)); + + intptr_t relative = reinterpret_cast(to) - reinterpret_cast(from); + linkWithOffset(reinterpret_cast(from), relative); + + ExecutableAllocator::cacheFlush(reinterpret_cast(from) - 2, 2 * sizeof(uint16_t)); + } + + static void relinkCall(void* from, void* to) + { + ASSERT(!(reinterpret_cast(from) & 1)); + ASSERT(reinterpret_cast(to) & 1); + + setPointer(reinterpret_cast(from) - 1, to); + + ExecutableAllocator::cacheFlush(reinterpret_cast(from) - 5, 4 * sizeof(uint16_t)); + } + + static void repatchInt32(void* where, int32_t value) + { + ASSERT(!(reinterpret_cast(where) & 1)); + + setInt32(where, value); + + ExecutableAllocator::cacheFlush(reinterpret_cast(where) - 4, 4 * sizeof(uint16_t)); + } + + static void repatchPointer(void* where, void* value) + { + ASSERT(!(reinterpret_cast(where) & 1)); + + setPointer(where, value); + + ExecutableAllocator::cacheFlush(reinterpret_cast(where) - 4, 4 * sizeof(uint16_t)); + } + + static void repatchLoadPtrToLEA(void* where) + { + ASSERT(!(reinterpret_cast(where) & 1)); + + uint16_t* loadOp = reinterpret_cast(where) + 4; + ASSERT((*loadOp & 0xfff0) == OP_LDR_reg_T2); + + *loadOp = OP_ADD_reg_T3 | (*loadOp & 0xf); + ExecutableAllocator::cacheFlush(loadOp, sizeof(uint16_t)); + } + +private: + + // Arm vfp addresses can be offset by a 9-bit ones-comp immediate, left shifted by 2. + // (i.e. +/-(0..255) 32-bit words) + void vmem(FPRegisterID rd, RegisterID rn, int32_t imm, bool isLoad) + { + bool up; + uint32_t offset; + if (imm < 0) { + offset = -imm; + up = false; + } else { + offset = imm; + up = true; + } + + // offset is effectively leftshifted by 2 already (the bottom two bits are zero, and not + // reperesented in the instruction. Left shift by 14, to mov it into position 0x00AA0000. + ASSERT((offset & ~(0xff << 2)) == 0); + offset <<= 14; + + m_formatter.vfpOp(0x0b00ed00 | offset | (up << 7) | (isLoad << 4) | doubleRegisterMask(rd, 6, 28) | rn); + } + + static void setInt32(void* code, uint32_t value) + { + uint16_t* location = reinterpret_cast(code); + + uint16_t lo16 = value; + uint16_t hi16 = value >> 16; + + spliceHi5(location - 4, lo16); + spliceLo11(location - 3, lo16); + spliceHi5(location - 2, hi16); + spliceLo11(location - 1, hi16); + + ExecutableAllocator::cacheFlush(location - 4, 4 * sizeof(uint16_t)); + } + + static void setPointer(void* code, void* value) + { + setInt32(code, reinterpret_cast(value)); + } + + // Linking & patching: + // This method assumes that the JmpSrc being linked is a T4 b instruction. + static void linkWithOffset(uint16_t* instruction, intptr_t relative) + { + // Currently branches > 16m = mostly deathy. + if (((relative << 7) >> 7) != relative) { + // FIXME: This CRASH means we cannot turn the JIT on by default on arm-v7. + fprintf(stderr, "Error: Cannot link T4b.\n"); + CRASH(); + } + + // ARM encoding for the top two bits below the sign bit is 'peculiar'. + if (relative >= 0) + relative ^= 0xC00000; + + // All branch offsets should be an even distance. + ASSERT(!(relative & 1)); + + int word1 = ((relative & 0x1000000) >> 14) | ((relative & 0x3ff000) >> 12); + int word2 = ((relative & 0x800000) >> 10) | ((relative & 0x400000) >> 11) | ((relative & 0xffe) >> 1); + + instruction[-2] = OP_B_T4a | word1; + instruction[-1] = OP_B_T4b | word2; + } + + // These functions can be used to splice 16-bit immediates back into previously generated instructions. + static void spliceHi5(uint16_t* where, uint16_t what) + { + uint16_t pattern = (what >> 12) | ((what & 0x0800) >> 1); + *where = (*where & 0xFBF0) | pattern; + } + static void spliceLo11(uint16_t* where, uint16_t what) + { + uint16_t pattern = ((what & 0x0700) << 4) | (what & 0x00FF); + *where = (*where & 0x8F00) | pattern; + } + + class ARMInstructionFormatter { + public: + void oneWordOp5Reg3Imm8(OpcodeID op, RegisterID rd, uint8_t imm) + { + m_buffer.putShort(op | (rd << 8) | imm); + } + + void oneWordOp5Imm5Reg3Reg3(OpcodeID op, uint8_t imm, RegisterID reg1, RegisterID reg2) + { + m_buffer.putShort(op | (imm << 6) | (reg1 << 3) | reg2); + } + + void oneWordOp7Reg3Reg3Reg3(OpcodeID op, RegisterID reg1, RegisterID reg2, RegisterID reg3) + { + m_buffer.putShort(op | (reg1 << 6) | (reg2 << 3) | reg3); + } + + void oneWordOp8Imm8(OpcodeID op, uint8_t imm) + { + m_buffer.putShort(op | imm); + } + + void oneWordOp8RegReg143(OpcodeID op, RegisterID reg1, RegisterID reg2) + { + m_buffer.putShort(op | ((reg2 & 8) << 4) | (reg1 << 3) | (reg2 & 7)); + } + void oneWordOp9Imm7(OpcodeID op, uint8_t imm) + { + m_buffer.putShort(op | imm); + } + + void oneWordOp10Reg3Reg3(OpcodeID op, RegisterID reg1, RegisterID reg2) + { + m_buffer.putShort(op | (reg1 << 3) | reg2); + } + + void twoWordOp12Reg4FourFours(OpcodeID1 op, RegisterID reg, FourFours ff) + { + m_buffer.putShort(op | reg); + m_buffer.putShort(ff.m_u.value); + } + + void twoWordOp16FourFours(OpcodeID1 op, FourFours ff) + { + m_buffer.putShort(op); + m_buffer.putShort(ff.m_u.value); + } + + void twoWordOp16Op16(OpcodeID1 op1, OpcodeID2 op2) + { + m_buffer.putShort(op1); + m_buffer.putShort(op2); + } + + void twoWordOp5i6Imm4Reg4EncodedImm(OpcodeID1 op, int imm4, RegisterID rd, ARMThumbImmediate imm) + { + m_buffer.putShort(op | (imm.m_value.i << 10) | imm4); + m_buffer.putShort((imm.m_value.imm3 << 12) | (rd << 8) | imm.m_value.imm8); + } + + void twoWordOp12Reg4Reg4Imm12(OpcodeID1 op, RegisterID reg1, RegisterID reg2, uint16_t imm) + { + m_buffer.putShort(op | reg1); + m_buffer.putShort((reg2 << 12) | imm); + } + + void vfpOp(int32_t op) + { + m_buffer.putInt(op); + } + + + // Administrative methods: + + size_t size() const { return m_buffer.size(); } + bool isAligned(int alignment) const { return m_buffer.isAligned(alignment); } + void* data() const { return m_buffer.data(); } + void* executableCopy(ExecutablePool* allocator) { return m_buffer.executableCopy(allocator); } + + private: + AssemblerBuffer m_buffer; + } m_formatter; +}; + +} // namespace JSC + +#endif // ENABLE(ASSEMBLER) && PLATFORM_ARM_ARCH(7) + +#endif // ARMAssembler_h diff --git a/assembler/AbstractMacroAssembler.h b/assembler/AbstractMacroAssembler.h new file mode 100644 index 0000000..0b23d02 --- /dev/null +++ b/assembler/AbstractMacroAssembler.h @@ -0,0 +1,536 @@ +/* + * Copyright (C) 2008 Apple Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef AbstractMacroAssembler_h +#define AbstractMacroAssembler_h + +#include + +#include +#include +#include +#include + +#if ENABLE(ASSEMBLER) + +namespace JSC { + +class LinkBuffer; +class RepatchBuffer; + +template +class AbstractMacroAssembler { +public: + typedef AssemblerType AssemblerType_T; + + typedef MacroAssemblerCodePtr CodePtr; + typedef MacroAssemblerCodeRef CodeRef; + + class Jump; + + typedef typename AssemblerType::RegisterID RegisterID; + typedef typename AssemblerType::FPRegisterID FPRegisterID; + typedef typename AssemblerType::JmpSrc JmpSrc; + typedef typename AssemblerType::JmpDst JmpDst; + + + // Section 1: MacroAssembler operand types + // + // The following types are used as operands to MacroAssembler operations, + // describing immediate and memory operands to the instructions to be planted. + + + enum Scale { + TimesOne, + TimesTwo, + TimesFour, + TimesEight, + }; + + // Address: + // + // Describes a simple base-offset address. + struct Address { + explicit Address(RegisterID base, int32_t offset = 0) + : base(base) + , offset(offset) + { + } + + RegisterID base; + int32_t offset; + }; + + // ImplicitAddress: + // + // This class is used for explicit 'load' and 'store' operations + // (as opposed to situations in which a memory operand is provided + // to a generic operation, such as an integer arithmetic instruction). + // + // In the case of a load (or store) operation we want to permit + // addresses to be implicitly constructed, e.g. the two calls: + // + // load32(Address(addrReg), destReg); + // load32(addrReg, destReg); + // + // Are equivalent, and the explicit wrapping of the Address in the former + // is unnecessary. + struct ImplicitAddress { + ImplicitAddress(RegisterID base) + : base(base) + , offset(0) + { + } + + ImplicitAddress(Address address) + : base(address.base) + , offset(address.offset) + { + } + + RegisterID base; + int32_t offset; + }; + + // BaseIndex: + // + // Describes a complex addressing mode. + struct BaseIndex { + BaseIndex(RegisterID base, RegisterID index, Scale scale, int32_t offset = 0) + : base(base) + , index(index) + , scale(scale) + , offset(offset) + { + } + + RegisterID base; + RegisterID index; + Scale scale; + int32_t offset; + }; + + // AbsoluteAddress: + // + // Describes an memory operand given by a pointer. For regular load & store + // operations an unwrapped void* will be used, rather than using this. + struct AbsoluteAddress { + explicit AbsoluteAddress(void* ptr) + : m_ptr(ptr) + { + } + + void* m_ptr; + }; + + // ImmPtr: + // + // A pointer sized immediate operand to an instruction - this is wrapped + // in a class requiring explicit construction in order to differentiate + // from pointers used as absolute addresses to memory operations + struct ImmPtr { + explicit ImmPtr(void* value) + : m_value(value) + { + } + + intptr_t asIntptr() + { + return reinterpret_cast(m_value); + } + + void* m_value; + }; + + // Imm32: + // + // A 32bit immediate operand to an instruction - this is wrapped in a + // class requiring explicit construction in order to prevent RegisterIDs + // (which are implemented as an enum) from accidentally being passed as + // immediate values. + struct Imm32 { + explicit Imm32(int32_t value) + : m_value(value) +#if PLATFORM_ARM_ARCH(7) + , m_isPointer(false) +#endif + { + } + +#if !PLATFORM(X86_64) + explicit Imm32(ImmPtr ptr) + : m_value(ptr.asIntptr()) +#if PLATFORM_ARM_ARCH(7) + , m_isPointer(true) +#endif + { + } +#endif + + int32_t m_value; +#if PLATFORM_ARM_ARCH(7) + // We rely on being able to regenerate code to recover exception handling + // information. Since ARMv7 supports 16-bit immediates there is a danger + // that if pointer values change the layout of the generated code will change. + // To avoid this problem, always generate pointers (and thus Imm32s constructed + // from ImmPtrs) with a code sequence that is able to represent any pointer + // value - don't use a more compact form in these cases. + bool m_isPointer; +#endif + }; + + + // Section 2: MacroAssembler code buffer handles + // + // The following types are used to reference items in the code buffer + // during JIT code generation. For example, the type Jump is used to + // track the location of a jump instruction so that it may later be + // linked to a label marking its destination. + + + // Label: + // + // A Label records a point in the generated instruction stream, typically such that + // it may be used as a destination for a jump. + class Label { + template + friend class AbstractMacroAssembler; + friend class Jump; + friend class MacroAssemblerCodeRef; + friend class LinkBuffer; + + public: + Label() + { + } + + Label(AbstractMacroAssembler* masm) + : m_label(masm->m_assembler.label()) + { + } + + bool isUsed() const { return m_label.isUsed(); } + void used() { m_label.used(); } + private: + JmpDst m_label; + }; + + // DataLabelPtr: + // + // A DataLabelPtr is used to refer to a location in the code containing a pointer to be + // patched after the code has been generated. + class DataLabelPtr { + template + friend class AbstractMacroAssembler; + friend class LinkBuffer; + public: + DataLabelPtr() + { + } + + DataLabelPtr(AbstractMacroAssembler* masm) + : m_label(masm->m_assembler.label()) + { + } + + private: + JmpDst m_label; + }; + + // DataLabel32: + // + // A DataLabelPtr is used to refer to a location in the code containing a pointer to be + // patched after the code has been generated. + class DataLabel32 { + template + friend class AbstractMacroAssembler; + friend class LinkBuffer; + public: + DataLabel32() + { + } + + DataLabel32(AbstractMacroAssembler* masm) + : m_label(masm->m_assembler.label()) + { + } + + private: + JmpDst m_label; + }; + + // Call: + // + // A Call object is a reference to a call instruction that has been planted + // into the code buffer - it is typically used to link the call, setting the + // relative offset such that when executed it will call to the desired + // destination. + class Call { + template + friend class AbstractMacroAssembler; + + public: + enum Flags { + None = 0x0, + Linkable = 0x1, + Near = 0x2, + LinkableNear = 0x3, + }; + + Call() + : m_flags(None) + { + } + + Call(JmpSrc jmp, Flags flags) + : m_jmp(jmp) + , m_flags(flags) + { + } + + bool isFlagSet(Flags flag) + { + return m_flags & flag; + } + + static Call fromTailJump(Jump jump) + { + return Call(jump.m_jmp, Linkable); + } + + JmpSrc m_jmp; + + private: + Flags m_flags; + }; + + // Jump: + // + // A jump object is a reference to a jump instruction that has been planted + // into the code buffer - it is typically used to link the jump, setting the + // relative offset such that when executed it will jump to the desired + // destination. + class Jump { + template + friend class AbstractMacroAssembler; + friend class Call; + friend class LinkBuffer; + public: + Jump() + { + } + + Jump(JmpSrc jmp) + : m_jmp(jmp) + { + } + + void link(AbstractMacroAssembler* masm) + { + masm->m_assembler.linkJump(m_jmp, masm->m_assembler.label()); + } + + void linkTo(Label label, AbstractMacroAssembler* masm) + { + masm->m_assembler.linkJump(m_jmp, label.m_label); + } + + private: + JmpSrc m_jmp; + }; + + // JumpList: + // + // A JumpList is a set of Jump objects. + // All jumps in the set will be linked to the same destination. + class JumpList { + friend class LinkBuffer; + + public: + typedef Vector JumpVector; + + void link(AbstractMacroAssembler* masm) + { + size_t size = m_jumps.size(); + for (size_t i = 0; i < size; ++i) + m_jumps[i].link(masm); + m_jumps.clear(); + } + + void linkTo(Label label, AbstractMacroAssembler* masm) + { + size_t size = m_jumps.size(); + for (size_t i = 0; i < size; ++i) + m_jumps[i].linkTo(label, masm); + m_jumps.clear(); + } + + void append(Jump jump) + { + m_jumps.append(jump); + } + + void append(JumpList& other) + { + m_jumps.append(other.m_jumps.begin(), other.m_jumps.size()); + } + + bool empty() + { + return !m_jumps.size(); + } + + const JumpVector& jumps() { return m_jumps; } + + private: + JumpVector m_jumps; + }; + + + // Section 3: Misc admin methods + + static CodePtr trampolineAt(CodeRef ref, Label label) + { + return CodePtr(AssemblerType::getRelocatedAddress(ref.m_code.dataLocation(), label.m_label)); + } + + size_t size() + { + return m_assembler.size(); + } + + Label label() + { + return Label(this); + } + + Label align() + { + m_assembler.align(16); + return Label(this); + } + + ptrdiff_t differenceBetween(Label from, Jump to) + { + return AssemblerType::getDifferenceBetweenLabels(from.m_label, to.m_jmp); + } + + ptrdiff_t differenceBetween(Label from, Call to) + { + return AssemblerType::getDifferenceBetweenLabels(from.m_label, to.m_jmp); + } + + ptrdiff_t differenceBetween(Label from, Label to) + { + return AssemblerType::getDifferenceBetweenLabels(from.m_label, to.m_label); + } + + ptrdiff_t differenceBetween(Label from, DataLabelPtr to) + { + return AssemblerType::getDifferenceBetweenLabels(from.m_label, to.m_label); + } + + ptrdiff_t differenceBetween(Label from, DataLabel32 to) + { + return AssemblerType::getDifferenceBetweenLabels(from.m_label, to.m_label); + } + + ptrdiff_t differenceBetween(DataLabelPtr from, Jump to) + { + return AssemblerType::getDifferenceBetweenLabels(from.m_label, to.m_jmp); + } + + ptrdiff_t differenceBetween(DataLabelPtr from, DataLabelPtr to) + { + return AssemblerType::getDifferenceBetweenLabels(from.m_label, to.m_label); + } + + ptrdiff_t differenceBetween(DataLabelPtr from, Call to) + { + return AssemblerType::getDifferenceBetweenLabels(from.m_label, to.m_jmp); + } + +protected: + AssemblerType m_assembler; + + friend class LinkBuffer; + friend class RepatchBuffer; + + static void linkJump(void* code, Jump jump, CodeLocationLabel target) + { + AssemblerType::linkJump(code, jump.m_jmp, target.dataLocation()); + } + + static void linkPointer(void* code, typename AssemblerType::JmpDst label, void* value) + { + AssemblerType::linkPointer(code, label, value); + } + + static void* getLinkerAddress(void* code, typename AssemblerType::JmpSrc label) + { + return AssemblerType::getRelocatedAddress(code, label); + } + + static void* getLinkerAddress(void* code, typename AssemblerType::JmpDst label) + { + return AssemblerType::getRelocatedAddress(code, label); + } + + static unsigned getLinkerCallReturnOffset(Call call) + { + return AssemblerType::getCallReturnOffset(call.m_jmp); + } + + static void repatchJump(CodeLocationJump jump, CodeLocationLabel destination) + { + AssemblerType::relinkJump(jump.dataLocation(), destination.dataLocation()); + } + + static void repatchNearCall(CodeLocationNearCall nearCall, CodeLocationLabel destination) + { + AssemblerType::relinkCall(nearCall.dataLocation(), destination.executableAddress()); + } + + static void repatchInt32(CodeLocationDataLabel32 dataLabel32, int32_t value) + { + AssemblerType::repatchInt32(dataLabel32.dataLocation(), value); + } + + static void repatchPointer(CodeLocationDataLabelPtr dataLabelPtr, void* value) + { + AssemblerType::repatchPointer(dataLabelPtr.dataLocation(), value); + } + + static void repatchLoadPtrToLEA(CodeLocationInstruction instruction) + { + AssemblerType::repatchLoadPtrToLEA(instruction.dataLocation()); + } +}; + +} // namespace JSC + +#endif // ENABLE(ASSEMBLER) + +#endif // AbstractMacroAssembler_h diff --git a/assembler/AssemblerBuffer.h b/assembler/AssemblerBuffer.h index e1f53d8..073906a 100644 --- a/assembler/AssemblerBuffer.h +++ b/assembler/AssemblerBuffer.h @@ -95,12 +95,14 @@ namespace JSC { void putIntUnchecked(int value) { + ASSERT(!(m_size > m_capacity - 4)); *reinterpret_cast(&m_buffer[m_size]) = value; m_size += 4; } void putInt64Unchecked(int64_t value) { + ASSERT(!(m_size > m_capacity - 8)); *reinterpret_cast(&m_buffer[m_size]) = value; m_size += 8; } @@ -132,13 +134,24 @@ namespace JSC { if (!result) return 0; + ExecutableAllocator::makeWritable(result, m_size); + return memcpy(result, m_buffer, m_size); } - private: - void grow() + protected: + void append(const char* data, int size) + { + if (m_size > m_capacity - size) + grow(size); + + memcpy(m_buffer + m_size, data, size); + m_size += size; + } + + void grow(int extraCapacity = 0) { - m_capacity += m_capacity / 2; + m_capacity += m_capacity / 2 + extraCapacity; if (m_buffer == m_inlineBuffer) { char* newBuffer = static_cast(fastMalloc(m_capacity)); diff --git a/assembler/AssemblerBufferWithConstantPool.h b/assembler/AssemblerBufferWithConstantPool.h new file mode 100644 index 0000000..f15b7f3 --- /dev/null +++ b/assembler/AssemblerBufferWithConstantPool.h @@ -0,0 +1,305 @@ +/* + * Copyright (C) 2009 University of Szeged + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY UNIVERSITY OF SZEGED ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL UNIVERSITY OF SZEGED OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef AssemblerBufferWithConstantPool_h +#define AssemblerBufferWithConstantPool_h + +#include + +#if ENABLE(ASSEMBLER) + +#include "AssemblerBuffer.h" +#include + +namespace JSC { + +/* + On a constant pool 4 or 8 bytes data can be stored. The values can be + constants or addresses. The addresses should be 32 or 64 bits. The constants + should be double-precisions float or integer numbers which are hard to be + encoded as few machine instructions. + + TODO: The pool is desinged to handle both 32 and 64 bits values, but + currently only the 4 bytes constants are implemented and tested. + + The AssemblerBuffer can contain multiple constant pools. Each pool is inserted + into the instruction stream - protected by a jump instruction from the + execution flow. + + The flush mechanism is called when no space remain to insert the next instruction + into the pool. Three values are used to determine when the constant pool itself + have to be inserted into the instruction stream (Assembler Buffer): + + - maxPoolSize: size of the constant pool in bytes, this value cannot be + larger than the maximum offset of a PC relative memory load + + - barrierSize: size of jump instruction in bytes which protects the + constant pool from execution + + - maxInstructionSize: maximum length of a machine instruction in bytes + + There are some callbacks which solve the target architecture specific + address handling: + + - TYPE patchConstantPoolLoad(TYPE load, int value): + patch the 'load' instruction with the index of the constant in the + constant pool and return the patched instruction. + + - void patchConstantPoolLoad(void* loadAddr, void* constPoolAddr): + patch the a PC relative load instruction at 'loadAddr' address with the + final relative offset. The offset can be computed with help of + 'constPoolAddr' (the address of the constant pool) and index of the + constant (which is stored previously in the load instruction itself). + + - TYPE placeConstantPoolBarrier(int size): + return with a constant pool barrier instruction which jumps over the + constant pool. + + The 'put*WithConstant*' functions should be used to place a data into the + constant pool. +*/ + +template +class AssemblerBufferWithConstantPool: public AssemblerBuffer { + typedef WTF::SegmentedVector LoadOffsets; +public: + enum { + UniqueConst, + ReusableConst, + UnusedEntry, + }; + + AssemblerBufferWithConstantPool() + : AssemblerBuffer() + , m_numConsts(0) + , m_maxDistance(maxPoolSize) + , m_lastConstDelta(0) + { + m_pool = static_cast(fastMalloc(maxPoolSize)); + m_mask = static_cast(fastMalloc(maxPoolSize / sizeof(uint32_t))); + } + + ~AssemblerBufferWithConstantPool() + { + fastFree(m_mask); + fastFree(m_pool); + } + + void ensureSpace(int space) + { + flushIfNoSpaceFor(space); + AssemblerBuffer::ensureSpace(space); + } + + void ensureSpace(int insnSpace, int constSpace) + { + flushIfNoSpaceFor(insnSpace, constSpace); + AssemblerBuffer::ensureSpace(insnSpace); + } + + bool isAligned(int alignment) + { + flushIfNoSpaceFor(alignment); + return AssemblerBuffer::isAligned(alignment); + } + + void putByteUnchecked(int value) + { + AssemblerBuffer::putByteUnchecked(value); + correctDeltas(1); + } + + void putByte(int value) + { + flushIfNoSpaceFor(1); + AssemblerBuffer::putByte(value); + correctDeltas(1); + } + + void putShortUnchecked(int value) + { + AssemblerBuffer::putShortUnchecked(value); + correctDeltas(2); + } + + void putShort(int value) + { + flushIfNoSpaceFor(2); + AssemblerBuffer::putShort(value); + correctDeltas(2); + } + + void putIntUnchecked(int value) + { + AssemblerBuffer::putIntUnchecked(value); + correctDeltas(4); + } + + void putInt(int value) + { + flushIfNoSpaceFor(4); + AssemblerBuffer::putInt(value); + correctDeltas(4); + } + + void putInt64Unchecked(int64_t value) + { + AssemblerBuffer::putInt64Unchecked(value); + correctDeltas(8); + } + + int size() + { + flushIfNoSpaceFor(maxInstructionSize, sizeof(uint64_t)); + return AssemblerBuffer::size(); + } + + void* executableCopy(ExecutablePool* allocator) + { + flushConstantPool(false); + return AssemblerBuffer::executableCopy(allocator); + } + + void putIntWithConstantInt(uint32_t insn, uint32_t constant, bool isReusable = false) + { + flushIfNoSpaceFor(4, 4); + + m_loadOffsets.append(AssemblerBuffer::size()); + if (isReusable) + for (int i = 0; i < m_numConsts; ++i) { + if (m_mask[i] == ReusableConst && m_pool[i] == constant) { + AssemblerBuffer::putInt(AssemblerType::patchConstantPoolLoad(insn, i)); + correctDeltas(4); + return; + } + } + + m_pool[m_numConsts] = constant; + m_mask[m_numConsts] = static_cast(isReusable ? ReusableConst : UniqueConst); + + AssemblerBuffer::putInt(AssemblerType::patchConstantPoolLoad(insn, m_numConsts)); + ++m_numConsts; + + correctDeltas(4, 4); + } + + // This flushing mechanism can be called after any unconditional jumps. + void flushWithoutBarrier() + { + // Flush if constant pool is more than 60% full to avoid overuse of this function. + if (5 * m_numConsts > 3 * maxPoolSize / sizeof(uint32_t)) + flushConstantPool(false); + } + + uint32_t* poolAddress() + { + return m_pool; + } + +private: + void correctDeltas(int insnSize) + { + m_maxDistance -= insnSize; + m_lastConstDelta -= insnSize; + if (m_lastConstDelta < 0) + m_lastConstDelta = 0; + } + + void correctDeltas(int insnSize, int constSize) + { + correctDeltas(insnSize); + + m_maxDistance -= m_lastConstDelta; + m_lastConstDelta = constSize; + } + + void flushConstantPool(bool useBarrier = true) + { + if (m_numConsts == 0) + return; + int alignPool = (AssemblerBuffer::size() + (useBarrier ? barrierSize : 0)) & (sizeof(uint64_t) - 1); + + if (alignPool) + alignPool = sizeof(uint64_t) - alignPool; + + // Callback to protect the constant pool from execution + if (useBarrier) + AssemblerBuffer::putInt(AssemblerType::placeConstantPoolBarrier(m_numConsts * sizeof(uint32_t) + alignPool)); + + if (alignPool) { + if (alignPool & 1) + AssemblerBuffer::putByte(AssemblerType::padForAlign8); + if (alignPool & 2) + AssemblerBuffer::putShort(AssemblerType::padForAlign16); + if (alignPool & 4) + AssemblerBuffer::putInt(AssemblerType::padForAlign32); + } + + int constPoolOffset = AssemblerBuffer::size(); + append(reinterpret_cast(m_pool), m_numConsts * sizeof(uint32_t)); + + // Patch each PC relative load + for (LoadOffsets::Iterator iter = m_loadOffsets.begin(); iter != m_loadOffsets.end(); ++iter) { + void* loadAddr = reinterpret_cast(m_buffer + *iter); + AssemblerType::patchConstantPoolLoad(loadAddr, reinterpret_cast(m_buffer + constPoolOffset)); + } + + m_loadOffsets.clear(); + m_numConsts = 0; + m_maxDistance = maxPoolSize; + } + + void flushIfNoSpaceFor(int nextInsnSize) + { + if (m_numConsts == 0) + return; + if ((m_maxDistance < nextInsnSize + m_lastConstDelta + barrierSize + (int)sizeof(uint32_t))) + flushConstantPool(); + } + + void flushIfNoSpaceFor(int nextInsnSize, int nextConstSize) + { + if (m_numConsts == 0) + return; + if ((m_maxDistance < nextInsnSize + m_lastConstDelta + barrierSize + (int)sizeof(uint32_t)) || + (m_numConsts + nextConstSize / sizeof(uint32_t) >= maxPoolSize)) + flushConstantPool(); + } + + uint32_t* m_pool; + char* m_mask; + LoadOffsets m_loadOffsets; + + int m_numConsts; + int m_maxDistance; + int m_lastConstDelta; +}; + +} // namespace JSC + +#endif // ENABLE(ASSEMBLER) + +#endif // AssemblerBufferWithConstantPool_h diff --git a/assembler/CodeLocation.h b/assembler/CodeLocation.h new file mode 100644 index 0000000..b910b6f --- /dev/null +++ b/assembler/CodeLocation.h @@ -0,0 +1,186 @@ +/* + * Copyright (C) 2009 Apple Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef CodeLocation_h +#define CodeLocation_h + +#include + +#include + +#if ENABLE(ASSEMBLER) + +namespace JSC { + +class CodeLocationInstruction; +class CodeLocationLabel; +class CodeLocationJump; +class CodeLocationCall; +class CodeLocationNearCall; +class CodeLocationDataLabel32; +class CodeLocationDataLabelPtr; + +// The CodeLocation* types are all pretty much do-nothing wrappers around +// CodePtr (or MacroAssemblerCodePtr, to give it its full name). These +// classes only exist to provide type-safety when linking and patching code. +// +// The one new piece of functionallity introduced by these classes is the +// ability to create (or put another way, to re-discover) another CodeLocation +// at an offset from one you already know. When patching code to optimize it +// we often want to patch a number of instructions that are short, fixed +// offsets apart. To reduce memory overhead we will only retain a pointer to +// one of the instructions, and we will use the *AtOffset methods provided by +// CodeLocationCommon to find the other points in the code to modify. +class CodeLocationCommon : public MacroAssemblerCodePtr { +public: + CodeLocationInstruction instructionAtOffset(int offset); + CodeLocationLabel labelAtOffset(int offset); + CodeLocationJump jumpAtOffset(int offset); + CodeLocationCall callAtOffset(int offset); + CodeLocationNearCall nearCallAtOffset(int offset); + CodeLocationDataLabelPtr dataLabelPtrAtOffset(int offset); + CodeLocationDataLabel32 dataLabel32AtOffset(int offset); + +protected: + CodeLocationCommon() + { + } + + CodeLocationCommon(MacroAssemblerCodePtr location) + : MacroAssemblerCodePtr(location) + { + } +}; + +class CodeLocationInstruction : public CodeLocationCommon { +public: + CodeLocationInstruction() {} + explicit CodeLocationInstruction(MacroAssemblerCodePtr location) + : CodeLocationCommon(location) {} + explicit CodeLocationInstruction(void* location) + : CodeLocationCommon(MacroAssemblerCodePtr(location)) {} +}; + +class CodeLocationLabel : public CodeLocationCommon { +public: + CodeLocationLabel() {} + explicit CodeLocationLabel(MacroAssemblerCodePtr location) + : CodeLocationCommon(location) {} + explicit CodeLocationLabel(void* location) + : CodeLocationCommon(MacroAssemblerCodePtr(location)) {} +}; + +class CodeLocationJump : public CodeLocationCommon { +public: + CodeLocationJump() {} + explicit CodeLocationJump(MacroAssemblerCodePtr location) + : CodeLocationCommon(location) {} + explicit CodeLocationJump(void* location) + : CodeLocationCommon(MacroAssemblerCodePtr(location)) {} +}; + +class CodeLocationCall : public CodeLocationCommon { +public: + CodeLocationCall() {} + explicit CodeLocationCall(MacroAssemblerCodePtr location) + : CodeLocationCommon(location) {} + explicit CodeLocationCall(void* location) + : CodeLocationCommon(MacroAssemblerCodePtr(location)) {} +}; + +class CodeLocationNearCall : public CodeLocationCommon { +public: + CodeLocationNearCall() {} + explicit CodeLocationNearCall(MacroAssemblerCodePtr location) + : CodeLocationCommon(location) {} + explicit CodeLocationNearCall(void* location) + : CodeLocationCommon(MacroAssemblerCodePtr(location)) {} +}; + +class CodeLocationDataLabel32 : public CodeLocationCommon { +public: + CodeLocationDataLabel32() {} + explicit CodeLocationDataLabel32(MacroAssemblerCodePtr location) + : CodeLocationCommon(location) {} + explicit CodeLocationDataLabel32(void* location) + : CodeLocationCommon(MacroAssemblerCodePtr(location)) {} +}; + +class CodeLocationDataLabelPtr : public CodeLocationCommon { +public: + CodeLocationDataLabelPtr() {} + explicit CodeLocationDataLabelPtr(MacroAssemblerCodePtr location) + : CodeLocationCommon(location) {} + explicit CodeLocationDataLabelPtr(void* location) + : CodeLocationCommon(MacroAssemblerCodePtr(location)) {} +}; + +inline CodeLocationInstruction CodeLocationCommon::instructionAtOffset(int offset) +{ + ASSERT_VALID_CODE_OFFSET(offset); + return CodeLocationInstruction(reinterpret_cast(dataLocation()) + offset); +} + +inline CodeLocationLabel CodeLocationCommon::labelAtOffset(int offset) +{ + ASSERT_VALID_CODE_OFFSET(offset); + return CodeLocationLabel(reinterpret_cast(dataLocation()) + offset); +} + +inline CodeLocationJump CodeLocationCommon::jumpAtOffset(int offset) +{ + ASSERT_VALID_CODE_OFFSET(offset); + return CodeLocationJump(reinterpret_cast(dataLocation()) + offset); +} + +inline CodeLocationCall CodeLocationCommon::callAtOffset(int offset) +{ + ASSERT_VALID_CODE_OFFSET(offset); + return CodeLocationCall(reinterpret_cast(dataLocation()) + offset); +} + +inline CodeLocationNearCall CodeLocationCommon::nearCallAtOffset(int offset) +{ + ASSERT_VALID_CODE_OFFSET(offset); + return CodeLocationNearCall(reinterpret_cast(dataLocation()) + offset); +} + +inline CodeLocationDataLabelPtr CodeLocationCommon::dataLabelPtrAtOffset(int offset) +{ + ASSERT_VALID_CODE_OFFSET(offset); + return CodeLocationDataLabelPtr(reinterpret_cast(dataLocation()) + offset); +} + +inline CodeLocationDataLabel32 CodeLocationCommon::dataLabel32AtOffset(int offset) +{ + ASSERT_VALID_CODE_OFFSET(offset); + return CodeLocationDataLabel32(reinterpret_cast(dataLocation()) + offset); +} + +} // namespace JSC + +#endif // ENABLE(ASSEMBLER) + +#endif // CodeLocation_h diff --git a/assembler/LinkBuffer.h b/assembler/LinkBuffer.h new file mode 100644 index 0000000..6d08117 --- /dev/null +++ b/assembler/LinkBuffer.h @@ -0,0 +1,195 @@ +/* + * Copyright (C) 2009 Apple Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef LinkBuffer_h +#define LinkBuffer_h + +#include + +#if ENABLE(ASSEMBLER) + +#include +#include + +namespace JSC { + +// LinkBuffer: +// +// This class assists in linking code generated by the macro assembler, once code generation +// has been completed, and the code has been copied to is final location in memory. At this +// time pointers to labels within the code may be resolved, and relative offsets to external +// addresses may be fixed. +// +// Specifically: +// * Jump objects may be linked to external targets, +// * The address of Jump objects may taken, such that it can later be relinked. +// * The return address of a Call may be acquired. +// * The address of a Label pointing into the code may be resolved. +// * The value referenced by a DataLabel may be set. +// +class LinkBuffer : public Noncopyable { + typedef MacroAssemblerCodeRef CodeRef; + typedef MacroAssembler::Label Label; + typedef MacroAssembler::Jump Jump; + typedef MacroAssembler::JumpList JumpList; + typedef MacroAssembler::Call Call; + typedef MacroAssembler::DataLabel32 DataLabel32; + typedef MacroAssembler::DataLabelPtr DataLabelPtr; + +public: + // Note: Initialization sequence is significant, since executablePool is a PassRefPtr. + // First, executablePool is copied into m_executablePool, then the initialization of + // m_code uses m_executablePool, *not* executablePool, since this is no longer valid. + LinkBuffer(MacroAssembler* masm, PassRefPtr executablePool) + : m_executablePool(executablePool) + , m_code(masm->m_assembler.executableCopy(m_executablePool.get())) + , m_size(masm->m_assembler.size()) +#ifndef NDEBUG + , m_completed(false) +#endif + { + } + + ~LinkBuffer() + { + ASSERT(m_completed); + } + + // These methods are used to link or set values at code generation time. + + void link(Call call, FunctionPtr function) + { + ASSERT(call.isFlagSet(Call::Linkable)); + MacroAssembler::linkCall(code(), call, function); + } + + void link(Jump jump, CodeLocationLabel label) + { + MacroAssembler::linkJump(code(), jump, label); + } + + void link(JumpList list, CodeLocationLabel label) + { + for (unsigned i = 0; i < list.m_jumps.size(); ++i) + MacroAssembler::linkJump(code(), list.m_jumps[i], label); + } + + void patch(DataLabelPtr label, void* value) + { + MacroAssembler::linkPointer(code(), label.m_label, value); + } + + void patch(DataLabelPtr label, CodeLocationLabel value) + { + MacroAssembler::linkPointer(code(), label.m_label, value.executableAddress()); + } + + // These methods are used to obtain handles to allow the code to be relinked / repatched later. + + CodeLocationCall locationOf(Call call) + { + ASSERT(call.isFlagSet(Call::Linkable)); + ASSERT(!call.isFlagSet(Call::Near)); + return CodeLocationCall(MacroAssembler::getLinkerAddress(code(), call.m_jmp)); + } + + CodeLocationNearCall locationOfNearCall(Call call) + { + ASSERT(call.isFlagSet(Call::Linkable)); + ASSERT(call.isFlagSet(Call::Near)); + return CodeLocationNearCall(MacroAssembler::getLinkerAddress(code(), call.m_jmp)); + } + + CodeLocationLabel locationOf(Label label) + { + return CodeLocationLabel(MacroAssembler::getLinkerAddress(code(), label.m_label)); + } + + CodeLocationDataLabelPtr locationOf(DataLabelPtr label) + { + return CodeLocationDataLabelPtr(MacroAssembler::getLinkerAddress(code(), label.m_label)); + } + + CodeLocationDataLabel32 locationOf(DataLabel32 label) + { + return CodeLocationDataLabel32(MacroAssembler::getLinkerAddress(code(), label.m_label)); + } + + // This method obtains the return address of the call, given as an offset from + // the start of the code. + unsigned returnAddressOffset(Call call) + { + return MacroAssembler::getLinkerCallReturnOffset(call); + } + + // Upon completion of all patching either 'finalizeCode()' or 'finalizeCodeAddendum()' should be called + // once to complete generation of the code. 'finalizeCode()' is suited to situations + // where the executable pool must also be retained, the lighter-weight 'finalizeCodeAddendum()' is + // suited to adding to an existing allocation. + CodeRef finalizeCode() + { + performFinalization(); + + return CodeRef(m_code, m_executablePool, m_size); + } + CodeLocationLabel finalizeCodeAddendum() + { + performFinalization(); + + return CodeLocationLabel(code()); + } + +private: + // Keep this private! - the underlying code should only be obtained externally via + // finalizeCode() or finalizeCodeAddendum(). + void* code() + { + return m_code; + } + + void performFinalization() + { +#ifndef NDEBUG + ASSERT(!m_completed); + m_completed = true; +#endif + + ExecutableAllocator::makeExecutable(code(), m_size); + ExecutableAllocator::cacheFlush(code(), m_size); + } + + RefPtr m_executablePool; + void* m_code; + size_t m_size; +#ifndef NDEBUG + bool m_completed; +#endif +}; + +} // namespace JSC + +#endif // ENABLE(ASSEMBLER) + +#endif // LinkBuffer_h diff --git a/assembler/MacroAssembler.h b/assembler/MacroAssembler.h index 9d24653..43d27e7 100644 --- a/assembler/MacroAssembler.h +++ b/assembler/MacroAssembler.h @@ -30,1986 +30,310 @@ #if ENABLE(ASSEMBLER) -#include "X86Assembler.h" +#if PLATFORM_ARM_ARCH(7) +#include "MacroAssemblerARMv7.h" +namespace JSC { typedef MacroAssemblerARMv7 MacroAssemblerBase; }; -namespace JSC { +#elif PLATFORM(X86) +#include "MacroAssemblerX86.h" +namespace JSC { typedef MacroAssemblerX86 MacroAssemblerBase; }; -class MacroAssembler { -protected: - X86Assembler m_assembler; +#elif PLATFORM(X86_64) +#include "MacroAssemblerX86_64.h" +namespace JSC { typedef MacroAssemblerX86_64 MacroAssemblerBase; }; -#if PLATFORM(X86_64) - static const X86::RegisterID scratchRegister = X86::r11; +#else +#error "The MacroAssembler is not supported on this platform." #endif + +namespace JSC { + +class MacroAssembler : public MacroAssemblerBase { public: - typedef X86::RegisterID RegisterID; - - // Note: do not rely on values in this enum, these will change (to 0..3). - enum Scale { - TimesOne = 1, - TimesTwo = 2, - TimesFour = 4, - TimesEight = 8, -#if PLATFORM(X86) - ScalePtr = TimesFour -#endif + + using MacroAssemblerBase::pop; + using MacroAssemblerBase::jump; + using MacroAssemblerBase::branch32; + using MacroAssemblerBase::branch16; #if PLATFORM(X86_64) - ScalePtr = TimesEight + using MacroAssemblerBase::branchPtr; + using MacroAssemblerBase::branchTestPtr; #endif - }; - MacroAssembler() + + // Platform agnostic onvenience functions, + // described in terms of other macro assembly methods. + void pop() { + addPtr(Imm32(sizeof(void*)), stackPointerRegister); } - size_t size() { return m_assembler.size(); } - void* copyCode(ExecutablePool* allocator) + void peek(RegisterID dest, int index = 0) { - return m_assembler.executableCopy(allocator); + loadPtr(Address(stackPointerRegister, (index * sizeof(void*))), dest); } - - // Address: - // - // Describes a simple base-offset address. - struct Address { - explicit Address(RegisterID base, int32_t offset = 0) - : base(base) - , offset(offset) - { - } - - RegisterID base; - int32_t offset; - }; - - // ImplicitAddress: - // - // This class is used for explicit 'load' and 'store' operations - // (as opposed to situations in which a memory operand is provided - // to a generic operation, such as an integer arithmetic instruction). - // - // In the case of a load (or store) operation we want to permit - // addresses to be implicitly constructed, e.g. the two calls: - // - // load32(Address(addrReg), destReg); - // load32(addrReg, destReg); - // - // Are equivalent, and the explicit wrapping of the Address in the former - // is unnecessary. - struct ImplicitAddress { - ImplicitAddress(RegisterID base) - : base(base) - , offset(0) - { - } - - ImplicitAddress(Address address) - : base(address.base) - , offset(address.offset) - { - } - - RegisterID base; - int32_t offset; - }; - - // BaseIndex: - // - // Describes a complex addressing mode. - struct BaseIndex { - BaseIndex(RegisterID base, RegisterID index, Scale scale, int32_t offset = 0) - : base(base) - , index(index) - , scale(scale) - , offset(offset) - { - } - - RegisterID base; - RegisterID index; - Scale scale; - int32_t offset; - }; - - // AbsoluteAddress: - // - // Describes an memory operand given by a pointer. For regular load & store - // operations an unwrapped void* will be used, rather than using this. - struct AbsoluteAddress { - explicit AbsoluteAddress(void* ptr) - : m_ptr(ptr) - { - } - - void* m_ptr; - }; - - - class Jump; - class PatchBuffer; - - // DataLabelPtr: - // - // A DataLabelPtr is used to refer to a location in the code containing a pointer to be - // patched after the code has been generated. - class DataLabelPtr { - friend class MacroAssembler; - friend class PatchBuffer; - - public: - DataLabelPtr() - { - } - - DataLabelPtr(MacroAssembler* masm) - : m_label(masm->m_assembler.label()) - { - } - - static void patch(void* address, void* value) - { - X86Assembler::patchPointer(reinterpret_cast(address), reinterpret_cast(value)); - } - - private: - X86Assembler::JmpDst m_label; - }; - - // DataLabel32: - // - // A DataLabelPtr is used to refer to a location in the code containing a pointer to be - // patched after the code has been generated. - class DataLabel32 { - friend class MacroAssembler; - friend class PatchBuffer; - - public: - DataLabel32() - { - } - - DataLabel32(MacroAssembler* masm) - : m_label(masm->m_assembler.label()) - { - } - - static void patch(void* address, int32_t value) - { - X86Assembler::patchImmediate(reinterpret_cast(address), value); - } - - private: - X86Assembler::JmpDst m_label; - }; - - // Label: - // - // A Label records a point in the generated instruction stream, typically such that - // it may be used as a destination for a jump. - class Label { - friend class Jump; - friend class MacroAssembler; - friend class PatchBuffer; - - public: - Label() - { - } - - Label(MacroAssembler* masm) - : m_label(masm->m_assembler.label()) - { - } - - // FIXME: transitionary method, while we replace JmpSrces with Jumps. - operator X86Assembler::JmpDst() - { - return m_label; - } - - private: - X86Assembler::JmpDst m_label; - }; - - - // Jump: - // - // A jump object is a reference to a jump instruction that has been planted - // into the code buffer - it is typically used to link the jump, setting the - // relative offset such that when executed it will jump to the desired - // destination. - // - // Jump objects retain a pointer to the assembler for syntactic purposes - - // to allow the jump object to be able to link itself, e.g.: - // - // Jump forwardsBranch = jne32(Imm32(0), reg1); - // // ... - // forwardsBranch.link(); - // - // Jumps may also be linked to a Label. - class Jump { - friend class PatchBuffer; - friend class MacroAssembler; - - public: - Jump() - { - } - - // FIXME: transitionary method, while we replace JmpSrces with Jumps. - Jump(X86Assembler::JmpSrc jmp) - : m_jmp(jmp) - { - } - - void link(MacroAssembler* masm) - { - masm->m_assembler.link(m_jmp, masm->m_assembler.label()); - } - - void linkTo(Label label, MacroAssembler* masm) - { - masm->m_assembler.link(m_jmp, label.m_label); - } - - // FIXME: transitionary method, while we replace JmpSrces with Jumps. - operator X86Assembler::JmpSrc() - { - return m_jmp; - } - - static void patch(void* address, void* destination) - { - X86Assembler::patchBranchOffset(reinterpret_cast(address), destination); - } - - private: - X86Assembler::JmpSrc m_jmp; - }; - - // JumpList: - // - // A JumpList is a set of Jump objects. - // All jumps in the set will be linked to the same destination. - class JumpList { - friend class PatchBuffer; - - public: - void link(MacroAssembler* masm) - { - size_t size = m_jumps.size(); - for (size_t i = 0; i < size; ++i) - m_jumps[i].link(masm); - m_jumps.clear(); - } - - void linkTo(Label label, MacroAssembler* masm) - { - size_t size = m_jumps.size(); - for (size_t i = 0; i < size; ++i) - m_jumps[i].linkTo(label, masm); - m_jumps.clear(); - } - - void append(Jump jump) - { - m_jumps.append(jump); - } - - void append(JumpList& other) - { - m_jumps.append(other.m_jumps.begin(), other.m_jumps.size()); - } - - bool empty() - { - return !m_jumps.size(); - } - - private: - Vector m_jumps; - }; - - - // PatchBuffer: - // - // This class assists in linking code generated by the macro assembler, once code generation - // has been completed, and the code has been copied to is final location in memory. At this - // time pointers to labels within the code may be resolved, and relative offsets to external - // addresses may be fixed. - // - // Specifically: - // * Jump objects may be linked to external targets, - // * The address of Jump objects may taken, such that it can later be relinked. - // * The return address of a Jump object representing a call may be acquired. - // * The address of a Label pointing into the code may be resolved. - // * The value referenced by a DataLabel may be fixed. - // - // FIXME: distinguish between Calls & Jumps (make a specific call to obtain the return - // address of calls, as opposed to a point that can be used to later relink a Jump - - // possibly wrap the later up in an object that can do just that). - class PatchBuffer { - public: - PatchBuffer(void* code) - : m_code(code) - { - } - - void link(Jump jump, void* target) - { - X86Assembler::link(m_code, jump.m_jmp, target); - } - - void link(JumpList list, void* target) - { - for (unsigned i = 0; i < list.m_jumps.size(); ++i) - X86Assembler::link(m_code, list.m_jumps[i], target); - } - - void* addressOf(Jump jump) - { - return X86Assembler::getRelocatedAddress(m_code, jump.m_jmp); - } - - void* addressOf(Label label) - { - return X86Assembler::getRelocatedAddress(m_code, label.m_label); - } - - void* addressOf(DataLabelPtr label) - { - return X86Assembler::getRelocatedAddress(m_code, label.m_label); - } - - void* addressOf(DataLabel32 label) - { - return X86Assembler::getRelocatedAddress(m_code, label.m_label); - } - - void setPtr(DataLabelPtr label, void* value) - { - X86Assembler::patchAddress(m_code, label.m_label, value); - } - - private: - void* m_code; - }; - - - // ImmPtr: - // - // A pointer sized immediate operand to an instruction - this is wrapped - // in a class requiring explicit construction in order to differentiate - // from pointers used as absolute addresses to memory operations - struct ImmPtr { - explicit ImmPtr(void* value) - : m_value(value) - { - } - - intptr_t asIntptr() - { - return reinterpret_cast(m_value); - } - - void* m_value; - }; - - - // Imm32: - // - // A 32bit immediate operand to an instruction - this is wrapped in a - // class requiring explicit construction in order to prevent RegisterIDs - // (which are implemented as an enum) from accidentally being passed as - // immediate values. - struct Imm32 { - explicit Imm32(int32_t value) - : m_value(value) - { - } - -#if PLATFORM(X86) - explicit Imm32(ImmPtr ptr) - : m_value(ptr.asIntptr()) - { - } -#endif - - int32_t m_value; - }; - - // Integer arithmetic operations: - // - // Operations are typically two operand - operation(source, srcDst) - // For many operations the source may be an Imm32, the srcDst operand - // may often be a memory location (explictly described using an Address - // object). - - void addPtr(RegisterID src, RegisterID dest) + void poke(RegisterID src, int index = 0) { -#if PLATFORM(X86_64) - m_assembler.addq_rr(src, dest); -#else - add32(src, dest); -#endif + storePtr(src, Address(stackPointerRegister, (index * sizeof(void*)))); } - void addPtr(Imm32 imm, RegisterID srcDest) + void poke(Imm32 value, int index = 0) { -#if PLATFORM(X86_64) - m_assembler.addq_ir(imm.m_value, srcDest); -#else - add32(imm, srcDest); -#endif + store32(value, Address(stackPointerRegister, (index * sizeof(void*)))); } - void addPtr(ImmPtr imm, RegisterID dest) + void poke(ImmPtr imm, int index = 0) { -#if PLATFORM(X86_64) - move(imm, scratchRegister); - m_assembler.addq_rr(scratchRegister, dest); -#else - add32(Imm32(imm), dest); -#endif + storePtr(imm, Address(stackPointerRegister, (index * sizeof(void*)))); } - void addPtr(Imm32 imm, RegisterID src, RegisterID dest) - { - m_assembler.leal_mr(imm.m_value, src, dest); - } - void add32(RegisterID src, RegisterID dest) + // Backwards banches, these are currently all implemented using existing forwards branch mechanisms. + void branchPtr(Condition cond, RegisterID op1, ImmPtr imm, Label target) { - m_assembler.addl_rr(src, dest); + branchPtr(cond, op1, imm).linkTo(target, this); } - void add32(Imm32 imm, Address address) + void branch32(Condition cond, RegisterID op1, RegisterID op2, Label target) { - m_assembler.addl_im(imm.m_value, address.offset, address.base); + branch32(cond, op1, op2).linkTo(target, this); } - void add32(Imm32 imm, RegisterID dest) + void branch32(Condition cond, RegisterID op1, Imm32 imm, Label target) { - m_assembler.addl_ir(imm.m_value, dest); + branch32(cond, op1, imm).linkTo(target, this); } - - void add32(Imm32 imm, AbsoluteAddress address) + + void branch32(Condition cond, RegisterID left, Address right, Label target) { -#if PLATFORM(X86_64) - move(ImmPtr(address.m_ptr), scratchRegister); - add32(imm, Address(scratchRegister)); -#else - m_assembler.addl_im(imm.m_value, address.m_ptr); -#endif + branch32(cond, left, right).linkTo(target, this); } - - void add32(Address src, RegisterID dest) + + void branch16(Condition cond, BaseIndex left, RegisterID right, Label target) { - m_assembler.addl_mr(src.offset, src.base, dest); + branch16(cond, left, right).linkTo(target, this); } - void andPtr(RegisterID src, RegisterID dest) + void branchTestPtr(Condition cond, RegisterID reg, Label target) { -#if PLATFORM(X86_64) - m_assembler.andq_rr(src, dest); -#else - and32(src, dest); -#endif + branchTestPtr(cond, reg).linkTo(target, this); } - void andPtr(Imm32 imm, RegisterID srcDest) + void jump(Label target) { -#if PLATFORM(X86_64) - m_assembler.andq_ir(imm.m_value, srcDest); -#else - and32(imm, srcDest); -#endif + jump().linkTo(target, this); } - void and32(RegisterID src, RegisterID dest) - { - m_assembler.andl_rr(src, dest); - } - void and32(Imm32 imm, RegisterID dest) + // Ptr methods + // On 32-bit platforms (i.e. x86), these methods directly map onto their 32-bit equivalents. +#if !PLATFORM(X86_64) + void addPtr(RegisterID src, RegisterID dest) { - m_assembler.andl_ir(imm.m_value, dest); + add32(src, dest); } - void lshift32(Imm32 imm, RegisterID dest) - { - m_assembler.shll_i8r(imm.m_value, dest); - } - - void lshift32(RegisterID shift_amount, RegisterID dest) + void addPtr(Imm32 imm, RegisterID srcDest) { - // On x86 we can only shift by ecx; if asked to shift by another register we'll - // need rejig the shift amount into ecx first, and restore the registers afterwards. - if (shift_amount != X86::ecx) { - swap(shift_amount, X86::ecx); - - // E.g. transform "shll %eax, %eax" -> "xchgl %eax, %ecx; shll %ecx, %ecx; xchgl %eax, %ecx" - if (dest == shift_amount) - m_assembler.shll_CLr(X86::ecx); - // E.g. transform "shll %eax, %ecx" -> "xchgl %eax, %ecx; shll %ecx, %eax; xchgl %eax, %ecx" - else if (dest == X86::ecx) - m_assembler.shll_CLr(shift_amount); - // E.g. transform "shll %eax, %ebx" -> "xchgl %eax, %ecx; shll %ecx, %ebx; xchgl %eax, %ecx" - else - m_assembler.shll_CLr(dest); - - swap(shift_amount, X86::ecx); - } else - m_assembler.shll_CLr(dest); + add32(imm, srcDest); } - - // Take the value from dividend, divide it by divisor, and put the remainder in remainder. - // For now, this operation has specific register requirements, and the three register must - // be unique. It is unfortunate to expose this in the MacroAssembler interface, however - // given the complexity to fix, the fact that it is not uncommmon for processors to have - // specific register requirements on this operation (e.g. Mips result in 'hi'), or to not - // support a hardware divide at all, it may not be - void mod32(RegisterID divisor, RegisterID dividend, RegisterID remainder) - { -#ifdef NDEBUG -#pragma unused(dividend,remainder) -#else - ASSERT((dividend == X86::eax) && (remainder == X86::edx)); - ASSERT((dividend != divisor) && (remainder != divisor)); -#endif - m_assembler.cdq(); - m_assembler.idivl_r(divisor); + void addPtr(ImmPtr imm, RegisterID dest) + { + add32(Imm32(imm), dest); } - void mul32(RegisterID src, RegisterID dest) + void addPtr(Imm32 imm, RegisterID src, RegisterID dest) { - m_assembler.imull_rr(src, dest); + add32(imm, src, dest); } - - void mul32(Imm32 imm, RegisterID src, RegisterID dest) + + void andPtr(RegisterID src, RegisterID dest) { - m_assembler.imull_i32r(src, imm.m_value, dest); + and32(src, dest); } - - void not32(RegisterID srcDest) + + void andPtr(Imm32 imm, RegisterID srcDest) { - m_assembler.notl_r(srcDest); + and32(imm, srcDest); } - + void orPtr(RegisterID src, RegisterID dest) { -#if PLATFORM(X86_64) - m_assembler.orq_rr(src, dest); -#else or32(src, dest); -#endif } void orPtr(ImmPtr imm, RegisterID dest) { -#if PLATFORM(X86_64) - move(imm, scratchRegister); - m_assembler.orq_rr(scratchRegister, dest); -#else or32(Imm32(imm), dest); -#endif } void orPtr(Imm32 imm, RegisterID dest) { -#if PLATFORM(X86_64) - m_assembler.orq_ir(imm.m_value, dest); -#else or32(imm, dest); -#endif - } - - void or32(RegisterID src, RegisterID dest) - { - m_assembler.orl_rr(src, dest); - } - - void or32(Imm32 imm, RegisterID dest) - { - m_assembler.orl_ir(imm.m_value, dest); } void rshiftPtr(RegisterID shift_amount, RegisterID dest) { -#if PLATFORM(X86_64) - // On x86 we can only shift by ecx; if asked to shift by another register we'll - // need rejig the shift amount into ecx first, and restore the registers afterwards. - if (shift_amount != X86::ecx) { - swap(shift_amount, X86::ecx); - - // E.g. transform "shll %eax, %eax" -> "xchgl %eax, %ecx; shll %ecx, %ecx; xchgl %eax, %ecx" - if (dest == shift_amount) - m_assembler.sarq_CLr(X86::ecx); - // E.g. transform "shll %eax, %ecx" -> "xchgl %eax, %ecx; shll %ecx, %eax; xchgl %eax, %ecx" - else if (dest == X86::ecx) - m_assembler.sarq_CLr(shift_amount); - // E.g. transform "shll %eax, %ebx" -> "xchgl %eax, %ecx; shll %ecx, %ebx; xchgl %eax, %ecx" - else - m_assembler.sarq_CLr(dest); - - swap(shift_amount, X86::ecx); - } else - m_assembler.sarq_CLr(dest); -#else rshift32(shift_amount, dest); -#endif } void rshiftPtr(Imm32 imm, RegisterID dest) { -#if PLATFORM(X86_64) - m_assembler.sarq_i8r(imm.m_value, dest); -#else rshift32(imm, dest); -#endif - } - - void rshift32(RegisterID shift_amount, RegisterID dest) - { - // On x86 we can only shift by ecx; if asked to shift by another register we'll - // need rejig the shift amount into ecx first, and restore the registers afterwards. - if (shift_amount != X86::ecx) { - swap(shift_amount, X86::ecx); - - // E.g. transform "shll %eax, %eax" -> "xchgl %eax, %ecx; shll %ecx, %ecx; xchgl %eax, %ecx" - if (dest == shift_amount) - m_assembler.sarl_CLr(X86::ecx); - // E.g. transform "shll %eax, %ecx" -> "xchgl %eax, %ecx; shll %ecx, %eax; xchgl %eax, %ecx" - else if (dest == X86::ecx) - m_assembler.sarl_CLr(shift_amount); - // E.g. transform "shll %eax, %ebx" -> "xchgl %eax, %ecx; shll %ecx, %ebx; xchgl %eax, %ecx" - else - m_assembler.sarl_CLr(dest); - - swap(shift_amount, X86::ecx); - } else - m_assembler.sarl_CLr(dest); - } - - void rshift32(Imm32 imm, RegisterID dest) - { - m_assembler.sarl_i8r(imm.m_value, dest); } void subPtr(RegisterID src, RegisterID dest) { -#if PLATFORM(X86_64) - m_assembler.subq_rr(src, dest); -#else sub32(src, dest); -#endif } void subPtr(Imm32 imm, RegisterID dest) { -#if PLATFORM(X86_64) - m_assembler.subq_ir(imm.m_value, dest); -#else sub32(imm, dest); -#endif } void subPtr(ImmPtr imm, RegisterID dest) { -#if PLATFORM(X86_64) - move(imm, scratchRegister); - m_assembler.subq_rr(scratchRegister, dest); -#else sub32(Imm32(imm), dest); -#endif - } - - void sub32(RegisterID src, RegisterID dest) - { - m_assembler.subl_rr(src, dest); - } - - void sub32(Imm32 imm, RegisterID dest) - { - m_assembler.subl_ir(imm.m_value, dest); - } - - void sub32(Imm32 imm, Address address) - { - m_assembler.subl_im(imm.m_value, address.offset, address.base); - } - - void sub32(Imm32 imm, AbsoluteAddress address) - { -#if PLATFORM(X86_64) - move(ImmPtr(address.m_ptr), scratchRegister); - sub32(imm, Address(scratchRegister)); -#else - m_assembler.subl_im(imm.m_value, address.m_ptr); -#endif - } - - void sub32(Address src, RegisterID dest) - { - m_assembler.subl_mr(src.offset, src.base, dest); } void xorPtr(RegisterID src, RegisterID dest) { -#if PLATFORM(X86_64) - m_assembler.xorq_rr(src, dest); -#else xor32(src, dest); -#endif } void xorPtr(Imm32 imm, RegisterID srcDest) { -#if PLATFORM(X86_64) - m_assembler.xorq_ir(imm.m_value, srcDest); -#else xor32(imm, srcDest); -#endif - } - - void xor32(RegisterID src, RegisterID dest) - { - m_assembler.xorl_rr(src, dest); - } - - void xor32(Imm32 imm, RegisterID srcDest) - { - m_assembler.xorl_ir(imm.m_value, srcDest); } - - // Memory access operations: - // - // Loads are of the form load(address, destination) and stores of the form - // store(source, address). The source for a store may be an Imm32. Address - // operand objects to loads and store will be implicitly constructed if a - // register is passed. void loadPtr(ImplicitAddress address, RegisterID dest) { -#if PLATFORM(X86_64) - m_assembler.movq_mr(address.offset, address.base, dest); -#else load32(address, dest); -#endif - } - - DataLabel32 loadPtrWithAddressOffsetPatch(Address address, RegisterID dest) - { -#if PLATFORM(X86_64) - m_assembler.movq_mr_disp32(address.offset, address.base, dest); - return DataLabel32(this); -#else - m_assembler.movl_mr_disp32(address.offset, address.base, dest); - return DataLabel32(this); -#endif } void loadPtr(BaseIndex address, RegisterID dest) { -#if PLATFORM(X86_64) - m_assembler.movq_mr(address.offset, address.base, address.index, address.scale, dest); -#else load32(address, dest); -#endif } void loadPtr(void* address, RegisterID dest) { -#if PLATFORM(X86_64) - if (dest == X86::eax) - m_assembler.movq_mEAX(address); - else { - move(X86::eax, dest); - m_assembler.movq_mEAX(address); - swap(X86::eax, dest); - } -#else load32(address, dest); -#endif - } - - void load32(ImplicitAddress address, RegisterID dest) - { - m_assembler.movl_mr(address.offset, address.base, dest); - } - - void load32(BaseIndex address, RegisterID dest) - { - m_assembler.movl_mr(address.offset, address.base, address.index, address.scale, dest); } - void load32(void* address, RegisterID dest) + DataLabel32 loadPtrWithAddressOffsetPatch(Address address, RegisterID dest) { -#if PLATFORM(X86_64) - if (dest == X86::eax) - m_assembler.movl_mEAX(address); - else { - move(X86::eax, dest); - m_assembler.movl_mEAX(address); - swap(X86::eax, dest); - } -#else - m_assembler.movl_mr(address, dest); -#endif + return load32WithAddressOffsetPatch(address, dest); } - void load16(BaseIndex address, RegisterID dest) + void setPtr(Condition cond, RegisterID left, Imm32 right, RegisterID dest) { - m_assembler.movzwl_mr(address.offset, address.base, address.index, address.scale, dest); + set32(cond, left, right, dest); } void storePtr(RegisterID src, ImplicitAddress address) { -#if PLATFORM(X86_64) - m_assembler.movq_rm(src, address.offset, address.base); -#else store32(src, address); -#endif } - DataLabel32 storePtrWithAddressOffsetPatch(RegisterID src, Address address) + void storePtr(RegisterID src, BaseIndex address) { -#if PLATFORM(X86_64) - m_assembler.movq_rm_disp32(src, address.offset, address.base); - return DataLabel32(this); -#else - m_assembler.movl_rm_disp32(src, address.offset, address.base); - return DataLabel32(this); -#endif + store32(src, address); } - void storePtr(RegisterID src, BaseIndex address) + void storePtr(RegisterID src, void* address) { -#if PLATFORM(X86_64) - m_assembler.movq_rm(src, address.offset, address.base, address.index, address.scale); -#else store32(src, address); -#endif } void storePtr(ImmPtr imm, ImplicitAddress address) { -#if PLATFORM(X86_64) - move(imm, scratchRegister); - storePtr(scratchRegister, address); -#else - m_assembler.movl_i32m(imm.asIntptr(), address.offset, address.base); -#endif + store32(Imm32(imm), address); } -#if !PLATFORM(X86_64) void storePtr(ImmPtr imm, void* address) { store32(Imm32(imm), address); } -#endif - - DataLabelPtr storePtrWithPatch(Address address) - { -#if PLATFORM(X86_64) - m_assembler.movq_i64r(0, scratchRegister); - DataLabelPtr label(this); - storePtr(scratchRegister, address); - return label; -#else - m_assembler.movl_i32m(0, address.offset, address.base); - return DataLabelPtr(this); -#endif - } - void store32(RegisterID src, ImplicitAddress address) + DataLabel32 storePtrWithAddressOffsetPatch(RegisterID src, Address address) { - m_assembler.movl_rm(src, address.offset, address.base); + return store32WithAddressOffsetPatch(src, address); } - void store32(RegisterID src, BaseIndex address) - { - m_assembler.movl_rm(src, address.offset, address.base, address.index, address.scale); - } - void store32(Imm32 imm, ImplicitAddress address) + Jump branchPtr(Condition cond, RegisterID left, RegisterID right) { - m_assembler.movl_i32m(imm.m_value, address.offset, address.base); - } - - void store32(Imm32 imm, void* address) - { -#if PLATFORM(X86_64) - move(X86::eax, scratchRegister); - move(imm, X86::eax); - m_assembler.movl_EAXm(address); - move(scratchRegister, X86::eax); -#else - m_assembler.movl_i32m(imm.m_value, address); -#endif + return branch32(cond, left, right); } - - // Stack manipulation operations: - // - // The ABI is assumed to provide a stack abstraction to memory, - // containing machine word sized units of data. Push and pop - // operations add and remove a single register sized unit of data - // to or from the stack. Peek and poke operations read or write - // values on the stack, without moving the current stack position. - - void pop(RegisterID dest) + Jump branchPtr(Condition cond, RegisterID left, ImmPtr right) { - m_assembler.pop_r(dest); + return branch32(cond, left, Imm32(right)); } - void push(RegisterID src) + Jump branchPtr(Condition cond, RegisterID left, Address right) { - m_assembler.push_r(src); + return branch32(cond, left, right); } - void push(Address address) + Jump branchPtr(Condition cond, Address left, RegisterID right) { - m_assembler.push_m(address.offset, address.base); + return branch32(cond, left, right); } - void push(Imm32 imm) + Jump branchPtr(Condition cond, AbsoluteAddress left, RegisterID right) { - m_assembler.push_i32(imm.m_value); + return branch32(cond, left, right); } - void pop() - { - addPtr(Imm32(sizeof(void*)), X86::esp); - } - - void peek(RegisterID dest, int index = 0) + Jump branchPtr(Condition cond, Address left, ImmPtr right) { - loadPtr(Address(X86::esp, (index * sizeof(void *))), dest); + return branch32(cond, left, Imm32(right)); } - void poke(RegisterID src, int index = 0) + Jump branchPtr(Condition cond, AbsoluteAddress left, ImmPtr right) { - storePtr(src, Address(X86::esp, (index * sizeof(void *)))); + return branch32(cond, left, Imm32(right)); } - void poke(Imm32 value, int index = 0) + Jump branchTestPtr(Condition cond, RegisterID reg, RegisterID mask) { - store32(value, Address(X86::esp, (index * sizeof(void *)))); + return branchTest32(cond, reg, mask); } - void poke(ImmPtr imm, int index = 0) + Jump branchTestPtr(Condition cond, RegisterID reg, Imm32 mask = Imm32(-1)) { - storePtr(imm, Address(X86::esp, (index * sizeof(void *)))); + return branchTest32(cond, reg, mask); } - // Register move operations: - // - // Move values in registers. - - void move(Imm32 imm, RegisterID dest) + Jump branchTestPtr(Condition cond, Address address, Imm32 mask = Imm32(-1)) { - // Note: on 64-bit the Imm32 value is zero extended into the register, it - // may be useful to have a separate version that sign extends the value? - if (!imm.m_value) - m_assembler.xorl_rr(dest, dest); - else - m_assembler.movl_i32r(imm.m_value, dest); + return branchTest32(cond, address, mask); } - void move(RegisterID src, RegisterID dest) + Jump branchTestPtr(Condition cond, BaseIndex address, Imm32 mask = Imm32(-1)) { - // Note: on 64-bit this is is a full register move; perhaps it would be - // useful to have separate move32 & movePtr, with move32 zero extending? -#if PLATFORM(X86_64) - m_assembler.movq_rr(src, dest); -#else - m_assembler.movl_rr(src, dest); -#endif + return branchTest32(cond, address, mask); } - void move(ImmPtr imm, RegisterID dest) - { -#if PLATFORM(X86_64) - if (CAN_SIGN_EXTEND_U32_64(imm.asIntptr())) - m_assembler.movl_i32r(static_cast(imm.asIntptr()), dest); - else - m_assembler.movq_i64r(imm.asIntptr(), dest); -#else - m_assembler.movl_i32r(imm.asIntptr(), dest); -#endif - } - void swap(RegisterID reg1, RegisterID reg2) + Jump branchAddPtr(Condition cond, RegisterID src, RegisterID dest) { -#if PLATFORM(X86_64) - m_assembler.xchgq_rr(reg1, reg2); -#else - m_assembler.xchgl_rr(reg1, reg2); -#endif + return branchAdd32(cond, src, dest); } - void signExtend32ToPtr(RegisterID src, RegisterID dest) + Jump branchSubPtr(Condition cond, Imm32 imm, RegisterID dest) { -#if PLATFORM(X86_64) - m_assembler.movsxd_rr(src, dest); -#else - if (src != dest) - move(src, dest); -#endif + return branchSub32(cond, imm, dest); } - - void zeroExtend32ToPtr(RegisterID src, RegisterID dest) - { -#if PLATFORM(X86_64) - m_assembler.movl_rr(src, dest); -#else - if (src != dest) - move(src, dest); #endif - } - - - // Forwards / external control flow operations: - // - // This set of jump and conditional branch operations return a Jump - // object which may linked at a later point, allow forwards jump, - // or jumps that will require external linkage (after the code has been - // relocated). - // - // For branches, signed <, >, <= and >= are denoted as l, g, le, and ge - // respecitvely, for unsigned comparisons the names b, a, be, and ae are - // used (representing the names 'below' and 'above'). - // - // Operands to the comparision are provided in the expected order, e.g. - // jle32(reg1, Imm32(5)) will branch if the value held in reg1, when - // treated as a signed 32bit value, is less than or equal to 5. - // - // jz and jnz test whether the first operand is equal to zero, and take - // an optional second operand of a mask under which to perform the test. - -private: - void compareImm32ForBranch(RegisterID left, int32_t right) - { - m_assembler.cmpl_ir(right, left); - } - - void compareImm32ForBranchEquality(RegisterID reg, int32_t imm) - { - if (!imm) - m_assembler.testl_rr(reg, reg); - else - m_assembler.cmpl_ir(imm, reg); - } - - void compareImm32ForBranchEquality(Address address, int32_t imm) - { - m_assembler.cmpl_im(imm, address.offset, address.base); - } - - void testImm32(RegisterID reg, Imm32 mask) - { - // if we are only interested in the low seven bits, this can be tested with a testb - if (mask.m_value == -1) - m_assembler.testl_rr(reg, reg); - else if ((mask.m_value & ~0x7f) == 0) - m_assembler.testb_i8r(mask.m_value, reg); - else - m_assembler.testl_i32r(mask.m_value, reg); - } - - void testImm32(Address address, Imm32 mask) - { - if (mask.m_value == -1) - m_assembler.cmpl_im(0, address.offset, address.base); - else - m_assembler.testl_i32m(mask.m_value, address.offset, address.base); - } - void testImm32(BaseIndex address, Imm32 mask) - { - if (mask.m_value == -1) - m_assembler.cmpl_im(0, address.offset, address.base, address.index, address.scale); - else - m_assembler.testl_i32m(mask.m_value, address.offset, address.base, address.index, address.scale); - } - -#if PLATFORM(X86_64) - void compareImm64ForBranch(RegisterID left, int32_t right) - { - m_assembler.cmpq_ir(right, left); - } - - void compareImm64ForBranchEquality(RegisterID reg, int32_t imm) - { - if (!imm) - m_assembler.testq_rr(reg, reg); - else - m_assembler.cmpq_ir(imm, reg); - } - - void testImm64(RegisterID reg, Imm32 mask) - { - // if we are only interested in the low seven bits, this can be tested with a testb - if (mask.m_value == -1) - m_assembler.testq_rr(reg, reg); - else if ((mask.m_value & ~0x7f) == 0) - m_assembler.testb_i8r(mask.m_value, reg); - else - m_assembler.testq_i32r(mask.m_value, reg); - } - - void testImm64(Address address, Imm32 mask) - { - if (mask.m_value == -1) - m_assembler.cmpq_im(0, address.offset, address.base); - else - m_assembler.testq_i32m(mask.m_value, address.offset, address.base); - } - - void testImm64(BaseIndex address, Imm32 mask) - { - if (mask.m_value == -1) - m_assembler.cmpq_im(0, address.offset, address.base, address.index, address.scale); - else - m_assembler.testq_i32m(mask.m_value, address.offset, address.base, address.index, address.scale); - } -#endif - -public: - Jump ja32(RegisterID left, Imm32 right) - { - compareImm32ForBranch(left, right.m_value); - return Jump(m_assembler.ja()); - } - - Jump jaePtr(RegisterID left, RegisterID right) - { -#if PLATFORM(X86_64) - m_assembler.cmpq_rr(right, left); - return Jump(m_assembler.jae()); -#else - return jae32(left, right); -#endif - } - - Jump jaePtr(RegisterID reg, ImmPtr ptr) - { -#if PLATFORM(X86_64) - intptr_t imm = ptr.asIntptr(); - if (CAN_SIGN_EXTEND_32_64(imm)) { - compareImm64ForBranch(reg, imm); - return Jump(m_assembler.jae()); - } else { - move(ptr, scratchRegister); - return jaePtr(reg, scratchRegister); - } -#else - return jae32(reg, Imm32(ptr)); -#endif - } - - Jump jae32(RegisterID left, RegisterID right) - { - m_assembler.cmpl_rr(right, left); - return Jump(m_assembler.jae()); - } - - Jump jae32(RegisterID left, Imm32 right) - { - compareImm32ForBranch(left, right.m_value); - return Jump(m_assembler.jae()); - } - - Jump jae32(RegisterID left, Address right) - { - m_assembler.cmpl_mr(right.offset, right.base, left); - return Jump(m_assembler.jae()); - } - - Jump jae32(Address left, RegisterID right) - { - m_assembler.cmpl_rm(right, left.offset, left.base); - return Jump(m_assembler.jae()); - } - - Jump jbPtr(RegisterID left, RegisterID right) - { -#if PLATFORM(X86_64) - m_assembler.cmpq_rr(right, left); - return Jump(m_assembler.jb()); -#else - return jb32(left, right); -#endif - } - - Jump jbPtr(RegisterID reg, ImmPtr ptr) - { -#if PLATFORM(X86_64) - intptr_t imm = ptr.asIntptr(); - if (CAN_SIGN_EXTEND_32_64(imm)) { - compareImm64ForBranch(reg, imm); - return Jump(m_assembler.jb()); - } else { - move(ptr, scratchRegister); - return jbPtr(reg, scratchRegister); - } -#else - return jb32(reg, Imm32(ptr)); -#endif - } - - Jump jb32(RegisterID left, RegisterID right) - { - m_assembler.cmpl_rr(right, left); - return Jump(m_assembler.jb()); - } - - Jump jb32(RegisterID left, Imm32 right) - { - compareImm32ForBranch(left, right.m_value); - return Jump(m_assembler.jb()); - } - - Jump jb32(RegisterID left, Address right) - { - m_assembler.cmpl_mr(right.offset, right.base, left); - return Jump(m_assembler.jb()); - } - - Jump jePtr(RegisterID op1, RegisterID op2) - { -#if PLATFORM(X86_64) - m_assembler.cmpq_rr(op1, op2); - return Jump(m_assembler.je()); -#else - return je32(op1, op2); -#endif - } - - Jump jePtr(RegisterID reg, Address address) - { -#if PLATFORM(X86_64) - m_assembler.cmpq_rm(reg, address.offset, address.base); -#else - m_assembler.cmpl_rm(reg, address.offset, address.base); -#endif - return Jump(m_assembler.je()); - } - - Jump jePtr(RegisterID reg, ImmPtr ptr) - { -#if PLATFORM(X86_64) - intptr_t imm = ptr.asIntptr(); - if (CAN_SIGN_EXTEND_32_64(imm)) { - compareImm64ForBranchEquality(reg, imm); - return Jump(m_assembler.je()); - } else { - move(ptr, scratchRegister); - return jePtr(scratchRegister, reg); - } -#else - return je32(reg, Imm32(ptr)); -#endif - } - - Jump jePtr(Address address, ImmPtr imm) - { -#if PLATFORM(X86_64) - move(imm, scratchRegister); - return jePtr(scratchRegister, address); -#else - return je32(address, Imm32(imm)); -#endif - } - - Jump je32(RegisterID op1, RegisterID op2) - { - m_assembler.cmpl_rr(op1, op2); - return Jump(m_assembler.je()); - } - - Jump je32(Address op1, RegisterID op2) - { - m_assembler.cmpl_mr(op1.offset, op1.base, op2); - return Jump(m_assembler.je()); - } - - Jump je32(RegisterID reg, Imm32 imm) - { - compareImm32ForBranchEquality(reg, imm.m_value); - return Jump(m_assembler.je()); - } - - Jump je32(Address address, Imm32 imm) - { - compareImm32ForBranchEquality(address, imm.m_value); - return Jump(m_assembler.je()); - } - - Jump je16(RegisterID op1, BaseIndex op2) - { - m_assembler.cmpw_rm(op1, op2.offset, op2.base, op2.index, op2.scale); - return Jump(m_assembler.je()); - } - - Jump jg32(RegisterID left, RegisterID right) - { - m_assembler.cmpl_rr(right, left); - return Jump(m_assembler.jg()); - } - - Jump jg32(RegisterID reg, Address address) - { - m_assembler.cmpl_mr(address.offset, address.base, reg); - return Jump(m_assembler.jg()); - } - - Jump jgePtr(RegisterID left, RegisterID right) - { -#if PLATFORM(X86_64) - m_assembler.cmpq_rr(right, left); - return Jump(m_assembler.jge()); -#else - return jge32(left, right); -#endif - } - - Jump jgePtr(RegisterID reg, ImmPtr ptr) - { -#if PLATFORM(X86_64) - intptr_t imm = ptr.asIntptr(); - if (CAN_SIGN_EXTEND_32_64(imm)) { - compareImm64ForBranch(reg, imm); - return Jump(m_assembler.jge()); - } else { - move(ptr, scratchRegister); - return jgePtr(reg, scratchRegister); - } -#else - return jge32(reg, Imm32(ptr)); -#endif - } - - Jump jge32(RegisterID left, RegisterID right) - { - m_assembler.cmpl_rr(right, left); - return Jump(m_assembler.jge()); - } - - Jump jge32(RegisterID left, Imm32 right) - { - compareImm32ForBranch(left, right.m_value); - return Jump(m_assembler.jge()); - } - - Jump jlPtr(RegisterID left, RegisterID right) - { -#if PLATFORM(X86_64) - m_assembler.cmpq_rr(right, left); - return Jump(m_assembler.jl()); -#else - return jl32(left, right); -#endif - } - - Jump jlPtr(RegisterID reg, ImmPtr ptr) - { -#if PLATFORM(X86_64) - intptr_t imm = ptr.asIntptr(); - if (CAN_SIGN_EXTEND_32_64(imm)) { - compareImm64ForBranch(reg, imm); - return Jump(m_assembler.jl()); - } else { - move(ptr, scratchRegister); - return jlPtr(reg, scratchRegister); - } -#else - return jl32(reg, Imm32(ptr)); -#endif - } - - Jump jl32(RegisterID left, RegisterID right) - { - m_assembler.cmpl_rr(right, left); - return Jump(m_assembler.jl()); - } - - Jump jl32(RegisterID left, Imm32 right) - { - compareImm32ForBranch(left, right.m_value); - return Jump(m_assembler.jl()); - } - - Jump jlePtr(RegisterID left, RegisterID right) - { -#if PLATFORM(X86_64) - m_assembler.cmpq_rr(right, left); - return Jump(m_assembler.jle()); -#else - return jle32(left, right); -#endif - } - - Jump jlePtr(RegisterID reg, ImmPtr ptr) - { -#if PLATFORM(X86_64) - intptr_t imm = ptr.asIntptr(); - if (CAN_SIGN_EXTEND_32_64(imm)) { - compareImm64ForBranch(reg, imm); - return Jump(m_assembler.jle()); - } else { - move(ptr, scratchRegister); - return jlePtr(reg, scratchRegister); - } -#else - return jle32(reg, Imm32(ptr)); -#endif - } - - Jump jle32(RegisterID left, RegisterID right) - { - m_assembler.cmpl_rr(right, left); - return Jump(m_assembler.jle()); - } - - Jump jle32(RegisterID left, Imm32 right) - { - compareImm32ForBranch(left, right.m_value); - return Jump(m_assembler.jle()); - } - - Jump jnePtr(RegisterID op1, RegisterID op2) - { -#if PLATFORM(X86_64) - m_assembler.cmpq_rr(op1, op2); - return Jump(m_assembler.jne()); -#else - return jne32(op1, op2); -#endif - } - - Jump jnePtr(RegisterID reg, Address address) - { -#if PLATFORM(X86_64) - m_assembler.cmpq_rm(reg, address.offset, address.base); -#else - m_assembler.cmpl_rm(reg, address.offset, address.base); -#endif - return Jump(m_assembler.jne()); - } - - Jump jnePtr(RegisterID reg, AbsoluteAddress address) - { -#if PLATFORM(X86_64) - move(ImmPtr(address.m_ptr), scratchRegister); - return jnePtr(reg, Address(scratchRegister)); -#else - m_assembler.cmpl_rm(reg, address.m_ptr); - return Jump(m_assembler.jne()); -#endif - } - - Jump jnePtr(RegisterID reg, ImmPtr ptr) - { -#if PLATFORM(X86_64) - intptr_t imm = ptr.asIntptr(); - if (CAN_SIGN_EXTEND_32_64(imm)) { - compareImm64ForBranchEquality(reg, imm); - return Jump(m_assembler.jne()); - } else { - move(ptr, scratchRegister); - return jnePtr(scratchRegister, reg); - } -#else - return jne32(reg, Imm32(ptr)); -#endif - } - - Jump jnePtr(Address address, ImmPtr imm) - { -#if PLATFORM(X86_64) - move(imm, scratchRegister); - return jnePtr(scratchRegister, address); -#else - return jne32(address, Imm32(imm)); -#endif - } - -#if !PLATFORM(X86_64) - Jump jnePtr(AbsoluteAddress address, ImmPtr imm) - { - m_assembler.cmpl_im(imm.asIntptr(), address.m_ptr); - return Jump(m_assembler.jne()); - } -#endif - - Jump jnePtrWithPatch(RegisterID reg, DataLabelPtr& dataLabel, ImmPtr initialValue = ImmPtr(0)) - { -#if PLATFORM(X86_64) - m_assembler.movq_i64r(initialValue.asIntptr(), scratchRegister); - dataLabel = DataLabelPtr(this); - return jnePtr(scratchRegister, reg); -#else - m_assembler.cmpl_ir_force32(initialValue.asIntptr(), reg); - dataLabel = DataLabelPtr(this); - return Jump(m_assembler.jne()); -#endif - } - - Jump jnePtrWithPatch(Address address, DataLabelPtr& dataLabel, ImmPtr initialValue = ImmPtr(0)) - { -#if PLATFORM(X86_64) - m_assembler.movq_i64r(initialValue.asIntptr(), scratchRegister); - dataLabel = DataLabelPtr(this); - return jnePtr(scratchRegister, address); -#else - m_assembler.cmpl_im_force32(initialValue.asIntptr(), address.offset, address.base); - dataLabel = DataLabelPtr(this); - return Jump(m_assembler.jne()); -#endif - } - - Jump jne32(RegisterID op1, RegisterID op2) - { - m_assembler.cmpl_rr(op1, op2); - return Jump(m_assembler.jne()); - } - - Jump jne32(RegisterID reg, Imm32 imm) - { - compareImm32ForBranchEquality(reg, imm.m_value); - return Jump(m_assembler.jne()); - } - - Jump jne32(Address address, Imm32 imm) - { - compareImm32ForBranchEquality(address, imm.m_value); - return Jump(m_assembler.jne()); - } - - Jump jne32(Address address, RegisterID reg) - { - m_assembler.cmpl_rm(reg, address.offset, address.base); - return Jump(m_assembler.jne()); - } - - Jump jnzPtr(RegisterID reg, RegisterID mask) - { -#if PLATFORM(X86_64) - m_assembler.testq_rr(reg, mask); - return Jump(m_assembler.jne()); -#else - return jnz32(reg, mask); -#endif - } - - Jump jnzPtr(RegisterID reg, Imm32 mask = Imm32(-1)) - { -#if PLATFORM(X86_64) - testImm64(reg, mask); - return Jump(m_assembler.jne()); -#else - return jnz32(reg, mask); -#endif - } - - Jump jnzPtr(RegisterID reg, ImmPtr mask) - { -#if PLATFORM(X86_64) - move(mask, scratchRegister); - m_assembler.testq_rr(scratchRegister, reg); - return Jump(m_assembler.jne()); -#else - return jnz32(reg, Imm32(mask)); -#endif - } - - Jump jnzPtr(Address address, Imm32 mask = Imm32(-1)) - { -#if PLATFORM(X86_64) - testImm64(address, mask); - return Jump(m_assembler.jne()); -#else - return jnz32(address, mask); -#endif - } - - Jump jnz32(RegisterID reg, RegisterID mask) - { - m_assembler.testl_rr(reg, mask); - return Jump(m_assembler.jne()); - } - - Jump jnz32(RegisterID reg, Imm32 mask = Imm32(-1)) - { - testImm32(reg, mask); - return Jump(m_assembler.jne()); - } - - Jump jnz32(Address address, Imm32 mask = Imm32(-1)) - { - testImm32(address, mask); - return Jump(m_assembler.jne()); - } - - Jump jzPtr(RegisterID reg, RegisterID mask) - { -#if PLATFORM(X86_64) - m_assembler.testq_rr(reg, mask); - return Jump(m_assembler.je()); -#else - return jz32(reg, mask); -#endif - } - - Jump jzPtr(RegisterID reg, Imm32 mask = Imm32(-1)) - { -#if PLATFORM(X86_64) - testImm64(reg, mask); - return Jump(m_assembler.je()); -#else - return jz32(reg, mask); -#endif - } - - Jump jzPtr(RegisterID reg, ImmPtr mask) - { -#if PLATFORM(X86_64) - move(mask, scratchRegister); - m_assembler.testq_rr(scratchRegister, reg); - return Jump(m_assembler.je()); -#else - return jz32(reg, Imm32(mask)); -#endif - } - - Jump jzPtr(Address address, Imm32 mask = Imm32(-1)) - { -#if PLATFORM(X86_64) - testImm64(address, mask); - return Jump(m_assembler.je()); -#else - return jz32(address, mask); -#endif - } - - Jump jzPtr(BaseIndex address, Imm32 mask = Imm32(-1)) - { -#if PLATFORM(X86_64) - testImm64(address, mask); - return Jump(m_assembler.je()); -#else - return jz32(address, mask); -#endif - } - - Jump jz32(RegisterID reg, RegisterID mask) - { - m_assembler.testl_rr(reg, mask); - return Jump(m_assembler.je()); - } - - Jump jz32(RegisterID reg, Imm32 mask = Imm32(-1)) - { - testImm32(reg, mask); - return Jump(m_assembler.je()); - } - - Jump jz32(Address address, Imm32 mask = Imm32(-1)) - { - testImm32(address, mask); - return Jump(m_assembler.je()); - } - - Jump jz32(BaseIndex address, Imm32 mask = Imm32(-1)) - { - testImm32(address, mask); - return Jump(m_assembler.je()); - } - - Jump jump() - { - return Jump(m_assembler.jmp()); - } - - - // Backwards, local control flow operations: - // - // These operations provide a shorter notation for local - // backwards branches, which may be both more convenient - // for the user, and for the programmer, and for the - // assembler (allowing shorter values to be used in - // relative offsets). - // - // The code sequence: - // - // Label topOfLoop(this); - // // ... - // jne32(reg1, reg2, topOfLoop); - // - // Is equivalent to the longer, potentially less efficient form: - // - // Label topOfLoop(this); - // // ... - // jne32(reg1, reg2).linkTo(topOfLoop); - - void jae32(RegisterID left, Address right, Label target) - { - jae32(left, right).linkTo(target, this); - } - - void je32(RegisterID op1, Imm32 imm, Label target) - { - je32(op1, imm).linkTo(target, this); - } - - void je16(RegisterID op1, BaseIndex op2, Label target) - { - je16(op1, op2).linkTo(target, this); - } - - void jl32(RegisterID left, Imm32 right, Label target) - { - jl32(left, right).linkTo(target, this); - } - - void jle32(RegisterID left, RegisterID right, Label target) - { - jle32(left, right).linkTo(target, this); - } - - void jnePtr(RegisterID op1, ImmPtr imm, Label target) - { - jnePtr(op1, imm).linkTo(target, this); - } - - void jne32(RegisterID op1, RegisterID op2, Label target) - { - jne32(op1, op2).linkTo(target, this); - } - - void jne32(RegisterID op1, Imm32 imm, Label target) - { - jne32(op1, imm).linkTo(target, this); - } - - void jzPtr(RegisterID reg, Label target) - { - jzPtr(reg).linkTo(target, this); - } - - void jump(Label target) - { - m_assembler.link(m_assembler.jmp(), target.m_label); - } - - void jump(RegisterID target) - { - m_assembler.jmp_r(target); - } - - // Address is a memory location containing the address to jump to - void jump(Address address) - { - m_assembler.jmp_m(address.offset, address.base); - } - - - // Arithmetic control flow operations: - // - // This set of conditional branch operations branch based - // on the result of an arithmetic operation. The operation - // is performed as normal, storing the result. - // - // * jz operations branch if the result is zero. - // * jo operations branch if the (signed) arithmetic - // operation caused an overflow to occur. - - Jump jnzSubPtr(Imm32 imm, RegisterID dest) - { - subPtr(imm, dest); - return Jump(m_assembler.jne()); - } - - Jump jnzSub32(Imm32 imm, RegisterID dest) - { - sub32(imm, dest); - return Jump(m_assembler.jne()); - } - - Jump joAddPtr(RegisterID src, RegisterID dest) - { - addPtr(src, dest); - return Jump(m_assembler.jo()); - } - - Jump joAdd32(RegisterID src, RegisterID dest) - { - add32(src, dest); - return Jump(m_assembler.jo()); - } - - Jump joAdd32(Imm32 imm, RegisterID dest) - { - add32(imm, dest); - return Jump(m_assembler.jo()); - } - - Jump joMul32(RegisterID src, RegisterID dest) - { - mul32(src, dest); - return Jump(m_assembler.jo()); - } - - Jump joMul32(Imm32 imm, RegisterID src, RegisterID dest) - { - mul32(imm, src, dest); - return Jump(m_assembler.jo()); - } - - Jump joSub32(RegisterID src, RegisterID dest) - { - sub32(src, dest); - return Jump(m_assembler.jo()); - } - - Jump joSub32(Imm32 imm, RegisterID dest) - { - sub32(imm, dest); - return Jump(m_assembler.jo()); - } - - Jump jzSubPtr(Imm32 imm, RegisterID dest) - { - subPtr(imm, dest); - return Jump(m_assembler.je()); - } - - Jump jzSub32(Imm32 imm, RegisterID dest) - { - sub32(imm, dest); - return Jump(m_assembler.je()); - } - - - // Miscellaneous operations: - - void breakpoint() - { - m_assembler.int3(); - } - - Jump call() - { - return Jump(m_assembler.call()); - } - - // FIXME: why does this return a Jump object? - it can't be linked. - // This may be to get a reference to the return address of the call. - // - // This should probably be handled by a separate label type to a regular - // jump. Todo: add a CallLabel type, for the regular call - can be linked - // like a jump (possibly a subclass of jump?, or possibly casts to a Jump). - // Also add a CallReturnLabel type for this to return (just a more JmpDsty - // form of label, can get the void* after the code has been linked, but can't - // try to link it like a Jump object), and let the CallLabel be cast into a - // CallReturnLabel. - Jump call(RegisterID target) - { - return Jump(m_assembler.call(target)); - } - - Label label() - { - return Label(this); - } - - Label align() - { - m_assembler.align(16); - return Label(this); - } - - ptrdiff_t differenceBetween(Label from, Jump to) - { - return X86Assembler::getDifferenceBetweenLabels(from.m_label, to.m_jmp); - } - - ptrdiff_t differenceBetween(Label from, Label to) - { - return X86Assembler::getDifferenceBetweenLabels(from.m_label, to.m_label); - } - - ptrdiff_t differenceBetween(Label from, DataLabelPtr to) - { - return X86Assembler::getDifferenceBetweenLabels(from.m_label, to.m_label); - } - - ptrdiff_t differenceBetween(Label from, DataLabel32 to) - { - return X86Assembler::getDifferenceBetweenLabels(from.m_label, to.m_label); - } - - ptrdiff_t differenceBetween(DataLabelPtr from, Jump to) - { - return X86Assembler::getDifferenceBetweenLabels(from.m_label, to.m_jmp); - } - - void ret() - { - m_assembler.ret(); - } - - void sete32(RegisterID src, RegisterID srcDest) - { - m_assembler.cmpl_rr(srcDest, src); - m_assembler.sete_r(srcDest); - m_assembler.movzbl_rr(srcDest, srcDest); - } - - void sete32(Imm32 imm, RegisterID srcDest) - { - compareImm32ForBranchEquality(srcDest, imm.m_value); - m_assembler.sete_r(srcDest); - m_assembler.movzbl_rr(srcDest, srcDest); - } - - void setne32(RegisterID src, RegisterID srcDest) - { - m_assembler.cmpl_rr(srcDest, src); - m_assembler.setne_r(srcDest); - m_assembler.movzbl_rr(srcDest, srcDest); - } - - void setne32(Imm32 imm, RegisterID srcDest) - { - compareImm32ForBranchEquality(srcDest, imm.m_value); - m_assembler.setne_r(srcDest); - m_assembler.movzbl_rr(srcDest, srcDest); - } - - // FIXME: - // The mask should be optional... paerhaps the argument order should be - // dest-src, operations always have a dest? ... possibly not true, considering - // asm ops like test, or pseudo ops like pop(). - void setnz32(Address address, Imm32 mask, RegisterID dest) - { - testImm32(address, mask); - m_assembler.setnz_r(dest); - m_assembler.movzbl_rr(dest, dest); - } - - void setz32(Address address, Imm32 mask, RegisterID dest) - { - testImm32(address, mask); - m_assembler.setz_r(dest); - m_assembler.movzbl_rr(dest, dest); - } }; } // namespace JSC diff --git a/assembler/MacroAssemblerARMv7.h b/assembler/MacroAssemblerARMv7.h new file mode 100644 index 0000000..f7a8402 --- /dev/null +++ b/assembler/MacroAssemblerARMv7.h @@ -0,0 +1,1082 @@ +/* + * Copyright (C) 2009 Apple Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef MacroAssemblerARMv7_h +#define MacroAssemblerARMv7_h + +#include + +#if ENABLE(ASSEMBLER) + +#include "ARMv7Assembler.h" +#include "AbstractMacroAssembler.h" + +namespace JSC { + +class MacroAssemblerARMv7 : public AbstractMacroAssembler { + // FIXME: switch dataTempRegister & addressTempRegister, or possibly use r7? + // - dTR is likely used more than aTR, and we'll get better instruction + // encoding if it's in the low 8 registers. + static const ARM::RegisterID dataTempRegister = ARM::ip; + static const RegisterID addressTempRegister = ARM::r3; + static const FPRegisterID fpTempRegister = ARM::d7; + + struct ArmAddress { + enum AddressType { + HasOffset, + HasIndex, + } type; + RegisterID base; + union { + int32_t offset; + struct { + RegisterID index; + Scale scale; + }; + } u; + + explicit ArmAddress(RegisterID base, int32_t offset = 0) + : type(HasOffset) + , base(base) + { + u.offset = offset; + } + + explicit ArmAddress(RegisterID base, RegisterID index, Scale scale = TimesOne) + : type(HasIndex) + , base(base) + { + u.index = index; + u.scale = scale; + } + }; + +public: + + static const Scale ScalePtr = TimesFour; + + enum Condition { + Equal = ARMv7Assembler::ConditionEQ, + NotEqual = ARMv7Assembler::ConditionNE, + Above = ARMv7Assembler::ConditionHI, + AboveOrEqual = ARMv7Assembler::ConditionHS, + Below = ARMv7Assembler::ConditionLO, + BelowOrEqual = ARMv7Assembler::ConditionLS, + GreaterThan = ARMv7Assembler::ConditionGT, + GreaterThanOrEqual = ARMv7Assembler::ConditionGE, + LessThan = ARMv7Assembler::ConditionLT, + LessThanOrEqual = ARMv7Assembler::ConditionLE, + Overflow = ARMv7Assembler::ConditionVS, + Signed = ARMv7Assembler::ConditionMI, + Zero = ARMv7Assembler::ConditionEQ, + NonZero = ARMv7Assembler::ConditionNE + }; + + enum DoubleCondition { + DoubleEqual = ARMv7Assembler::ConditionEQ, + DoubleGreaterThan = ARMv7Assembler::ConditionGT, + DoubleGreaterThanOrEqual = ARMv7Assembler::ConditionGE, + DoubleLessThan = ARMv7Assembler::ConditionLO, + DoubleLessThanOrEqual = ARMv7Assembler::ConditionLS, + }; + + static const RegisterID stackPointerRegister = ARM::sp; + static const RegisterID linkRegister = ARM::lr; + + // Integer arithmetic operations: + // + // Operations are typically two operand - operation(source, srcDst) + // For many operations the source may be an Imm32, the srcDst operand + // may often be a memory location (explictly described using an Address + // object). + + void add32(RegisterID src, RegisterID dest) + { + m_assembler.add(dest, dest, src); + } + + void add32(Imm32 imm, RegisterID dest) + { + add32(imm, dest, dest); + } + + void add32(Imm32 imm, RegisterID src, RegisterID dest) + { + ARMThumbImmediate armImm = ARMThumbImmediate::makeUInt12OrEncodedImm(imm.m_value); + if (armImm.isValid()) + m_assembler.add(dest, src, armImm); + else { + move(imm, dataTempRegister); + m_assembler.add(dest, src, dataTempRegister); + } + } + + void add32(Imm32 imm, Address address) + { + load32(address, dataTempRegister); + + ARMThumbImmediate armImm = ARMThumbImmediate::makeUInt12OrEncodedImm(imm.m_value); + if (armImm.isValid()) + m_assembler.add(dataTempRegister, dataTempRegister, armImm); + else { + // Hrrrm, since dataTempRegister holds the data loaded, + // use addressTempRegister to hold the immediate. + move(imm, addressTempRegister); + m_assembler.add(dataTempRegister, dataTempRegister, addressTempRegister); + } + + store32(dataTempRegister, address); + } + + void add32(Address src, RegisterID dest) + { + load32(src, dataTempRegister); + add32(dataTempRegister, dest); + } + + void add32(Imm32 imm, AbsoluteAddress address) + { + load32(address.m_ptr, dataTempRegister); + + ARMThumbImmediate armImm = ARMThumbImmediate::makeUInt12OrEncodedImm(imm.m_value); + if (armImm.isValid()) + m_assembler.add(dataTempRegister, dataTempRegister, armImm); + else { + // Hrrrm, since dataTempRegister holds the data loaded, + // use addressTempRegister to hold the immediate. + move(imm, addressTempRegister); + m_assembler.add(dataTempRegister, dataTempRegister, addressTempRegister); + } + + store32(dataTempRegister, address.m_ptr); + } + + void and32(RegisterID src, RegisterID dest) + { + m_assembler.ARM_and(dest, dest, src); + } + + void and32(Imm32 imm, RegisterID dest) + { + ARMThumbImmediate armImm = ARMThumbImmediate::makeEncodedImm(imm.m_value); + if (armImm.isValid()) + m_assembler.ARM_and(dest, dest, armImm); + else { + move(imm, dataTempRegister); + m_assembler.ARM_and(dest, dest, dataTempRegister); + } + } + + void lshift32(Imm32 imm, RegisterID dest) + { + m_assembler.lsl(dest, dest, imm.m_value); + } + + void lshift32(RegisterID shift_amount, RegisterID dest) + { + m_assembler.lsl(dest, dest, shift_amount); + } + + void mul32(RegisterID src, RegisterID dest) + { + m_assembler.smull(dest, dataTempRegister, dest, src); + } + + void mul32(Imm32 imm, RegisterID src, RegisterID dest) + { + move(imm, dataTempRegister); + m_assembler.smull(dest, dataTempRegister, src, dataTempRegister); + } + + void not32(RegisterID srcDest) + { + m_assembler.mvn(srcDest, srcDest); + } + + void or32(RegisterID src, RegisterID dest) + { + m_assembler.orr(dest, dest, src); + } + + void or32(Imm32 imm, RegisterID dest) + { + ARMThumbImmediate armImm = ARMThumbImmediate::makeEncodedImm(imm.m_value); + if (armImm.isValid()) + m_assembler.orr(dest, dest, armImm); + else { + move(imm, dataTempRegister); + m_assembler.orr(dest, dest, dataTempRegister); + } + } + + void rshift32(RegisterID shift_amount, RegisterID dest) + { + m_assembler.asr(dest, dest, shift_amount); + } + + void rshift32(Imm32 imm, RegisterID dest) + { + m_assembler.asr(dest, dest, imm.m_value); + } + + void sub32(RegisterID src, RegisterID dest) + { + m_assembler.sub(dest, dest, src); + } + + void sub32(Imm32 imm, RegisterID dest) + { + ARMThumbImmediate armImm = ARMThumbImmediate::makeUInt12OrEncodedImm(imm.m_value); + if (armImm.isValid()) + m_assembler.sub(dest, dest, armImm); + else { + move(imm, dataTempRegister); + m_assembler.sub(dest, dest, dataTempRegister); + } + } + + void sub32(Imm32 imm, Address address) + { + load32(address, dataTempRegister); + + ARMThumbImmediate armImm = ARMThumbImmediate::makeUInt12OrEncodedImm(imm.m_value); + if (armImm.isValid()) + m_assembler.sub(dataTempRegister, dataTempRegister, armImm); + else { + // Hrrrm, since dataTempRegister holds the data loaded, + // use addressTempRegister to hold the immediate. + move(imm, addressTempRegister); + m_assembler.sub(dataTempRegister, dataTempRegister, addressTempRegister); + } + + store32(dataTempRegister, address); + } + + void sub32(Address src, RegisterID dest) + { + load32(src, dataTempRegister); + sub32(dataTempRegister, dest); + } + + void sub32(Imm32 imm, AbsoluteAddress address) + { + load32(address.m_ptr, dataTempRegister); + + ARMThumbImmediate armImm = ARMThumbImmediate::makeUInt12OrEncodedImm(imm.m_value); + if (armImm.isValid()) + m_assembler.sub(dataTempRegister, dataTempRegister, armImm); + else { + // Hrrrm, since dataTempRegister holds the data loaded, + // use addressTempRegister to hold the immediate. + move(imm, addressTempRegister); + m_assembler.sub(dataTempRegister, dataTempRegister, addressTempRegister); + } + + store32(dataTempRegister, address.m_ptr); + } + + void xor32(RegisterID src, RegisterID dest) + { + m_assembler.eor(dest, dest, src); + } + + void xor32(Imm32 imm, RegisterID dest) + { + ARMThumbImmediate armImm = ARMThumbImmediate::makeEncodedImm(imm.m_value); + if (armImm.isValid()) + m_assembler.eor(dest, dest, armImm); + else { + move(imm, dataTempRegister); + m_assembler.eor(dest, dest, dataTempRegister); + } + } + + + // Memory access operations: + // + // Loads are of the form load(address, destination) and stores of the form + // store(source, address). The source for a store may be an Imm32. Address + // operand objects to loads and store will be implicitly constructed if a + // register is passed. + +private: + void load32(ArmAddress address, RegisterID dest) + { + if (address.type == ArmAddress::HasIndex) + m_assembler.ldr(dest, address.base, address.u.index, address.u.scale); + else if (address.u.offset >= 0) { + ARMThumbImmediate armImm = ARMThumbImmediate::makeUInt12(address.u.offset); + ASSERT(armImm.isValid()); + m_assembler.ldr(dest, address.base, armImm); + } else { + ASSERT(address.u.offset >= -255); + m_assembler.ldr(dest, address.base, address.u.offset, true, false); + } + } + + void load16(ArmAddress address, RegisterID dest) + { + if (address.type == ArmAddress::HasIndex) + m_assembler.ldrh(dest, address.base, address.u.index, address.u.scale); + else if (address.u.offset >= 0) { + ARMThumbImmediate armImm = ARMThumbImmediate::makeUInt12(address.u.offset); + ASSERT(armImm.isValid()); + m_assembler.ldrh(dest, address.base, armImm); + } else { + ASSERT(address.u.offset >= -255); + m_assembler.ldrh(dest, address.base, address.u.offset, true, false); + } + } + + void store32(RegisterID src, ArmAddress address) + { + if (address.type == ArmAddress::HasIndex) + m_assembler.str(src, address.base, address.u.index, address.u.scale); + else if (address.u.offset >= 0) { + ARMThumbImmediate armImm = ARMThumbImmediate::makeUInt12(address.u.offset); + ASSERT(armImm.isValid()); + m_assembler.str(src, address.base, armImm); + } else { + ASSERT(address.u.offset >= -255); + m_assembler.str(src, address.base, address.u.offset, true, false); + } + } + +public: + void load32(ImplicitAddress address, RegisterID dest) + { + load32(setupArmAddress(address), dest); + } + + void load32(BaseIndex address, RegisterID dest) + { + load32(setupArmAddress(address), dest); + } + + void load32(void* address, RegisterID dest) + { + move(ImmPtr(address), addressTempRegister); + m_assembler.ldr(dest, addressTempRegister, ARMThumbImmediate::makeUInt16(0)); + } + + DataLabel32 load32WithAddressOffsetPatch(Address address, RegisterID dest) + { + DataLabel32 label = moveWithPatch(Imm32(address.offset), dataTempRegister); + load32(ArmAddress(address.base, dataTempRegister), dest); + return label; + } + + Label loadPtrWithPatchToLEA(Address address, RegisterID dest) + { + Label label(this); + moveFixedWidthEncoding(Imm32(address.offset), dataTempRegister); + load32(ArmAddress(address.base, dataTempRegister), dest); + return label; + } + + void load16(BaseIndex address, RegisterID dest) + { + m_assembler.ldrh(dest, makeBaseIndexBase(address), address.index, address.scale); + } + + DataLabel32 store32WithAddressOffsetPatch(RegisterID src, Address address) + { + DataLabel32 label = moveWithPatch(Imm32(address.offset), dataTempRegister); + store32(src, ArmAddress(address.base, dataTempRegister)); + return label; + } + + void store32(RegisterID src, ImplicitAddress address) + { + store32(src, setupArmAddress(address)); + } + + void store32(RegisterID src, BaseIndex address) + { + store32(src, setupArmAddress(address)); + } + + void store32(Imm32 imm, ImplicitAddress address) + { + move(imm, dataTempRegister); + store32(dataTempRegister, setupArmAddress(address)); + } + + void store32(RegisterID src, void* address) + { + move(ImmPtr(address), addressTempRegister); + m_assembler.str(src, addressTempRegister, ARMThumbImmediate::makeUInt16(0)); + } + + void store32(Imm32 imm, void* address) + { + move(imm, dataTempRegister); + store32(dataTempRegister, address); + } + + + // Floating-point operations: + + bool supportsFloatingPoint() const { return true; } + // On x86(_64) the MacroAssembler provides an interface to truncate a double to an integer. + // If a value is not representable as an integer, and possibly for some values that are, + // (on x86 INT_MIN, since this is indistinguishable from results for out-of-range/NaN input) + // a branch will be taken. It is not clear whether this interface will be well suited to + // other platforms. On ARMv7 the hardware truncation operation produces multiple possible + // failure values (saturates to INT_MIN & INT_MAX, NaN reulsts in a value of 0). This is a + // temporary solution while we work out what this interface should be. Either we need to + // decide to make this interface work on all platforms, rework the interface to make it more + // generic, or decide that the MacroAssembler cannot practically be used to abstracted these + // operations, and make clients go directly to the m_assembler to plant truncation instructions. + // In short, FIXME:. + bool supportsFloatingPointTruncate() const { return false; } + + void loadDouble(ImplicitAddress address, FPRegisterID dest) + { + RegisterID base = address.base; + int32_t offset = address.offset; + + // Arm vfp addresses can be offset by a 9-bit ones-comp immediate, left shifted by 2. + if ((offset & 3) || (offset > (255 * 4)) || (offset < -(255 * 4))) { + add32(Imm32(offset), base, addressTempRegister); + base = addressTempRegister; + offset = 0; + } + + m_assembler.vldr(dest, base, offset); + } + + void storeDouble(FPRegisterID src, ImplicitAddress address) + { + RegisterID base = address.base; + int32_t offset = address.offset; + + // Arm vfp addresses can be offset by a 9-bit ones-comp immediate, left shifted by 2. + if ((offset & 3) || (offset > (255 * 4)) || (offset < -(255 * 4))) { + add32(Imm32(offset), base, addressTempRegister); + base = addressTempRegister; + offset = 0; + } + + m_assembler.vstr(src, base, offset); + } + + void addDouble(FPRegisterID src, FPRegisterID dest) + { + m_assembler.vadd_F64(dest, dest, src); + } + + void addDouble(Address src, FPRegisterID dest) + { + loadDouble(src, fpTempRegister); + addDouble(fpTempRegister, dest); + } + + void subDouble(FPRegisterID src, FPRegisterID dest) + { + m_assembler.vsub_F64(dest, dest, src); + } + + void subDouble(Address src, FPRegisterID dest) + { + loadDouble(src, fpTempRegister); + subDouble(fpTempRegister, dest); + } + + void mulDouble(FPRegisterID src, FPRegisterID dest) + { + m_assembler.vmul_F64(dest, dest, src); + } + + void mulDouble(Address src, FPRegisterID dest) + { + loadDouble(src, fpTempRegister); + mulDouble(fpTempRegister, dest); + } + + void convertInt32ToDouble(RegisterID src, FPRegisterID dest) + { + m_assembler.vmov(fpTempRegister, src); + m_assembler.vcvt_F64_S32(dest, fpTempRegister); + } + + Jump branchDouble(DoubleCondition cond, FPRegisterID left, FPRegisterID right) + { + m_assembler.vcmp_F64(left, right); + m_assembler.vmrs_APSR_nzcv_FPSCR(); + return makeBranch(cond); + } + + Jump branchTruncateDoubleToInt32(FPRegisterID, RegisterID) + { + ASSERT_NOT_REACHED(); + } + + + // Stack manipulation operations: + // + // The ABI is assumed to provide a stack abstraction to memory, + // containing machine word sized units of data. Push and pop + // operations add and remove a single register sized unit of data + // to or from the stack. Peek and poke operations read or write + // values on the stack, without moving the current stack position. + + void pop(RegisterID dest) + { + // store postindexed with writeback + m_assembler.ldr(dest, ARM::sp, sizeof(void*), false, true); + } + + void push(RegisterID src) + { + // store preindexed with writeback + m_assembler.str(src, ARM::sp, -sizeof(void*), true, true); + } + + void push(Address address) + { + load32(address, dataTempRegister); + push(dataTempRegister); + } + + void push(Imm32 imm) + { + move(imm, dataTempRegister); + push(dataTempRegister); + } + + // Register move operations: + // + // Move values in registers. + + void move(Imm32 imm, RegisterID dest) + { + uint32_t value = imm.m_value; + + if (imm.m_isPointer) + moveFixedWidthEncoding(imm, dest); + else { + ARMThumbImmediate armImm = ARMThumbImmediate::makeEncodedImm(value); + + if (armImm.isValid()) + m_assembler.mov(dest, armImm); + else if ((armImm = ARMThumbImmediate::makeEncodedImm(~value)).isValid()) + m_assembler.mvn(dest, armImm); + else { + m_assembler.mov(dest, ARMThumbImmediate::makeUInt16(value)); + if (value & 0xffff0000) + m_assembler.movt(dest, ARMThumbImmediate::makeUInt16(value >> 16)); + } + } + } + + void move(RegisterID src, RegisterID dest) + { + m_assembler.mov(dest, src); + } + + void move(ImmPtr imm, RegisterID dest) + { + move(Imm32(imm), dest); + } + + void swap(RegisterID reg1, RegisterID reg2) + { + move(reg1, dataTempRegister); + move(reg2, reg1); + move(dataTempRegister, reg2); + } + + void signExtend32ToPtr(RegisterID src, RegisterID dest) + { + if (src != dest) + move(src, dest); + } + + void zeroExtend32ToPtr(RegisterID src, RegisterID dest) + { + if (src != dest) + move(src, dest); + } + + + // Forwards / external control flow operations: + // + // This set of jump and conditional branch operations return a Jump + // object which may linked at a later point, allow forwards jump, + // or jumps that will require external linkage (after the code has been + // relocated). + // + // For branches, signed <, >, <= and >= are denoted as l, g, le, and ge + // respecitvely, for unsigned comparisons the names b, a, be, and ae are + // used (representing the names 'below' and 'above'). + // + // Operands to the comparision are provided in the expected order, e.g. + // jle32(reg1, Imm32(5)) will branch if the value held in reg1, when + // treated as a signed 32bit value, is less than or equal to 5. + // + // jz and jnz test whether the first operand is equal to zero, and take + // an optional second operand of a mask under which to perform the test. +private: + + // Should we be using TEQ for equal/not-equal? + void compare32(RegisterID left, Imm32 right) + { + int32_t imm = right.m_value; + if (!imm) + m_assembler.tst(left, left); + else { + ARMThumbImmediate armImm = ARMThumbImmediate::makeEncodedImm(imm); + if (armImm.isValid()) + m_assembler.cmp(left, armImm); + if ((armImm = ARMThumbImmediate::makeEncodedImm(-imm)).isValid()) + m_assembler.cmn(left, armImm); + else { + move(Imm32(imm), dataTempRegister); + m_assembler.cmp(left, dataTempRegister); + } + } + } + + void test32(RegisterID reg, Imm32 mask) + { + int32_t imm = mask.m_value; + + if (imm == -1) + m_assembler.tst(reg, reg); + else { + ARMThumbImmediate armImm = ARMThumbImmediate::makeEncodedImm(imm); + if (armImm.isValid()) + m_assembler.tst(reg, armImm); + else { + move(mask, dataTempRegister); + m_assembler.tst(reg, dataTempRegister); + } + } + } + +public: + Jump branch32(Condition cond, RegisterID left, RegisterID right) + { + m_assembler.cmp(left, right); + return Jump(makeBranch(cond)); + } + + Jump branch32(Condition cond, RegisterID left, Imm32 right) + { + compare32(left, right); + return Jump(makeBranch(cond)); + } + + Jump branch32(Condition cond, RegisterID left, Address right) + { + load32(right, dataTempRegister); + return branch32(cond, left, dataTempRegister); + } + + Jump branch32(Condition cond, Address left, RegisterID right) + { + load32(left, dataTempRegister); + return branch32(cond, dataTempRegister, right); + } + + Jump branch32(Condition cond, Address left, Imm32 right) + { + // use addressTempRegister incase the branch32 we call uses dataTempRegister. :-/ + load32(left, addressTempRegister); + return branch32(cond, addressTempRegister, right); + } + + Jump branch32(Condition cond, BaseIndex left, Imm32 right) + { + // use addressTempRegister incase the branch32 we call uses dataTempRegister. :-/ + load32(left, addressTempRegister); + return branch32(cond, addressTempRegister, right); + } + + Jump branch32(Condition cond, AbsoluteAddress left, RegisterID right) + { + load32(left.m_ptr, dataTempRegister); + return branch32(cond, dataTempRegister, right); + } + + Jump branch32(Condition cond, AbsoluteAddress left, Imm32 right) + { + // use addressTempRegister incase the branch32 we call uses dataTempRegister. :-/ + load32(left.m_ptr, addressTempRegister); + return branch32(cond, addressTempRegister, right); + } + + Jump branch16(Condition cond, BaseIndex left, RegisterID right) + { + load16(left, dataTempRegister); + m_assembler.lsl(addressTempRegister, right, 16); + m_assembler.lsl(dataTempRegister, dataTempRegister, 16); + return branch32(cond, dataTempRegister, addressTempRegister); + } + + Jump branch16(Condition cond, BaseIndex left, Imm32 right) + { + // use addressTempRegister incase the branch32 we call uses dataTempRegister. :-/ + load16(left, addressTempRegister); + m_assembler.lsl(addressTempRegister, addressTempRegister, 16); + return branch32(cond, addressTempRegister, Imm32(right.m_value << 16)); + } + + Jump branchTest32(Condition cond, RegisterID reg, RegisterID mask) + { + ASSERT((cond == Zero) || (cond == NonZero)); + m_assembler.tst(reg, mask); + return Jump(makeBranch(cond)); + } + + Jump branchTest32(Condition cond, RegisterID reg, Imm32 mask = Imm32(-1)) + { + ASSERT((cond == Zero) || (cond == NonZero)); + test32(reg, mask); + return Jump(makeBranch(cond)); + } + + Jump branchTest32(Condition cond, Address address, Imm32 mask = Imm32(-1)) + { + ASSERT((cond == Zero) || (cond == NonZero)); + // use addressTempRegister incase the branchTest32 we call uses dataTempRegister. :-/ + load32(address, addressTempRegister); + return branchTest32(cond, addressTempRegister, mask); + } + + Jump branchTest32(Condition cond, BaseIndex address, Imm32 mask = Imm32(-1)) + { + ASSERT((cond == Zero) || (cond == NonZero)); + // use addressTempRegister incase the branchTest32 we call uses dataTempRegister. :-/ + load32(address, addressTempRegister); + return branchTest32(cond, addressTempRegister, mask); + } + + Jump jump() + { + return Jump(makeJump()); + } + + void jump(RegisterID target) + { + m_assembler.bx(target); + } + + // Address is a memory location containing the address to jump to + void jump(Address address) + { + load32(address, dataTempRegister); + m_assembler.bx(dataTempRegister); + } + + + // Arithmetic control flow operations: + // + // This set of conditional branch operations branch based + // on the result of an arithmetic operation. The operation + // is performed as normal, storing the result. + // + // * jz operations branch if the result is zero. + // * jo operations branch if the (signed) arithmetic + // operation caused an overflow to occur. + + Jump branchAdd32(Condition cond, RegisterID src, RegisterID dest) + { + ASSERT((cond == Overflow) || (cond == Signed) || (cond == Zero) || (cond == NonZero)); + m_assembler.add_S(dest, dest, src); + return Jump(makeBranch(cond)); + } + + Jump branchAdd32(Condition cond, Imm32 imm, RegisterID dest) + { + ASSERT((cond == Overflow) || (cond == Signed) || (cond == Zero) || (cond == NonZero)); + ARMThumbImmediate armImm = ARMThumbImmediate::makeEncodedImm(imm.m_value); + if (armImm.isValid()) + m_assembler.add_S(dest, dest, armImm); + else { + move(imm, dataTempRegister); + m_assembler.add_S(dest, dest, dataTempRegister); + } + return Jump(makeBranch(cond)); + } + + Jump branchMul32(Condition cond, RegisterID src, RegisterID dest) + { + ASSERT(cond == Overflow); + m_assembler.smull(dest, dataTempRegister, dest, src); + m_assembler.asr(addressTempRegister, dest, 31); + return branch32(NotEqual, addressTempRegister, dataTempRegister); + } + + Jump branchMul32(Condition cond, Imm32 imm, RegisterID src, RegisterID dest) + { + ASSERT(cond == Overflow); + move(imm, dataTempRegister); + m_assembler.smull(dest, dataTempRegister, src, dataTempRegister); + m_assembler.asr(addressTempRegister, dest, 31); + return branch32(NotEqual, addressTempRegister, dataTempRegister); + } + + Jump branchSub32(Condition cond, RegisterID src, RegisterID dest) + { + ASSERT((cond == Overflow) || (cond == Signed) || (cond == Zero) || (cond == NonZero)); + m_assembler.sub_S(dest, dest, src); + return Jump(makeBranch(cond)); + } + + Jump branchSub32(Condition cond, Imm32 imm, RegisterID dest) + { + ASSERT((cond == Overflow) || (cond == Signed) || (cond == Zero) || (cond == NonZero)); + ARMThumbImmediate armImm = ARMThumbImmediate::makeEncodedImm(imm.m_value); + if (armImm.isValid()) + m_assembler.sub_S(dest, dest, armImm); + else { + move(imm, dataTempRegister); + m_assembler.sub_S(dest, dest, dataTempRegister); + } + return Jump(makeBranch(cond)); + } + + + // Miscellaneous operations: + + void breakpoint() + { + m_assembler.bkpt(); + } + + Call nearCall() + { + moveFixedWidthEncoding(Imm32(0), dataTempRegister); + return Call(m_assembler.blx(dataTempRegister), Call::LinkableNear); + } + + Call call() + { + moveFixedWidthEncoding(Imm32(0), dataTempRegister); + return Call(m_assembler.blx(dataTempRegister), Call::Linkable); + } + + Call call(RegisterID target) + { + return Call(m_assembler.blx(target), Call::None); + } + + Call call(Address address) + { + load32(address, dataTempRegister); + return Call(m_assembler.blx(dataTempRegister), Call::None); + } + + void ret() + { + m_assembler.bx(linkRegister); + } + + void set32(Condition cond, RegisterID left, RegisterID right, RegisterID dest) + { + m_assembler.cmp(left, right); + m_assembler.it(armV7Condition(cond), false); + m_assembler.mov(dest, ARMThumbImmediate::makeUInt16(1)); + m_assembler.mov(dest, ARMThumbImmediate::makeUInt16(0)); + } + + void set32(Condition cond, RegisterID left, Imm32 right, RegisterID dest) + { + compare32(left, right); + m_assembler.it(armV7Condition(cond), false); + m_assembler.mov(dest, ARMThumbImmediate::makeUInt16(1)); + m_assembler.mov(dest, ARMThumbImmediate::makeUInt16(0)); + } + + // FIXME: + // The mask should be optional... paerhaps the argument order should be + // dest-src, operations always have a dest? ... possibly not true, considering + // asm ops like test, or pseudo ops like pop(). + void setTest32(Condition cond, Address address, Imm32 mask, RegisterID dest) + { + load32(address, dataTempRegister); + test32(dataTempRegister, mask); + m_assembler.it(armV7Condition(cond), false); + m_assembler.mov(dest, ARMThumbImmediate::makeUInt16(1)); + m_assembler.mov(dest, ARMThumbImmediate::makeUInt16(0)); + } + + + DataLabel32 moveWithPatch(Imm32 imm, RegisterID dst) + { + moveFixedWidthEncoding(imm, dst); + return DataLabel32(this); + } + + DataLabelPtr moveWithPatch(ImmPtr imm, RegisterID dst) + { + moveFixedWidthEncoding(Imm32(imm), dst); + return DataLabelPtr(this); + } + + Jump branchPtrWithPatch(Condition cond, RegisterID left, DataLabelPtr& dataLabel, ImmPtr initialRightValue = ImmPtr(0)) + { + dataLabel = moveWithPatch(initialRightValue, dataTempRegister); + return branch32(cond, left, dataTempRegister); + } + + Jump branchPtrWithPatch(Condition cond, Address left, DataLabelPtr& dataLabel, ImmPtr initialRightValue = ImmPtr(0)) + { + load32(left, addressTempRegister); + dataLabel = moveWithPatch(initialRightValue, dataTempRegister); + return branch32(cond, addressTempRegister, dataTempRegister); + } + + DataLabelPtr storePtrWithPatch(ImmPtr initialValue, ImplicitAddress address) + { + DataLabelPtr label = moveWithPatch(initialValue, dataTempRegister); + store32(dataTempRegister, address); + return label; + } + DataLabelPtr storePtrWithPatch(ImplicitAddress address) { return storePtrWithPatch(ImmPtr(0), address); } + + + Call tailRecursiveCall() + { + // Like a normal call, but don't link. + moveFixedWidthEncoding(Imm32(0), dataTempRegister); + return Call(m_assembler.bx(dataTempRegister), Call::Linkable); + } + + Call makeTailRecursiveCall(Jump oldJump) + { + oldJump.link(this); + return tailRecursiveCall(); + } + + +protected: + ARMv7Assembler::JmpSrc makeJump() + { + return m_assembler.b(); + } + + ARMv7Assembler::JmpSrc makeBranch(ARMv7Assembler::Condition cond) + { + m_assembler.it(cond); + return m_assembler.b(); + } + ARMv7Assembler::JmpSrc makeBranch(Condition cond) { return makeBranch(armV7Condition(cond)); } + ARMv7Assembler::JmpSrc makeBranch(DoubleCondition cond) { return makeBranch(armV7Condition(cond)); } + + ArmAddress setupArmAddress(BaseIndex address) + { + if (address.offset) { + ARMThumbImmediate imm = ARMThumbImmediate::makeUInt12OrEncodedImm(address.offset); + if (imm.isValid()) + m_assembler.add(addressTempRegister, address.base, imm); + else { + move(Imm32(address.offset), addressTempRegister); + m_assembler.add(addressTempRegister, addressTempRegister, address.base); + } + + return ArmAddress(addressTempRegister, address.index, address.scale); + } else + return ArmAddress(address.base, address.index, address.scale); + } + + ArmAddress setupArmAddress(Address address) + { + if ((address.offset >= -0xff) && (address.offset <= 0xfff)) + return ArmAddress(address.base, address.offset); + + move(Imm32(address.offset), addressTempRegister); + return ArmAddress(address.base, addressTempRegister); + } + + ArmAddress setupArmAddress(ImplicitAddress address) + { + if ((address.offset >= -0xff) && (address.offset <= 0xfff)) + return ArmAddress(address.base, address.offset); + + move(Imm32(address.offset), addressTempRegister); + return ArmAddress(address.base, addressTempRegister); + } + + RegisterID makeBaseIndexBase(BaseIndex address) + { + if (!address.offset) + return address.base; + + ARMThumbImmediate imm = ARMThumbImmediate::makeUInt12OrEncodedImm(address.offset); + if (imm.isValid()) + m_assembler.add(addressTempRegister, address.base, imm); + else { + move(Imm32(address.offset), addressTempRegister); + m_assembler.add(addressTempRegister, addressTempRegister, address.base); + } + + return addressTempRegister; + } + + DataLabel32 moveFixedWidthEncoding(Imm32 imm, RegisterID dst) + { + uint32_t value = imm.m_value; + m_assembler.movT3(dst, ARMThumbImmediate::makeUInt16(value & 0xffff)); + m_assembler.movt(dst, ARMThumbImmediate::makeUInt16(value >> 16)); + } + + ARMv7Assembler::Condition armV7Condition(Condition cond) + { + return static_cast(cond); + } + + ARMv7Assembler::Condition armV7Condition(DoubleCondition cond) + { + return static_cast(cond); + } + +private: + friend class LinkBuffer; + friend class RepatchBuffer; + + static void linkCall(void* code, Call call, FunctionPtr function) + { + ARMv7Assembler::linkCall(code, call.m_jmp, function.value()); + } + + static void repatchCall(CodeLocationCall call, CodeLocationLabel destination) + { + ARMv7Assembler::relinkCall(call.dataLocation(), destination.executableAddress()); + } + + static void repatchCall(CodeLocationCall call, FunctionPtr destination) + { + ARMv7Assembler::relinkCall(call.dataLocation(), destination.executableAddress()); + } +}; + +} // namespace JSC + +#endif // ENABLE(ASSEMBLER) + +#endif // MacroAssemblerARMv7_h diff --git a/assembler/MacroAssemblerCodeRef.h b/assembler/MacroAssemblerCodeRef.h new file mode 100644 index 0000000..341a7ff --- /dev/null +++ b/assembler/MacroAssemblerCodeRef.h @@ -0,0 +1,188 @@ +/* + * Copyright (C) 2009 Apple Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef MacroAssemblerCodeRef_h +#define MacroAssemblerCodeRef_h + +#include + +#include "ExecutableAllocator.h" +#include "PassRefPtr.h" +#include "RefPtr.h" +#include "UnusedParam.h" + +#if ENABLE(ASSEMBLER) + +// ASSERT_VALID_CODE_POINTER checks that ptr is a non-null pointer, and that it is a valid +// instruction address on the platform (for example, check any alignment requirements). +#if PLATFORM_ARM_ARCH(7) +// ARM/thumb instructions must be 16-bit aligned, but all code pointers to be loaded +// into the processor are decorated with the bottom bit set, indicating that this is +// thumb code (as oposed to 32-bit traditional ARM). The first test checks for both +// decorated and undectorated null, and the second test ensures that the pointer is +// decorated. +#define ASSERT_VALID_CODE_POINTER(ptr) \ + ASSERT(reinterpret_cast(ptr) & ~1); \ + ASSERT(reinterpret_cast(ptr) & 1) +#define ASSERT_VALID_CODE_OFFSET(offset) \ + ASSERT(!(offset & 1)) // Must be multiple of 2. +#else +#define ASSERT_VALID_CODE_POINTER(ptr) \ + ASSERT(ptr) +#define ASSERT_VALID_CODE_OFFSET(offset) // Anything goes! +#endif + +namespace JSC { + +// FunctionPtr: +// +// FunctionPtr should be used to wrap pointers to C/C++ functions in JSC +// (particularly, the stub functions). +class FunctionPtr { +public: + FunctionPtr() + : m_value(0) + { + } + + template + explicit FunctionPtr(FunctionType* value) + : m_value(reinterpret_cast(value)) + { + ASSERT_VALID_CODE_POINTER(m_value); + } + + void* value() const { return m_value; } + void* executableAddress() const { return m_value; } + + +private: + void* m_value; +}; + +// ReturnAddressPtr: +// +// ReturnAddressPtr should be used to wrap return addresses generated by processor +// 'call' instructions exectued in JIT code. We use return addresses to look up +// exception and optimization information, and to repatch the call instruction +// that is the source of the return address. +class ReturnAddressPtr { +public: + ReturnAddressPtr() + : m_value(0) + { + } + + explicit ReturnAddressPtr(void* value) + : m_value(value) + { + ASSERT_VALID_CODE_POINTER(m_value); + } + + explicit ReturnAddressPtr(FunctionPtr function) + : m_value(function.value()) + { + ASSERT_VALID_CODE_POINTER(m_value); + } + + void* value() const { return m_value; } + +private: + void* m_value; +}; + +// MacroAssemblerCodePtr: +// +// MacroAssemblerCodePtr should be used to wrap pointers to JIT generated code. +class MacroAssemblerCodePtr { +public: + MacroAssemblerCodePtr() + : m_value(0) + { + } + + explicit MacroAssemblerCodePtr(void* value) +#if PLATFORM_ARM_ARCH(7) + // Decorate the pointer as a thumb code pointer. + : m_value(reinterpret_cast(value) + 1) +#else + : m_value(value) +#endif + { + ASSERT_VALID_CODE_POINTER(m_value); + } + + explicit MacroAssemblerCodePtr(ReturnAddressPtr ra) + : m_value(ra.value()) + { + ASSERT_VALID_CODE_POINTER(m_value); + } + + void* executableAddress() const { return m_value; } +#if PLATFORM_ARM_ARCH(7) + // To use this pointer as a data address remove the decoration. + void* dataLocation() const { ASSERT_VALID_CODE_POINTER(m_value); return reinterpret_cast(m_value) - 1; } +#else + void* dataLocation() const { ASSERT_VALID_CODE_POINTER(m_value); return m_value; } +#endif + + bool operator!() + { + return !m_value; + } + +private: + void* m_value; +}; + +// MacroAssemblerCodeRef: +// +// A reference to a section of JIT generated code. A CodeRef consists of a +// pointer to the code, and a ref pointer to the pool from within which it +// was allocated. +class MacroAssemblerCodeRef { +public: + MacroAssemblerCodeRef() + : m_size(0) + { + } + + MacroAssemblerCodeRef(void* code, PassRefPtr executablePool, size_t size) + : m_code(code) + , m_executablePool(executablePool) + , m_size(size) + { + } + + MacroAssemblerCodePtr m_code; + RefPtr m_executablePool; + size_t m_size; +}; + +} // namespace JSC + +#endif // ENABLE(ASSEMBLER) + +#endif // MacroAssemblerCodeRef_h diff --git a/assembler/MacroAssemblerX86.h b/assembler/MacroAssemblerX86.h new file mode 100644 index 0000000..6e96240 --- /dev/null +++ b/assembler/MacroAssemblerX86.h @@ -0,0 +1,204 @@ +/* + * Copyright (C) 2008 Apple Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef MacroAssemblerX86_h +#define MacroAssemblerX86_h + +#include + +#if ENABLE(ASSEMBLER) && PLATFORM(X86) + +#include "MacroAssemblerX86Common.h" + +namespace JSC { + +class MacroAssemblerX86 : public MacroAssemblerX86Common { +public: + MacroAssemblerX86() + : m_isSSE2Present(isSSE2Present()) + { + } + + static const Scale ScalePtr = TimesFour; + + using MacroAssemblerX86Common::add32; + using MacroAssemblerX86Common::and32; + using MacroAssemblerX86Common::sub32; + using MacroAssemblerX86Common::or32; + using MacroAssemblerX86Common::load32; + using MacroAssemblerX86Common::store32; + using MacroAssemblerX86Common::branch32; + using MacroAssemblerX86Common::call; + using MacroAssemblerX86Common::loadDouble; + using MacroAssemblerX86Common::convertInt32ToDouble; + + void add32(Imm32 imm, RegisterID src, RegisterID dest) + { + m_assembler.leal_mr(imm.m_value, src, dest); + } + + void add32(Imm32 imm, AbsoluteAddress address) + { + m_assembler.addl_im(imm.m_value, address.m_ptr); + } + + void addWithCarry32(Imm32 imm, AbsoluteAddress address) + { + m_assembler.adcl_im(imm.m_value, address.m_ptr); + } + + void and32(Imm32 imm, AbsoluteAddress address) + { + m_assembler.andl_im(imm.m_value, address.m_ptr); + } + + void or32(Imm32 imm, AbsoluteAddress address) + { + m_assembler.orl_im(imm.m_value, address.m_ptr); + } + + void sub32(Imm32 imm, AbsoluteAddress address) + { + m_assembler.subl_im(imm.m_value, address.m_ptr); + } + + void load32(void* address, RegisterID dest) + { + m_assembler.movl_mr(address, dest); + } + + void loadDouble(void* address, FPRegisterID dest) + { + ASSERT(isSSE2Present()); + m_assembler.movsd_mr(address, dest); + } + + void convertInt32ToDouble(AbsoluteAddress src, FPRegisterID dest) + { + m_assembler.cvtsi2sd_mr(src.m_ptr, dest); + } + + void store32(Imm32 imm, void* address) + { + m_assembler.movl_i32m(imm.m_value, address); + } + + void store32(RegisterID src, void* address) + { + m_assembler.movl_rm(src, address); + } + + Jump branch32(Condition cond, AbsoluteAddress left, RegisterID right) + { + m_assembler.cmpl_rm(right, left.m_ptr); + return Jump(m_assembler.jCC(x86Condition(cond))); + } + + Jump branch32(Condition cond, AbsoluteAddress left, Imm32 right) + { + m_assembler.cmpl_im(right.m_value, left.m_ptr); + return Jump(m_assembler.jCC(x86Condition(cond))); + } + + Call call() + { + return Call(m_assembler.call(), Call::Linkable); + } + + Call tailRecursiveCall() + { + return Call::fromTailJump(jump()); + } + + Call makeTailRecursiveCall(Jump oldJump) + { + return Call::fromTailJump(oldJump); + } + + + DataLabelPtr moveWithPatch(ImmPtr initialValue, RegisterID dest) + { + m_assembler.movl_i32r(initialValue.asIntptr(), dest); + return DataLabelPtr(this); + } + + Jump branchPtrWithPatch(Condition cond, RegisterID left, DataLabelPtr& dataLabel, ImmPtr initialRightValue = ImmPtr(0)) + { + m_assembler.cmpl_ir_force32(initialRightValue.asIntptr(), left); + dataLabel = DataLabelPtr(this); + return Jump(m_assembler.jCC(x86Condition(cond))); + } + + Jump branchPtrWithPatch(Condition cond, Address left, DataLabelPtr& dataLabel, ImmPtr initialRightValue = ImmPtr(0)) + { + m_assembler.cmpl_im_force32(initialRightValue.asIntptr(), left.offset, left.base); + dataLabel = DataLabelPtr(this); + return Jump(m_assembler.jCC(x86Condition(cond))); + } + + DataLabelPtr storePtrWithPatch(ImmPtr initialValue, ImplicitAddress address) + { + m_assembler.movl_i32m(initialValue.asIntptr(), address.offset, address.base); + return DataLabelPtr(this); + } + + Label loadPtrWithPatchToLEA(Address address, RegisterID dest) + { + Label label(this); + load32(address, dest); + return label; + } + + bool supportsFloatingPoint() const { return m_isSSE2Present; } + // See comment on MacroAssemblerARMv7::supportsFloatingPointTruncate() + bool supportsFloatingPointTruncate() const { return m_isSSE2Present; } + +private: + const bool m_isSSE2Present; + + friend class LinkBuffer; + friend class RepatchBuffer; + + static void linkCall(void* code, Call call, FunctionPtr function) + { + X86Assembler::linkCall(code, call.m_jmp, function.value()); + } + + static void repatchCall(CodeLocationCall call, CodeLocationLabel destination) + { + X86Assembler::relinkCall(call.dataLocation(), destination.executableAddress()); + } + + static void repatchCall(CodeLocationCall call, FunctionPtr destination) + { + X86Assembler::relinkCall(call.dataLocation(), destination.executableAddress()); + } +}; + +} // namespace JSC + +#endif // ENABLE(ASSEMBLER) + +#endif // MacroAssemblerX86_h diff --git a/assembler/MacroAssemblerX86Common.h b/assembler/MacroAssemblerX86Common.h new file mode 100644 index 0000000..c9e3569 --- /dev/null +++ b/assembler/MacroAssemblerX86Common.h @@ -0,0 +1,964 @@ +/* + * Copyright (C) 2008 Apple Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef MacroAssemblerX86Common_h +#define MacroAssemblerX86Common_h + +#include + +#if ENABLE(ASSEMBLER) + +#include "X86Assembler.h" +#include "AbstractMacroAssembler.h" + +namespace JSC { + +class MacroAssemblerX86Common : public AbstractMacroAssembler { +public: + + enum Condition { + Equal = X86Assembler::ConditionE, + NotEqual = X86Assembler::ConditionNE, + Above = X86Assembler::ConditionA, + AboveOrEqual = X86Assembler::ConditionAE, + Below = X86Assembler::ConditionB, + BelowOrEqual = X86Assembler::ConditionBE, + GreaterThan = X86Assembler::ConditionG, + GreaterThanOrEqual = X86Assembler::ConditionGE, + LessThan = X86Assembler::ConditionL, + LessThanOrEqual = X86Assembler::ConditionLE, + Overflow = X86Assembler::ConditionO, + Signed = X86Assembler::ConditionS, + Zero = X86Assembler::ConditionE, + NonZero = X86Assembler::ConditionNE + }; + + enum DoubleCondition { + DoubleEqual = X86Assembler::ConditionE, + DoubleNotEqual = X86Assembler::ConditionNE, + DoubleGreaterThan = X86Assembler::ConditionA, + DoubleGreaterThanOrEqual = X86Assembler::ConditionAE, + DoubleLessThan = X86Assembler::ConditionB, + DoubleLessThanOrEqual = X86Assembler::ConditionBE, + }; + + static const RegisterID stackPointerRegister = X86::esp; + + // Integer arithmetic operations: + // + // Operations are typically two operand - operation(source, srcDst) + // For many operations the source may be an Imm32, the srcDst operand + // may often be a memory location (explictly described using an Address + // object). + + void add32(RegisterID src, RegisterID dest) + { + m_assembler.addl_rr(src, dest); + } + + void add32(Imm32 imm, Address address) + { + m_assembler.addl_im(imm.m_value, address.offset, address.base); + } + + void add32(Imm32 imm, RegisterID dest) + { + m_assembler.addl_ir(imm.m_value, dest); + } + + void add32(Address src, RegisterID dest) + { + m_assembler.addl_mr(src.offset, src.base, dest); + } + + void add32(RegisterID src, Address dest) + { + m_assembler.addl_rm(src, dest.offset, dest.base); + } + + void and32(RegisterID src, RegisterID dest) + { + m_assembler.andl_rr(src, dest); + } + + void and32(Imm32 imm, RegisterID dest) + { + m_assembler.andl_ir(imm.m_value, dest); + } + + void and32(RegisterID src, Address dest) + { + m_assembler.andl_rm(src, dest.offset, dest.base); + } + + void and32(Address src, RegisterID dest) + { + m_assembler.andl_mr(src.offset, src.base, dest); + } + + void and32(Imm32 imm, Address address) + { + m_assembler.andl_im(imm.m_value, address.offset, address.base); + } + + void lshift32(Imm32 imm, RegisterID dest) + { + m_assembler.shll_i8r(imm.m_value, dest); + } + + void lshift32(RegisterID shift_amount, RegisterID dest) + { + // On x86 we can only shift by ecx; if asked to shift by another register we'll + // need rejig the shift amount into ecx first, and restore the registers afterwards. + if (shift_amount != X86::ecx) { + swap(shift_amount, X86::ecx); + + // E.g. transform "shll %eax, %eax" -> "xchgl %eax, %ecx; shll %ecx, %ecx; xchgl %eax, %ecx" + if (dest == shift_amount) + m_assembler.shll_CLr(X86::ecx); + // E.g. transform "shll %eax, %ecx" -> "xchgl %eax, %ecx; shll %ecx, %eax; xchgl %eax, %ecx" + else if (dest == X86::ecx) + m_assembler.shll_CLr(shift_amount); + // E.g. transform "shll %eax, %ebx" -> "xchgl %eax, %ecx; shll %ecx, %ebx; xchgl %eax, %ecx" + else + m_assembler.shll_CLr(dest); + + swap(shift_amount, X86::ecx); + } else + m_assembler.shll_CLr(dest); + } + + void mul32(RegisterID src, RegisterID dest) + { + m_assembler.imull_rr(src, dest); + } + + void mul32(Address src, RegisterID dest) + { + m_assembler.imull_mr(src.offset, src.base, dest); + } + + void mul32(Imm32 imm, RegisterID src, RegisterID dest) + { + m_assembler.imull_i32r(src, imm.m_value, dest); + } + + void neg32(RegisterID srcDest) + { + m_assembler.negl_r(srcDest); + } + + void neg32(Address srcDest) + { + m_assembler.negl_m(srcDest.offset, srcDest.base); + } + + void not32(RegisterID srcDest) + { + m_assembler.notl_r(srcDest); + } + + void not32(Address srcDest) + { + m_assembler.notl_m(srcDest.offset, srcDest.base); + } + + void or32(RegisterID src, RegisterID dest) + { + m_assembler.orl_rr(src, dest); + } + + void or32(Imm32 imm, RegisterID dest) + { + m_assembler.orl_ir(imm.m_value, dest); + } + + void or32(RegisterID src, Address dest) + { + m_assembler.orl_rm(src, dest.offset, dest.base); + } + + void or32(Address src, RegisterID dest) + { + m_assembler.orl_mr(src.offset, src.base, dest); + } + + void or32(Imm32 imm, Address address) + { + m_assembler.orl_im(imm.m_value, address.offset, address.base); + } + + void rshift32(RegisterID shift_amount, RegisterID dest) + { + // On x86 we can only shift by ecx; if asked to shift by another register we'll + // need rejig the shift amount into ecx first, and restore the registers afterwards. + if (shift_amount != X86::ecx) { + swap(shift_amount, X86::ecx); + + // E.g. transform "shll %eax, %eax" -> "xchgl %eax, %ecx; shll %ecx, %ecx; xchgl %eax, %ecx" + if (dest == shift_amount) + m_assembler.sarl_CLr(X86::ecx); + // E.g. transform "shll %eax, %ecx" -> "xchgl %eax, %ecx; shll %ecx, %eax; xchgl %eax, %ecx" + else if (dest == X86::ecx) + m_assembler.sarl_CLr(shift_amount); + // E.g. transform "shll %eax, %ebx" -> "xchgl %eax, %ecx; shll %ecx, %ebx; xchgl %eax, %ecx" + else + m_assembler.sarl_CLr(dest); + + swap(shift_amount, X86::ecx); + } else + m_assembler.sarl_CLr(dest); + } + + void rshift32(Imm32 imm, RegisterID dest) + { + m_assembler.sarl_i8r(imm.m_value, dest); + } + + void sub32(RegisterID src, RegisterID dest) + { + m_assembler.subl_rr(src, dest); + } + + void sub32(Imm32 imm, RegisterID dest) + { + m_assembler.subl_ir(imm.m_value, dest); + } + + void sub32(Imm32 imm, Address address) + { + m_assembler.subl_im(imm.m_value, address.offset, address.base); + } + + void sub32(Address src, RegisterID dest) + { + m_assembler.subl_mr(src.offset, src.base, dest); + } + + void sub32(RegisterID src, Address dest) + { + m_assembler.subl_rm(src, dest.offset, dest.base); + } + + + void xor32(RegisterID src, RegisterID dest) + { + m_assembler.xorl_rr(src, dest); + } + + void xor32(Imm32 imm, Address dest) + { + m_assembler.xorl_im(imm.m_value, dest.offset, dest.base); + } + + void xor32(Imm32 imm, RegisterID dest) + { + m_assembler.xorl_ir(imm.m_value, dest); + } + + void xor32(RegisterID src, Address dest) + { + m_assembler.xorl_rm(src, dest.offset, dest.base); + } + + void xor32(Address src, RegisterID dest) + { + m_assembler.xorl_mr(src.offset, src.base, dest); + } + + + // Memory access operations: + // + // Loads are of the form load(address, destination) and stores of the form + // store(source, address). The source for a store may be an Imm32. Address + // operand objects to loads and store will be implicitly constructed if a + // register is passed. + + void load32(ImplicitAddress address, RegisterID dest) + { + m_assembler.movl_mr(address.offset, address.base, dest); + } + + void load32(BaseIndex address, RegisterID dest) + { + m_assembler.movl_mr(address.offset, address.base, address.index, address.scale, dest); + } + + DataLabel32 load32WithAddressOffsetPatch(Address address, RegisterID dest) + { + m_assembler.movl_mr_disp32(address.offset, address.base, dest); + return DataLabel32(this); + } + + void load16(BaseIndex address, RegisterID dest) + { + m_assembler.movzwl_mr(address.offset, address.base, address.index, address.scale, dest); + } + + DataLabel32 store32WithAddressOffsetPatch(RegisterID src, Address address) + { + m_assembler.movl_rm_disp32(src, address.offset, address.base); + return DataLabel32(this); + } + + void store32(RegisterID src, ImplicitAddress address) + { + m_assembler.movl_rm(src, address.offset, address.base); + } + + void store32(RegisterID src, BaseIndex address) + { + m_assembler.movl_rm(src, address.offset, address.base, address.index, address.scale); + } + + void store32(Imm32 imm, ImplicitAddress address) + { + m_assembler.movl_i32m(imm.m_value, address.offset, address.base); + } + + + // Floating-point operation: + // + // Presently only supports SSE, not x87 floating point. + + void loadDouble(ImplicitAddress address, FPRegisterID dest) + { + ASSERT(isSSE2Present()); + m_assembler.movsd_mr(address.offset, address.base, dest); + } + + void storeDouble(FPRegisterID src, ImplicitAddress address) + { + ASSERT(isSSE2Present()); + m_assembler.movsd_rm(src, address.offset, address.base); + } + + void addDouble(FPRegisterID src, FPRegisterID dest) + { + ASSERT(isSSE2Present()); + m_assembler.addsd_rr(src, dest); + } + + void addDouble(Address src, FPRegisterID dest) + { + ASSERT(isSSE2Present()); + m_assembler.addsd_mr(src.offset, src.base, dest); + } + + void divDouble(FPRegisterID src, FPRegisterID dest) + { + ASSERT(isSSE2Present()); + m_assembler.divsd_rr(src, dest); + } + + void divDouble(Address src, FPRegisterID dest) + { + ASSERT(isSSE2Present()); + m_assembler.divsd_mr(src.offset, src.base, dest); + } + + void subDouble(FPRegisterID src, FPRegisterID dest) + { + ASSERT(isSSE2Present()); + m_assembler.subsd_rr(src, dest); + } + + void subDouble(Address src, FPRegisterID dest) + { + ASSERT(isSSE2Present()); + m_assembler.subsd_mr(src.offset, src.base, dest); + } + + void mulDouble(FPRegisterID src, FPRegisterID dest) + { + ASSERT(isSSE2Present()); + m_assembler.mulsd_rr(src, dest); + } + + void mulDouble(Address src, FPRegisterID dest) + { + ASSERT(isSSE2Present()); + m_assembler.mulsd_mr(src.offset, src.base, dest); + } + + void convertInt32ToDouble(RegisterID src, FPRegisterID dest) + { + ASSERT(isSSE2Present()); + m_assembler.cvtsi2sd_rr(src, dest); + } + + void convertInt32ToDouble(Address src, FPRegisterID dest) + { + m_assembler.cvtsi2sd_mr(src.offset, src.base, dest); + } + + Jump branchDouble(DoubleCondition cond, FPRegisterID left, FPRegisterID right) + { + ASSERT(isSSE2Present()); + m_assembler.ucomisd_rr(right, left); + return Jump(m_assembler.jCC(x86Condition(cond))); + } + + Jump branchDouble(DoubleCondition cond, FPRegisterID left, Address right) + { + m_assembler.ucomisd_mr(right.offset, right.base, left); + return Jump(m_assembler.jCC(x86Condition(cond))); + } + + // Truncates 'src' to an integer, and places the resulting 'dest'. + // If the result is not representable as a 32 bit value, branch. + // May also branch for some values that are representable in 32 bits + // (specifically, in this case, INT_MIN). + Jump branchTruncateDoubleToInt32(FPRegisterID src, RegisterID dest) + { + ASSERT(isSSE2Present()); + m_assembler.cvttsd2si_rr(src, dest); + return branch32(Equal, dest, Imm32(0x80000000)); + } + + void zeroDouble(FPRegisterID srcDest) + { + ASSERT(isSSE2Present()); + m_assembler.xorpd_rr(srcDest, srcDest); + } + + + // Stack manipulation operations: + // + // The ABI is assumed to provide a stack abstraction to memory, + // containing machine word sized units of data. Push and pop + // operations add and remove a single register sized unit of data + // to or from the stack. Peek and poke operations read or write + // values on the stack, without moving the current stack position. + + void pop(RegisterID dest) + { + m_assembler.pop_r(dest); + } + + void push(RegisterID src) + { + m_assembler.push_r(src); + } + + void push(Address address) + { + m_assembler.push_m(address.offset, address.base); + } + + void push(Imm32 imm) + { + m_assembler.push_i32(imm.m_value); + } + + + // Register move operations: + // + // Move values in registers. + + void move(Imm32 imm, RegisterID dest) + { + // Note: on 64-bit the Imm32 value is zero extended into the register, it + // may be useful to have a separate version that sign extends the value? + if (!imm.m_value) + m_assembler.xorl_rr(dest, dest); + else + m_assembler.movl_i32r(imm.m_value, dest); + } + +#if PLATFORM(X86_64) + void move(RegisterID src, RegisterID dest) + { + // Note: on 64-bit this is is a full register move; perhaps it would be + // useful to have separate move32 & movePtr, with move32 zero extending? + if (src != dest) + m_assembler.movq_rr(src, dest); + } + + void move(ImmPtr imm, RegisterID dest) + { + if (CAN_SIGN_EXTEND_U32_64(imm.asIntptr())) + m_assembler.movl_i32r(static_cast(imm.asIntptr()), dest); + else + m_assembler.movq_i64r(imm.asIntptr(), dest); + } + + void swap(RegisterID reg1, RegisterID reg2) + { + m_assembler.xchgq_rr(reg1, reg2); + } + + void signExtend32ToPtr(RegisterID src, RegisterID dest) + { + m_assembler.movsxd_rr(src, dest); + } + + void zeroExtend32ToPtr(RegisterID src, RegisterID dest) + { + m_assembler.movl_rr(src, dest); + } +#else + void move(RegisterID src, RegisterID dest) + { + if (src != dest) + m_assembler.movl_rr(src, dest); + } + + void move(ImmPtr imm, RegisterID dest) + { + m_assembler.movl_i32r(imm.asIntptr(), dest); + } + + void swap(RegisterID reg1, RegisterID reg2) + { + if (reg1 != reg2) + m_assembler.xchgl_rr(reg1, reg2); + } + + void signExtend32ToPtr(RegisterID src, RegisterID dest) + { + move(src, dest); + } + + void zeroExtend32ToPtr(RegisterID src, RegisterID dest) + { + move(src, dest); + } +#endif + + + // Forwards / external control flow operations: + // + // This set of jump and conditional branch operations return a Jump + // object which may linked at a later point, allow forwards jump, + // or jumps that will require external linkage (after the code has been + // relocated). + // + // For branches, signed <, >, <= and >= are denoted as l, g, le, and ge + // respecitvely, for unsigned comparisons the names b, a, be, and ae are + // used (representing the names 'below' and 'above'). + // + // Operands to the comparision are provided in the expected order, e.g. + // jle32(reg1, Imm32(5)) will branch if the value held in reg1, when + // treated as a signed 32bit value, is less than or equal to 5. + // + // jz and jnz test whether the first operand is equal to zero, and take + // an optional second operand of a mask under which to perform the test. + +public: + Jump branch32(Condition cond, RegisterID left, RegisterID right) + { + m_assembler.cmpl_rr(right, left); + return Jump(m_assembler.jCC(x86Condition(cond))); + } + + Jump branch32(Condition cond, RegisterID left, Imm32 right) + { + if (((cond == Equal) || (cond == NotEqual)) && !right.m_value) + m_assembler.testl_rr(left, left); + else + m_assembler.cmpl_ir(right.m_value, left); + return Jump(m_assembler.jCC(x86Condition(cond))); + } + + Jump branch32(Condition cond, RegisterID left, Address right) + { + m_assembler.cmpl_mr(right.offset, right.base, left); + return Jump(m_assembler.jCC(x86Condition(cond))); + } + + Jump branch32(Condition cond, Address left, RegisterID right) + { + m_assembler.cmpl_rm(right, left.offset, left.base); + return Jump(m_assembler.jCC(x86Condition(cond))); + } + + Jump branch32(Condition cond, Address left, Imm32 right) + { + m_assembler.cmpl_im(right.m_value, left.offset, left.base); + return Jump(m_assembler.jCC(x86Condition(cond))); + } + + Jump branch32(Condition cond, BaseIndex left, Imm32 right) + { + m_assembler.cmpl_im(right.m_value, left.offset, left.base, left.index, left.scale); + return Jump(m_assembler.jCC(x86Condition(cond))); + } + + Jump branch16(Condition cond, BaseIndex left, RegisterID right) + { + m_assembler.cmpw_rm(right, left.offset, left.base, left.index, left.scale); + return Jump(m_assembler.jCC(x86Condition(cond))); + } + + Jump branch16(Condition cond, BaseIndex left, Imm32 right) + { + ASSERT(!(right.m_value & 0xFFFF0000)); + + m_assembler.cmpw_im(right.m_value, left.offset, left.base, left.index, left.scale); + return Jump(m_assembler.jCC(x86Condition(cond))); + } + + Jump branchTest32(Condition cond, RegisterID reg, RegisterID mask) + { + ASSERT((cond == Zero) || (cond == NonZero)); + m_assembler.testl_rr(reg, mask); + return Jump(m_assembler.jCC(x86Condition(cond))); + } + + Jump branchTest32(Condition cond, RegisterID reg, Imm32 mask = Imm32(-1)) + { + ASSERT((cond == Zero) || (cond == NonZero)); + // if we are only interested in the low seven bits, this can be tested with a testb + if (mask.m_value == -1) + m_assembler.testl_rr(reg, reg); + else if ((mask.m_value & ~0x7f) == 0) + m_assembler.testb_i8r(mask.m_value, reg); + else + m_assembler.testl_i32r(mask.m_value, reg); + return Jump(m_assembler.jCC(x86Condition(cond))); + } + + Jump branchTest32(Condition cond, Address address, Imm32 mask = Imm32(-1)) + { + ASSERT((cond == Zero) || (cond == NonZero)); + if (mask.m_value == -1) + m_assembler.cmpl_im(0, address.offset, address.base); + else + m_assembler.testl_i32m(mask.m_value, address.offset, address.base); + return Jump(m_assembler.jCC(x86Condition(cond))); + } + + Jump branchTest32(Condition cond, BaseIndex address, Imm32 mask = Imm32(-1)) + { + ASSERT((cond == Zero) || (cond == NonZero)); + if (mask.m_value == -1) + m_assembler.cmpl_im(0, address.offset, address.base, address.index, address.scale); + else + m_assembler.testl_i32m(mask.m_value, address.offset, address.base, address.index, address.scale); + return Jump(m_assembler.jCC(x86Condition(cond))); + } + + Jump jump() + { + return Jump(m_assembler.jmp()); + } + + void jump(RegisterID target) + { + m_assembler.jmp_r(target); + } + + // Address is a memory location containing the address to jump to + void jump(Address address) + { + m_assembler.jmp_m(address.offset, address.base); + } + + + // Arithmetic control flow operations: + // + // This set of conditional branch operations branch based + // on the result of an arithmetic operation. The operation + // is performed as normal, storing the result. + // + // * jz operations branch if the result is zero. + // * jo operations branch if the (signed) arithmetic + // operation caused an overflow to occur. + + Jump branchAdd32(Condition cond, RegisterID src, RegisterID dest) + { + ASSERT((cond == Overflow) || (cond == Signed) || (cond == Zero) || (cond == NonZero)); + add32(src, dest); + return Jump(m_assembler.jCC(x86Condition(cond))); + } + + Jump branchAdd32(Condition cond, Imm32 imm, RegisterID dest) + { + ASSERT((cond == Overflow) || (cond == Signed) || (cond == Zero) || (cond == NonZero)); + add32(imm, dest); + return Jump(m_assembler.jCC(x86Condition(cond))); + } + + Jump branchAdd32(Condition cond, Imm32 src, Address dest) + { + ASSERT((cond == Overflow) || (cond == Zero) || (cond == NonZero)); + add32(src, dest); + return Jump(m_assembler.jCC(x86Condition(cond))); + } + + Jump branchAdd32(Condition cond, RegisterID src, Address dest) + { + ASSERT((cond == Overflow) || (cond == Zero) || (cond == NonZero)); + add32(src, dest); + return Jump(m_assembler.jCC(x86Condition(cond))); + } + + Jump branchAdd32(Condition cond, Address src, RegisterID dest) + { + ASSERT((cond == Overflow) || (cond == Zero) || (cond == NonZero)); + add32(src, dest); + return Jump(m_assembler.jCC(x86Condition(cond))); + } + + Jump branchMul32(Condition cond, RegisterID src, RegisterID dest) + { + ASSERT(cond == Overflow); + mul32(src, dest); + return Jump(m_assembler.jCC(x86Condition(cond))); + } + + Jump branchMul32(Condition cond, Address src, RegisterID dest) + { + ASSERT((cond == Overflow) || (cond == Zero) || (cond == NonZero)); + mul32(src, dest); + return Jump(m_assembler.jCC(x86Condition(cond))); + } + + Jump branchMul32(Condition cond, Imm32 imm, RegisterID src, RegisterID dest) + { + ASSERT(cond == Overflow); + mul32(imm, src, dest); + return Jump(m_assembler.jCC(x86Condition(cond))); + } + + Jump branchSub32(Condition cond, RegisterID src, RegisterID dest) + { + ASSERT((cond == Overflow) || (cond == Signed) || (cond == Zero) || (cond == NonZero)); + sub32(src, dest); + return Jump(m_assembler.jCC(x86Condition(cond))); + } + + Jump branchSub32(Condition cond, Imm32 imm, RegisterID dest) + { + ASSERT((cond == Overflow) || (cond == Signed) || (cond == Zero) || (cond == NonZero)); + sub32(imm, dest); + return Jump(m_assembler.jCC(x86Condition(cond))); + } + + Jump branchSub32(Condition cond, Imm32 imm, Address dest) + { + ASSERT((cond == Overflow) || (cond == Zero) || (cond == NonZero)); + sub32(imm, dest); + return Jump(m_assembler.jCC(x86Condition(cond))); + } + + Jump branchSub32(Condition cond, RegisterID src, Address dest) + { + ASSERT((cond == Overflow) || (cond == Zero) || (cond == NonZero)); + sub32(src, dest); + return Jump(m_assembler.jCC(x86Condition(cond))); + } + + Jump branchSub32(Condition cond, Address src, RegisterID dest) + { + ASSERT((cond == Overflow) || (cond == Zero) || (cond == NonZero)); + sub32(src, dest); + return Jump(m_assembler.jCC(x86Condition(cond))); + } + + Jump branchOr32(Condition cond, RegisterID src, RegisterID dest) + { + ASSERT((cond == Signed) || (cond == Zero) || (cond == NonZero)); + or32(src, dest); + return Jump(m_assembler.jCC(x86Condition(cond))); + } + + + // Miscellaneous operations: + + void breakpoint() + { + m_assembler.int3(); + } + + Call nearCall() + { + return Call(m_assembler.call(), Call::LinkableNear); + } + + Call call(RegisterID target) + { + return Call(m_assembler.call(target), Call::None); + } + + void call(Address address) + { + m_assembler.call_m(address.offset, address.base); + } + + void ret() + { + m_assembler.ret(); + } + + void set8(Condition cond, RegisterID left, RegisterID right, RegisterID dest) + { + m_assembler.cmpl_rr(right, left); + m_assembler.setCC_r(x86Condition(cond), dest); + } + + void set8(Condition cond, Address left, RegisterID right, RegisterID dest) + { + m_assembler.cmpl_mr(left.offset, left.base, right); + m_assembler.setCC_r(x86Condition(cond), dest); + } + + void set8(Condition cond, RegisterID left, Imm32 right, RegisterID dest) + { + if (((cond == Equal) || (cond == NotEqual)) && !right.m_value) + m_assembler.testl_rr(left, left); + else + m_assembler.cmpl_ir(right.m_value, left); + m_assembler.setCC_r(x86Condition(cond), dest); + } + + void set32(Condition cond, RegisterID left, RegisterID right, RegisterID dest) + { + m_assembler.cmpl_rr(right, left); + m_assembler.setCC_r(x86Condition(cond), dest); + m_assembler.movzbl_rr(dest, dest); + } + + void set32(Condition cond, RegisterID left, Imm32 right, RegisterID dest) + { + if (((cond == Equal) || (cond == NotEqual)) && !right.m_value) + m_assembler.testl_rr(left, left); + else + m_assembler.cmpl_ir(right.m_value, left); + m_assembler.setCC_r(x86Condition(cond), dest); + m_assembler.movzbl_rr(dest, dest); + } + + // FIXME: + // The mask should be optional... paerhaps the argument order should be + // dest-src, operations always have a dest? ... possibly not true, considering + // asm ops like test, or pseudo ops like pop(). + + void setTest8(Condition cond, Address address, Imm32 mask, RegisterID dest) + { + if (mask.m_value == -1) + m_assembler.cmpl_im(0, address.offset, address.base); + else + m_assembler.testl_i32m(mask.m_value, address.offset, address.base); + m_assembler.setCC_r(x86Condition(cond), dest); + } + + void setTest32(Condition cond, Address address, Imm32 mask, RegisterID dest) + { + if (mask.m_value == -1) + m_assembler.cmpl_im(0, address.offset, address.base); + else + m_assembler.testl_i32m(mask.m_value, address.offset, address.base); + m_assembler.setCC_r(x86Condition(cond), dest); + m_assembler.movzbl_rr(dest, dest); + } + +protected: + X86Assembler::Condition x86Condition(Condition cond) + { + return static_cast(cond); + } + + X86Assembler::Condition x86Condition(DoubleCondition cond) + { + return static_cast(cond); + } + +private: + // Only MacroAssemblerX86 should be using the following method; SSE2 is always available on + // x86_64, and clients & subclasses of MacroAssembler should be using 'supportsFloatingPoint()'. + friend class MacroAssemblerX86; + +#if PLATFORM(X86) +#if PLATFORM(MAC) + + // All X86 Macs are guaranteed to support at least SSE2, + static bool isSSE2Present() + { + return true; + } + +#else // PLATFORM(MAC) + + enum SSE2CheckState { + NotCheckedSSE2, + HasSSE2, + NoSSE2 + }; + + static bool isSSE2Present() + { + if (s_sse2CheckState == NotCheckedSSE2) { + // Default the flags value to zero; if the compiler is + // not MSVC or GCC we will read this as SSE2 not present. + int flags = 0; +#if COMPILER(MSVC) + _asm { + mov eax, 1 // cpuid function 1 gives us the standard feature set + cpuid; + mov flags, edx; + } +#elif COMPILER(GCC) + asm ( + "movl $0x1, %%eax;" + "pushl %%ebx;" + "cpuid;" + "popl %%ebx;" + "movl %%edx, %0;" + : "=g" (flags) + : + : "%eax", "%ecx", "%edx" + ); +#endif + static const int SSE2FeatureBit = 1 << 26; + s_sse2CheckState = (flags & SSE2FeatureBit) ? HasSSE2 : NoSSE2; + } + // Only check once. + ASSERT(s_sse2CheckState != NotCheckedSSE2); + + return s_sse2CheckState == HasSSE2; + } + + static SSE2CheckState s_sse2CheckState; + +#endif // PLATFORM(MAC) +#elif !defined(NDEBUG) // PLATFORM(X86) + + // On x86-64 we should never be checking for SSE2 in a non-debug build, + // but non debug add this method to keep the asserts above happy. + static bool isSSE2Present() + { + return true; + } + +#endif +}; + +} // namespace JSC + +#endif // ENABLE(ASSEMBLER) + +#endif // MacroAssemblerX86Common_h diff --git a/assembler/MacroAssemblerX86_64.h b/assembler/MacroAssemblerX86_64.h new file mode 100644 index 0000000..e3d296c --- /dev/null +++ b/assembler/MacroAssemblerX86_64.h @@ -0,0 +1,494 @@ +/* + * Copyright (C) 2008 Apple Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef MacroAssemblerX86_64_h +#define MacroAssemblerX86_64_h + +#include + +#if ENABLE(ASSEMBLER) && PLATFORM(X86_64) + +#include "MacroAssemblerX86Common.h" + +#define REPTACH_OFFSET_CALL_R11 3 + +namespace JSC { + +class MacroAssemblerX86_64 : public MacroAssemblerX86Common { +protected: + static const X86::RegisterID scratchRegister = X86::r11; + +public: + static const Scale ScalePtr = TimesEight; + + using MacroAssemblerX86Common::add32; + using MacroAssemblerX86Common::and32; + using MacroAssemblerX86Common::or32; + using MacroAssemblerX86Common::sub32; + using MacroAssemblerX86Common::load32; + using MacroAssemblerX86Common::store32; + using MacroAssemblerX86Common::call; + using MacroAssemblerX86Common::loadDouble; + using MacroAssemblerX86Common::convertInt32ToDouble; + + void add32(Imm32 imm, AbsoluteAddress address) + { + move(ImmPtr(address.m_ptr), scratchRegister); + add32(imm, Address(scratchRegister)); + } + + void and32(Imm32 imm, AbsoluteAddress address) + { + move(ImmPtr(address.m_ptr), scratchRegister); + and32(imm, Address(scratchRegister)); + } + + void or32(Imm32 imm, AbsoluteAddress address) + { + move(ImmPtr(address.m_ptr), scratchRegister); + or32(imm, Address(scratchRegister)); + } + + void sub32(Imm32 imm, AbsoluteAddress address) + { + move(ImmPtr(address.m_ptr), scratchRegister); + sub32(imm, Address(scratchRegister)); + } + + void load32(void* address, RegisterID dest) + { + if (dest == X86::eax) + m_assembler.movl_mEAX(address); + else { + move(X86::eax, dest); + m_assembler.movl_mEAX(address); + swap(X86::eax, dest); + } + } + + void loadDouble(void* address, FPRegisterID dest) + { + move(ImmPtr(address), scratchRegister); + loadDouble(scratchRegister, dest); + } + + void convertInt32ToDouble(AbsoluteAddress src, FPRegisterID dest) + { + move(Imm32(*static_cast(src.m_ptr)), scratchRegister); + m_assembler.cvtsi2sd_rr(scratchRegister, dest); + } + + void store32(Imm32 imm, void* address) + { + move(X86::eax, scratchRegister); + move(imm, X86::eax); + m_assembler.movl_EAXm(address); + move(scratchRegister, X86::eax); + } + + Call call() + { + DataLabelPtr label = moveWithPatch(ImmPtr(0), scratchRegister); + Call result = Call(m_assembler.call(scratchRegister), Call::Linkable); + ASSERT(differenceBetween(label, result) == REPTACH_OFFSET_CALL_R11); + return result; + } + + Call tailRecursiveCall() + { + DataLabelPtr label = moveWithPatch(ImmPtr(0), scratchRegister); + Jump newJump = Jump(m_assembler.jmp_r(scratchRegister)); + ASSERT(differenceBetween(label, newJump) == REPTACH_OFFSET_CALL_R11); + return Call::fromTailJump(newJump); + } + + Call makeTailRecursiveCall(Jump oldJump) + { + oldJump.link(this); + DataLabelPtr label = moveWithPatch(ImmPtr(0), scratchRegister); + Jump newJump = Jump(m_assembler.jmp_r(scratchRegister)); + ASSERT(differenceBetween(label, newJump) == REPTACH_OFFSET_CALL_R11); + return Call::fromTailJump(newJump); + } + + + void addPtr(RegisterID src, RegisterID dest) + { + m_assembler.addq_rr(src, dest); + } + + void addPtr(Imm32 imm, RegisterID srcDest) + { + m_assembler.addq_ir(imm.m_value, srcDest); + } + + void addPtr(ImmPtr imm, RegisterID dest) + { + move(imm, scratchRegister); + m_assembler.addq_rr(scratchRegister, dest); + } + + void addPtr(Imm32 imm, RegisterID src, RegisterID dest) + { + m_assembler.leaq_mr(imm.m_value, src, dest); + } + + void addPtr(Imm32 imm, Address address) + { + m_assembler.addq_im(imm.m_value, address.offset, address.base); + } + + void addPtr(Imm32 imm, AbsoluteAddress address) + { + move(ImmPtr(address.m_ptr), scratchRegister); + addPtr(imm, Address(scratchRegister)); + } + + void andPtr(RegisterID src, RegisterID dest) + { + m_assembler.andq_rr(src, dest); + } + + void andPtr(Imm32 imm, RegisterID srcDest) + { + m_assembler.andq_ir(imm.m_value, srcDest); + } + + void orPtr(RegisterID src, RegisterID dest) + { + m_assembler.orq_rr(src, dest); + } + + void orPtr(ImmPtr imm, RegisterID dest) + { + move(imm, scratchRegister); + m_assembler.orq_rr(scratchRegister, dest); + } + + void orPtr(Imm32 imm, RegisterID dest) + { + m_assembler.orq_ir(imm.m_value, dest); + } + + void rshiftPtr(RegisterID shift_amount, RegisterID dest) + { + // On x86 we can only shift by ecx; if asked to shift by another register we'll + // need rejig the shift amount into ecx first, and restore the registers afterwards. + if (shift_amount != X86::ecx) { + swap(shift_amount, X86::ecx); + + // E.g. transform "shll %eax, %eax" -> "xchgl %eax, %ecx; shll %ecx, %ecx; xchgl %eax, %ecx" + if (dest == shift_amount) + m_assembler.sarq_CLr(X86::ecx); + // E.g. transform "shll %eax, %ecx" -> "xchgl %eax, %ecx; shll %ecx, %eax; xchgl %eax, %ecx" + else if (dest == X86::ecx) + m_assembler.sarq_CLr(shift_amount); + // E.g. transform "shll %eax, %ebx" -> "xchgl %eax, %ecx; shll %ecx, %ebx; xchgl %eax, %ecx" + else + m_assembler.sarq_CLr(dest); + + swap(shift_amount, X86::ecx); + } else + m_assembler.sarq_CLr(dest); + } + + void rshiftPtr(Imm32 imm, RegisterID dest) + { + m_assembler.sarq_i8r(imm.m_value, dest); + } + + void subPtr(RegisterID src, RegisterID dest) + { + m_assembler.subq_rr(src, dest); + } + + void subPtr(Imm32 imm, RegisterID dest) + { + m_assembler.subq_ir(imm.m_value, dest); + } + + void subPtr(ImmPtr imm, RegisterID dest) + { + move(imm, scratchRegister); + m_assembler.subq_rr(scratchRegister, dest); + } + + void xorPtr(RegisterID src, RegisterID dest) + { + m_assembler.xorq_rr(src, dest); + } + + void xorPtr(Imm32 imm, RegisterID srcDest) + { + m_assembler.xorq_ir(imm.m_value, srcDest); + } + + + void loadPtr(ImplicitAddress address, RegisterID dest) + { + m_assembler.movq_mr(address.offset, address.base, dest); + } + + void loadPtr(BaseIndex address, RegisterID dest) + { + m_assembler.movq_mr(address.offset, address.base, address.index, address.scale, dest); + } + + void loadPtr(void* address, RegisterID dest) + { + if (dest == X86::eax) + m_assembler.movq_mEAX(address); + else { + move(X86::eax, dest); + m_assembler.movq_mEAX(address); + swap(X86::eax, dest); + } + } + + DataLabel32 loadPtrWithAddressOffsetPatch(Address address, RegisterID dest) + { + m_assembler.movq_mr_disp32(address.offset, address.base, dest); + return DataLabel32(this); + } + + void storePtr(RegisterID src, ImplicitAddress address) + { + m_assembler.movq_rm(src, address.offset, address.base); + } + + void storePtr(RegisterID src, BaseIndex address) + { + m_assembler.movq_rm(src, address.offset, address.base, address.index, address.scale); + } + + void storePtr(RegisterID src, void* address) + { + if (src == X86::eax) + m_assembler.movq_EAXm(address); + else { + swap(X86::eax, src); + m_assembler.movq_EAXm(address); + swap(X86::eax, src); + } + } + + void storePtr(ImmPtr imm, ImplicitAddress address) + { + intptr_t ptr = imm.asIntptr(); + if (CAN_SIGN_EXTEND_32_64(ptr)) + m_assembler.movq_i32m(static_cast(ptr), address.offset, address.base); + else { + move(imm, scratchRegister); + storePtr(scratchRegister, address); + } + } + + DataLabel32 storePtrWithAddressOffsetPatch(RegisterID src, Address address) + { + m_assembler.movq_rm_disp32(src, address.offset, address.base); + return DataLabel32(this); + } + + void movePtrToDouble(RegisterID src, FPRegisterID dest) + { + m_assembler.movq_rr(src, dest); + } + + void moveDoubleToPtr(FPRegisterID src, RegisterID dest) + { + m_assembler.movq_rr(src, dest); + } + + void setPtr(Condition cond, RegisterID left, Imm32 right, RegisterID dest) + { + if (((cond == Equal) || (cond == NotEqual)) && !right.m_value) + m_assembler.testq_rr(left, left); + else + m_assembler.cmpq_ir(right.m_value, left); + m_assembler.setCC_r(x86Condition(cond), dest); + m_assembler.movzbl_rr(dest, dest); + } + + Jump branchPtr(Condition cond, RegisterID left, RegisterID right) + { + m_assembler.cmpq_rr(right, left); + return Jump(m_assembler.jCC(x86Condition(cond))); + } + + Jump branchPtr(Condition cond, RegisterID left, ImmPtr right) + { + intptr_t imm = right.asIntptr(); + if (CAN_SIGN_EXTEND_32_64(imm)) { + if (!imm) + m_assembler.testq_rr(left, left); + else + m_assembler.cmpq_ir(imm, left); + return Jump(m_assembler.jCC(x86Condition(cond))); + } else { + move(right, scratchRegister); + return branchPtr(cond, left, scratchRegister); + } + } + + Jump branchPtr(Condition cond, RegisterID left, Address right) + { + m_assembler.cmpq_mr(right.offset, right.base, left); + return Jump(m_assembler.jCC(x86Condition(cond))); + } + + Jump branchPtr(Condition cond, AbsoluteAddress left, RegisterID right) + { + move(ImmPtr(left.m_ptr), scratchRegister); + return branchPtr(cond, Address(scratchRegister), right); + } + + Jump branchPtr(Condition cond, Address left, RegisterID right) + { + m_assembler.cmpq_rm(right, left.offset, left.base); + return Jump(m_assembler.jCC(x86Condition(cond))); + } + + Jump branchPtr(Condition cond, Address left, ImmPtr right) + { + move(right, scratchRegister); + return branchPtr(cond, left, scratchRegister); + } + + Jump branchTestPtr(Condition cond, RegisterID reg, RegisterID mask) + { + m_assembler.testq_rr(reg, mask); + return Jump(m_assembler.jCC(x86Condition(cond))); + } + + Jump branchTestPtr(Condition cond, RegisterID reg, Imm32 mask = Imm32(-1)) + { + // if we are only interested in the low seven bits, this can be tested with a testb + if (mask.m_value == -1) + m_assembler.testq_rr(reg, reg); + else if ((mask.m_value & ~0x7f) == 0) + m_assembler.testb_i8r(mask.m_value, reg); + else + m_assembler.testq_i32r(mask.m_value, reg); + return Jump(m_assembler.jCC(x86Condition(cond))); + } + + Jump branchTestPtr(Condition cond, Address address, Imm32 mask = Imm32(-1)) + { + if (mask.m_value == -1) + m_assembler.cmpq_im(0, address.offset, address.base); + else + m_assembler.testq_i32m(mask.m_value, address.offset, address.base); + return Jump(m_assembler.jCC(x86Condition(cond))); + } + + Jump branchTestPtr(Condition cond, BaseIndex address, Imm32 mask = Imm32(-1)) + { + if (mask.m_value == -1) + m_assembler.cmpq_im(0, address.offset, address.base, address.index, address.scale); + else + m_assembler.testq_i32m(mask.m_value, address.offset, address.base, address.index, address.scale); + return Jump(m_assembler.jCC(x86Condition(cond))); + } + + + Jump branchAddPtr(Condition cond, RegisterID src, RegisterID dest) + { + ASSERT((cond == Overflow) || (cond == Zero) || (cond == NonZero)); + addPtr(src, dest); + return Jump(m_assembler.jCC(x86Condition(cond))); + } + + Jump branchSubPtr(Condition cond, Imm32 imm, RegisterID dest) + { + ASSERT((cond == Overflow) || (cond == Zero) || (cond == NonZero)); + subPtr(imm, dest); + return Jump(m_assembler.jCC(x86Condition(cond))); + } + + DataLabelPtr moveWithPatch(ImmPtr initialValue, RegisterID dest) + { + m_assembler.movq_i64r(initialValue.asIntptr(), dest); + return DataLabelPtr(this); + } + + Jump branchPtrWithPatch(Condition cond, RegisterID left, DataLabelPtr& dataLabel, ImmPtr initialRightValue = ImmPtr(0)) + { + dataLabel = moveWithPatch(initialRightValue, scratchRegister); + return branchPtr(cond, left, scratchRegister); + } + + Jump branchPtrWithPatch(Condition cond, Address left, DataLabelPtr& dataLabel, ImmPtr initialRightValue = ImmPtr(0)) + { + dataLabel = moveWithPatch(initialRightValue, scratchRegister); + return branchPtr(cond, left, scratchRegister); + } + + DataLabelPtr storePtrWithPatch(ImmPtr initialValue, ImplicitAddress address) + { + DataLabelPtr label = moveWithPatch(initialValue, scratchRegister); + storePtr(scratchRegister, address); + return label; + } + + Label loadPtrWithPatchToLEA(Address address, RegisterID dest) + { + Label label(this); + loadPtr(address, dest); + return label; + } + + bool supportsFloatingPoint() const { return true; } + // See comment on MacroAssemblerARMv7::supportsFloatingPointTruncate() + bool supportsFloatingPointTruncate() const { return true; } + +private: + friend class LinkBuffer; + friend class RepatchBuffer; + + static void linkCall(void* code, Call call, FunctionPtr function) + { + if (!call.isFlagSet(Call::Near)) + X86Assembler::linkPointer(code, X86Assembler::labelFor(call.m_jmp, -REPTACH_OFFSET_CALL_R11), function.value()); + else + X86Assembler::linkCall(code, call.m_jmp, function.value()); + } + + static void repatchCall(CodeLocationCall call, CodeLocationLabel destination) + { + X86Assembler::repatchPointer(call.dataLabelPtrAtOffset(-REPTACH_OFFSET_CALL_R11).dataLocation(), destination.executableAddress()); + } + + static void repatchCall(CodeLocationCall call, FunctionPtr destination) + { + X86Assembler::repatchPointer(call.dataLabelPtrAtOffset(-REPTACH_OFFSET_CALL_R11).dataLocation(), destination.executableAddress()); + } + +}; + +} // namespace JSC + +#endif // ENABLE(ASSEMBLER) + +#endif // MacroAssemblerX86_64_h diff --git a/assembler/RepatchBuffer.h b/assembler/RepatchBuffer.h new file mode 100644 index 0000000..89cbf06 --- /dev/null +++ b/assembler/RepatchBuffer.h @@ -0,0 +1,136 @@ +/* + * Copyright (C) 2009 Apple Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef RepatchBuffer_h +#define RepatchBuffer_h + +#include + +#if ENABLE(ASSEMBLER) + +#include +#include + +namespace JSC { + +// RepatchBuffer: +// +// This class is used to modify code after code generation has been completed, +// and after the code has potentially already been executed. This mechanism is +// used to apply optimizations to the code. +// +class RepatchBuffer { + typedef MacroAssemblerCodePtr CodePtr; + +public: + RepatchBuffer(CodeBlock* codeBlock) + { + JITCode& code = codeBlock->getJITCode(); + m_start = code.start(); + m_size = code.size(); + + ExecutableAllocator::makeWritable(m_start, m_size); + } + + ~RepatchBuffer() + { + ExecutableAllocator::makeExecutable(m_start, m_size); + } + + void relink(CodeLocationJump jump, CodeLocationLabel destination) + { + MacroAssembler::repatchJump(jump, destination); + } + + void relink(CodeLocationCall call, CodeLocationLabel destination) + { + MacroAssembler::repatchCall(call, destination); + } + + void relink(CodeLocationCall call, FunctionPtr destination) + { + MacroAssembler::repatchCall(call, destination); + } + + void relink(CodeLocationNearCall nearCall, CodePtr destination) + { + MacroAssembler::repatchNearCall(nearCall, CodeLocationLabel(destination)); + } + + void relink(CodeLocationNearCall nearCall, CodeLocationLabel destination) + { + MacroAssembler::repatchNearCall(nearCall, destination); + } + + void repatch(CodeLocationDataLabel32 dataLabel32, int32_t value) + { + MacroAssembler::repatchInt32(dataLabel32, value); + } + + void repatch(CodeLocationDataLabelPtr dataLabelPtr, void* value) + { + MacroAssembler::repatchPointer(dataLabelPtr, value); + } + + void repatchLoadPtrToLEA(CodeLocationInstruction instruction) + { + MacroAssembler::repatchLoadPtrToLEA(instruction); + } + + void relinkCallerToTrampoline(ReturnAddressPtr returnAddress, CodeLocationLabel label) + { + relink(CodeLocationCall(CodePtr(returnAddress)), label); + } + + void relinkCallerToTrampoline(ReturnAddressPtr returnAddress, CodePtr newCalleeFunction) + { + relinkCallerToTrampoline(returnAddress, CodeLocationLabel(newCalleeFunction)); + } + + void relinkCallerToFunction(ReturnAddressPtr returnAddress, FunctionPtr function) + { + relink(CodeLocationCall(CodePtr(returnAddress)), function); + } + + void relinkNearCallerToTrampoline(ReturnAddressPtr returnAddress, CodeLocationLabel label) + { + relink(CodeLocationNearCall(CodePtr(returnAddress)), label); + } + + void relinkNearCallerToTrampoline(ReturnAddressPtr returnAddress, CodePtr newCalleeFunction) + { + relinkNearCallerToTrampoline(returnAddress, CodeLocationLabel(newCalleeFunction)); + } + +private: + void* m_start; + size_t m_size; +}; + +} // namespace JSC + +#endif // ENABLE(ASSEMBLER) + +#endif // RepatchBuffer_h diff --git a/assembler/X86Assembler.h b/assembler/X86Assembler.h index de23e45..b5b8808 100644 --- a/assembler/X86Assembler.h +++ b/assembler/X86Assembler.h @@ -82,7 +82,31 @@ class X86Assembler { public: typedef X86::RegisterID RegisterID; typedef X86::XMMRegisterID XMMRegisterID; + typedef XMMRegisterID FPRegisterID; + typedef enum { + ConditionO, + ConditionNO, + ConditionB, + ConditionAE, + ConditionE, + ConditionNE, + ConditionBE, + ConditionA, + ConditionS, + ConditionNS, + ConditionP, + ConditionNP, + ConditionL, + ConditionGE, + ConditionLE, + ConditionG, + + ConditionC = ConditionB, + ConditionNC = ConditionAE, + } Condition; + +private: typedef enum { OP_ADD_EvGv = 0x01, OP_ADD_GvEv = 0x03, @@ -90,10 +114,12 @@ public: OP_OR_GvEv = 0x0B, OP_2BYTE_ESCAPE = 0x0F, OP_AND_EvGv = 0x21, + OP_AND_GvEv = 0x23, OP_SUB_EvGv = 0x29, OP_SUB_GvEv = 0x2B, PRE_PREDICT_BRANCH_NOT_TAKEN = 0x2E, OP_XOR_EvGv = 0x31, + OP_XOR_GvEv = 0x33, OP_CMP_EvGv = 0x39, OP_CMP_GvEv = 0x3B, #if PLATFORM(X86_64) @@ -145,32 +171,32 @@ public: OP2_ADDSD_VsdWsd = 0x58, OP2_MULSD_VsdWsd = 0x59, OP2_SUBSD_VsdWsd = 0x5C, + OP2_DIVSD_VsdWsd = 0x5E, + OP2_XORPD_VpdWpd = 0x57, OP2_MOVD_VdEd = 0x6E, OP2_MOVD_EdVd = 0x7E, - OP2_JO_rel32 = 0x80, - OP2_JB_rel32 = 0x82, - OP2_JAE_rel32 = 0x83, - OP2_JE_rel32 = 0x84, - OP2_JNE_rel32 = 0x85, - OP2_JBE_rel32 = 0x86, - OP2_JA_rel32 = 0x87, - OP2_JS_rel32 = 0x88, - OP2_JP_rel32 = 0x8A, - OP2_JL_rel32 = 0x8C, - OP2_JGE_rel32 = 0x8D, - OP2_JLE_rel32 = 0x8E, - OP2_JG_rel32 = 0x8F, - OP_SETE = 0x94, - OP_SETNE = 0x95, + OP2_JCC_rel32 = 0x80, + OP_SETCC = 0x90, OP2_IMUL_GvEv = 0xAF, OP2_MOVZX_GvEb = 0xB6, OP2_MOVZX_GvEw = 0xB7, OP2_PEXTRW_GdUdIb = 0xC5, } TwoByteOpcodeID; + TwoByteOpcodeID jccRel32(Condition cond) + { + return (TwoByteOpcodeID)(OP2_JCC_rel32 + cond); + } + + TwoByteOpcodeID setccOpcode(Condition cond) + { + return (TwoByteOpcodeID)(OP_SETCC + cond); + } + typedef enum { GROUP1_OP_ADD = 0, GROUP1_OP_OR = 1, + GROUP1_OP_ADC = 2, GROUP1_OP_AND = 4, GROUP1_OP_SUB = 5, GROUP1_OP_XOR = 6, @@ -183,6 +209,7 @@ public: GROUP3_OP_TEST = 0, GROUP3_OP_NOT = 2, + GROUP3_OP_NEG = 3, GROUP3_OP_IDIV = 7, GROUP5_OP_CALLN = 2, @@ -192,9 +219,6 @@ public: GROUP11_MOV = 0, } GroupOpcodeID; - // Opaque label types - -private: class X86InstructionFormatter; public: @@ -222,16 +246,22 @@ public: public: JmpDst() : m_offset(-1) + , m_used(false) { } + bool isUsed() const { return m_used; } + void used() { m_used = true; } private: JmpDst(int offset) : m_offset(offset) + , m_used(false) { + ASSERT(m_offset == offset); } - int m_offset; + int m_offset : 31; + bool m_used : 1; }; X86Assembler() @@ -270,6 +300,19 @@ public: // Arithmetic operations: +#if !PLATFORM(X86_64) + void adcl_im(int imm, void* addr) + { + if (CAN_SIGN_EXTEND_8_32(imm)) { + m_formatter.oneByteOp(OP_GROUP1_EvIb, GROUP1_OP_ADC, addr); + m_formatter.immediate8(imm); + } else { + m_formatter.oneByteOp(OP_GROUP1_EvIz, GROUP1_OP_ADC, addr); + m_formatter.immediate32(imm); + } + } +#endif + void addl_rr(RegisterID src, RegisterID dst) { m_formatter.oneByteOp(OP_ADD_EvGv, src, dst); @@ -280,6 +323,11 @@ public: m_formatter.oneByteOp(OP_ADD_GvEv, dst, base, offset); } + void addl_rm(RegisterID src, int offset, RegisterID base) + { + m_formatter.oneByteOp(OP_ADD_EvGv, src, base, offset); + } + void addl_ir(int imm, RegisterID dst) { if (CAN_SIGN_EXTEND_8_32(imm)) { @@ -318,6 +366,17 @@ public: m_formatter.immediate32(imm); } } + + void addq_im(int imm, int offset, RegisterID base) + { + if (CAN_SIGN_EXTEND_8_32(imm)) { + m_formatter.oneByteOp64(OP_GROUP1_EvIb, GROUP1_OP_ADD, base, offset); + m_formatter.immediate8(imm); + } else { + m_formatter.oneByteOp64(OP_GROUP1_EvIz, GROUP1_OP_ADD, base, offset); + m_formatter.immediate32(imm); + } + } #else void addl_im(int imm, void* addr) { @@ -336,6 +395,16 @@ public: m_formatter.oneByteOp(OP_AND_EvGv, src, dst); } + void andl_mr(int offset, RegisterID base, RegisterID dst) + { + m_formatter.oneByteOp(OP_AND_GvEv, dst, base, offset); + } + + void andl_rm(RegisterID src, int offset, RegisterID base) + { + m_formatter.oneByteOp(OP_AND_EvGv, src, base, offset); + } + void andl_ir(int imm, RegisterID dst) { if (CAN_SIGN_EXTEND_8_32(imm)) { @@ -347,6 +416,17 @@ public: } } + void andl_im(int imm, int offset, RegisterID base) + { + if (CAN_SIGN_EXTEND_8_32(imm)) { + m_formatter.oneByteOp(OP_GROUP1_EvIb, GROUP1_OP_AND, base, offset); + m_formatter.immediate8(imm); + } else { + m_formatter.oneByteOp(OP_GROUP1_EvIz, GROUP1_OP_AND, base, offset); + m_formatter.immediate32(imm); + } + } + #if PLATFORM(X86_64) void andq_rr(RegisterID src, RegisterID dst) { @@ -363,13 +443,39 @@ public: m_formatter.immediate32(imm); } } +#else + void andl_im(int imm, void* addr) + { + if (CAN_SIGN_EXTEND_8_32(imm)) { + m_formatter.oneByteOp(OP_GROUP1_EvIb, GROUP1_OP_AND, addr); + m_formatter.immediate8(imm); + } else { + m_formatter.oneByteOp(OP_GROUP1_EvIz, GROUP1_OP_AND, addr); + m_formatter.immediate32(imm); + } + } #endif + void negl_r(RegisterID dst) + { + m_formatter.oneByteOp(OP_GROUP3_Ev, GROUP3_OP_NEG, dst); + } + + void negl_m(int offset, RegisterID base) + { + m_formatter.oneByteOp(OP_GROUP3_Ev, GROUP3_OP_NEG, base, offset); + } + void notl_r(RegisterID dst) { m_formatter.oneByteOp(OP_GROUP3_Ev, GROUP3_OP_NOT, dst); } + void notl_m(int offset, RegisterID base) + { + m_formatter.oneByteOp(OP_GROUP3_Ev, GROUP3_OP_NOT, base, offset); + } + void orl_rr(RegisterID src, RegisterID dst) { m_formatter.oneByteOp(OP_OR_EvGv, src, dst); @@ -380,6 +486,11 @@ public: m_formatter.oneByteOp(OP_OR_GvEv, dst, base, offset); } + void orl_rm(RegisterID src, int offset, RegisterID base) + { + m_formatter.oneByteOp(OP_OR_EvGv, src, base, offset); + } + void orl_ir(int imm, RegisterID dst) { if (CAN_SIGN_EXTEND_8_32(imm)) { @@ -391,6 +502,17 @@ public: } } + void orl_im(int imm, int offset, RegisterID base) + { + if (CAN_SIGN_EXTEND_8_32(imm)) { + m_formatter.oneByteOp(OP_GROUP1_EvIb, GROUP1_OP_OR, base, offset); + m_formatter.immediate8(imm); + } else { + m_formatter.oneByteOp(OP_GROUP1_EvIz, GROUP1_OP_OR, base, offset); + m_formatter.immediate32(imm); + } + } + #if PLATFORM(X86_64) void orq_rr(RegisterID src, RegisterID dst) { @@ -407,6 +529,17 @@ public: m_formatter.immediate32(imm); } } +#else + void orl_im(int imm, void* addr) + { + if (CAN_SIGN_EXTEND_8_32(imm)) { + m_formatter.oneByteOp(OP_GROUP1_EvIb, GROUP1_OP_OR, addr); + m_formatter.immediate8(imm); + } else { + m_formatter.oneByteOp(OP_GROUP1_EvIz, GROUP1_OP_OR, addr); + m_formatter.immediate32(imm); + } + } #endif void subl_rr(RegisterID src, RegisterID dst) @@ -419,6 +552,11 @@ public: m_formatter.oneByteOp(OP_SUB_GvEv, dst, base, offset); } + void subl_rm(RegisterID src, int offset, RegisterID base) + { + m_formatter.oneByteOp(OP_SUB_EvGv, src, base, offset); + } + void subl_ir(int imm, RegisterID dst) { if (CAN_SIGN_EXTEND_8_32(imm)) { @@ -475,6 +613,27 @@ public: m_formatter.oneByteOp(OP_XOR_EvGv, src, dst); } + void xorl_mr(int offset, RegisterID base, RegisterID dst) + { + m_formatter.oneByteOp(OP_XOR_GvEv, dst, base, offset); + } + + void xorl_rm(RegisterID src, int offset, RegisterID base) + { + m_formatter.oneByteOp(OP_XOR_EvGv, src, base, offset); + } + + void xorl_im(int imm, int offset, RegisterID base) + { + if (CAN_SIGN_EXTEND_8_32(imm)) { + m_formatter.oneByteOp(OP_GROUP1_EvIb, GROUP1_OP_XOR, base, offset); + m_formatter.immediate8(imm); + } else { + m_formatter.oneByteOp(OP_GROUP1_EvIz, GROUP1_OP_XOR, base, offset); + m_formatter.immediate32(imm); + } + } + void xorl_ir(int imm, RegisterID dst) { if (CAN_SIGN_EXTEND_8_32(imm)) { @@ -555,7 +714,12 @@ public: { m_formatter.twoByteOp(OP2_IMUL_GvEv, dst, src); } - + + void imull_mr(int offset, RegisterID base, RegisterID dst) + { + m_formatter.twoByteOp(OP2_IMUL_GvEv, dst, base, offset); + } + void imull_i32r(RegisterID src, int32_t value, RegisterID dst) { m_formatter.oneByteOp(OP_IMUL_GvEvIz, dst, src); @@ -640,6 +804,11 @@ public: m_formatter.oneByteOp64(OP_CMP_EvGv, src, base, offset); } + void cmpq_mr(int offset, RegisterID base, RegisterID src) + { + m_formatter.oneByteOp64(OP_CMP_GvEv, src, base, offset); + } + void cmpq_ir(int imm, RegisterID dst) { if (CAN_SIGN_EXTEND_8_32(imm)) { @@ -696,6 +865,19 @@ public: m_formatter.oneByteOp(OP_CMP_EvGv, src, base, index, scale, offset); } + void cmpw_im(int imm, int offset, RegisterID base, RegisterID index, int scale) + { + if (CAN_SIGN_EXTEND_8_32(imm)) { + m_formatter.prefix(PRE_OPERAND_SIZE); + m_formatter.oneByteOp(OP_GROUP1_EvIb, GROUP1_OP_CMP, base, index, scale, offset); + m_formatter.immediate8(imm); + } else { + m_formatter.prefix(PRE_OPERAND_SIZE); + m_formatter.oneByteOp(OP_GROUP1_EvIz, GROUP1_OP_CMP, base, index, scale, offset); + m_formatter.immediate16(imm); + } + } + void testl_rr(RegisterID src, RegisterID dst) { m_formatter.oneByteOp(OP_TEST_EvGv, src, dst); @@ -744,15 +926,26 @@ public: } #endif + void testw_rr(RegisterID src, RegisterID dst) + { + m_formatter.prefix(PRE_OPERAND_SIZE); + m_formatter.oneByteOp(OP_TEST_EvGv, src, dst); + } + void testb_i8r(int imm, RegisterID dst) { m_formatter.oneByteOp8(OP_GROUP3_EbIb, GROUP3_OP_TEST, dst); m_formatter.immediate8(imm); } + void setCC_r(Condition cond, RegisterID dst) + { + m_formatter.twoByteOp8(setccOpcode(cond), (GroupOpcodeID)0, dst); + } + void sete_r(RegisterID dst) { - m_formatter.twoByteOp8(OP_SETE, (GroupOpcodeID)0, dst); + m_formatter.twoByteOp8(setccOpcode(ConditionE), (GroupOpcodeID)0, dst); } void setz_r(RegisterID dst) @@ -762,7 +955,7 @@ public: void setne_r(RegisterID dst) { - m_formatter.twoByteOp8(OP_SETNE, (GroupOpcodeID)0, dst); + m_formatter.twoByteOp8(setccOpcode(ConditionNE), (GroupOpcodeID)0, dst); } void setnz_r(RegisterID dst) @@ -883,6 +1076,12 @@ public: m_formatter.immediate64(reinterpret_cast(addr)); } + void movq_EAXm(void* addr) + { + m_formatter.oneByteOp64(OP_MOV_OvEAX); + m_formatter.immediate64(reinterpret_cast(addr)); + } + void movq_mr(int offset, RegisterID base, RegisterID dst) { m_formatter.oneByteOp64(OP_MOV_GvEv, dst, base, offset); @@ -898,6 +1097,12 @@ public: m_formatter.oneByteOp64(OP_MOV_GvEv, dst, base, index, scale, offset); } + void movq_i32m(int imm, int offset, RegisterID base) + { + m_formatter.oneByteOp64(OP_GROUP11_EvIz, GROUP11_MOV, base, offset); + m_formatter.immediate32(imm); + } + void movq_i64r(int64_t imm, RegisterID dst) { m_formatter.oneByteOp64(OP_MOV_EAXIv, dst); @@ -911,6 +1116,14 @@ public: #else + void movl_rm(RegisterID src, void* addr) + { + if (src == X86::eax) + movl_EAXm(addr); + else + m_formatter.oneByteOp(OP_MOV_EvGv, src, addr); + } + void movl_mr(void* addr, RegisterID dst) { if (dst == X86::eax) @@ -948,6 +1161,12 @@ public: { m_formatter.oneByteOp(OP_LEA, dst, base, offset); } +#if PLATFORM(X86_64) + void leaq_mr(int offset, RegisterID base, RegisterID dst) + { + m_formatter.oneByteOp64(OP_LEA, dst, base, offset); + } +#endif // Flow control: @@ -962,6 +1181,11 @@ public: m_formatter.oneByteOp(OP_GROUP5_Ev, GROUP5_OP_CALLN, dst); return JmpSrc(m_formatter.size()); } + + void call_m(int offset, RegisterID base) + { + m_formatter.oneByteOp(OP_GROUP5_Ev, GROUP5_OP_CALLN, base, offset); + } JmpSrc jmp() { @@ -969,9 +1193,13 @@ public: return m_formatter.immediateRel32(); } - void jmp_r(RegisterID dst) + // Return a JmpSrc so we have a label to the jump, so we can use this + // To make a tail recursive call on x86-64. The MacroAssembler + // really shouldn't wrap this as a Jump, since it can't be linked. :-/ + JmpSrc jmp_r(RegisterID dst) { m_formatter.oneByteOp(OP_GROUP5_Ev, GROUP5_OP_JMPN, dst); + return JmpSrc(m_formatter.size()); } void jmp_m(int offset, RegisterID base) @@ -981,7 +1209,7 @@ public: JmpSrc jne() { - m_formatter.twoByteOp(OP2_JNE_rel32); + m_formatter.twoByteOp(jccRel32(ConditionNE)); return m_formatter.immediateRel32(); } @@ -992,73 +1220,84 @@ public: JmpSrc je() { - m_formatter.twoByteOp(OP2_JE_rel32); + m_formatter.twoByteOp(jccRel32(ConditionE)); return m_formatter.immediateRel32(); } + JmpSrc jz() + { + return je(); + } + JmpSrc jl() { - m_formatter.twoByteOp(OP2_JL_rel32); + m_formatter.twoByteOp(jccRel32(ConditionL)); return m_formatter.immediateRel32(); } JmpSrc jb() { - m_formatter.twoByteOp(OP2_JB_rel32); + m_formatter.twoByteOp(jccRel32(ConditionB)); return m_formatter.immediateRel32(); } JmpSrc jle() { - m_formatter.twoByteOp(OP2_JLE_rel32); + m_formatter.twoByteOp(jccRel32(ConditionLE)); return m_formatter.immediateRel32(); } JmpSrc jbe() { - m_formatter.twoByteOp(OP2_JBE_rel32); + m_formatter.twoByteOp(jccRel32(ConditionBE)); return m_formatter.immediateRel32(); } JmpSrc jge() { - m_formatter.twoByteOp(OP2_JGE_rel32); + m_formatter.twoByteOp(jccRel32(ConditionGE)); return m_formatter.immediateRel32(); } JmpSrc jg() { - m_formatter.twoByteOp(OP2_JG_rel32); + m_formatter.twoByteOp(jccRel32(ConditionG)); return m_formatter.immediateRel32(); } JmpSrc ja() { - m_formatter.twoByteOp(OP2_JA_rel32); + m_formatter.twoByteOp(jccRel32(ConditionA)); return m_formatter.immediateRel32(); } JmpSrc jae() { - m_formatter.twoByteOp(OP2_JAE_rel32); + m_formatter.twoByteOp(jccRel32(ConditionAE)); return m_formatter.immediateRel32(); } JmpSrc jo() { - m_formatter.twoByteOp(OP2_JO_rel32); + m_formatter.twoByteOp(jccRel32(ConditionO)); return m_formatter.immediateRel32(); } JmpSrc jp() { - m_formatter.twoByteOp(OP2_JP_rel32); + m_formatter.twoByteOp(jccRel32(ConditionP)); return m_formatter.immediateRel32(); } JmpSrc js() { - m_formatter.twoByteOp(OP2_JS_rel32); + m_formatter.twoByteOp(jccRel32(ConditionS)); + return m_formatter.immediateRel32(); + } + + JmpSrc jCC(Condition cond) + { + m_formatter.twoByteOp(jccRel32(cond)); return m_formatter.immediateRel32(); } @@ -1082,6 +1321,20 @@ public: m_formatter.twoByteOp(OP2_CVTSI2SD_VsdEd, (RegisterID)dst, src); } + void cvtsi2sd_mr(int offset, RegisterID base, XMMRegisterID dst) + { + m_formatter.prefix(PRE_SSE_F2); + m_formatter.twoByteOp(OP2_CVTSI2SD_VsdEd, (RegisterID)dst, base, offset); + } + +#if !PLATFORM(X86_64) + void cvtsi2sd_mr(void* address, XMMRegisterID dst) + { + m_formatter.prefix(PRE_SSE_F2); + m_formatter.twoByteOp(OP2_CVTSI2SD_VsdEd, (RegisterID)dst, address); + } +#endif + void cvttsd2si_rr(XMMRegisterID src, RegisterID dst) { m_formatter.prefix(PRE_SSE_F2); @@ -1120,6 +1373,14 @@ public: m_formatter.twoByteOp(OP2_MOVSD_VsdWsd, (RegisterID)dst, base, offset); } +#if !PLATFORM(X86_64) + void movsd_mr(void* address, XMMRegisterID dst) + { + m_formatter.prefix(PRE_SSE_F2); + m_formatter.twoByteOp(OP2_MOVSD_VsdWsd, (RegisterID)dst, address); + } +#endif + void mulsd_rr(XMMRegisterID src, XMMRegisterID dst) { m_formatter.prefix(PRE_SSE_F2); @@ -1157,6 +1418,30 @@ public: m_formatter.twoByteOp(OP2_UCOMISD_VsdWsd, (RegisterID)dst, (RegisterID)src); } + void ucomisd_mr(int offset, RegisterID base, XMMRegisterID dst) + { + m_formatter.prefix(PRE_SSE_66); + m_formatter.twoByteOp(OP2_UCOMISD_VsdWsd, (RegisterID)dst, base, offset); + } + + void divsd_rr(XMMRegisterID src, XMMRegisterID dst) + { + m_formatter.prefix(PRE_SSE_F2); + m_formatter.twoByteOp(OP2_DIVSD_VsdWsd, (RegisterID)dst, (RegisterID)src); + } + + void divsd_mr(int offset, RegisterID base, XMMRegisterID dst) + { + m_formatter.prefix(PRE_SSE_F2); + m_formatter.twoByteOp(OP2_DIVSD_VsdWsd, (RegisterID)dst, base, offset); + } + + void xorpd_rr(XMMRegisterID src, XMMRegisterID dst) + { + m_formatter.prefix(PRE_SSE_66); + m_formatter.twoByteOp(OP2_XORPD_VpdWpd, (RegisterID)dst, (RegisterID)src); + } + // Misc instructions: void int3() @@ -1181,6 +1466,11 @@ public: return JmpDst(m_formatter.size()); } + static JmpDst labelFor(JmpSrc jump, intptr_t offset = 0) + { + return JmpDst(jump.m_offset + offset); + } + JmpDst align(int alignment) { while (!m_formatter.isAligned(alignment)) @@ -1190,31 +1480,83 @@ public: } // Linking & patching: + // + // 'link' and 'patch' methods are for use on unprotected code - such as the code + // within the AssemblerBuffer, and code being patched by the patch buffer. Once + // code has been finalized it is (platform support permitting) within a non- + // writable region of memory; to modify the code in an execute-only execuable + // pool the 'repatch' and 'relink' methods should be used. - void link(JmpSrc from, JmpDst to) + void linkJump(JmpSrc from, JmpDst to) { - ASSERT(to.m_offset != -1); ASSERT(from.m_offset != -1); - - reinterpret_cast(reinterpret_cast(m_formatter.data()) + from.m_offset)[-1] = to.m_offset - from.m_offset; + ASSERT(to.m_offset != -1); + + char* code = reinterpret_cast(m_formatter.data()); + setRel32(code + from.m_offset, code + to.m_offset); } - static void patchAddress(void* code, JmpDst position, void* value) + static void linkJump(void* code, JmpSrc from, void* to) { - ASSERT(position.m_offset != -1); - - reinterpret_cast(reinterpret_cast(code) + position.m_offset)[-1] = value; + ASSERT(from.m_offset != -1); + + setRel32(reinterpret_cast(code) + from.m_offset, to); } - - static void link(void* code, JmpSrc from, void* to) + + static void linkCall(void* code, JmpSrc from, void* to) { ASSERT(from.m_offset != -1); - - reinterpret_cast(reinterpret_cast(code) + from.m_offset)[-1] = reinterpret_cast(to) - (reinterpret_cast(code) + from.m_offset); + + setRel32(reinterpret_cast(code) + from.m_offset, to); + } + + static void linkPointer(void* code, JmpDst where, void* value) + { + ASSERT(where.m_offset != -1); + + setPointer(reinterpret_cast(code) + where.m_offset, value); + } + + static void relinkJump(void* from, void* to) + { + setRel32(from, to); + } + + static void relinkCall(void* from, void* to) + { + setRel32(from, to); + } + + static void repatchInt32(void* where, int32_t value) + { + setInt32(where, value); + } + + static void repatchPointer(void* where, void* value) + { + setPointer(where, value); + } + + static void repatchLoadPtrToLEA(void* where) + { +#if PLATFORM(X86_64) + // On x86-64 pointer memory accesses require a 64-bit operand, and as such a REX prefix. + // Skip over the prefix byte. + where = reinterpret_cast(where) + 1; +#endif + *reinterpret_cast(where) = static_cast(OP_LEA); } + static unsigned getCallReturnOffset(JmpSrc call) + { + ASSERT(call.m_offset >= 0); + return call.m_offset; + } + static void* getRelocatedAddress(void* code, JmpSrc jump) { + ASSERT(jump.m_offset != -1); + return reinterpret_cast(reinterpret_cast(code) + jump.m_offset); } @@ -1240,23 +1582,6 @@ public: return dst.m_offset - src.m_offset; } - static void patchImmediate(intptr_t where, int32_t value) - { - reinterpret_cast(where)[-1] = value; - } - - static void patchPointer(intptr_t where, intptr_t value) - { - reinterpret_cast(where)[-1] = value; - } - - static void patchBranchOffset(intptr_t where, void* destination) - { - intptr_t offset = reinterpret_cast(destination) - where; - ASSERT(offset == static_cast(offset)); - reinterpret_cast(where)[-1] = static_cast(offset); - } - void* executableCopy(ExecutablePool* allocator) { void* copy = m_formatter.executableCopy(allocator); @@ -1266,6 +1591,24 @@ public: private: + static void setPointer(void* where, void* value) + { + reinterpret_cast(where)[-1] = value; + } + + static void setInt32(void* where, int32_t value) + { + reinterpret_cast(where)[-1] = value; + } + + static void setRel32(void* from, void* to) + { + intptr_t offset = reinterpret_cast(to) - reinterpret_cast(from); + ASSERT(offset == static_cast(offset)); + + setInt32(from, offset); + } + class X86InstructionFormatter { static const int maxInstructionSize = 16; @@ -1383,6 +1726,16 @@ private: memoryModRM(reg, base, index, scale, offset); } +#if !PLATFORM(X86_64) + void twoByteOp(TwoByteOpcodeID opcode, int reg, void* address) + { + m_buffer.ensureSpace(maxInstructionSize); + m_buffer.putByteUnchecked(OP_2BYTE_ESCAPE); + m_buffer.putByteUnchecked(opcode); + memoryModRM(reg, address); + } +#endif + #if PLATFORM(X86_64) // Quad-word-sized operands: // @@ -1507,6 +1860,11 @@ private: m_buffer.putByteUnchecked(imm); } + void immediate16(int imm) + { + m_buffer.putShortUnchecked(imm); + } + void immediate32(int imm) { m_buffer.putIntUnchecked(imm); @@ -1601,13 +1959,8 @@ private: { ASSERT(mode != ModRmRegister); - // Encode sacle of (1,2,4,8) -> (0,1,2,3) - int shift = 0; - while (scale >>= 1) - shift++; - putModRm(mode, reg, hasSib); - m_buffer.putByteUnchecked((shift << 6) | ((index & 7) << 3) | (base & 7)); + m_buffer.putByteUnchecked((scale << 6) | ((index & 7) << 3) | (base & 7)); } void registerModRM(int reg, RegisterID rm) diff --git a/bytecode/CodeBlock.cpp b/bytecode/CodeBlock.cpp index be060d0..1f64992 100644 --- a/bytecode/CodeBlock.cpp +++ b/bytecode/CodeBlock.cpp @@ -55,8 +55,11 @@ static UString escapeQuotes(const UString& str) return result; } -static UString valueToSourceString(ExecState* exec, JSValuePtr val) +static UString valueToSourceString(ExecState* exec, JSValue val) { + if (!val) + return "0"; + if (val.isString()) { UString result("\""); result += escapeQuotes(val.toString(exec)) + "\""; @@ -74,7 +77,7 @@ static CString registerName(int r) return (UString("r") + UString::from(r)).UTF8String(); } -static CString constantName(ExecState* exec, int k, JSValuePtr value) +static CString constantName(ExecState* exec, int k, JSValue value) { return (valueToSourceString(exec, value) + "(@k" + UString::from(k) + ")").UTF8String(); } @@ -357,21 +360,12 @@ void CodeBlock::dump(ExecState* exec) const unsigned registerIndex = m_numVars; size_t i = 0; do { - printf(" r%u = %s\n", registerIndex, valueToSourceString(exec, m_constantRegisters[i].jsValue(exec)).ascii()); + printf(" r%u = %s\n", registerIndex, valueToSourceString(exec, m_constantRegisters[i].jsValue()).ascii()); ++i; ++registerIndex; } while (i < m_constantRegisters.size()); } - if (m_rareData && !m_rareData->m_unexpectedConstants.isEmpty()) { - printf("\nUnexpected Constants:\n"); - size_t i = 0; - do { - printf(" k%u = %s\n", static_cast(i), valueToSourceString(exec, m_rareData->m_unexpectedConstants[i]).ascii()); - ++i; - } while (i < m_rareData->m_unexpectedConstants.size()); - } - if (m_rareData && !m_rareData->m_regexps.isEmpty()) { printf("\nm_regexps:\n"); size_t i = 0; @@ -497,15 +491,13 @@ void CodeBlock::dump(ExecState* exec, const Vector::const_iterator& printf("[%4d] create_arguments\n", location); break; } - case op_convert_this: { - int r0 = (++it)->u.operand; - printf("[%4d] convert_this %s\n", location, registerName(r0).c_str()); + case op_init_arguments: { + printf("[%4d] init_arguments\n", location); break; } - case op_unexpected_load: { + case op_convert_this: { int r0 = (++it)->u.operand; - int k0 = (++it)->u.operand; - printf("[%4d] unexpected_load\t %s, %s\n", location, registerName(r0).c_str(), constantName(exec, k0, unexpectedConstant(k0)).c_str()); + printf("[%4d] convert_this %s\n", location, registerName(r0).c_str()); break; } case op_new_object: { @@ -606,6 +598,7 @@ void CodeBlock::dump(ExecState* exec, const Vector::const_iterator& } case op_div: { printBinaryOp(location, it, "div"); + ++it; break; } case op_mod: { @@ -703,7 +696,7 @@ void CodeBlock::dump(ExecState* exec, const Vector::const_iterator& } case op_resolve_global: { int r0 = (++it)->u.operand; - JSValuePtr scope = JSValuePtr((++it)->u.jsCell); + JSValue scope = JSValue((++it)->u.jsCell); int id0 = (++it)->u.operand; printf("[%4d] resolve_global\t %s, %s, %s\n", location, registerName(r0).c_str(), valueToSourceString(exec, scope).ascii(), idName(id0, m_identifiers[id0]).c_str()); it += 2; @@ -725,13 +718,13 @@ void CodeBlock::dump(ExecState* exec, const Vector::const_iterator& } case op_get_global_var: { int r0 = (++it)->u.operand; - JSValuePtr scope = JSValuePtr((++it)->u.jsCell); + JSValue scope = JSValue((++it)->u.jsCell); int index = (++it)->u.operand; printf("[%4d] get_global_var\t %s, %s, %d\n", location, registerName(r0).c_str(), valueToSourceString(exec, scope).ascii(), index); break; } case op_put_global_var: { - JSValuePtr scope = JSValuePtr((++it)->u.jsCell); + JSValue scope = JSValue((++it)->u.jsCell); int index = (++it)->u.operand; int r0 = (++it)->u.operand; printf("[%4d] put_global_var\t %s, %d, %s\n", location, valueToSourceString(exec, scope).ascii(), index, registerName(r0).c_str()); @@ -750,13 +743,6 @@ void CodeBlock::dump(ExecState* exec, const Vector::const_iterator& printf("[%4d] resolve_with_base %s, %s, %s\n", location, registerName(r0).c_str(), registerName(r1).c_str(), idName(id0, m_identifiers[id0]).c_str()); break; } - case op_resolve_func: { - int r0 = (++it)->u.operand; - int r1 = (++it)->u.operand; - int id0 = (++it)->u.operand; - printf("[%4d] resolve_func\t %s, %s, %s\n", location, registerName(r0).c_str(), registerName(r1).c_str(), idName(id0, m_identifiers[id0]).c_str()); - break; - } case op_get_by_id: { printGetByIdOp(location, it, m_identifiers, "get_by_id"); break; @@ -823,6 +809,10 @@ void CodeBlock::dump(ExecState* exec, const Vector::const_iterator& printf("[%4d] put_setter\t %s, %s, %s\n", location, registerName(r0).c_str(), idName(id0, m_identifiers[id0]).c_str(), registerName(r1).c_str()); break; } + case op_method_check: { + printf("[%4d] op_method_check\n", location); + break; + } case op_del_by_id: { int r0 = (++it)->u.operand; int r1 = (++it)->u.operand; @@ -888,6 +878,13 @@ void CodeBlock::dump(ExecState* exec, const Vector::const_iterator& printConditionalJump(begin, it, location, "jneq_null"); break; } + case op_jneq_ptr: { + int r0 = (++it)->u.operand; + int r1 = (++it)->u.operand; + int offset = (++it)->u.operand; + printf("[%4d] jneq_ptr\t\t %s, %s, %d(->%d)\n", location, registerName(r0).c_str(), registerName(r1).c_str(), offset, locationForOffset(begin, it, offset)); + break; + } case op_jnless: { int r0 = (++it)->u.operand; int r1 = (++it)->u.operand; @@ -895,6 +892,13 @@ void CodeBlock::dump(ExecState* exec, const Vector::const_iterator& printf("[%4d] jnless\t\t %s, %s, %d(->%d)\n", location, registerName(r0).c_str(), registerName(r1).c_str(), offset, locationForOffset(begin, it, offset)); break; } + case op_jnlesseq: { + int r0 = (++it)->u.operand; + int r1 = (++it)->u.operand; + int offset = (++it)->u.operand; + printf("[%4d] jnlesseq\t\t %s, %s, %d(->%d)\n", location, registerName(r0).c_str(), registerName(r1).c_str(), offset, locationForOffset(begin, it, offset)); + break; + } case op_loop_if_less: { int r0 = (++it)->u.operand; int r1 = (++it)->u.operand; @@ -958,6 +962,18 @@ void CodeBlock::dump(ExecState* exec, const Vector::const_iterator& printf("[%4d] call_eval\t %s, %s, %d, %d\n", location, registerName(dst).c_str(), registerName(func).c_str(), argCount, registerOffset); break; } + case op_call_varargs: { + int dst = (++it)->u.operand; + int func = (++it)->u.operand; + int argCount = (++it)->u.operand; + int registerOffset = (++it)->u.operand; + printf("[%4d] call_varargs\t %s, %s, %s, %d\n", location, registerName(dst).c_str(), registerName(func).c_str(), registerName(argCount).c_str(), registerOffset); + break; + } + case op_load_varargs: { + printUnaryOp(location, it, "load_varargs"); + break; + } case op_tear_off_activation: { int r0 = (++it)->u.operand; printf("[%4d] tear_off_activation\t %s\n", location, registerName(r0).c_str()); @@ -988,6 +1004,19 @@ void CodeBlock::dump(ExecState* exec, const Vector::const_iterator& printf("[%4d] construct_verify\t %s, %s\n", location, registerName(r0).c_str(), registerName(r1).c_str()); break; } + case op_strcat: { + int r0 = (++it)->u.operand; + int r1 = (++it)->u.operand; + int count = (++it)->u.operand; + printf("[%4d] op_strcat\t %s, %s, %d\n", location, registerName(r0).c_str(), registerName(r1).c_str(), count); + break; + } + case op_to_primitive: { + int r0 = (++it)->u.operand; + int r1 = (++it)->u.operand; + printf("[%4d] op_to_primitive\t %s, %s\n", location, registerName(r0).c_str(), registerName(r1).c_str()); + break; + } case op_get_pnames: { int r0 = (++it)->u.operand; int r1 = (++it)->u.operand; @@ -1037,7 +1066,7 @@ void CodeBlock::dump(ExecState* exec, const Vector::const_iterator& int r0 = (++it)->u.operand; int errorType = (++it)->u.operand; int k0 = (++it)->u.operand; - printf("[%4d] new_error\t %s, %d, %s\n", location, registerName(r0).c_str(), errorType, constantName(exec, k0, unexpectedConstant(k0)).c_str()); + printf("[%4d] new_error\t %s, %d, %s\n", location, registerName(r0).c_str(), errorType, constantName(exec, k0, getConstant(k0)).c_str()); break; } case op_jsr: { @@ -1095,7 +1124,6 @@ static HashSet liveCodeBlockSet; #define FOR_EACH_MEMBER_VECTOR_RARE_DATA(macro) \ macro(regexps) \ macro(functions) \ - macro(unexpectedConstants) \ macro(exceptionHandlers) \ macro(immediateSwitchJumpTables) \ macro(characterSwitchJumpTables) \ @@ -1218,10 +1246,30 @@ void CodeBlock::dumpStatistics() #endif } +CodeBlock::CodeBlock(ScopeNode* ownerNode) + : m_numCalleeRegisters(0) + , m_numVars(0) + , m_numParameters(0) + , m_ownerNode(ownerNode) + , m_globalData(0) +#ifndef NDEBUG + , m_instructionCount(0) +#endif + , m_needsFullScopeChain(false) + , m_usesEval(false) + , m_isNumericCompareFunction(false) + , m_codeType(NativeCode) + , m_source(0) + , m_sourceOffset(0) + , m_exceptionInfo(0) +{ +#if DUMP_CODE_BLOCK_STATISTICS + liveCodeBlockSet.add(this); +#endif +} CodeBlock::CodeBlock(ScopeNode* ownerNode, CodeType codeType, PassRefPtr sourceProvider, unsigned sourceOffset) : m_numCalleeRegisters(0) - , m_numConstants(0) , m_numVars(0) , m_numParameters(0) , m_ownerNode(ownerNode) @@ -1267,15 +1315,27 @@ CodeBlock::~CodeBlock() callLinkInfo->callee->removeCaller(callLinkInfo); } + for (size_t size = m_methodCallLinkInfos.size(), i = 0; i < size; ++i) { + if (Structure* structure = m_methodCallLinkInfos[i].cachedStructure) { + structure->deref(); + // Both members must be filled at the same time + ASSERT(m_methodCallLinkInfos[i].cachedPrototypeStructure); + m_methodCallLinkInfos[i].cachedPrototypeStructure->deref(); + } + } + +#if ENABLE(JIT_OPTIMIZE_CALL) unlinkCallers(); #endif +#endif // !ENABLE(JIT) + #if DUMP_CODE_BLOCK_STATISTICS liveCodeBlockSet.remove(this); #endif } -#if ENABLE(JIT) +#if ENABLE(JIT_OPTIMIZE_CALL) void CodeBlock::unlinkCallers() { size_t size = m_linkedCallerList.size(); @@ -1290,6 +1350,7 @@ void CodeBlock::unlinkCallers() void CodeBlock::derefStructures(Instruction* vPC) const { + ASSERT(m_codeType != NativeCode); Interpreter* interpreter = m_globalData->interpreter; if (vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id_self)) { @@ -1335,6 +1396,7 @@ void CodeBlock::derefStructures(Instruction* vPC) const void CodeBlock::refStructures(Instruction* vPC) const { + ASSERT(m_codeType != NativeCode); Interpreter* interpreter = m_globalData->interpreter; if (vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id_self)) { @@ -1379,16 +1441,13 @@ void CodeBlock::mark() for (size_t i = 0; i < m_rareData->m_functions.size(); ++i) m_rareData->m_functions[i]->body()->mark(); - for (size_t i = 0; i < m_rareData->m_unexpectedConstants.size(); ++i) { - if (!m_rareData->m_unexpectedConstants[i].marked()) - m_rareData->m_unexpectedConstants[i].mark(); - } m_rareData->m_evalCodeCache.mark(); } } void CodeBlock::reparseForExceptionInfoIfNecessary(CallFrame* callFrame) { + ASSERT(m_codeType != NativeCode); if (m_exceptionInfo) return; @@ -1420,7 +1479,7 @@ void CodeBlock::reparseForExceptionInfoIfNecessary(CallFrame* callFrame) #if ENABLE(JIT) JIT::compile(m_globalData, &newCodeBlock); - ASSERT(newCodeBlock.m_jitCode.codeSize == m_jitCode.codeSize); + ASSERT(newFunctionBody->generatedJITCode().size() == ownerNode()->generatedJITCode().size()); #endif m_exceptionInfo.set(newCodeBlock.m_exceptionInfo.release()); @@ -1441,7 +1500,7 @@ void CodeBlock::reparseForExceptionInfoIfNecessary(CallFrame* callFrame) #if ENABLE(JIT) JIT::compile(m_globalData, &newCodeBlock); - ASSERT(newCodeBlock.m_jitCode.codeSize == m_jitCode.codeSize); + ASSERT(newEvalBody->generatedJITCode().size() == ownerNode()->generatedJITCode().size()); #endif m_exceptionInfo.set(newCodeBlock.m_exceptionInfo.release()); @@ -1459,6 +1518,7 @@ void CodeBlock::reparseForExceptionInfoIfNecessary(CallFrame* callFrame) HandlerInfo* CodeBlock::handlerForBytecodeOffset(unsigned bytecodeOffset) { + ASSERT(m_codeType != NativeCode); ASSERT(bytecodeOffset < m_instructionCount); if (!m_rareData) @@ -1477,6 +1537,7 @@ HandlerInfo* CodeBlock::handlerForBytecodeOffset(unsigned bytecodeOffset) int CodeBlock::lineNumberForBytecodeOffset(CallFrame* callFrame, unsigned bytecodeOffset) { + ASSERT(m_codeType != NativeCode); ASSERT(bytecodeOffset < m_instructionCount); reparseForExceptionInfoIfNecessary(callFrame); @@ -1502,6 +1563,7 @@ int CodeBlock::lineNumberForBytecodeOffset(CallFrame* callFrame, unsigned byteco int CodeBlock::expressionRangeForBytecodeOffset(CallFrame* callFrame, unsigned bytecodeOffset, int& divot, int& startOffset, int& endOffset) { + ASSERT(m_codeType != NativeCode); ASSERT(bytecodeOffset < m_instructionCount); reparseForExceptionInfoIfNecessary(callFrame); @@ -1541,6 +1603,7 @@ int CodeBlock::expressionRangeForBytecodeOffset(CallFrame* callFrame, unsigned b bool CodeBlock::getByIdExceptionInfoForBytecodeOffset(CallFrame* callFrame, unsigned bytecodeOffset, OpcodeID& opcodeID) { + ASSERT(m_codeType != NativeCode); ASSERT(bytecodeOffset < m_instructionCount); reparseForExceptionInfoIfNecessary(callFrame); @@ -1569,6 +1632,7 @@ bool CodeBlock::getByIdExceptionInfoForBytecodeOffset(CallFrame* callFrame, unsi #if ENABLE(JIT) bool CodeBlock::functionRegisterForBytecodeOffset(unsigned bytecodeOffset, int& functionRegisterIndex) { + ASSERT(m_codeType != NativeCode); ASSERT(bytecodeOffset < m_instructionCount); if (!m_rareData || !m_rareData->m_functionRegisterInfos.size()) @@ -1595,6 +1659,7 @@ bool CodeBlock::functionRegisterForBytecodeOffset(unsigned bytecodeOffset, int& #if !ENABLE(JIT) bool CodeBlock::hasGlobalResolveInstructionAtBytecodeOffset(unsigned bytecodeOffset) { + ASSERT(m_codeType != NativeCode); if (m_globalResolveInstructions.isEmpty()) return false; @@ -1615,6 +1680,7 @@ bool CodeBlock::hasGlobalResolveInstructionAtBytecodeOffset(unsigned bytecodeOff #else bool CodeBlock::hasGlobalResolveInfoAtBytecodeOffset(unsigned bytecodeOffset) { + ASSERT(m_codeType != NativeCode); if (m_globalResolveInfos.isEmpty()) return false; @@ -1635,9 +1701,10 @@ bool CodeBlock::hasGlobalResolveInfoAtBytecodeOffset(unsigned bytecodeOffset) #endif #if ENABLE(JIT) -void CodeBlock::setJITCode(JITCodeRef& jitCode) +void CodeBlock::setJITCode(JITCode jitCode) { - m_jitCode = jitCode; + ASSERT(m_codeType != NativeCode); + ownerNode()->setJITCode(jitCode); #if !ENABLE(OPCODE_SAMPLING) if (!BytecodeGenerator::dumpsGeneratedCode()) m_instructions.clear(); @@ -1672,7 +1739,6 @@ void CodeBlock::shrinkToFit() if (m_rareData) { m_rareData->m_exceptionHandlers.shrinkToFit(); m_rareData->m_functions.shrinkToFit(); - m_rareData->m_unexpectedConstants.shrinkToFit(); m_rareData->m_regexps.shrinkToFit(); m_rareData->m_immediateSwitchJumpTables.shrinkToFit(); m_rareData->m_characterSwitchJumpTables.shrinkToFit(); diff --git a/bytecode/CodeBlock.h b/bytecode/CodeBlock.h index e5d78d3..eaf5d1d 100644 --- a/bytecode/CodeBlock.h +++ b/bytecode/CodeBlock.h @@ -32,11 +32,13 @@ #include "EvalCodeCache.h" #include "Instruction.h" +#include "JITCode.h" #include "JSGlobalObject.h" #include "JumpTable.h" #include "Nodes.h" #include "RegExp.h" #include "UString.h" +#include #include #include @@ -44,11 +46,17 @@ #include "StructureStubInfo.h" #endif +// Register numbers used in bytecode operations have different meaning accoring to their ranges: +// 0x80000000-0xFFFFFFFF Negative indicies from the CallFrame pointer are entries in the call frame, see RegisterFile.h. +// 0x00000000-0x3FFFFFFF Forwards indices from the CallFrame pointer are local vars and temporaries with the function's callframe. +// 0x40000000-0x7FFFFFFF Positive indices from 0x40000000 specify entries in the constant pool on the CodeBlock. +static const int FirstConstantRegisterIndex = 0x40000000; + namespace JSC { class ExecState; - enum CodeType { GlobalCode, EvalCode, FunctionCode }; + enum CodeType { GlobalCode, EvalCode, FunctionCode, NativeCode }; static ALWAYS_INLINE int missingThisObjectMarker() { return std::numeric_limits::max(); } @@ -58,38 +66,10 @@ namespace JSC { uint32_t target; uint32_t scopeDepth; #if ENABLE(JIT) - void* nativeCode; + CodeLocationLabel nativeCode; #endif }; -#if ENABLE(JIT) - // The code, and the associated pool from which it was allocated. - struct JITCodeRef { - void* code; -#ifndef NDEBUG - unsigned codeSize; -#endif - RefPtr executablePool; - - JITCodeRef() - : code(0) -#ifndef NDEBUG - , codeSize(0) -#endif - { - } - - JITCodeRef(void* code, PassRefPtr executablePool) - : code(code) -#ifndef NDEBUG - , codeSize(0) -#endif - , executablePool(executablePool) - { - } - }; -#endif - struct ExpressionRangeInfo { enum { MaxOffset = (1 << 7) - 1, @@ -117,19 +97,15 @@ namespace JSC { #if ENABLE(JIT) struct CallLinkInfo { CallLinkInfo() - : callReturnLocation(0) - , hotPathBegin(0) - , hotPathOther(0) - , coldPathOther(0) - , callee(0) + : callee(0) { } unsigned bytecodeIndex; - void* callReturnLocation; - void* hotPathBegin; - void* hotPathOther; - void* coldPathOther; + CodeLocationNearCall callReturnLocation; + CodeLocationDataLabelPtr hotPathBegin; + CodeLocationNearCall hotPathOther; + CodeBlock* ownerCodeBlock; CodeBlock* callee; unsigned position; @@ -137,6 +113,19 @@ namespace JSC { bool isLinked() { return callee; } }; + struct MethodCallLinkInfo { + MethodCallLinkInfo() + : cachedStructure(0) + , cachedPrototypeStructure(0) + { + } + + CodeLocationCall callReturnLocation; + CodeLocationDataLabelPtr structureLabel; + Structure* cachedStructure; + Structure* cachedPrototypeStructure; + }; + struct FunctionRegisterInfo { FunctionRegisterInfo(unsigned bytecodeOffset, int functionRegisterIndex) : bytecodeOffset(bytecodeOffset) @@ -161,14 +150,18 @@ namespace JSC { unsigned bytecodeOffset; }; - struct PC { - PC(ptrdiff_t nativePCOffset, unsigned bytecodeIndex) - : nativePCOffset(nativePCOffset) + // This structure is used to map from a call return location + // (given as an offset in bytes into the JIT code) back to + // the bytecode index of the corresponding bytecode operation. + // This is then used to look up the corresponding handler. + struct CallReturnOffsetToBytecodeIndex { + CallReturnOffsetToBytecodeIndex(unsigned callReturnOffset, unsigned bytecodeIndex) + : callReturnOffset(callReturnOffset) , bytecodeIndex(bytecodeIndex) { } - ptrdiff_t nativePCOffset; + unsigned callReturnOffset; unsigned bytecodeIndex; }; @@ -176,17 +169,22 @@ namespace JSC { inline void* getStructureStubInfoReturnLocation(StructureStubInfo* structureStubInfo) { - return structureStubInfo->callReturnLocation; + return structureStubInfo->callReturnLocation.executableAddress(); } inline void* getCallLinkInfoReturnLocation(CallLinkInfo* callLinkInfo) { - return callLinkInfo->callReturnLocation; + return callLinkInfo->callReturnLocation.executableAddress(); + } + + inline void* getMethodCallLinkInfoReturnLocation(MethodCallLinkInfo* methodCallLinkInfo) + { + return methodCallLinkInfo->callReturnLocation.executableAddress(); } - inline ptrdiff_t getNativePCOffset(PC* pc) + inline unsigned getCallReturnOffset(CallReturnOffsetToBytecodeIndex* pc) { - return pc->nativePCOffset; + return pc->callReturnOffset; } // Binary chop algorithm, calls valueAtPosition on pre-sorted elements in array, @@ -226,16 +224,17 @@ namespace JSC { } #endif - class CodeBlock { + class CodeBlock : public WTF::FastAllocBase { friend class JIT; public: + CodeBlock(ScopeNode* ownerNode); CodeBlock(ScopeNode* ownerNode, CodeType, PassRefPtr, unsigned sourceOffset); ~CodeBlock(); void mark(); void refStructures(Instruction* vPC) const; void derefStructures(Instruction* vPC) const; -#if ENABLE(JIT) +#if ENABLE(JIT_OPTIMIZE_CALL) void unlinkCallers(); #endif @@ -258,19 +257,9 @@ namespace JSC { return false; } - ALWAYS_INLINE bool isConstantRegisterIndex(int index) - { - return index >= m_numVars && index < m_numVars + m_numConstants; - } - - ALWAYS_INLINE JSValuePtr getConstant(int index) - { - return m_constantRegisters[index - m_numVars].getJSValue(); - } - ALWAYS_INLINE bool isTemporaryRegisterIndex(int index) { - return index >= m_numVars + m_numConstants; + return index >= m_numVars; } HandlerInfo* handlerForBytecodeOffset(unsigned bytecodeOffset); @@ -298,21 +287,25 @@ namespace JSC { m_linkedCallerList.shrink(lastPos); } - StructureStubInfo& getStubInfo(void* returnAddress) + StructureStubInfo& getStubInfo(ReturnAddressPtr returnAddress) { - return *(binaryChop(m_structureStubInfos.begin(), m_structureStubInfos.size(), returnAddress)); + return *(binaryChop(m_structureStubInfos.begin(), m_structureStubInfos.size(), returnAddress.value())); } - CallLinkInfo& getCallLinkInfo(void* returnAddress) + CallLinkInfo& getCallLinkInfo(ReturnAddressPtr returnAddress) { - return *(binaryChop(m_callLinkInfos.begin(), m_callLinkInfos.size(), returnAddress)); + return *(binaryChop(m_callLinkInfos.begin(), m_callLinkInfos.size(), returnAddress.value())); } - unsigned getBytecodeIndex(CallFrame* callFrame, void* nativePC) + MethodCallLinkInfo& getMethodCallLinkInfo(ReturnAddressPtr returnAddress) + { + return *(binaryChop(m_methodCallLinkInfos.begin(), m_methodCallLinkInfos.size(), returnAddress.value())); + } + + unsigned getBytecodeIndex(CallFrame* callFrame, ReturnAddressPtr returnAddress) { reparseForExceptionInfoIfNecessary(callFrame); - ptrdiff_t nativePCOffset = reinterpret_cast(nativePC) - reinterpret_cast(m_jitCode.code); - return binaryChop(m_exceptionInfo->m_pcVector.begin(), m_exceptionInfo->m_pcVector.size(), nativePCOffset)->bytecodeIndex; + return binaryChop(m_exceptionInfo->m_callReturnIndexVector.begin(), m_exceptionInfo->m_callReturnIndexVector.size(), ownerNode()->generatedJITCode().offsetOf(returnAddress.value()))->bytecodeIndex; } bool functionRegisterForBytecodeOffset(unsigned bytecodeOffset, int& functionRegisterIndex); @@ -327,9 +320,9 @@ namespace JSC { #endif #if ENABLE(JIT) - void setJITCode(JITCodeRef& jitCode); - void* jitCode() { return m_jitCode.code; } - ExecutablePool* executablePool() { return m_jitCode.executablePool.get(); } + JITCode& getJITCode() { return ownerNode()->generatedJITCode(); } + void setJITCode(JITCode); + ExecutablePool* executablePool() { return ownerNode()->getExecutablePool(); } #endif ScopeNode* ownerNode() const { return m_ownerNode; } @@ -348,8 +341,8 @@ namespace JSC { CodeType codeType() const { return m_codeType; } - SourceProvider* source() const { return m_source.get(); } - unsigned sourceOffset() const { return m_sourceOffset; } + SourceProvider* source() const { ASSERT(m_codeType != NativeCode); return m_source.get(); } + unsigned sourceOffset() const { ASSERT(m_codeType != NativeCode); return m_sourceOffset; } size_t numberOfJumpTargets() const { return m_jumpTargets.size(); } void addJumpTarget(unsigned jumpTarget) { m_jumpTargets.append(jumpTarget); } @@ -373,6 +366,9 @@ namespace JSC { void addCallLinkInfo() { m_callLinkInfos.append(CallLinkInfo()); } CallLinkInfo& callLinkInfo(int index) { return m_callLinkInfos[index]; } + void addMethodCallLinkInfos(unsigned n) { m_methodCallLinkInfos.grow(n); } + MethodCallLinkInfo& methodCallLinkInfo(int index) { return m_methodCallLinkInfos[index]; } + void addFunctionRegisterInfo(unsigned bytecodeOffset, int functionIndex) { createRareDataIfNecessary(); m_rareData->m_functionRegisterInfos.append(FunctionRegisterInfo(bytecodeOffset, functionIndex)); } #endif @@ -393,7 +389,7 @@ namespace JSC { LineInfo& lastLineInfo() { ASSERT(m_exceptionInfo); return m_exceptionInfo->m_lineInfo.last(); } #if ENABLE(JIT) - Vector& pcVector() { ASSERT(m_exceptionInfo); return m_exceptionInfo->m_pcVector; } + Vector& callReturnIndexVector() { ASSERT(m_exceptionInfo); return m_exceptionInfo->m_callReturnIndexVector; } #endif // Constant Pool @@ -404,7 +400,9 @@ namespace JSC { size_t numberOfConstantRegisters() const { return m_constantRegisters.size(); } void addConstantRegister(const Register& r) { return m_constantRegisters.append(r); } - Register& constantRegister(int index) { return m_constantRegisters[index]; } + Register& constantRegister(int index) { return m_constantRegisters[index - FirstConstantRegisterIndex]; } + ALWAYS_INLINE bool isConstantRegisterIndex(int index) { return index >= FirstConstantRegisterIndex; } + ALWAYS_INLINE JSValue getConstant(int index) const { return m_constantRegisters[index - FirstConstantRegisterIndex].jsValue(); } unsigned addFunctionExpression(FuncExprNode* n) { unsigned size = m_functionExpressions.size(); m_functionExpressions.append(n); return size; } FuncExprNode* functionExpression(int index) const { return m_functionExpressions[index].get(); } @@ -414,9 +412,6 @@ namespace JSC { bool hasFunctions() const { return m_functionExpressions.size() || (m_rareData && m_rareData->m_functions.size()); } - unsigned addUnexpectedConstant(JSValuePtr v) { createRareDataIfNecessary(); unsigned size = m_rareData->m_unexpectedConstants.size(); m_rareData->m_unexpectedConstants.append(v); return size; } - JSValuePtr unexpectedConstant(int index) const { ASSERT(m_rareData); return m_rareData->m_unexpectedConstants[index]; } - unsigned addRegExp(RegExp* r) { createRareDataIfNecessary(); unsigned size = m_rareData->m_regexps.size(); m_rareData->m_regexps.append(r); return size; } RegExp* regexp(int index) const { ASSERT(m_rareData); return m_rareData->m_regexps[index].get(); } @@ -438,18 +433,13 @@ namespace JSC { SymbolTable& symbolTable() { return m_symbolTable; } - EvalCodeCache& evalCodeCache() { createRareDataIfNecessary(); return m_rareData->m_evalCodeCache; } + EvalCodeCache& evalCodeCache() { ASSERT(m_codeType != NativeCode); createRareDataIfNecessary(); return m_rareData->m_evalCodeCache; } void shrinkToFit(); // FIXME: Make these remaining members private. int m_numCalleeRegisters; - // NOTE: numConstants holds the number of constant registers allocated - // by the code generator, not the number of constant registers used. - // (Duplicate constants are uniqued during code generation, and spare - // constant registers may be allocated.) - int m_numConstants; int m_numVars; int m_numParameters; @@ -462,6 +452,7 @@ namespace JSC { void createRareDataIfNecessary() { + ASSERT(m_codeType != NativeCode); if (!m_rareData) m_rareData.set(new RareData); } @@ -473,9 +464,6 @@ namespace JSC { #ifndef NDEBUG unsigned m_instructionCount; #endif -#if ENABLE(JIT) - JITCodeRef m_jitCode; -#endif int m_thisRegister; @@ -496,6 +484,7 @@ namespace JSC { Vector m_structureStubInfos; Vector m_globalResolveInfos; Vector m_callLinkInfos; + Vector m_methodCallLinkInfos; Vector m_linkedCallerList; #endif @@ -514,7 +503,7 @@ namespace JSC { Vector m_getByIdExceptionInfo; #if ENABLE(JIT) - Vector m_pcVector; + Vector m_callReturnIndexVector; #endif }; OwnPtr m_exceptionInfo; @@ -524,7 +513,6 @@ namespace JSC { // Rare Constants Vector > m_functions; - Vector m_unexpectedConstants; Vector > m_regexps; // Jump Tables @@ -579,6 +567,14 @@ namespace JSC { int m_baseScopeDepth; }; + inline Register& ExecState::r(int index) + { + CodeBlock* codeBlock = this->codeBlock(); + if (codeBlock->isConstantRegisterIndex(index)) + return codeBlock->constantRegister(index); + return this[index]; + } + } // namespace JSC #endif // CodeBlock_h diff --git a/bytecode/EvalCodeCache.h b/bytecode/EvalCodeCache.h index 2d6f7dc..f0ce73e 100644 --- a/bytecode/EvalCodeCache.h +++ b/bytecode/EvalCodeCache.h @@ -41,7 +41,7 @@ namespace JSC { class EvalCodeCache { public: - PassRefPtr get(ExecState* exec, const UString& evalSource, ScopeChainNode* scopeChain, JSValuePtr& exceptionValue) + PassRefPtr get(ExecState* exec, const UString& evalSource, ScopeChainNode* scopeChain, JSValue& exceptionValue) { RefPtr evalNode; diff --git a/bytecode/Instruction.h b/bytecode/Instruction.h index 1fab106..eeeac6f 100644 --- a/bytecode/Instruction.h +++ b/bytecode/Instruction.h @@ -29,14 +29,25 @@ #ifndef Instruction_h #define Instruction_h +#include "MacroAssembler.h" #include "Opcode.h" #include "Structure.h" #include -#define POLYMORPHIC_LIST_CACHE_SIZE 4 +#define POLYMORPHIC_LIST_CACHE_SIZE 8 namespace JSC { + // *Sigh*, If the JIT is enabled we need to track the stubRountine (of type CodeLocationLabel), + // If the JIT is not in use we don't actually need the variable (that said, if the JIT is not in use we don't + // curently actually use PolymorphicAccessStructureLists, which we should). Anyway, this seems like the best + // solution for now - will need to something smarter if/when we actually want mixed-mode operation. +#if ENABLE(JIT) + typedef CodeLocationLabel PolymorphicAccessStructureListStubRoutineType; +#else + typedef void* PolymorphicAccessStructureListStubRoutineType; +#endif + class JSCell; class Structure; class StructureChain; @@ -45,14 +56,14 @@ namespace JSC { struct PolymorphicAccessStructureList { struct PolymorphicStubInfo { bool isChain; - void* stubRoutine; + PolymorphicAccessStructureListStubRoutineType stubRoutine; Structure* base; union { Structure* proto; StructureChain* chain; } u; - void set(void* _stubRoutine, Structure* _base) + void set(PolymorphicAccessStructureListStubRoutineType _stubRoutine, Structure* _base) { stubRoutine = _stubRoutine; base = _base; @@ -60,7 +71,7 @@ namespace JSC { isChain = false; } - void set(void* _stubRoutine, Structure* _base, Structure* _proto) + void set(PolymorphicAccessStructureListStubRoutineType _stubRoutine, Structure* _base, Structure* _proto) { stubRoutine = _stubRoutine; base = _base; @@ -68,7 +79,7 @@ namespace JSC { isChain = false; } - void set(void* _stubRoutine, Structure* _base, StructureChain* _chain) + void set(PolymorphicAccessStructureListStubRoutineType _stubRoutine, Structure* _base, StructureChain* _chain) { stubRoutine = _stubRoutine; base = _base; @@ -77,17 +88,17 @@ namespace JSC { } } list[POLYMORPHIC_LIST_CACHE_SIZE]; - PolymorphicAccessStructureList(void* stubRoutine, Structure* firstBase) + PolymorphicAccessStructureList(PolymorphicAccessStructureListStubRoutineType stubRoutine, Structure* firstBase) { list[0].set(stubRoutine, firstBase); } - PolymorphicAccessStructureList(void* stubRoutine, Structure* firstBase, Structure* firstProto) + PolymorphicAccessStructureList(PolymorphicAccessStructureListStubRoutineType stubRoutine, Structure* firstBase, Structure* firstProto) { list[0].set(stubRoutine, firstBase, firstProto); } - PolymorphicAccessStructureList(void* stubRoutine, Structure* firstBase, StructureChain* firstChain) + PolymorphicAccessStructureList(PolymorphicAccessStructureListStubRoutineType stubRoutine, Structure* firstBase, StructureChain* firstChain) { list[0].set(stubRoutine, firstBase, firstChain); } diff --git a/bytecode/JumpTable.h b/bytecode/JumpTable.h index 44e224d..b4f8e44 100644 --- a/bytecode/JumpTable.h +++ b/bytecode/JumpTable.h @@ -30,6 +30,7 @@ #ifndef JumpTable_h #define JumpTable_h +#include "MacroAssembler.h" #include "UString.h" #include #include @@ -39,7 +40,7 @@ namespace JSC { struct OffsetLocation { int32_t branchOffset; #if ENABLE(JIT) - void* ctiOffset; + CodeLocationLabel ctiOffset; #endif }; @@ -47,7 +48,7 @@ namespace JSC { typedef HashMap, OffsetLocation> StringOffsetTable; StringOffsetTable offsetTable; #if ENABLE(JIT) - void* ctiDefault; // FIXME: it should not be necessary to store this. + CodeLocationLabel ctiDefault; // FIXME: it should not be necessary to store this. #endif inline int32_t offsetForValue(UString::Rep* value, int32_t defaultOffset) @@ -60,7 +61,7 @@ namespace JSC { } #if ENABLE(JIT) - inline void* ctiForValue(UString::Rep* value) + inline CodeLocationLabel ctiForValue(UString::Rep* value) { StringOffsetTable::const_iterator end = offsetTable.end(); StringOffsetTable::const_iterator loc = offsetTable.find(value); @@ -76,8 +77,8 @@ namespace JSC { Vector branchOffsets; int32_t min; #if ENABLE(JIT) - Vector ctiOffsets; - void* ctiDefault; + Vector ctiOffsets; + CodeLocationLabel ctiDefault; #endif int32_t offsetForValue(int32_t value, int32_t defaultOffset); @@ -88,7 +89,7 @@ namespace JSC { } #if ENABLE(JIT) - inline void* ctiForValue(int32_t value) + inline CodeLocationLabel ctiForValue(int32_t value) { if (value >= min && static_cast(value - min) < ctiOffsets.size()) return ctiOffsets[value - min]; diff --git a/bytecode/Opcode.h b/bytecode/Opcode.h index d00178b..ec39f11 100644 --- a/bytecode/Opcode.h +++ b/bytecode/Opcode.h @@ -40,10 +40,10 @@ namespace JSC { #define FOR_EACH_OPCODE_ID(macro) \ macro(op_enter, 1) \ macro(op_enter_with_activation, 2) \ + macro(op_init_arguments, 1) \ macro(op_create_arguments, 1) \ macro(op_convert_this, 2) \ \ - macro(op_unexpected_load, 3) \ macro(op_new_object, 2) \ macro(op_new_array, 4) \ macro(op_new_regexp, 3) \ @@ -67,7 +67,7 @@ namespace JSC { macro(op_negate, 3) \ macro(op_add, 5) \ macro(op_mul, 5) \ - macro(op_div, 4) \ + macro(op_div, 5) \ macro(op_mod, 4) \ macro(op_sub, 5) \ \ @@ -98,7 +98,6 @@ namespace JSC { macro(op_put_global_var, 4) \ macro(op_resolve_base, 3) \ macro(op_resolve_with_base, 4) \ - macro(op_resolve_func, 4) \ macro(op_get_by_id, 8) \ macro(op_get_by_id_self, 8) \ macro(op_get_by_id_self_list, 8) \ @@ -125,7 +124,9 @@ namespace JSC { macro(op_jfalse, 3) \ macro(op_jeq_null, 3) \ macro(op_jneq_null, 3) \ + macro(op_jneq_ptr, 4) \ macro(op_jnless, 4) \ + macro(op_jnlesseq, 4) \ macro(op_jmp_scopes, 3) \ macro(op_loop, 2) \ macro(op_loop_if_true, 3) \ @@ -139,12 +140,17 @@ namespace JSC { macro(op_new_func_exp, 3) \ macro(op_call, 5) \ macro(op_call_eval, 5) \ + macro(op_call_varargs, 5) \ + macro(op_load_varargs, 3) \ macro(op_tear_off_activation, 2) \ macro(op_tear_off_arguments, 1) \ macro(op_ret, 2) \ + macro(op_method_check, 1) \ \ macro(op_construct, 7) \ macro(op_construct_verify, 3) \ + macro(op_strcat, 4) \ + macro(op_to_primitive, 3) \ \ macro(op_get_pnames, 3) \ macro(op_next_pname, 4) \ @@ -174,7 +180,7 @@ namespace JSC { #define OPCODE_ID_LENGTHS(id, length) const int id##_length = length; FOR_EACH_OPCODE_ID(OPCODE_ID_LENGTHS); - #undef OPCODE_ID_SIZES + #undef OPCODE_ID_LENGTHS #define OPCODE_LENGTH(opcode) opcode##_length @@ -187,7 +193,7 @@ namespace JSC { #undef VERIFY_OPCODE_ID #if HAVE(COMPUTED_GOTO) - typedef void* Opcode; + typedef const void* Opcode; #else typedef OpcodeID Opcode; #endif diff --git a/bytecode/SamplingTool.cpp b/bytecode/SamplingTool.cpp index 215ebe5..8651723 100644 --- a/bytecode/SamplingTool.cpp +++ b/bytecode/SamplingTool.cpp @@ -39,24 +39,57 @@ namespace JSC { -void ScopeSampleRecord::sample(CodeBlock* codeBlock, Instruction* vPC) +#if ENABLE(SAMPLING_FLAGS) + +void SamplingFlags::sample() { - if (!m_samples) { - m_size = codeBlock->instructions().size(); - m_samples = static_cast(calloc(m_size, sizeof(int))); - m_codeBlock = codeBlock; + uint32_t mask = 1 << 31; + unsigned index; + + for (index = 0; index < 32; ++index) { + if (mask & s_flags) + break; + mask >>= 1; } - ++m_sampleCount; + s_flagCounts[32 - index]++; +} - unsigned offest = vPC - codeBlock->instructions().begin(); - // Since we don't read and write codeBlock and vPC atomically, this check - // can fail if we sample mid op_call / op_ret. - if (offest < m_size) { - m_samples[offest]++; - m_opcodeSampleCount++; - } +void SamplingFlags::start() +{ + for (unsigned i = 0; i <= 32; ++i) + s_flagCounts[i] = 0; } +void SamplingFlags::stop() +{ + uint64_t total = 0; + for (unsigned i = 0; i <= 32; ++i) + total += s_flagCounts[i]; + + if (total) { + printf("\nSamplingFlags: sample counts with flags set: (%lld total)\n", total); + for (unsigned i = 0; i <= 32; ++i) { + if (s_flagCounts[i]) + printf(" [ %02d ] : %lld\t\t(%03.2f%%)\n", i, s_flagCounts[i], (100.0 * s_flagCounts[i]) / total); + } + printf("\n"); + } else + printf("\nSamplingFlags: no samples.\n\n"); +} +uint64_t SamplingFlags::s_flagCounts[33]; + +#else +void SamplingFlags::start() {} +void SamplingFlags::stop() {} +#endif + +/* + Start with flag 16 set. + By doing this the monitoring of lower valued flags will be masked out + until flag 16 is explictly cleared. +*/ +uint32_t SamplingFlags::s_flags = 1 << 15; + #if PLATFORM(WIN_OS) @@ -82,62 +115,113 @@ static inline unsigned hertz2us(unsigned hertz) return 1000000 / hertz; } -void SamplingTool::run() + +SamplingTool* SamplingTool::s_samplingTool = 0; + + +bool SamplingThread::s_running = false; +unsigned SamplingThread::s_hertz = 10000; +ThreadIdentifier SamplingThread::s_samplingThread; + +void* SamplingThread::threadStartFunc(void*) { - while (m_running) { - sleepForMicroseconds(hertz2us(m_hertz)); + while (s_running) { + sleepForMicroseconds(hertz2us(s_hertz)); - Sample sample(m_sample, m_codeBlock); - ++m_sampleCount; +#if ENABLE(SAMPLING_FLAGS) + SamplingFlags::sample(); +#endif +#if ENABLE(OPCODE_SAMPLING) + SamplingTool::sample(); +#endif + } - if (sample.isNull()) - continue; + return 0; +} - if (!sample.inHostFunction()) { - unsigned opcodeID = m_interpreter->getOpcodeID(sample.vPC()[0].u.opcode); - ++m_opcodeSampleCount; - ++m_opcodeSamples[opcodeID]; +void SamplingThread::start(unsigned hertz) +{ + ASSERT(!s_running); + s_running = true; + s_hertz = hertz; - if (sample.inCTIFunction()) - m_opcodeSamplesInCTIFunctions[opcodeID]++; - } + s_samplingThread = createThread(threadStartFunc, 0, "JavaScriptCore::Sampler"); +} + +void SamplingThread::stop() +{ + ASSERT(s_running); + s_running = false; + waitForThreadCompletion(s_samplingThread, 0); +} + + +void ScopeSampleRecord::sample(CodeBlock* codeBlock, Instruction* vPC) +{ + if (!m_samples) { + m_size = codeBlock->instructions().size(); + m_samples = static_cast(calloc(m_size, sizeof(int))); + m_codeBlock = codeBlock; + } + + ++m_sampleCount; + + unsigned offest = vPC - codeBlock->instructions().begin(); + // Since we don't read and write codeBlock and vPC atomically, this check + // can fail if we sample mid op_call / op_ret. + if (offest < m_size) { + m_samples[offest]++; + m_opcodeSampleCount++; + } +} + +void SamplingTool::doRun() +{ + Sample sample(m_sample, m_codeBlock); + ++m_sampleCount; + + if (sample.isNull()) + return; + + if (!sample.inHostFunction()) { + unsigned opcodeID = m_interpreter->getOpcodeID(sample.vPC()[0].u.opcode); + + ++m_opcodeSampleCount; + ++m_opcodeSamples[opcodeID]; + + if (sample.inCTIFunction()) + m_opcodeSamplesInCTIFunctions[opcodeID]++; + } #if ENABLE(CODEBLOCK_SAMPLING) + if (CodeBlock* codeBlock = sample.codeBlock()) { MutexLocker locker(m_scopeSampleMapMutex); - ScopeSampleRecord* record = m_scopeSampleMap->get(sample.codeBlock()->ownerNode()); + ScopeSampleRecord* record = m_scopeSampleMap->get(codeBlock->ownerNode()); ASSERT(record); - record->sample(sample.codeBlock(), sample.vPC()); -#endif + record->sample(codeBlock, sample.vPC()); } +#endif } -void* SamplingTool::threadStartFunc(void* samplingTool) +void SamplingTool::sample() { - reinterpret_cast(samplingTool)->run(); - return 0; + s_samplingTool->doRun(); } void SamplingTool::notifyOfScope(ScopeNode* scope) { +#if ENABLE(CODEBLOCK_SAMPLING) MutexLocker locker(m_scopeSampleMapMutex); m_scopeSampleMap->set(scope, new ScopeSampleRecord(scope)); +#else + UNUSED_PARAM(scope); +#endif } -void SamplingTool::start(unsigned hertz) -{ - ASSERT(!m_running); - m_running = true; - m_hertz = hertz; - - m_samplingThread = createThread(threadStartFunc, this, "JavaScriptCore::Sampler"); -} - -void SamplingTool::stop() +void SamplingTool::setup() { - ASSERT(m_running); - m_running = false; - waitForThreadCompletion(m_samplingThread, 0); + s_samplingTool = this; } #if ENABLE(OPCODE_SAMPLING) @@ -153,14 +237,6 @@ struct LineCountInfo { unsigned count; }; -static int compareLineCountInfoSampling(const void* left, const void* right) -{ - const LineCountInfo* leftLineCount = reinterpret_cast(left); - const LineCountInfo* rightLineCount = reinterpret_cast(right); - - return (leftLineCount->line > rightLineCount->line) ? 1 : (leftLineCount->line < rightLineCount->line) ? -1 : 0; -} - static int compareOpcodeIndicesSampling(const void* left, const void* right) { const OpcodeSampleInfo* leftSampleInfo = reinterpret_cast(left); @@ -169,6 +245,15 @@ static int compareOpcodeIndicesSampling(const void* left, const void* right) return (leftSampleInfo->count < rightSampleInfo->count) ? 1 : (leftSampleInfo->count > rightSampleInfo->count) ? -1 : 0; } +#if ENABLE(CODEBLOCK_SAMPLING) +static int compareLineCountInfoSampling(const void* left, const void* right) +{ + const LineCountInfo* leftLineCount = reinterpret_cast(left); + const LineCountInfo* rightLineCount = reinterpret_cast(right); + + return (leftLineCount->line > rightLineCount->line) ? 1 : (leftLineCount->line < rightLineCount->line) ? -1 : 0; +} + static int compareScopeSampleRecords(const void* left, const void* right) { const ScopeSampleRecord* const leftValue = *static_cast(left); @@ -176,6 +261,7 @@ static int compareScopeSampleRecords(const void* left, const void* right) return (leftValue->m_sampleCount < rightValue->m_sampleCount) ? 1 : (leftValue->m_sampleCount > rightValue->m_sampleCount) ? -1 : 0; } +#endif void SamplingTool::dump(ExecState* exec) { @@ -227,6 +313,8 @@ void SamplingTool::dump(ExecState* exec) printf("\tcti count:\tsamples inside a CTI function called by this opcode\n"); printf("\tcti %% of self:\tcti count / sample count\n"); +#if ENABLE(CODEBLOCK_SAMPLING) + // (3) Build and sort 'codeBlockSamples' array. int scopeCount = m_scopeSampleMap->size(); @@ -285,6 +373,9 @@ void SamplingTool::dump(ExecState* exec) } } } +#else + UNUSED_PARAM(exec); +#endif } #else @@ -295,4 +386,21 @@ void SamplingTool::dump(ExecState*) #endif +void AbstractSamplingCounter::dump() +{ +#if ENABLE(SAMPLING_COUNTERS) + if (s_abstractSamplingCounterChain != &s_abstractSamplingCounterChainEnd) { + printf("\nSampling Counter Values:\n"); + for (AbstractSamplingCounter* currCounter = s_abstractSamplingCounterChain; (currCounter != &s_abstractSamplingCounterChainEnd); currCounter = currCounter->m_next) + printf("\t%s\t: %lld\n", currCounter->m_name, currCounter->m_counter); + printf("\n\n"); + } + s_completed = true; +#endif +} + +AbstractSamplingCounter AbstractSamplingCounter::s_abstractSamplingCounterChainEnd; +AbstractSamplingCounter* AbstractSamplingCounter::s_abstractSamplingCounterChain = &s_abstractSamplingCounterChainEnd; +bool AbstractSamplingCounter::s_completed = false; + } // namespace JSC diff --git a/bytecode/SamplingTool.h b/bytecode/SamplingTool.h index d1cf2e8..7d7dc9c 100644 --- a/bytecode/SamplingTool.h +++ b/bytecode/SamplingTool.h @@ -38,6 +38,54 @@ namespace JSC { + class SamplingFlags { + friend class JIT; + public: + static void start(); + static void stop(); + +#if ENABLE(SAMPLING_FLAGS) + static void setFlag(unsigned flag) + { + ASSERT(flag >= 1); + ASSERT(flag <= 32); + s_flags |= 1u << (flag - 1); + } + + static void clearFlag(unsigned flag) + { + ASSERT(flag >= 1); + ASSERT(flag <= 32); + s_flags &= ~(1u << (flag - 1)); + } + + static void sample(); + + class ScopedFlag { + public: + ScopedFlag(int flag) + : m_flag(flag) + { + setFlag(flag); + } + + ~ScopedFlag() + { + clearFlag(m_flag); + } + + private: + int m_flag; + }; + +#endif + private: + static uint32_t s_flags; +#if ENABLE(SAMPLING_FLAGS) + static uint64_t s_flagCounts[33]; +#endif + }; + class CodeBlock; class ExecState; class Interpreter; @@ -73,6 +121,19 @@ namespace JSC { typedef WTF::HashMap ScopeSampleRecordMap; + class SamplingThread { + public: + // Sampling thread state. + static bool s_running; + static unsigned s_hertz; + static ThreadIdentifier s_samplingThread; + + static void start(unsigned hertz=10000); + static void stop(); + + static void* threadStartFunc(void*); + }; + class SamplingTool { public: friend class CallRecord; @@ -127,12 +188,13 @@ namespace JSC { SamplingTool(Interpreter* interpreter) : m_interpreter(interpreter) - , m_running(false) , m_codeBlock(0) , m_sample(0) , m_sampleCount(0) , m_opcodeSampleCount(0) +#if ENABLE(CODEBLOCK_SAMPLING) , m_scopeSampleMap(new ScopeSampleRecordMap()) +#endif { memset(m_opcodeSamples, 0, sizeof(m_opcodeSamples)); memset(m_opcodeSamplesInCTIFunctions, 0, sizeof(m_opcodeSamplesInCTIFunctions)); @@ -140,11 +202,12 @@ namespace JSC { ~SamplingTool() { +#if ENABLE(CODEBLOCK_SAMPLING) deleteAllValues(*m_scopeSampleMap); +#endif } - void start(unsigned hertz=10000); - void stop(); + void setup(); void dump(ExecState*); void notifyOfScope(ScopeNode* scope); @@ -165,6 +228,8 @@ namespace JSC { return reinterpret_cast(reinterpret_cast(vPC) | (static_cast(inCTIFunction) << 1) | static_cast(inHostFunction)); } + static void sample(); + private: class Sample { public: @@ -174,7 +239,7 @@ namespace JSC { { } - bool isNull() { return !m_sample || !m_codeBlock; } + bool isNull() { return !m_sample; } CodeBlock* codeBlock() { return m_codeBlock; } Instruction* vPC() { return reinterpret_cast(m_sample & ~0x3); } bool inHostFunction() { return m_sample & 0x1; } @@ -184,17 +249,12 @@ namespace JSC { intptr_t m_sample; CodeBlock* m_codeBlock; }; - - static void* threadStartFunc(void*); - void run(); + + void doRun(); + static SamplingTool* s_samplingTool; Interpreter* m_interpreter; - // Sampling thread state. - bool m_running; - unsigned m_hertz; - ThreadIdentifier m_samplingThread; - // State tracked by the main thread, used by the sampling thread. CodeBlock* m_codeBlock; intptr_t m_sample; @@ -205,9 +265,147 @@ namespace JSC { unsigned m_opcodeSamples[numOpcodeIDs]; unsigned m_opcodeSamplesInCTIFunctions[numOpcodeIDs]; +#if ENABLE(CODEBLOCK_SAMPLING) Mutex m_scopeSampleMapMutex; OwnPtr m_scopeSampleMap; +#endif + }; + + // AbstractSamplingCounter: + // + // Implements a named set of counters, printed on exit if ENABLE(SAMPLING_COUNTERS). + // See subclasses below, SamplingCounter, GlobalSamplingCounter and DeletableSamplingCounter. + class AbstractSamplingCounter { + friend class JIT; + friend class DeletableSamplingCounter; + public: + void count(uint32_t count = 1) + { + m_counter += count; + } + + static void dump(); + + protected: + // Effectively the contructor, however called lazily in the case of GlobalSamplingCounter. + void init(const char* name) + { + m_counter = 0; + m_name = name; + + // Set m_next to point to the head of the chain, and inform whatever is + // currently at the head that this node will now hold the pointer to it. + m_next = s_abstractSamplingCounterChain; + s_abstractSamplingCounterChain->m_referer = &m_next; + // Add this node to the head of the list. + s_abstractSamplingCounterChain = this; + m_referer = &s_abstractSamplingCounterChain; + } + + int64_t m_counter; + const char* m_name; + AbstractSamplingCounter* m_next; + // This is a pointer to the pointer to this node in the chain; used to + // allow fast linked list deletion. + AbstractSamplingCounter** m_referer; + // Null object used to detect end of static chain. + static AbstractSamplingCounter s_abstractSamplingCounterChainEnd; + static AbstractSamplingCounter* s_abstractSamplingCounterChain; + static bool s_completed; + }; + +#if ENABLE(SAMPLING_COUNTERS) + // SamplingCounter: + // + // This class is suitable and (hopefully!) convenient for cases where a counter is + // required within the scope of a single function. It can be instantiated as a + // static variable since it contains a constructor but not a destructor (static + // variables in WebKit cannot have destructors). + // + // For example: + // + // void someFunction() + // { + // static SamplingCounter countMe("This is my counter. There are many like it, but this one is mine."); + // countMe.count(); + // // ... + // } + // + class SamplingCounter : public AbstractSamplingCounter { + public: + SamplingCounter(const char* name) { init(name); } + }; + + // GlobalSamplingCounter: + // + // This class is suitable for use where a counter is to be declared globally, + // since it contains neither a constructor nor destructor. Instead, ensure + // that 'name()' is called to provide the counter with a name (and also to + // allow it to be printed out on exit). + // + // GlobalSamplingCounter globalCounter; + // + // void firstFunction() + // { + // // Put this within a function that is definitely called! + // // (Or alternatively alongside all calls to 'count()'). + // globalCounter.name("I Name You Destroyer."); + // globalCounter.count(); + // // ... + // } + // + // void secondFunction() + // { + // globalCounter.count(); + // // ... + // } + // + class GlobalSamplingCounter : public AbstractSamplingCounter { + public: + void name(const char* name) + { + // Global objects should be mapped in zero filled memory, so this should + // be a safe (albeit not necessarily threadsafe) check for 'first call'. + if (!m_next) + init(name); + } + }; + + // DeletableSamplingCounter: + // + // The above classes (SamplingCounter, GlobalSamplingCounter), are intended for + // use within a global or static scope, and as such cannot have a destructor. + // This means there is no convenient way for them to remove themselves from the + // static list of counters, and should an instance of either class be freed + // before 'dump()' has walked over the list it will potentially walk over an + // invalid pointer. + // + // This class is intended for use where the counter may possibly be deleted before + // the program exits. Should this occur, the counter will print it's value to + // stderr, and remove itself from the static list. Example: + // + // DeletableSamplingCounter* counter = new DeletableSamplingCounter("The Counter With No Name"); + // counter->count(); + // delete counter; + // + class DeletableSamplingCounter : public AbstractSamplingCounter { + public: + DeletableSamplingCounter(const char* name) { init(name); } + + ~DeletableSamplingCounter() + { + if (!s_completed) + fprintf(stderr, "DeletableSamplingCounter \"%s\" deleted early (with count %lld)\n", m_name, m_counter); + // Our m_referer pointer should know where the pointer to this node is, + // and m_next should know that this node is the previous node in the list. + ASSERT(*m_referer == this); + ASSERT(m_next->m_referer == &m_next); + // Remove this node from the list, and inform m_next that we have done so. + m_next->m_referer = m_referer; + *m_referer = m_next; + } }; +#endif } // namespace JSC diff --git a/bytecode/StructureStubInfo.h b/bytecode/StructureStubInfo.h index a9e0678..95dd266 100644 --- a/bytecode/StructureStubInfo.h +++ b/bytecode/StructureStubInfo.h @@ -26,19 +26,18 @@ #ifndef StructureStubInfo_h #define StructureStubInfo_h +#if ENABLE(JIT) + #include "Instruction.h" +#include "MacroAssembler.h" #include "Opcode.h" #include "Structure.h" namespace JSC { -#if ENABLE(JIT) struct StructureStubInfo { StructureStubInfo(OpcodeID opcodeID) : opcodeID(opcodeID) - , stubRoutine(0) - , callReturnLocation(0) - , hotPathBegin(0) { } @@ -145,12 +144,13 @@ namespace JSC { } putByIdReplace; } u; - void* stubRoutine; - void* callReturnLocation; - void* hotPathBegin; + CodeLocationLabel stubRoutine; + CodeLocationCall callReturnLocation; + CodeLocationLabel hotPathBegin; }; -#endif } // namespace JSC +#endif + #endif // StructureStubInfo_h diff --git a/bytecompiler/BytecodeGenerator.cpp b/bytecompiler/BytecodeGenerator.cpp index cd89c1e..683372e 100644 --- a/bytecompiler/BytecodeGenerator.cpp +++ b/bytecompiler/BytecodeGenerator.cpp @@ -31,6 +31,7 @@ #include "BytecodeGenerator.h" #include "BatchedTransitionOptimizer.h" +#include "PrototypeFunction.h" #include "JSFunction.h" #include "Interpreter.h" #include "UString.h" @@ -195,17 +196,10 @@ bool BytecodeGenerator::addGlobalVar(const Identifier& ident, bool isConstant, R return result.second; } -void BytecodeGenerator::allocateConstants(size_t count) +void BytecodeGenerator::preserveLastVar() { - m_codeBlock->m_numConstants = count; - if (!count) - return; - - m_nextConstantIndex = m_calleeRegisters.size(); - - for (size_t i = 0; i < count; ++i) - newRegister(); - m_lastConstant = &m_calleeRegisters.last(); + if ((m_firstConstantIndex = m_calleeRegisters.size()) != 0) + m_lastVar = &m_calleeRegisters.last(); } BytecodeGenerator::BytecodeGenerator(ProgramNode* programNode, const Debugger* debugger, const ScopeChain& scopeChain, SymbolTable* symbolTable, ProgramCodeBlock* codeBlock) @@ -221,6 +215,8 @@ BytecodeGenerator::BytecodeGenerator(ProgramNode* programNode, const Debugger* d , m_baseScopeDepth(0) , m_codeType(GlobalCode) , m_nextGlobalIndex(-1) + , m_nextConstantOffset(0) + , m_globalConstantIndex(0) , m_globalData(&scopeChain.globalObject()->globalExec()->globalData()) , m_lastOpcodeID(op_end) , m_emitNodeDepth(0) @@ -260,7 +256,7 @@ BytecodeGenerator::BytecodeGenerator(ProgramNode* programNode, const Debugger* d m_nextGlobalIndex -= symbolTable->size(); for (size_t i = 0; i < functionStack.size(); ++i) { - FuncDeclNode* funcDecl = functionStack[i].get(); + FuncDeclNode* funcDecl = functionStack[i]; globalObject->removeDirect(funcDecl->m_ident); // Make sure our new function is not shadowed by an old property. emitNewFunction(addGlobalVar(funcDecl->m_ident, false), funcDecl); } @@ -270,13 +266,13 @@ BytecodeGenerator::BytecodeGenerator(ProgramNode* programNode, const Debugger* d if (!globalObject->hasProperty(exec, varStack[i].first)) newVars.append(addGlobalVar(varStack[i].first, varStack[i].second & DeclarationStacks::IsConstant)); - allocateConstants(programNode->neededConstants()); + preserveLastVar(); for (size_t i = 0; i < newVars.size(); ++i) emitLoad(newVars[i], jsUndefined()); } else { for (size_t i = 0; i < functionStack.size(); ++i) { - FuncDeclNode* funcDecl = functionStack[i].get(); + FuncDeclNode* funcDecl = functionStack[i]; globalObject->putWithAttributes(exec, funcDecl->m_ident, funcDecl->makeFunction(exec, scopeChain.node()), DontDelete); } for (size_t i = 0; i < varStack.size(); ++i) { @@ -288,7 +284,7 @@ BytecodeGenerator::BytecodeGenerator(ProgramNode* programNode, const Debugger* d globalObject->putWithAttributes(exec, varStack[i].first, jsUndefined(), attributes); } - allocateConstants(programNode->neededConstants()); + preserveLastVar(); } } @@ -303,6 +299,8 @@ BytecodeGenerator::BytecodeGenerator(FunctionBodyNode* functionBody, const Debug , m_dynamicScopeDepth(0) , m_baseScopeDepth(0) , m_codeType(FunctionCode) + , m_nextConstantOffset(0) + , m_globalConstantIndex(0) , m_globalData(&scopeChain.globalObject()->globalExec()->globalData()) , m_lastOpcodeID(op_end) , m_emitNodeDepth(0) @@ -329,12 +327,19 @@ BytecodeGenerator::BytecodeGenerator(FunctionBodyNode* functionBody, const Debug } else emitOpcode(op_enter); - if (usesArguments) - emitOpcode(op_create_arguments); + if (usesArguments) { + emitOpcode(op_init_arguments); + + // The debugger currently retrieves the arguments object from an activation rather than pulling + // it from a call frame. In the long-term it should stop doing that (), + // but for now we force eager creation of the arguments object when debugging. + if (m_shouldEmitDebugHooks) + emitOpcode(op_create_arguments); + } const DeclarationStacks::FunctionStack& functionStack = functionBody->functionStack(); for (size_t i = 0; i < functionStack.size(); ++i) { - FuncDeclNode* funcDecl = functionStack[i].get(); + FuncDeclNode* funcDecl = functionStack[i]; const Identifier& ident = funcDecl->m_ident; m_functions.add(ident.ustring().rep()); emitNewFunction(addVar(ident, false), funcDecl); @@ -362,7 +367,7 @@ BytecodeGenerator::BytecodeGenerator(FunctionBodyNode* functionBody, const Debug for (size_t i = 0; i < parameterCount; ++i) addParameter(parameters[i]); - allocateConstants(functionBody->neededConstants()); + preserveLastVar(); } BytecodeGenerator::BytecodeGenerator(EvalNode* evalNode, const Debugger* debugger, const ScopeChain& scopeChain, SymbolTable* symbolTable, EvalCodeBlock* codeBlock) @@ -377,6 +382,8 @@ BytecodeGenerator::BytecodeGenerator(EvalNode* evalNode, const Debugger* debugge , m_dynamicScopeDepth(0) , m_baseScopeDepth(codeBlock->baseScopeDepth()) , m_codeType(EvalCode) + , m_nextConstantOffset(0) + , m_globalConstantIndex(0) , m_globalData(&scopeChain.globalObject()->globalExec()->globalData()) , m_lastOpcodeID(op_end) , m_emitNodeDepth(0) @@ -390,7 +397,7 @@ BytecodeGenerator::BytecodeGenerator(EvalNode* evalNode, const Debugger* debugge codeBlock->setGlobalData(m_globalData); m_codeBlock->m_numParameters = 1; // Allocate space for "this" - allocateConstants(evalNode->neededConstants()); + preserveLastVar(); } RegisterID* BytecodeGenerator::addParameter(const Identifier& ident) @@ -424,6 +431,36 @@ RegisterID* BytecodeGenerator::registerFor(const Identifier& ident) if (entry.isNull()) return 0; + if (ident == propertyNames().arguments) + createArgumentsIfNecessary(); + + return ®isterFor(entry.getIndex()); +} + +bool BytecodeGenerator::willResolveToArguments(const Identifier& ident) +{ + if (ident != propertyNames().arguments) + return false; + + if (!shouldOptimizeLocals()) + return false; + + SymbolTableEntry entry = symbolTable().get(ident.ustring().rep()); + if (entry.isNull()) + return false; + + if (m_codeBlock->usesArguments() && m_codeType == FunctionCode) + return true; + + return false; +} + +RegisterID* BytecodeGenerator::uncheckedRegisterForArguments() +{ + ASSERT(willResolveToArguments(propertyNames().arguments)); + + SymbolTableEntry entry = symbolTable().get(propertyNames().arguments.ustring().rep()); + ASSERT(!entry.isNull()); return ®isterFor(entry.getIndex()); } @@ -648,6 +685,21 @@ PassRefPtr